commit 29276e92ccef76b8eeff103bc005bce6f9159bab Author: XiaoMoMi Date: Thu Mar 13 15:52:31 2025 +0800 Initial commit diff --git a/.gitattributes b/.gitattributes new file mode 100644 index 000000000..dfe077042 --- /dev/null +++ b/.gitattributes @@ -0,0 +1,2 @@ +# Auto detect text files and perform LF normalization +* text=auto diff --git a/.gitignore b/.gitignore new file mode 100644 index 000000000..4a412a23f --- /dev/null +++ b/.gitignore @@ -0,0 +1,31 @@ +# Compiled class file +*.class + +# Log file +*.log + +# BlueJ files +*.ctxt + +# Mobile Tools for Java (J2ME) +.mtj.tmp/ + +# Package Files # +*.jar +*.war +*.nar +*.ear +*.zip +*.tar.gz +*.rar + +# virtual machine crash logs, see http://www.java.com/en/download/help/error_hotspot.xml +hs_err_pid* +replay_pid* + +build/ +.gradle/ +.idea/ + +!/libs/*.jar +!/gradle/wrapper/*.jar \ No newline at end of file diff --git a/LICENSE b/LICENSE new file mode 100644 index 000000000..e62ec04cd --- /dev/null +++ b/LICENSE @@ -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/README.md b/README.md new file mode 100644 index 000000000..ed6eab94a --- /dev/null +++ b/README.md @@ -0,0 +1,134 @@ +

+
+ logo +
+ CraftEngine +

+

+ + Gitbook + +

+

+ English | + 简体中文 | + 繁體中文 +

+ +## 📌 About CraftEngine +CraftEngine redefines plugin architecture as a next-generation solution for custom content implementation. Its JVM-level injection delivers unprecedented performance, stability, and extensibility. The framework provides a code-first API for registering natively integrated block behaviors and item interaction logic. + +## Build +Getting the full jar is completely free, as long as you have a device with jdk21 installed. Follow the guide below to build it. + +### 🐚 Command Line ++ Start terminal and change directory to the project folder. ++ Execute "./gradlew build" and get the artifact under /target folder. + +### 💻 IDE ++ Import the project and execute gradle build action. ++ Get the artifact under /target folder. + +## Installation + +### 💻 Enviroment Requirements ++ First, ensure that you are running a [Paper](https://papermc.io/)/[Folia](https://github.com/PaperMC/Folia) (or its fork) 1.20.1+ server. The plugin does not support Spigot and is unlikely to do so in the future. ++ Secondly, please use JDK 21 to run the server. I believe this is quite straightforward for you. + +### 🔍 How to Install +CraftEngine offers two installation modes: Standard Installation and Mod Mode. As the name suggests, Standard Installation involves placing the plugin into your plugins folder just like any conventional plugin. Below, we will provide a detailed explanation on how to install using mod mode. + +### 🔧 Install Server Mod +- Download the latest [ignite.jar](https://github.com/vectrix-space/ignite/releases) into your server's root directory +- Either: + - Rename your server JAR to `paper.jar` +- Or: + - Add launch arguments: `-Dignite.locator=paper -Dignite.paper.jar=./paper-xxx.jar` +- Start the server to generate the `/mods` directory +- Place the latest [mod.jar](https://github.com/Xiao-MoMi/craft-engine/releases) in `/mods` +- Install the plugin by placing its JAR in `/plugins` +- Perform two restarts: + 1. Initial restart for file initialization + 2. Final restart to activate all components + +## Technical Overview + +### ⚙️ Blocks +The plugin employs runtime bytecode generation to register custom blocks at the server-native level, combined with client-side data packet modification for visual synchronization. This architecture provides: + +🧱 Native Block Customization ++ Dynamically register blocks with complete control over ++ Physics: hardness, flammability, light emission, etc. ++ Custom Behaviors: Tree saplings, crops, falling blocks, and more via API ++ Vanilla Compatibility: Full preservation of vanilla block mechanism (e.g., note blocks, tripwires) + +📦 Data Pack Integration ++ Define custom ore veins ++ Generate custom trees ++ Configure custom terrain generation + +⚡ Performance Advantages ++ Significantly faster and stabler than traditional Bukkit event listeners ++ Strategic code injection for minimal overhead + +### 🥘 Recipes +CraftEngine implements a fully customizable crafting system via low-level injection. Unlike conventional plugins that fail with NBT modifications, it ensures resilient handling of item metadata - recipe outcomes remain exclusively tied to unique item identifiers. + +### 🪑 Furniture +The plugin utilizes a core entity to store furniture metadata, while transmitting collision entities and modular components as client-bound packets. This architecture achieves significant server-side performance optimization, while supporting composite furniture assembly through multi-part item integration. + +### 📝 Templates +Given the extensive and intricate nature of plugin configurations, a modular template system is implemented to compartmentalize critical settings. This enables user-customizable configuration formats while significantly minimizing redundant YAML definitions. + +### 🛠️ Models +The plugin enables model inheritance and texture overrides through configuration, while supporting [all item models](https://misode.github.io/assets/item/) from version 1.21.4 onward. It incorporates a version migration system that automatically downgrades 1.21.4+ item models to legacy formats with maximum backward compatibility. + +## Inspired Projects +This project draws inspiration from the following open-source works: ++ [Paper](https://github.com/PaperMC/Paper) ++ [LuckPerms](https://github.com/LuckPerms/LuckPerms) ++ [Fabric](https://github.com/FabricMC/fabric) ++ [packetevents](https://github.com/retrooper/packetevents) ++ [NBT](https://github.com/Querz/NBT) ++ [DataFixerUpper](https://github.com/Mojang/DataFixerUpper) ++ [ViaVersion](https://github.com/ViaVersion/ViaVersion) + +### Core Dependencies +The implementation relies on these fundamental libraries: ++ [ignite](https://github.com/vectrix-space/ignite) ++ [cloud-minecraft](https://github.com/Incendo/cloud-minecraft) ++ [rtag](https://github.com/saicone/rtag) ++ [adventure](https://github.com/KyoriPowered/adventure) ++ [byte-buddy](https://github.com/raphw/byte-buddy) + +## How to Contribute + +### 🔌 New Features & Bug Fixes +If your PR is about a bug fix, it will most likely get merged. If you want to submit a new feature, please make sure to contact me in advance on [Discord](https://discord.com/invite/WVKdaUPR3S). +The code you contribute will be open-sourced under the GPLv3 license. If you prefer a more permissive license(MIT), you can specifically indicate it at the top of the file. + +### 🌍 Translations +1. Clone this repository. +2. Create a new language file in: `/bukkit-loader/src/main/resources/translations` +3. Once done, submit a **pull request** for review. We appreciate your contributions! + +### 💖 Support the Developer +If you enjoy using CraftEngine, consider supporting the developer! By supporting developers, you can get support from the development team. + +- **Polymart**: [None] +- **BuiltByBit**: [None] +- **Afdian**: [Support via Afdian](https://afdian.com/@xiaomomi/) + +## CraftEngine API + +```kotlin +repositories { + maven("https://repo.momirealms.net/releases/") +} +``` +```kotlin +dependencies { + compileOnly("net.momirealms:craft-engine-core:0.0.29") + compileOnly("net.momirealms:craft-engine-bukkit:0.0.29") +} +``` diff --git a/build.gradle.kts b/build.gradle.kts new file mode 100644 index 000000000..388c37cc5 --- /dev/null +++ b/build.gradle.kts @@ -0,0 +1,46 @@ +plugins { + id("java") +} + +val git : String = versionBanner() +val builder : String = builder() +ext["git_version"] = git +ext["builder"] = builder + +subprojects { + + apply(plugin = "java") + apply(plugin = "java-library") + + repositories { + mavenCentral() + maven("https://jitpack.io/") + maven("https://repo.papermc.io/repository/maven-public/") + maven("https://oss.sonatype.org/content/repositories/snapshots") + maven("https://hub.spigotmc.org/nexus/content/repositories/snapshots/") + } + + tasks.processResources { + filteringCharset = "UTF-8" + + filesMatching(arrayListOf("craft-engine.properties")) { + expand(rootProject.properties) + } + + filesMatching(arrayListOf("commands.yml", "config.yml", "*/*.yml", "ignite.mod.json")) { + expand( + Pair("project_version", rootProject.properties["project_version"]), + Pair("config_version", rootProject.properties["config_version"]), + Pair("lang_version", rootProject.properties["lang_version"]) + ) + } + } +} + +fun versionBanner() = project.providers.exec { + commandLine("git", "rev-parse", "--short=8", "HEAD") +}.standardOutput.asText.map { it.trim() }.getOrElse("Unknown") + +fun builder() = project.providers.exec { + commandLine("git", "config", "user.name") +}.standardOutput.asText.map { it.trim() }.getOrElse("Unknown") \ No newline at end of file diff --git a/bukkit-loader/build.gradle.kts b/bukkit-loader/build.gradle.kts new file mode 100644 index 000000000..987b566ca --- /dev/null +++ b/bukkit-loader/build.gradle.kts @@ -0,0 +1,74 @@ +plugins { + id("com.gradleup.shadow") version "9.0.0-beta6" + id("net.minecrell.plugin-yml.bukkit") version "0.6.0" +} + +repositories { + maven("https://jitpack.io/") + maven("https://repo.papermc.io/repository/maven-public/") + maven("https://repo.momirealms.net/releases/") + mavenCentral() +} + +dependencies { + // Platform + compileOnly("dev.folia:folia-api:${rootProject.properties["paper_version"]}-R0.1-SNAPSHOT") + + implementation(project(":shared")) + implementation(project(":core")) + implementation(project(":bukkit")) + implementation(project(":bukkit:legacy")) + + implementation("net.kyori:adventure-platform-bukkit:${rootProject.properties["adventure_platform_version"]}") + implementation("com.saicone.rtag:rtag-item:${rootProject.properties["rtag_version"]}") + implementation("net.momirealms:sparrow-util:${rootProject.properties["sparrow_util_version"]}") + implementation("com.github.Xiao-MoMi:AntiGriefLib:${rootProject.properties["anti_grief_version"]}") +} + +java { + sourceCompatibility = JavaVersion.VERSION_21 + targetCompatibility = JavaVersion.VERSION_21 + toolchain { + languageVersion = JavaLanguageVersion.of(21) + } +} + +tasks.withType { + options.encoding = "UTF-8" + options.release.set(21) + dependsOn(tasks.clean) +} + +bukkit { + load = net.minecrell.pluginyml.bukkit.BukkitPluginDescription.PluginLoadOrder.POSTWORLD + main = "net.momirealms.craftengine.bukkit.BukkitBootstrap" + version = rootProject.properties["project_version"] as String + name = "CraftEngine" + apiVersion = "1.20" + authors = listOf("XiaoMoMi") + softDepend = listOf("PlaceholderAPI", "WorldEdit", "FastAsyncWorldEdit") + foliaSupported = true +} + +artifacts { + archives(tasks.shadowJar) +} + +tasks { + shadowJar { + archiveFileName = "${rootProject.name}-bukkit-plugin-${rootProject.properties["project_version"]}.jar" + destinationDirectory.set(file("$rootDir/target")) + relocate("net.kyori", "net.momirealms.craftengine.libraries") + relocate("net.momirealms.sparrow.nbt", "net.momirealms.craftengine.libraries.nbt") + relocate("net.momirealms.antigrieflib", "net.momirealms.craftengine.libraries.antigrieflib") + relocate("com.saicone.rtag", "net.momirealms.craftengine.libraries.tag") + relocate("org.incendo", "net.momirealms.craftengine.libraries") + relocate("dev.dejvokep", "net.momirealms.craftengine.libraries") + relocate("org.apache.commons.io", "net.momirealms.craftengine.libraries.commons.io") + relocate("org.bstats", "net.momirealms.craftengine.libraries.bstats") + relocate("com.github.benmanes.caffeine", "net.momirealms.craftengine.libraries.caffeine") + relocate("net.objecthunter.exp4j", "net.momirealms.craftengine.libraries.exp4j") + relocate("net.bytebuddy", "net.momirealms.craftengine.libraries.bytebuddy") + relocate("org.yaml.snakeyaml", "net.momirealms.craftengine.libraries.snakeyaml") + } +} diff --git a/bukkit-loader/src/main/java/net/momirealms/craftengine/bukkit/BukkitBootstrap.java b/bukkit-loader/src/main/java/net/momirealms/craftengine/bukkit/BukkitBootstrap.java new file mode 100644 index 000000000..27c93a874 --- /dev/null +++ b/bukkit-loader/src/main/java/net/momirealms/craftengine/bukkit/BukkitBootstrap.java @@ -0,0 +1,27 @@ +package net.momirealms.craftengine.bukkit; + +import net.momirealms.craftengine.bukkit.plugin.BukkitCraftEngine; +import org.bukkit.plugin.java.JavaPlugin; + +public class BukkitBootstrap extends JavaPlugin { + private final BukkitCraftEngine plugin; + + public BukkitBootstrap() { + this.plugin = new BukkitCraftEngine(this); + } + + @Override + public void onLoad() { + this.plugin.load(); + } + + @Override + public void onEnable() { + this.plugin.enable(); + } + + @Override + public void onDisable() { + this.plugin.disable(); + } +} diff --git a/bukkit-loader/src/main/resources/additional-real-blocks.yml b/bukkit-loader/src/main/resources/additional-real-blocks.yml new file mode 100644 index 000000000..ec4cfa011 --- /dev/null +++ b/bukkit-loader/src/main/resources/additional-real-blocks.yml @@ -0,0 +1,26 @@ +# This file will register an additional number of block states to the server, based on the mappings defined in mappings.yml. +# If you're unsure what this means, you can read the following explanation below. + +# Suppose you create a new type of leaf, but its appearance has only two states (waterlogged and normal). +# However, because of the defined properties such as distance, persistent, and waterlogged, it requires at least 2x2x7 = 28 different block states. +# By default, the plugin only registers the same number of block states as those defined in the mappings.yml file. +# Therefore, during actual configuration, you will notice that the internal IDs are insufficient +# (without configuring additional-real-block, one type of leaf can only provide 26 states, whereas creating a new leaf requires 28 states). +# The purpose of this file is to register additional block states with the server when starting it, ensuring the correct mapping between real blocks and the visual appearance of fake blocks on the server. + +# Some common questions: +# Q: Do I need to restart the server for the changes to take effect? +# A: Yes! Modifying the block registry while the server is running is extremely risky. +# Q: When do I need to configure this file? +# A: When the number of real block IDs is insufficient, but there are still available appearances. + +# By default, the plugin only registers an additional 112 oak leaf block states (for the default configuration needs [>=28 states]). +minecraft:oak_leaves: 112 + +minecraft:oak_sapling: 1 +minecraft:birch_sapling: 1 +minecraft:spruce_sapling: 1 +minecraft:jungle_sapling: 1 +minecraft:dark_oak_sapling: 1 +minecraft:acacia_sapling: 1 +minecraft:cherry_sapling: 1 \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/blockstates.yml b/bukkit-loader/src/main/resources/blockstates.yml new file mode 100644 index 000000000..8b490aadc --- /dev/null +++ b/bukkit-loader/src/main/resources/blockstates.yml @@ -0,0 +1,92 @@ +minecraft:note_block: + instrument=harp: + model: "minecraft:block/note_block" +minecraft:tripwire: + attached=true,east=true,north=true,south=true,disarmed=true,west=true,powered=true: + model: "minecraft:block/tripwire_attached_nsew" +minecraft:red_mushroom_block: + down=true,east=true,north=true,south=true,up=true,west=true: + model: "minecraft:block/red_mushroom_block_inventory" +minecraft:brown_mushroom_block: + down=true,east=true,north=true,south=true,up=true,west=true: + model: "minecraft:block/brown_mushroom_block_inventory" +minecraft:mushroom_stem: + down=true,east=true,north=true,south=true,up=true,west=true: + model: "minecraft:block/mushroom_stem_inventory" +minecraft:kelp: + age=0: + model: "minecraft:block/kelp" +minecraft:weeping_vines: + age=0: + model: "minecraft:block/weeping_vines" +minecraft:twisting_vines: + age=0: + model: "minecraft:block/twisting_vines" +minecraft:cave_vines: + age=0,berries=false: + model: "minecraft:block/cave_vines" + age=0,berries=true: + model: "minecraft:block/cave_vines_lit" +minecraft:sugar_cane: + age=0: + model: "minecraft:block/sugar_cane" +minecraft:oak_leaves: + distance=7,persistent=true: + model: "minecraft:block/oak_leaves" +minecraft:acacia_leaves: + distance=7,persistent=true: + model: "minecraft:block/acacia_leaves" +minecraft:jungle_leaves: + distance=7,persistent=true: + model: "minecraft:block/jungle_leaves" +minecraft:birch_leaves: + distance=7,persistent=true: + model: "minecraft:block/birch_leaves" +minecraft:mangrove_leaves: + distance=7,persistent=true: + model: "minecraft:block/mangrove_leaves" +minecraft:cherry_leaves: + distance=7,persistent=true: + model: "minecraft:block/cherry_leaves" +minecraft:dark_oak_leaves: + distance=7,persistent=true: + model: "minecraft:block/dark_oak_leaves" +minecraft:azalea_leaves: + distance=7,persistent=true: + model: "minecraft:block/azalea_leaves" +minecraft:flowering_azalea_leaves: + distance=7,persistent=true: + model: "minecraft:block/flowering_azalea_leaves" +minecraft:spruce_leaves: + distance=7,persistent=true: + model: "minecraft:block/spruce_leaves" +minecraft:pale_oak_leaves: + distance=7,persistent=true: + model: "minecraft:block/pale_oak_leaves" +minecraft:chorus_plant: + down=true,east=true,north=true,south=true,up=true,west=true: + model: "minecraft:block/default_chorus_plant" +minecraft:oak_sapling: + stage=0: + model: "minecraft:block/oak_sapling" +minecraft:birch_sapling: + stage=0: + model: "minecraft:block/birch_sapling" +minecraft:spruce_sapling: + stage=0: + model: "minecraft:block/spruce_sapling" +minecraft:jungle_sapling: + stage=0: + model: "minecraft:block/jungle_sapling" +minecraft:dark_oak_sapling: + stage=0: + model: "minecraft:block/dark_oak_sapling" +minecraft:acacia_sapling: + stage=0: + model: "minecraft:block/acacia_sapling" +minecraft:cherry_sapling: + stage=0: + model: "minecraft:block/cherry_sapling" +minecraft:pale_oak_sapling: + stage=0: + model: "minecraft:block/pale_oak_sapling" \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/commands.yml b/bukkit-loader/src/main/resources/commands.yml new file mode 100644 index 000000000..02e9b64c1 --- /dev/null +++ b/bukkit-loader/src/main/resources/commands.yml @@ -0,0 +1,96 @@ +# +# Don't change this +# +config-version: "${config_version}" + +# +# For safety reasons, editing this file requires a restart to apply +# + +# A command to reload the plugin +# Usage: [COMMAND] +reload: + enable: true + permission: ce.command.reload + usage: + - /craftengine reload + - /ce reload + +get_item: + enable: true + permission: ce.command.get_item + usage: + - /craftengine item get + - /ce item get + +give_item: + enable: true + permission: ce.command.give_item + usage: + - /craftengine item give + - /ce item give + +item_browser: + enable: true + permission: ce.command.item_browser + usage: + - /craftengine item browser + - /ce item browser + - /ce + +# Debug commands +debug_set_block: + enable: true + permission: ce.command.debug.setblock + usage: + - /craftengine debug setblock + - /ce debug setblock + +debug_get_block_state_registry_id: + enable: true + permission: ce.command.debug.get_block_state_registry_id + usage: + - /craftengine debug get-block-state-registry-id + - /ce debug get-block-state-registry-id + +debug_get_block_internal_id: + enable: true + permission: ce.command.debug.get_block_internal_id + usage: + - /craftengine debug get-block-internal-id + - /ce debug get-block-internal-id + +debug_appearance_state_usage: + enable: true + permission: ce.command.debug.state_usage + usage: + - /craftengine debug appearance-state-usage + - /ce debug appearance-state-usage + +debug_real_state_usage: + enable: true + permission: ce.command.debug.state_usage + usage: + - /craftengine debug real-state-usage + - /ce debug real-state-usage + +debug_item_data: + enable: true + permission: ce.command.debug.item_data + usage: + - /craftengine debug item-data + - /ce debug item-data + +debug_target_block: + enable: true + permission: ce.command.debug.target_block + usage: + - /craftengine debug target-block + - /ce debug target-block + +debug_test: + enable: true + permission: ce.command.debug.test + usage: + - /craftengine debug test + - /ce debug test \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/config.yml b/bukkit-loader/src/main/resources/config.yml new file mode 100644 index 000000000..863a9a1b3 --- /dev/null +++ b/bukkit-loader/src/main/resources/config.yml @@ -0,0 +1,252 @@ +# Do not modify this value +config-version: '${config_version}' +# Enables or disables debug mode +debug: false +# Enables or disables metrics collection via BStats +metrics: true +# Enables automatic update checks +update-checker: true +# Forces a specific locale (e.g., zh_cn) +forced-locale: '' + +resource-pack: + # Should those images in minecraft:default font also work in minecraft:uniform + override-uniform-font: true + + # Do not use this feature for the moment as it's under development + # Do not use this feature for the moment as it's under development + # Do not use this feature for the moment as it's under development + # Resource pack protection + protection: + # Warning: Do not attempt to unzip the resource pack with crash tools enabled. + # Warning: Do not attempt to unzip the resource pack with crash tools enabled. + # Warning: Do not attempt to unzip the resource pack with crash tools enabled. + # You can enable all the methods at the same time. + crash-tools: + method-1: false + method-2: false + method-3: false # Enable this would increase the resource pack size by 0.67MB + # Please note that the primary purpose of obfuscation is to + # unidirectionally transform your resource pack into a format with significantly + # reduced readability, making it nearly impossible for thieves to + # restore the original structure of the resource pack. + # However, there is no 100% guarantee that it will not be reverse engineered. + obfuscation: + enable: false + seed: 0 # 0 = random seed + fake-directory: true + escape-unicode: true + resource-location: + enable: true + random-namespace: + amount: 32 # 0 = disable + length: 9 + random-path: + source: obf + depth: 16 + anti-unzip: false + random-atlas: + amount: 5 # 0 = disable + use-double: true + # Sometimes, some vanilla files that have been overwritten might be mistakenly obfuscated. + # Please add the ignored textures/models/sounds here. + bypass-textures: + - minecraft:block/farmland + bypass-models: [] + bypass-sounds: [] + + supported-version: + min: "1.20" + max: LATEST + merge-external-folders: + - ModelEngine/resource pack + send: + send-on-join: true + send-on-reload: true + kick-if-declined: true + prompt: "To fully experience our server, please accept our custom resource pack." + # If you are hosting the resource pack by yourself, replace `localhost` with your server ip otherwise it would only work on your local pc + # If using BungeeCord or Velocity, consider using a proxy-side plugin to handle resource pack delivery. + mode: self-host # self-host/external-host/none + self-host: + ip: localhost + port: 8163 + protocol: http + deny-non-minecraft-request: true + # If the path begins with `./` or `../`, it is treated as a relative path to the plugin folder. + # Otherwise, it is considered an absolute path. + local-file-path: "./generated/resource_pack.zip" + rate-limit: + max-requests: 3 + reset-interval: 30 # seconds + external-host: + url: "" + sha1: "" + uuid: "" + duplicated-files-handler: + - term: + type: any_of + terms: + - type: parent_path_suffix + suffix: "minecraft/items" + - type: parent_path_suffix + suffix: "minecraft/models/item" + - type: parent_path_suffix + suffix: "minecraft/atlases" + resolution: + type: merge_json + deeply: true + - term: + type: exact + path: "pack.mcmeta" + resolution: + type: retain_matching + term: + type: contains + path: "resources/default/resourcepack/" + - term: + type: exact + path: "pack.png" + resolution: + type: retain_matching + term: + type: contains + path: "resources/default/resourcepack" + - term: + type: filename + name: "sounds.json" + resolution: + type: merge_json + deeply: false + +item: + # Add a tag on item name and lore + non-italic-tag: false + +block: + sound-system: + enable: true + +furniture: + # Should the plugin remove invalid furniture on chunk load + remove-invalid-furniture-on-chunk-load: + enable: false + # If you want to remove all invalid furniture, please set this list to empty, otherwise only furniture in the list will be removed. + list: + - "xxx:invalid_furniture" + +recipe: + enable: true + +gui: + browser: + sounds: + change-page: "minecraft:ui.loom.take_result" + return-page: "minecraft:ui.button.click" + pick-item: "minecraft:entity.item.pickup" + click-button: "minecraft:ui.hud.bubble_pop" + main: + title: "" + page-navigation: + next: + available: "internal:next_page_0" + not-available: "internal:next_page_1" + previous: + available: "internal:previous_page_0" + not-available: "internal:previous_page_1" + category: + title: "" + page-navigation: + next: + available: "internal:next_page_0" + not-available: "internal:next_page_1" + previous: + available: "internal:previous_page_0" + not-available: "internal:previous_page_1" + return: "internal:return" + recipe: + get-item-icon: internal:get_item + cooking-information-icon: internal:cooking_info + page-navigation: + next: + available: "internal:next_recipe_0" + not-available: "internal:next_recipe_1" + previous: + available: "internal:previous_recipe_0" + not-available: "internal:previous_recipe_1" + return: "internal:return" + none: + title: "" + blasting: + title: "" + smelting: + title: "" + smoking: + title: "" + campfire: + title: "" + crafting: + title: "" + stonecutting: + title: "" + +performance: + # Maximum chain update depth when fixing client visuals + max-block-chain-update-limit: 64 + light-system: + enable: true + # Turning this option on will reduce lighting system issues to some extent, but will increase server bandwidth consumption + force-update-light: false + chunk-system: + # Disabling this option prevents the plugin from converting custom blocks to vanilla states when chunks are unloaded. + # While this can improve performance, custom blocks will turn into air if the plugin is uninstalled. + restore-vanilla-blocks-on-chunk-unload: true + # If you disable this, it's a must to disable the above option. + restore-custom-blocks-on-chunk-load: true + +offset-characters: + font: minecraft:offset_chars + -1: '\uf800' + -2: '\uf801' + -3: '\uf802' + -4: '\uf803' + -5: '\uf804' + -6: '\uf805' + -7: '\uf806' + -8: '\uf807' + -9: '\uf808' + -10: '\uf809' + -11: '\uf80a' + -12: '\uf80b' + -13: '\uf80c' + -14: '\uf80d' + -15: '\uf80e' + -16: '\uf80f' + -24: '\uf810' + -32: '\uf811' + -48: '\uf812' + -64: '\uf813' + -128: '\uf814' + -256: '\uf815' + 1: '\uf830' + 2: '\uf831' + 3: '\uf832' + 4: '\uf833' + 5: '\uf834' + 6: '\uf835' + 7: '\uf836' + 8: '\uf837' + 9: '\uf838' + 10: '\uf839' + 11: '\uf83a' + 12: '\uf83b' + 13: '\uf83c' + 14: '\uf83d' + 15: '\uf83e' + 16: '\uf83f' + 24: '\uf840' + 32: '\uf841' + 48: '\uf842' + 64: '\uf843' + 128: '\uf844' + 256: '\uf845' \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/craft-engine.properties b/bukkit-loader/src/main/resources/craft-engine.properties new file mode 100644 index 000000000..e657cdbcd --- /dev/null +++ b/bukkit-loader/src/main/resources/craft-engine.properties @@ -0,0 +1,30 @@ +config=${config_version} +builder=${builder} +supported-languages=${supported_languages} +lang-version=${lang_version} +legacy-templates=${legacy_model_templates_version} +latest-templates=${latest_model_templates_version} +latest-version=${latest_minecraft_version} +asm=${asm_version} +asm-commons=${asm_commons_version} +jar-relocator=${jar_relocator_version} +cloud-core=${cloud_core_version} +cloud-services=${cloud_services_version} +cloud-brigadier=${cloud_brigadier_version} +cloud-bukkit=${cloud_bukkit_version} +cloud-paper=${cloud_paper_version} +cloud-minecraft-extras=${cloud_minecraft_extras_version} +boosted-yaml=${boosted_yaml_version} +bstats-base=${bstats_version} +geantyref=${geantyref_version} +gson=${gson_version} +caffeine=${caffeine_version} +slf4j-api=${slf4j_version} +zstd-jni=${zstd_version} +commons-io=${commons_io_version} +byte-buddy=${byte_buddy_version} +snake-yaml=${snake_yaml_version} +adventure-text-minimessage=${adventure_bundle_version} +adventure-text-serializer-gson=${adventure_bundle_version} +adventure-text-serializer-json=${adventure_bundle_version} +netty-codec-http=${netty_version} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/sounds.json b/bukkit-loader/src/main/resources/internal/sounds.json new file mode 100644 index 000000000..bda7661d1 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/sounds.json @@ -0,0 +1,23122 @@ +{ + "ambient.basalt_deltas.additions": { + "sounds": [ + { + "name": "ambient/nether/basalt_deltas/basaltground1", + "volume": 0.55, + "weight": 10 + }, + { + "name": "ambient/nether/basalt_deltas/basaltground2", + "volume": 0.55, + "weight": 10 + }, + { + "name": "ambient/nether/basalt_deltas/basaltground3", + "volume": 0.55, + "weight": 10 + }, + { + "name": "ambient/nether/basalt_deltas/click1", + "volume": 0.19, + "weight": 20 + }, + { + "name": "ambient/nether/basalt_deltas/click2", + "volume": 0.19, + "weight": 20 + }, + { + "name": "ambient/nether/basalt_deltas/click3", + "volume": 0.19, + "weight": 20 + }, + { + "name": "ambient/nether/basalt_deltas/click4", + "volume": 0.25, + "weight": 20 + }, + { + "name": "ambient/nether/basalt_deltas/click5", + "volume": 0.25, + "weight": 20 + }, + { + "name": "ambient/nether/basalt_deltas/click6", + "volume": 0.01, + "weight": 20 + }, + { + "name": "ambient/nether/basalt_deltas/click7", + "volume": 0.01, + "weight": 25 + }, + { + "name": "ambient/nether/basalt_deltas/click8", + "volume": 0.01, + "weight": 25 + }, + { + "name": "ambient/nether/basalt_deltas/debris1", + "volume": 0.35, + "weight": 40 + }, + { + "name": "ambient/nether/basalt_deltas/debris2", + "volume": 0.35, + "weight": 40 + }, + { + "name": "ambient/nether/basalt_deltas/debris3", + "volume": 0.35, + "weight": 40 + }, + { + "name": "ambient/nether/basalt_deltas/heavy_click1", + "volume": 0.25, + "weight": 20 + }, + { + "name": "ambient/nether/basalt_deltas/heavy_click2", + "volume": 0.25, + "weight": 20 + }, + { + "name": "ambient/nether/basalt_deltas/long_debris1", + "volume": 0.35, + "weight": 40 + }, + { + "name": "ambient/nether/basalt_deltas/long_debris2", + "volume": 0.35, + "weight": 40 + }, + { + "name": "ambient/nether/basalt_deltas/plode1", + "volume": 0.5, + "weight": 10 + }, + { + "name": "ambient/nether/basalt_deltas/plode2", + "volume": 0.5, + "weight": 10 + }, + { + "name": "ambient/nether/basalt_deltas/plode3", + "volume": 0.5, + "weight": 10 + }, + { + "name": "ambient/nether/basalt_deltas/twist1", + "volume": 0.66 + }, + { + "name": "ambient/nether/basalt_deltas/twist2", + "volume": 0.66 + }, + { + "name": "ambient/nether/basalt_deltas/twist3", + "volume": 0.77 + }, + { + "name": "ambient/nether/basalt_deltas/twist4", + "volume": 0.66 + }, + { + "name": "ambient/nether/soulsand_valley/wind1", + "volume": 0.3, + "weight": 25 + }, + { + "name": "ambient/nether/soulsand_valley/wind2", + "volume": 0.25, + "weight": 25 + }, + { + "name": "ambient/nether/soulsand_valley/wind3", + "volume": 0.25, + "weight": 25 + }, + { + "name": "ambient/nether/soulsand_valley/wind4", + "volume": 0.3, + "weight": 25 + } + ] + }, + "ambient.basalt_deltas.loop": { + "sounds": [ + { + "name": "ambient/nether/basalt_deltas/ambience", + "stream": true, + "volume": 0.5 + } + ] + }, + "ambient.basalt_deltas.mood": { + "sounds": [ + "ambient/nether/nether_wastes/mood1", + "ambient/nether/nether_wastes/mood2", + "ambient/nether/nether_wastes/mood3", + "ambient/nether/nether_wastes/mood4", + "ambient/nether/nether_wastes/mood5" + ] + }, + "ambient.cave": { + "sounds": [ + "ambient/cave/cave1", + "ambient/cave/cave2", + "ambient/cave/cave3", + "ambient/cave/cave4", + "ambient/cave/cave5", + "ambient/cave/cave6", + "ambient/cave/cave7", + "ambient/cave/cave8", + "ambient/cave/cave9", + "ambient/cave/cave10", + "ambient/cave/cave11", + "ambient/cave/cave12", + "ambient/cave/cave13", + "ambient/cave/cave14", + "ambient/cave/cave15", + "ambient/cave/cave16", + "ambient/cave/cave17", + "ambient/cave/cave18", + "ambient/cave/cave19", + "ambient/cave/cave20", + "ambient/cave/cave21", + "ambient/cave/cave22", + "ambient/cave/cave23" + ], + "subtitle": "subtitles.ambient.sound" + }, + "ambient.crimson_forest.additions": { + "sounds": [ + { + "name": "ambient/nether/crimson_forest/addition1", + "volume": 0.4, + "weight": 3 + }, + { + "name": "ambient/nether/crimson_forest/addition2", + "volume": 0.5, + "weight": 3 + }, + { + "name": "ambient/nether/crimson_forest/addition3", + "volume": 0.32, + "weight": 3 + }, + { + "name": "ambient/nether/crimson_forest/particles1", + "volume": 0.4, + "weight": 35 + }, + { + "name": "ambient/nether/crimson_forest/particles2", + "volume": 0.4, + "weight": 35 + }, + { + "name": "ambient/nether/crimson_forest/particles3", + "volume": 0.4, + "weight": 35 + }, + { + "name": "ambient/nether/crimson_forest/shine1", + "pitch": 0.5, + "volume": 0.1, + "weight": 6 + }, + { + "name": "ambient/nether/crimson_forest/shine2", + "pitch": 0.5, + "volume": 0.1, + "weight": 6 + }, + { + "name": "ambient/nether/crimson_forest/shine3", + "pitch": 0.5, + "volume": 0.1, + "weight": 6 + }, + { + "name": "ambient/nether/crimson_forest/shroom1", + "volume": 0.25, + "weight": 2 + }, + { + "name": "ambient/nether/crimson_forest/shroom2", + "volume": 0.25, + "weight": 2 + }, + { + "name": "ambient/nether/crimson_forest/shroom3", + "volume": 0.25, + "weight": 2 + }, + { + "name": "ambient/nether/crimson_forest/twang1", + "volume": 0.25, + "weight": 2 + }, + { + "name": "ambient/nether/crimson_forest/voom1", + "volume": 0.7, + "weight": 4 + }, + { + "name": "ambient/nether/crimson_forest/voom1", + "pitch": 0.8, + "volume": 0.7, + "weight": 4 + }, + { + "name": "ambient/nether/crimson_forest/voom2", + "volume": 0.7, + "weight": 4 + }, + { + "name": "ambient/nether/crimson_forest/voom2", + "pitch": 0.8, + "volume": 0.7, + "weight": 4 + } + ] + }, + "ambient.crimson_forest.loop": { + "sounds": [ + { + "name": "ambient/nether/crimson_forest/ambience", + "stream": true, + "volume": 0.74 + } + ] + }, + "ambient.crimson_forest.mood": { + "sounds": [ + "ambient/nether/crimson_forest/mood1", + "ambient/nether/crimson_forest/mood2", + "ambient/nether/crimson_forest/mood3", + "ambient/nether/crimson_forest/mood4" + ] + }, + "ambient.nether_wastes.additions": { + "sounds": [ + { + "name": "ambient/nether/nether_wastes/addition1", + "volume": 0.3 + }, + { + "name": "ambient/nether/nether_wastes/addition2", + "volume": 0.3 + }, + { + "name": "ambient/nether/nether_wastes/addition3", + "volume": 0.1 + }, + { + "name": "ambient/nether/nether_wastes/addition4", + "volume": 0.67, + "weight": 5 + }, + { + "name": "ambient/nether/nether_wastes/addition5", + "volume": 0.3 + }, + { + "name": "ambient/nether/nether_wastes/addition6", + "volume": 0.3 + }, + { + "name": "ambient/nether/nether_wastes/addition7", + "volume": 0.3 + }, + { + "name": "ambient/nether/nether_wastes/addition8", + "volume": 0.67, + "weight": 5 + }, + { + "name": "ambient/nether/nether_wastes/dark1", + "volume": 0.9, + "weight": 5 + }, + { + "name": "ambient/nether/nether_wastes/dark2", + "volume": 0.9, + "weight": 5 + }, + { + "name": "ambient/nether/nether_wastes/ground1", + "volume": 0.25, + "weight": 3 + }, + { + "name": "ambient/nether/nether_wastes/ground2", + "volume": 0.4 + }, + { + "name": "ambient/nether/nether_wastes/ground3", + "volume": 0.4 + }, + { + "name": "ambient/nether/nether_wastes/ground4", + "volume": 0.4 + } + ] + }, + "ambient.nether_wastes.loop": { + "sounds": [ + { + "name": "ambient/nether/nether_wastes/ambience", + "stream": true, + "volume": 0.77 + } + ] + }, + "ambient.nether_wastes.mood": { + "sounds": [ + "ambient/nether/nether_wastes/mood1", + "ambient/nether/nether_wastes/mood2", + "ambient/nether/nether_wastes/mood3", + "ambient/nether/nether_wastes/mood4", + "ambient/nether/nether_wastes/mood5" + ] + }, + "ambient.soul_sand_valley.additions": { + "sounds": [ + { + "name": "ambient/nether/soulsand_valley/sand1", + "volume": 0.2, + "weight": 25 + }, + { + "name": "ambient/nether/soulsand_valley/sand2", + "volume": 0.2, + "weight": 25 + }, + { + "name": "ambient/nether/soulsand_valley/sand3", + "volume": 0.4, + "weight": 2 + }, + { + "name": "ambient/nether/soulsand_valley/voices1", + "volume": 0.4, + "weight": 5 + }, + { + "name": "ambient/nether/soulsand_valley/voices2", + "volume": 0.4, + "weight": 5 + }, + { + "name": "ambient/nether/soulsand_valley/voices3", + "volume": 0.4, + "weight": 5 + }, + { + "name": "ambient/nether/soulsand_valley/voices4", + "volume": 0.8, + "weight": 5 + }, + { + "name": "ambient/nether/soulsand_valley/voices5", + "volume": 0.4, + "weight": 5 + }, + { + "name": "ambient/nether/soulsand_valley/voices5", + "pitch": 0.7, + "volume": 0.15, + "weight": 5 + }, + { + "name": "ambient/nether/soulsand_valley/whisper1", + "volume": 0.9, + "weight": 5 + }, + { + "name": "ambient/nether/soulsand_valley/whisper2", + "volume": 0.9, + "weight": 5 + }, + { + "name": "ambient/nether/soulsand_valley/whisper3", + "volume": 0.9, + "weight": 5 + }, + { + "name": "ambient/nether/soulsand_valley/whisper4", + "volume": 0.9, + "weight": 5 + }, + { + "name": "ambient/nether/soulsand_valley/whisper5", + "volume": 0.9, + "weight": 5 + }, + { + "name": "ambient/nether/soulsand_valley/whisper6", + "volume": 0.9, + "weight": 5 + }, + { + "name": "ambient/nether/soulsand_valley/whisper7", + "volume": 0.9, + "weight": 5 + }, + { + "name": "ambient/nether/soulsand_valley/whisper8", + "weight": 5 + }, + { + "name": "ambient/nether/soulsand_valley/wind1", + "volume": 0.3, + "weight": 25 + }, + { + "name": "ambient/nether/soulsand_valley/wind1", + "pitch": 0.75, + "volume": 0.3, + "weight": 25 + }, + { + "name": "ambient/nether/soulsand_valley/wind2", + "volume": 0.25, + "weight": 25 + }, + { + "name": "ambient/nether/soulsand_valley/wind2", + "pitch": 0.75, + "volume": 0.3, + "weight": 25 + }, + { + "name": "ambient/nether/soulsand_valley/wind3", + "volume": 0.25, + "weight": 25 + }, + { + "name": "ambient/nether/soulsand_valley/wind3", + "pitch": 0.75, + "volume": 0.3, + "weight": 25 + }, + { + "name": "ambient/nether/soulsand_valley/wind4", + "volume": 0.3, + "weight": 25 + }, + { + "name": "ambient/nether/soulsand_valley/wind4", + "pitch": 0.75, + "volume": 0.3, + "weight": 25 + }, + { + "name": "ambient/nether/soulsand_valley/with1", + "volume": 0.6, + "weight": 4 + } + ] + }, + "ambient.soul_sand_valley.loop": { + "sounds": [ + { + "name": "ambient/nether/soulsand_valley/ambience", + "stream": true, + "volume": 0.85 + } + ] + }, + "ambient.soul_sand_valley.mood": { + "sounds": [ + "ambient/nether/soulsand_valley/mood1", + "ambient/nether/soulsand_valley/mood2", + "ambient/nether/soulsand_valley/mood3", + "ambient/nether/soulsand_valley/mood4" + ] + }, + "ambient.underwater.enter": { + "sounds": [ + { + "name": "ambient/underwater/enter1", + "volume": 0.5 + }, + { + "name": "ambient/underwater/enter2", + "volume": 0.5 + }, + { + "name": "ambient/underwater/enter3", + "volume": 0.5 + } + ] + }, + "ambient.underwater.exit": { + "sounds": [ + { + "name": "ambient/underwater/exit1", + "volume": 0.3 + }, + { + "name": "ambient/underwater/exit2", + "volume": 0.3 + }, + { + "name": "ambient/underwater/exit3", + "volume": 0.3 + } + ] + }, + "ambient.underwater.loop": { + "sounds": [ + { + "name": "ambient/underwater/underwater_ambience", + "stream": true, + "volume": 0.65 + } + ] + }, + "ambient.underwater.loop.additions": { + "sounds": [ + "ambient/underwater/additions/bubbles1", + "ambient/underwater/additions/bubbles2", + "ambient/underwater/additions/bubbles3", + "ambient/underwater/additions/bubbles4", + "ambient/underwater/additions/bubbles5", + "ambient/underwater/additions/bubbles6", + "ambient/underwater/additions/water1", + "ambient/underwater/additions/water2" + ] + }, + "ambient.underwater.loop.additions.rare": { + "sounds": [ + "ambient/underwater/additions/animal1", + { + "name": "ambient/underwater/additions/bass_whale1", + "volume": 0.45 + }, + { + "name": "ambient/underwater/additions/bass_whale2", + "volume": 0.5 + }, + { + "name": "ambient/underwater/additions/crackles1", + "volume": 0.7 + }, + "ambient/underwater/additions/crackles2", + { + "name": "ambient/underwater/additions/driplets1", + "volume": 0.5 + }, + { + "name": "ambient/underwater/additions/driplets2", + "volume": 0.5 + }, + "ambient/underwater/additions/earth_crack" + ] + }, + "ambient.underwater.loop.additions.ultra_rare": { + "sounds": [ + "ambient/underwater/additions/animal2", + "ambient/underwater/additions/dark1", + { + "name": "ambient/underwater/additions/dark2", + "volume": 0.7 + }, + "ambient/underwater/additions/dark3", + "ambient/underwater/additions/dark4" + ] + }, + "ambient.warped_forest.additions": { + "sounds": [ + { + "name": "ambient/nether/crimson_forest/addition1", + "volume": 0.3 + }, + { + "name": "ambient/nether/crimson_forest/particles1", + "pitch": 0.8, + "volume": 0.4, + "weight": 40 + }, + { + "name": "ambient/nether/crimson_forest/particles2", + "pitch": 0.8, + "volume": 0.3, + "weight": 40 + }, + { + "name": "ambient/nether/crimson_forest/particles3", + "pitch": 0.8, + "volume": 0.3, + "weight": 40 + }, + { + "name": "ambient/nether/warped_forest/addition1", + "pitch": 0.8, + "volume": 0.06, + "weight": 3 + }, + { + "name": "ambient/nether/warped_forest/addition2", + "pitch": 0.7, + "volume": 0.06, + "weight": 3 + }, + { + "name": "ambient/nether/warped_forest/addition3", + "pitch": 0.1, + "volume": 0.06, + "weight": 3 + }, + { + "name": "ambient/nether/warped_forest/addition4", + "volume": 0.07, + "weight": 3 + }, + { + "name": "ambient/nether/warped_forest/addition5", + "volume": 0.07, + "weight": 3 + }, + { + "name": "ambient/nether/warped_forest/addition6", + "volume": 0.15 + }, + { + "name": "ambient/nether/warped_forest/enish1", + "pitch": 0.2, + "volume": 0.1, + "weight": 10 + }, + { + "name": "ambient/nether/warped_forest/enish2", + "pitch": 0.2, + "volume": 0.1, + "weight": 6 + }, + { + "name": "ambient/nether/warped_forest/enish3", + "pitch": 0.2, + "volume": 0.07, + "weight": 6 + }, + { + "name": "ambient/nether/warped_forest/help1", + "volume": 0.2 + }, + { + "name": "ambient/nether/warped_forest/help2", + "volume": 0.2 + }, + { + "name": "ambient/nether/warped_forest/here1", + "volume": 0.1, + "weight": 2 + }, + { + "name": "ambient/nether/warped_forest/here1", + "pitch": 0.7, + "volume": 0.1, + "weight": 2 + }, + { + "name": "ambient/nether/warped_forest/here2", + "volume": 0.2, + "weight": 3 + }, + { + "name": "ambient/nether/warped_forest/here2", + "pitch": 0.7, + "volume": 0.2, + "weight": 3 + }, + { + "name": "ambient/nether/warped_forest/here3", + "volume": 0.2, + "weight": 3 + } + ] + }, + "ambient.warped_forest.loop": { + "sounds": [ + { + "name": "ambient/nether/warped_forest/ambience", + "stream": true, + "volume": 0.71 + } + ] + }, + "ambient.warped_forest.mood": { + "sounds": [ + "ambient/nether/warped_forest/creak1", + "ambient/nether/warped_forest/creak2", + "ambient/nether/warped_forest/creak3", + "ambient/nether/warped_forest/creak4", + "ambient/nether/warped_forest/creak5", + "ambient/nether/warped_forest/mood1", + "ambient/nether/warped_forest/mood2", + "ambient/nether/warped_forest/mood3", + "ambient/nether/warped_forest/mood4", + "ambient/nether/warped_forest/mood5", + "ambient/nether/warped_forest/mood6", + "ambient/nether/warped_forest/mood7" + ] + }, + "block.amethyst_block.break": { + "sounds": [ + "block/amethyst/break1", + "block/amethyst/break2", + "block/amethyst/break3", + "block/amethyst/break4" + ], + "subtitle": "subtitles.block.generic.break" + }, + "block.amethyst_block.chime": { + "sounds": [ + { + "name": "block/amethyst/shimmer", + "volume": 0.2 + } + ], + "subtitle": "subtitles.block.amethyst_block.chime" + }, + "block.amethyst_block.fall": { + "sounds": [ + "block/amethyst/step1", + "block/amethyst/step2", + "block/amethyst/step3", + "block/amethyst/step4", + "block/amethyst/step5", + "block/amethyst/step6", + "block/amethyst/step7", + "block/amethyst/step8", + "block/amethyst/step9", + "block/amethyst/step10", + "block/amethyst/step11", + "block/amethyst/step12", + "block/amethyst/step14" + ], + "subtitle": "subtitles.block.generic.fall" + }, + "block.amethyst_block.hit": { + "sounds": [ + "block/amethyst/step1", + "block/amethyst/step2", + "block/amethyst/step3", + "block/amethyst/step4", + "block/amethyst/step5", + "block/amethyst/step6", + "block/amethyst/step7", + "block/amethyst/step8", + "block/amethyst/step9", + "block/amethyst/step10", + "block/amethyst/step11", + "block/amethyst/step12" + ], + "subtitle": "subtitles.block.generic.hit" + }, + "block.amethyst_block.place": { + "sounds": [ + "block/amethyst/place1", + "block/amethyst/place2", + "block/amethyst/place3", + "block/amethyst/place4" + ], + "subtitle": "subtitles.block.generic.place" + }, + "block.amethyst_block.resonate": { + "sounds": [ + { + "attenuation_distance": 48, + "name": "block/amethyst/resonate1" + }, + { + "attenuation_distance": 48, + "name": "block/amethyst/resonate2" + }, + { + "attenuation_distance": 48, + "name": "block/amethyst/resonate3" + }, + { + "attenuation_distance": 48, + "name": "block/amethyst/resonate4" + } + ], + "subtitle": "subtitles.block.amethyst_block.resonate" + }, + "block.amethyst_block.step": { + "sounds": [ + "block/amethyst/step1", + "block/amethyst/step2", + "block/amethyst/step3", + "block/amethyst/step4", + "block/amethyst/step5", + "block/amethyst/step6", + "block/amethyst/step7", + "block/amethyst/step8", + "block/amethyst/step9", + "block/amethyst/step10", + "block/amethyst/step11", + "block/amethyst/step12", + "block/amethyst/step13", + "block/amethyst/step14" + ], + "subtitle": "subtitles.block.generic.footsteps" + }, + "block.amethyst_cluster.break": { + "sounds": [ + { + "name": "block/amethyst_cluster/break1", + "pitch": 0.8, + "volume": 0.8 + }, + { + "name": "block/amethyst_cluster/break2", + "pitch": 0.8, + "volume": 0.8 + }, + { + "name": "block/amethyst_cluster/break3", + "pitch": 0.8, + "volume": 0.8 + }, + { + "name": "block/amethyst_cluster/break4", + "pitch": 0.8, + "volume": 0.8 + } + ], + "subtitle": "subtitles.block.generic.break" + }, + "block.amethyst_cluster.fall": { + "sounds": [ + "block/amethyst/step1", + "block/amethyst/step2", + "block/amethyst/step3", + "block/amethyst/step4", + "block/amethyst/step5", + "block/amethyst/step6", + "block/amethyst/step7", + "block/amethyst/step8", + "block/amethyst/step9", + "block/amethyst/step10", + "block/amethyst/step11", + "block/amethyst/step12", + "block/amethyst/step14" + ], + "subtitle": "subtitles.block.generic.fall" + }, + "block.amethyst_cluster.hit": { + "sounds": [ + "block/amethyst/step1", + "block/amethyst/step2", + "block/amethyst/step3", + "block/amethyst/step4", + "block/amethyst/step5", + "block/amethyst/step6", + "block/amethyst/step7", + "block/amethyst/step8", + "block/amethyst/step9", + "block/amethyst/step10", + "block/amethyst/step11", + "block/amethyst/step12" + ], + "subtitle": "subtitles.block.generic.hit" + }, + "block.amethyst_cluster.place": { + "sounds": [ + { + "name": "block/amethyst_cluster/place1", + "volume": 0.9 + }, + { + "name": "block/amethyst_cluster/place2", + "volume": 0.9 + }, + { + "name": "block/amethyst_cluster/place3", + "volume": 0.9 + }, + { + "name": "block/amethyst_cluster/place4", + "volume": 0.9 + } + ], + "subtitle": "subtitles.block.generic.place" + }, + "block.amethyst_cluster.step": { + "sounds": [ + "block/amethyst/step1", + "block/amethyst/step2", + "block/amethyst/step3", + "block/amethyst/step4", + "block/amethyst/step5", + "block/amethyst/step6", + "block/amethyst/step7", + "block/amethyst/step8", + "block/amethyst/step9", + "block/amethyst/step10", + "block/amethyst/step11", + "block/amethyst/step12", + "block/amethyst/step13", + "block/amethyst/step14" + ], + "subtitle": "subtitles.block.generic.footsteps" + }, + "block.ancient_debris.break": { + "sounds": [ + "block/ancient_debris/break1", + "block/ancient_debris/break2", + "block/ancient_debris/break3", + "block/ancient_debris/break4", + "block/ancient_debris/break5" + ], + "subtitle": "subtitles.block.generic.break" + }, + "block.ancient_debris.fall": { + "sounds": [ + "block/basalt/step1", + "block/basalt/step2", + "block/basalt/step3", + "block/basalt/step4", + "block/basalt/step5", + "block/basalt/step6" + ], + "subtitle": "subtitles.block.generic.fall" + }, + "block.ancient_debris.hit": { + "sounds": [ + "block/basalt/step1", + "block/basalt/step2", + "block/basalt/step3", + "block/basalt/step4", + "block/basalt/step5", + "block/basalt/step6" + ], + "subtitle": "subtitles.block.generic.hit" + }, + "block.ancient_debris.place": { + "sounds": [ + "block/ancient_debris/break1", + "block/ancient_debris/break2", + "block/ancient_debris/break3", + "block/ancient_debris/break4", + "block/ancient_debris/break5" + ], + "subtitle": "subtitles.block.generic.place" + }, + "block.ancient_debris.step": { + "sounds": [ + "block/basalt/step1", + "block/basalt/step2", + "block/basalt/step3", + "block/basalt/step4", + "block/basalt/step5", + "block/basalt/step6" + ], + "subtitle": "subtitles.block.generic.footsteps" + }, + "block.anvil.break": { + "sounds": [ + "dig/stone1", + "dig/stone2", + "dig/stone3", + "dig/stone4" + ], + "subtitle": "subtitles.block.generic.break" + }, + "block.anvil.destroy": { + "sounds": [ + "random/anvil_break" + ], + "subtitle": "subtitles.block.anvil.destroy" + }, + "block.anvil.fall": { + "sounds": [ + "step/stone1", + "step/stone2", + "step/stone3", + "step/stone4", + "step/stone5", + "step/stone6" + ], + "subtitle": "subtitles.block.generic.fall" + }, + "block.anvil.hit": { + "sounds": [ + "step/stone1", + "step/stone2", + "step/stone3", + "step/stone4", + "step/stone5", + "step/stone6" + ], + "subtitle": "subtitles.block.generic.hit" + }, + "block.anvil.land": { + "sounds": [ + "random/anvil_land" + ], + "subtitle": "subtitles.block.anvil.land" + }, + "block.anvil.place": { + "sounds": [ + "random/anvil_land" + ], + "subtitle": "subtitles.block.generic.place" + }, + "block.anvil.step": { + "sounds": [ + "step/stone1", + "step/stone2", + "step/stone3", + "step/stone4", + "step/stone5", + "step/stone6" + ], + "subtitle": "subtitles.block.generic.footsteps" + }, + "block.anvil.use": { + "sounds": [ + "random/anvil_use" + ], + "subtitle": "subtitles.block.anvil.use" + }, + "block.azalea.break": { + "sounds": [ + "block/azalea/break1", + "block/azalea/break2", + "block/azalea/break3", + "block/azalea/break4", + "block/azalea/break5", + "block/azalea/break6" + ], + "subtitle": "subtitles.block.generic.break" + }, + "block.azalea.fall": { + "sounds": [ + "block/azalea/step1", + "block/azalea/step2", + "block/azalea/step3", + "block/azalea/step4", + "block/azalea/step5", + "block/azalea/step6" + ], + "subtitle": "subtitles.block.generic.fall" + }, + "block.azalea.hit": { + "sounds": [ + "block/azalea/step1", + "block/azalea/step2", + "block/azalea/step3", + "block/azalea/step4", + "block/azalea/step5", + "block/azalea/step6" + ], + "subtitle": "subtitles.block.generic.hit" + }, + "block.azalea.place": { + "sounds": [ + "block/azalea/break1", + "block/azalea/break2", + "block/azalea/break3", + "block/azalea/break4", + "block/azalea/break5", + "block/azalea/break6" + ], + "subtitle": "subtitles.block.generic.place" + }, + "block.azalea.step": { + "sounds": [ + "block/azalea/step1", + "block/azalea/step2", + "block/azalea/step3", + "block/azalea/step4", + "block/azalea/step5", + "block/azalea/step6" + ], + "subtitle": "subtitles.block.generic.footsteps" + }, + "block.azalea_leaves.break": { + "sounds": [ + { + "name": "block/azalea_leaves/break1", + "volume": 0.85 + }, + { + "name": "block/azalea_leaves/break1", + "pitch": 0.92, + "volume": 0.85 + }, + { + "name": "block/azalea_leaves/break2", + "volume": 0.85 + }, + { + "name": "block/azalea_leaves/break2", + "pitch": 0.92, + "volume": 0.85 + }, + { + "name": "block/azalea_leaves/break3", + "volume": 0.85 + }, + { + "name": "block/azalea_leaves/break3", + "pitch": 0.92, + "volume": 0.85 + }, + { + "name": "block/azalea_leaves/break4", + "volume": 0.85 + }, + { + "name": "block/azalea_leaves/break4", + "pitch": 0.92, + "volume": 0.85 + }, + { + "name": "block/azalea_leaves/break5", + "volume": 0.85 + }, + { + "name": "block/azalea_leaves/break5", + "pitch": 0.92, + "volume": 0.85 + }, + { + "name": "block/azalea_leaves/break6", + "volume": 0.85 + }, + { + "name": "block/azalea_leaves/break6", + "pitch": 0.92, + "volume": 0.85 + }, + { + "name": "block/azalea_leaves/break7", + "volume": 0.85 + }, + { + "name": "block/azalea_leaves/break7", + "pitch": 0.92, + "volume": 0.85 + } + ], + "subtitle": "subtitles.block.generic.break" + }, + "block.azalea_leaves.fall": { + "sounds": [ + "block/azalea_leaves/step1", + "block/azalea_leaves/step2", + "block/azalea_leaves/step3", + "block/azalea_leaves/step4", + "block/azalea_leaves/step5" + ], + "subtitle": "subtitles.block.generic.fall" + }, + "block.azalea_leaves.hit": { + "sounds": [ + { + "name": "block/azalea_leaves/step1", + "volume": 0.8 + }, + { + "name": "block/azalea_leaves/step2", + "volume": 0.8 + }, + { + "name": "block/azalea_leaves/step3", + "volume": 0.8 + }, + { + "name": "block/azalea_leaves/step4", + "volume": 0.8 + }, + { + "name": "block/azalea_leaves/step5", + "volume": 0.8 + } + ], + "subtitle": "subtitles.block.generic.hit" + }, + "block.azalea_leaves.place": { + "sounds": [ + { + "name": "block/azalea_leaves/break1", + "volume": 0.85 + }, + { + "name": "block/azalea_leaves/break1", + "pitch": 0.92, + "volume": 0.85 + }, + { + "name": "block/azalea_leaves/break2", + "volume": 0.85 + }, + { + "name": "block/azalea_leaves/break2", + "pitch": 0.92, + "volume": 0.85 + }, + { + "name": "block/azalea_leaves/break3", + "volume": 0.85 + }, + { + "name": "block/azalea_leaves/break3", + "pitch": 0.92, + "volume": 0.85 + }, + { + "name": "block/azalea_leaves/break4", + "volume": 0.85 + }, + { + "name": "block/azalea_leaves/break4", + "pitch": 0.92, + "volume": 0.85 + }, + { + "name": "block/azalea_leaves/break5", + "volume": 0.85 + }, + { + "name": "block/azalea_leaves/break5", + "pitch": 0.92, + "volume": 0.85 + }, + { + "name": "block/azalea_leaves/break6", + "volume": 0.85 + }, + { + "name": "block/azalea_leaves/break6", + "pitch": 0.92, + "volume": 0.85 + }, + { + "name": "block/azalea_leaves/break7", + "volume": 0.85 + }, + { + "name": "block/azalea_leaves/break7", + "pitch": 0.92, + "volume": 0.85 + } + ], + "subtitle": "subtitles.block.generic.place" + }, + "block.azalea_leaves.step": { + "sounds": [ + { + "name": "block/azalea_leaves/step1", + "volume": 0.85 + }, + { + "name": "block/azalea_leaves/step2", + "volume": 0.85 + }, + { + "name": "block/azalea_leaves/step3", + "volume": 0.85 + }, + { + "name": "block/azalea_leaves/step4", + "volume": 0.85 + }, + { + "name": "block/azalea_leaves/step5", + "volume": 0.85 + } + ], + "subtitle": "subtitles.block.generic.footsteps" + }, + "block.bamboo.break": { + "sounds": [ + { + "name": "block/bamboo/place1", + "volume": 0.8 + }, + { + "name": "block/bamboo/place2", + "volume": 0.8 + }, + { + "name": "block/bamboo/place3", + "volume": 0.8 + }, + { + "name": "block/bamboo/place4", + "volume": 0.8 + }, + { + "name": "block/bamboo/place5", + "volume": 0.8 + }, + { + "name": "block/bamboo/place6", + "volume": 0.8 + } + ], + "subtitle": "subtitles.block.generic.break" + }, + "block.bamboo.fall": { + "sounds": [ + "block/bamboo/step1", + "block/bamboo/step2", + "block/bamboo/step3", + "block/bamboo/step4", + "block/bamboo/step5", + "block/bamboo/step6" + ], + "subtitle": "subtitles.block.generic.fall" + }, + "block.bamboo.hit": { + "sounds": [ + "block/bamboo/step1", + "block/bamboo/step2", + "block/bamboo/step3", + "block/bamboo/step4", + "block/bamboo/step5", + "block/bamboo/step6" + ], + "subtitle": "subtitles.block.generic.hit" + }, + "block.bamboo.place": { + "sounds": [ + { + "name": "block/bamboo/place1", + "volume": 0.8 + }, + { + "name": "block/bamboo/place2", + "volume": 0.8 + }, + { + "name": "block/bamboo/place3", + "volume": 0.8 + }, + { + "name": "block/bamboo/place4", + "volume": 0.8 + }, + { + "name": "block/bamboo/place5", + "volume": 0.8 + }, + { + "name": "block/bamboo/place6", + "volume": 0.8 + } + ], + "subtitle": "subtitles.block.generic.place" + }, + "block.bamboo.step": { + "sounds": [ + "block/bamboo/step1", + { + "name": "block/bamboo/step2", + "pitch": 0.7 + }, + "block/bamboo/step3", + { + "name": "block/bamboo/step4", + "pitch": 0.7 + }, + "block/bamboo/step5", + "block/bamboo/step6" + ], + "subtitle": "subtitles.block.generic.footsteps" + }, + "block.bamboo_sapling.break": { + "sounds": [ + { + "name": "block/bamboo/sapling_place1", + "volume": 0.9 + }, + { + "name": "block/bamboo/sapling_place2", + "volume": 0.9 + }, + { + "name": "block/bamboo/sapling_place3", + "volume": 0.9 + }, + { + "name": "block/bamboo/sapling_place4", + "volume": 0.9 + }, + { + "name": "block/bamboo/sapling_place5", + "volume": 0.9 + }, + { + "name": "block/bamboo/sapling_place6", + "volume": 0.9 + } + ], + "subtitle": "subtitles.block.generic.break" + }, + "block.bamboo_sapling.hit": { + "sounds": [ + { + "name": "block/bamboo/sapling_hit1", + "volume": 0.8 + }, + { + "name": "block/bamboo/sapling_hit2", + "volume": 0.8 + }, + { + "name": "block/bamboo/sapling_hit3", + "volume": 0.8 + }, + { + "name": "block/bamboo/sapling_hit4", + "volume": 0.8 + }, + { + "name": "block/bamboo/sapling_hit5", + "volume": 0.8 + } + ], + "subtitle": "subtitles.block.generic.hit" + }, + "block.bamboo_sapling.place": { + "sounds": [ + { + "name": "block/bamboo/sapling_place1", + "volume": 0.85 + }, + { + "name": "block/bamboo/sapling_place2", + "volume": 0.85 + }, + { + "name": "block/bamboo/sapling_place3", + "volume": 0.85 + }, + { + "name": "block/bamboo/sapling_place4", + "volume": 0.85 + }, + { + "name": "block/bamboo/sapling_place5", + "volume": 0.85 + }, + { + "name": "block/bamboo/sapling_place6", + "volume": 0.85 + } + ], + "subtitle": "subtitles.block.generic.place" + }, + "block.bamboo_wood.break": { + "sounds": [ + { + "name": "block/bamboo_wood/break1", + "volume": 0.9 + }, + { + "name": "block/bamboo_wood/break2", + "volume": 0.9 + }, + { + "name": "block/bamboo_wood/break3", + "volume": 0.9 + }, + { + "name": "block/bamboo_wood/break4", + "volume": 0.9 + }, + { + "name": "block/bamboo_wood/break5", + "volume": 0.9 + } + ], + "subtitle": "subtitles.block.generic.break" + }, + "block.bamboo_wood.fall": { + "sounds": [ + "block/bamboo_wood/step1", + "block/bamboo_wood/step2", + "block/bamboo_wood/step3", + "block/bamboo_wood/step4", + "block/bamboo_wood/step5", + "block/bamboo_wood/step6" + ], + "subtitle": "subtitles.block.generic.fall" + }, + "block.bamboo_wood.hit": { + "sounds": [ + { + "name": "block/bamboo_wood/step1", + "volume": 0.9 + }, + { + "name": "block/bamboo_wood/step2", + "volume": 0.9 + }, + { + "name": "block/bamboo_wood/step3", + "volume": 0.9 + }, + { + "name": "block/bamboo_wood/step4", + "volume": 0.9 + }, + { + "name": "block/bamboo_wood/step5", + "volume": 0.9 + }, + { + "name": "block/bamboo_wood/step6", + "volume": 0.9 + } + ], + "subtitle": "subtitles.block.generic.hit" + }, + "block.bamboo_wood.place": { + "sounds": [ + { + "name": "block/bamboo_wood/break1", + "volume": 0.9 + }, + { + "name": "block/bamboo_wood/break2", + "volume": 0.9 + }, + { + "name": "block/bamboo_wood/break3", + "volume": 0.9 + }, + { + "name": "block/bamboo_wood/break4", + "volume": 0.9 + }, + { + "name": "block/bamboo_wood/break5", + "volume": 0.9 + } + ], + "subtitle": "subtitles.block.generic.place" + }, + "block.bamboo_wood.step": { + "sounds": [ + "block/bamboo_wood/step1", + "block/bamboo_wood/step2", + "block/bamboo_wood/step3", + "block/bamboo_wood/step4", + "block/bamboo_wood/step5", + "block/bamboo_wood/step6" + ], + "subtitle": "subtitles.block.generic.footsteps" + }, + "block.bamboo_wood_button.click_off": { + "sounds": [ + { + "name": "block/bamboo_wood_button/bamboo_wood_button", + "pitch": 0.5, + "volume": 0.3 + } + ], + "subtitle": "subtitles.block.button.click" + }, + "block.bamboo_wood_button.click_on": { + "sounds": [ + { + "name": "block/bamboo_wood_button/bamboo_wood_button", + "pitch": 0.6, + "volume": 0.3 + } + ], + "subtitle": "subtitles.block.button.click" + }, + "block.bamboo_wood_door.close": { + "sounds": [ + { + "name": "block/bamboo_wood_door/toggle1", + "volume": 0.9 + }, + { + "name": "block/bamboo_wood_door/toggle2", + "volume": 0.9 + }, + { + "name": "block/bamboo_wood_door/toggle3", + "volume": 0.9 + }, + { + "name": "block/bamboo_wood_door/toggle4", + "volume": 0.9 + } + ], + "subtitle": "subtitles.block.door.toggle" + }, + "block.bamboo_wood_door.open": { + "sounds": [ + { + "name": "block/bamboo_wood_door/toggle1", + "volume": 0.9 + }, + { + "name": "block/bamboo_wood_door/toggle2", + "volume": 0.9 + }, + { + "name": "block/bamboo_wood_door/toggle3", + "volume": 0.9 + }, + { + "name": "block/bamboo_wood_door/toggle4", + "volume": 0.9 + } + ], + "subtitle": "subtitles.block.door.toggle" + }, + "block.bamboo_wood_fence_gate.close": { + "sounds": [ + { + "name": "block/bamboo_wood_fence/toggle1", + "pitch": 1.1, + "volume": 0.9 + }, + { + "name": "block/bamboo_wood_fence/toggle2", + "pitch": 1.1, + "volume": 0.9 + }, + { + "name": "block/bamboo_wood_fence/toggle3", + "pitch": 1.1, + "volume": 0.9 + }, + { + "name": "block/bamboo_wood_fence/toggle4", + "pitch": 1.1, + "volume": 0.9 + } + ], + "subtitle": "subtitles.block.fence_gate.toggle" + }, + "block.bamboo_wood_fence_gate.open": { + "sounds": [ + { + "name": "block/bamboo_wood_fence/toggle1", + "pitch": 1.1, + "volume": 0.9 + }, + { + "name": "block/bamboo_wood_fence/toggle2", + "pitch": 1.1, + "volume": 0.9 + }, + { + "name": "block/bamboo_wood_fence/toggle3", + "pitch": 1.1, + "volume": 0.9 + }, + { + "name": "block/bamboo_wood_fence/toggle4", + "pitch": 1.1, + "volume": 0.9 + } + ], + "subtitle": "subtitles.block.fence_gate.toggle" + }, + "block.bamboo_wood_hanging_sign.break": { + "sounds": [ + { + "name": "block/bamboo_wood_hanging_sign/break1", + "volume": 0.8 + }, + { + "name": "block/bamboo_wood_hanging_sign/break2", + "volume": 0.8 + }, + { + "name": "block/bamboo_wood_hanging_sign/break3", + "volume": 0.8 + }, + { + "name": "block/bamboo_wood_hanging_sign/break4", + "volume": 0.8 + } + ], + "subtitle": "subtitles.block.generic.break" + }, + "block.bamboo_wood_hanging_sign.fall": { + "sounds": [ + "block/bamboo_wood_hanging_sign/step1", + "block/bamboo_wood_hanging_sign/step2", + "block/bamboo_wood_hanging_sign/step3", + "block/bamboo_wood_hanging_sign/step4" + ], + "subtitle": "subtitles.block.generic.fall" + }, + "block.bamboo_wood_hanging_sign.hit": { + "sounds": [ + { + "name": "block/bamboo_wood_hanging_sign/step1", + "pitch": 1.1, + "volume": 0.7 + }, + { + "name": "block/bamboo_wood_hanging_sign/step2", + "pitch": 1.1, + "volume": 0.7 + }, + { + "name": "block/bamboo_wood_hanging_sign/step3", + "pitch": 1.1, + "volume": 0.7 + }, + { + "name": "block/bamboo_wood_hanging_sign/step4", + "pitch": 1.1, + "volume": 0.7 + } + ], + "subtitle": "subtitles.block.generic.hit" + }, + "block.bamboo_wood_hanging_sign.place": { + "sounds": [ + { + "name": "block/bamboo_wood_hanging_sign/break1", + "volume": 0.8 + }, + { + "name": "block/bamboo_wood_hanging_sign/break2", + "volume": 0.8 + }, + { + "name": "block/bamboo_wood_hanging_sign/break3", + "volume": 0.8 + }, + { + "name": "block/bamboo_wood_hanging_sign/break4", + "volume": 0.8 + } + ], + "subtitle": "subtitles.block.generic.place" + }, + "block.bamboo_wood_hanging_sign.step": { + "sounds": [ + "block/bamboo_wood_hanging_sign/step1", + "block/bamboo_wood_hanging_sign/step2", + "block/bamboo_wood_hanging_sign/step3", + "block/bamboo_wood_hanging_sign/step4" + ], + "subtitle": "subtitles.block.generic.footsteps" + }, + "block.bamboo_wood_pressure_plate.click_off": { + "sounds": [ + { + "name": "random/click", + "pitch": 0.7, + "volume": 0.3 + } + ], + "subtitle": "subtitles.block.pressure_plate.click" + }, + "block.bamboo_wood_pressure_plate.click_on": { + "sounds": [ + { + "name": "random/click", + "pitch": 0.8, + "volume": 0.3 + } + ], + "subtitle": "subtitles.block.pressure_plate.click" + }, + "block.bamboo_wood_trapdoor.close": { + "sounds": [ + "block/bamboo_wood_trapdoor/toggle1", + "block/bamboo_wood_trapdoor/toggle2", + "block/bamboo_wood_trapdoor/toggle3", + "block/bamboo_wood_trapdoor/toggle4" + ], + "subtitle": "subtitles.block.trapdoor.toggle" + }, + "block.bamboo_wood_trapdoor.open": { + "sounds": [ + "block/bamboo_wood_trapdoor/toggle1", + "block/bamboo_wood_trapdoor/toggle2", + "block/bamboo_wood_trapdoor/toggle3", + "block/bamboo_wood_trapdoor/toggle4" + ], + "subtitle": "subtitles.block.trapdoor.toggle" + }, + "block.barrel.close": { + "sounds": [ + "block/barrel/close" + ], + "subtitle": "subtitles.block.barrel.close" + }, + "block.barrel.open": { + "sounds": [ + "block/barrel/open1", + "block/barrel/open2" + ], + "subtitle": "subtitles.block.barrel.open" + }, + "block.basalt.break": { + "sounds": [ + "block/basalt/break1", + "block/basalt/break2", + "block/basalt/break3", + "block/basalt/break4", + "block/basalt/break5" + ], + "subtitle": "subtitles.block.generic.break" + }, + "block.basalt.fall": { + "sounds": [ + "block/basalt/step1", + "block/basalt/step2", + "block/basalt/step3", + "block/basalt/step4", + "block/basalt/step5", + "block/basalt/step6" + ], + "subtitle": "subtitles.block.generic.fall" + }, + "block.basalt.hit": { + "sounds": [ + "block/basalt/step1", + "block/basalt/step2", + "block/basalt/step3", + "block/basalt/step4", + "block/basalt/step5", + "block/basalt/step6" + ], + "subtitle": "subtitles.block.generic.hit" + }, + "block.basalt.place": { + "sounds": [ + "block/basalt/break1", + "block/basalt/break2", + "block/basalt/break3", + "block/basalt/break4", + "block/basalt/break5" + ], + "subtitle": "subtitles.block.generic.place" + }, + "block.basalt.step": { + "sounds": [ + "block/basalt/step1", + "block/basalt/step2", + "block/basalt/step3", + "block/basalt/step4", + "block/basalt/step5", + "block/basalt/step6" + ], + "subtitle": "subtitles.block.generic.footsteps" + }, + "block.beacon.activate": { + "sounds": [ + "block/beacon/activate" + ], + "subtitle": "subtitles.block.beacon.activate" + }, + "block.beacon.ambient": { + "sounds": [ + { + "attenuation_distance": 7, + "name": "block/beacon/ambient", + "volume": 0.9 + } + ], + "subtitle": "subtitles.block.beacon.ambient" + }, + "block.beacon.deactivate": { + "sounds": [ + "block/beacon/deactivate" + ], + "subtitle": "subtitles.block.beacon.deactivate" + }, + "block.beacon.power_select": { + "sounds": [ + "block/beacon/power1", + "block/beacon/power2", + "block/beacon/power3" + ], + "subtitle": "subtitles.block.beacon.power_select" + }, + "block.beehive.drip": { + "sounds": [ + { + "attenuation_distance": 8, + "name": "block/beehive/drip1", + "pitch": 0.7, + "volume": 0.3 + }, + { + "attenuation_distance": 8, + "name": "block/beehive/drip1", + "pitch": 0.9, + "volume": 0.3 + }, + { + "attenuation_distance": 8, + "name": "block/beehive/drip2", + "pitch": 0.7, + "volume": 0.3 + }, + { + "attenuation_distance": 8, + "name": "block/beehive/drip2", + "pitch": 0.9, + "volume": 0.3 + }, + { + "attenuation_distance": 8, + "name": "block/beehive/drip3", + "pitch": 0.7, + "volume": 0.3 + }, + { + "attenuation_distance": 8, + "name": "block/beehive/drip3", + "pitch": 0.9, + "volume": 0.3 + }, + { + "attenuation_distance": 8, + "name": "block/beehive/drip4", + "pitch": 0.7, + "volume": 0.3 + }, + { + "attenuation_distance": 8, + "name": "block/beehive/drip4", + "pitch": 0.9, + "volume": 0.3 + }, + { + "attenuation_distance": 8, + "name": "block/beehive/drip5", + "pitch": 0.7, + "volume": 0.3 + }, + { + "attenuation_distance": 8, + "name": "block/beehive/drip5", + "pitch": 0.9, + "volume": 0.3 + }, + { + "attenuation_distance": 8, + "name": "block/beehive/drip6", + "pitch": 0.7, + "volume": 0.3 + }, + { + "attenuation_distance": 8, + "name": "block/beehive/drip6", + "pitch": 0.9, + "volume": 0.3 + } + ], + "subtitle": "subtitles.block.beehive.drip" + }, + "block.beehive.enter": { + "sounds": [ + { + "attenuation_distance": 14, + "name": "block/beehive/enter", + "pitch": 0.7 + }, + { + "attenuation_distance": 14, + "name": "block/beehive/enter", + "pitch": 0.8 + } + ], + "subtitle": "subtitles.block.beehive.enter" + }, + "block.beehive.exit": { + "sounds": [ + { + "attenuation_distance": 14, + "name": "block/beehive/exit" + }, + { + "attenuation_distance": 14, + "name": "block/beehive/exit", + "pitch": 0.9 + }, + { + "attenuation_distance": 14, + "name": "block/beehive/exit", + "pitch": 1.1 + } + ], + "subtitle": "subtitles.block.beehive.exit" + }, + "block.beehive.shear": { + "sounds": [ + { + "name": "block/beehive/shear", + "volume": 0.8 + }, + { + "name": "block/beehive/shear", + "pitch": 0.8, + "volume": 0.8 + }, + { + "name": "block/beehive/shear", + "pitch": 0.9, + "volume": 0.8 + } + ], + "subtitle": "subtitles.block.beehive.shear" + }, + "block.beehive.work": { + "sounds": [ + { + "attenuation_distance": 12, + "name": "block/beehive/work1", + "volume": 0.6 + }, + { + "attenuation_distance": 12, + "name": "block/beehive/work2", + "volume": 0.6 + }, + { + "attenuation_distance": 12, + "name": "block/beehive/work3", + "volume": 0.6 + }, + { + "attenuation_distance": 12, + "name": "block/beehive/work4", + "volume": 0.6 + } + ], + "subtitle": "subtitles.block.beehive.work" + }, + "block.bell.resonate": { + "sounds": [ + "block/bell/resonate", + { + "name": "block/bell/resonate", + "pitch": 0.85 + }, + { + "name": "block/bell/resonate", + "pitch": 0.9 + } + ], + "subtitle": "subtitles.block.bell.resonate" + }, + "block.bell.use": { + "sounds": [ + { + "name": "block/bell/bell_use01", + "pitch": 0.93, + "volume": 12.0 + }, + { + "name": "block/bell/bell_use01", + "pitch": 0.95, + "volume": 12.0 + }, + { + "name": "block/bell/bell_use01", + "pitch": 0.97, + "volume": 12.0 + }, + { + "name": "block/bell/bell_use02", + "pitch": 0.93, + "volume": 12.0 + }, + { + "name": "block/bell/bell_use02", + "pitch": 0.95, + "volume": 12.0 + }, + { + "name": "block/bell/bell_use02", + "pitch": 0.97, + "volume": 12.0 + } + ], + "subtitle": "subtitles.block.bell.use" + }, + "block.big_dripleaf.break": { + "sounds": [ + "block/big_dripleaf/break1", + "block/big_dripleaf/break2", + "block/big_dripleaf/break3", + "block/big_dripleaf/break4", + "block/big_dripleaf/break5", + "block/big_dripleaf/break6" + ], + "subtitle": "subtitles.block.generic.break" + }, + "block.big_dripleaf.fall": { + "sounds": [ + "block/big_dripleaf/step1", + "block/big_dripleaf/step2", + "block/big_dripleaf/step3", + "block/big_dripleaf/step4", + "block/big_dripleaf/step5", + "block/big_dripleaf/step6" + ], + "subtitle": "subtitles.block.generic.fall" + }, + "block.big_dripleaf.hit": { + "sounds": [ + "block/big_dripleaf/step1", + "block/big_dripleaf/step2", + "block/big_dripleaf/step3", + "block/big_dripleaf/step4", + "block/big_dripleaf/step5", + "block/big_dripleaf/step6" + ], + "subtitle": "subtitles.block.generic.hit" + }, + "block.big_dripleaf.place": { + "sounds": [ + "block/big_dripleaf/break1", + "block/big_dripleaf/break2", + "block/big_dripleaf/break3", + "block/big_dripleaf/break4", + "block/big_dripleaf/break5", + "block/big_dripleaf/break6" + ], + "subtitle": "subtitles.block.generic.place" + }, + "block.big_dripleaf.step": { + "sounds": [ + "block/big_dripleaf/step1", + "block/big_dripleaf/step2", + "block/big_dripleaf/step3", + "block/big_dripleaf/step4", + "block/big_dripleaf/step5", + "block/big_dripleaf/step6" + ], + "subtitle": "subtitles.block.generic.footsteps" + }, + "block.big_dripleaf.tilt_down": { + "sounds": [ + "block/big_dripleaf/tilt_down1", + "block/big_dripleaf/tilt_down2", + "block/big_dripleaf/tilt_down3", + "block/big_dripleaf/tilt_down4", + "block/big_dripleaf/tilt_down5" + ], + "subtitle": "subtitles.block.big_dripleaf.tilt_down" + }, + "block.big_dripleaf.tilt_up": { + "sounds": [ + "block/big_dripleaf/tilt_up1", + "block/big_dripleaf/tilt_up2", + "block/big_dripleaf/tilt_up3", + "block/big_dripleaf/tilt_up4" + ], + "subtitle": "subtitles.block.big_dripleaf.tilt_up" + }, + "block.blastfurnace.fire_crackle": { + "sounds": [ + "block/blastfurnace/blastfurnace1", + "block/blastfurnace/blastfurnace2", + "block/blastfurnace/blastfurnace3", + "block/blastfurnace/blastfurnace4", + "block/blastfurnace/blastfurnace5" + ], + "subtitle": "subtitles.block.blastfurnace.fire_crackle" + }, + "block.bone_block.break": { + "sounds": [ + { + "name": "block/bone_block/break1", + "volume": 0.9 + }, + { + "name": "block/bone_block/break2", + "volume": 0.9 + }, + { + "name": "block/bone_block/break3", + "volume": 0.9 + }, + { + "name": "block/bone_block/break4", + "volume": 0.9 + }, + { + "name": "block/bone_block/break5", + "volume": 0.9 + } + ], + "subtitle": "subtitles.block.generic.break" + }, + "block.bone_block.fall": { + "sounds": [ + "block/bone_block/step1", + "block/bone_block/step2", + "block/bone_block/step3", + "block/bone_block/step4", + "block/bone_block/step5" + ], + "subtitle": "subtitles.block.generic.fall" + }, + "block.bone_block.hit": { + "sounds": [ + "block/bone_block/step1", + "block/bone_block/step2", + "block/bone_block/step3", + "block/bone_block/step4", + "block/bone_block/step5" + ], + "subtitle": "subtitles.block.generic.hit" + }, + "block.bone_block.place": { + "sounds": [ + { + "name": "block/bone_block/break1", + "volume": 0.9 + }, + { + "name": "block/bone_block/break2", + "volume": 0.9 + }, + { + "name": "block/bone_block/break3", + "volume": 0.9 + }, + { + "name": "block/bone_block/break4", + "volume": 0.9 + }, + { + "name": "block/bone_block/break5", + "volume": 0.9 + } + ], + "subtitle": "subtitles.block.generic.place" + }, + "block.bone_block.step": { + "sounds": [ + "block/bone_block/step1", + "block/bone_block/step2", + "block/bone_block/step3", + "block/bone_block/step4", + "block/bone_block/step5" + ], + "subtitle": "subtitles.block.generic.footsteps" + }, + "block.brewing_stand.brew": { + "sounds": [ + "block/brewing_stand/brew1", + "block/brewing_stand/brew2" + ], + "subtitle": "subtitles.block.brewing_stand.brew" + }, + "block.bubble_column.bubble_pop": { + "sounds": [ + { + "name": "block/bubble_column/bubble1", + "volume": 0.1 + }, + { + "name": "block/bubble_column/bubble2", + "volume": 0.1 + }, + { + "name": "block/bubble_column/bubble3", + "volume": 0.1 + } + ], + "subtitle": "subtitles.block.bubble_column.bubble_pop" + }, + "block.bubble_column.upwards_ambient": { + "sounds": [ + { + "name": "block/bubble_column/upwards_ambient1", + "volume": 0.6 + }, + { + "name": "block/bubble_column/upwards_ambient2", + "volume": 0.6 + }, + { + "name": "block/bubble_column/upwards_ambient3", + "volume": 0.6 + }, + { + "name": "block/bubble_column/upwards_ambient4", + "volume": 0.6 + }, + { + "name": "block/bubble_column/upwards_ambient5", + "volume": 0.6 + } + ], + "subtitle": "subtitles.block.bubble_column.upwards_ambient" + }, + "block.bubble_column.upwards_inside": { + "sounds": [ + { + "name": "block/bubble_column/upwards_inside", + "volume": 0.7 + } + ], + "subtitle": "subtitles.block.bubble_column.upwards_inside" + }, + "block.bubble_column.whirlpool_ambient": { + "sounds": [ + { + "name": "block/bubble_column/whirlpool_ambient1", + "volume": 0.6 + }, + { + "name": "block/bubble_column/whirlpool_ambient2", + "volume": 0.6 + }, + { + "name": "block/bubble_column/whirlpool_ambient3", + "volume": 0.6 + }, + { + "name": "block/bubble_column/whirlpool_ambient4", + "volume": 0.6 + }, + { + "name": "block/bubble_column/whirlpool_ambient5", + "volume": 0.6 + } + ], + "subtitle": "subtitles.block.bubble_column.whirlpool_ambient" + }, + "block.bubble_column.whirlpool_inside": { + "sounds": [ + { + "name": "block/bubble_column/whirlpool_inside", + "volume": 0.7 + } + ], + "subtitle": "subtitles.block.bubble_column.whirlpool_inside" + }, + "block.cake.add_candle": { + "sounds": [ + "block/cake/add_candle1", + "block/cake/add_candle2", + "block/cake/add_candle3" + ], + "subtitle": "subtitles.block.cake.add_candle" + }, + "block.calcite.break": { + "sounds": [ + { + "name": "block/calcite/break1", + "volume": 0.9 + }, + { + "name": "block/calcite/break2", + "volume": 0.9 + }, + { + "name": "block/calcite/break3", + "volume": 0.9 + }, + { + "name": "block/calcite/break4", + "volume": 0.9 + } + ], + "subtitle": "subtitles.block.generic.break" + }, + "block.calcite.fall": { + "sounds": [ + "block/calcite/step1", + "block/calcite/step2", + "block/calcite/step3", + "block/calcite/step4", + "block/calcite/step5", + "block/calcite/step6" + ], + "subtitle": "subtitles.block.generic.fall" + }, + "block.calcite.hit": { + "sounds": [ + "block/calcite/step1", + "block/calcite/step2", + "block/calcite/step3", + "block/calcite/step4", + "block/calcite/step5", + "block/calcite/step6" + ], + "subtitle": "subtitles.block.generic.hit" + }, + "block.calcite.place": { + "sounds": [ + { + "name": "block/calcite/place1", + "volume": 0.94 + }, + { + "name": "block/calcite/place2", + "volume": 0.94 + }, + { + "name": "block/calcite/place3", + "volume": 0.94 + }, + { + "name": "block/calcite/place4", + "volume": 0.94 + } + ], + "subtitle": "subtitles.block.generic.place" + }, + "block.calcite.step": { + "sounds": [ + "block/calcite/step1", + "block/calcite/step2", + "block/calcite/step3", + "block/calcite/step4", + "block/calcite/step5", + "block/calcite/step6" + ], + "subtitle": "subtitles.block.generic.footsteps" + }, + "block.campfire.crackle": { + "sounds": [ + "block/campfire/crackle1", + "block/campfire/crackle2", + "block/campfire/crackle3", + "block/campfire/crackle4", + "block/campfire/crackle5", + "block/campfire/crackle6" + ], + "subtitle": "subtitles.block.campfire.crackle" + }, + "block.candle.ambient": { + "sounds": [ + { + "attenuation_distance": 3, + "name": "block/candle/ambient1" + }, + { + "attenuation_distance": 3, + "name": "block/candle/ambient1", + "pitch": 0.8, + "volume": 0.7 + }, + { + "attenuation_distance": 3, + "name": "block/candle/ambient1", + "pitch": 0.9, + "volume": 0.8 + }, + { + "attenuation_distance": 3, + "name": "block/candle/ambient2" + }, + { + "attenuation_distance": 3, + "name": "block/candle/ambient2", + "pitch": 0.8, + "volume": 0.7 + }, + { + "attenuation_distance": 3, + "name": "block/candle/ambient2", + "pitch": 0.9, + "volume": 0.8 + }, + { + "attenuation_distance": 3, + "name": "block/candle/ambient3" + }, + { + "attenuation_distance": 3, + "name": "block/candle/ambient3", + "pitch": 0.8, + "volume": 0.7 + }, + { + "attenuation_distance": 3, + "name": "block/candle/ambient3", + "pitch": 0.9, + "volume": 0.8 + }, + { + "attenuation_distance": 3, + "name": "block/candle/ambient4" + }, + { + "attenuation_distance": 3, + "name": "block/candle/ambient4", + "pitch": 0.8, + "volume": 0.7 + }, + { + "attenuation_distance": 3, + "name": "block/candle/ambient4", + "pitch": 0.9, + "volume": 0.8 + }, + { + "attenuation_distance": 3, + "name": "block/candle/ambient5" + }, + { + "attenuation_distance": 3, + "name": "block/candle/ambient5", + "pitch": 0.8, + "volume": 0.7 + }, + { + "attenuation_distance": 3, + "name": "block/candle/ambient5", + "pitch": 0.9, + "volume": 0.8 + }, + { + "attenuation_distance": 3, + "name": "block/candle/ambient6" + }, + { + "attenuation_distance": 3, + "name": "block/candle/ambient6", + "pitch": 0.8, + "volume": 0.7 + }, + { + "attenuation_distance": 3, + "name": "block/candle/ambient6", + "pitch": 0.9, + "volume": 0.8 + }, + { + "attenuation_distance": 3, + "name": "block/candle/ambient7" + }, + { + "attenuation_distance": 3, + "name": "block/candle/ambient7", + "pitch": 0.8, + "volume": 0.7 + }, + { + "attenuation_distance": 3, + "name": "block/candle/ambient7", + "pitch": 0.9, + "volume": 0.8 + }, + { + "attenuation_distance": 3, + "name": "block/candle/ambient8" + }, + { + "attenuation_distance": 3, + "name": "block/candle/ambient8", + "pitch": 0.8, + "volume": 0.7 + }, + { + "attenuation_distance": 3, + "name": "block/candle/ambient8", + "pitch": 0.9, + "volume": 0.8 + }, + { + "attenuation_distance": 3, + "name": "block/candle/ambient9" + }, + { + "attenuation_distance": 3, + "name": "block/candle/ambient9", + "pitch": 0.8, + "volume": 0.7 + }, + { + "attenuation_distance": 3, + "name": "block/candle/ambient9", + "pitch": 0.9, + "volume": 0.8 + } + ], + "subtitle": "subtitles.block.candle.crackle" + }, + "block.candle.break": { + "sounds": [ + "block/candle/break1", + "block/candle/break2", + "block/candle/break3", + "block/candle/break4", + "block/candle/break5" + ], + "subtitle": "subtitles.block.generic.break" + }, + "block.candle.extinguish": { + "sounds": [ + { + "attenuation_distance": 8, + "name": "block/candle/extinguish1" + }, + { + "attenuation_distance": 8, + "name": "block/candle/extinguish1", + "volume": 0.9 + }, + { + "attenuation_distance": 8, + "name": "block/candle/extinguish1", + "pitch": 0.9 + }, + { + "attenuation_distance": 8, + "name": "block/candle/extinguish1", + "pitch": 0.9, + "volume": 0.9 + }, + { + "attenuation_distance": 8, + "name": "block/candle/extinguish1", + "pitch": 1.1 + }, + { + "attenuation_distance": 8, + "name": "block/candle/extinguish1", + "pitch": 1.1, + "volume": 0.9 + }, + { + "attenuation_distance": 8, + "name": "block/candle/extinguish2" + }, + { + "attenuation_distance": 8, + "name": "block/candle/extinguish2", + "volume": 0.9 + }, + { + "attenuation_distance": 8, + "name": "block/candle/extinguish2", + "pitch": 0.9 + }, + { + "attenuation_distance": 8, + "name": "block/candle/extinguish2", + "pitch": 0.9, + "volume": 0.9 + }, + { + "attenuation_distance": 8, + "name": "block/candle/extinguish2", + "pitch": 1.1 + }, + { + "attenuation_distance": 8, + "name": "block/candle/extinguish2", + "pitch": 1.1, + "volume": 0.9 + }, + { + "attenuation_distance": 8, + "name": "block/candle/extinguish3" + }, + { + "attenuation_distance": 8, + "name": "block/candle/extinguish3", + "volume": 0.9 + }, + { + "attenuation_distance": 8, + "name": "block/candle/extinguish3", + "pitch": 0.9 + }, + { + "attenuation_distance": 8, + "name": "block/candle/extinguish3", + "pitch": 0.9, + "volume": 0.9 + }, + { + "attenuation_distance": 8, + "name": "block/candle/extinguish3", + "pitch": 1.1 + }, + { + "attenuation_distance": 8, + "name": "block/candle/extinguish3", + "pitch": 1.1, + "volume": 0.9 + } + ], + "subtitle": "subtitles.block.candle.extinguish" + }, + "block.candle.fall": { + "sounds": [ + "block/candle/step1", + "block/candle/step2", + "block/candle/step3", + "block/candle/step4", + "block/candle/step5" + ], + "subtitle": "subtitles.block.generic.fall" + }, + "block.candle.hit": { + "sounds": [ + "block/candle/step1", + "block/candle/step2", + "block/candle/step3", + "block/candle/step4", + "block/candle/step5" + ], + "subtitle": "subtitles.block.generic.hit" + }, + "block.candle.place": { + "sounds": [ + "block/candle/break1", + "block/candle/break2", + "block/candle/break3", + "block/candle/break4", + "block/candle/break5" + ], + "subtitle": "subtitles.block.generic.place" + }, + "block.candle.step": { + "sounds": [ + "block/candle/step1", + "block/candle/step2", + "block/candle/step3", + "block/candle/step4", + "block/candle/step5" + ], + "subtitle": "subtitles.block.generic.footsteps" + }, + "block.cave_vines.break": { + "sounds": [ + "block/cave_vines/break1", + "block/cave_vines/break2", + "block/cave_vines/break3", + "block/cave_vines/break4", + "block/cave_vines/break5" + ], + "subtitle": "subtitles.block.generic.break" + }, + "block.cave_vines.fall": { + "sounds": [ + "block/vine/climb1", + "block/vine/climb2", + "block/vine/climb3", + "block/vine/climb4", + "block/vine/climb5" + ], + "subtitle": "subtitles.block.generic.fall" + }, + "block.cave_vines.hit": { + "sounds": [ + "block/vine/climb1", + "block/vine/climb2", + "block/vine/climb3", + "block/vine/climb4", + "block/vine/climb5" + ], + "subtitle": "subtitles.block.generic.hit" + }, + "block.cave_vines.pick_berries": { + "sounds": [ + { + "name": "block.sweet_berry_bush.pick_berries", + "type": "event" + } + ], + "subtitle": "subtitles.block.sweet_berry_bush.pick_berries" + }, + "block.cave_vines.place": { + "sounds": [ + "block/cave_vines/break1", + "block/cave_vines/break2", + "block/cave_vines/break3", + "block/cave_vines/break4", + "block/cave_vines/break5" + ], + "subtitle": "subtitles.block.generic.place" + }, + "block.cave_vines.step": { + "sounds": [ + "block/vine/climb1", + "block/vine/climb2", + "block/vine/climb3", + "block/vine/climb4", + "block/vine/climb5" + ], + "subtitle": "subtitles.block.generic.footsteps" + }, + "block.chain.break": { + "sounds": [ + { + "name": "block/chain/break1", + "volume": 0.5 + }, + { + "name": "block/chain/break2", + "volume": 0.5 + }, + { + "name": "block/chain/break3", + "volume": 0.5 + }, + { + "name": "block/chain/break4", + "volume": 0.5 + } + ], + "subtitle": "subtitles.block.generic.break" + }, + "block.chain.fall": { + "sounds": [ + "block/chain/step1", + "block/chain/step2", + "block/chain/step3", + "block/chain/step4", + "block/chain/step5", + "block/chain/step6" + ], + "subtitle": "subtitles.block.generic.fall" + }, + "block.chain.hit": { + "sounds": [ + { + "name": "block/chain/step1", + "volume": 0.8 + }, + { + "name": "block/chain/step2", + "volume": 0.8 + }, + { + "name": "block/chain/step3", + "volume": 0.8 + }, + { + "name": "block/chain/step4", + "volume": 0.8 + }, + { + "name": "block/chain/step5", + "volume": 0.8 + }, + { + "name": "block/chain/step6", + "volume": 0.8 + } + ], + "subtitle": "subtitles.block.generic.hit" + }, + "block.chain.place": { + "sounds": [ + { + "name": "block/chain/break1", + "volume": 0.5 + }, + { + "name": "block/chain/break2", + "volume": 0.5 + }, + { + "name": "block/chain/break3", + "volume": 0.5 + }, + { + "name": "block/chain/break4", + "volume": 0.5 + } + ], + "subtitle": "subtitles.block.generic.place" + }, + "block.chain.step": { + "sounds": [ + "block/chain/step1", + "block/chain/step2", + "block/chain/step3", + "block/chain/step4", + "block/chain/step5", + "block/chain/step6" + ], + "subtitle": "subtitles.block.generic.footsteps" + }, + "block.cherry_leaves.break": { + "sounds": [ + "block/cherry_leaves/break1", + "block/cherry_leaves/break2", + "block/cherry_leaves/break3", + "block/cherry_leaves/break4", + "block/cherry_leaves/break5" + ], + "subtitle": "subtitles.block.generic.break" + }, + "block.cherry_leaves.fall": { + "sounds": [ + "block/cherry_leaves/step1", + "block/cherry_leaves/step2", + "block/cherry_leaves/step3", + "block/cherry_leaves/step4", + "block/cherry_leaves/step5" + ], + "subtitle": "subtitles.block.generic.fall" + }, + "block.cherry_leaves.hit": { + "sounds": [ + { + "name": "block/cherry_leaves/step1", + "volume": 0.8 + }, + { + "name": "block/cherry_leaves/step2", + "volume": 0.8 + }, + { + "name": "block/cherry_leaves/step3", + "volume": 0.8 + }, + { + "name": "block/cherry_leaves/step4", + "volume": 0.8 + }, + { + "name": "block/cherry_leaves/step5", + "volume": 0.8 + } + ], + "subtitle": "subtitles.block.generic.hit" + }, + "block.cherry_leaves.place": { + "sounds": [ + "block/cherry_leaves/break1", + "block/cherry_leaves/break2", + "block/cherry_leaves/break3", + "block/cherry_leaves/break4", + "block/cherry_leaves/break5" + ], + "subtitle": "subtitles.block.generic.place" + }, + "block.cherry_leaves.step": { + "sounds": [ + "block/cherry_leaves/step1", + "block/cherry_leaves/step2", + "block/cherry_leaves/step3", + "block/cherry_leaves/step4", + "block/cherry_leaves/step5" + ], + "subtitle": "subtitles.block.generic.footsteps" + }, + "block.cherry_sapling.break": { + "sounds": [ + "block/bamboo/sapling_place1", + "block/bamboo/sapling_place2", + "block/bamboo/sapling_place3", + "block/bamboo/sapling_place4", + "block/bamboo/sapling_place5", + "block/bamboo/sapling_place6" + ], + "subtitle": "subtitles.block.generic.break" + }, + "block.cherry_sapling.fall": { + "sounds": [ + "block/bamboo/sapling_hit1", + "block/bamboo/sapling_hit2", + "block/bamboo/sapling_hit3", + "block/bamboo/sapling_hit4", + "block/bamboo/sapling_hit5" + ], + "subtitle": "subtitles.block.generic.fall" + }, + "block.cherry_sapling.hit": { + "sounds": [ + "block/bamboo/sapling_hit1", + "block/bamboo/sapling_hit2", + "block/bamboo/sapling_hit3", + "block/bamboo/sapling_hit4", + "block/bamboo/sapling_hit5" + ], + "subtitle": "subtitles.block.generic.hit" + }, + "block.cherry_sapling.place": { + "sounds": [ + "block/bamboo/sapling_place1", + "block/bamboo/sapling_place2", + "block/bamboo/sapling_place3", + "block/bamboo/sapling_place4", + "block/bamboo/sapling_place5", + "block/bamboo/sapling_place6" + ], + "subtitle": "subtitles.block.generic.place" + }, + "block.cherry_sapling.step": { + "sounds": [ + "block/bamboo/sapling_hit1", + "block/bamboo/sapling_hit2", + "block/bamboo/sapling_hit3", + "block/bamboo/sapling_hit4", + "block/bamboo/sapling_hit5" + ], + "subtitle": "subtitles.block.generic.footsteps" + }, + "block.cherry_wood.break": { + "sounds": [ + "block/cherry_wood/break1", + "block/cherry_wood/break2", + "block/cherry_wood/break3", + "block/cherry_wood/break4", + "block/cherry_wood/break5" + ], + "subtitle": "subtitles.block.generic.break" + }, + "block.cherry_wood.fall": { + "sounds": [ + "block/cherry_wood/step1", + "block/cherry_wood/step2", + "block/cherry_wood/step3", + "block/cherry_wood/step4", + "block/cherry_wood/step5", + "block/cherry_wood/step6" + ], + "subtitle": "subtitles.block.generic.fall" + }, + "block.cherry_wood.hit": { + "sounds": [ + "block/cherry_wood/step1", + "block/cherry_wood/step2", + "block/cherry_wood/step3", + "block/cherry_wood/step4", + "block/cherry_wood/step5", + "block/cherry_wood/step6" + ], + "subtitle": "subtitles.block.generic.hit" + }, + "block.cherry_wood.place": { + "sounds": [ + "block/cherry_wood/break1", + "block/cherry_wood/break2", + "block/cherry_wood/break3", + "block/cherry_wood/break4", + "block/cherry_wood/break5" + ], + "subtitle": "subtitles.block.generic.place" + }, + "block.cherry_wood.step": { + "sounds": [ + "block/cherry_wood/step1", + "block/cherry_wood/step2", + "block/cherry_wood/step3", + "block/cherry_wood/step4", + "block/cherry_wood/step5", + "block/cherry_wood/step6" + ], + "subtitle": "subtitles.block.generic.footsteps" + }, + "block.cherry_wood_button.click_off": { + "sounds": [ + { + "name": "block/cherrywood_button/cherrywood_click", + "pitch": 0.5, + "volume": 0.4 + } + ], + "subtitle": "subtitles.block.button.click" + }, + "block.cherry_wood_button.click_on": { + "sounds": [ + { + "name": "block/cherrywood_button/cherrywood_click", + "pitch": 0.6, + "volume": 0.4 + } + ], + "subtitle": "subtitles.block.button.click" + }, + "block.cherry_wood_door.close": { + "sounds": [ + "block/cherrywood_door/toggle1", + "block/cherrywood_door/toggle2", + "block/cherrywood_door/toggle3", + "block/cherrywood_door/toggle4" + ], + "subtitle": "subtitles.block.door.toggle" + }, + "block.cherry_wood_door.open": { + "sounds": [ + "block/cherrywood_door/toggle1", + "block/cherrywood_door/toggle2", + "block/cherrywood_door/toggle3", + "block/cherrywood_door/toggle4" + ], + "subtitle": "subtitles.block.door.toggle" + }, + "block.cherry_wood_fence_gate.close": { + "sounds": [ + "block/cherrywood_fence_gate/toggle1", + "block/cherrywood_fence_gate/toggle2", + "block/cherrywood_fence_gate/toggle3" + ], + "subtitle": "subtitles.block.fence_gate.toggle" + }, + "block.cherry_wood_fence_gate.open": { + "sounds": [ + "block/cherrywood_fence_gate/toggle1", + "block/cherrywood_fence_gate/toggle2", + "block/cherrywood_fence_gate/toggle3" + ], + "subtitle": "subtitles.block.fence_gate.toggle" + }, + "block.cherry_wood_hanging_sign.break": { + "sounds": [ + "block/cherry_wood_hanging_sign/break1", + "block/cherry_wood_hanging_sign/break2", + "block/cherry_wood_hanging_sign/break3", + "block/cherry_wood_hanging_sign/break4" + ], + "subtitle": "subtitles.block.generic.break" + }, + "block.cherry_wood_hanging_sign.fall": { + "sounds": [ + "block/cherry_wood_hanging_sign/step1", + "block/cherry_wood_hanging_sign/step2", + "block/cherry_wood_hanging_sign/step3", + "block/cherry_wood_hanging_sign/step4" + ], + "subtitle": "subtitles.block.generic.fall" + }, + "block.cherry_wood_hanging_sign.hit": { + "sounds": [ + "block/cherry_wood_hanging_sign/step1", + "block/cherry_wood_hanging_sign/step2", + "block/cherry_wood_hanging_sign/step3", + "block/cherry_wood_hanging_sign/step4" + ], + "subtitle": "subtitles.block.generic.hit" + }, + "block.cherry_wood_hanging_sign.place": { + "sounds": [ + "block/cherry_wood_hanging_sign/break1", + "block/cherry_wood_hanging_sign/break2", + "block/cherry_wood_hanging_sign/break3", + "block/cherry_wood_hanging_sign/break4" + ], + "subtitle": "subtitles.block.generic.place" + }, + "block.cherry_wood_hanging_sign.step": { + "sounds": [ + "block/cherry_wood_hanging_sign/step1", + "block/cherry_wood_hanging_sign/step2", + "block/cherry_wood_hanging_sign/step3", + "block/cherry_wood_hanging_sign/step4" + ], + "subtitle": "subtitles.block.generic.footsteps" + }, + "block.cherry_wood_pressure_plate.click_off": { + "sounds": [ + { + "name": "random/click", + "pitch": 0.7, + "volume": 0.3 + } + ], + "subtitle": "subtitles.block.pressure_plate.click" + }, + "block.cherry_wood_pressure_plate.click_on": { + "sounds": [ + { + "name": "random/click", + "pitch": 0.8, + "volume": 0.3 + } + ], + "subtitle": "subtitles.block.pressure_plate.click" + }, + "block.cherry_wood_trapdoor.close": { + "sounds": [ + "block/cherrywood_trapdoor/toggle1", + "block/cherrywood_trapdoor/toggle2", + "block/cherrywood_trapdoor/toggle3" + ], + "subtitle": "subtitles.block.trapdoor.toggle" + }, + "block.cherry_wood_trapdoor.open": { + "sounds": [ + "block/cherrywood_trapdoor/toggle1", + "block/cherrywood_trapdoor/toggle2", + "block/cherrywood_trapdoor/toggle3" + ], + "subtitle": "subtitles.block.trapdoor.toggle" + }, + "block.chest.close": { + "sounds": [ + "block/chest/close1", + "block/chest/close2", + "block/chest/close3" + ], + "subtitle": "subtitles.block.chest.close" + }, + "block.chest.locked": { + "sounds": [ + "block/chest/close_locked", + "block/chest/open_locked" + ], + "subtitle": "subtitles.block.chest.locked" + }, + "block.chest.open": { + "sounds": [ + "block/chest/open" + ], + "subtitle": "subtitles.block.chest.open" + }, + "block.chiseled_bookshelf.break": { + "sounds": [ + "block/chiseled_bookshelf/break1", + "block/chiseled_bookshelf/break2", + "block/chiseled_bookshelf/break3", + "block/chiseled_bookshelf/break4", + "block/chiseled_bookshelf/break5", + "block/chiseled_bookshelf/break6" + ], + "subtitle": "subtitles.block.generic.break" + }, + "block.chiseled_bookshelf.fall": { + "sounds": [ + "block/chiseled_bookshelf/step1", + "block/chiseled_bookshelf/step2", + "block/chiseled_bookshelf/step3", + "block/chiseled_bookshelf/step4", + "block/chiseled_bookshelf/step5" + ], + "subtitle": "subtitles.block.generic.fall" + }, + "block.chiseled_bookshelf.hit": { + "sounds": [ + "block/chiseled_bookshelf/step1", + "block/chiseled_bookshelf/step2", + "block/chiseled_bookshelf/step3", + "block/chiseled_bookshelf/step4", + "block/chiseled_bookshelf/step5" + ], + "subtitle": "subtitles.block.generic.hit" + }, + "block.chiseled_bookshelf.insert": { + "sounds": [ + { + "name": "block/chiseled_bookshelf/insert1", + "volume": 0.8 + }, + { + "name": "block/chiseled_bookshelf/insert1", + "pitch": 0.85, + "volume": 0.8 + }, + { + "name": "block/chiseled_bookshelf/insert1", + "pitch": 1.1, + "volume": 0.8 + }, + { + "name": "block/chiseled_bookshelf/insert2", + "volume": 0.8 + }, + { + "name": "block/chiseled_bookshelf/insert2", + "pitch": 0.85, + "volume": 0.8 + }, + { + "name": "block/chiseled_bookshelf/insert2", + "pitch": 1.1, + "volume": 0.8 + }, + { + "name": "block/chiseled_bookshelf/insert3", + "volume": 0.8 + }, + { + "name": "block/chiseled_bookshelf/insert3", + "pitch": 0.85, + "volume": 0.8 + }, + { + "name": "block/chiseled_bookshelf/insert3", + "pitch": 1.1, + "volume": 0.8 + }, + { + "name": "block/chiseled_bookshelf/insert4", + "volume": 0.8 + }, + { + "name": "block/chiseled_bookshelf/insert4", + "pitch": 0.85, + "volume": 0.8 + }, + { + "name": "block/chiseled_bookshelf/insert4", + "pitch": 1.1, + "volume": 0.8 + } + ], + "subtitle": "subtitles.chiseled_bookshelf.insert" + }, + "block.chiseled_bookshelf.insert.enchanted": { + "sounds": [ + { + "name": "block/chiseled_bookshelf/insert_enchanted1", + "volume": 0.8 + }, + { + "name": "block/chiseled_bookshelf/insert_enchanted1", + "pitch": 0.85, + "volume": 0.8 + }, + { + "name": "block/chiseled_bookshelf/insert_enchanted1", + "pitch": 1.1, + "volume": 0.8 + }, + { + "name": "block/chiseled_bookshelf/insert_enchanted2", + "volume": 0.8 + }, + { + "name": "block/chiseled_bookshelf/insert_enchanted2", + "pitch": 0.85, + "volume": 0.8 + }, + { + "name": "block/chiseled_bookshelf/insert_enchanted2", + "pitch": 1.1, + "volume": 0.8 + }, + { + "name": "block/chiseled_bookshelf/insert_enchanted3", + "volume": 0.8 + }, + { + "name": "block/chiseled_bookshelf/insert_enchanted3", + "pitch": 0.85, + "volume": 0.8 + }, + { + "name": "block/chiseled_bookshelf/insert_enchanted3", + "pitch": 1.1, + "volume": 0.8 + }, + { + "name": "block/chiseled_bookshelf/insert_enchanted4", + "volume": 0.8 + }, + { + "name": "block/chiseled_bookshelf/insert_enchanted4", + "pitch": 0.85, + "volume": 0.8 + }, + { + "name": "block/chiseled_bookshelf/insert_enchanted4", + "pitch": 1.1, + "volume": 0.8 + } + ], + "subtitle": "subtitles.chiseled_bookshelf.insert_enchanted" + }, + "block.chiseled_bookshelf.pickup": { + "sounds": [ + { + "name": "block/chiseled_bookshelf/pickup1", + "volume": 0.8 + }, + { + "name": "block/chiseled_bookshelf/pickup1", + "pitch": 0.8, + "volume": 0.8 + }, + { + "name": "block/chiseled_bookshelf/pickup1", + "pitch": 1.1, + "volume": 0.8 + }, + { + "name": "block/chiseled_bookshelf/pickup2", + "volume": 0.8 + }, + { + "name": "block/chiseled_bookshelf/pickup2", + "pitch": 0.8, + "volume": 0.8 + }, + { + "name": "block/chiseled_bookshelf/pickup2", + "pitch": 1.1, + "volume": 0.8 + }, + { + "name": "block/chiseled_bookshelf/pickup3", + "volume": 0.8 + }, + { + "name": "block/chiseled_bookshelf/pickup3", + "pitch": 0.8, + "volume": 0.8 + }, + { + "name": "block/chiseled_bookshelf/pickup3", + "pitch": 1.1, + "volume": 0.8 + } + ], + "subtitle": "subtitles.chiseled_bookshelf.take" + }, + "block.chiseled_bookshelf.pickup.enchanted": { + "sounds": [ + { + "name": "block/chiseled_bookshelf/pickup_enchanted1", + "volume": 0.8 + }, + { + "name": "block/chiseled_bookshelf/pickup_enchanted1", + "pitch": 0.8, + "volume": 0.8 + }, + { + "name": "block/chiseled_bookshelf/pickup_enchanted1", + "pitch": 1.1, + "volume": 0.8 + }, + { + "name": "block/chiseled_bookshelf/pickup_enchanted2", + "volume": 0.8 + }, + { + "name": "block/chiseled_bookshelf/pickup_enchanted2", + "pitch": 0.8, + "volume": 0.8 + }, + { + "name": "block/chiseled_bookshelf/pickup_enchanted2", + "pitch": 1.1, + "volume": 0.8 + }, + { + "name": "block/chiseled_bookshelf/pickup_enchanted3", + "volume": 0.8 + }, + { + "name": "block/chiseled_bookshelf/pickup_enchanted3", + "pitch": 0.8, + "volume": 0.8 + }, + { + "name": "block/chiseled_bookshelf/pickup_enchanted3", + "pitch": 1.1, + "volume": 0.8 + } + ], + "subtitle": "subtitles.chiseled_bookshelf.take_enchanted" + }, + "block.chiseled_bookshelf.place": { + "sounds": [ + "block/chiseled_bookshelf/break1", + "block/chiseled_bookshelf/break2", + "block/chiseled_bookshelf/break3", + "block/chiseled_bookshelf/break4", + "block/chiseled_bookshelf/break5", + "block/chiseled_bookshelf/break6" + ], + "subtitle": "subtitles.block.generic.place" + }, + "block.chiseled_bookshelf.step": { + "sounds": [ + "block/chiseled_bookshelf/step1", + "block/chiseled_bookshelf/step2", + "block/chiseled_bookshelf/step3", + "block/chiseled_bookshelf/step4", + "block/chiseled_bookshelf/step5" + ], + "subtitle": "subtitles.block.generic.footsteps" + }, + "block.chorus_flower.death": { + "sounds": [ + "block/chorus_flower/death1", + "block/chorus_flower/death2", + "block/chorus_flower/death3" + ], + "subtitle": "subtitles.block.chorus_flower.death" + }, + "block.chorus_flower.grow": { + "sounds": [ + "block/chorus_flower/grow1", + "block/chorus_flower/grow2", + "block/chorus_flower/grow3", + "block/chorus_flower/grow4" + ], + "subtitle": "subtitles.block.chorus_flower.grow" + }, + "block.cobweb.break": { + "sounds": [ + "block/cobweb/break1", + "block/cobweb/break2", + "block/cobweb/break3", + "block/cobweb/break4", + "block/cobweb/break5", + "block/cobweb/break6" + ], + "subtitle": "subtitles.block.generic.break" + }, + "block.cobweb.fall": { + "sounds": [ + "block/cobweb/step1", + "block/cobweb/step2", + "block/cobweb/step3", + "block/cobweb/step4", + "block/cobweb/step5", + "block/cobweb/step6" + ], + "subtitle": "subtitles.block.generic.fall" + }, + "block.cobweb.hit": { + "sounds": [ + "block/cobweb/step1", + "block/cobweb/step2", + "block/cobweb/step3", + "block/cobweb/step4", + "block/cobweb/step5", + "block/cobweb/step6" + ], + "subtitle": "subtitles.block.generic.hit" + }, + "block.cobweb.place": { + "sounds": [ + "block/cobweb/break1", + "block/cobweb/break2", + "block/cobweb/break3", + "block/cobweb/break4", + "block/cobweb/break5", + "block/cobweb/break6" + ], + "subtitle": "subtitles.block.generic.place" + }, + "block.cobweb.step": { + "sounds": [ + "block/cobweb/step1", + "block/cobweb/step2", + "block/cobweb/step3", + "block/cobweb/step4", + "block/cobweb/step5", + "block/cobweb/step6" + ], + "subtitle": "subtitles.block.generic.footsteps" + }, + "block.comparator.click": { + "sounds": [ + "random/click" + ], + "subtitle": "subtitles.block.comparator.click" + }, + "block.composter.empty": { + "sounds": [ + "block/composter/empty1", + "block/composter/empty2", + "block/composter/empty3" + ], + "subtitle": "subtitles.block.composter.empty" + }, + "block.composter.fill": { + "sounds": [ + { + "name": "block/composter/fill1", + "pitch": 0.8, + "volume": 0.3 + }, + { + "name": "block/composter/fill2", + "pitch": 0.8, + "volume": 0.3 + }, + { + "name": "block/composter/fill3", + "pitch": 0.8, + "volume": 0.3 + }, + { + "name": "block/composter/fill4", + "pitch": 0.8, + "volume": 0.3 + } + ], + "subtitle": "subtitles.block.composter.fill" + }, + "block.composter.fill_success": { + "sounds": [ + "block/composter/fill_success1", + "block/composter/fill_success2", + "block/composter/fill_success3", + "block/composter/fill_success4" + ], + "subtitle": "subtitles.block.composter.fill" + }, + "block.composter.ready": { + "sounds": [ + "block/composter/ready1", + "block/composter/ready2", + "block/composter/ready3", + "block/composter/ready4" + ], + "subtitle": "subtitles.block.composter.ready" + }, + "block.conduit.activate": { + "sounds": [ + { + "name": "block/conduit/activate", + "volume": 0.9 + } + ], + "subtitle": "subtitles.block.conduit.activate" + }, + "block.conduit.ambient": { + "sounds": [ + { + "attenuation_distance": 8, + "name": "block/conduit/ambient" + } + ], + "subtitle": "subtitles.block.conduit.ambient" + }, + "block.conduit.ambient.short": { + "sounds": [ + { + "attenuation_distance": 8, + "name": "block/conduit/short1" + }, + { + "attenuation_distance": 8, + "name": "block/conduit/short2" + }, + { + "attenuation_distance": 8, + "name": "block/conduit/short3" + }, + { + "attenuation_distance": 8, + "name": "block/conduit/short4" + }, + { + "attenuation_distance": 8, + "name": "block/conduit/short5" + }, + { + "attenuation_distance": 8, + "name": "block/conduit/short6" + }, + { + "attenuation_distance": 8, + "name": "block/conduit/short7" + }, + { + "attenuation_distance": 8, + "name": "block/conduit/short8" + }, + { + "attenuation_distance": 8, + "name": "block/conduit/short9" + } + ] + }, + "block.conduit.attack.target": { + "sounds": [ + "block/conduit/attack1", + "block/conduit/attack2", + "block/conduit/attack3" + ], + "subtitle": "subtitles.block.conduit.attack.target" + }, + "block.conduit.deactivate": { + "sounds": [ + { + "name": "block/conduit/deactivate", + "volume": 0.7 + } + ], + "subtitle": "subtitles.block.conduit.deactivate" + }, + "block.copper.break": { + "sounds": [ + "block/copper/break1", + "block/copper/break2", + "block/copper/break3", + "block/copper/break4" + ], + "subtitle": "subtitles.block.generic.break" + }, + "block.copper.fall": { + "sounds": [ + "block/copper/step1", + "block/copper/step2", + "block/copper/step3", + "block/copper/step4", + "block/copper/step5", + "block/copper/step6" + ], + "subtitle": "subtitles.block.generic.fall" + }, + "block.copper.hit": { + "sounds": [ + "block/copper/step1", + "block/copper/step2", + "block/copper/step3", + "block/copper/step4", + "block/copper/step5", + "block/copper/step6" + ], + "subtitle": "subtitles.block.generic.hit" + }, + "block.copper.place": { + "sounds": [ + "block/copper/break1", + "block/copper/break2", + "block/copper/break3", + "block/copper/break4" + ], + "subtitle": "subtitles.block.generic.place" + }, + "block.copper.step": { + "sounds": [ + "block/copper/step1", + "block/copper/step2", + "block/copper/step3", + "block/copper/step4", + "block/copper/step5", + "block/copper/step6" + ], + "subtitle": "subtitles.block.generic.footsteps" + }, + "block.copper_bulb.break": { + "sounds": [ + "block/copper_bulb/break1", + "block/copper_bulb/break2", + "block/copper_bulb/break3", + "block/copper_bulb/break4" + ], + "subtitle": "subtitles.block.generic.break" + }, + "block.copper_bulb.fall": { + "sounds": [ + "block/copper_bulb/step1", + "block/copper_bulb/step2", + "block/copper_bulb/step3", + "block/copper_bulb/step4", + "block/copper_bulb/step5", + "block/copper_bulb/step6" + ], + "subtitle": "subtitles.block.generic.fall" + }, + "block.copper_bulb.hit": { + "sounds": [ + "block/copper_bulb/step1", + "block/copper_bulb/step2", + "block/copper_bulb/step3", + "block/copper_bulb/step4", + "block/copper_bulb/step5", + "block/copper_bulb/step6" + ], + "subtitle": "subtitles.block.generic.hit" + }, + "block.copper_bulb.place": { + "sounds": [ + "block/copper_bulb/place1", + "block/copper_bulb/place2", + "block/copper_bulb/place3", + "block/copper_bulb/place4" + ], + "subtitle": "subtitles.block.generic.place" + }, + "block.copper_bulb.step": { + "sounds": [ + "block/copper_bulb/step1", + "block/copper_bulb/step2", + "block/copper_bulb/step3", + "block/copper_bulb/step4", + "block/copper_bulb/step5", + "block/copper_bulb/step6" + ], + "subtitle": "subtitles.block.generic.footsteps" + }, + "block.copper_bulb.turn_off": { + "sounds": [ + { + "attenuation_distance": 6, + "name": "block/copper_bulb/toggle", + "pitch": 0.75 + } + ], + "subtitle": "subtitles.block.copper_bulb.turn_off" + }, + "block.copper_bulb.turn_on": { + "sounds": [ + { + "attenuation_distance": 6, + "name": "block/copper_bulb/toggle" + } + ], + "subtitle": "subtitles.block.copper_bulb.turn_on" + }, + "block.copper_door.close": { + "sounds": [ + "block/copper_door/toggle1", + "block/copper_door/toggle2", + "block/copper_door/toggle3" + ], + "subtitle": "subtitles.block.door.toggle" + }, + "block.copper_door.open": { + "sounds": [ + "block/copper_door/toggle1", + "block/copper_door/toggle2", + { + "name": "block/copper_door/toggle2", + "pitch": 1.1 + }, + "block/copper_door/toggle3", + { + "name": "block/copper_door/toggle3", + "pitch": 1.1 + } + ], + "subtitle": "subtitles.block.door.toggle" + }, + "block.copper_grate.break": { + "sounds": [ + "block/copper_grate/break1", + "block/copper_grate/break2", + "block/copper_grate/break3", + "block/copper_grate/break4" + ], + "subtitle": "subtitles.block.generic.break" + }, + "block.copper_grate.fall": { + "sounds": [ + "block/copper_grate/step1", + "block/copper_grate/step2", + "block/copper_grate/step3", + "block/copper_grate/step4", + "block/copper_grate/step5", + "block/copper_grate/step6" + ], + "subtitle": "subtitles.block.generic.fall" + }, + "block.copper_grate.hit": { + "sounds": [ + "block/copper_grate/step1", + "block/copper_grate/step2", + "block/copper_grate/step3", + "block/copper_grate/step4", + "block/copper_grate/step5", + "block/copper_grate/step6" + ], + "subtitle": "subtitles.block.generic.hit" + }, + "block.copper_grate.place": { + "sounds": [ + "block/copper_grate/break1", + { + "name": "block/copper_grate/break1", + "pitch": 0.95 + }, + "block/copper_grate/break2", + "block/copper_grate/break3", + "block/copper_grate/break4" + ], + "subtitle": "subtitles.block.generic.place" + }, + "block.copper_grate.step": { + "sounds": [ + "block/copper_grate/step1", + "block/copper_grate/step2", + "block/copper_grate/step3", + "block/copper_grate/step4", + "block/copper_grate/step5", + "block/copper_grate/step6" + ], + "subtitle": "subtitles.block.generic.footsteps" + }, + "block.copper_trapdoor.close": { + "sounds": [ + "block/copper_trapdoor/toggle1", + "block/copper_trapdoor/toggle2", + "block/copper_trapdoor/toggle3", + "block/copper_trapdoor/toggle4" + ], + "subtitle": "subtitles.block.copper_trapdoor.close" + }, + "block.copper_trapdoor.open": { + "sounds": [ + "block/copper_trapdoor/toggle1", + "block/copper_trapdoor/toggle2", + "block/copper_trapdoor/toggle3", + "block/copper_trapdoor/toggle4" + ], + "subtitle": "subtitles.block.copper_trapdoor.open" + }, + "block.coral_block.break": { + "sounds": [ + "dig/coral1", + "dig/coral2", + "dig/coral3", + "dig/coral4" + ], + "subtitle": "subtitles.block.generic.break" + }, + "block.coral_block.fall": { + "sounds": [ + "step/coral1", + "step/coral2", + "step/coral3", + "step/coral4", + "step/coral5", + "step/coral6" + ], + "subtitle": "subtitles.block.generic.fall" + }, + "block.coral_block.hit": { + "sounds": [ + "step/coral1", + "step/coral2", + "step/coral3", + "step/coral4", + "step/coral5", + "step/coral6" + ], + "subtitle": "subtitles.block.generic.hit" + }, + "block.coral_block.place": { + "sounds": [ + "dig/coral1", + "dig/coral2", + "dig/coral3", + "dig/coral4" + ], + "subtitle": "subtitles.block.generic.place" + }, + "block.coral_block.step": { + "sounds": [ + "step/coral1", + "step/coral2", + "step/coral3", + "step/coral4", + "step/coral5", + "step/coral6" + ], + "subtitle": "subtitles.block.generic.footsteps" + }, + "block.crafter.craft": { + "sounds": [ + { + "attenuation_distance": 5, + "name": "block/crafter/craft" + }, + { + "attenuation_distance": 5, + "name": "block/crafter/craft", + "pitch": 0.96 + }, + { + "attenuation_distance": 5, + "name": "block/crafter/craft", + "pitch": 1.04 + } + ], + "subtitle": "subtitles.block.crafter.craft" + }, + "block.crafter.fail": { + "sounds": [ + { + "attenuation_distance": 3, + "name": "block/crafter/fail" + }, + { + "attenuation_distance": 3, + "name": "block/crafter/fail", + "pitch": 0.96 + }, + { + "attenuation_distance": 3, + "name": "block/crafter/fail", + "pitch": 1.04 + } + ], + "subtitle": "subtitles.block.crafter.fail" + }, + "block.creaking_heart.break": { + "sounds": [ + { + "name": "block/creaking_heart/break/creaking_heart_break", + "volume": 0.5 + } + ], + "subtitle": "subtitles.block.generic.break" + }, + "block.creaking_heart.fall": { + "sounds": [ + "block/creaking_heart/fall/creaking_heart_fall" + ], + "subtitle": "subtitles.block.generic.fall" + }, + "block.creaking_heart.hit": { + "sounds": [ + "block/creaking_heart/hit/creaking_heart_hit1", + "block/creaking_heart/hit/creaking_heart_hit2", + "block/creaking_heart/hit/creaking_heart_hit3", + "block/creaking_heart/hit/creaking_heart_hit4", + "block/creaking_heart/hit/creaking_heart_hit5" + ], + "subtitle": "subtitles.block.generic.hit" + }, + "block.creaking_heart.hurt": { + "sounds": [ + "block/creaking_heart/hurt/trail1", + "block/creaking_heart/hurt/trail2", + "block/creaking_heart/hurt/trail3", + "block/creaking_heart/hurt/trail4", + "block/creaking_heart/hurt/trail5", + "block/creaking_heart/hurt/trail6", + "block/creaking_heart/hurt/trail7" + ], + "subtitle": "subtitles.block.creaking_heart.hurt" + }, + "block.creaking_heart.idle": { + "sounds": [ + "block/creaking_heart/idle/creaking_heart_idle1", + "block/creaking_heart/idle/creaking_heart_idle2", + "block/creaking_heart/idle/creaking_heart_idle3", + "block/creaking_heart/idle/creaking_heart_idle4" + ], + "subtitle": "subtitles.ambient.sound" + }, + "block.creaking_heart.place": { + "sounds": [ + "block/creaking_heart/place/creaking_heart_place1", + "block/creaking_heart/place/creaking_heart_place2", + "block/creaking_heart/place/creaking_heart_place3", + "block/creaking_heart/place/creaking_heart_place4" + ], + "subtitle": "subtitles.block.generic.place" + }, + "block.creaking_heart.spawn": { + "sounds": [ + "block/creaking_heart/spawnmob/creaking_heart_spawnmob" + ], + "subtitle": "subtitles.block.creaking_heart.spawn" + }, + "block.creaking_heart.step": { + "sounds": [ + "block/creaking_heart/step/creaking_heart_step1", + "block/creaking_heart/step/creaking_heart_step2", + "block/creaking_heart/step/creaking_heart_step3", + "block/creaking_heart/step/creaking_heart_step4", + "block/creaking_heart/step/creaking_heart_step5", + "block/creaking_heart/step/creaking_heart_step6" + ], + "subtitle": "subtitles.block.generic.footsteps" + }, + "block.crop.break": { + "sounds": [ + { + "name": "block/bamboo/sapling_place1", + "volume": 0.9 + }, + { + "name": "block/bamboo/sapling_place2", + "volume": 0.9 + }, + { + "name": "block/bamboo/sapling_place3", + "volume": 0.9 + }, + { + "name": "block/bamboo/sapling_place4", + "volume": 0.9 + }, + { + "name": "block/bamboo/sapling_place5", + "volume": 0.9 + }, + { + "name": "block/bamboo/sapling_place6", + "volume": 0.9 + } + ], + "subtitle": "subtitles.block.generic.break" + }, + "block.decorated_pot.break": { + "sounds": [ + "block/decorated_pot/break1", + "block/decorated_pot/break2", + "block/decorated_pot/break3", + "block/decorated_pot/break4" + ], + "subtitle": "subtitles.block.generic.break" + }, + "block.decorated_pot.fall": { + "sounds": [ + "block/decorated_pot/step1", + "block/decorated_pot/step2", + "block/decorated_pot/step3", + "block/decorated_pot/step4", + "block/decorated_pot/step5" + ], + "subtitle": "subtitles.block.generic.fall" + }, + "block.decorated_pot.hit": { + "sounds": [ + "block/decorated_pot/step1", + "block/decorated_pot/step2", + "block/decorated_pot/step3", + "block/decorated_pot/step4", + "block/decorated_pot/step5" + ], + "subtitle": "subtitles.block.generic.hit" + }, + "block.decorated_pot.insert": { + "sounds": [ + { + "name": "block/decorated_pot/insert1", + "volume": 0.9 + }, + { + "name": "block/decorated_pot/insert2", + "volume": 0.9 + }, + { + "name": "block/decorated_pot/insert3", + "volume": 0.9 + }, + { + "name": "block/decorated_pot/insert4", + "volume": 0.9 + } + ], + "subtitle": "subtitles.block.decorated_pot.insert" + }, + "block.decorated_pot.insert_fail": { + "sounds": [ + { + "name": "block/decorated_pot/insert_fail1", + "volume": 0.9 + }, + { + "name": "block/decorated_pot/insert_fail2", + "volume": 0.9 + }, + { + "name": "block/decorated_pot/insert_fail3", + "volume": 0.9 + }, + { + "name": "block/decorated_pot/insert_fail4", + "volume": 0.9 + }, + { + "name": "block/decorated_pot/insert_fail5", + "volume": 0.9 + } + ], + "subtitle": "subtitles.block.decorated_pot.insert_fail" + }, + "block.decorated_pot.place": { + "sounds": [ + "block/decorated_pot/break1", + "block/decorated_pot/break2", + "block/decorated_pot/break3", + "block/decorated_pot/break4" + ], + "subtitle": "subtitles.block.generic.place" + }, + "block.decorated_pot.shatter": { + "sounds": [ + "block/decorated_pot/shatter1", + "block/decorated_pot/shatter2", + "block/decorated_pot/shatter3", + "block/decorated_pot/shatter4", + "block/decorated_pot/shatter5" + ], + "subtitle": "subtitles.block.decorated_pot.shatter" + }, + "block.decorated_pot.step": { + "sounds": [ + "block/decorated_pot/step1", + "block/decorated_pot/step2", + "block/decorated_pot/step3", + "block/decorated_pot/step4", + "block/decorated_pot/step5" + ], + "subtitle": "subtitles.block.generic.footsteps" + }, + "block.deepslate.break": { + "sounds": [ + "block/deepslate/break1", + "block/deepslate/break2", + "block/deepslate/break3", + "block/deepslate/break4" + ], + "subtitle": "subtitles.block.generic.break" + }, + "block.deepslate.fall": { + "sounds": [ + "block/deepslate/step1", + "block/deepslate/step2", + "block/deepslate/step3", + "block/deepslate/step4", + "block/deepslate/step5", + "block/deepslate/step6" + ], + "subtitle": "subtitles.block.generic.fall" + }, + "block.deepslate.hit": { + "sounds": [ + "block/deepslate/step1", + "block/deepslate/step2", + "block/deepslate/step3", + "block/deepslate/step4", + "block/deepslate/step5", + "block/deepslate/step6" + ], + "subtitle": "subtitles.block.generic.hit" + }, + "block.deepslate.place": { + "sounds": [ + "block/deepslate/place1", + "block/deepslate/place2", + "block/deepslate/place3", + "block/deepslate/place4", + "block/deepslate/place5", + "block/deepslate/place6" + ], + "subtitle": "subtitles.block.generic.place" + }, + "block.deepslate.step": { + "sounds": [ + "block/deepslate/step1", + "block/deepslate/step2", + "block/deepslate/step3", + "block/deepslate/step4", + "block/deepslate/step5", + "block/deepslate/step6" + ], + "subtitle": "subtitles.block.generic.footsteps" + }, + "block.deepslate_bricks.break": { + "sounds": [ + { + "name": "block/deepslate_bricks/place1", + "volume": 0.85 + }, + { + "name": "block/deepslate_bricks/place2", + "volume": 0.85 + }, + { + "name": "block/deepslate_bricks/place3", + "volume": 0.85 + }, + { + "name": "block/deepslate_bricks/place4", + "volume": 0.85 + }, + { + "name": "block/deepslate_bricks/place5", + "volume": 0.85 + }, + { + "name": "block/deepslate_bricks/place6", + "volume": 0.85 + } + ], + "subtitle": "subtitles.block.generic.break" + }, + "block.deepslate_bricks.fall": { + "sounds": [ + "block/deepslate_bricks/step1", + "block/deepslate_bricks/step2", + "block/deepslate_bricks/step3", + "block/deepslate_bricks/step4", + "block/deepslate_bricks/step5" + ], + "subtitle": "subtitles.block.generic.fall" + }, + "block.deepslate_bricks.hit": { + "sounds": [ + "block/deepslate_bricks/step1", + "block/deepslate_bricks/step2", + "block/deepslate_bricks/step3", + "block/deepslate_bricks/step4", + "block/deepslate_bricks/step5" + ], + "subtitle": "subtitles.block.generic.hit" + }, + "block.deepslate_bricks.place": { + "sounds": [ + { + "name": "block/deepslate_bricks/place1", + "volume": 0.85 + }, + { + "name": "block/deepslate_bricks/place2", + "volume": 0.85 + }, + { + "name": "block/deepslate_bricks/place3", + "volume": 0.85 + }, + { + "name": "block/deepslate_bricks/place4", + "volume": 0.85 + }, + { + "name": "block/deepslate_bricks/place5", + "volume": 0.85 + }, + { + "name": "block/deepslate_bricks/place6", + "volume": 0.85 + } + ], + "subtitle": "subtitles.block.generic.place" + }, + "block.deepslate_bricks.step": { + "sounds": [ + { + "name": "block/deepslate_bricks/step1", + "pitch": 0.9 + }, + { + "name": "block/deepslate_bricks/step2", + "pitch": 0.9 + }, + { + "name": "block/deepslate_bricks/step3", + "pitch": 0.9 + }, + { + "name": "block/deepslate_bricks/step4", + "pitch": 0.9 + }, + { + "name": "block/deepslate_bricks/step5", + "pitch": 0.9 + } + ], + "subtitle": "subtitles.block.generic.footsteps" + }, + "block.deepslate_tiles.break": { + "sounds": [ + { + "name": "block/deepslate_bricks/place1", + "pitch": 1.3, + "volume": 0.92 + }, + { + "name": "block/deepslate_bricks/place2", + "pitch": 1.3, + "volume": 0.92 + }, + { + "name": "block/deepslate_bricks/place3", + "pitch": 1.3, + "volume": 0.92 + }, + { + "name": "block/deepslate_bricks/place4", + "pitch": 1.3, + "volume": 0.92 + }, + { + "name": "block/deepslate_bricks/place5", + "pitch": 1.3, + "volume": 0.92 + }, + { + "name": "block/deepslate_bricks/place6", + "pitch": 1.3, + "volume": 0.92 + } + ], + "subtitle": "subtitles.block.generic.break" + }, + "block.deepslate_tiles.fall": { + "sounds": [ + { + "name": "block/deepslate_bricks/step1", + "pitch": 1.3 + }, + { + "name": "block/deepslate_bricks/step2", + "pitch": 1.3 + }, + { + "name": "block/deepslate_bricks/step3", + "pitch": 1.3 + }, + { + "name": "block/deepslate_bricks/step4", + "pitch": 1.3 + }, + { + "name": "block/deepslate_bricks/step5", + "pitch": 1.3 + } + ], + "subtitle": "subtitles.block.generic.fall" + }, + "block.deepslate_tiles.hit": { + "sounds": [ + { + "name": "block/deepslate_bricks/step1", + "pitch": 1.3 + }, + { + "name": "block/deepslate_bricks/step2", + "pitch": 1.3 + }, + { + "name": "block/deepslate_bricks/step3", + "pitch": 1.3 + }, + { + "name": "block/deepslate_bricks/step4", + "pitch": 1.3 + }, + { + "name": "block/deepslate_bricks/step5", + "pitch": 1.3 + } + ], + "subtitle": "subtitles.block.generic.hit" + }, + "block.deepslate_tiles.place": { + "sounds": [ + { + "name": "block/deepslate_bricks/place1", + "pitch": 1.2, + "volume": 0.85 + }, + { + "name": "block/deepslate_bricks/place2", + "pitch": 1.2, + "volume": 0.85 + }, + { + "name": "block/deepslate_bricks/place3", + "pitch": 1.2, + "volume": 0.85 + }, + { + "name": "block/deepslate_bricks/place4", + "pitch": 1.2, + "volume": 0.85 + }, + { + "name": "block/deepslate_bricks/place5", + "pitch": 1.2, + "volume": 0.85 + }, + { + "name": "block/deepslate_bricks/place6", + "pitch": 1.2, + "volume": 0.85 + } + ], + "subtitle": "subtitles.block.generic.place" + }, + "block.deepslate_tiles.step": { + "sounds": [ + { + "name": "block/deepslate_bricks/step1", + "pitch": 1.2 + }, + { + "name": "block/deepslate_bricks/step2", + "pitch": 1.2 + }, + { + "name": "block/deepslate_bricks/step3", + "pitch": 1.2 + }, + { + "name": "block/deepslate_bricks/step4", + "pitch": 1.2 + }, + { + "name": "block/deepslate_bricks/step5", + "pitch": 1.2 + } + ], + "subtitle": "subtitles.block.generic.footsteps" + }, + "block.dispenser.dispense": { + "sounds": [ + "random/click" + ], + "subtitle": "subtitles.block.dispenser.dispense" + }, + "block.dispenser.fail": { + "sounds": [ + "random/click" + ], + "subtitle": "subtitles.block.dispenser.fail" + }, + "block.dispenser.launch": { + "sounds": [ + "random/bow" + ], + "subtitle": "subtitles.block.dispenser.dispense" + }, + "block.dripstone_block.break": { + "sounds": [ + "block/dripstone/break1", + "block/dripstone/break2", + "block/dripstone/break3", + "block/dripstone/break4", + "block/dripstone/break5" + ], + "subtitle": "subtitles.block.generic.break" + }, + "block.dripstone_block.fall": { + "sounds": [ + "block/dripstone/step1", + "block/dripstone/step2", + "block/dripstone/step3", + "block/dripstone/step4", + "block/dripstone/step5", + "block/dripstone/step6" + ], + "subtitle": "subtitles.block.generic.fall" + }, + "block.dripstone_block.hit": { + "sounds": [ + "block/dripstone/step1", + "block/dripstone/step2", + "block/dripstone/step3", + "block/dripstone/step4", + "block/dripstone/step5", + "block/dripstone/step6" + ], + "subtitle": "subtitles.block.generic.hit" + }, + "block.dripstone_block.place": { + "sounds": [ + "block/dripstone/break1", + "block/dripstone/break2", + "block/dripstone/break3", + "block/dripstone/break4", + "block/dripstone/break5" + ], + "subtitle": "subtitles.block.generic.place" + }, + "block.dripstone_block.step": { + "sounds": [ + "block/dripstone/step1", + "block/dripstone/step2", + "block/dripstone/step3", + "block/dripstone/step4", + "block/dripstone/step5", + "block/dripstone/step6" + ], + "subtitle": "subtitles.block.generic.footsteps" + }, + "block.enchantment_table.use": { + "sounds": [ + "block/enchantment_table/enchant1", + "block/enchantment_table/enchant2", + "block/enchantment_table/enchant3" + ], + "subtitle": "subtitles.block.enchantment_table.use" + }, + "block.end_gateway.spawn": { + "sounds": [ + "random/explode1", + "random/explode2", + "random/explode3", + "random/explode4" + ], + "subtitle": "subtitles.entity.generic.explode" + }, + "block.end_portal.spawn": { + "sounds": [ + "block/end_portal/endportal" + ], + "subtitle": "subtitles.block.end_portal.spawn" + }, + "block.end_portal_frame.fill": { + "sounds": [ + "block/end_portal/eyeplace1", + "block/end_portal/eyeplace2", + "block/end_portal/eyeplace3" + ], + "subtitle": "subtitles.block.end_portal_frame.fill" + }, + "block.ender_chest.close": { + "sounds": [ + "block/enderchest/close" + ], + "subtitle": "subtitles.block.chest.close" + }, + "block.ender_chest.open": { + "sounds": [ + "block/enderchest/open" + ], + "subtitle": "subtitles.block.chest.open" + }, + "block.eyeblossom.close": { + "sounds": [ + "block/eyeblossom/eyeblossom_close1", + "block/eyeblossom/eyeblossom_close2", + "block/eyeblossom/eyeblossom_close3" + ], + "subtitle": "subtitles.block.eyeblossom.close" + }, + "block.eyeblossom.close_long": { + "sounds": [ + "block/eyeblossom/eyeblossom_close_long" + ], + "subtitle": "subtitles.block.eyeblossom.close" + }, + "block.eyeblossom.idle": { + "sounds": [ + "block/eyeblossom/eyeblossom_idle1", + "block/eyeblossom/eyeblossom_idle2", + "block/eyeblossom/eyeblossom_idle3", + "block/eyeblossom/eyeblossom_idle4", + "block/eyeblossom/eyeblossom_idle5", + "block/eyeblossom/eyeblossom_idle6" + ], + "subtitle": "subtitles.ambient.sound" + }, + "block.eyeblossom.open": { + "sounds": [ + "block/eyeblossom/eyeblossom_open1", + "block/eyeblossom/eyeblossom_open2", + "block/eyeblossom/eyeblossom_open3", + "block/eyeblossom/eyeblossom_open4" + ], + "subtitle": "subtitles.block.eyeblossom.open" + }, + "block.eyeblossom.open_long": { + "sounds": [ + "block/eyeblossom/eyeblossom_open_long" + ], + "subtitle": "subtitles.block.eyeblossom.open" + }, + "block.fence_gate.close": { + "sounds": [ + { + "name": "block/fence_gate/close1", + "volume": 0.9 + }, + { + "name": "block/fence_gate/close2", + "volume": 0.9 + } + ], + "subtitle": "subtitles.block.fence_gate.toggle" + }, + "block.fence_gate.open": { + "sounds": [ + { + "name": "block/fence_gate/open1", + "volume": 0.9 + }, + { + "name": "block/fence_gate/open2", + "volume": 0.9 + } + ], + "subtitle": "subtitles.block.fence_gate.toggle" + }, + "block.fire.ambient": { + "sounds": [ + "fire/fire" + ], + "subtitle": "subtitles.block.fire.ambient" + }, + "block.fire.extinguish": { + "sounds": [ + "random/fizz" + ], + "subtitle": "subtitles.block.fire.extinguish" + }, + "block.flowering_azalea.break": { + "sounds": [ + "block/azalea/break1", + "block/azalea/break2", + "block/azalea/break3", + "block/azalea/break4", + "block/azalea/break5", + "block/azalea/break6" + ], + "subtitle": "subtitles.block.generic.break" + }, + "block.flowering_azalea.fall": { + "sounds": [ + "block/azalea/step1", + "block/azalea/step2", + "block/azalea/step3", + "block/azalea/step4", + "block/azalea/step5", + "block/azalea/step6" + ], + "subtitle": "subtitles.block.generic.fall" + }, + "block.flowering_azalea.hit": { + "sounds": [ + "block/azalea/step1", + "block/azalea/step2", + "block/azalea/step3", + "block/azalea/step4", + "block/azalea/step5", + "block/azalea/step6" + ], + "subtitle": "subtitles.block.generic.hit" + }, + "block.flowering_azalea.place": { + "sounds": [ + "block/azalea/break1", + "block/azalea/break2", + "block/azalea/break3", + "block/azalea/break4", + "block/azalea/break5", + "block/azalea/break6" + ], + "subtitle": "subtitles.block.generic.place" + }, + "block.flowering_azalea.step": { + "sounds": [ + "block/azalea/step1", + "block/azalea/step2", + "block/azalea/step3", + "block/azalea/step4", + "block/azalea/step5", + "block/azalea/step6" + ], + "subtitle": "subtitles.block.generic.footsteps" + }, + "block.froglight.break": { + "sounds": [ + { + "name": "block/froglight/break1", + "volume": 0.8 + }, + { + "name": "block/froglight/break2", + "volume": 0.8 + }, + { + "name": "block/froglight/break3", + "volume": 0.8 + }, + { + "name": "block/froglight/break4", + "volume": 0.8 + } + ], + "subtitle": "subtitles.block.generic.break" + }, + "block.froglight.fall": { + "sounds": [ + "block/froglight/step1", + "block/froglight/step2", + "block/froglight/step3", + "block/froglight/step4", + "block/froglight/step5", + "block/froglight/step6" + ], + "subtitle": "subtitles.block.generic.fall" + }, + "block.froglight.hit": { + "sounds": [ + { + "name": "block/froglight/step1", + "pitch": 1.3, + "volume": 0.83 + }, + { + "name": "block/froglight/step2", + "pitch": 1.3, + "volume": 0.83 + }, + { + "name": "block/froglight/step3", + "pitch": 1.3, + "volume": 0.83 + }, + { + "name": "block/froglight/step4", + "pitch": 1.3, + "volume": 0.83 + }, + { + "name": "block/froglight/step5", + "pitch": 1.3, + "volume": 0.83 + }, + { + "name": "block/froglight/step6", + "pitch": 1.3, + "volume": 0.83 + } + ], + "subtitle": "subtitles.block.generic.hit" + }, + "block.froglight.place": { + "sounds": [ + { + "name": "block/froglight/break1", + "volume": 0.8 + }, + { + "name": "block/froglight/break2", + "volume": 0.8 + }, + { + "name": "block/froglight/break3", + "volume": 0.8 + }, + { + "name": "block/froglight/break4", + "volume": 0.8 + } + ], + "subtitle": "subtitles.block.generic.place" + }, + "block.froglight.step": { + "sounds": [ + "block/froglight/step1", + "block/froglight/step2", + "block/froglight/step3", + "block/froglight/step4", + "block/froglight/step5", + "block/froglight/step6" + ], + "subtitle": "subtitles.block.generic.footsteps" + }, + "block.frogspawn.break": { + "sounds": [ + { + "name": "block/frogspawn/break1", + "pitch": 1.2, + "volume": 0.1 + }, + { + "name": "block/frogspawn/break2", + "pitch": 1.2, + "volume": 0.1 + }, + { + "name": "block/frogspawn/break3", + "pitch": 1.2, + "volume": 0.1 + }, + { + "name": "block/frogspawn/break4", + "pitch": 1.2, + "volume": 0.1 + } + ], + "subtitle": "subtitles.block.generic.break" + }, + "block.frogspawn.fall": { + "sounds": [ + { + "name": "block/frogspawn/step1", + "pitch": 1.3, + "volume": 0.3 + }, + { + "name": "block/frogspawn/step2", + "pitch": 1.3, + "volume": 0.3 + }, + { + "name": "block/frogspawn/step3", + "pitch": 1.3, + "volume": 0.3 + }, + { + "name": "block/frogspawn/step4", + "pitch": 1.3, + "volume": 0.3 + }, + { + "name": "block/frogspawn/step5", + "pitch": 1.3, + "volume": 0.3 + }, + { + "name": "block/frogspawn/step6", + "pitch": 1.3, + "volume": 0.3 + } + ], + "subtitle": "subtitles.block.generic.fall" + }, + "block.frogspawn.hatch": { + "sounds": [ + { + "name": "block/frogspawn/hatch1", + "pitch": 1.2, + "volume": 0.6 + }, + { + "name": "block/frogspawn/hatch2", + "pitch": 1.2, + "volume": 0.6 + }, + { + "name": "block/frogspawn/hatch3", + "pitch": 1.2, + "volume": 0.6 + }, + { + "name": "block/frogspawn/hatch4", + "pitch": 1.2, + "volume": 0.6 + } + ], + "subtitle": "subtitles.block.frogspawn.hatch" + }, + "block.frogspawn.hit": { + "sounds": [ + { + "name": "block/frogspawn/step1", + "pitch": 1.3, + "volume": 0.3 + }, + { + "name": "block/frogspawn/step2", + "pitch": 1.3, + "volume": 0.3 + }, + { + "name": "block/frogspawn/step3", + "pitch": 1.3, + "volume": 0.3 + }, + { + "name": "block/frogspawn/step4", + "pitch": 1.3, + "volume": 0.3 + }, + { + "name": "block/frogspawn/step5", + "pitch": 1.3, + "volume": 0.3 + }, + { + "name": "block/frogspawn/step6", + "pitch": 1.3, + "volume": 0.3 + } + ], + "subtitle": "subtitles.block.generic.hit" + }, + "block.frogspawn.place": { + "sounds": [ + { + "name": "block/frogspawn/break1", + "pitch": 1.5, + "volume": 0.2 + }, + { + "name": "block/frogspawn/break2", + "pitch": 1.5, + "volume": 0.2 + }, + { + "name": "block/frogspawn/break3", + "pitch": 1.5, + "volume": 0.2 + }, + { + "name": "block/frogspawn/break4", + "pitch": 1.5, + "volume": 0.2 + } + ], + "subtitle": "subtitles.block.generic.place" + }, + "block.frogspawn.step": { + "sounds": [ + { + "name": "block/frogspawn/step1", + "volume": 0.3 + }, + { + "name": "block/frogspawn/step2", + "volume": 0.3 + }, + { + "name": "block/frogspawn/step3", + "volume": 0.3 + }, + { + "name": "block/frogspawn/step4", + "volume": 0.3 + }, + { + "name": "block/frogspawn/step5", + "volume": 0.3 + }, + { + "name": "block/frogspawn/step6", + "volume": 0.3 + } + ], + "subtitle": "subtitles.block.generic.footsteps" + }, + "block.fungus.break": { + "sounds": [ + "block/fungus/break1", + "block/fungus/break2", + "block/fungus/break3", + "block/fungus/break4", + "block/fungus/break5", + "block/fungus/break6" + ], + "subtitle": "subtitles.block.generic.break" + }, + "block.fungus.fall": { + "sounds": [] + }, + "block.fungus.hit": { + "sounds": [], + "subtitle": "subtitles.block.generic.hit" + }, + "block.fungus.place": { + "sounds": [ + "block/fungus/break1", + "block/fungus/break2", + "block/fungus/break3", + "block/fungus/break4", + "block/fungus/break5", + "block/fungus/break6" + ], + "subtitle": "subtitles.block.generic.place" + }, + "block.fungus.step": { + "sounds": [ + { + "name": "item/plant/netherwart1", + "pitch": 0.9, + "volume": 0.9 + }, + { + "name": "item/plant/netherwart1", + "pitch": 1.12, + "volume": 0.9 + }, + { + "name": "item/plant/netherwart2", + "pitch": 0.9, + "volume": 0.9 + }, + { + "name": "item/plant/netherwart2", + "pitch": 1.12, + "volume": 0.9 + }, + { + "name": "item/plant/netherwart3", + "pitch": 0.9, + "volume": 0.9 + }, + { + "name": "item/plant/netherwart3", + "pitch": 1.12, + "volume": 0.9 + }, + { + "name": "item/plant/netherwart4", + "pitch": 0.9, + "volume": 0.9 + }, + { + "name": "item/plant/netherwart4", + "pitch": 1.12, + "volume": 0.9 + }, + { + "name": "item/plant/netherwart5", + "pitch": 0.9, + "volume": 0.9 + }, + { + "name": "item/plant/netherwart5", + "pitch": 1.12, + "volume": 0.9 + }, + { + "name": "item/plant/netherwart6", + "pitch": 0.9, + "volume": 0.9 + }, + { + "name": "item/plant/netherwart6", + "pitch": 1.12, + "volume": 0.9 + } + ], + "subtitle": "subtitles.block.generic.footsteps" + }, + "block.furnace.fire_crackle": { + "sounds": [ + "block/furnace/fire_crackle1", + "block/furnace/fire_crackle2", + "block/furnace/fire_crackle3", + "block/furnace/fire_crackle4", + "block/furnace/fire_crackle5" + ], + "subtitle": "subtitles.block.furnace.fire_crackle" + }, + "block.gilded_blackstone.break": { + "sounds": [ + "block/nether_ore/break1", + "block/nether_ore/break2", + "block/nether_ore/break3", + "block/nether_ore/break4" + ], + "subtitle": "subtitles.block.generic.break" + }, + "block.gilded_blackstone.fall": { + "sounds": [ + "block/nether_ore/step1", + "block/nether_ore/step2", + "block/nether_ore/step3", + "block/nether_ore/step4", + "block/nether_ore/step5" + ], + "subtitle": "subtitles.block.generic.fall" + }, + "block.gilded_blackstone.hit": { + "sounds": [ + "block/nether_ore/step1", + "block/nether_ore/step2", + "block/nether_ore/step3", + "block/nether_ore/step4", + "block/nether_ore/step5" + ], + "subtitle": "subtitles.block.generic.hit" + }, + "block.gilded_blackstone.place": { + "sounds": [ + "block/nether_ore/break1", + "block/nether_ore/break2", + "block/nether_ore/break3", + "block/nether_ore/break4" + ], + "subtitle": "subtitles.block.generic.place" + }, + "block.gilded_blackstone.step": { + "sounds": [ + "block/nether_ore/step1", + "block/nether_ore/step2", + "block/nether_ore/step3", + "block/nether_ore/step4", + "block/nether_ore/step5" + ], + "subtitle": "subtitles.block.generic.footsteps" + }, + "block.glass.break": { + "sounds": [ + "random/glass1", + "random/glass2", + "random/glass3" + ], + "subtitle": "subtitles.block.generic.break" + }, + "block.glass.fall": { + "sounds": [ + "step/stone1", + "step/stone2", + "step/stone3", + "step/stone4", + "step/stone5", + "step/stone6" + ], + "subtitle": "subtitles.block.generic.fall" + }, + "block.glass.hit": { + "sounds": [ + "step/stone1", + "step/stone2", + "step/stone3", + "step/stone4", + "step/stone5", + "step/stone6" + ], + "subtitle": "subtitles.block.generic.hit" + }, + "block.glass.place": { + "sounds": [ + "dig/stone1", + "dig/stone2", + "dig/stone3", + "dig/stone4" + ], + "subtitle": "subtitles.block.generic.place" + }, + "block.glass.step": { + "sounds": [ + "step/stone1", + "step/stone2", + "step/stone3", + "step/stone4", + "step/stone5", + "step/stone6" + ], + "subtitle": "subtitles.block.generic.footsteps" + }, + "block.grass.break": { + "sounds": [ + "dig/grass1", + "dig/grass2", + "dig/grass3", + "dig/grass4" + ], + "subtitle": "subtitles.block.generic.break" + }, + "block.grass.fall": { + "sounds": [ + "step/grass1", + "step/grass2", + "step/grass3", + "step/grass4", + "step/grass5", + "step/grass6" + ], + "subtitle": "subtitles.block.generic.fall" + }, + "block.grass.hit": { + "sounds": [ + "step/grass1", + "step/grass2", + "step/grass3", + "step/grass4", + "step/grass5", + "step/grass6" + ], + "subtitle": "subtitles.block.generic.hit" + }, + "block.grass.place": { + "sounds": [ + "dig/grass1", + "dig/grass2", + "dig/grass3", + "dig/grass4" + ], + "subtitle": "subtitles.block.generic.place" + }, + "block.grass.step": { + "sounds": [ + "step/grass1", + "step/grass2", + "step/grass3", + "step/grass4", + "step/grass5", + "step/grass6" + ], + "subtitle": "subtitles.block.generic.footsteps" + }, + "block.gravel.break": { + "sounds": [ + "dig/gravel1", + "dig/gravel2", + "dig/gravel3", + "dig/gravel4" + ], + "subtitle": "subtitles.block.generic.break" + }, + "block.gravel.fall": { + "sounds": [ + "step/gravel1", + "step/gravel2", + "step/gravel3", + "step/gravel4" + ], + "subtitle": "subtitles.block.generic.fall" + }, + "block.gravel.hit": { + "sounds": [ + "step/gravel1", + "step/gravel2", + "step/gravel3", + "step/gravel4" + ], + "subtitle": "subtitles.block.generic.hit" + }, + "block.gravel.place": { + "sounds": [ + "dig/gravel1", + "dig/gravel2", + "dig/gravel3", + "dig/gravel4" + ], + "subtitle": "subtitles.block.generic.place" + }, + "block.gravel.step": { + "sounds": [ + "step/gravel1", + "step/gravel2", + "step/gravel3", + "step/gravel4" + ], + "subtitle": "subtitles.block.generic.footsteps" + }, + "block.grindstone.use": { + "sounds": [ + { + "name": "block/grindstone/grindstone1", + "volume": 0.5 + }, + { + "name": "block/grindstone/grindstone2", + "volume": 0.5 + }, + { + "name": "block/grindstone/grindstone3", + "volume": 0.5 + } + ], + "subtitle": "subtitles.block.grindstone.use" + }, + "block.growing_plant.crop": { + "sounds": [ + "mob/sheep/shear" + ], + "subtitle": "subtitles.block.growing_plant.crop" + }, + "block.hanging_roots.break": { + "sounds": [ + "block/hanging_roots/break1", + "block/hanging_roots/break2", + "block/hanging_roots/break3", + "block/hanging_roots/break4" + ], + "subtitle": "subtitles.block.generic.break" + }, + "block.hanging_roots.fall": { + "sounds": [ + "block/hanging_roots/step1", + "block/hanging_roots/step2", + "block/hanging_roots/step3", + "block/hanging_roots/step4", + "block/hanging_roots/step5", + "block/hanging_roots/step6" + ], + "subtitle": "subtitles.block.generic.fall" + }, + "block.hanging_roots.hit": { + "sounds": [ + "block/hanging_roots/step1", + "block/hanging_roots/step2", + "block/hanging_roots/step3", + "block/hanging_roots/step4", + "block/hanging_roots/step5", + "block/hanging_roots/step6" + ], + "subtitle": "subtitles.block.generic.hit" + }, + "block.hanging_roots.place": { + "sounds": [ + "block/hanging_roots/break1", + "block/hanging_roots/break2", + "block/hanging_roots/break3", + "block/hanging_roots/break4" + ], + "subtitle": "subtitles.block.generic.place" + }, + "block.hanging_roots.step": { + "sounds": [ + "block/hanging_roots/step1", + "block/hanging_roots/step2", + "block/hanging_roots/step3", + "block/hanging_roots/step4", + "block/hanging_roots/step5", + "block/hanging_roots/step6" + ], + "subtitle": "subtitles.block.generic.footsteps" + }, + "block.hanging_sign.break": { + "sounds": [ + "block/hanging_sign/break1", + "block/hanging_sign/break2", + "block/hanging_sign/break3", + "block/hanging_sign/break4" + ], + "subtitle": "subtitles.block.generic.break" + }, + "block.hanging_sign.fall": { + "sounds": [ + "block/hanging_sign/step1", + "block/hanging_sign/step2", + "block/hanging_sign/step3", + "block/hanging_sign/step4" + ], + "subtitle": "subtitles.block.generic.fall" + }, + "block.hanging_sign.hit": { + "sounds": [ + "block/hanging_sign/step1", + "block/hanging_sign/step2", + "block/hanging_sign/step3", + "block/hanging_sign/step4" + ], + "subtitle": "subtitles.block.generic.hit" + }, + "block.hanging_sign.place": { + "sounds": [ + "block/hanging_sign/break1", + "block/hanging_sign/break2", + "block/hanging_sign/break3", + "block/hanging_sign/break4" + ], + "subtitle": "subtitles.block.generic.place" + }, + "block.hanging_sign.step": { + "sounds": [ + "block/hanging_sign/step1", + "block/hanging_sign/step2", + "block/hanging_sign/step3", + "block/hanging_sign/step4" + ], + "subtitle": "subtitles.block.generic.footsteps" + }, + "block.hanging_sign.waxed_interact_fail": { + "sounds": [ + { + "name": "block.sign.waxed_interact_fail", + "type": "event" + } + ], + "subtitle": "subtitles.block.hanging_sign.waxed_interact_fail" + }, + "block.heavy_core.break": { + "sounds": [ + "block/heavy_core/break1", + "block/heavy_core/break2", + "block/heavy_core/break3", + "block/heavy_core/break4" + ], + "subtitle": "subtitles.block.generic.break" + }, + "block.heavy_core.fall": { + "sounds": [ + "block/heavy_core/step1", + "block/heavy_core/step2", + "block/heavy_core/step3", + "block/heavy_core/step4" + ], + "subtitle": "subtitles.block.generic.fall" + }, + "block.heavy_core.hit": { + "sounds": [ + "block/heavy_core/step1", + "block/heavy_core/step2", + "block/heavy_core/step3", + "block/heavy_core/step4" + ], + "subtitle": "subtitles.block.generic.hit" + }, + "block.heavy_core.place": { + "sounds": [ + "block/heavy_core/break1", + "block/heavy_core/break2", + "block/heavy_core/break3", + "block/heavy_core/break4" + ], + "subtitle": "subtitles.block.generic.place" + }, + "block.heavy_core.step": { + "sounds": [ + "block/heavy_core/step1", + "block/heavy_core/step2", + "block/heavy_core/step3", + "block/heavy_core/step4" + ], + "subtitle": "subtitles.block.generic.footsteps" + }, + "block.honey_block.break": { + "sounds": [ + "block/honeyblock/break1", + "block/honeyblock/break2", + "block/honeyblock/break3", + "block/honeyblock/break4", + "block/honeyblock/break5" + ], + "subtitle": "subtitles.block.generic.break" + }, + "block.honey_block.fall": { + "sounds": [ + "block/honeyblock/step1", + "block/honeyblock/step2", + "block/honeyblock/step3", + "block/honeyblock/step4", + "block/honeyblock/step5" + ], + "subtitle": "subtitles.block.generic.fall" + }, + "block.honey_block.hit": { + "sounds": [ + "block/honeyblock/step1", + "block/honeyblock/step2", + "block/honeyblock/step3", + "block/honeyblock/step4", + "block/honeyblock/step5" + ], + "subtitle": "subtitles.block.generic.hit" + }, + "block.honey_block.place": { + "sounds": [ + "block/honeyblock/break1", + "block/honeyblock/break2", + "block/honeyblock/break3", + "block/honeyblock/break4", + "block/honeyblock/break5" + ], + "subtitle": "subtitles.block.generic.place" + }, + "block.honey_block.slide": { + "sounds": [ + { + "name": "block/honeyblock/slide1", + "volume": 0.8 + }, + { + "name": "block/honeyblock/slide1", + "pitch": 0.9, + "volume": 0.8 + }, + { + "name": "block/honeyblock/slide2", + "volume": 0.8 + }, + { + "name": "block/honeyblock/slide2", + "pitch": 0.8, + "volume": 0.8 + }, + { + "name": "block/honeyblock/slide3", + "volume": 0.8 + }, + { + "name": "block/honeyblock/slide3", + "pitch": 0.8, + "volume": 0.8 + }, + { + "name": "block/honeyblock/slide4", + "volume": 0.8 + }, + { + "name": "block/honeyblock/slide4", + "pitch": 0.8, + "volume": 0.8 + } + ], + "subtitle": "subtitles.block.honey_block.slide" + }, + "block.honey_block.step": { + "sounds": [ + "block/honeyblock/step1", + "block/honeyblock/step2", + "block/honeyblock/step3", + "block/honeyblock/step4", + "block/honeyblock/step5" + ], + "subtitle": "subtitles.block.generic.footsteps" + }, + "block.iron_door.close": { + "sounds": [ + { + "name": "block/iron_door/close1", + "volume": 0.9 + }, + { + "name": "block/iron_door/close2", + "volume": 0.9 + }, + { + "name": "block/iron_door/close3", + "volume": 0.9 + }, + { + "name": "block/iron_door/close4", + "volume": 0.9 + } + ], + "subtitle": "subtitles.block.door.toggle" + }, + "block.iron_door.open": { + "sounds": [ + { + "name": "block/iron_door/open1", + "volume": 0.9 + }, + { + "name": "block/iron_door/open2", + "volume": 0.9 + }, + { + "name": "block/iron_door/open3", + "volume": 0.9 + }, + { + "name": "block/iron_door/open4", + "volume": 0.9 + } + ], + "subtitle": "subtitles.block.door.toggle" + }, + "block.iron_trapdoor.close": { + "sounds": [ + { + "name": "block/iron_trapdoor/close1", + "volume": 0.9 + }, + { + "name": "block/iron_trapdoor/close2", + "volume": 0.9 + }, + { + "name": "block/iron_trapdoor/close3", + "volume": 0.9 + }, + { + "name": "block/iron_trapdoor/close4", + "volume": 0.9 + } + ], + "subtitle": "subtitles.block.iron_trapdoor.close" + }, + "block.iron_trapdoor.open": { + "sounds": [ + { + "name": "block/iron_trapdoor/open1", + "volume": 0.9 + }, + { + "name": "block/iron_trapdoor/open2", + "volume": 0.9 + }, + { + "name": "block/iron_trapdoor/open3", + "volume": 0.9 + }, + { + "name": "block/iron_trapdoor/open4", + "volume": 0.9 + } + ], + "subtitle": "subtitles.block.iron_trapdoor.open" + }, + "block.ladder.break": { + "sounds": [ + "dig/wood1", + "dig/wood2", + "dig/wood3", + "dig/wood4" + ], + "subtitle": "subtitles.block.generic.break" + }, + "block.ladder.fall": { + "sounds": [ + "step/ladder1", + "step/ladder2", + "step/ladder3", + "step/ladder4", + "step/ladder5" + ], + "subtitle": "subtitles.block.generic.fall" + }, + "block.ladder.hit": { + "sounds": [ + "step/ladder1", + "step/ladder2", + "step/ladder3", + "step/ladder4", + "step/ladder5" + ], + "subtitle": "subtitles.block.generic.hit" + }, + "block.ladder.place": { + "sounds": [ + "dig/wood1", + "dig/wood2", + "dig/wood3", + "dig/wood4" + ], + "subtitle": "subtitles.block.generic.place" + }, + "block.ladder.step": { + "sounds": [ + "step/ladder1", + "step/ladder2", + "step/ladder3", + "step/ladder4", + "step/ladder5" + ], + "subtitle": "subtitles.block.generic.footsteps" + }, + "block.lantern.break": { + "sounds": [ + "block/lantern/break1", + "block/lantern/break2", + "block/lantern/break3", + "block/lantern/break4", + "block/lantern/break5", + "block/lantern/break6" + ], + "subtitle": "subtitles.block.generic.break" + }, + "block.lantern.fall": { + "sounds": [ + "block/lantern/break1", + "block/lantern/break2", + "block/lantern/break3", + "block/lantern/break4", + "block/lantern/break5", + "block/lantern/break6" + ], + "subtitle": "subtitles.block.generic.fall" + }, + "block.lantern.hit": { + "sounds": [ + "block/lantern/place1", + "block/lantern/place2", + "block/lantern/place3", + "block/lantern/place4", + "block/lantern/place5", + "block/lantern/place6" + ], + "subtitle": "subtitles.block.generic.hit" + }, + "block.lantern.place": { + "sounds": [ + { + "name": "block/lantern/place1", + "pitch": 1.1 + }, + { + "name": "block/lantern/place2", + "pitch": 1.1 + }, + { + "name": "block/lantern/place3", + "pitch": 1.1 + }, + { + "name": "block/lantern/place4", + "pitch": 1.1 + }, + { + "name": "block/lantern/place5", + "pitch": 1.1 + }, + { + "name": "block/lantern/place6", + "pitch": 1.1 + } + ], + "subtitle": "subtitles.block.generic.place" + }, + "block.lantern.step": { + "sounds": [ + "block/lantern/break1", + "block/lantern/break2", + "block/lantern/break3", + "block/lantern/break4", + "block/lantern/break5", + "block/lantern/break6" + ], + "subtitle": "subtitles.block.generic.footsteps" + }, + "block.large_amethyst_bud.break": { + "sounds": [ + { + "name": "block/amethyst_cluster/break1", + "pitch": 0.85, + "volume": 0.7 + }, + { + "name": "block/amethyst_cluster/break2", + "pitch": 0.85, + "volume": 0.7 + }, + { + "name": "block/amethyst_cluster/break3", + "pitch": 0.85, + "volume": 0.7 + }, + { + "name": "block/amethyst_cluster/break4", + "pitch": 0.85, + "volume": 0.7 + } + ], + "subtitle": "subtitles.block.generic.break" + }, + "block.large_amethyst_bud.place": { + "sounds": [ + { + "name": "block/amethyst_cluster/place1", + "volume": 0.75 + }, + { + "name": "block/amethyst_cluster/place2", + "volume": 0.75 + }, + { + "name": "block/amethyst_cluster/place3", + "volume": 0.75 + }, + { + "name": "block/amethyst_cluster/place4", + "volume": 0.75 + } + ], + "subtitle": "subtitles.block.generic.place" + }, + "block.lava.ambient": { + "sounds": [ + "liquid/lava" + ], + "subtitle": "subtitles.block.lava.ambient" + }, + "block.lava.extinguish": { + "sounds": [ + "random/fizz" + ], + "subtitle": "subtitles.block.lava.extinguish" + }, + "block.lava.pop": { + "sounds": [ + "liquid/lavapop" + ], + "subtitle": "subtitles.block.lava.ambient" + }, + "block.lever.click": { + "sounds": [ + "random/click" + ], + "subtitle": "subtitles.block.lever.click" + }, + "block.lily_pad.place": { + "sounds": [ + "block/waterlily/place1", + "block/waterlily/place2", + "block/waterlily/place3", + "block/waterlily/place4" + ], + "subtitle": "subtitles.block.generic.place" + }, + "block.lodestone.break": { + "sounds": [ + "dig/stone1", + "dig/stone2", + "dig/stone3", + "dig/stone4" + ], + "subtitle": "subtitles.block.generic.break" + }, + "block.lodestone.fall": { + "sounds": [ + "step/stone1", + "step/stone2", + "step/stone3", + "step/stone4", + "step/stone5", + "step/stone6" + ], + "subtitle": "subtitles.block.generic.fall" + }, + "block.lodestone.hit": { + "sounds": [ + "step/stone1", + "step/stone2", + "step/stone3", + "step/stone4", + "step/stone5", + "step/stone6" + ], + "subtitle": "subtitles.block.generic.hit" + }, + "block.lodestone.place": { + "sounds": [ + "block/lodestone/place1", + "block/lodestone/place2", + "block/lodestone/place3", + "block/lodestone/place4" + ], + "subtitle": "subtitles.block.generic.place" + }, + "block.lodestone.step": { + "sounds": [ + "step/stone1", + "step/stone2", + "step/stone3", + "step/stone4", + "step/stone5", + "step/stone6" + ] + }, + "block.mangrove_roots.break": { + "sounds": [ + { + "name": "block/mangrove_roots/break1", + "pitch": 1.2, + "volume": 0.25 + }, + { + "name": "block/mangrove_roots/break2", + "pitch": 1.2, + "volume": 0.25 + }, + { + "name": "block/mangrove_roots/break3", + "pitch": 1.2, + "volume": 0.25 + }, + { + "name": "block/mangrove_roots/break4", + "pitch": 1.2, + "volume": 0.25 + }, + { + "name": "block/mangrove_roots/break5", + "pitch": 1.2, + "volume": 0.25 + }, + { + "name": "block/mangrove_roots/break6", + "pitch": 1.2, + "volume": 0.25 + } + ], + "subtitle": "subtitles.block.generic.break" + }, + "block.mangrove_roots.fall": { + "sounds": [ + { + "name": "block/mangrove_roots/step1", + "volume": 0.25 + }, + { + "name": "block/mangrove_roots/step2", + "volume": 0.25 + }, + { + "name": "block/mangrove_roots/step3", + "volume": 0.25 + }, + { + "name": "block/mangrove_roots/step4", + "volume": 0.25 + }, + { + "name": "block/mangrove_roots/step5", + "volume": 0.25 + }, + { + "name": "block/mangrove_roots/step6", + "volume": 0.25 + } + ], + "subtitle": "subtitles.block.generic.fall" + }, + "block.mangrove_roots.hit": { + "sounds": [ + { + "name": "block/mangrove_roots/step1", + "volume": 0.25 + }, + { + "name": "block/mangrove_roots/step2", + "volume": 0.25 + }, + { + "name": "block/mangrove_roots/step3", + "volume": 0.25 + }, + { + "name": "block/mangrove_roots/step4", + "volume": 0.25 + }, + { + "name": "block/mangrove_roots/step5", + "volume": 0.25 + }, + { + "name": "block/mangrove_roots/step6", + "volume": 0.25 + } + ], + "subtitle": "subtitles.block.generic.hit" + }, + "block.mangrove_roots.place": { + "sounds": [ + { + "name": "block/mangrove_roots/break1", + "pitch": 1.2, + "volume": 0.25 + }, + { + "name": "block/mangrove_roots/break2", + "pitch": 1.2, + "volume": 0.25 + }, + { + "name": "block/mangrove_roots/break3", + "pitch": 1.2, + "volume": 0.25 + }, + { + "name": "block/mangrove_roots/break4", + "pitch": 1.2, + "volume": 0.25 + }, + { + "name": "block/mangrove_roots/break5", + "pitch": 1.2, + "volume": 0.25 + }, + { + "name": "block/mangrove_roots/break6", + "pitch": 1.2, + "volume": 0.25 + } + ], + "subtitle": "subtitles.block.generic.place" + }, + "block.mangrove_roots.step": { + "sounds": [ + { + "name": "block/mangrove_roots/step1", + "volume": 0.25 + }, + { + "name": "block/mangrove_roots/step2", + "volume": 0.25 + }, + { + "name": "block/mangrove_roots/step3", + "volume": 0.25 + }, + { + "name": "block/mangrove_roots/step4", + "volume": 0.25 + }, + { + "name": "block/mangrove_roots/step5", + "volume": 0.25 + }, + { + "name": "block/mangrove_roots/step6", + "volume": 0.25 + } + ], + "subtitle": "subtitles.block.generic.footsteps" + }, + "block.medium_amethyst_bud.break": { + "sounds": [ + { + "name": "block/amethyst_cluster/break1", + "pitch": 0.95, + "volume": 0.55 + }, + { + "name": "block/amethyst_cluster/break2", + "pitch": 0.95, + "volume": 0.55 + }, + { + "name": "block/amethyst_cluster/break3", + "pitch": 0.95, + "volume": 0.55 + }, + { + "name": "block/amethyst_cluster/break4", + "pitch": 0.95, + "volume": 0.55 + } + ], + "subtitle": "subtitles.block.generic.break" + }, + "block.medium_amethyst_bud.place": { + "sounds": [ + { + "name": "block/amethyst_cluster/place1", + "pitch": 1.1, + "volume": 0.5 + }, + { + "name": "block/amethyst_cluster/place2", + "pitch": 1.1, + "volume": 0.5 + }, + { + "name": "block/amethyst_cluster/place3", + "pitch": 1.1, + "volume": 0.5 + }, + { + "name": "block/amethyst_cluster/place4", + "pitch": 1.1, + "volume": 0.5 + } + ], + "subtitle": "subtitles.block.generic.place" + }, + "block.metal.break": { + "sounds": [ + "dig/stone1", + "dig/stone2", + "dig/stone3", + "dig/stone4" + ], + "subtitle": "subtitles.block.generic.break" + }, + "block.metal.fall": { + "sounds": [ + "step/stone1", + "step/stone2", + "step/stone3", + "step/stone4", + "step/stone5", + "step/stone6" + ], + "subtitle": "subtitles.block.generic.fall" + }, + "block.metal.hit": { + "sounds": [ + "step/stone1", + "step/stone2", + "step/stone3", + "step/stone4", + "step/stone5", + "step/stone6" + ], + "subtitle": "subtitles.block.generic.hit" + }, + "block.metal.place": { + "sounds": [ + "dig/stone1", + "dig/stone2", + "dig/stone3", + "dig/stone4" + ], + "subtitle": "subtitles.block.generic.place" + }, + "block.metal.step": { + "sounds": [ + "step/stone1", + "step/stone2", + "step/stone3", + "step/stone4", + "step/stone5", + "step/stone6" + ], + "subtitle": "subtitles.block.generic.footsteps" + }, + "block.metal_pressure_plate.click_off": { + "sounds": [ + { + "name": "random/click", + "pitch": 0.65, + "volume": 0.3 + } + ], + "subtitle": "subtitles.block.pressure_plate.click" + }, + "block.metal_pressure_plate.click_on": { + "sounds": [ + { + "name": "random/click", + "pitch": 0.75, + "volume": 0.3 + } + ], + "subtitle": "subtitles.block.pressure_plate.click" + }, + "block.moss.break": { + "sounds": [ + { + "name": "block/moss/break1", + "volume": 0.95 + }, + { + "name": "block/moss/break2", + "volume": 0.93 + }, + { + "name": "block/moss/break3", + "volume": 0.93 + }, + { + "name": "block/moss/break4", + "volume": 0.93 + }, + { + "name": "block/moss/break5", + "volume": 0.93 + } + ], + "subtitle": "subtitles.block.generic.break" + }, + "block.moss.fall": { + "sounds": [ + "block/moss/step1", + "block/moss/step2", + "block/moss/step3", + "block/moss/step4", + "block/moss/step5", + "block/moss/step6" + ], + "subtitle": "subtitles.block.generic.fall" + }, + "block.moss.hit": { + "sounds": [ + "block/moss/step1", + "block/moss/step2", + "block/moss/step3", + "block/moss/step4", + "block/moss/step5", + "block/moss/step6" + ], + "subtitle": "subtitles.block.generic.hit" + }, + "block.moss.place": { + "sounds": [ + { + "name": "block/moss/break1", + "volume": 0.93 + }, + { + "name": "block/moss/break2", + "volume": 0.93 + }, + { + "name": "block/moss/break3", + "volume": 0.93 + }, + { + "name": "block/moss/break4", + "volume": 0.93 + }, + { + "name": "block/moss/break5", + "volume": 0.93 + } + ], + "subtitle": "subtitles.block.generic.place" + }, + "block.moss.step": { + "sounds": [ + "block/moss/step1", + "block/moss/step2", + "block/moss/step3", + "block/moss/step4", + "block/moss/step5", + "block/moss/step6" + ], + "subtitle": "subtitles.block.generic.footsteps" + }, + "block.moss_carpet.break": { + "sounds": [ + { + "name": "block/moss/break1", + "pitch": 1.1, + "volume": 0.9 + }, + { + "name": "block/moss/break2", + "pitch": 1.1, + "volume": 0.9 + }, + { + "name": "block/moss/break3", + "pitch": 1.1, + "volume": 0.9 + }, + { + "name": "block/moss/break4", + "pitch": 1.1, + "volume": 0.9 + }, + { + "name": "block/moss/break5", + "pitch": 1.1, + "volume": 0.9 + } + ], + "subtitle": "subtitles.block.generic.break" + }, + "block.moss_carpet.fall": { + "sounds": [ + { + "name": "block/moss/step1", + "pitch": 1.1, + "volume": 0.9 + }, + { + "name": "block/moss/step2", + "pitch": 1.1, + "volume": 0.9 + }, + { + "name": "block/moss/step3", + "pitch": 1.1, + "volume": 0.9 + }, + { + "name": "block/moss/step4", + "pitch": 1.1, + "volume": 0.9 + }, + { + "name": "block/moss/step5", + "pitch": 1.1, + "volume": 0.9 + }, + { + "name": "block/moss/step6", + "pitch": 1.1, + "volume": 0.9 + } + ], + "subtitle": "subtitles.block.generic.fall" + }, + "block.moss_carpet.hit": { + "sounds": [ + { + "name": "block/moss/step1", + "pitch": 1.1, + "volume": 0.9 + }, + { + "name": "block/moss/step2", + "pitch": 1.1, + "volume": 0.9 + }, + { + "name": "block/moss/step3", + "pitch": 1.1, + "volume": 0.9 + }, + { + "name": "block/moss/step4", + "pitch": 1.1, + "volume": 0.9 + }, + { + "name": "block/moss/step5", + "pitch": 1.1, + "volume": 0.9 + }, + { + "name": "block/moss/step6", + "pitch": 1.1, + "volume": 0.9 + } + ], + "subtitle": "subtitles.block.generic.hit" + }, + "block.moss_carpet.place": { + "sounds": [ + { + "name": "block/moss/break1", + "pitch": 1.1, + "volume": 0.9 + }, + { + "name": "block/moss/break2", + "pitch": 1.1, + "volume": 0.9 + }, + { + "name": "block/moss/break3", + "pitch": 1.1, + "volume": 0.9 + }, + { + "name": "block/moss/break4", + "pitch": 1.1, + "volume": 0.9 + }, + { + "name": "block/moss/break5", + "pitch": 1.1, + "volume": 0.9 + } + ], + "subtitle": "subtitles.block.generic.place" + }, + "block.moss_carpet.step": { + "sounds": [ + { + "name": "block/moss/step1", + "pitch": 1.1, + "volume": 0.9 + }, + { + "name": "block/moss/step2", + "pitch": 1.1, + "volume": 0.9 + }, + { + "name": "block/moss/step3", + "pitch": 1.1, + "volume": 0.9 + }, + { + "name": "block/moss/step4", + "pitch": 1.1, + "volume": 0.9 + }, + { + "name": "block/moss/step5", + "pitch": 1.1, + "volume": 0.9 + }, + { + "name": "block/moss/step6", + "pitch": 1.1, + "volume": 0.9 + } + ], + "subtitle": "subtitles.block.generic.footsteps" + }, + "block.mud.break": { + "sounds": [ + { + "name": "block/mud/break1", + "volume": 0.5 + }, + { + "name": "block/mud/break2", + "volume": 0.5 + }, + { + "name": "block/mud/break3", + "volume": 0.5 + }, + { + "name": "block/mud/break4", + "volume": 0.5 + }, + { + "name": "block/mud/break5", + "volume": 0.5 + }, + { + "name": "block/mud/break6", + "volume": 0.5 + } + ], + "subtitle": "subtitles.block.generic.break" + }, + "block.mud.fall": { + "sounds": [ + { + "name": "block/mud/step1", + "volume": 0.5 + }, + { + "name": "block/mud/step2", + "volume": 0.5 + }, + { + "name": "block/mud/step3", + "volume": 0.5 + }, + { + "name": "block/mud/step4", + "volume": 0.5 + }, + { + "name": "block/mud/step5", + "volume": 0.5 + }, + { + "name": "block/mud/step6", + "volume": 0.5 + } + ], + "subtitle": "subtitles.block.generic.fall" + }, + "block.mud.hit": { + "sounds": [ + { + "name": "block/mud/step1", + "volume": 0.5 + }, + { + "name": "block/mud/step2", + "volume": 0.5 + }, + { + "name": "block/mud/step3", + "volume": 0.5 + }, + { + "name": "block/mud/step4", + "volume": 0.5 + }, + { + "name": "block/mud/step5", + "volume": 0.5 + }, + { + "name": "block/mud/step6", + "volume": 0.5 + } + ], + "subtitle": "subtitles.block.generic.hit" + }, + "block.mud.place": { + "sounds": [ + { + "name": "block/mud/break1", + "volume": 0.5 + }, + { + "name": "block/mud/break2", + "volume": 0.5 + }, + { + "name": "block/mud/break3", + "volume": 0.5 + }, + { + "name": "block/mud/break4", + "volume": 0.5 + }, + { + "name": "block/mud/break5", + "volume": 0.5 + }, + { + "name": "block/mud/break6", + "volume": 0.5 + } + ], + "subtitle": "subtitles.block.generic.place" + }, + "block.mud.step": { + "sounds": [ + { + "name": "block/mud/step1", + "volume": 0.5 + }, + { + "name": "block/mud/step2", + "volume": 0.5 + }, + { + "name": "block/mud/step3", + "volume": 0.5 + }, + { + "name": "block/mud/step4", + "volume": 0.5 + }, + { + "name": "block/mud/step5", + "volume": 0.5 + }, + { + "name": "block/mud/step6", + "volume": 0.5 + } + ], + "subtitle": "subtitles.block.generic.footsteps" + }, + "block.mud_bricks.break": { + "sounds": [ + { + "name": "block/mud_bricks/break1", + "volume": 0.5 + }, + { + "name": "block/mud_bricks/break2", + "volume": 0.5 + }, + { + "name": "block/mud_bricks/break3", + "volume": 0.5 + }, + { + "name": "block/mud_bricks/break4", + "volume": 0.5 + }, + { + "name": "block/mud_bricks/break5", + "volume": 0.5 + }, + { + "name": "block/mud_bricks/break6", + "volume": 0.5 + } + ], + "subtitle": "subtitles.block.generic.break" + }, + "block.mud_bricks.fall": { + "sounds": [ + { + "name": "block/mud_bricks/step1", + "volume": 0.5 + }, + { + "name": "block/mud_bricks/step2", + "volume": 0.5 + }, + { + "name": "block/mud_bricks/step3", + "volume": 0.5 + }, + { + "name": "block/mud_bricks/step4", + "volume": 0.5 + }, + { + "name": "block/mud_bricks/step5", + "volume": 0.5 + }, + { + "name": "block/mud_bricks/step6", + "volume": 0.5 + } + ], + "subtitle": "subtitles.block.generic.fall" + }, + "block.mud_bricks.hit": { + "sounds": [ + { + "name": "block/mud_bricks/step1", + "volume": 0.5 + }, + { + "name": "block/mud_bricks/step2", + "volume": 0.5 + }, + { + "name": "block/mud_bricks/step3", + "volume": 0.5 + }, + { + "name": "block/mud_bricks/step4", + "volume": 0.5 + }, + { + "name": "block/mud_bricks/step5", + "volume": 0.5 + }, + { + "name": "block/mud_bricks/step6", + "volume": 0.5 + } + ], + "subtitle": "subtitles.block.generic.hit" + }, + "block.mud_bricks.place": { + "sounds": [ + { + "name": "block/mud_bricks/break1", + "volume": 0.5 + }, + { + "name": "block/mud_bricks/break2", + "volume": 0.5 + }, + { + "name": "block/mud_bricks/break3", + "volume": 0.5 + }, + { + "name": "block/mud_bricks/break4", + "volume": 0.5 + }, + { + "name": "block/mud_bricks/break5", + "volume": 0.5 + }, + { + "name": "block/mud_bricks/break6", + "volume": 0.5 + } + ], + "subtitle": "subtitles.block.generic.place" + }, + "block.mud_bricks.step": { + "sounds": [ + { + "name": "block/mud_bricks/step1", + "volume": 0.5 + }, + { + "name": "block/mud_bricks/step2", + "volume": 0.5 + }, + { + "name": "block/mud_bricks/step3", + "volume": 0.5 + }, + { + "name": "block/mud_bricks/step4", + "volume": 0.5 + }, + { + "name": "block/mud_bricks/step5", + "volume": 0.5 + }, + { + "name": "block/mud_bricks/step6", + "volume": 0.5 + } + ], + "subtitle": "subtitles.block.generic.footsteps" + }, + "block.muddy_mangrove_roots.break": { + "sounds": [ + { + "name": "block/muddy_mangrove_roots/break1", + "volume": 0.25 + }, + { + "name": "block/muddy_mangrove_roots/break2", + "volume": 0.25 + }, + { + "name": "block/muddy_mangrove_roots/break3", + "volume": 0.25 + }, + { + "name": "block/muddy_mangrove_roots/break4", + "volume": 0.25 + }, + { + "name": "block/muddy_mangrove_roots/break5", + "volume": 0.25 + }, + { + "name": "block/muddy_mangrove_roots/break6", + "volume": 0.25 + } + ], + "subtitle": "subtitles.block.generic.break" + }, + "block.muddy_mangrove_roots.fall": { + "sounds": [ + { + "name": "block/muddy_mangrove_roots/step1", + "volume": 0.25 + }, + { + "name": "block/muddy_mangrove_roots/step2", + "volume": 0.25 + }, + { + "name": "block/muddy_mangrove_roots/step3", + "volume": 0.25 + }, + { + "name": "block/muddy_mangrove_roots/step4", + "volume": 0.25 + }, + { + "name": "block/muddy_mangrove_roots/step5", + "volume": 0.25 + }, + { + "name": "block/muddy_mangrove_roots/step6", + "volume": 0.25 + } + ], + "subtitle": "subtitles.block.generic.fall" + }, + "block.muddy_mangrove_roots.hit": { + "sounds": [ + { + "name": "block/muddy_mangrove_roots/step1", + "volume": 0.25 + }, + { + "name": "block/muddy_mangrove_roots/step2", + "volume": 0.25 + }, + { + "name": "block/muddy_mangrove_roots/step3", + "volume": 0.25 + }, + { + "name": "block/muddy_mangrove_roots/step4", + "volume": 0.25 + }, + { + "name": "block/muddy_mangrove_roots/step5", + "volume": 0.25 + }, + { + "name": "block/muddy_mangrove_roots/step6", + "volume": 0.25 + } + ], + "subtitle": "subtitles.block.generic.hit" + }, + "block.muddy_mangrove_roots.place": { + "sounds": [ + { + "name": "block/muddy_mangrove_roots/break1", + "volume": 0.25 + }, + { + "name": "block/muddy_mangrove_roots/break2", + "volume": 0.25 + }, + { + "name": "block/muddy_mangrove_roots/break3", + "volume": 0.25 + }, + { + "name": "block/muddy_mangrove_roots/break4", + "volume": 0.25 + }, + { + "name": "block/muddy_mangrove_roots/break5", + "volume": 0.25 + }, + { + "name": "block/muddy_mangrove_roots/break6", + "volume": 0.25 + } + ], + "subtitle": "subtitles.block.generic.place" + }, + "block.muddy_mangrove_roots.step": { + "sounds": [ + { + "name": "block/muddy_mangrove_roots/step1", + "volume": 0.25 + }, + { + "name": "block/muddy_mangrove_roots/step2", + "volume": 0.25 + }, + { + "name": "block/muddy_mangrove_roots/step3", + "volume": 0.25 + }, + { + "name": "block/muddy_mangrove_roots/step4", + "volume": 0.25 + }, + { + "name": "block/muddy_mangrove_roots/step5", + "volume": 0.25 + }, + { + "name": "block/muddy_mangrove_roots/step6", + "volume": 0.25 + } + ], + "subtitle": "subtitles.block.generic.footsteps" + }, + "block.nether_bricks.break": { + "sounds": [ + { + "name": "block/nether_bricks/break1", + "volume": 0.8 + }, + { + "name": "block/nether_bricks/break2", + "volume": 0.8 + }, + { + "name": "block/nether_bricks/break3", + "volume": 0.8 + }, + { + "name": "block/nether_bricks/break4", + "volume": 0.8 + }, + { + "name": "block/nether_bricks/break5", + "volume": 0.8 + }, + { + "name": "block/nether_bricks/break6", + "volume": 0.8 + } + ], + "subtitle": "subtitles.block.generic.break" + }, + "block.nether_bricks.fall": { + "sounds": [ + "block/nether_bricks/step1", + "block/nether_bricks/step2", + "block/nether_bricks/step3", + "block/nether_bricks/step4", + "block/nether_bricks/step5", + "block/nether_bricks/step6" + ], + "subtitle": "subtitles.block.generic.fall" + }, + "block.nether_bricks.hit": { + "sounds": [ + "block/nether_bricks/step1", + "block/nether_bricks/step2", + "block/nether_bricks/step3", + "block/nether_bricks/step4", + "block/nether_bricks/step5", + "block/nether_bricks/step6" + ], + "subtitle": "subtitles.block.generic.hit" + }, + "block.nether_bricks.place": { + "sounds": [ + { + "name": "block/nether_bricks/break1", + "volume": 0.8 + }, + { + "name": "block/nether_bricks/break2", + "volume": 0.8 + }, + { + "name": "block/nether_bricks/break3", + "volume": 0.8 + }, + { + "name": "block/nether_bricks/break4", + "volume": 0.8 + }, + { + "name": "block/nether_bricks/break5", + "volume": 0.8 + }, + { + "name": "block/nether_bricks/break6", + "volume": 0.8 + } + ], + "subtitle": "subtitles.block.generic.place" + }, + "block.nether_bricks.step": { + "sounds": [ + "block/nether_bricks/step1", + "block/nether_bricks/step2", + "block/nether_bricks/step3", + "block/nether_bricks/step4", + "block/nether_bricks/step5", + "block/nether_bricks/step6" + ], + "subtitle": "subtitles.block.generic.footsteps" + }, + "block.nether_gold_ore.break": { + "sounds": [ + "block/nether_ore/break1", + "block/nether_ore/break2", + "block/nether_ore/break3", + "block/nether_ore/break4" + ], + "subtitle": "subtitles.block.generic.break" + }, + "block.nether_gold_ore.fall": { + "sounds": [ + "block/nether_ore/step1", + "block/nether_ore/step2", + "block/nether_ore/step3", + "block/nether_ore/step4", + "block/nether_ore/step5" + ], + "subtitle": "subtitles.block.generic.fall" + }, + "block.nether_gold_ore.hit": { + "sounds": [ + "block/nether_ore/step1", + "block/nether_ore/step2", + "block/nether_ore/step3", + "block/nether_ore/step4", + "block/nether_ore/step5" + ], + "subtitle": "subtitles.block.generic.hit" + }, + "block.nether_gold_ore.place": { + "sounds": [ + "block/nether_ore/break1", + "block/nether_ore/break2", + "block/nether_ore/break3", + "block/nether_ore/break4" + ], + "subtitle": "subtitles.block.generic.place" + }, + "block.nether_gold_ore.step": { + "sounds": [ + "block/nether_ore/step1", + "block/nether_ore/step2", + "block/nether_ore/step3", + "block/nether_ore/step4", + "block/nether_ore/step5" + ], + "subtitle": "subtitles.block.generic.footsteps" + }, + "block.nether_ore.break": { + "sounds": [ + "block/nether_ore/break1", + "block/nether_ore/break2", + "block/nether_ore/break3", + "block/nether_ore/break4" + ], + "subtitle": "subtitles.block.generic.break" + }, + "block.nether_ore.fall": { + "sounds": [ + "block/nether_ore/step1", + "block/nether_ore/step2", + "block/nether_ore/step3", + "block/nether_ore/step4", + "block/nether_ore/step5" + ], + "subtitle": "subtitles.block.generic.fall" + }, + "block.nether_ore.hit": { + "sounds": [ + "block/nether_ore/step1", + "block/nether_ore/step2", + "block/nether_ore/step3", + "block/nether_ore/step4", + "block/nether_ore/step5" + ], + "subtitle": "subtitles.block.generic.hit" + }, + "block.nether_ore.place": { + "sounds": [ + "block/nether_ore/break1", + "block/nether_ore/break2", + "block/nether_ore/break3", + "block/nether_ore/break4" + ], + "subtitle": "subtitles.block.generic.place" + }, + "block.nether_ore.step": { + "sounds": [ + "block/nether_ore/step1", + "block/nether_ore/step2", + "block/nether_ore/step3", + "block/nether_ore/step4", + "block/nether_ore/step5" + ], + "subtitle": "subtitles.block.generic.footsteps" + }, + "block.nether_sprouts.break": { + "sounds": [ + { + "name": "block/nether_sprouts/break1", + "volume": 0.7 + }, + { + "name": "block/nether_sprouts/break2", + "volume": 0.7 + }, + { + "name": "block/nether_sprouts/break3", + "volume": 0.7 + }, + { + "name": "block/nether_sprouts/break4", + "volume": 0.7 + } + ], + "subtitle": "subtitles.block.generic.break" + }, + "block.nether_sprouts.fall": { + "sounds": [ + "block/nether_sprouts/step1", + "block/nether_sprouts/step2", + "block/nether_sprouts/step3", + "block/nether_sprouts/step4", + "block/nether_sprouts/step5" + ], + "subtitle": "subtitles.block.generic.fall" + }, + "block.nether_sprouts.hit": { + "sounds": [ + "block/nether_sprouts/step1", + "block/nether_sprouts/step2", + "block/nether_sprouts/step3", + "block/nether_sprouts/step4", + "block/nether_sprouts/step5" + ], + "subtitle": "subtitles.block.generic.hit" + }, + "block.nether_sprouts.place": { + "sounds": [ + { + "name": "block/nether_sprouts/break1", + "volume": 0.7 + }, + { + "name": "block/nether_sprouts/break2", + "volume": 0.7 + }, + { + "name": "block/nether_sprouts/break3", + "volume": 0.7 + }, + { + "name": "block/nether_sprouts/break4", + "volume": 0.7 + } + ], + "subtitle": "subtitles.block.generic.place" + }, + "block.nether_sprouts.step": { + "sounds": [ + { + "name": "block/nether_sprouts/step1", + "volume": 0.5 + }, + { + "name": "block/nether_sprouts/step2", + "volume": 0.5 + }, + { + "name": "block/nether_sprouts/step3", + "volume": 0.5 + }, + { + "name": "block/nether_sprouts/step4", + "volume": 0.5 + }, + { + "name": "block/nether_sprouts/step5", + "volume": 0.5 + } + ], + "subtitle": "subtitles.block.generic.footsteps" + }, + "block.nether_wart.break": { + "sounds": [ + { + "name": "item/plant/netherwart1", + "pitch": 0.9, + "volume": 0.9 + }, + { + "name": "item/plant/netherwart2", + "pitch": 0.9, + "volume": 0.9 + }, + { + "name": "item/plant/netherwart3", + "pitch": 0.9, + "volume": 0.9 + }, + { + "name": "item/plant/netherwart4", + "pitch": 0.9, + "volume": 0.9 + }, + { + "name": "item/plant/netherwart5", + "pitch": 0.9, + "volume": 0.9 + }, + { + "name": "item/plant/netherwart6", + "pitch": 0.9, + "volume": 0.9 + } + ], + "subtitle": "subtitles.block.generic.break" + }, + "block.nether_wood.break": { + "sounds": [ + "block/nether_wood/break1", + "block/nether_wood/break2", + "block/nether_wood/break3", + "block/nether_wood/break4" + ], + "subtitle": "subtitles.block.generic.break" + }, + "block.nether_wood.fall": { + "sounds": [ + "block/nether_wood/step1", + "block/nether_wood/step2", + "block/nether_wood/step3", + "block/nether_wood/step4", + "block/nether_wood/step5" + ], + "subtitle": "subtitles.block.generic.fall" + }, + "block.nether_wood.hit": { + "sounds": [ + "block/nether_wood/step1", + "block/nether_wood/step2", + "block/nether_wood/step3", + "block/nether_wood/step4", + "block/nether_wood/step5" + ], + "subtitle": "subtitles.block.generic.hit" + }, + "block.nether_wood.place": { + "sounds": [ + "block/nether_wood/break1", + "block/nether_wood/break2", + "block/nether_wood/break3", + "block/nether_wood/break4" + ], + "subtitle": "subtitles.block.generic.place" + }, + "block.nether_wood.step": { + "sounds": [ + "block/nether_wood/step1", + "block/nether_wood/step2", + "block/nether_wood/step3", + "block/nether_wood/step4", + "block/nether_wood/step5" + ], + "subtitle": "subtitles.block.generic.footsteps" + }, + "block.nether_wood_button.click_off": { + "sounds": [ + { + "name": "block/nether_wood_button/nether_wood_button", + "pitch": 0.5, + "volume": 0.3 + } + ], + "subtitle": "subtitles.block.button.click" + }, + "block.nether_wood_button.click_on": { + "sounds": [ + { + "name": "block/nether_wood_button/nether_wood_button", + "pitch": 0.6, + "volume": 0.3 + } + ], + "subtitle": "subtitles.block.button.click" + }, + "block.nether_wood_door.close": { + "sounds": [ + "block/nether_wood_door/toggle1", + "block/nether_wood_door/toggle2", + "block/nether_wood_door/toggle3", + "block/nether_wood_door/toggle4" + ], + "subtitle": "subtitles.block.door.toggle" + }, + "block.nether_wood_door.open": { + "sounds": [ + "block/nether_wood_door/toggle1", + "block/nether_wood_door/toggle2", + "block/nether_wood_door/toggle3", + "block/nether_wood_door/toggle4" + ], + "subtitle": "subtitles.block.door.toggle" + }, + "block.nether_wood_fence_gate.close": { + "sounds": [ + "block/nether_wood_fence/toggle1", + "block/nether_wood_fence/toggle2", + "block/nether_wood_fence/toggle3", + "block/nether_wood_fence/toggle4" + ], + "subtitle": "subtitles.block.fence_gate.toggle" + }, + "block.nether_wood_fence_gate.open": { + "sounds": [ + "block/nether_wood_fence/toggle1", + "block/nether_wood_fence/toggle2", + "block/nether_wood_fence/toggle3", + "block/nether_wood_fence/toggle4" + ], + "subtitle": "subtitles.block.fence_gate.toggle" + }, + "block.nether_wood_hanging_sign.break": { + "sounds": [ + "block/nether_wood_hanging_sign/break1", + "block/nether_wood_hanging_sign/break2", + "block/nether_wood_hanging_sign/break3", + "block/nether_wood_hanging_sign/break4" + ], + "subtitle": "subtitles.block.generic.break" + }, + "block.nether_wood_hanging_sign.fall": { + "sounds": [ + "block/nether_wood_hanging_sign/step1", + "block/nether_wood_hanging_sign/step2", + "block/nether_wood_hanging_sign/step3", + "block/nether_wood_hanging_sign/step4" + ], + "subtitle": "subtitles.block.generic.fall" + }, + "block.nether_wood_hanging_sign.hit": { + "sounds": [ + { + "name": "block/nether_wood_hanging_sign/step1", + "volume": 0.8 + }, + { + "name": "block/nether_wood_hanging_sign/step2", + "volume": 0.8 + }, + { + "name": "block/nether_wood_hanging_sign/step3", + "volume": 0.8 + }, + { + "name": "block/nether_wood_hanging_sign/step4", + "volume": 0.8 + } + ], + "subtitle": "subtitles.block.generic.hit" + }, + "block.nether_wood_hanging_sign.place": { + "sounds": [ + "block/nether_wood_hanging_sign/break1", + "block/nether_wood_hanging_sign/break2", + "block/nether_wood_hanging_sign/break3", + "block/nether_wood_hanging_sign/break4" + ], + "subtitle": "subtitles.block.generic.place" + }, + "block.nether_wood_hanging_sign.step": { + "sounds": [ + "block/nether_wood_hanging_sign/step1", + "block/nether_wood_hanging_sign/step2", + "block/nether_wood_hanging_sign/step3", + "block/nether_wood_hanging_sign/step4" + ], + "subtitle": "subtitles.block.generic.footsteps" + }, + "block.nether_wood_pressure_plate.click_off": { + "sounds": [ + { + "name": "random/click", + "pitch": 0.7, + "volume": 0.3 + } + ], + "subtitle": "subtitles.block.pressure_plate.click" + }, + "block.nether_wood_pressure_plate.click_on": { + "sounds": [ + { + "name": "random/click", + "pitch": 0.8, + "volume": 0.3 + } + ], + "subtitle": "subtitles.block.pressure_plate.click" + }, + "block.nether_wood_trapdoor.close": { + "sounds": [ + "block/nether_wood_trapdoor/toggle1", + "block/nether_wood_trapdoor/toggle2", + "block/nether_wood_trapdoor/toggle3", + "block/nether_wood_trapdoor/toggle4" + ], + "subtitle": "subtitles.block.trapdoor.toggle" + }, + "block.nether_wood_trapdoor.open": { + "sounds": [ + "block/nether_wood_trapdoor/toggle1", + "block/nether_wood_trapdoor/toggle2", + "block/nether_wood_trapdoor/toggle3", + "block/nether_wood_trapdoor/toggle4" + ], + "subtitle": "subtitles.block.trapdoor.toggle" + }, + "block.netherite_block.break": { + "sounds": [ + { + "name": "block/netherite/break1", + "volume": 0.95 + }, + { + "name": "block/netherite/break1", + "pitch": 0.9, + "volume": 0.95 + }, + { + "name": "block/netherite/break2", + "volume": 0.95 + }, + { + "name": "block/netherite/break2", + "pitch": 0.9, + "volume": 0.95 + }, + { + "name": "block/netherite/break3", + "volume": 0.95 + }, + { + "name": "block/netherite/break3", + "pitch": 0.9, + "volume": 0.95 + }, + { + "name": "block/netherite/break4", + "volume": 0.95 + }, + { + "name": "block/netherite/break4", + "pitch": 0.9, + "volume": 0.95 + } + ], + "subtitle": "subtitles.block.generic.break" + }, + "block.netherite_block.fall": { + "sounds": [ + "block/netherite/step1", + "block/netherite/step2", + "block/netherite/step3", + "block/netherite/step4", + "block/netherite/step5", + "block/netherite/step6" + ], + "subtitle": "subtitles.block.generic.fall" + }, + "block.netherite_block.hit": { + "sounds": [ + "block/netherite/step1", + "block/netherite/step2", + "block/netherite/step3", + "block/netherite/step4", + "block/netherite/step5", + "block/netherite/step6" + ], + "subtitle": "subtitles.block.generic.hit" + }, + "block.netherite_block.place": { + "sounds": [ + { + "name": "block/netherite/break1", + "volume": 0.95 + }, + { + "name": "block/netherite/break1", + "pitch": 0.9, + "volume": 0.95 + }, + { + "name": "block/netherite/break2", + "volume": 0.95 + }, + { + "name": "block/netherite/break2", + "pitch": 0.9, + "volume": 0.95 + }, + { + "name": "block/netherite/break3", + "volume": 0.95 + }, + { + "name": "block/netherite/break3", + "pitch": 0.9, + "volume": 0.95 + }, + { + "name": "block/netherite/break4", + "volume": 0.95 + }, + { + "name": "block/netherite/break4", + "pitch": 0.9, + "volume": 0.95 + } + ], + "subtitle": "subtitles.block.generic.place" + }, + "block.netherite_block.step": { + "sounds": [ + "block/netherite/step1", + "block/netherite/step2", + "block/netherite/step3", + "block/netherite/step4", + "block/netherite/step5", + "block/netherite/step6" + ], + "subtitle": "subtitles.block.generic.footsteps" + }, + "block.netherrack.break": { + "sounds": [ + "block/netherrack/break1", + "block/netherrack/break2", + "block/netherrack/break3", + "block/netherrack/break4", + "block/netherrack/break5", + "block/netherrack/break6" + ], + "subtitle": "subtitles.block.generic.break" + }, + "block.netherrack.fall": { + "sounds": [ + "block/netherrack/step1", + "block/netherrack/step2", + "block/netherrack/step3", + "block/netherrack/step4", + "block/netherrack/step5", + "block/netherrack/step6" + ], + "subtitle": "subtitles.block.generic.fall" + }, + "block.netherrack.hit": { + "sounds": [ + { + "name": "block/netherrack/step1", + "volume": 0.55 + }, + { + "name": "block/netherrack/step2", + "volume": 0.55 + }, + { + "name": "block/netherrack/step3", + "volume": 0.55 + }, + { + "name": "block/netherrack/step4", + "volume": 0.55 + }, + { + "name": "block/netherrack/step5", + "volume": 0.55 + }, + { + "name": "block/netherrack/step6", + "volume": 0.55 + } + ], + "subtitle": "subtitles.block.generic.hit" + }, + "block.netherrack.place": { + "sounds": [ + "block/netherrack/break1", + "block/netherrack/break2", + "block/netherrack/break3", + "block/netherrack/break4", + "block/netherrack/break5", + "block/netherrack/break6" + ], + "subtitle": "subtitles.block.generic.place" + }, + "block.netherrack.step": { + "sounds": [ + "block/netherrack/step1", + "block/netherrack/step2", + "block/netherrack/step3", + "block/netherrack/step4", + "block/netherrack/step5", + "block/netherrack/step6" + ], + "subtitle": "subtitles.block.generic.footsteps" + }, + "block.note_block.banjo": { + "sounds": [ + "note/banjo" + ], + "subtitle": "subtitles.block.note_block.note" + }, + "block.note_block.basedrum": { + "sounds": [ + "note/bd" + ], + "subtitle": "subtitles.block.note_block.note" + }, + "block.note_block.bass": { + "sounds": [ + "note/bassattack" + ], + "subtitle": "subtitles.block.note_block.note" + }, + "block.note_block.bell": { + "sounds": [ + "note/bell" + ], + "subtitle": "subtitles.block.note_block.note" + }, + "block.note_block.bit": { + "sounds": [ + "note/bit" + ], + "subtitle": "subtitles.block.note_block.note" + }, + "block.note_block.chime": { + "sounds": [ + "note/icechime" + ], + "subtitle": "subtitles.block.note_block.note" + }, + "block.note_block.cow_bell": { + "sounds": [ + "note/cow_bell" + ], + "subtitle": "subtitles.block.note_block.note" + }, + "block.note_block.didgeridoo": { + "sounds": [ + "note/didgeridoo" + ], + "subtitle": "subtitles.block.note_block.note" + }, + "block.note_block.flute": { + "sounds": [ + "note/flute" + ], + "subtitle": "subtitles.block.note_block.note" + }, + "block.note_block.guitar": { + "sounds": [ + "note/guitar" + ], + "subtitle": "subtitles.block.note_block.note" + }, + "block.note_block.harp": { + "sounds": [ + "note/harp2" + ], + "subtitle": "subtitles.block.note_block.note" + }, + "block.note_block.hat": { + "sounds": [ + "note/hat" + ], + "subtitle": "subtitles.block.note_block.note" + }, + "block.note_block.imitate.creeper": { + "sounds": [ + { + "name": "entity.creeper.primed", + "pitch": 0.5, + "type": "event" + } + ], + "subtitle": "subtitles.entity.creeper.primed" + }, + "block.note_block.imitate.ender_dragon": { + "sounds": [ + { + "name": "entity.ender_dragon.ambient", + "type": "event" + } + ], + "subtitle": "subtitles.entity.ender_dragon.ambient" + }, + "block.note_block.imitate.piglin": { + "sounds": [ + { + "name": "entity.piglin.ambient", + "type": "event" + } + ], + "subtitle": "subtitles.entity.piglin.ambient" + }, + "block.note_block.imitate.skeleton": { + "sounds": [ + { + "name": "entity.skeleton.ambient", + "type": "event" + } + ], + "subtitle": "subtitles.entity.skeleton.ambient" + }, + "block.note_block.imitate.wither_skeleton": { + "sounds": [ + { + "name": "entity.wither_skeleton.ambient", + "type": "event" + } + ], + "subtitle": "subtitles.entity.wither_skeleton.ambient" + }, + "block.note_block.imitate.zombie": { + "sounds": [ + { + "name": "entity.zombie.ambient", + "type": "event" + } + ], + "subtitle": "subtitles.entity.zombie.ambient" + }, + "block.note_block.iron_xylophone": { + "sounds": [ + "note/iron_xylophone" + ], + "subtitle": "subtitles.block.note_block.note" + }, + "block.note_block.pling": { + "sounds": [ + "note/pling" + ], + "subtitle": "subtitles.block.note_block.note" + }, + "block.note_block.snare": { + "sounds": [ + "note/snare" + ], + "subtitle": "subtitles.block.note_block.note" + }, + "block.note_block.xylophone": { + "sounds": [ + "note/xylobone" + ], + "subtitle": "subtitles.block.note_block.note" + }, + "block.nylium.break": { + "sounds": [ + { + "name": "block/nylium/break1", + "volume": 0.85 + }, + { + "name": "block/nylium/break2", + "volume": 0.85 + }, + { + "name": "block/nylium/break3", + "volume": 0.85 + }, + { + "name": "block/nylium/break4", + "volume": 0.85 + }, + { + "name": "block/nylium/break5", + "volume": 0.85 + }, + { + "name": "block/nylium/break6", + "volume": 0.85 + } + ], + "subtitle": "subtitles.block.generic.break" + }, + "block.nylium.fall": { + "sounds": [ + "block/nylium/step1", + "block/nylium/step2", + "block/nylium/step3", + "block/nylium/step4", + "block/nylium/step5", + "block/nylium/step6" + ], + "subtitle": "subtitles.block.generic.fall" + }, + "block.nylium.hit": { + "sounds": [ + "block/nylium/step1", + "block/nylium/step2", + "block/nylium/step3", + "block/nylium/step4", + "block/nylium/step5", + "block/nylium/step6" + ], + "subtitle": "subtitles.block.generic.hit" + }, + "block.nylium.place": { + "sounds": [ + { + "name": "block/nylium/break1", + "volume": 0.85 + }, + { + "name": "block/nylium/break2", + "volume": 0.85 + }, + { + "name": "block/nylium/break3", + "volume": 0.85 + }, + { + "name": "block/nylium/break4", + "volume": 0.85 + }, + { + "name": "block/nylium/break5", + "volume": 0.85 + }, + { + "name": "block/nylium/break6", + "volume": 0.85 + } + ], + "subtitle": "subtitles.block.generic.place" + }, + "block.nylium.step": { + "sounds": [ + "block/nylium/step1", + "block/nylium/step2", + "block/nylium/step3", + "block/nylium/step4", + "block/nylium/step5", + "block/nylium/step6" + ], + "subtitle": "subtitles.block.generic.footsteps" + }, + "block.packed_mud.break": { + "sounds": [ + { + "name": "block/packed_mud/break1", + "volume": 0.3 + }, + { + "name": "block/packed_mud/break2", + "volume": 0.3 + }, + { + "name": "block/packed_mud/break3", + "volume": 0.3 + }, + { + "name": "block/packed_mud/break4", + "volume": 0.3 + }, + { + "name": "block/packed_mud/break5", + "volume": 0.3 + }, + { + "name": "block/packed_mud/break6", + "volume": 0.3 + } + ], + "subtitle": "subtitles.block.generic.break" + }, + "block.packed_mud.fall": { + "sounds": [ + { + "name": "block/packed_mud/step1", + "volume": 0.3 + }, + { + "name": "block/packed_mud/step2", + "volume": 0.3 + }, + { + "name": "block/packed_mud/step3", + "volume": 0.3 + }, + { + "name": "block/packed_mud/step4", + "volume": 0.3 + }, + { + "name": "block/packed_mud/step5", + "volume": 0.3 + }, + { + "name": "block/packed_mud/step6", + "volume": 0.3 + } + ], + "subtitle": "subtitles.block.generic.fall" + }, + "block.packed_mud.hit": { + "sounds": [ + { + "name": "block/packed_mud/step1", + "volume": 0.3 + }, + { + "name": "block/packed_mud/step2", + "volume": 0.3 + }, + { + "name": "block/packed_mud/step3", + "volume": 0.3 + }, + { + "name": "block/packed_mud/step4", + "volume": 0.3 + }, + { + "name": "block/packed_mud/step5", + "volume": 0.3 + }, + { + "name": "block/packed_mud/step6", + "volume": 0.3 + } + ], + "subtitle": "subtitles.block.generic.hit" + }, + "block.packed_mud.place": { + "sounds": [ + { + "name": "block/packed_mud/break1", + "volume": 0.3 + }, + { + "name": "block/packed_mud/break2", + "volume": 0.3 + }, + { + "name": "block/packed_mud/break3", + "volume": 0.3 + }, + { + "name": "block/packed_mud/break4", + "volume": 0.3 + }, + { + "name": "block/packed_mud/break5", + "volume": 0.3 + }, + { + "name": "block/packed_mud/break6", + "volume": 0.3 + } + ], + "subtitle": "subtitles.block.generic.place" + }, + "block.packed_mud.step": { + "sounds": [ + { + "name": "block/packed_mud/step1", + "pitch": 0.95, + "volume": 0.3 + }, + { + "name": "block/packed_mud/step2", + "pitch": 0.95, + "volume": 0.3 + }, + { + "name": "block/packed_mud/step3", + "pitch": 0.95, + "volume": 0.3 + }, + { + "name": "block/packed_mud/step4", + "pitch": 0.95, + "volume": 0.3 + }, + { + "name": "block/packed_mud/step5", + "pitch": 0.95, + "volume": 0.3 + }, + { + "name": "block/packed_mud/step6", + "pitch": 0.95, + "volume": 0.3 + } + ], + "subtitle": "subtitles.block.generic.footsteps" + }, + "block.pale_hanging_moss.idle": { + "sounds": [ + "block/pale_hanging_moss/pale_hanging_moss1", + "block/pale_hanging_moss/pale_hanging_moss2", + "block/pale_hanging_moss/pale_hanging_moss3", + "block/pale_hanging_moss/pale_hanging_moss4", + "block/pale_hanging_moss/pale_hanging_moss5", + "block/pale_hanging_moss/pale_hanging_moss6", + "block/pale_hanging_moss/pale_hanging_moss7", + "block/pale_hanging_moss/pale_hanging_moss8", + "block/pale_hanging_moss/pale_hanging_moss9", + "block/pale_hanging_moss/pale_hanging_moss10", + "block/pale_hanging_moss/pale_hanging_moss11", + "block/pale_hanging_moss/pale_hanging_moss12", + "block/pale_hanging_moss/pale_hanging_moss13", + "block/pale_hanging_moss/pale_hanging_moss14", + "block/pale_hanging_moss/pale_hanging_moss15" + ], + "subtitle": "subtitles.ambient.sound" + }, + "block.pink_petals.break": { + "sounds": [ + { + "name": "block/cherry_leaves/break1", + "pitch": 1.2, + "volume": 0.8 + }, + { + "name": "block/cherry_leaves/break2", + "pitch": 1.2, + "volume": 0.8 + }, + { + "name": "block/cherry_leaves/break3", + "pitch": 1.2, + "volume": 0.8 + }, + { + "name": "block/cherry_leaves/break4", + "pitch": 1.2, + "volume": 0.8 + }, + { + "name": "block/cherry_leaves/break5", + "pitch": 1.2, + "volume": 0.8 + } + ], + "subtitle": "subtitles.block.generic.break" + }, + "block.pink_petals.fall": { + "sounds": [ + { + "name": "block/cherry_leaves/step1", + "pitch": 1.2, + "volume": 0.8 + }, + { + "name": "block/cherry_leaves/step2", + "pitch": 1.2, + "volume": 0.8 + }, + { + "name": "block/cherry_leaves/step3", + "pitch": 1.2, + "volume": 0.8 + }, + { + "name": "block/cherry_leaves/step4", + "pitch": 1.2, + "volume": 0.8 + }, + { + "name": "block/cherry_leaves/step5", + "pitch": 1.2, + "volume": 0.8 + } + ], + "subtitle": "subtitles.block.generic.fall" + }, + "block.pink_petals.hit": { + "sounds": [ + { + "name": "block/cherry_leaves/step1", + "pitch": 1.2, + "volume": 0.8 + }, + { + "name": "block/cherry_leaves/step2", + "pitch": 1.2, + "volume": 0.8 + }, + { + "name": "block/cherry_leaves/step3", + "pitch": 1.2, + "volume": 0.8 + }, + { + "name": "block/cherry_leaves/step4", + "pitch": 1.2, + "volume": 0.8 + }, + { + "name": "block/cherry_leaves/step5", + "pitch": 1.2, + "volume": 0.8 + } + ], + "subtitle": "subtitles.block.generic.hit" + }, + "block.pink_petals.place": { + "sounds": [ + { + "name": "block/cherry_leaves/break1", + "pitch": 1.2, + "volume": 0.8 + }, + { + "name": "block/cherry_leaves/break2", + "pitch": 1.2, + "volume": 0.8 + }, + { + "name": "block/cherry_leaves/break3", + "pitch": 1.2, + "volume": 0.8 + }, + { + "name": "block/cherry_leaves/break4", + "pitch": 1.2, + "volume": 0.8 + }, + { + "name": "block/cherry_leaves/break5", + "pitch": 1.2, + "volume": 0.8 + } + ], + "subtitle": "subtitles.block.generic.place" + }, + "block.pink_petals.step": { + "sounds": [ + { + "name": "block/cherry_leaves/step1", + "pitch": 1.2, + "volume": 0.8 + }, + { + "name": "block/cherry_leaves/step2", + "pitch": 1.2, + "volume": 0.8 + }, + { + "name": "block/cherry_leaves/step3", + "pitch": 1.2, + "volume": 0.8 + }, + { + "name": "block/cherry_leaves/step4", + "pitch": 1.2, + "volume": 0.8 + }, + { + "name": "block/cherry_leaves/step5", + "pitch": 1.2, + "volume": 0.8 + } + ], + "subtitle": "subtitles.block.generic.footsteps" + }, + "block.piston.contract": { + "sounds": [ + { + "attenuation_distance": 8, + "name": "tile/piston/in" + } + ], + "subtitle": "subtitles.block.piston.move" + }, + "block.piston.extend": { + "sounds": [ + { + "attenuation_distance": 8, + "name": "tile/piston/out" + } + ], + "subtitle": "subtitles.block.piston.move" + }, + "block.pointed_dripstone.break": { + "sounds": [ + "block/dripstone/break1", + "block/dripstone/break2", + "block/dripstone/break3", + "block/dripstone/break4", + "block/dripstone/break5" + ], + "subtitle": "subtitles.block.generic.break" + }, + "block.pointed_dripstone.drip_lava": { + "sounds": [ + "block/pointed_dripstone/drip_lava1", + "block/pointed_dripstone/drip_lava2", + "block/pointed_dripstone/drip_lava3", + "block/pointed_dripstone/drip_lava4", + "block/pointed_dripstone/drip_lava5", + "block/pointed_dripstone/drip_lava6" + ], + "subtitle": "subtitles.block.pointed_dripstone.drip_lava" + }, + "block.pointed_dripstone.drip_lava_into_cauldron": { + "sounds": [ + "block/pointed_dripstone/drip_lava_cauldron1", + "block/pointed_dripstone/drip_lava_cauldron2", + "block/pointed_dripstone/drip_lava_cauldron3", + "block/pointed_dripstone/drip_lava_cauldron4" + ], + "subtitle": "subtitles.block.pointed_dripstone.drip_lava_into_cauldron" + }, + "block.pointed_dripstone.drip_water": { + "sounds": [ + "block/pointed_dripstone/drip_water1", + "block/pointed_dripstone/drip_water2", + "block/pointed_dripstone/drip_water3", + "block/pointed_dripstone/drip_water4", + "block/pointed_dripstone/drip_water5", + "block/pointed_dripstone/drip_water6", + "block/pointed_dripstone/drip_water7", + "block/pointed_dripstone/drip_water8", + "block/pointed_dripstone/drip_water9", + "block/pointed_dripstone/drip_water10", + "block/pointed_dripstone/drip_water11", + "block/pointed_dripstone/drip_water12", + "block/pointed_dripstone/drip_water13", + "block/pointed_dripstone/drip_water14", + "block/pointed_dripstone/drip_water15" + ], + "subtitle": "subtitles.block.pointed_dripstone.drip_water" + }, + "block.pointed_dripstone.drip_water_into_cauldron": { + "sounds": [ + "block/pointed_dripstone/drip_water_cauldron1", + "block/pointed_dripstone/drip_water_cauldron2", + "block/pointed_dripstone/drip_water_cauldron3", + "block/pointed_dripstone/drip_water_cauldron4", + "block/pointed_dripstone/drip_water_cauldron5", + "block/pointed_dripstone/drip_water_cauldron6", + "block/pointed_dripstone/drip_water_cauldron7", + "block/pointed_dripstone/drip_water_cauldron8" + ], + "subtitle": "subtitles.block.pointed_dripstone.drip_water_into_cauldron" + }, + "block.pointed_dripstone.fall": { + "sounds": [ + "block/dripstone/step1", + "block/dripstone/step2", + "block/dripstone/step3", + "block/dripstone/step4", + "block/dripstone/step5", + "block/dripstone/step6" + ], + "subtitle": "subtitles.block.generic.fall" + }, + "block.pointed_dripstone.hit": { + "sounds": [ + "block/dripstone/step1", + "block/dripstone/step2", + "block/dripstone/step3", + "block/dripstone/step4", + "block/dripstone/step5", + "block/dripstone/step6" + ], + "subtitle": "subtitles.block.generic.hit" + }, + "block.pointed_dripstone.land": { + "sounds": [ + "block/pointed_dripstone/land1", + "block/pointed_dripstone/land2", + "block/pointed_dripstone/land3", + "block/pointed_dripstone/land4", + "block/pointed_dripstone/land5" + ] + }, + "block.pointed_dripstone.place": { + "sounds": [ + "block/dripstone/break1", + "block/dripstone/break2", + "block/dripstone/break3", + "block/dripstone/break4", + "block/dripstone/break5" + ], + "subtitle": "subtitles.block.generic.place" + }, + "block.pointed_dripstone.step": { + "sounds": [ + "block/dripstone/step1", + "block/dripstone/step2", + "block/dripstone/step3", + "block/dripstone/step4", + "block/dripstone/step5", + "block/dripstone/step6" + ], + "subtitle": "subtitles.block.generic.footsteps" + }, + "block.polished_deepslate.break": { + "sounds": [ + "block/deepslate/break1", + "block/deepslate/break2", + "block/deepslate/break3", + "block/deepslate/break4" + ], + "subtitle": "subtitles.block.generic.break" + }, + "block.polished_deepslate.fall": { + "sounds": [ + "block/deepslate/step1", + "block/deepslate/step2", + "block/deepslate/step3", + "block/deepslate/step4", + "block/deepslate/step5", + "block/deepslate/step6" + ], + "subtitle": "subtitles.block.generic.fall" + }, + "block.polished_deepslate.hit": { + "sounds": [ + "block/deepslate/step1", + "block/deepslate/step2", + "block/deepslate/step3", + "block/deepslate/step4", + "block/deepslate/step5", + "block/deepslate/step6" + ], + "subtitle": "subtitles.block.generic.hit" + }, + "block.polished_deepslate.place": { + "sounds": [ + "block/deepslate/place1", + "block/deepslate/place2", + "block/deepslate/place3", + "block/deepslate/place4", + "block/deepslate/place5", + "block/deepslate/place6" + ], + "subtitle": "subtitles.block.generic.place" + }, + "block.polished_deepslate.step": { + "sounds": [ + "block/deepslate/step1", + "block/deepslate/step2", + "block/deepslate/step3", + "block/deepslate/step4", + "block/deepslate/step5", + "block/deepslate/step6" + ], + "subtitle": "subtitles.block.generic.footsteps" + }, + "block.polished_tuff.break": { + "sounds": [ + { + "name": "block/tuff/break1", + "pitch": 1.2 + }, + { + "name": "block/tuff/break2", + "pitch": 1.2 + }, + { + "name": "block/tuff/break3", + "pitch": 1.2 + }, + { + "name": "block/tuff/break4", + "pitch": 1.2 + }, + { + "name": "block/tuff/break5", + "pitch": 1.2 + } + ], + "subtitle": "subtitles.block.generic.break" + }, + "block.polished_tuff.fall": { + "sounds": [ + { + "name": "block/tuff/step1", + "pitch": 1.2 + }, + { + "name": "block/tuff/step2", + "pitch": 1.2 + }, + { + "name": "block/tuff/step3", + "pitch": 1.2 + }, + { + "name": "block/tuff/step4", + "pitch": 1.2 + }, + { + "name": "block/tuff/step5", + "pitch": 1.2 + }, + { + "name": "block/tuff/step6", + "pitch": 1.2 + } + ], + "subtitle": "subtitles.block.generic.fall" + }, + "block.polished_tuff.hit": { + "sounds": [ + { + "name": "block/tuff/step1", + "pitch": 1.2 + }, + { + "name": "block/tuff/step2", + "pitch": 1.2 + }, + { + "name": "block/tuff/step3", + "pitch": 1.2 + }, + { + "name": "block/tuff/step4", + "pitch": 1.2 + }, + { + "name": "block/tuff/step5", + "pitch": 1.2 + }, + { + "name": "block/tuff/step6", + "pitch": 1.2 + } + ], + "subtitle": "subtitles.block.generic.hit" + }, + "block.polished_tuff.place": { + "sounds": [ + { + "name": "block/tuff/break1", + "pitch": 1.2 + }, + { + "name": "block/tuff/break2", + "pitch": 1.2 + }, + { + "name": "block/tuff/break3", + "pitch": 1.2 + }, + { + "name": "block/tuff/break4", + "pitch": 1.2 + }, + { + "name": "block/tuff/break5", + "pitch": 1.2 + } + ], + "subtitle": "subtitles.block.generic.place" + }, + "block.polished_tuff.step": { + "sounds": [ + { + "name": "block/tuff/step1", + "pitch": 1.2 + }, + { + "name": "block/tuff/step2", + "pitch": 1.2 + }, + { + "name": "block/tuff/step3", + "pitch": 1.2 + }, + { + "name": "block/tuff/step4", + "pitch": 1.2 + }, + { + "name": "block/tuff/step5", + "pitch": 1.2 + }, + { + "name": "block/tuff/step6", + "pitch": 1.2 + } + ], + "subtitle": "subtitles.block.generic.footsteps" + }, + "block.portal.ambient": { + "sounds": [ + { + "attenuation_distance": 10, + "name": "portal/portal" + } + ], + "subtitle": "subtitles.block.portal.ambient" + }, + "block.portal.travel": { + "sounds": [ + "portal/travel" + ], + "subtitle": "subtitles.block.portal.travel" + }, + "block.portal.trigger": { + "sounds": [ + "portal/trigger" + ], + "subtitle": "subtitles.block.portal.trigger" + }, + "block.powder_snow.break": { + "sounds": [ + "block/powder_snow/break1", + "block/powder_snow/break2", + "block/powder_snow/break3", + "block/powder_snow/break4", + "block/powder_snow/break5", + "block/powder_snow/break6", + "block/powder_snow/break7" + ], + "subtitle": "subtitles.block.generic.break" + }, + "block.powder_snow.fall": { + "sounds": [ + "block/powder_snow/step1", + "block/powder_snow/step2", + "block/powder_snow/step3", + "block/powder_snow/step4", + "block/powder_snow/step5", + "block/powder_snow/step6", + "block/powder_snow/step7", + "block/powder_snow/step8", + "block/powder_snow/step9", + "block/powder_snow/step10" + ], + "subtitle": "subtitles.block.generic.fall" + }, + "block.powder_snow.hit": { + "sounds": [ + { + "name": "block/powder_snow/step1", + "pitch": 1.3, + "volume": 0.83 + }, + { + "name": "block/powder_snow/step2", + "pitch": 1.3, + "volume": 0.83 + }, + { + "name": "block/powder_snow/step3", + "pitch": 1.3, + "volume": 0.83 + }, + { + "name": "block/powder_snow/step4", + "pitch": 1.3, + "volume": 0.83 + }, + { + "name": "block/powder_snow/step5", + "pitch": 1.3, + "volume": 0.83 + }, + { + "name": "block/powder_snow/step6", + "pitch": 1.3, + "volume": 0.83 + }, + { + "name": "block/powder_snow/step7", + "pitch": 1.3, + "volume": 0.83 + }, + { + "name": "block/powder_snow/step8", + "pitch": 1.3, + "volume": 0.83 + }, + { + "name": "block/powder_snow/step9", + "pitch": 1.3, + "volume": 0.83 + }, + { + "name": "block/powder_snow/step10", + "pitch": 1.3, + "volume": 0.83 + } + ], + "subtitle": "subtitles.block.generic.hit" + }, + "block.powder_snow.place": { + "sounds": [ + "block/powder_snow/break1", + "block/powder_snow/break2", + "block/powder_snow/break3", + "block/powder_snow/break4", + "block/powder_snow/break5", + "block/powder_snow/break6", + "block/powder_snow/break7" + ], + "subtitle": "subtitles.block.generic.place" + }, + "block.powder_snow.step": { + "sounds": [ + "block/powder_snow/step1", + "block/powder_snow/step2", + "block/powder_snow/step3", + "block/powder_snow/step4", + "block/powder_snow/step5", + "block/powder_snow/step6", + "block/powder_snow/step7", + "block/powder_snow/step8", + "block/powder_snow/step9", + "block/powder_snow/step10" + ], + "subtitle": "subtitles.block.generic.footsteps" + }, + "block.pumpkin.carve": { + "sounds": [ + "block/pumpkin/carve1", + "block/pumpkin/carve2" + ], + "subtitle": "subtitles.block.pumpkin.carve" + }, + "block.redstone_torch.burnout": { + "sounds": [ + "random/fizz" + ], + "subtitle": "subtitles.block.redstone_torch.burnout" + }, + "block.resin.break": { + "sounds": [ + "block/resin/resin_break1", + "block/resin/resin_break2", + "block/resin/resin_break3", + "block/resin/resin_break4", + "block/resin/resin_break5" + ], + "subtitle": "subtitles.block.generic.break" + }, + "block.resin.fall": { + "sounds": [ + "block/resin/resin_fall" + ], + "subtitle": "subtitles.block.generic.fall" + }, + "block.resin.place": { + "sounds": [ + "block/resin/resin_place1", + "block/resin/resin_place2", + "block/resin/resin_place3", + "block/resin/resin_place4" + ], + "subtitle": "subtitles.block.generic.place" + }, + "block.resin.step": { + "sounds": [ + "block/resin/resin_step1", + "block/resin/resin_step2", + "block/resin/resin_step3", + "block/resin/resin_step4", + "block/resin/resin_step5" + ], + "subtitle": "subtitles.block.generic.footsteps" + }, + "block.resin_bricks.break": { + "sounds": [ + "block/resin_bricks/resin_brick_break" + ], + "subtitle": "subtitles.block.generic.break" + }, + "block.resin_bricks.fall": { + "sounds": [ + "block/resin_bricks/resin_brick_fall" + ], + "subtitle": "subtitles.block.generic.fall" + }, + "block.resin_bricks.hit": { + "sounds": [ + "block/resin_bricks/resin_brick_hit1", + "block/resin_bricks/resin_brick_hit2", + "block/resin_bricks/resin_brick_hit3", + "block/resin_bricks/resin_brick_hit4", + "block/resin_bricks/resin_brick_hit5" + ], + "subtitle": "subtitles.block.generic.hit" + }, + "block.resin_bricks.place": { + "sounds": [ + "block/resin_bricks/resin_brick_place1", + "block/resin_bricks/resin_brick_place2", + "block/resin_bricks/resin_brick_place3", + "block/resin_bricks/resin_brick_place4", + "block/resin_bricks/resin_brick_place5" + ], + "subtitle": "subtitles.block.generic.place" + }, + "block.resin_bricks.step": { + "sounds": [ + "block/resin_bricks/resin_brick_step1", + "block/resin_bricks/resin_brick_step2", + "block/resin_bricks/resin_brick_step3", + "block/resin_bricks/resin_brick_step4", + "block/resin_bricks/resin_brick_step5" + ], + "subtitle": "subtitles.block.generic.footsteps" + }, + "block.respawn_anchor.ambient": { + "sounds": [ + { + "attenuation_distance": 7, + "name": "block/respawn_anchor/ambient1" + }, + { + "attenuation_distance": 7, + "name": "block/respawn_anchor/ambient2" + }, + { + "attenuation_distance": 7, + "name": "block/respawn_anchor/ambient3" + } + ], + "subtitle": "subtitles.block.respawn_anchor.ambient" + }, + "block.respawn_anchor.charge": { + "sounds": [ + "block/respawn_anchor/charge1", + "block/respawn_anchor/charge2", + "block/respawn_anchor/charge3" + ], + "subtitle": "subtitles.block.respawn_anchor.charge" + }, + "block.respawn_anchor.deplete": { + "sounds": [ + "block/respawn_anchor/deplete1", + "block/respawn_anchor/deplete2" + ], + "subtitle": "subtitles.block.respawn_anchor.deplete" + }, + "block.respawn_anchor.set_spawn": { + "sounds": [ + "block/respawn_anchor/set_spawn1", + "block/respawn_anchor/set_spawn2", + "block/respawn_anchor/set_spawn3" + ], + "subtitle": "subtitles.block.respawn_anchor.set_spawn" + }, + "block.rooted_dirt.break": { + "sounds": [ + "block/rooted_dirt/break1", + "block/rooted_dirt/break2", + "block/rooted_dirt/break3", + "block/rooted_dirt/break4" + ], + "subtitle": "subtitles.block.generic.break" + }, + "block.rooted_dirt.fall": { + "sounds": [ + "block/rooted_dirt/step1", + "block/rooted_dirt/step2", + "block/rooted_dirt/step3", + "block/rooted_dirt/step4", + "block/rooted_dirt/step5", + "block/rooted_dirt/step6" + ], + "subtitle": "subtitles.block.generic.fall" + }, + "block.rooted_dirt.hit": { + "sounds": [ + { + "name": "block/rooted_dirt/step1", + "volume": 0.8 + }, + { + "name": "block/rooted_dirt/step2", + "volume": 0.8 + }, + { + "name": "block/rooted_dirt/step3", + "volume": 0.8 + }, + { + "name": "block/rooted_dirt/step4", + "volume": 0.8 + }, + { + "name": "block/rooted_dirt/step5", + "volume": 0.8 + }, + { + "name": "block/rooted_dirt/step6", + "volume": 0.8 + } + ], + "subtitle": "subtitles.block.generic.hit" + }, + "block.rooted_dirt.place": { + "sounds": [ + "block/rooted_dirt/break1", + "block/rooted_dirt/break2", + "block/rooted_dirt/break3", + "block/rooted_dirt/break4" + ], + "subtitle": "subtitles.block.generic.place" + }, + "block.rooted_dirt.step": { + "sounds": [ + "block/rooted_dirt/step1", + "block/rooted_dirt/step2", + "block/rooted_dirt/step3", + "block/rooted_dirt/step4", + "block/rooted_dirt/step5", + "block/rooted_dirt/step6" + ], + "subtitle": "subtitles.block.generic.footsteps" + }, + "block.roots.break": { + "sounds": [ + "block/roots/break1", + "block/roots/break2", + "block/roots/break3", + "block/roots/break4", + "block/roots/break5", + "block/roots/break6" + ], + "subtitle": "subtitles.block.generic.break" + }, + "block.roots.fall": { + "sounds": [ + "block/roots/step1", + "block/roots/step2", + "block/roots/step3", + "block/roots/step4", + "block/roots/step5" + ], + "subtitle": "subtitles.block.generic.fall" + }, + "block.roots.hit": { + "sounds": [ + "block/roots/step1", + "block/roots/step2", + "block/roots/step3", + "block/roots/step4", + "block/roots/step5" + ], + "subtitle": "subtitles.block.generic.hit" + }, + "block.roots.place": { + "sounds": [ + "block/roots/break1", + "block/roots/break2", + "block/roots/break3", + "block/roots/break4", + "block/roots/break5", + "block/roots/break6" + ], + "subtitle": "subtitles.block.generic.place" + }, + "block.roots.step": { + "sounds": [ + "block/roots/step1", + "block/roots/step2", + "block/roots/step3", + "block/roots/step4", + "block/roots/step5" + ], + "subtitle": "subtitles.block.generic.footsteps" + }, + "block.sand.break": { + "sounds": [ + "dig/sand1", + "dig/sand2", + "dig/sand3", + "dig/sand4" + ], + "subtitle": "subtitles.block.generic.break" + }, + "block.sand.fall": { + "sounds": [ + "step/sand1", + "step/sand2", + "step/sand3", + "step/sand4", + "step/sand5" + ], + "subtitle": "subtitles.block.generic.fall" + }, + "block.sand.hit": { + "sounds": [ + "step/sand1", + "step/sand2", + "step/sand3", + "step/sand4", + "step/sand5" + ], + "subtitle": "subtitles.block.generic.hit" + }, + "block.sand.place": { + "sounds": [ + "dig/sand1", + "dig/sand2", + "dig/sand3", + "dig/sand4" + ], + "subtitle": "subtitles.block.generic.place" + }, + "block.sand.step": { + "sounds": [ + "step/sand1", + "step/sand2", + "step/sand3", + "step/sand4", + "step/sand5" + ], + "subtitle": "subtitles.block.generic.footsteps" + }, + "block.scaffolding.break": { + "sounds": [ + { + "name": "block/scaffold/place1", + "pitch": 1.4, + "volume": 0.8 + }, + { + "name": "block/scaffold/place2", + "pitch": 1.4, + "volume": 0.8 + }, + { + "name": "block/scaffold/place3", + "pitch": 1.4, + "volume": 0.8 + }, + { + "name": "block/scaffold/place4", + "pitch": 1.4, + "volume": 0.8 + } + ], + "subtitle": "subtitles.block.generic.break" + }, + "block.scaffolding.fall": { + "sounds": [ + "step/scaffold1", + "step/scaffold2", + "step/scaffold3", + "step/scaffold4", + "step/scaffold5", + "step/scaffold6", + "step/scaffold7" + ], + "subtitle": "subtitles.block.generic.fall" + }, + "block.scaffolding.hit": { + "sounds": [ + "step/scaffold1", + "step/scaffold2", + "step/scaffold3", + "step/scaffold4", + "step/scaffold5", + "step/scaffold6", + "step/scaffold7" + ], + "subtitle": "subtitles.block.generic.hit" + }, + "block.scaffolding.place": { + "sounds": [ + { + "name": "block/scaffold/place1", + "volume": 0.9 + }, + { + "name": "block/scaffold/place2", + "volume": 0.9 + }, + { + "name": "block/scaffold/place3", + "volume": 0.9 + }, + { + "name": "block/scaffold/place4", + "volume": 0.9 + } + ], + "subtitle": "subtitles.block.generic.place" + }, + "block.scaffolding.step": { + "sounds": [ + "step/scaffold1", + "step/scaffold2", + "step/scaffold3", + "step/scaffold4", + "step/scaffold5", + "step/scaffold6", + "step/scaffold7" + ], + "subtitle": "subtitles.block.generic.footsteps" + }, + "block.sculk.break": { + "sounds": [ + "block/sculk/break1", + "block/sculk/break2", + "block/sculk/break3", + "block/sculk/break4", + "block/sculk/break5", + "block/sculk/break6", + "block/sculk/break7", + "block/sculk/break8", + "block/sculk/break9", + "block/sculk/break10", + "block/sculk/break11", + "block/sculk/break12", + "block/sculk/break13", + "block/sculk/break14" + ], + "subtitle": "subtitles.block.generic.break" + }, + "block.sculk.charge": { + "sounds": [ + "block/sculk/charge1", + "block/sculk/charge2", + "block/sculk/charge3", + "block/sculk/charge4", + "block/sculk/charge5" + ], + "subtitle": "subtitles.block.sculk.charge" + }, + "block.sculk.fall": { + "sounds": [ + "block/sculk/step1", + "block/sculk/step2", + "block/sculk/step3", + "block/sculk/step4", + "block/sculk/step5", + "block/sculk/step6" + ], + "subtitle": "subtitles.block.generic.fall" + }, + "block.sculk.hit": { + "sounds": [ + "block/sculk/step1", + "block/sculk/step2", + "block/sculk/step3", + "block/sculk/step4", + "block/sculk/step5", + "block/sculk/step6" + ], + "subtitle": "subtitles.block.generic.hit" + }, + "block.sculk.place": { + "sounds": [ + "block/sculk/place1", + "block/sculk/place2", + "block/sculk/place3", + "block/sculk/place4", + "block/sculk/place5" + ], + "subtitle": "subtitles.block.generic.place" + }, + "block.sculk.spread": { + "sounds": [ + { + "name": "block/sculk/spread1", + "pitch": 0.9 + }, + { + "name": "block/sculk/spread2", + "pitch": 0.9 + }, + { + "name": "block/sculk/spread3", + "pitch": 0.9 + }, + { + "name": "block/sculk/spread4", + "pitch": 0.9 + }, + { + "name": "block/sculk/spread5", + "pitch": 0.9 + } + ], + "subtitle": "subtitles.block.sculk.spread" + }, + "block.sculk.step": { + "sounds": [ + "block/sculk/step1", + "block/sculk/step2", + "block/sculk/step3", + "block/sculk/step4", + "block/sculk/step5", + "block/sculk/step6" + ], + "subtitle": "subtitles.block.generic.footsteps" + }, + "block.sculk_catalyst.bloom": { + "sounds": [ + { + "attenuation_distance": 12, + "name": "enchant/soulspeed/soulspeed1", + "volume": 0.25 + }, + { + "attenuation_distance": 12, + "name": "enchant/soulspeed/soulspeed2", + "volume": 0.25 + }, + { + "attenuation_distance": 12, + "name": "enchant/soulspeed/soulspeed3", + "volume": 0.25 + }, + { + "attenuation_distance": 12, + "name": "enchant/soulspeed/soulspeed4", + "volume": 0.25 + }, + { + "attenuation_distance": 12, + "name": "enchant/soulspeed/soulspeed5", + "volume": 0.25 + }, + { + "attenuation_distance": 12, + "name": "enchant/soulspeed/soulspeed6", + "volume": 0.25 + }, + { + "attenuation_distance": 12, + "name": "enchant/soulspeed/soulspeed7", + "volume": 0.25 + }, + { + "attenuation_distance": 12, + "name": "enchant/soulspeed/soulspeed8", + "volume": 0.25 + }, + { + "attenuation_distance": 12, + "name": "enchant/soulspeed/soulspeed9", + "volume": 0.25 + }, + { + "attenuation_distance": 12, + "name": "enchant/soulspeed/soulspeed10", + "volume": 0.25 + }, + { + "attenuation_distance": 12, + "name": "enchant/soulspeed/soulspeed11", + "volume": 0.25 + }, + { + "attenuation_distance": 12, + "name": "enchant/soulspeed/soulspeed12", + "volume": 0.25 + }, + { + "attenuation_distance": 12, + "name": "enchant/soulspeed/soulspeed13", + "volume": 0.25 + } + ], + "subtitle": "subtitles.block.sculk_catalyst.bloom" + }, + "block.sculk_catalyst.break": { + "sounds": [ + "block/sculk_catalyst/break1", + "block/sculk_catalyst/break2", + "block/sculk_catalyst/break3", + "block/sculk_catalyst/break4", + "block/sculk_catalyst/break5", + "block/sculk_catalyst/break6", + "block/sculk_catalyst/break7", + "block/sculk_catalyst/break8", + "block/sculk_catalyst/break9", + "block/sculk_catalyst/break10" + ], + "subtitle": "subtitles.block.generic.break" + }, + "block.sculk_catalyst.fall": { + "sounds": [ + "block/sculk_catalyst/step1", + "block/sculk_catalyst/step2", + "block/sculk_catalyst/step3", + "block/sculk_catalyst/step4", + "block/sculk_catalyst/step5", + "block/sculk_catalyst/step6" + ], + "subtitle": "subtitles.block.generic.fall" + }, + "block.sculk_catalyst.hit": { + "sounds": [ + "block/sculk_catalyst/step1", + "block/sculk_catalyst/step2", + "block/sculk_catalyst/step3", + "block/sculk_catalyst/step4", + "block/sculk_catalyst/step5", + "block/sculk_catalyst/step6" + ], + "subtitle": "subtitles.block.generic.hit" + }, + "block.sculk_catalyst.place": { + "sounds": [ + "block/sculk_catalyst/place1", + "block/sculk_catalyst/place2", + "block/sculk_catalyst/place3", + "block/sculk_catalyst/place4", + "block/sculk_catalyst/place5" + ], + "subtitle": "subtitles.block.generic.place" + }, + "block.sculk_catalyst.step": { + "sounds": [ + "block/sculk_catalyst/step1", + "block/sculk_catalyst/step2", + "block/sculk_catalyst/step3", + "block/sculk_catalyst/step4", + "block/sculk_catalyst/step5", + "block/sculk_catalyst/step6" + ], + "subtitle": "subtitles.block.generic.footsteps" + }, + "block.sculk_sensor.break": { + "sounds": [ + { + "name": "block/sculk_sensor/break1", + "pitch": 1.2, + "volume": 0.9 + }, + { + "name": "block/sculk_sensor/break2", + "pitch": 1.2, + "volume": 0.9 + }, + { + "name": "block/sculk_sensor/break3", + "pitch": 1.2, + "volume": 0.9 + }, + { + "name": "block/sculk_sensor/break4", + "pitch": 1.2, + "volume": 0.9 + }, + { + "name": "block/sculk_sensor/break5", + "pitch": 1.2, + "volume": 0.9 + } + ], + "subtitle": "subtitles.block.generic.break" + }, + "block.sculk_sensor.clicking": { + "sounds": [ + { + "name": "block/sculk_sensor/sculk_clicking1", + "volume": 0.73 + }, + { + "name": "block/sculk_sensor/sculk_clicking2", + "volume": 0.73 + }, + { + "name": "block/sculk_sensor/sculk_clicking3", + "volume": 0.73 + }, + { + "name": "block/sculk_sensor/sculk_clicking4", + "volume": 0.73 + }, + { + "name": "block/sculk_sensor/sculk_clicking5", + "volume": 0.73 + }, + { + "name": "block/sculk_sensor/sculk_clicking6", + "volume": 0.73 + } + ], + "subtitle": "subtitles.block.sculk_sensor.clicking" + }, + "block.sculk_sensor.clicking_stop": { + "sounds": [ + { + "name": "block/sculk_sensor/sculk_clicking_stop1", + "volume": 0.62 + }, + { + "name": "block/sculk_sensor/sculk_clicking_stop2", + "volume": 0.62 + }, + { + "name": "block/sculk_sensor/sculk_clicking_stop3", + "volume": 0.62 + }, + { + "name": "block/sculk_sensor/sculk_clicking_stop4", + "volume": 0.62 + }, + { + "name": "block/sculk_sensor/sculk_clicking_stop5", + "volume": 0.62 + } + ], + "subtitle": "subtitles.block.sculk_sensor.clicking_stop" + }, + "block.sculk_sensor.fall": { + "sounds": [ + "block/sculk/step1", + "block/sculk/step2", + "block/sculk/step3", + "block/sculk/step4", + "block/sculk/step5", + "block/sculk/step6" + ], + "subtitle": "subtitles.block.generic.fall" + }, + "block.sculk_sensor.hit": { + "sounds": [ + "block/sculk/step1", + "block/sculk/step2", + "block/sculk/step3", + "block/sculk/step4", + "block/sculk/step5", + "block/sculk/step6" + ], + "subtitle": "subtitles.block.generic.hit" + }, + "block.sculk_sensor.place": { + "sounds": [ + { + "name": "block/sculk_sensor/place1", + "pitch": 1.2, + "volume": 0.8 + }, + { + "name": "block/sculk_sensor/place2", + "pitch": 1.2, + "volume": 0.8 + }, + { + "name": "block/sculk_sensor/place3", + "pitch": 1.2, + "volume": 0.8 + }, + { + "name": "block/sculk_sensor/place4", + "pitch": 1.2, + "volume": 0.8 + }, + { + "name": "block/sculk_sensor/place5", + "pitch": 1.2, + "volume": 0.8 + } + ], + "subtitle": "subtitles.block.generic.place" + }, + "block.sculk_sensor.step": { + "sounds": [ + "block/sculk/step1", + "block/sculk/step2", + "block/sculk/step3", + "block/sculk/step4", + "block/sculk/step5", + "block/sculk/step6" + ], + "subtitle": "subtitles.block.generic.footsteps" + }, + "block.sculk_shrieker.break": { + "sounds": [ + { + "name": "block/sculk_shrieker/break1", + "volume": 0.9 + }, + { + "name": "block/sculk_shrieker/break2", + "volume": 0.9 + }, + { + "name": "block/sculk_shrieker/break3", + "volume": 0.9 + }, + { + "name": "block/sculk_shrieker/break4", + "volume": 0.9 + }, + { + "name": "block/sculk_shrieker/break5", + "volume": 0.9 + }, + { + "name": "block/sculk_shrieker/break6", + "volume": 0.9 + } + ], + "subtitle": "subtitles.block.generic.break" + }, + "block.sculk_shrieker.fall": { + "sounds": [ + "block/sculk/step1", + "block/sculk/step2", + "block/sculk/step3", + "block/sculk/step4", + "block/sculk/step5", + "block/sculk/step6" + ], + "subtitle": "subtitles.block.generic.fall" + }, + "block.sculk_shrieker.hit": { + "sounds": [ + "block/sculk/step1", + "block/sculk/step2", + "block/sculk/step3", + "block/sculk/step4", + "block/sculk/step5", + "block/sculk/step6" + ], + "subtitle": "subtitles.block.generic.hit" + }, + "block.sculk_shrieker.place": { + "sounds": [ + { + "name": "block/sculk_shrieker/place1", + "volume": 0.9 + }, + { + "name": "block/sculk_shrieker/place2", + "volume": 0.9 + }, + { + "name": "block/sculk_shrieker/place3", + "volume": 0.9 + }, + { + "name": "block/sculk_shrieker/place4", + "volume": 0.9 + }, + { + "name": "block/sculk_shrieker/place5", + "volume": 0.9 + } + ], + "subtitle": "subtitles.block.generic.place" + }, + "block.sculk_shrieker.shriek": { + "sounds": [ + { + "name": "block/sculk_shrieker/shriek1", + "volume": 0.85 + }, + { + "name": "block/sculk_shrieker/shriek2", + "volume": 0.85 + }, + { + "name": "block/sculk_shrieker/shriek3", + "volume": 0.85 + }, + { + "name": "block/sculk_shrieker/shriek4", + "volume": 0.85 + }, + { + "name": "block/sculk_shrieker/shriek5", + "volume": 0.85 + } + ], + "subtitle": "subtitles.block.sculk_shrieker.shriek" + }, + "block.sculk_shrieker.step": { + "sounds": [ + "block/sculk/step1", + "block/sculk/step2", + "block/sculk/step3", + "block/sculk/step4", + "block/sculk/step5", + "block/sculk/step6" + ], + "subtitle": "subtitles.block.generic.footsteps" + }, + "block.sculk_vein.break": { + "sounds": [ + { + "name": "block/sculk_vein/break1", + "pitch": 1.1, + "volume": 0.8 + }, + { + "name": "block/sculk_vein/break2", + "pitch": 1.1, + "volume": 0.8 + }, + { + "name": "block/sculk_vein/break3", + "pitch": 1.1, + "volume": 0.8 + }, + { + "name": "block/sculk_vein/break4", + "pitch": 1.1, + "volume": 0.8 + }, + { + "name": "block/sculk_vein/break5", + "pitch": 1.1, + "volume": 0.8 + } + ], + "subtitle": "subtitles.block.generic.break" + }, + "block.sculk_vein.fall": { + "sounds": [ + "block/sculk/step1", + "block/sculk/step2", + "block/sculk/step3", + "block/sculk/step4", + "block/sculk/step5", + "block/sculk/step6" + ], + "subtitle": "subtitles.block.generic.fall" + }, + "block.sculk_vein.hit": { + "sounds": [ + "block/sculk/step1", + "block/sculk/step2", + "block/sculk/step3", + "block/sculk/step4", + "block/sculk/step5", + "block/sculk/step6" + ], + "subtitle": "subtitles.block.generic.hit" + }, + "block.sculk_vein.place": { + "sounds": [ + { + "name": "block/sculk_vein/break1", + "pitch": 1.1, + "volume": 0.8 + }, + { + "name": "block/sculk_vein/break2", + "pitch": 1.1, + "volume": 0.8 + }, + { + "name": "block/sculk_vein/break3", + "pitch": 1.1, + "volume": 0.8 + }, + { + "name": "block/sculk_vein/break4", + "pitch": 1.1, + "volume": 0.8 + }, + { + "name": "block/sculk_vein/break5", + "pitch": 1.1, + "volume": 0.8 + } + ], + "subtitle": "subtitles.block.generic.place" + }, + "block.sculk_vein.step": { + "sounds": [ + "block/sculk/step1", + "block/sculk/step2", + "block/sculk/step3", + "block/sculk/step4", + "block/sculk/step5", + "block/sculk/step6" + ], + "subtitle": "subtitles.block.generic.footsteps" + }, + "block.shroomlight.break": { + "sounds": [ + "block/shroomlight/break1", + "block/shroomlight/break2", + "block/shroomlight/break3", + "block/shroomlight/break4", + "block/shroomlight/break5" + ], + "subtitle": "subtitles.block.generic.break" + }, + "block.shroomlight.fall": { + "sounds": [ + "block/shroomlight/step1", + "block/shroomlight/step2", + "block/shroomlight/step3", + "block/shroomlight/step4", + "block/shroomlight/step5", + "block/shroomlight/step6" + ], + "subtitle": "subtitles.block.generic.fall" + }, + "block.shroomlight.hit": { + "sounds": [ + "block/shroomlight/step1", + "block/shroomlight/step2", + "block/shroomlight/step3", + "block/shroomlight/step4", + "block/shroomlight/step5", + "block/shroomlight/step6" + ], + "subtitle": "subtitles.block.generic.hit" + }, + "block.shroomlight.place": { + "sounds": [ + "block/shroomlight/break1", + "block/shroomlight/break2", + "block/shroomlight/break3", + "block/shroomlight/break4", + "block/shroomlight/break5" + ], + "subtitle": "subtitles.block.generic.place" + }, + "block.shroomlight.step": { + "sounds": [ + "block/shroomlight/step1", + "block/shroomlight/step2", + "block/shroomlight/step3", + "block/shroomlight/step4", + "block/shroomlight/step5", + "block/shroomlight/step6" + ], + "subtitle": "subtitles.block.generic.footsteps" + }, + "block.shulker_box.close": { + "sounds": [ + "block/shulker_box/close" + ], + "subtitle": "subtitles.block.shulker_box.close" + }, + "block.shulker_box.open": { + "sounds": [ + "block/shulker_box/open" + ], + "subtitle": "subtitles.block.shulker_box.open" + }, + "block.sign.waxed_interact_fail": { + "sounds": [ + "block/sign/waxed_interact_fail1", + { + "name": "block/sign/waxed_interact_fail1", + "pitch": 0.9 + }, + { + "name": "block/sign/waxed_interact_fail2", + "pitch": 0.8 + }, + { + "name": "block/sign/waxed_interact_fail2", + "pitch": 0.9 + }, + { + "name": "block/sign/waxed_interact_fail3", + "pitch": 0.8 + }, + { + "name": "block/sign/waxed_interact_fail3", + "pitch": 0.9 + } + ], + "subtitle": "subtitles.block.sign.waxed_interact_fail" + }, + "block.slime_block.break": { + "sounds": [ + "mob/slime/big1", + "mob/slime/big2", + "mob/slime/big3", + "mob/slime/big4" + ], + "subtitle": "subtitles.block.generic.break" + }, + "block.slime_block.fall": { + "sounds": [ + "mob/slime/small1", + "mob/slime/small2", + "mob/slime/small3", + "mob/slime/small4", + "mob/slime/small5" + ], + "subtitle": "subtitles.block.generic.fall" + }, + "block.slime_block.hit": { + "sounds": [ + "mob/slime/small1", + "mob/slime/small2", + "mob/slime/small3", + "mob/slime/small4", + "mob/slime/small5" + ], + "subtitle": "subtitles.block.generic.hit" + }, + "block.slime_block.place": { + "sounds": [ + "mob/slime/big1", + "mob/slime/big2", + "mob/slime/big3", + "mob/slime/big4" + ], + "subtitle": "subtitles.block.generic.place" + }, + "block.slime_block.step": { + "sounds": [ + "mob/slime/small1", + "mob/slime/small2", + "mob/slime/small3", + "mob/slime/small4", + "mob/slime/small5" + ], + "subtitle": "subtitles.block.generic.footsteps" + }, + "block.small_amethyst_bud.break": { + "sounds": [ + { + "name": "block/amethyst_cluster/break1", + "volume": 0.4 + }, + { + "name": "block/amethyst_cluster/break2", + "volume": 0.4 + }, + { + "name": "block/amethyst_cluster/break3", + "volume": 0.4 + }, + { + "name": "block/amethyst_cluster/break4", + "volume": 0.4 + } + ], + "subtitle": "subtitles.block.generic.break" + }, + "block.small_amethyst_bud.place": { + "sounds": [ + { + "name": "block/amethyst_cluster/place1", + "pitch": 1.2, + "volume": 0.4 + }, + { + "name": "block/amethyst_cluster/place2", + "pitch": 1.2, + "volume": 0.4 + }, + { + "name": "block/amethyst_cluster/place3", + "pitch": 1.2, + "volume": 0.4 + }, + { + "name": "block/amethyst_cluster/place4", + "pitch": 1.2, + "volume": 0.4 + } + ], + "subtitle": "subtitles.block.generic.place" + }, + "block.small_dripleaf.break": { + "sounds": [ + { + "name": "block/big_dripleaf/break1", + "pitch": 1.2, + "volume": 0.9 + }, + { + "name": "block/big_dripleaf/break2", + "pitch": 1.2, + "volume": 0.9 + }, + { + "name": "block/big_dripleaf/break3", + "pitch": 1.2, + "volume": 0.9 + }, + { + "name": "block/big_dripleaf/break4", + "pitch": 1.2, + "volume": 0.9 + }, + { + "name": "block/big_dripleaf/break5", + "pitch": 1.2, + "volume": 0.9 + }, + { + "name": "block/big_dripleaf/break6", + "pitch": 1.2, + "volume": 0.9 + } + ], + "subtitle": "subtitles.block.generic.break" + }, + "block.small_dripleaf.fall": { + "sounds": [ + { + "name": "block/big_dripleaf/step1", + "pitch": 1.2, + "volume": 0.9 + }, + { + "name": "block/big_dripleaf/step2", + "pitch": 1.2, + "volume": 0.9 + }, + { + "name": "block/big_dripleaf/step3", + "pitch": 1.2, + "volume": 0.9 + }, + { + "name": "block/big_dripleaf/step4", + "pitch": 1.2, + "volume": 0.9 + }, + { + "name": "block/big_dripleaf/step5", + "pitch": 1.2, + "volume": 0.9 + }, + { + "name": "block/big_dripleaf/step6", + "pitch": 1.2, + "volume": 0.9 + } + ], + "subtitle": "subtitles.block.generic.fall" + }, + "block.small_dripleaf.hit": { + "sounds": [ + { + "name": "block/big_dripleaf/step1", + "pitch": 1.2, + "volume": 0.9 + }, + { + "name": "block/big_dripleaf/step2", + "pitch": 1.2, + "volume": 0.9 + }, + { + "name": "block/big_dripleaf/step3", + "pitch": 1.2, + "volume": 0.9 + }, + { + "name": "block/big_dripleaf/step4", + "pitch": 1.2, + "volume": 0.9 + }, + { + "name": "block/big_dripleaf/step5", + "pitch": 1.2, + "volume": 0.9 + }, + { + "name": "block/big_dripleaf/step6", + "pitch": 1.2, + "volume": 0.9 + } + ], + "subtitle": "subtitles.block.generic.hit" + }, + "block.small_dripleaf.place": { + "sounds": [ + { + "name": "block/big_dripleaf/break1", + "pitch": 1.2, + "volume": 0.9 + }, + { + "name": "block/big_dripleaf/break2", + "pitch": 1.2, + "volume": 0.9 + }, + { + "name": "block/big_dripleaf/break3", + "pitch": 1.2, + "volume": 0.9 + }, + { + "name": "block/big_dripleaf/break4", + "pitch": 1.2, + "volume": 0.9 + }, + { + "name": "block/big_dripleaf/break5", + "pitch": 1.2, + "volume": 0.9 + }, + { + "name": "block/big_dripleaf/break6", + "pitch": 1.2, + "volume": 0.9 + } + ], + "subtitle": "subtitles.block.generic.place" + }, + "block.small_dripleaf.step": { + "sounds": [ + { + "name": "block/big_dripleaf/step1", + "pitch": 1.2, + "volume": 0.9 + }, + { + "name": "block/big_dripleaf/step2", + "pitch": 1.2, + "volume": 0.9 + }, + { + "name": "block/big_dripleaf/step3", + "pitch": 1.2, + "volume": 0.9 + }, + { + "name": "block/big_dripleaf/step4", + "pitch": 1.2, + "volume": 0.9 + }, + { + "name": "block/big_dripleaf/step5", + "pitch": 1.2, + "volume": 0.9 + }, + { + "name": "block/big_dripleaf/step6", + "pitch": 1.2, + "volume": 0.9 + } + ], + "subtitle": "subtitles.block.generic.footsteps" + }, + "block.smithing_table.use": { + "sounds": [ + "block/smithing_table/smithing_table1", + "block/smithing_table/smithing_table2", + "block/smithing_table/smithing_table3" + ], + "subtitle": "subtitles.block.smithing_table.use" + }, + "block.smoker.smoke": { + "sounds": [ + "block/smoker/smoker1", + "block/smoker/smoker2", + "block/smoker/smoker3", + "block/smoker/smoker4", + "block/smoker/smoker5" + ], + "subtitle": "subtitles.block.smoker.smoke" + }, + "block.sniffer_egg.crack": { + "sounds": [ + { + "name": "mob/turtle/egg/egg_crack1", + "pitch": 0.8 + }, + { + "name": "mob/turtle/egg/egg_crack2", + "pitch": 0.8 + }, + { + "name": "mob/turtle/egg/egg_crack3", + "pitch": 0.8 + }, + { + "name": "mob/turtle/egg/egg_crack4", + "pitch": 0.8 + }, + { + "name": "mob/turtle/egg/egg_crack5", + "pitch": 0.8 + } + ], + "subtitle": "subtitles.block.sniffer_egg.crack" + }, + "block.sniffer_egg.hatch": { + "sounds": [ + { + "name": "mob/turtle/egg/egg_break1", + "pitch": 0.8 + }, + { + "name": "mob/turtle/egg/egg_break2", + "pitch": 0.8 + } + ], + "subtitle": "subtitles.block.sniffer_egg.hatch" + }, + "block.sniffer_egg.plop": { + "sounds": [ + { + "name": "mob/chicken/plop", + "pitch": 0.6 + }, + { + "name": "mob/chicken/plop", + "pitch": 0.7 + }, + { + "name": "mob/chicken/plop", + "pitch": 0.8 + } + ], + "subtitle": "subtitles.block.sniffer_egg.plop" + }, + "block.snow.break": { + "sounds": [ + "dig/snow1", + "dig/snow2", + "dig/snow3", + "dig/snow4" + ], + "subtitle": "subtitles.block.generic.break" + }, + "block.snow.fall": { + "sounds": [ + "step/snow1", + "step/snow2", + "step/snow3", + "step/snow4" + ], + "subtitle": "subtitles.block.generic.fall" + }, + "block.snow.hit": { + "sounds": [ + "step/snow1", + "step/snow2", + "step/snow3", + "step/snow4" + ], + "subtitle": "subtitles.block.generic.hit" + }, + "block.snow.place": { + "sounds": [ + "dig/snow1", + "dig/snow2", + "dig/snow3", + "dig/snow4" + ], + "subtitle": "subtitles.block.generic.place" + }, + "block.snow.step": { + "sounds": [ + "step/snow1", + "step/snow2", + "step/snow3", + "step/snow4" + ], + "subtitle": "subtitles.block.generic.footsteps" + }, + "block.soul_sand.break": { + "sounds": [ + "block/soul_sand/break1", + "block/soul_sand/break2", + "block/soul_sand/break3", + "block/soul_sand/break4", + "block/soul_sand/break5", + "block/soul_sand/break6", + "block/soul_sand/break7", + "block/soul_sand/break8", + "block/soul_sand/break9" + ], + "subtitle": "subtitles.block.generic.break" + }, + "block.soul_sand.fall": { + "sounds": [ + "block/soul_sand/step1", + "block/soul_sand/step2", + "block/soul_sand/step3", + "block/soul_sand/step4", + "block/soul_sand/step5" + ], + "subtitle": "subtitles.block.generic.fall" + }, + "block.soul_sand.hit": { + "sounds": [ + { + "name": "block/soul_sand/step1", + "volume": 0.55 + }, + { + "name": "block/soul_sand/step2", + "volume": 0.55 + }, + { + "name": "block/soul_sand/step3", + "volume": 0.55 + }, + { + "name": "block/soul_sand/step4", + "volume": 0.55 + }, + { + "name": "block/soul_sand/step5", + "volume": 0.55 + } + ], + "subtitle": "subtitles.block.generic.hit" + }, + "block.soul_sand.place": { + "sounds": [ + "block/soul_sand/break1", + "block/soul_sand/break2", + "block/soul_sand/break3", + "block/soul_sand/break4", + "block/soul_sand/break5", + "block/soul_sand/break6", + "block/soul_sand/break7", + "block/soul_sand/break8", + "block/soul_sand/break9" + ], + "subtitle": "subtitles.block.generic.place" + }, + "block.soul_sand.step": { + "sounds": [ + "block/soul_sand/step1", + "block/soul_sand/step2", + "block/soul_sand/step3", + "block/soul_sand/step4", + "block/soul_sand/step5" + ], + "subtitle": "subtitles.block.generic.footsteps" + }, + "block.soul_soil.break": { + "sounds": [ + { + "name": "block/soul_soil/break1", + "volume": 0.8 + }, + { + "name": "block/soul_soil/break2", + "volume": 0.8 + }, + { + "name": "block/soul_soil/break3", + "volume": 0.8 + }, + { + "name": "block/soul_soil/break4", + "volume": 0.8 + }, + { + "name": "block/soul_soil/break5", + "volume": 0.8 + }, + { + "name": "block/soul_soil/break6", + "volume": 0.8 + } + ], + "subtitle": "subtitles.block.generic.break" + }, + "block.soul_soil.fall": { + "sounds": [ + "block/soul_soil/step1", + "block/soul_soil/step2", + "block/soul_soil/step3", + "block/soul_soil/step4", + "block/soul_soil/step5" + ], + "subtitle": "subtitles.block.generic.fall" + }, + "block.soul_soil.hit": { + "sounds": [ + { + "name": "block/soul_soil/step1", + "volume": 0.66 + }, + { + "name": "block/soul_soil/step2", + "volume": 0.66 + }, + { + "name": "block/soul_soil/step3", + "volume": 0.66 + }, + { + "name": "block/soul_soil/step4", + "volume": 0.66 + }, + { + "name": "block/soul_soil/step5", + "volume": 0.66 + } + ], + "subtitle": "subtitles.block.generic.hit" + }, + "block.soul_soil.place": { + "sounds": [ + { + "name": "block/soul_soil/break1", + "volume": 0.8 + }, + { + "name": "block/soul_soil/break2", + "volume": 0.8 + }, + { + "name": "block/soul_soil/break3", + "volume": 0.8 + }, + { + "name": "block/soul_soil/break4", + "volume": 0.8 + }, + { + "name": "block/soul_soil/break5", + "volume": 0.8 + }, + { + "name": "block/soul_soil/break6", + "volume": 0.8 + } + ], + "subtitle": "subtitles.block.generic.place" + }, + "block.soul_soil.step": { + "sounds": [ + "block/soul_soil/step1", + "block/soul_soil/step2", + "block/soul_soil/step3", + "block/soul_soil/step4", + "block/soul_soil/step5" + ], + "subtitle": "subtitles.block.generic.footsteps" + }, + "block.spawner.break": { + "sounds": [ + "block/spawner/break1", + "block/spawner/break2", + "block/spawner/break3", + "block/spawner/break4" + ], + "subtitle": "subtitles.block.generic.break" + }, + "block.spawner.fall": { + "sounds": [ + "block/spawner/step1", + "block/spawner/step2", + "block/spawner/step3", + "block/spawner/step4", + "block/spawner/step5" + ], + "subtitle": "subtitles.block.generic.fall" + }, + "block.spawner.hit": { + "sounds": [ + "block/spawner/step1", + "block/spawner/step2", + "block/spawner/step3", + "block/spawner/step4", + "block/spawner/step5" + ], + "subtitle": "subtitles.block.generic.hit" + }, + "block.spawner.place": { + "sounds": [ + "block/spawner/break1", + "block/spawner/break2", + "block/spawner/break3", + "block/spawner/break4" + ], + "subtitle": "subtitles.block.generic.place" + }, + "block.spawner.step": { + "sounds": [ + "block/spawner/step1", + "block/spawner/step2", + "block/spawner/step3", + "block/spawner/step4", + "block/spawner/step5" + ], + "subtitle": "subtitles.block.generic.footsteps" + }, + "block.sponge.absorb": { + "sounds": [ + "block/sponge/absorb1", + "block/sponge/absorb2", + "block/sponge/absorb3" + ], + "subtitle": "subtitles.block.sponge.absorb" + }, + "block.sponge.break": { + "sounds": [ + "block/sponge/break1", + "block/sponge/break2", + "block/sponge/break3", + "block/sponge/break4" + ], + "subtitle": "subtitles.block.generic.break" + }, + "block.sponge.fall": { + "sounds": [ + "block/sponge/step1", + "block/sponge/step2", + "block/sponge/step3", + "block/sponge/step4", + "block/sponge/step5", + "block/sponge/step6" + ], + "subtitle": "subtitles.block.generic.fall" + }, + "block.sponge.hit": { + "sounds": [ + { + "name": "block/sponge/step1", + "volume": 0.8 + }, + { + "name": "block/sponge/step2", + "volume": 0.8 + }, + { + "name": "block/sponge/step3", + "volume": 0.8 + }, + { + "name": "block/sponge/step4", + "volume": 0.8 + }, + { + "name": "block/sponge/step5", + "volume": 0.8 + }, + { + "name": "block/sponge/step6", + "volume": 0.8 + } + ], + "subtitle": "subtitles.block.generic.hit" + }, + "block.sponge.place": { + "sounds": [ + "block/sponge/break1", + "block/sponge/break2", + "block/sponge/break3", + "block/sponge/break4" + ], + "subtitle": "subtitles.block.generic.place" + }, + "block.sponge.step": { + "sounds": [ + "block/sponge/step1", + "block/sponge/step2", + "block/sponge/step3", + "block/sponge/step4", + "block/sponge/step5", + "block/sponge/step6" + ], + "subtitle": "subtitles.block.generic.footsteps" + }, + "block.spore_blossom.break": { + "sounds": [ + "block/spore_blossom/break1", + "block/spore_blossom/break2", + "block/spore_blossom/break3", + "block/spore_blossom/break4", + "block/spore_blossom/break5" + ], + "subtitle": "subtitles.block.generic.break" + }, + "block.spore_blossom.fall": { + "sounds": [ + "block/spore_blossom/step1", + "block/spore_blossom/step2", + "block/spore_blossom/step3", + "block/spore_blossom/step4", + "block/spore_blossom/step5", + "block/spore_blossom/step6" + ], + "subtitle": "subtitles.block.generic.fall" + }, + "block.spore_blossom.hit": { + "sounds": [ + "block/spore_blossom/step1", + "block/spore_blossom/step2", + "block/spore_blossom/step3", + "block/spore_blossom/step4", + "block/spore_blossom/step5", + "block/spore_blossom/step6" + ], + "subtitle": "subtitles.block.generic.hit" + }, + "block.spore_blossom.place": { + "sounds": [ + "block/spore_blossom/break1", + "block/spore_blossom/break2", + "block/spore_blossom/break3", + "block/spore_blossom/break4", + "block/spore_blossom/break5" + ], + "subtitle": "subtitles.block.generic.place" + }, + "block.spore_blossom.step": { + "sounds": [ + "block/spore_blossom/step1", + "block/spore_blossom/step2", + "block/spore_blossom/step3", + "block/spore_blossom/step4", + "block/spore_blossom/step5", + "block/spore_blossom/step6" + ], + "subtitle": "subtitles.block.generic.footsteps" + }, + "block.stem.break": { + "sounds": [ + "block/stem/break1", + "block/stem/break2", + "block/stem/break3", + "block/stem/break4", + "block/stem/break5", + "block/stem/break6" + ], + "subtitle": "subtitles.block.generic.break" + }, + "block.stem.fall": { + "sounds": [ + "block/stem/step1", + "block/stem/step2", + "block/stem/step3", + "block/stem/step4", + "block/stem/step5", + "block/stem/step6" + ], + "subtitle": "subtitles.block.generic.fall" + }, + "block.stem.hit": { + "sounds": [ + { + "name": "block/stem/step1", + "volume": 0.8 + }, + { + "name": "block/stem/step2", + "volume": 0.8 + }, + { + "name": "block/stem/step3", + "volume": 0.8 + }, + { + "name": "block/stem/step4", + "volume": 0.8 + }, + { + "name": "block/stem/step5", + "volume": 0.8 + }, + { + "name": "block/stem/step6", + "volume": 0.8 + } + ], + "subtitle": "subtitles.block.generic.hit" + }, + "block.stem.place": { + "sounds": [ + { + "name": "block/stem/break1", + "pitch": 1.1, + "volume": 0.8 + }, + { + "name": "block/stem/break2", + "pitch": 1.1, + "volume": 0.8 + }, + { + "name": "block/stem/break3", + "pitch": 1.1, + "volume": 0.8 + }, + { + "name": "block/stem/break4", + "pitch": 1.1, + "volume": 0.8 + }, + { + "name": "block/stem/break5", + "pitch": 1.1, + "volume": 0.8 + }, + { + "name": "block/stem/break6", + "pitch": 1.1, + "volume": 0.8 + } + ], + "subtitle": "subtitles.block.generic.place" + }, + "block.stem.step": { + "sounds": [ + "block/stem/step1", + "block/stem/step2", + "block/stem/step3", + "block/stem/step4", + "block/stem/step5", + "block/stem/step6" + ], + "subtitle": "subtitles.block.generic.footsteps" + }, + "block.stone.break": { + "sounds": [ + "dig/stone1", + "dig/stone2", + "dig/stone3", + "dig/stone4" + ], + "subtitle": "subtitles.block.generic.break" + }, + "block.stone.fall": { + "sounds": [ + "step/stone1", + "step/stone2", + "step/stone3", + "step/stone4", + "step/stone5", + "step/stone6" + ], + "subtitle": "subtitles.block.generic.fall" + }, + "block.stone.hit": { + "sounds": [ + "step/stone1", + "step/stone2", + "step/stone3", + "step/stone4", + "step/stone5", + "step/stone6" + ], + "subtitle": "subtitles.block.generic.hit" + }, + "block.stone.place": { + "sounds": [ + "dig/stone1", + "dig/stone2", + "dig/stone3", + "dig/stone4" + ], + "subtitle": "subtitles.block.generic.place" + }, + "block.stone.step": { + "sounds": [ + "step/stone1", + "step/stone2", + "step/stone3", + "step/stone4", + "step/stone5", + "step/stone6" + ], + "subtitle": "subtitles.block.generic.footsteps" + }, + "block.stone_button.click_off": { + "sounds": [ + { + "name": "random/click", + "pitch": 0.5, + "volume": 0.3 + } + ], + "subtitle": "subtitles.block.button.click" + }, + "block.stone_button.click_on": { + "sounds": [ + { + "name": "random/click", + "pitch": 0.6, + "volume": 0.3 + } + ], + "subtitle": "subtitles.block.button.click" + }, + "block.stone_pressure_plate.click_off": { + "sounds": [ + { + "name": "random/click", + "pitch": 0.5, + "volume": 0.3 + } + ], + "subtitle": "subtitles.block.pressure_plate.click" + }, + "block.stone_pressure_plate.click_on": { + "sounds": [ + { + "name": "random/click", + "pitch": 0.6, + "volume": 0.3 + } + ], + "subtitle": "subtitles.block.pressure_plate.click" + }, + "block.suspicious_gravel.break": { + "sounds": [ + "block/suspicious_gravel/break1", + "block/suspicious_gravel/break2", + "block/suspicious_gravel/break3", + "block/suspicious_gravel/break4", + "block/suspicious_gravel/break5", + "block/suspicious_gravel/break6" + ], + "subtitle": "subtitles.block.generic.break" + }, + "block.suspicious_gravel.fall": { + "sounds": [ + "block/suspicious_gravel/step1", + "block/suspicious_gravel/step2", + "block/suspicious_gravel/step3", + "block/suspicious_gravel/step4" + ], + "subtitle": "subtitles.block.generic.fall" + }, + "block.suspicious_gravel.hit": { + "sounds": [ + { + "name": "block/suspicious_gravel/step1", + "volume": 0.8 + }, + { + "name": "block/suspicious_gravel/step2", + "volume": 0.8 + }, + { + "name": "block/suspicious_gravel/step3", + "volume": 0.8 + }, + { + "name": "block/suspicious_gravel/step4", + "volume": 0.8 + } + ], + "subtitle": "subtitles.block.generic.hit" + }, + "block.suspicious_gravel.place": { + "sounds": [ + "block/suspicious_gravel/place1", + "block/suspicious_gravel/place2", + "block/suspicious_gravel/place3", + "block/suspicious_gravel/place4" + ], + "subtitle": "subtitles.block.generic.place" + }, + "block.suspicious_gravel.step": { + "sounds": [ + "block/suspicious_gravel/step1", + "block/suspicious_gravel/step2", + "block/suspicious_gravel/step3", + "block/suspicious_gravel/step4" + ], + "subtitle": "subtitles.block.generic.footsteps" + }, + "block.suspicious_sand.break": { + "sounds": [ + "block/suspicious_sand/break1", + "block/suspicious_sand/break2", + "block/suspicious_sand/break3", + "block/suspicious_sand/break4", + "block/suspicious_sand/break5", + "block/suspicious_sand/break6" + ], + "subtitle": "subtitles.block.generic.break" + }, + "block.suspicious_sand.fall": { + "sounds": [ + "block/suspicious_sand/step1", + "block/suspicious_sand/step2", + "block/suspicious_sand/step3", + "block/suspicious_sand/step4", + "block/suspicious_sand/step5" + ], + "subtitle": "subtitles.block.generic.fall" + }, + "block.suspicious_sand.hit": { + "sounds": [ + "block/suspicious_sand/step1", + "block/suspicious_sand/step2", + "block/suspicious_sand/step3", + "block/suspicious_sand/step4", + "block/suspicious_sand/step5" + ], + "subtitle": "subtitles.block.generic.hit" + }, + "block.suspicious_sand.place": { + "sounds": [ + "block/suspicious_sand/place1", + "block/suspicious_sand/place2", + "block/suspicious_sand/place3", + "block/suspicious_sand/place4", + "block/suspicious_sand/place5" + ], + "subtitle": "subtitles.block.generic.place" + }, + "block.suspicious_sand.step": { + "sounds": [ + "block/suspicious_sand/step1", + "block/suspicious_sand/step2", + "block/suspicious_sand/step3", + "block/suspicious_sand/step4", + "block/suspicious_sand/step5" + ], + "subtitle": "subtitles.block.generic.footsteps" + }, + "block.sweet_berry_bush.break": { + "sounds": [ + { + "name": "block/sweet_berry_bush/break1", + "volume": 0.8 + }, + { + "name": "block/sweet_berry_bush/break2", + "volume": 0.8 + }, + { + "name": "block/sweet_berry_bush/break3", + "volume": 0.8 + }, + { + "name": "block/sweet_berry_bush/break4", + "volume": 0.8 + } + ], + "subtitle": "subtitles.block.generic.break" + }, + "block.sweet_berry_bush.pick_berries": { + "sounds": [ + "item/sweet_berries/pick_from_bush1", + "item/sweet_berries/pick_from_bush2" + ], + "subtitle": "subtitles.block.sweet_berry_bush.pick_berries" + }, + "block.sweet_berry_bush.place": { + "sounds": [ + { + "name": "block/sweet_berry_bush/place1", + "volume": 0.8 + }, + { + "name": "block/sweet_berry_bush/place2", + "volume": 0.8 + }, + { + "name": "block/sweet_berry_bush/place3", + "volume": 0.8 + }, + { + "name": "block/sweet_berry_bush/place4", + "volume": 0.8 + }, + { + "name": "block/sweet_berry_bush/place5", + "volume": 0.8 + }, + { + "name": "block/sweet_berry_bush/place6", + "volume": 0.8 + } + ], + "subtitle": "subtitles.block.generic.place" + }, + "block.trial_spawner.about_to_spawn_item": { + "sounds": [ + "block/trial_spawner/about_to_spawn_item" + ], + "subtitle": "subtitles.block.trial_spawner.about_to_spawn_item" + }, + "block.trial_spawner.ambient": { + "sounds": [ + "block/trial_spawner/ambient1", + "block/trial_spawner/ambient2", + "block/trial_spawner/ambient3", + "block/trial_spawner/ambient4", + "block/trial_spawner/ambient5" + ], + "subtitle": "subtitles.block.trial_spawner.ambient" + }, + "block.trial_spawner.ambient_ominous": { + "sounds": [ + "block/trial_spawner/ambient_ominous1", + "block/trial_spawner/ambient_ominous2", + "block/trial_spawner/ambient_ominous3", + "block/trial_spawner/ambient_ominous4", + "block/trial_spawner/ambient_ominous5" + ], + "subtitle": "subtitles.block.trial_spawner.ambient_ominous" + }, + "block.trial_spawner.break": { + "sounds": [ + { + "name": "block/trial_spawner/break1", + "volume": 0.9 + }, + { + "name": "block/trial_spawner/break2", + "volume": 0.9 + }, + { + "name": "block/trial_spawner/break3", + "volume": 0.9 + } + ], + "subtitle": "subtitles.block.generic.break" + }, + "block.trial_spawner.close_shutter": { + "sounds": [ + "block/trial_spawner/close_shutter" + ], + "subtitle": "subtitles.block.trial_spawner.close_shutter" + }, + "block.trial_spawner.detect_player": { + "sounds": [ + "block/trial_spawner/detect_player1", + { + "name": "block/trial_spawner/detect_player1", + "pitch": 0.95 + }, + "block/trial_spawner/detect_player2", + { + "name": "block/trial_spawner/detect_player2", + "pitch": 0.95 + }, + "block/trial_spawner/detect_player3", + { + "name": "block/trial_spawner/detect_player3", + "pitch": 0.95 + } + ], + "subtitle": "subtitles.block.trial_spawner.detect_player" + }, + "block.trial_spawner.eject_item": { + "sounds": [ + "block/trial_spawner/eject_item1" + ], + "subtitle": "subtitles.block.trial_spawner.eject_item" + }, + "block.trial_spawner.fall": { + "sounds": [ + "block/trial_spawner/step1", + "block/trial_spawner/step2", + "block/trial_spawner/step3", + "block/trial_spawner/step4", + "block/trial_spawner/step5" + ], + "subtitle": "subtitles.block.generic.fall" + }, + "block.trial_spawner.hit": { + "sounds": [ + "block/trial_spawner/step1", + "block/trial_spawner/step2", + "block/trial_spawner/step3", + "block/trial_spawner/step4", + "block/trial_spawner/step5" + ], + "subtitle": "subtitles.block.generic.hit" + }, + "block.trial_spawner.ominous_activate": { + "sounds": [ + "block/trial_spawner/ominous_activate" + ], + "subtitle": "subtitles.block.trial_spawner.ominous_activate" + }, + "block.trial_spawner.open_shutter": { + "sounds": [ + "block/trial_spawner/open_shutter" + ], + "subtitle": "subtitles.block.trial_spawner.open_shutter" + }, + "block.trial_spawner.place": { + "sounds": [ + "block/trial_spawner/place1", + "block/trial_spawner/place2", + "block/trial_spawner/place3" + ], + "subtitle": "subtitles.block.generic.place" + }, + "block.trial_spawner.spawn_item": { + "sounds": [ + "block/trial_spawner/spawn_item1", + "block/trial_spawner/spawn_item2", + "block/trial_spawner/spawn_item3" + ], + "subtitle": "subtitles.block.trial_spawner.spawn_item" + }, + "block.trial_spawner.spawn_item_begin": { + "sounds": [ + "block/trial_spawner/spawn_item_begin1", + "block/trial_spawner/spawn_item_begin2", + "block/trial_spawner/spawn_item_begin3" + ], + "subtitle": "subtitles.block.trial_spawner.spawn_item_begin" + }, + "block.trial_spawner.spawn_mob": { + "sounds": [ + "block/trial_spawner/spawn1", + "block/trial_spawner/spawn2", + "block/trial_spawner/spawn3", + "block/trial_spawner/spawn4" + ], + "subtitle": "subtitles.block.trial_spawner.spawn_mob" + }, + "block.trial_spawner.step": { + "sounds": [ + "block/trial_spawner/step1", + "block/trial_spawner/step2", + "block/trial_spawner/step3", + "block/trial_spawner/step4", + "block/trial_spawner/step5" + ], + "subtitle": "subtitles.block.generic.footsteps" + }, + "block.tripwire.attach": { + "sounds": [ + "random/click" + ], + "subtitle": "subtitles.block.tripwire.attach" + }, + "block.tripwire.click_off": { + "sounds": [ + "random/click" + ], + "subtitle": "subtitles.block.tripwire.click" + }, + "block.tripwire.click_on": { + "sounds": [ + "random/click" + ], + "subtitle": "subtitles.block.tripwire.click" + }, + "block.tripwire.detach": { + "sounds": [ + "random/bowhit1", + "random/bowhit2", + "random/bowhit3", + "random/bowhit4" + ], + "subtitle": "subtitles.block.tripwire.detach" + }, + "block.tuff.break": { + "sounds": [ + "block/tuff/break1", + "block/tuff/break2", + "block/tuff/break3", + "block/tuff/break4" + ], + "subtitle": "subtitles.block.generic.break" + }, + "block.tuff.fall": { + "sounds": [ + "block/tuff/step1", + "block/tuff/step2", + "block/tuff/step3", + "block/tuff/step4", + "block/tuff/step5", + "block/tuff/step6" + ], + "subtitle": "subtitles.block.generic.fall" + }, + "block.tuff.hit": { + "sounds": [ + "block/tuff/step1", + "block/tuff/step2", + "block/tuff/step3", + "block/tuff/step4", + "block/tuff/step5", + "block/tuff/step6" + ], + "subtitle": "subtitles.block.generic.hit" + }, + "block.tuff.place": { + "sounds": [ + "block/tuff/break1", + "block/tuff/break2", + "block/tuff/break3", + "block/tuff/break4" + ], + "subtitle": "subtitles.block.generic.place" + }, + "block.tuff.step": { + "sounds": [ + "block/tuff/step1", + "block/tuff/step2", + "block/tuff/step3", + "block/tuff/step4", + "block/tuff/step5", + "block/tuff/step6" + ], + "subtitle": "subtitles.block.generic.footsteps" + }, + "block.tuff_bricks.break": { + "sounds": [ + "block/tuff_bricks/place1", + "block/tuff_bricks/place2", + "block/tuff_bricks/place3", + "block/tuff_bricks/place4", + "block/tuff_bricks/place5" + ], + "subtitle": "subtitles.block.generic.break" + }, + "block.tuff_bricks.fall": { + "sounds": [ + "block/tuff_bricks/step1", + "block/tuff_bricks/step2", + "block/tuff_bricks/step3", + "block/tuff_bricks/step4", + "block/tuff_bricks/step5", + "block/tuff_bricks/step6" + ], + "subtitle": "subtitles.block.generic.fall" + }, + "block.tuff_bricks.hit": { + "sounds": [ + "block/tuff_bricks/step1", + "block/tuff_bricks/step2", + "block/tuff_bricks/step3", + "block/tuff_bricks/step4", + "block/tuff_bricks/step5", + "block/tuff_bricks/step6" + ], + "subtitle": "subtitles.block.generic.hit" + }, + "block.tuff_bricks.place": { + "sounds": [ + "block/tuff_bricks/place1", + "block/tuff_bricks/place2", + "block/tuff_bricks/place3", + "block/tuff_bricks/place4", + "block/tuff_bricks/place5" + ], + "subtitle": "subtitles.block.generic.place" + }, + "block.tuff_bricks.step": { + "sounds": [ + "block/tuff_bricks/step1", + "block/tuff_bricks/step2", + "block/tuff_bricks/step3", + "block/tuff_bricks/step4", + "block/tuff_bricks/step5", + "block/tuff_bricks/step6" + ], + "subtitle": "subtitles.block.generic.footsteps" + }, + "block.vault.activate": { + "sounds": [ + "block/vault/activate" + ], + "subtitle": "subtitles.block.vault.activate" + }, + "block.vault.ambient": { + "sounds": [ + "block/vault/ambient1", + "block/vault/ambient2", + "block/vault/ambient3" + ], + "subtitle": "subtitles.block.vault.ambient" + }, + "block.vault.break": { + "sounds": [ + "block/vault/break1", + "block/vault/break2", + "block/vault/break3", + "block/vault/break4" + ], + "subtitle": "subtitles.block.generic.break" + }, + "block.vault.close_shutter": { + "sounds": [ + "block/trial_spawner/close_shutter" + ], + "subtitle": "subtitles.block.vault.close_shutter" + }, + "block.vault.deactivate": { + "sounds": [ + "block/vault/deactivate" + ], + "subtitle": "subtitles.block.vault.deactivate" + }, + "block.vault.eject_item": { + "sounds": [ + "block/vault/eject1", + "block/vault/eject2", + "block/vault/eject3" + ], + "subtitle": "subtitles.block.vault.eject_item" + }, + "block.vault.fall": { + "sounds": [ + "block/vault/step1", + "block/vault/step2", + "block/vault/step3", + "block/vault/step4", + "block/vault/step5", + "block/vault/step6", + "block/vault/step7", + "block/vault/step8" + ], + "subtitle": "subtitles.block.generic.fall" + }, + "block.vault.hit": { + "sounds": [ + "block/vault/step1", + "block/vault/step2", + "block/vault/step3", + "block/vault/step4", + "block/vault/step5", + "block/vault/step6", + "block/vault/step7", + "block/vault/step8" + ], + "subtitle": "subtitles.block.generic.hit" + }, + "block.vault.insert_item": { + "sounds": [ + "block/vault/insert" + ], + "subtitle": "subtitles.block.vault.insert_item" + }, + "block.vault.insert_item_fail": { + "sounds": [ + "block/vault/insert_fail" + ], + "subtitle": "subtitles.block.vault.insert_item_fail" + }, + "block.vault.open_shutter": { + "sounds": [ + "block/vault/open_shutter" + ], + "subtitle": "subtitles.block.vault.open_shutter" + }, + "block.vault.place": { + "sounds": [ + "block/vault/place1", + "block/vault/place2", + "block/vault/place3", + "block/vault/place4" + ], + "subtitle": "subtitles.block.generic.place" + }, + "block.vault.reject_rewarded_player": { + "sounds": [ + "block/vault/reject_rewarded_player" + ], + "subtitle": "subtitles.block.vault.reject_rewarded_player" + }, + "block.vault.step": { + "sounds": [ + "block/vault/step1", + "block/vault/step2", + "block/vault/step3", + "block/vault/step4", + "block/vault/step5", + "block/vault/step6", + "block/vault/step7", + "block/vault/step8" + ], + "subtitle": "subtitles.block.generic.footsteps" + }, + "block.vine.break": { + "sounds": [ + { + "name": "block/vine/break1", + "volume": 0.9 + }, + { + "name": "block/vine/break2", + "volume": 0.9 + }, + { + "name": "block/vine/break3", + "volume": 0.9 + }, + { + "name": "block/vine/break4", + "volume": 0.9 + } + ], + "subtitle": "subtitles.block.generic.break" + }, + "block.vine.fall": { + "sounds": [ + "block/vine/climb1", + "block/vine/climb2", + "block/vine/climb3", + "block/vine/climb4", + "block/vine/climb5" + ], + "subtitle": "subtitles.block.generic.fall" + }, + "block.vine.hit": { + "sounds": [ + "step/grass1", + "step/grass2", + "step/grass3", + "step/grass4", + "step/grass5", + "step/grass6" + ], + "subtitle": "subtitles.block.generic.hit" + }, + "block.vine.place": { + "sounds": [ + { + "name": "block/vine/break1", + "volume": 0.9 + }, + { + "name": "block/vine/break2", + "volume": 0.9 + }, + { + "name": "block/vine/break3", + "volume": 0.9 + }, + { + "name": "block/vine/break4", + "volume": 0.9 + } + ], + "subtitle": "subtitles.block.generic.place" + }, + "block.vine.step": { + "sounds": [ + "block/vine/climb1", + "block/vine/climb2", + "block/vine/climb3", + "block/vine/climb4", + "block/vine/climb5" + ], + "subtitle": "subtitles.block.generic.footsteps" + }, + "block.wart_block.break": { + "sounds": [ + { + "name": "block/netherwart/break1", + "volume": 0.8 + }, + { + "name": "block/netherwart/break2", + "volume": 0.8 + }, + { + "name": "block/netherwart/break3", + "volume": 0.8 + }, + { + "name": "block/netherwart/break4", + "volume": 0.8 + }, + { + "name": "block/netherwart/break5", + "volume": 0.8 + }, + { + "name": "block/netherwart/break6", + "volume": 0.8 + } + ], + "subtitle": "subtitles.block.generic.break" + }, + "block.wart_block.fall": { + "sounds": [ + "block/netherwart/step1", + "block/netherwart/step2", + "block/netherwart/step3", + "block/netherwart/step4", + "block/netherwart/step5" + ], + "subtitle": "subtitles.block.generic.fall" + }, + "block.wart_block.hit": { + "sounds": [ + { + "name": "block/netherwart/step1", + "volume": 0.7 + }, + { + "name": "block/netherwart/step2", + "volume": 0.7 + }, + { + "name": "block/netherwart/step3", + "volume": 0.7 + }, + { + "name": "block/netherwart/step4", + "volume": 0.7 + }, + { + "name": "block/netherwart/step5", + "volume": 0.7 + } + ], + "subtitle": "subtitles.block.generic.hit" + }, + "block.wart_block.place": { + "sounds": [ + { + "name": "block/netherwart/break1", + "volume": 0.8 + }, + { + "name": "block/netherwart/break2", + "volume": 0.8 + }, + { + "name": "block/netherwart/break3", + "volume": 0.8 + }, + { + "name": "block/netherwart/break4", + "volume": 0.8 + }, + { + "name": "block/netherwart/break5", + "volume": 0.8 + }, + { + "name": "block/netherwart/break6", + "volume": 0.8 + } + ], + "subtitle": "subtitles.block.generic.place" + }, + "block.wart_block.step": { + "sounds": [ + "block/netherwart/step1", + "block/netherwart/step2", + "block/netherwart/step3", + "block/netherwart/step4", + "block/netherwart/step5" + ], + "subtitle": "subtitles.block.generic.footsteps" + }, + "block.water.ambient": { + "sounds": [ + "liquid/water" + ], + "subtitle": "subtitles.block.water.ambient" + }, + "block.weeping_vines.break": { + "sounds": [ + "block/roots/break1", + "block/roots/break2", + "block/roots/break3", + "block/roots/break4", + "block/roots/break5", + "block/roots/break6" + ], + "subtitle": "subtitles.block.generic.break" + }, + "block.weeping_vines.fall": { + "sounds": [ + "block/roots/break1", + "block/roots/break2", + "block/roots/break3", + "block/roots/break4", + "block/roots/break5", + "block/roots/break6" + ], + "subtitle": "subtitles.block.generic.fall" + }, + "block.weeping_vines.hit": { + "sounds": [ + "block/roots/break1", + "block/roots/break2", + "block/roots/break3", + "block/roots/break4", + "block/roots/break5", + "block/roots/break6" + ], + "subtitle": "subtitles.block.generic.hit" + }, + "block.weeping_vines.place": { + "sounds": [ + "block/roots/break1", + "block/roots/break2", + "block/roots/break3", + "block/roots/break4", + "block/roots/break5", + "block/roots/break6" + ], + "subtitle": "subtitles.block.generic.place" + }, + "block.weeping_vines.step": { + "sounds": [ + "block/roots/step1", + "block/roots/step2", + "block/roots/step3", + "block/roots/step4", + "block/roots/step5" + ], + "subtitle": "subtitles.block.generic.footsteps" + }, + "block.wet_grass.break": { + "sounds": [ + { + "name": "dig/wet_grass1", + "volume": 0.8 + }, + { + "name": "dig/wet_grass2", + "volume": 0.8 + }, + { + "name": "dig/wet_grass3", + "volume": 0.8 + }, + { + "name": "dig/wet_grass4", + "volume": 0.8 + } + ], + "subtitle": "subtitles.block.generic.break" + }, + "block.wet_grass.fall": { + "sounds": [ + "step/wet_grass1", + "step/wet_grass2", + "step/wet_grass3", + "step/wet_grass4", + "step/wet_grass5", + "step/wet_grass6" + ], + "subtitle": "subtitles.block.generic.fall" + }, + "block.wet_grass.hit": { + "sounds": [ + "step/wet_grass1", + "step/wet_grass2", + "step/wet_grass3", + "step/wet_grass4", + "step/wet_grass5", + "step/wet_grass6" + ], + "subtitle": "subtitles.block.generic.hit" + }, + "block.wet_grass.place": { + "sounds": [ + { + "name": "dig/wet_grass1", + "volume": 0.8 + }, + { + "name": "dig/wet_grass2", + "volume": 0.8 + }, + { + "name": "dig/wet_grass3", + "volume": 0.8 + }, + { + "name": "dig/wet_grass4", + "volume": 0.8 + } + ], + "subtitle": "subtitles.block.generic.place" + }, + "block.wet_grass.step": { + "sounds": [ + "step/wet_grass1", + "step/wet_grass2", + "step/wet_grass3", + "step/wet_grass4", + "step/wet_grass5", + "step/wet_grass6" + ], + "subtitle": "subtitles.block.generic.footsteps" + }, + "block.wet_sponge.break": { + "sounds": [ + "block/sponge/wet_sponge/break1", + "block/sponge/wet_sponge/break2", + "block/sponge/wet_sponge/break3", + "block/sponge/wet_sponge/break4" + ], + "subtitle": "subtitles.block.generic.break" + }, + "block.wet_sponge.dries": { + "sounds": [ + "random/fizz" + ], + "subtitle": "subtitles.block.wet_sponge.dries" + }, + "block.wet_sponge.fall": { + "sounds": [ + "block/sponge/wet_sponge/step1", + "block/sponge/wet_sponge/step2", + "block/sponge/wet_sponge/step3", + "block/sponge/wet_sponge/step4" + ], + "subtitle": "subtitles.block.generic.fall" + }, + "block.wet_sponge.hit": { + "sounds": [ + "block/sponge/wet_sponge/step1", + "block/sponge/wet_sponge/step2", + "block/sponge/wet_sponge/step3", + "block/sponge/wet_sponge/step4" + ], + "subtitle": "subtitles.block.generic.hit" + }, + "block.wet_sponge.place": { + "sounds": [ + "block/sponge/wet_sponge/break1", + "block/sponge/wet_sponge/break2", + "block/sponge/wet_sponge/break3", + "block/sponge/wet_sponge/break4" + ], + "subtitle": "subtitles.block.generic.place" + }, + "block.wet_sponge.step": { + "sounds": [ + "block/sponge/wet_sponge/step1", + "block/sponge/wet_sponge/step2", + "block/sponge/wet_sponge/step3", + "block/sponge/wet_sponge/step4" + ], + "subtitle": "subtitles.block.generic.footsteps" + }, + "block.wood.break": { + "sounds": [ + "dig/wood1", + "dig/wood2", + "dig/wood3", + "dig/wood4" + ], + "subtitle": "subtitles.block.generic.break" + }, + "block.wood.fall": { + "sounds": [ + "step/wood1", + "step/wood2", + "step/wood3", + "step/wood4", + "step/wood5", + "step/wood6" + ], + "subtitle": "subtitles.block.generic.fall" + }, + "block.wood.hit": { + "sounds": [ + "step/wood1", + "step/wood2", + "step/wood3", + "step/wood4", + "step/wood5", + "step/wood6" + ], + "subtitle": "subtitles.block.generic.hit" + }, + "block.wood.place": { + "sounds": [ + "dig/wood1", + "dig/wood2", + "dig/wood3", + "dig/wood4" + ], + "subtitle": "subtitles.block.generic.place" + }, + "block.wood.step": { + "sounds": [ + "step/wood1", + "step/wood2", + "step/wood3", + "step/wood4", + "step/wood5", + "step/wood6" + ], + "subtitle": "subtitles.block.generic.footsteps" + }, + "block.wooden_button.click_off": { + "sounds": [ + { + "name": "random/wood_click", + "pitch": 0.5, + "volume": 0.3 + } + ], + "subtitle": "subtitles.block.button.click" + }, + "block.wooden_button.click_on": { + "sounds": [ + { + "name": "random/wood_click", + "pitch": 0.6, + "volume": 0.3 + } + ], + "subtitle": "subtitles.block.button.click" + }, + "block.wooden_door.close": { + "sounds": [ + { + "name": "block/wooden_door/close1", + "volume": 0.9 + }, + { + "name": "block/wooden_door/close2", + "volume": 0.9 + }, + { + "name": "block/wooden_door/close3", + "volume": 0.9 + } + ], + "subtitle": "subtitles.block.door.toggle" + }, + "block.wooden_door.open": { + "sounds": [ + { + "name": "block/wooden_door/open1", + "volume": 0.9 + }, + { + "name": "block/wooden_door/open2", + "volume": 0.9 + } + ], + "subtitle": "subtitles.block.door.toggle" + }, + "block.wooden_pressure_plate.click_off": { + "sounds": [ + { + "name": "random/click", + "pitch": 0.7, + "volume": 0.3 + } + ], + "subtitle": "subtitles.block.pressure_plate.click" + }, + "block.wooden_pressure_plate.click_on": { + "sounds": [ + { + "name": "random/click", + "pitch": 0.8, + "volume": 0.3 + } + ], + "subtitle": "subtitles.block.pressure_plate.click" + }, + "block.wooden_trapdoor.close": { + "sounds": [ + { + "name": "block/wooden_trapdoor/close1", + "volume": 0.9 + }, + { + "name": "block/wooden_trapdoor/close2", + "volume": 0.9 + }, + { + "name": "block/wooden_trapdoor/close3", + "volume": 0.9 + } + ], + "subtitle": "subtitles.block.trapdoor.toggle" + }, + "block.wooden_trapdoor.open": { + "sounds": [ + { + "name": "block/wooden_trapdoor/open1", + "volume": 0.9 + }, + { + "name": "block/wooden_trapdoor/open2", + "volume": 0.9 + }, + { + "name": "block/wooden_trapdoor/open3", + "volume": 0.9 + }, + { + "name": "block/wooden_trapdoor/open4", + "volume": 0.9 + }, + { + "name": "block/wooden_trapdoor/open5", + "volume": 0.9 + } + ], + "subtitle": "subtitles.block.trapdoor.toggle" + }, + "block.wool.break": { + "sounds": [ + "dig/cloth1", + "dig/cloth2", + "dig/cloth3", + "dig/cloth4" + ], + "subtitle": "subtitles.block.generic.break" + }, + "block.wool.fall": { + "sounds": [ + "step/cloth1", + "step/cloth2", + "step/cloth3", + "step/cloth4" + ], + "subtitle": "subtitles.block.generic.fall" + }, + "block.wool.hit": { + "sounds": [ + "step/cloth1", + "step/cloth2", + "step/cloth3", + "step/cloth4" + ], + "subtitle": "subtitles.block.generic.hit" + }, + "block.wool.place": { + "sounds": [ + "dig/cloth1", + "dig/cloth2", + "dig/cloth3", + "dig/cloth4" + ], + "subtitle": "subtitles.block.generic.place" + }, + "block.wool.step": { + "sounds": [ + "step/cloth1", + "step/cloth2", + "step/cloth3", + "step/cloth4" + ], + "subtitle": "subtitles.block.generic.footsteps" + }, + "enchant.thorns.hit": { + "sounds": [ + "enchant/thorns/hit1", + "enchant/thorns/hit2", + "enchant/thorns/hit3", + "enchant/thorns/hit4" + ], + "subtitle": "subtitles.enchant.thorns.hit" + }, + "entity.allay.ambient_with_item": { + "sounds": [ + { + "name": "mob/allay/idle_with_item1", + "pitch": 1.25, + "volume": 0.3 + }, + { + "name": "mob/allay/idle_with_item2", + "pitch": 1.25, + "volume": 0.3 + }, + { + "name": "mob/allay/idle_with_item3", + "pitch": 1.25, + "volume": 0.3 + }, + { + "name": "mob/allay/idle_with_item4", + "pitch": 1.25, + "volume": 0.3 + } + ], + "subtitle": "subtitles.entity.allay.ambient_with_item" + }, + "entity.allay.ambient_without_item": { + "sounds": [ + { + "name": "mob/allay/idle_without_item1", + "volume": 0.25 + }, + { + "name": "mob/allay/idle_without_item2", + "volume": 0.25 + }, + { + "name": "mob/allay/idle_without_item3", + "volume": 0.25 + }, + { + "name": "mob/allay/idle_without_item4", + "volume": 0.25 + } + ], + "subtitle": "subtitles.entity.allay.ambient_without_item" + }, + "entity.allay.death": { + "sounds": [ + { + "name": "mob/allay/death1", + "volume": 0.6 + }, + { + "name": "mob/allay/death2", + "volume": 0.6 + } + ], + "subtitle": "subtitles.entity.allay.death" + }, + "entity.allay.hurt": { + "sounds": [ + { + "name": "mob/allay/hurt1", + "pitch": 1.5, + "volume": 0.8 + }, + { + "name": "mob/allay/hurt2", + "pitch": 1.5, + "volume": 0.8 + } + ], + "subtitle": "subtitles.entity.allay.hurt" + }, + "entity.allay.item_given": { + "sounds": [ + { + "name": "mob/allay/item_given1", + "volume": 0.1 + }, + { + "name": "mob/allay/item_given2", + "volume": 0.1 + }, + { + "name": "mob/allay/item_given3", + "volume": 0.1 + }, + { + "name": "mob/allay/item_given4", + "volume": 0.1 + } + ], + "subtitle": "subtitles.entity.allay.item_given" + }, + "entity.allay.item_taken": { + "sounds": [ + { + "name": "mob/allay/item_taken1", + "pitch": 1.25, + "volume": 0.1 + }, + { + "name": "mob/allay/item_taken2", + "pitch": 1.25, + "volume": 0.1 + }, + { + "name": "mob/allay/item_taken3", + "pitch": 1.25, + "volume": 0.1 + }, + { + "name": "mob/allay/item_taken4", + "pitch": 1.25, + "volume": 0.1 + } + ], + "subtitle": "subtitles.entity.allay.item_taken" + }, + "entity.allay.item_thrown": { + "sounds": [ + { + "name": "mob/allay/item_thrown1", + "volume": 0.25 + } + ], + "subtitle": "subtitles.entity.allay.item_thrown" + }, + "entity.armadillo.ambient": { + "sounds": [ + "mob/armadillo/ambient1", + "mob/armadillo/ambient2", + "mob/armadillo/ambient3", + "mob/armadillo/ambient4", + "mob/armadillo/ambient5", + "mob/armadillo/ambient6", + "mob/armadillo/ambient7", + "mob/armadillo/ambient8" + ], + "subtitle": "subtitles.entity.armadillo.ambient" + }, + "entity.armadillo.brush": { + "sounds": [ + { + "name": "mob/armadillo/brush_armadillo1", + "volume": 0.9 + }, + { + "name": "mob/armadillo/brush_armadillo1", + "pitch": 0.8, + "volume": 0.9 + }, + { + "name": "mob/armadillo/brush_armadillo1", + "pitch": 0.9, + "volume": 0.9 + }, + { + "name": "mob/armadillo/brush_armadillo2", + "volume": 0.9 + }, + { + "name": "mob/armadillo/brush_armadillo2", + "pitch": 0.8, + "volume": 0.9 + }, + { + "name": "mob/armadillo/brush_armadillo2", + "pitch": 0.9, + "volume": 0.9 + } + ], + "subtitle": "subtitles.entity.armadillo.brush" + }, + "entity.armadillo.death": { + "sounds": [ + "mob/armadillo/death1", + "mob/armadillo/death2", + "mob/armadillo/death3", + "mob/armadillo/death4" + ], + "subtitle": "subtitles.entity.armadillo.death" + }, + "entity.armadillo.eat": { + "sounds": [ + "mob/armadillo/eat1", + "mob/armadillo/eat2", + "mob/armadillo/eat3" + ], + "subtitle": "subtitles.entity.armadillo.eat" + }, + "entity.armadillo.hurt": { + "sounds": [ + "mob/armadillo/hurt1", + "mob/armadillo/hurt2", + "mob/armadillo/hurt3", + "mob/armadillo/hurt4", + "mob/armadillo/hurt5" + ], + "subtitle": "subtitles.entity.armadillo.hurt" + }, + "entity.armadillo.hurt_reduced": { + "sounds": [ + "mob/armadillo/hurt_reduced1", + "mob/armadillo/hurt_reduced2", + "mob/armadillo/hurt_reduced3", + "mob/armadillo/hurt_reduced4" + ], + "subtitle": "subtitles.entity.armadillo.hurt_reduced" + }, + "entity.armadillo.land": { + "sounds": [ + "mob/armadillo/land1", + "mob/armadillo/land2", + "mob/armadillo/land3", + "mob/armadillo/land4" + ], + "subtitle": "subtitles.entity.armadillo.land" + }, + "entity.armadillo.peek": { + "sounds": [ + "mob/armadillo/peek" + ], + "subtitle": "subtitles.entity.armadillo.peek" + }, + "entity.armadillo.roll": { + "sounds": [ + "mob/armadillo/roll1", + "mob/armadillo/roll2", + "mob/armadillo/roll3", + "mob/armadillo/roll4" + ], + "subtitle": "subtitles.entity.armadillo.roll" + }, + "entity.armadillo.scute_drop": { + "sounds": [ + "mob/armadillo/scute_drop1", + { + "name": "mob/armadillo/scute_drop1", + "pitch": 0.9 + }, + "mob/armadillo/scute_drop2", + { + "name": "mob/armadillo/scute_drop2", + "pitch": 0.9 + } + ], + "subtitle": "subtitles.entity.armadillo.scute_drop" + }, + "entity.armadillo.step": { + "sounds": [ + "mob/armadillo/step1", + "mob/armadillo/step2", + "mob/armadillo/step3", + "mob/armadillo/step4", + "mob/armadillo/step5" + ], + "subtitle": "subtitles.block.generic.footsteps" + }, + "entity.armadillo.unroll_finish": { + "sounds": [ + "mob/armadillo/unroll_finish1", + "mob/armadillo/unroll_finish2" + ], + "subtitle": "subtitles.entity.armadillo.unroll_finish" + }, + "entity.armadillo.unroll_start": { + "sounds": [ + "mob/armadillo/unroll_start" + ], + "subtitle": "subtitles.entity.armadillo.unroll_start" + }, + "entity.armor_stand.break": { + "sounds": [ + "entity/armorstand/break1", + "entity/armorstand/break2", + "entity/armorstand/break3", + "entity/armorstand/break4" + ], + "subtitle": "subtitles.block.generic.break" + }, + "entity.armor_stand.fall": { + "sounds": [ + "dig/wood1", + "dig/wood2", + "dig/wood3", + "dig/wood4" + ], + "subtitle": "subtitles.entity.armor_stand.fall" + }, + "entity.armor_stand.hit": { + "sounds": [ + "entity/armorstand/hit1", + "entity/armorstand/hit2", + "entity/armorstand/hit3", + "entity/armorstand/hit4" + ], + "subtitle": "subtitles.block.generic.hit" + }, + "entity.armor_stand.place": { + "sounds": [ + "dig/stone1", + "dig/stone2", + "dig/stone3", + "dig/stone4" + ], + "subtitle": "subtitles.block.generic.place" + }, + "entity.arrow.hit": { + "sounds": [ + "random/bowhit1", + "random/bowhit2", + "random/bowhit3", + "random/bowhit4" + ], + "subtitle": "subtitles.entity.arrow.hit" + }, + "entity.arrow.hit_player": { + "sounds": [ + "random/successful_hit" + ], + "subtitle": "subtitles.entity.arrow.hit_player" + }, + "entity.arrow.shoot": { + "sounds": [ + "random/bow" + ], + "subtitle": "subtitles.entity.arrow.shoot" + }, + "entity.axolotl.attack": { + "sounds": [ + { + "name": "mob/axolotl/attack1", + "volume": 0.5 + }, + { + "name": "mob/axolotl/attack2", + "volume": 0.5 + }, + { + "name": "mob/axolotl/attack3", + "volume": 0.5 + }, + { + "name": "mob/axolotl/attack4", + "volume": 0.5 + } + ], + "subtitle": "subtitles.entity.axolotl.attack" + }, + "entity.axolotl.death": { + "sounds": [ + "mob/axolotl/death1", + "mob/axolotl/death2" + ], + "subtitle": "subtitles.entity.axolotl.death" + }, + "entity.axolotl.hurt": { + "sounds": [ + "mob/axolotl/hurt1", + "mob/axolotl/hurt2", + "mob/axolotl/hurt3", + "mob/axolotl/hurt4" + ], + "subtitle": "subtitles.entity.axolotl.hurt" + }, + "entity.axolotl.idle_air": { + "sounds": [ + "mob/axolotl/idle_air1", + "mob/axolotl/idle_air2", + { + "name": "mob/axolotl/idle_air3", + "pitch": 1.2, + "volume": 0.8 + }, + "mob/axolotl/idle_air4", + "mob/axolotl/idle_air5" + ], + "subtitle": "subtitles.entity.axolotl.idle_air" + }, + "entity.axolotl.idle_water": { + "sounds": [ + "mob/axolotl/idle1", + "mob/axolotl/idle2", + "mob/axolotl/idle3", + "mob/axolotl/idle4", + "mob/axolotl/idle5" + ], + "subtitle": "subtitles.entity.axolotl.idle_water" + }, + "entity.axolotl.splash": { + "sounds": [ + { + "name": "mob/dolphin/splash1", + "pitch": 1.2, + "volume": 0.9 + }, + { + "name": "mob/dolphin/splash2", + "pitch": 1.2, + "volume": 0.9 + }, + { + "name": "mob/dolphin/splash3", + "pitch": 1.2, + "volume": 0.9 + } + ], + "subtitle": "subtitles.entity.axolotl.splash" + }, + "entity.axolotl.swim": { + "sounds": [ + "entity/fish/swim5", + "entity/fish/swim6", + "entity/fish/swim7", + "mob/dolphin/swim1", + "mob/dolphin/swim2", + "mob/dolphin/swim3", + "mob/dolphin/swim4" + ], + "subtitle": "subtitles.entity.axolotl.swim" + }, + "entity.bat.ambient": { + "sounds": [ + "mob/bat/idle1", + "mob/bat/idle2", + "mob/bat/idle3", + "mob/bat/idle4" + ], + "subtitle": "subtitles.entity.bat.ambient" + }, + "entity.bat.death": { + "sounds": [ + "mob/bat/death" + ], + "subtitle": "subtitles.entity.bat.death" + }, + "entity.bat.hurt": { + "sounds": [ + "mob/bat/hurt1", + "mob/bat/hurt2", + "mob/bat/hurt3", + "mob/bat/hurt4" + ], + "subtitle": "subtitles.entity.bat.hurt" + }, + "entity.bat.loop": { + "sounds": [ + "mob/bat/loop" + ] + }, + "entity.bat.takeoff": { + "sounds": [ + "mob/bat/takeoff" + ], + "subtitle": "subtitles.entity.bat.takeoff" + }, + "entity.bee.death": { + "sounds": [ + "mob/bee/death1", + "mob/bee/death2" + ], + "subtitle": "subtitles.entity.bee.death" + }, + "entity.bee.hurt": { + "sounds": [ + "mob/bee/hurt1", + { + "name": "mob/bee/hurt1", + "pitch": 1.2 + }, + "mob/bee/hurt2", + { + "name": "mob/bee/hurt2", + "pitch": 1.2 + }, + "mob/bee/hurt3", + { + "name": "mob/bee/hurt3", + "pitch": 1.2 + } + ], + "subtitle": "subtitles.entity.bee.hurt" + }, + "entity.bee.loop": { + "sounds": [ + { + "attenuation_distance": 6, + "name": "mob/bee/loop1", + "volume": 0.6 + }, + { + "attenuation_distance": 6, + "name": "mob/bee/loop2", + "volume": 0.6 + }, + { + "attenuation_distance": 6, + "name": "mob/bee/loop3", + "volume": 0.65 + }, + { + "attenuation_distance": 6, + "name": "mob/bee/loop4", + "volume": 0.65 + }, + { + "attenuation_distance": 6, + "name": "mob/bee/loop5", + "volume": 0.7 + }, + { + "attenuation_distance": 6, + "name": "mob/bee/loop5", + "volume": 0.75 + } + ], + "subtitle": "subtitles.entity.bee.loop" + }, + "entity.bee.loop_aggressive": { + "sounds": [ + { + "attenuation_distance": 10, + "name": "mob/bee/aggressive1", + "volume": 0.8 + }, + { + "attenuation_distance": 10, + "name": "mob/bee/aggressive2", + "volume": 0.8 + }, + { + "attenuation_distance": 10, + "name": "mob/bee/aggressive3", + "volume": 0.8 + } + ], + "subtitle": "subtitles.entity.bee.loop_aggressive" + }, + "entity.bee.pollinate": { + "sounds": [ + { + "attenuation_distance": 12, + "name": "mob/bee/pollinate1", + "volume": 0.8 + }, + { + "attenuation_distance": 12, + "name": "mob/bee/pollinate2", + "volume": 0.8 + }, + { + "attenuation_distance": 12, + "name": "mob/bee/pollinate3", + "volume": 0.8 + }, + { + "attenuation_distance": 12, + "name": "mob/bee/pollinate4", + "volume": 0.8 + } + ], + "subtitle": "subtitles.entity.bee.pollinate" + }, + "entity.bee.sting": { + "sounds": [ + "mob/bee/sting", + { + "name": "mob/bee/sting", + "pitch": 0.8 + } + ], + "subtitle": "subtitles.entity.bee.sting" + }, + "entity.blaze.ambient": { + "sounds": [ + "mob/blaze/breathe1", + "mob/blaze/breathe2", + "mob/blaze/breathe3", + "mob/blaze/breathe4" + ], + "subtitle": "subtitles.entity.blaze.ambient" + }, + "entity.blaze.burn": { + "sounds": [ + "fire/fire" + ], + "subtitle": "subtitles.entity.blaze.burn" + }, + "entity.blaze.death": { + "sounds": [ + "mob/blaze/death" + ], + "subtitle": "subtitles.entity.blaze.death" + }, + "entity.blaze.hurt": { + "sounds": [ + "mob/blaze/hit1", + "mob/blaze/hit2", + "mob/blaze/hit3", + "mob/blaze/hit4" + ], + "subtitle": "subtitles.entity.blaze.hurt" + }, + "entity.blaze.shoot": { + "sounds": [ + "mob/ghast/fireball4" + ], + "subtitle": "subtitles.entity.blaze.shoot" + }, + "entity.boat.paddle_land": { + "sounds": [ + "entity/boat/paddle_land1", + "entity/boat/paddle_land2", + "entity/boat/paddle_land3", + "entity/boat/paddle_land4", + "entity/boat/paddle_land5", + "entity/boat/paddle_land6" + ], + "subtitle": "subtitles.entity.boat.paddle_land" + }, + "entity.boat.paddle_water": { + "sounds": [ + { + "name": "entity/boat/paddle_water1", + "volume": 0.8 + }, + { + "name": "entity/boat/paddle_water2", + "volume": 0.8 + }, + { + "name": "entity/boat/paddle_water3", + "volume": 0.8 + }, + { + "name": "entity/boat/paddle_water4", + "volume": 0.8 + }, + { + "name": "entity/boat/paddle_water5", + "volume": 0.8 + }, + { + "name": "entity/boat/paddle_water6", + "volume": 0.8 + }, + { + "name": "entity/boat/paddle_water7", + "volume": 0.8 + }, + { + "name": "entity/boat/paddle_water8", + "volume": 0.8 + } + ], + "subtitle": "subtitles.entity.boat.paddle_water" + }, + "entity.bogged.ambient": { + "sounds": [ + "mob/bogged/ambient1", + "mob/bogged/ambient2", + "mob/bogged/ambient3", + "mob/bogged/ambient4" + ], + "subtitle": "subtitles.entity.bogged.ambient" + }, + "entity.bogged.death": { + "sounds": [ + "mob/bogged/death" + ], + "subtitle": "subtitles.entity.bogged.death" + }, + "entity.bogged.hurt": { + "sounds": [ + "mob/bogged/hurt1", + "mob/bogged/hurt2", + "mob/bogged/hurt3", + "mob/bogged/hurt4" + ], + "subtitle": "subtitles.entity.bogged.hurt" + }, + "entity.bogged.shear": { + "sounds": [ + "mob/sheep/shear" + ], + "subtitle": "subtitles.item.shears.shear" + }, + "entity.bogged.step": { + "sounds": [ + "mob/bogged/step1", + "mob/bogged/step2", + "mob/bogged/step3", + "mob/bogged/step4" + ], + "subtitle": "subtitles.block.generic.footsteps" + }, + "entity.breeze.charge": { + "sounds": [ + "mob/breeze/charge1", + "mob/breeze/charge2", + "mob/breeze/charge3" + ], + "subtitle": "subtitles.entity.breeze.charge" + }, + "entity.breeze.death": { + "sounds": [ + "mob/breeze/death1", + "mob/breeze/death2" + ], + "subtitle": "subtitles.entity.breeze.death" + }, + "entity.breeze.deflect": { + "sounds": [ + "mob/breeze/deflect1", + "mob/breeze/deflect2", + "mob/breeze/deflect3" + ], + "subtitle": "subtitles.entity.breeze.deflect" + }, + "entity.breeze.hurt": { + "sounds": [ + "mob/breeze/hurt1", + "mob/breeze/hurt2", + "mob/breeze/hurt3" + ], + "subtitle": "subtitles.entity.breeze.hurt" + }, + "entity.breeze.idle_air": { + "sounds": [ + "mob/breeze/idle_air1", + "mob/breeze/idle_air2", + "mob/breeze/idle_air3", + "mob/breeze/idle_air4" + ], + "subtitle": "subtitles.entity.breeze.idle_air" + }, + "entity.breeze.idle_ground": { + "sounds": [ + "mob/breeze/idle1", + "mob/breeze/idle2", + "mob/breeze/idle3", + "mob/breeze/idle4" + ], + "subtitle": "subtitles.entity.breeze.idle_ground" + }, + "entity.breeze.inhale": { + "sounds": [ + "mob/breeze/inhale1", + { + "name": "mob/breeze/inhale1", + "pitch": 1.1 + }, + "mob/breeze/inhale2", + { + "name": "mob/breeze/inhale2", + "pitch": 1.1 + } + ], + "subtitle": "subtitles.entity.breeze.inhale" + }, + "entity.breeze.jump": { + "sounds": [ + "mob/breeze/jump1", + "mob/breeze/jump2" + ], + "subtitle": "subtitles.entity.breeze.jump" + }, + "entity.breeze.land": { + "sounds": [ + "mob/breeze/land1", + "mob/breeze/land2" + ], + "subtitle": "subtitles.entity.breeze.land" + }, + "entity.breeze.shoot": { + "sounds": [ + "mob/breeze/shoot", + { + "name": "mob/breeze/shoot", + "pitch": 1.1 + }, + { + "name": "mob/breeze/shoot", + "pitch": 1.2 + } + ], + "subtitle": "subtitles.entity.breeze.shoot" + }, + "entity.breeze.slide": { + "sounds": [ + "mob/breeze/slide1", + "mob/breeze/slide2", + "mob/breeze/slide3", + "mob/breeze/slide4" + ], + "subtitle": "subtitles.entity.breeze.slide" + }, + "entity.breeze.whirl": { + "sounds": [ + "mob/breeze/whirl" + ], + "subtitle": "subtitles.entity.breeze.whirl" + }, + "entity.breeze.wind_burst": { + "sounds": [ + { + "name": "mob/breeze/wind_burst1", + "pitch": 1.2 + }, + { + "name": "mob/breeze/wind_burst2", + "pitch": 1.2 + }, + { + "name": "mob/breeze/wind_burst3", + "pitch": 1.2 + } + ], + "subtitle": "subtitles.entity.breeze.wind_burst" + }, + "entity.camel.ambient": { + "sounds": [ + { + "name": "mob/camel/ambient1", + "volume": 0.45 + }, + { + "name": "mob/camel/ambient2", + "volume": 0.45 + }, + { + "name": "mob/camel/ambient3", + "volume": 0.5 + }, + { + "name": "mob/camel/ambient4", + "volume": 0.5 + }, + { + "name": "mob/camel/ambient5", + "volume": 0.5 + }, + { + "name": "mob/camel/ambient6", + "volume": 0.5 + }, + { + "name": "mob/camel/ambient7", + "volume": 0.3 + }, + { + "name": "mob/camel/ambient8", + "volume": 0.3 + } + ], + "subtitle": "subtitles.entity.camel.ambient" + }, + "entity.camel.dash": { + "sounds": [ + "mob/camel/dash1", + "mob/camel/dash2", + "mob/camel/dash3", + "mob/camel/dash4", + "mob/camel/dash5", + "mob/camel/dash6" + ], + "subtitle": "subtitles.entity.camel.dash" + }, + "entity.camel.dash_ready": { + "sounds": [ + { + "name": "mob/camel/dash_ready1", + "volume": 0.25 + } + ], + "subtitle": "subtitles.entity.camel.dash_ready" + }, + "entity.camel.death": { + "sounds": [ + "mob/camel/death1", + "mob/camel/death2" + ], + "subtitle": "subtitles.entity.camel.death" + }, + "entity.camel.eat": { + "sounds": [ + { + "name": "mob/camel/eat1", + "volume": 0.2 + }, + { + "name": "mob/camel/eat2", + "volume": 0.2 + }, + { + "name": "mob/camel/eat3", + "volume": 0.2 + }, + { + "name": "mob/camel/eat4", + "volume": 0.2 + }, + { + "name": "mob/camel/eat5", + "volume": 0.2 + } + ], + "subtitle": "subtitles.entity.camel.eat" + }, + "entity.camel.hurt": { + "sounds": [ + "mob/camel/hurt1", + "mob/camel/hurt2", + "mob/camel/hurt3", + "mob/camel/hurt4" + ], + "subtitle": "subtitles.entity.camel.hurt" + }, + "entity.camel.saddle": { + "sounds": [ + { + "name": "entity.horse.saddle", + "pitch": 0.8, + "type": "event" + } + ], + "subtitle": "subtitles.entity.camel.saddle" + }, + "entity.camel.sit": { + "sounds": [ + { + "name": "mob/camel/sit1", + "volume": 0.3 + }, + { + "name": "mob/camel/sit2", + "volume": 0.3 + }, + { + "name": "mob/camel/sit3", + "volume": 0.3 + }, + { + "name": "mob/camel/sit4", + "volume": 0.3 + } + ], + "subtitle": "subtitles.entity.camel.sit" + }, + "entity.camel.stand": { + "sounds": [ + { + "name": "mob/camel/stand1", + "volume": 0.3 + }, + { + "name": "mob/camel/stand2", + "volume": 0.3 + }, + { + "name": "mob/camel/stand3", + "volume": 0.3 + }, + { + "name": "mob/camel/stand4", + "volume": 0.3 + }, + { + "name": "mob/camel/stand5", + "volume": 0.3 + } + ], + "subtitle": "subtitles.entity.camel.stand" + }, + "entity.camel.step": { + "sounds": [ + { + "name": "mob/camel/step1", + "volume": 0.5 + }, + { + "name": "mob/camel/step2", + "volume": 0.5 + }, + { + "name": "mob/camel/step3", + "volume": 0.5 + }, + { + "name": "mob/camel/step4", + "volume": 0.5 + }, + { + "name": "mob/camel/step5", + "volume": 0.5 + }, + { + "name": "mob/camel/step6", + "volume": 0.5 + } + ], + "subtitle": "subtitles.block.generic.footsteps" + }, + "entity.camel.step_sand": { + "sounds": [ + { + "name": "mob/camel/step_sand1", + "volume": 0.45 + }, + { + "name": "mob/camel/step_sand2", + "volume": 0.45 + }, + { + "name": "mob/camel/step_sand3", + "volume": 0.45 + }, + { + "name": "mob/camel/step_sand4", + "volume": 0.45 + }, + { + "name": "mob/camel/step_sand5", + "volume": 0.45 + }, + { + "name": "mob/camel/step_sand6", + "volume": 0.45 + } + ], + "subtitle": "subtitles.block.generic.footsteps" + }, + "entity.cat.ambient": { + "sounds": [ + { + "name": "mob/cat/meow1", + "volume": 0.6 + }, + { + "name": "mob/cat/meow2", + "volume": 0.5 + }, + { + "name": "mob/cat/meow3", + "volume": 0.6 + }, + { + "name": "mob/cat/meow4", + "volume": 0.5 + } + ], + "subtitle": "subtitles.entity.cat.ambient" + }, + "entity.cat.beg_for_food": { + "sounds": [ + { + "name": "mob/cat/beg1", + "volume": 0.7 + }, + { + "name": "mob/cat/beg2", + "volume": 0.7 + }, + { + "name": "mob/cat/beg3", + "volume": 0.7 + } + ], + "subtitle": "subtitles.entity.cat.beg_for_food" + }, + "entity.cat.death": { + "sounds": [ + { + "name": "mob/cat/hitt1", + "pitch": 0.9, + "volume": 0.75 + }, + { + "name": "mob/cat/hitt2", + "pitch": 0.9, + "volume": 0.75 + }, + { + "name": "mob/cat/hitt3", + "pitch": 0.9, + "volume": 0.75 + } + ], + "subtitle": "subtitles.entity.cat.death" + }, + "entity.cat.eat": { + "sounds": [ + "mob/cat/eat1", + "mob/cat/eat2" + ], + "subtitle": "subtitles.entity.cat.eat" + }, + "entity.cat.hiss": { + "sounds": [ + { + "name": "mob/cat/hiss1", + "volume": 0.4 + }, + { + "name": "mob/cat/hiss2", + "volume": 0.4 + }, + { + "name": "mob/cat/hiss3", + "volume": 0.4 + } + ], + "subtitle": "subtitles.entity.cat.hiss" + }, + "entity.cat.hurt": { + "sounds": [ + { + "name": "mob/cat/hitt1", + "volume": 0.65 + }, + { + "name": "mob/cat/hitt2", + "volume": 0.65 + }, + { + "name": "mob/cat/hitt3", + "volume": 0.65 + } + ], + "subtitle": "subtitles.entity.cat.hurt" + }, + "entity.cat.purr": { + "sounds": [ + { + "name": "mob/cat/purr1", + "volume": 0.7 + }, + { + "name": "mob/cat/purr2", + "volume": 0.7 + }, + { + "name": "mob/cat/purr3", + "volume": 0.7 + } + ], + "subtitle": "subtitles.entity.cat.purr" + }, + "entity.cat.purreow": { + "sounds": [ + { + "name": "mob/cat/purreow1", + "volume": 0.5 + }, + { + "name": "mob/cat/purreow2", + "volume": 0.5 + } + ], + "subtitle": "subtitles.entity.cat.ambient" + }, + "entity.cat.stray_ambient": { + "sounds": [ + { + "name": "mob/cat/stray/idle1", + "volume": 0.35 + }, + { + "name": "mob/cat/stray/idle2", + "volume": 0.35 + }, + { + "name": "mob/cat/stray/idle3", + "volume": 0.35 + }, + { + "name": "mob/cat/stray/idle4", + "volume": 0.35 + } + ], + "subtitle": "subtitles.entity.cat.ambient" + }, + "entity.chicken.ambient": { + "sounds": [ + "mob/chicken/say1", + "mob/chicken/say2", + "mob/chicken/say3" + ], + "subtitle": "subtitles.entity.chicken.ambient" + }, + "entity.chicken.death": { + "sounds": [ + "mob/chicken/hurt1", + "mob/chicken/hurt2" + ], + "subtitle": "subtitles.entity.chicken.death" + }, + "entity.chicken.egg": { + "sounds": [ + "mob/chicken/plop" + ], + "subtitle": "subtitles.entity.chicken.egg" + }, + "entity.chicken.hurt": { + "sounds": [ + "mob/chicken/hurt1", + "mob/chicken/hurt2" + ], + "subtitle": "subtitles.entity.chicken.hurt" + }, + "entity.chicken.step": { + "sounds": [ + "mob/chicken/step1", + "mob/chicken/step2" + ], + "subtitle": "subtitles.block.generic.footsteps" + }, + "entity.cod.ambient": { + "sounds": [] + }, + "entity.cod.death": { + "sounds": [ + "entity/fish/hurt1", + "entity/fish/hurt2", + "entity/fish/hurt3", + "entity/fish/hurt4" + ], + "subtitle": "subtitles.entity.cod.death" + }, + "entity.cod.flop": { + "sounds": [ + { + "name": "entity/fish/flop1", + "volume": 0.3 + }, + { + "name": "entity/fish/flop2", + "volume": 0.3 + }, + { + "name": "entity/fish/flop3", + "volume": 0.3 + }, + { + "name": "entity/fish/flop4", + "volume": 0.3 + } + ], + "subtitle": "subtitles.entity.cod.flop" + }, + "entity.cod.hurt": { + "sounds": [ + "entity/fish/hurt1", + "entity/fish/hurt2", + "entity/fish/hurt3", + "entity/fish/hurt4" + ], + "subtitle": "subtitles.entity.cod.hurt" + }, + "entity.cow.ambient": { + "sounds": [ + "mob/cow/say1", + "mob/cow/say2", + "mob/cow/say3", + "mob/cow/say4" + ], + "subtitle": "subtitles.entity.cow.ambient" + }, + "entity.cow.death": { + "sounds": [ + "mob/cow/hurt1", + "mob/cow/hurt2", + "mob/cow/hurt3" + ], + "subtitle": "subtitles.entity.cow.death" + }, + "entity.cow.hurt": { + "sounds": [ + "mob/cow/hurt1", + "mob/cow/hurt2", + "mob/cow/hurt3" + ], + "subtitle": "subtitles.entity.cow.hurt" + }, + "entity.cow.milk": { + "sounds": [ + "entity/cow/milk1", + "entity/cow/milk2", + "entity/cow/milk3" + ], + "subtitle": "subtitles.entity.cow.milk" + }, + "entity.cow.step": { + "sounds": [ + "mob/cow/step1", + "mob/cow/step2", + "mob/cow/step3", + "mob/cow/step4" + ], + "subtitle": "subtitles.block.generic.footsteps" + }, + "entity.creaking.activate": { + "sounds": [ + "mob/creaking/creaking_activate" + ], + "subtitle": "subtitles.entity.creaking.activate" + }, + "entity.creaking.ambient": { + "sounds": [ + "mob/creaking/creaking_idle1", + "mob/creaking/creaking_idle2", + "mob/creaking/creaking_idle3", + "mob/creaking/creaking_idle4", + "mob/creaking/creaking_idle5", + "mob/creaking/creaking_idle6" + ], + "subtitle": "subtitles.entity.creaking.ambient" + }, + "entity.creaking.attack": { + "sounds": [ + "mob/creaking/creaking_attack1", + "mob/creaking/creaking_attack2", + "mob/creaking/creaking_attack3", + "mob/creaking/creaking_attack4" + ], + "subtitle": "subtitles.entity.creaking.attack" + }, + "entity.creaking.deactivate": { + "sounds": [ + "mob/creaking/creaking_deactivate" + ], + "subtitle": "subtitles.entity.creaking.deactivate" + }, + "entity.creaking.death": { + "sounds": [ + "mob/creaking/creaking_death" + ], + "subtitle": "subtitles.entity.creaking.death" + }, + "entity.creaking.freeze": { + "sounds": [ + "mob/creaking/creaking_freeze1", + "mob/creaking/creaking_freeze2", + "mob/creaking/creaking_freeze3", + "mob/creaking/creaking_freeze4" + ], + "subtitle": "subtitles.entity.creaking.freeze" + }, + "entity.creaking.spawn": { + "sounds": [ + "mob/creaking/creaking_spawn" + ], + "subtitle": "subtitles.entity.creaking.spawn" + }, + "entity.creaking.step": { + "sounds": [ + "mob/creaking/creaking_step1", + "mob/creaking/creaking_step2", + "mob/creaking/creaking_step3", + "mob/creaking/creaking_step4", + "mob/creaking/creaking_step5" + ], + "subtitle": "subtitles.block.generic.footsteps" + }, + "entity.creaking.sway": { + "sounds": [ + "mob/creaking/creaking_sway1", + "mob/creaking/creaking_sway2", + "mob/creaking/creaking_sway3", + "mob/creaking/creaking_sway4" + ], + "subtitle": "subtitles.entity.creaking.sway" + }, + "entity.creaking.twitch": { + "sounds": [ + "mob/creaking/creaking_twitch" + ], + "subtitle": "subtitles.entity.creaking.twitch" + }, + "entity.creaking.unfreeze": { + "sounds": [ + "mob/creaking/creaking_unfreeze1", + "mob/creaking/creaking_unfreeze2", + "mob/creaking/creaking_unfreeze3" + ], + "subtitle": "subtitles.entity.creaking.unfreeze" + }, + "entity.creeper.death": { + "sounds": [ + "mob/creeper/death" + ], + "subtitle": "subtitles.entity.creeper.death" + }, + "entity.creeper.hurt": { + "sounds": [ + "mob/creeper/say1", + "mob/creeper/say2", + "mob/creeper/say3", + "mob/creeper/say4" + ], + "subtitle": "subtitles.entity.creeper.hurt" + }, + "entity.creeper.primed": { + "sounds": [ + "random/fuse" + ], + "subtitle": "subtitles.entity.creeper.primed" + }, + "entity.dolphin.ambient": { + "sounds": [ + "mob/dolphin/blowhole1", + "mob/dolphin/blowhole2", + "mob/dolphin/idle1", + "mob/dolphin/idle2", + "mob/dolphin/idle3", + "mob/dolphin/idle4", + "mob/dolphin/idle5", + "mob/dolphin/idle6" + ], + "subtitle": "subtitles.entity.dolphin.ambient" + }, + "entity.dolphin.ambient_water": { + "sounds": [ + { + "name": "mob/dolphin/idle_water1", + "volume": 0.8 + }, + "mob/dolphin/idle_water2", + "mob/dolphin/idle_water3", + "mob/dolphin/idle_water4", + "mob/dolphin/idle_water5", + "mob/dolphin/idle_water6", + { + "name": "mob/dolphin/idle_water7", + "volume": 0.75 + }, + { + "name": "mob/dolphin/idle_water8", + "volume": 0.75 + }, + "mob/dolphin/idle_water9", + { + "name": "mob/dolphin/idle_water10", + "volume": 0.8 + } + ], + "subtitle": "subtitles.entity.dolphin.ambient_water" + }, + "entity.dolphin.attack": { + "sounds": [ + "mob/dolphin/attack1", + "mob/dolphin/attack2", + "mob/dolphin/attack3" + ], + "subtitle": "subtitles.entity.dolphin.attack" + }, + "entity.dolphin.death": { + "sounds": [ + "mob/dolphin/death1", + "mob/dolphin/death2" + ], + "subtitle": "subtitles.entity.dolphin.death" + }, + "entity.dolphin.eat": { + "sounds": [ + { + "name": "mob/dolphin/eat1", + "volume": 0.75 + }, + { + "name": "mob/dolphin/eat2", + "volume": 0.75 + }, + { + "name": "mob/dolphin/eat3", + "volume": 0.75 + } + ], + "subtitle": "subtitles.entity.dolphin.eat" + }, + "entity.dolphin.hurt": { + "sounds": [ + "mob/dolphin/hurt1", + "mob/dolphin/hurt2", + "mob/dolphin/hurt3" + ], + "subtitle": "subtitles.entity.dolphin.hurt" + }, + "entity.dolphin.jump": { + "sounds": [ + { + "name": "mob/dolphin/jump1", + "volume": 0.75 + }, + { + "name": "mob/dolphin/jump2", + "volume": 0.75 + }, + { + "name": "mob/dolphin/jump3", + "volume": 0.75 + } + ], + "subtitle": "subtitles.entity.dolphin.jump" + }, + "entity.dolphin.play": { + "sounds": [ + "mob/dolphin/play1", + "mob/dolphin/play2" + ], + "subtitle": "subtitles.entity.dolphin.play" + }, + "entity.dolphin.splash": { + "sounds": [ + "mob/dolphin/splash1", + "mob/dolphin/splash2", + "mob/dolphin/splash3" + ], + "subtitle": "subtitles.entity.dolphin.splash" + }, + "entity.dolphin.swim": { + "sounds": [ + "entity/fish/swim5", + "entity/fish/swim6", + "entity/fish/swim7", + "mob/dolphin/swim1", + "mob/dolphin/swim2", + "mob/dolphin/swim3", + "mob/dolphin/swim4" + ], + "subtitle": "subtitles.entity.dolphin.swim" + }, + "entity.donkey.ambient": { + "sounds": [ + "mob/horse/donkey/idle1", + "mob/horse/donkey/idle2", + "mob/horse/donkey/idle3" + ], + "subtitle": "subtitles.entity.donkey.ambient" + }, + "entity.donkey.angry": { + "sounds": [ + "mob/horse/donkey/angry1", + "mob/horse/donkey/angry2" + ], + "subtitle": "subtitles.entity.donkey.angry" + }, + "entity.donkey.chest": { + "sounds": [ + "mob/chicken/plop" + ], + "subtitle": "subtitles.entity.donkey.chest" + }, + "entity.donkey.death": { + "sounds": [ + "mob/horse/donkey/death" + ], + "subtitle": "subtitles.entity.donkey.death" + }, + "entity.donkey.eat": { + "sounds": [ + "entity/horse/eat1", + "entity/horse/eat2", + "entity/horse/eat3", + "entity/horse/eat4", + "entity/horse/eat5" + ], + "subtitle": "subtitles.entity.donkey.eat" + }, + "entity.donkey.hurt": { + "sounds": [ + "mob/horse/donkey/hit1", + "mob/horse/donkey/hit2", + "mob/horse/donkey/hit3" + ], + "subtitle": "subtitles.entity.donkey.hurt" + }, + "entity.donkey.jump": { + "sounds": [ + "mob/horse/jump" + ], + "subtitle": "subtitles.entity.donkey.jump" + }, + "entity.dragon_fireball.explode": { + "sounds": [ + "random/explode1", + "random/explode2", + "random/explode3", + "random/explode4" + ], + "subtitle": "subtitles.entity.generic.explode" + }, + "entity.drowned.ambient": { + "sounds": [ + { + "name": "mob/drowned/idle1", + "volume": 0.9 + }, + { + "name": "mob/drowned/idle2", + "volume": 0.9 + }, + { + "name": "mob/drowned/idle3", + "volume": 0.9 + }, + { + "name": "mob/drowned/idle4", + "volume": 0.9 + }, + { + "name": "mob/drowned/idle5", + "volume": 0.9 + } + ], + "subtitle": "subtitles.entity.drowned.ambient" + }, + "entity.drowned.ambient_water": { + "sounds": [ + { + "name": "mob/drowned/water/idle1", + "volume": 0.9 + }, + { + "name": "mob/drowned/water/idle2", + "volume": 0.9 + }, + { + "name": "mob/drowned/water/idle3", + "volume": 0.9 + }, + { + "name": "mob/drowned/water/idle4", + "volume": 0.9 + } + ], + "subtitle": "subtitles.entity.drowned.ambient_water" + }, + "entity.drowned.death": { + "sounds": [ + { + "name": "mob/drowned/death1", + "volume": 0.9 + }, + { + "name": "mob/drowned/death2", + "volume": 0.9 + } + ], + "subtitle": "subtitles.entity.drowned.death" + }, + "entity.drowned.death_water": { + "sounds": [ + { + "name": "mob/drowned/water/death1", + "volume": 0.9 + }, + { + "name": "mob/drowned/water/death2", + "volume": 0.9 + } + ], + "subtitle": "subtitles.entity.drowned.death" + }, + "entity.drowned.hurt": { + "sounds": [ + { + "name": "mob/drowned/hurt1", + "volume": 0.9 + }, + { + "name": "mob/drowned/hurt2", + "volume": 0.9 + }, + { + "name": "mob/drowned/hurt3", + "volume": 0.9 + } + ], + "subtitle": "subtitles.entity.drowned.hurt" + }, + "entity.drowned.hurt_water": { + "sounds": [ + { + "name": "mob/drowned/water/hurt1", + "volume": 0.9 + }, + { + "name": "mob/drowned/water/hurt2", + "volume": 0.9 + }, + { + "name": "mob/drowned/water/hurt3", + "volume": 0.9 + } + ], + "subtitle": "subtitles.entity.drowned.hurt" + }, + "entity.drowned.shoot": { + "sounds": [ + "item/trident/throw1", + "item/trident/throw2" + ], + "subtitle": "subtitles.entity.drowned.shoot" + }, + "entity.drowned.step": { + "sounds": [ + "mob/drowned/step1", + "mob/drowned/step2", + "mob/drowned/step3", + "mob/drowned/step4", + "mob/drowned/step5" + ], + "subtitle": "subtitles.block.generic.footsteps" + }, + "entity.drowned.swim": { + "sounds": [ + "liquid/swim1", + "liquid/swim2", + "liquid/swim3", + "liquid/swim4", + "liquid/swim5" + ], + "subtitle": "subtitles.entity.drowned.swim" + }, + "entity.egg.throw": { + "sounds": [ + "random/bow" + ], + "subtitle": "subtitles.entity.egg.throw" + }, + "entity.elder_guardian.ambient": { + "sounds": [ + "mob/guardian/elder_idle1", + "mob/guardian/elder_idle2", + "mob/guardian/elder_idle3", + "mob/guardian/elder_idle4" + ], + "subtitle": "subtitles.entity.elder_guardian.ambient" + }, + "entity.elder_guardian.ambient_land": { + "sounds": [ + "mob/guardian/land_idle1", + "mob/guardian/land_idle2", + "mob/guardian/land_idle3", + "mob/guardian/land_idle4" + ], + "subtitle": "subtitles.entity.elder_guardian.ambient_land" + }, + "entity.elder_guardian.curse": { + "sounds": [ + "mob/guardian/curse" + ], + "subtitle": "subtitles.entity.elder_guardian.curse" + }, + "entity.elder_guardian.death": { + "sounds": [ + "mob/guardian/elder_death" + ], + "subtitle": "subtitles.entity.elder_guardian.death" + }, + "entity.elder_guardian.death_land": { + "sounds": [ + "mob/guardian/land_death" + ], + "subtitle": "subtitles.entity.elder_guardian.death" + }, + "entity.elder_guardian.flop": { + "sounds": [ + "mob/guardian/flop1", + "mob/guardian/flop2", + "mob/guardian/flop3", + "mob/guardian/flop4" + ], + "subtitle": "subtitles.entity.elder_guardian.flop" + }, + "entity.elder_guardian.hurt": { + "sounds": [ + "mob/guardian/elder_hit1", + "mob/guardian/elder_hit2", + "mob/guardian/elder_hit3", + "mob/guardian/elder_hit4" + ], + "subtitle": "subtitles.entity.elder_guardian.hurt" + }, + "entity.elder_guardian.hurt_land": { + "sounds": [ + "mob/guardian/land_hit1", + "mob/guardian/land_hit2", + "mob/guardian/land_hit3", + "mob/guardian/land_hit4" + ], + "subtitle": "subtitles.entity.elder_guardian.hurt" + }, + "entity.ender_dragon.ambient": { + "sounds": [ + "mob/enderdragon/growl1", + "mob/enderdragon/growl2", + "mob/enderdragon/growl3", + "mob/enderdragon/growl4" + ], + "subtitle": "subtitles.entity.ender_dragon.ambient" + }, + "entity.ender_dragon.death": { + "sounds": [ + "mob/enderdragon/end" + ], + "subtitle": "subtitles.entity.ender_dragon.death" + }, + "entity.ender_dragon.flap": { + "sounds": [ + "mob/enderdragon/wings1", + "mob/enderdragon/wings2", + "mob/enderdragon/wings3", + "mob/enderdragon/wings4", + "mob/enderdragon/wings5", + "mob/enderdragon/wings6" + ], + "subtitle": "subtitles.entity.ender_dragon.flap" + }, + "entity.ender_dragon.growl": { + "sounds": [ + "mob/enderdragon/growl1", + "mob/enderdragon/growl2", + "mob/enderdragon/growl3", + "mob/enderdragon/growl4" + ], + "subtitle": "subtitles.entity.ender_dragon.growl" + }, + "entity.ender_dragon.hurt": { + "sounds": [ + "mob/enderdragon/hit1", + "mob/enderdragon/hit2", + "mob/enderdragon/hit3", + "mob/enderdragon/hit4" + ], + "subtitle": "subtitles.entity.ender_dragon.hurt" + }, + "entity.ender_dragon.shoot": { + "sounds": [ + "mob/ghast/fireball4" + ], + "subtitle": "subtitles.entity.ender_dragon.shoot" + }, + "entity.ender_eye.death": { + "sounds": [ + { + "name": "entity/endereye/dead1", + "volume": 1.3 + }, + { + "name": "entity/endereye/dead2", + "volume": 1.3 + } + ], + "subtitle": "subtitles.entity.ender_eye.death" + }, + "entity.ender_eye.launch": { + "sounds": [ + "entity/endereye/endereye_launch1", + "entity/endereye/endereye_launch2" + ], + "subtitle": "subtitles.entity.ender_eye.launch" + }, + "entity.ender_pearl.throw": { + "sounds": [ + "random/bow" + ], + "subtitle": "subtitles.entity.ender_pearl.throw" + }, + "entity.enderman.ambient": { + "sounds": [ + "mob/endermen/idle1", + "mob/endermen/idle2", + "mob/endermen/idle3", + "mob/endermen/idle4", + "mob/endermen/idle5" + ], + "subtitle": "subtitles.entity.enderman.ambient" + }, + "entity.enderman.death": { + "sounds": [ + "mob/endermen/death" + ], + "subtitle": "subtitles.entity.enderman.death" + }, + "entity.enderman.hurt": { + "sounds": [ + "mob/endermen/hit1", + "mob/endermen/hit2", + "mob/endermen/hit3", + "mob/endermen/hit4" + ], + "subtitle": "subtitles.entity.enderman.hurt" + }, + "entity.enderman.scream": { + "sounds": [ + "mob/endermen/scream1", + "mob/endermen/scream2", + "mob/endermen/scream3", + "mob/endermen/scream4" + ], + "subtitle": "subtitles.entity.enderman.scream" + }, + "entity.enderman.stare": { + "sounds": [ + "mob/endermen/stare" + ], + "subtitle": "subtitles.entity.enderman.stare" + }, + "entity.enderman.teleport": { + "sounds": [ + "mob/endermen/portal", + "mob/endermen/portal2" + ], + "subtitle": "subtitles.entity.enderman.teleport" + }, + "entity.endermite.ambient": { + "sounds": [ + "mob/silverfish/say1", + "mob/silverfish/say2", + "mob/silverfish/say3", + "mob/silverfish/say4" + ], + "subtitle": "subtitles.entity.endermite.ambient" + }, + "entity.endermite.death": { + "sounds": [ + "mob/silverfish/kill" + ], + "subtitle": "subtitles.entity.endermite.death" + }, + "entity.endermite.hurt": { + "sounds": [ + "mob/silverfish/hit1", + "mob/silverfish/hit2", + "mob/silverfish/hit3" + ], + "subtitle": "subtitles.entity.endermite.hurt" + }, + "entity.endermite.step": { + "sounds": [ + "mob/silverfish/step1", + "mob/silverfish/step2", + "mob/silverfish/step3", + "mob/silverfish/step4" + ], + "subtitle": "subtitles.block.generic.footsteps" + }, + "entity.evoker.ambient": { + "sounds": [ + "mob/evocation_illager/idle1", + "mob/evocation_illager/idle2", + "mob/evocation_illager/idle3", + "mob/evocation_illager/idle4" + ], + "subtitle": "subtitles.entity.evoker.ambient" + }, + "entity.evoker.cast_spell": { + "sounds": [ + "mob/evocation_illager/cast1", + "mob/evocation_illager/cast2" + ], + "subtitle": "subtitles.entity.evoker.cast_spell" + }, + "entity.evoker.celebrate": { + "sounds": [ + "mob/evocation_illager/celebrate", + "mob/evocation_illager/idle1", + "mob/evocation_illager/idle2" + ], + "subtitle": "subtitles.entity.evoker.celebrate" + }, + "entity.evoker.death": { + "sounds": [ + "mob/evocation_illager/death1", + "mob/evocation_illager/death2" + ], + "subtitle": "subtitles.entity.evoker.death" + }, + "entity.evoker.hurt": { + "sounds": [ + "mob/evocation_illager/hurt1", + "mob/evocation_illager/hurt2" + ], + "subtitle": "subtitles.entity.evoker.hurt" + }, + "entity.evoker.prepare_attack": { + "sounds": [ + "mob/evocation_illager/prepare_attack1", + "mob/evocation_illager/prepare_attack2" + ], + "subtitle": "subtitles.entity.evoker.prepare_attack" + }, + "entity.evoker.prepare_summon": { + "sounds": [ + "mob/evocation_illager/prepare_summon" + ], + "subtitle": "subtitles.entity.evoker.prepare_summon" + }, + "entity.evoker.prepare_wololo": { + "sounds": [ + "mob/evocation_illager/prepare_wololo" + ], + "subtitle": "subtitles.entity.evoker.prepare_wololo" + }, + "entity.evoker_fangs.attack": { + "sounds": [ + "mob/evocation_illager/fangs" + ], + "subtitle": "subtitles.entity.evoker_fangs.attack" + }, + "entity.experience_bottle.throw": { + "sounds": [ + "random/bow" + ], + "subtitle": "subtitles.entity.potion.throw" + }, + "entity.experience_orb.pickup": { + "sounds": [ + "random/orb" + ], + "subtitle": "subtitles.entity.experience_orb.pickup" + }, + "entity.firework_rocket.blast": { + "sounds": [ + "fireworks/blast1" + ], + "subtitle": "subtitles.entity.firework_rocket.blast" + }, + "entity.firework_rocket.blast_far": { + "sounds": [ + "fireworks/blast_far1" + ], + "subtitle": "subtitles.entity.firework_rocket.blast" + }, + "entity.firework_rocket.large_blast": { + "sounds": [ + "fireworks/largeblast1" + ], + "subtitle": "subtitles.entity.firework_rocket.blast" + }, + "entity.firework_rocket.large_blast_far": { + "sounds": [ + "fireworks/largeblast_far1" + ], + "subtitle": "subtitles.entity.firework_rocket.blast" + }, + "entity.firework_rocket.launch": { + "sounds": [ + "fireworks/launch1" + ], + "subtitle": "subtitles.entity.firework_rocket.launch" + }, + "entity.firework_rocket.shoot": { + "sounds": [ + "random/bow" + ], + "subtitle": "subtitles.entity.firework_rocket.launch" + }, + "entity.firework_rocket.twinkle": { + "sounds": [ + "fireworks/twinkle1" + ], + "subtitle": "subtitles.entity.firework_rocket.twinkle" + }, + "entity.firework_rocket.twinkle_far": { + "sounds": [ + "fireworks/twinkle_far1" + ], + "subtitle": "subtitles.entity.firework_rocket.twinkle" + }, + "entity.fish.swim": { + "sounds": [ + "entity/fish/swim1", + "entity/fish/swim2", + "entity/fish/swim3", + "entity/fish/swim4", + "entity/fish/swim5", + "entity/fish/swim6", + "entity/fish/swim7" + ], + "subtitle": "subtitles.entity.fish.swim" + }, + "entity.fishing_bobber.retrieve": { + "sounds": [ + { + "name": "entity/bobber/retrieve1", + "pitch": 2.4 + }, + { + "name": "entity/bobber/retrieve2", + "pitch": 2.4 + } + ], + "subtitle": "subtitles.entity.fishing_bobber.retrieve" + }, + "entity.fishing_bobber.splash": { + "sounds": [ + "random/splash" + ], + "subtitle": "subtitles.entity.fishing_bobber.splash" + }, + "entity.fishing_bobber.throw": { + "sounds": [ + "entity/bobber/castfast" + ], + "subtitle": "subtitles.entity.fishing_bobber.throw" + }, + "entity.fox.aggro": { + "sounds": [ + { + "name": "mob/fox/aggro1", + "volume": 0.65 + }, + { + "name": "mob/fox/aggro2", + "volume": 0.65 + }, + { + "name": "mob/fox/aggro3", + "volume": 0.65 + }, + { + "name": "mob/fox/aggro4", + "volume": 0.65 + }, + { + "name": "mob/fox/aggro5", + "volume": 0.65 + }, + { + "name": "mob/fox/aggro6", + "volume": 0.65 + }, + { + "name": "mob/fox/aggro7", + "volume": 0.65 + } + ], + "subtitle": "subtitles.entity.fox.aggro" + }, + "entity.fox.ambient": { + "sounds": [ + { + "name": "mob/fox/idle1", + "volume": 0.8 + }, + "mob/fox/idle2", + "mob/fox/idle3", + "mob/fox/idle4", + "mob/fox/idle5", + "mob/fox/idle6" + ], + "subtitle": "subtitles.entity.fox.ambient" + }, + "entity.fox.bite": { + "sounds": [ + { + "name": "mob/fox/bite1", + "pitch": 1.1, + "volume": 0.6 + }, + { + "name": "mob/fox/bite2", + "pitch": 1.1, + "volume": 0.6 + }, + { + "name": "mob/fox/bite3", + "pitch": 1.1, + "volume": 0.6 + } + ], + "subtitle": "subtitles.entity.fox.bite" + }, + "entity.fox.death": { + "sounds": [ + { + "name": "mob/fox/death1", + "volume": 0.9 + }, + { + "name": "mob/fox/death2", + "volume": 0.9 + } + ], + "subtitle": "subtitles.entity.fox.death" + }, + "entity.fox.eat": { + "sounds": [ + { + "name": "mob/fox/eat1", + "volume": 0.65 + }, + { + "name": "mob/fox/eat2", + "volume": 0.65 + }, + { + "name": "mob/fox/eat3", + "volume": 0.65 + } + ], + "subtitle": "subtitles.entity.fox.eat" + }, + "entity.fox.hurt": { + "sounds": [ + { + "name": "mob/fox/hurt1", + "volume": 0.75 + }, + { + "name": "mob/fox/hurt2", + "volume": 0.75 + }, + { + "name": "mob/fox/hurt3", + "volume": 0.75 + }, + { + "name": "mob/fox/hurt4", + "volume": 0.75 + } + ], + "subtitle": "subtitles.entity.fox.hurt" + }, + "entity.fox.screech": { + "sounds": [ + { + "attenuation_distance": 32, + "name": "mob/fox/screech1", + "volume": 0.45 + }, + { + "attenuation_distance": 32, + "name": "mob/fox/screech2", + "volume": 0.45 + }, + { + "attenuation_distance": 32, + "name": "mob/fox/screech3", + "volume": 0.45 + }, + { + "attenuation_distance": 32, + "name": "mob/fox/screech4", + "volume": 0.4 + } + ], + "subtitle": "subtitles.entity.fox.screech" + }, + "entity.fox.sleep": { + "sounds": [ + { + "name": "mob/fox/sleep1", + "volume": 0.8 + }, + { + "name": "mob/fox/sleep2", + "volume": 0.8 + }, + { + "name": "mob/fox/sleep3", + "volume": 0.8 + }, + { + "name": "mob/fox/sleep4", + "volume": 0.8 + }, + { + "name": "mob/fox/sleep5", + "volume": 0.8 + } + ], + "subtitle": "subtitles.entity.fox.sleep" + }, + "entity.fox.sniff": { + "sounds": [ + { + "name": "mob/fox/sniff1", + "volume": 0.6 + }, + { + "name": "mob/fox/sniff2", + "volume": 0.6 + }, + { + "name": "mob/fox/sniff3", + "volume": 0.6 + }, + { + "name": "mob/fox/sniff4", + "volume": 0.6 + } + ], + "subtitle": "subtitles.entity.fox.sniff" + }, + "entity.fox.spit": { + "sounds": [ + { + "name": "mob/fox/spit1", + "volume": 0.7 + }, + { + "name": "mob/fox/spit2", + "volume": 0.7 + }, + { + "name": "mob/fox/spit3", + "volume": 0.7 + } + ], + "subtitle": "subtitles.entity.fox.spit" + }, + "entity.fox.teleport": { + "sounds": [ + "mob/endermen/portal", + "mob/endermen/portal2" + ], + "subtitle": "subtitles.entity.fox.teleport" + }, + "entity.frog.ambient": { + "sounds": [ + { + "name": "mob/frog/idle1", + "pitch": 0.95, + "volume": 0.8 + }, + { + "name": "mob/frog/idle2", + "pitch": 0.9 + }, + { + "name": "mob/frog/idle3", + "pitch": 0.9, + "volume": 0.9 + }, + { + "name": "mob/frog/idle4", + "pitch": 0.95, + "volume": 0.8 + }, + { + "name": "mob/frog/idle5", + "pitch": 0.9, + "volume": 0.85 + }, + { + "name": "mob/frog/idle6", + "pitch": 0.9, + "volume": 0.9 + }, + { + "name": "mob/frog/idle7", + "pitch": 0.9, + "volume": 0.7 + }, + { + "name": "mob/frog/idle8", + "pitch": 0.9, + "volume": 0.3 + } + ], + "subtitle": "subtitles.entity.frog.ambient" + }, + "entity.frog.death": { + "sounds": [ + "mob/frog/death1", + "mob/frog/death2", + "mob/frog/death3" + ], + "subtitle": "subtitles.entity.frog.death" + }, + "entity.frog.eat": { + "sounds": [ + { + "name": "mob/frog/eat1", + "volume": 0.6 + }, + { + "name": "mob/frog/eat1", + "pitch": 0.9, + "volume": 0.6 + }, + { + "name": "mob/frog/eat2", + "volume": 0.6 + }, + { + "name": "mob/frog/eat2", + "pitch": 0.9, + "volume": 0.6 + }, + { + "name": "mob/frog/eat3", + "volume": 0.6 + }, + { + "name": "mob/frog/eat3", + "pitch": 0.9, + "volume": 0.6 + }, + { + "name": "mob/frog/eat4", + "volume": 0.6 + }, + { + "name": "mob/frog/eat4", + "pitch": 0.9, + "volume": 0.6 + } + ], + "subtitle": "subtitles.entity.frog.eat" + }, + "entity.frog.hurt": { + "sounds": [ + "mob/frog/hurt1", + "mob/frog/hurt2", + "mob/frog/hurt3", + "mob/frog/hurt4", + "mob/frog/hurt5" + ], + "subtitle": "subtitles.entity.frog.hurt" + }, + "entity.frog.lay_spawn": { + "sounds": [ + { + "name": "mob/frog/lay_spawn1", + "volume": 0.25 + }, + { + "name": "mob/frog/lay_spawn2", + "volume": 0.25 + } + ], + "subtitle": "subtitles.entity.frog.lay_spawn" + }, + "entity.frog.long_jump": { + "sounds": [ + { + "name": "mob/frog/long_jump1", + "volume": 0.12 + }, + { + "name": "mob/frog/long_jump1", + "pitch": 0.8, + "volume": 0.12 + }, + { + "name": "mob/frog/long_jump2", + "volume": 0.12 + }, + { + "name": "mob/frog/long_jump2", + "pitch": 0.8, + "volume": 0.12 + }, + { + "name": "mob/frog/long_jump3", + "volume": 0.12 + }, + { + "name": "mob/frog/long_jump3", + "pitch": 0.8, + "volume": 0.12 + }, + { + "name": "mob/frog/long_jump4", + "volume": 0.12 + }, + { + "name": "mob/frog/long_jump4", + "pitch": 0.8, + "volume": 0.12 + } + ], + "subtitle": "subtitles.entity.frog.long_jump" + }, + "entity.frog.step": { + "sounds": [ + "mob/frog/step1", + "mob/frog/step2", + "mob/frog/step3", + "mob/frog/step4" + ], + "subtitle": "subtitles.block.generic.footsteps" + }, + "entity.frog.tongue": { + "sounds": [ + { + "name": "mob/frog/tongue1", + "volume": 0.5 + }, + { + "name": "mob/frog/tongue2", + "volume": 0.5 + }, + { + "name": "mob/frog/tongue3", + "volume": 0.5 + }, + { + "name": "mob/frog/tongue4", + "volume": 0.5 + } + ] + }, + "entity.generic.big_fall": { + "sounds": [ + "damage/fallbig" + ], + "subtitle": "subtitles.entity.generic.big_fall" + }, + "entity.generic.burn": { + "sounds": [ + "random/fizz" + ], + "subtitle": "subtitles.entity.generic.burn" + }, + "entity.generic.death": { + "sounds": [ + "damage/hit1", + "damage/hit2", + "damage/hit3" + ], + "subtitle": "subtitles.entity.generic.death" + }, + "entity.generic.drink": { + "sounds": [ + "random/drink" + ], + "subtitle": "subtitles.entity.generic.drink" + }, + "entity.generic.eat": { + "sounds": [ + "random/eat1", + "random/eat2", + "random/eat3" + ], + "subtitle": "subtitles.entity.generic.eat" + }, + "entity.generic.explode": { + "sounds": [ + "random/explode1", + "random/explode2", + "random/explode3", + "random/explode4" + ], + "subtitle": "subtitles.entity.generic.explode" + }, + "entity.generic.extinguish_fire": { + "sounds": [ + "random/fizz" + ], + "subtitle": "subtitles.entity.generic.extinguish_fire" + }, + "entity.generic.hurt": { + "sounds": [ + "damage/hit1", + "damage/hit2", + "damage/hit3" + ], + "subtitle": "subtitles.entity.generic.hurt" + }, + "entity.generic.small_fall": { + "sounds": [ + "damage/fallsmall" + ], + "subtitle": "subtitles.entity.generic.small_fall" + }, + "entity.generic.splash": { + "sounds": [ + "liquid/splash", + "liquid/splash2" + ], + "subtitle": "subtitles.entity.generic.splash" + }, + "entity.generic.swim": { + "sounds": [ + "liquid/swim1", + "liquid/swim2", + "liquid/swim3", + "liquid/swim4" + ], + "subtitle": "subtitles.entity.generic.swim" + }, + "entity.ghast.ambient": { + "sounds": [ + "mob/ghast/moan1", + "mob/ghast/moan2", + "mob/ghast/moan3", + "mob/ghast/moan4", + "mob/ghast/moan5", + "mob/ghast/moan6", + "mob/ghast/moan7" + ], + "subtitle": "subtitles.entity.ghast.ambient" + }, + "entity.ghast.death": { + "sounds": [ + "mob/ghast/death" + ], + "subtitle": "subtitles.entity.ghast.death" + }, + "entity.ghast.hurt": { + "sounds": [ + "mob/ghast/scream1", + "mob/ghast/scream2", + "mob/ghast/scream3", + "mob/ghast/scream4", + "mob/ghast/scream5" + ], + "subtitle": "subtitles.entity.ghast.hurt" + }, + "entity.ghast.scream": { + "sounds": [ + "mob/ghast/affectionate_scream" + ] + }, + "entity.ghast.shoot": { + "sounds": [ + "mob/ghast/fireball4" + ], + "subtitle": "subtitles.entity.ghast.shoot" + }, + "entity.ghast.warn": { + "sounds": [ + "mob/ghast/charge" + ], + "subtitle": "subtitles.entity.ghast.shoot" + }, + "entity.glow_item_frame.add_item": { + "sounds": [ + "entity/itemframe/add_item1", + "entity/itemframe/add_item2", + "entity/itemframe/add_item3", + "entity/itemframe/add_item4" + ], + "subtitle": "subtitles.entity.glow_item_frame.add_item" + }, + "entity.glow_item_frame.break": { + "sounds": [ + "entity/itemframe/break1", + "entity/itemframe/break2", + "entity/itemframe/break3" + ], + "subtitle": "subtitles.entity.glow_item_frame.break" + }, + "entity.glow_item_frame.place": { + "sounds": [ + "entity/itemframe/place1", + "entity/itemframe/place2", + "entity/itemframe/place3", + "entity/itemframe/place4" + ], + "subtitle": "subtitles.entity.glow_item_frame.place" + }, + "entity.glow_item_frame.remove_item": { + "sounds": [ + "entity/itemframe/remove_item1", + "entity/itemframe/remove_item2", + "entity/itemframe/remove_item3", + "entity/itemframe/remove_item4" + ], + "subtitle": "subtitles.entity.glow_item_frame.remove_item" + }, + "entity.glow_item_frame.rotate_item": { + "sounds": [ + "entity/itemframe/rotate_item1", + "entity/itemframe/rotate_item2", + "entity/itemframe/rotate_item3", + "entity/itemframe/rotate_item4" + ], + "subtitle": "subtitles.entity.glow_item_frame.rotate_item" + }, + "entity.glow_squid.ambient": { + "sounds": [ + "entity/glow_squid/ambient1", + "entity/glow_squid/ambient2", + "entity/glow_squid/ambient3", + "entity/glow_squid/ambient4", + "entity/glow_squid/ambient5" + ], + "subtitle": "subtitles.entity.glow_squid.ambient" + }, + "entity.glow_squid.death": { + "sounds": [ + "entity/glow_squid/death1", + "entity/glow_squid/death2", + "entity/glow_squid/death3" + ], + "subtitle": "subtitles.entity.glow_squid.death" + }, + "entity.glow_squid.hurt": { + "sounds": [ + "entity/glow_squid/hurt1", + "entity/glow_squid/hurt2", + "entity/glow_squid/hurt3", + "entity/glow_squid/hurt4" + ], + "subtitle": "subtitles.entity.glow_squid.hurt" + }, + "entity.glow_squid.squirt": { + "sounds": [ + "entity/glow_squid/squirt1", + "entity/glow_squid/squirt2", + "entity/glow_squid/squirt3" + ], + "subtitle": "subtitles.entity.glow_squid.squirt" + }, + "entity.goat.ambient": { + "sounds": [ + { + "name": "mob/goat/idle1", + "volume": 0.82 + }, + { + "name": "mob/goat/idle2", + "volume": 0.82 + }, + { + "name": "mob/goat/idle3", + "volume": 0.84 + }, + { + "name": "mob/goat/idle4", + "volume": 0.84 + }, + { + "name": "mob/goat/idle5", + "volume": 0.84 + }, + { + "name": "mob/goat/idle6", + "volume": 0.84 + }, + { + "name": "mob/goat/idle7", + "volume": 0.83 + }, + { + "name": "mob/goat/idle8", + "volume": 0.84 + } + ], + "subtitle": "subtitles.entity.goat.ambient" + }, + "entity.goat.death": { + "sounds": [ + { + "name": "mob/goat/death1", + "volume": 0.65 + }, + { + "name": "mob/goat/death2", + "volume": 0.65 + }, + { + "name": "mob/goat/death3", + "volume": 0.65 + }, + { + "name": "mob/goat/death4", + "volume": 0.65 + }, + { + "name": "mob/goat/death5", + "volume": 0.65 + } + ], + "subtitle": "subtitles.entity.goat.death" + }, + "entity.goat.eat": { + "sounds": [ + "mob/goat/eat1", + "mob/goat/eat2", + "mob/goat/eat3" + ], + "subtitle": "subtitles.entity.goat.eat" + }, + "entity.goat.horn_break": { + "sounds": [ + { + "name": "mob/goat/horn_break1", + "volume": 0.9 + }, + { + "name": "mob/goat/horn_break2", + "volume": 0.9 + }, + { + "name": "mob/goat/horn_break3", + "volume": 0.9 + }, + { + "name": "mob/goat/horn_break4", + "volume": 0.9 + } + ], + "subtitle": "subtitles.entity.goat.horn_break" + }, + "entity.goat.hurt": { + "sounds": [ + { + "name": "mob/goat/hurt1", + "volume": 0.65 + }, + { + "name": "mob/goat/hurt2", + "volume": 0.65 + }, + { + "name": "mob/goat/hurt3", + "volume": 0.65 + }, + { + "name": "mob/goat/hurt4", + "volume": 0.65 + } + ], + "subtitle": "subtitles.entity.goat.hurt" + }, + "entity.goat.long_jump": { + "sounds": [ + { + "name": "mob/goat/jump1", + "volume": 0.8 + }, + { + "name": "mob/goat/jump1", + "pitch": 0.8, + "volume": 0.8 + }, + { + "name": "mob/goat/jump2", + "volume": 0.8 + }, + { + "name": "mob/goat/jump2", + "pitch": 0.8, + "volume": 0.8 + } + ], + "subtitle": "subtitles.entity.goat.long_jump" + }, + "entity.goat.milk": { + "sounds": [ + "mob/mooshroom/milk1", + "mob/mooshroom/milk2", + "mob/mooshroom/milk3" + ], + "subtitle": "subtitles.entity.goat.milk" + }, + "entity.goat.prepare_ram": { + "sounds": [ + { + "name": "mob/goat/pre_ram1", + "volume": 0.8 + }, + { + "name": "mob/goat/pre_ram2", + "volume": 0.8 + }, + { + "name": "mob/goat/pre_ram3", + "volume": 0.8 + }, + { + "name": "mob/goat/pre_ram4", + "volume": 0.8 + } + ], + "subtitle": "subtitles.entity.goat.prepare_ram" + }, + "entity.goat.ram_impact": { + "sounds": [ + { + "name": "mob/goat/impact1", + "volume": 0.8 + }, + { + "name": "mob/goat/impact2", + "volume": 0.8 + }, + { + "name": "mob/goat/impact2", + "volume": 0.8 + } + ], + "subtitle": "subtitles.entity.goat.ram_impact" + }, + "entity.goat.screaming.ambient": { + "sounds": [ + { + "name": "mob/goat/idle1", + "volume": 0.82 + }, + { + "name": "mob/goat/idle2", + "volume": 0.82 + }, + { + "name": "mob/goat/idle3", + "volume": 0.84 + }, + { + "name": "mob/goat/idle4", + "volume": 0.84 + }, + { + "name": "mob/goat/idle5", + "volume": 0.84 + }, + { + "name": "mob/goat/idle6", + "volume": 0.84 + }, + { + "name": "mob/goat/idle7", + "volume": 0.83 + }, + { + "name": "mob/goat/idle8", + "volume": 0.84 + }, + { + "name": "mob/goat/scream1", + "volume": 0.9 + }, + { + "name": "mob/goat/scream2", + "volume": 0.9 + }, + { + "name": "mob/goat/scream3", + "volume": 0.9 + }, + { + "name": "mob/goat/scream4", + "volume": 0.9 + }, + { + "name": "mob/goat/scream5", + "volume": 0.9 + }, + { + "name": "mob/goat/scream6", + "volume": 0.9 + }, + { + "name": "mob/goat/scream7", + "volume": 0.9 + }, + { + "name": "mob/goat/scream8", + "volume": 0.9 + }, + { + "name": "mob/goat/scream9", + "volume": 0.9 + } + ], + "subtitle": "subtitles.entity.goat.screaming.ambient" + }, + "entity.goat.screaming.death": { + "sounds": [ + { + "name": "mob/goat/screaming_death1", + "volume": 0.65 + }, + { + "name": "mob/goat/screaming_death2", + "volume": 0.65 + }, + { + "name": "mob/goat/screaming_death3", + "volume": 0.65 + } + ], + "subtitle": "subtitles.entity.goat.death" + }, + "entity.goat.screaming.eat": { + "sounds": [ + "mob/goat/eat1", + "mob/goat/eat2", + "mob/goat/eat3" + ], + "subtitle": "subtitles.entity.goat.eat" + }, + "entity.goat.screaming.hurt": { + "sounds": [ + { + "name": "mob/goat/screaming_hurt1", + "volume": 0.65 + }, + { + "name": "mob/goat/screaming_hurt2", + "volume": 0.65 + }, + { + "name": "mob/goat/screaming_hurt3", + "volume": 0.65 + } + ], + "subtitle": "subtitles.entity.goat.hurt" + }, + "entity.goat.screaming.long_jump": { + "sounds": [ + { + "name": "mob/goat/jump1", + "volume": 0.8 + }, + { + "name": "mob/goat/jump1", + "pitch": 0.8, + "volume": 0.8 + }, + { + "name": "mob/goat/jump2", + "volume": 0.8 + }, + { + "name": "mob/goat/jump2", + "pitch": 0.8, + "volume": 0.8 + } + ], + "subtitle": "subtitles.entity.goat.long_jump" + }, + "entity.goat.screaming.milk": { + "sounds": [ + "mob/goat/screaming_milk1", + "mob/goat/screaming_milk2", + "mob/goat/screaming_milk3", + "mob/goat/screaming_milk4", + "mob/goat/screaming_milk5" + ], + "subtitle": "subtitles.entity.goat.milk" + }, + "entity.goat.screaming.prepare_ram": { + "sounds": [ + { + "name": "mob/goat/screaming_pre_ram1", + "volume": 0.8 + }, + { + "name": "mob/goat/screaming_pre_ram2", + "volume": 0.8 + }, + { + "name": "mob/goat/screaming_pre_ram3", + "volume": 0.8 + }, + { + "name": "mob/goat/screaming_pre_ram4", + "volume": 0.8 + }, + { + "name": "mob/goat/screaming_pre_ram5", + "volume": 0.8 + } + ], + "subtitle": "subtitles.entity.goat.prepare_ram" + }, + "entity.goat.screaming.ram_impact": { + "sounds": [ + { + "name": "mob/goat/impact1", + "volume": 0.8 + }, + { + "name": "mob/goat/impact2", + "volume": 0.8 + }, + { + "name": "mob/goat/impact2", + "volume": 0.8 + } + ], + "subtitle": "subtitles.entity.goat.ram_impact" + }, + "entity.goat.step": { + "sounds": [ + "mob/goat/step1", + "mob/goat/step2", + "mob/goat/step3", + "mob/goat/step4", + "mob/goat/step5", + "mob/goat/step6" + ], + "subtitle": "subtitles.block.generic.footsteps" + }, + "entity.guardian.ambient": { + "sounds": [ + { + "name": "entity/guardian/ambient1", + "volume": 0.1 + }, + { + "name": "entity/guardian/ambient2", + "volume": 0.1 + }, + { + "name": "entity/guardian/ambient3", + "volume": 0.1 + }, + { + "name": "entity/guardian/ambient4", + "volume": 0.1 + } + ], + "subtitle": "subtitles.entity.guardian.ambient" + }, + "entity.guardian.ambient_land": { + "sounds": [ + "mob/guardian/land_idle1", + "mob/guardian/land_idle2", + "mob/guardian/land_idle3", + "mob/guardian/land_idle4" + ], + "subtitle": "subtitles.entity.guardian.ambient_land" + }, + "entity.guardian.attack": { + "sounds": [ + "mob/guardian/attack_loop" + ], + "subtitle": "subtitles.entity.guardian.attack" + }, + "entity.guardian.death": { + "sounds": [ + "mob/guardian/guardian_death" + ], + "subtitle": "subtitles.entity.guardian.death" + }, + "entity.guardian.death_land": { + "sounds": [ + "mob/guardian/land_death" + ], + "subtitle": "subtitles.entity.guardian.death" + }, + "entity.guardian.flop": { + "sounds": [ + "mob/guardian/flop1", + "mob/guardian/flop2", + "mob/guardian/flop3", + "mob/guardian/flop4" + ], + "subtitle": "subtitles.entity.guardian.flop" + }, + "entity.guardian.hurt": { + "sounds": [ + "mob/guardian/guardian_hit1", + "mob/guardian/guardian_hit2", + "mob/guardian/guardian_hit3", + "mob/guardian/guardian_hit4" + ], + "subtitle": "subtitles.entity.guardian.hurt" + }, + "entity.guardian.hurt_land": { + "sounds": [ + "mob/guardian/land_hit1", + "mob/guardian/land_hit2", + "mob/guardian/land_hit3", + "mob/guardian/land_hit4" + ], + "subtitle": "subtitles.entity.guardian.hurt" + }, + "entity.hoglin.ambient": { + "sounds": [ + { + "name": "mob/hoglin/idle1", + "volume": 0.65 + }, + { + "name": "mob/hoglin/idle2", + "volume": 0.9 + }, + { + "name": "mob/hoglin/idle3", + "volume": 0.9 + }, + { + "name": "mob/hoglin/idle4", + "volume": 0.7 + }, + { + "name": "mob/hoglin/idle5", + "volume": 0.9 + }, + { + "name": "mob/hoglin/idle6", + "volume": 0.9 + }, + { + "name": "mob/hoglin/idle7", + "volume": 0.9 + }, + { + "name": "mob/hoglin/idle8", + "volume": 0.9 + }, + { + "name": "mob/hoglin/idle9", + "volume": 0.9 + }, + { + "name": "mob/hoglin/idle10", + "volume": 0.9 + }, + { + "name": "mob/hoglin/idle11", + "volume": 0.9 + } + ], + "subtitle": "subtitles.entity.hoglin.ambient" + }, + "entity.hoglin.angry": { + "sounds": [ + "mob/hoglin/angry1", + "mob/hoglin/angry2", + "mob/hoglin/angry3", + "mob/hoglin/angry4", + "mob/hoglin/angry5", + "mob/hoglin/angry6" + ], + "subtitle": "subtitles.entity.hoglin.angry" + }, + "entity.hoglin.attack": { + "sounds": [ + { + "name": "mob/hoglin/attack1", + "volume": 0.8 + }, + { + "name": "mob/hoglin/attack1", + "pitch": 0.8, + "volume": 0.8 + }, + { + "name": "mob/hoglin/attack2", + "volume": 0.8 + }, + { + "name": "mob/hoglin/attack2", + "pitch": 0.8, + "volume": 0.8 + } + ], + "subtitle": "subtitles.entity.hoglin.attack" + }, + "entity.hoglin.converted_to_zombified": { + "sounds": [ + { + "name": "mob/hoglin/converted1", + "volume": 0.8 + }, + { + "name": "mob/hoglin/converted2", + "volume": 0.8 + } + ], + "subtitle": "subtitles.entity.hoglin.converted_to_zombified" + }, + "entity.hoglin.death": { + "sounds": [ + { + "name": "mob/hoglin/death1", + "volume": 0.9 + }, + { + "name": "mob/hoglin/death2", + "volume": 0.9 + }, + { + "name": "mob/hoglin/death3", + "volume": 0.9 + } + ], + "subtitle": "subtitles.entity.hoglin.death" + }, + "entity.hoglin.hurt": { + "sounds": [ + { + "name": "mob/hoglin/hurt1", + "volume": 0.8 + }, + { + "name": "mob/hoglin/hurt2", + "volume": 0.8 + }, + { + "name": "mob/hoglin/hurt3", + "volume": 0.8 + }, + { + "name": "mob/hoglin/hurt4", + "volume": 0.8 + } + ], + "subtitle": "subtitles.entity.hoglin.hurt" + }, + "entity.hoglin.retreat": { + "sounds": [ + { + "name": "mob/hoglin/idle11", + "volume": 0.8 + }, + { + "name": "mob/hoglin/retreat1", + "volume": 0.7 + }, + { + "name": "mob/hoglin/retreat2", + "volume": 0.8 + }, + { + "name": "mob/hoglin/retreat3", + "volume": 0.8 + } + ], + "subtitle": "subtitles.entity.hoglin.retreat" + }, + "entity.hoglin.step": { + "sounds": [ + "mob/hoglin/step1", + "mob/hoglin/step2", + "mob/hoglin/step3", + "mob/hoglin/step4", + "mob/hoglin/step5", + "mob/hoglin/step6" + ], + "subtitle": "subtitles.block.generic.footsteps" + }, + "entity.horse.ambient": { + "sounds": [ + "mob/horse/idle1", + "mob/horse/idle2", + "mob/horse/idle3" + ], + "subtitle": "subtitles.entity.horse.ambient" + }, + "entity.horse.angry": { + "sounds": [ + "mob/horse/angry1" + ], + "subtitle": "subtitles.entity.horse.angry" + }, + "entity.horse.armor": { + "sounds": [ + { + "name": "mob/horse/armor", + "volume": 0.5 + } + ], + "subtitle": "subtitles.entity.horse.armor" + }, + "entity.horse.breathe": { + "sounds": [ + "mob/horse/breathe1", + "mob/horse/breathe2", + "mob/horse/breathe3" + ], + "subtitle": "subtitles.entity.horse.breathe" + }, + "entity.horse.death": { + "sounds": [ + "mob/horse/death" + ], + "subtitle": "subtitles.entity.horse.death" + }, + "entity.horse.eat": { + "sounds": [ + "entity/horse/eat1", + "entity/horse/eat2", + "entity/horse/eat3", + "entity/horse/eat4", + "entity/horse/eat5" + ], + "subtitle": "subtitles.entity.horse.eat" + }, + "entity.horse.gallop": { + "sounds": [ + "mob/horse/gallop1", + "mob/horse/gallop2", + "mob/horse/gallop3", + "mob/horse/gallop4" + ], + "subtitle": "subtitles.entity.horse.gallop" + }, + "entity.horse.hurt": { + "sounds": [ + "mob/horse/hit1", + "mob/horse/hit2", + "mob/horse/hit3", + "mob/horse/hit4" + ], + "subtitle": "subtitles.entity.horse.hurt" + }, + "entity.horse.jump": { + "sounds": [ + "mob/horse/jump" + ], + "subtitle": "subtitles.entity.horse.jump" + }, + "entity.horse.land": { + "sounds": [ + "mob/horse/land" + ], + "subtitle": "subtitles.entity.generic.big_fall" + }, + "entity.horse.saddle": { + "sounds": [ + "mob/horse/leather" + ], + "subtitle": "subtitles.entity.horse.saddle" + }, + "entity.horse.step": { + "sounds": [ + "mob/horse/soft1", + "mob/horse/soft2", + "mob/horse/soft3", + "mob/horse/soft4", + "mob/horse/soft5", + "mob/horse/soft6" + ], + "subtitle": "subtitles.block.generic.footsteps" + }, + "entity.horse.step_wood": { + "sounds": [ + "mob/horse/wood1", + "mob/horse/wood2", + "mob/horse/wood3", + "mob/horse/wood4", + "mob/horse/wood5", + "mob/horse/wood6" + ], + "subtitle": "subtitles.block.generic.footsteps" + }, + "entity.hostile.big_fall": { + "sounds": [ + "damage/fallbig" + ], + "subtitle": "subtitles.entity.generic.big_fall" + }, + "entity.hostile.death": { + "sounds": [ + "damage/hit1", + "damage/hit2", + "damage/hit3" + ], + "subtitle": "subtitles.entity.generic.death" + }, + "entity.hostile.hurt": { + "sounds": [ + "damage/hit1", + "damage/hit2", + "damage/hit3" + ], + "subtitle": "subtitles.entity.generic.hurt" + }, + "entity.hostile.small_fall": { + "sounds": [ + "damage/fallsmall" + ], + "subtitle": "subtitles.entity.generic.small_fall" + }, + "entity.hostile.splash": { + "sounds": [ + "liquid/splash", + "liquid/splash2" + ], + "subtitle": "subtitles.entity.generic.splash" + }, + "entity.hostile.swim": { + "sounds": [ + "liquid/swim1", + "liquid/swim2", + "liquid/swim3", + "liquid/swim4" + ], + "subtitle": "subtitles.entity.generic.swim" + }, + "entity.husk.ambient": { + "sounds": [ + "mob/husk/idle1", + "mob/husk/idle2", + "mob/husk/idle3" + ], + "subtitle": "subtitles.entity.husk.ambient" + }, + "entity.husk.converted_to_zombie": { + "sounds": [ + { + "name": "mob/husk/convert1", + "volume": 0.8 + }, + { + "name": "mob/husk/convert2", + "volume": 0.8 + } + ], + "subtitle": "subtitles.entity.husk.converted_to_zombie" + }, + "entity.husk.death": { + "sounds": [ + "mob/husk/death1", + "mob/husk/death2" + ], + "subtitle": "subtitles.entity.husk.death" + }, + "entity.husk.hurt": { + "sounds": [ + "mob/husk/hurt1", + "mob/husk/hurt2" + ], + "subtitle": "subtitles.entity.husk.hurt" + }, + "entity.husk.step": { + "sounds": [ + "mob/husk/step1", + "mob/husk/step2", + "mob/husk/step3", + "mob/husk/step4", + "mob/husk/step5" + ], + "subtitle": "subtitles.block.generic.footsteps" + }, + "entity.illusioner.ambient": { + "sounds": [ + "mob/illusion_illager/idle1", + "mob/illusion_illager/idle2", + "mob/illusion_illager/idle3", + "mob/illusion_illager/idle4" + ], + "subtitle": "subtitles.entity.illusioner.ambient" + }, + "entity.illusioner.cast_spell": { + "sounds": [ + "mob/evocation_illager/cast1", + "mob/evocation_illager/cast2" + ], + "subtitle": "subtitles.entity.illusioner.cast_spell" + }, + "entity.illusioner.death": { + "sounds": [ + "mob/illusion_illager/death1", + "mob/illusion_illager/death2" + ], + "subtitle": "subtitles.entity.illusioner.death" + }, + "entity.illusioner.hurt": { + "sounds": [ + "mob/illusion_illager/hurt1", + "mob/illusion_illager/hurt2", + "mob/illusion_illager/hurt3" + ], + "subtitle": "subtitles.entity.illusioner.hurt" + }, + "entity.illusioner.mirror_move": { + "sounds": [ + "mob/illusion_illager/mirror_move1", + "mob/illusion_illager/mirror_move2" + ], + "subtitle": "subtitles.entity.illusioner.mirror_move" + }, + "entity.illusioner.prepare_blindness": { + "sounds": [ + "mob/illusion_illager/prepare_blind" + ], + "subtitle": "subtitles.entity.illusioner.prepare_blindness" + }, + "entity.illusioner.prepare_mirror": { + "sounds": [ + "mob/illusion_illager/prepare_mirror" + ], + "subtitle": "subtitles.entity.illusioner.prepare_mirror" + }, + "entity.iron_golem.attack": { + "sounds": [ + "mob/irongolem/throw" + ], + "subtitle": "subtitles.entity.iron_golem.attack" + }, + "entity.iron_golem.damage": { + "sounds": [ + { + "name": "mob/irongolem/damage1", + "volume": 0.8 + }, + { + "name": "mob/irongolem/damage1", + "pitch": 0.8, + "volume": 0.8 + }, + { + "name": "mob/irongolem/damage2", + "volume": 0.8 + }, + { + "name": "mob/irongolem/damage2", + "pitch": 0.8, + "volume": 0.8 + } + ], + "subtitle": "subtitles.entity.iron_golem.damage" + }, + "entity.iron_golem.death": { + "sounds": [ + "mob/irongolem/death" + ], + "subtitle": "subtitles.entity.iron_golem.death" + }, + "entity.iron_golem.hurt": { + "sounds": [ + "mob/irongolem/hit1", + "mob/irongolem/hit2", + "mob/irongolem/hit3", + "mob/irongolem/hit4" + ], + "subtitle": "subtitles.entity.iron_golem.hurt" + }, + "entity.iron_golem.repair": { + "sounds": [ + "mob/irongolem/repair" + ], + "subtitle": "subtitles.entity.iron_golem.repair" + }, + "entity.iron_golem.step": { + "sounds": [ + "mob/irongolem/walk1", + "mob/irongolem/walk2", + "mob/irongolem/walk3", + "mob/irongolem/walk4" + ], + "subtitle": "subtitles.block.generic.footsteps" + }, + "entity.item.break": { + "sounds": [ + "random/break" + ], + "subtitle": "subtitles.entity.item.break" + }, + "entity.item.pickup": { + "sounds": [ + "random/pop" + ], + "subtitle": "subtitles.entity.item.pickup" + }, + "entity.item_frame.add_item": { + "sounds": [ + "entity/itemframe/add_item1", + "entity/itemframe/add_item2", + "entity/itemframe/add_item3", + "entity/itemframe/add_item4" + ], + "subtitle": "subtitles.entity.item_frame.add_item" + }, + "entity.item_frame.break": { + "sounds": [ + "entity/itemframe/break1", + "entity/itemframe/break2", + "entity/itemframe/break3" + ], + "subtitle": "subtitles.entity.item_frame.break" + }, + "entity.item_frame.place": { + "sounds": [ + "entity/itemframe/place1", + "entity/itemframe/place2", + "entity/itemframe/place3", + "entity/itemframe/place4" + ], + "subtitle": "subtitles.entity.item_frame.place" + }, + "entity.item_frame.remove_item": { + "sounds": [ + "entity/itemframe/remove_item1", + "entity/itemframe/remove_item2", + "entity/itemframe/remove_item3", + "entity/itemframe/remove_item4" + ], + "subtitle": "subtitles.entity.item_frame.remove_item" + }, + "entity.item_frame.rotate_item": { + "sounds": [ + "entity/itemframe/rotate_item1", + "entity/itemframe/rotate_item2", + "entity/itemframe/rotate_item3", + "entity/itemframe/rotate_item4" + ], + "subtitle": "subtitles.entity.item_frame.rotate_item" + }, + "entity.leash_knot.break": { + "sounds": [ + "entity/leashknot/break1", + "entity/leashknot/break2", + "entity/leashknot/break3" + ], + "subtitle": "subtitles.entity.leash_knot.break" + }, + "entity.leash_knot.place": { + "sounds": [ + "entity/leashknot/place1", + "entity/leashknot/place2", + "entity/leashknot/place3" + ], + "subtitle": "subtitles.entity.leash_knot.place" + }, + "entity.lightning_bolt.impact": { + "sounds": [ + "random/explode1", + "random/explode2", + "random/explode3", + "random/explode4" + ], + "subtitle": "subtitles.entity.lightning_bolt.impact" + }, + "entity.lightning_bolt.thunder": { + "sounds": [ + "ambient/weather/thunder1", + "ambient/weather/thunder2", + "ambient/weather/thunder3" + ], + "subtitle": "subtitles.entity.lightning_bolt.thunder" + }, + "entity.lingering_potion.throw": { + "sounds": [ + "random/bow" + ], + "subtitle": "subtitles.entity.potion.throw" + }, + "entity.llama.ambient": { + "sounds": [ + "mob/llama/idle1", + "mob/llama/idle2", + "mob/llama/idle3", + "mob/llama/idle4", + "mob/llama/idle5" + ], + "subtitle": "subtitles.entity.llama.ambient" + }, + "entity.llama.angry": { + "sounds": [ + "mob/llama/angry1" + ], + "subtitle": "subtitles.entity.llama.angry" + }, + "entity.llama.chest": { + "sounds": [ + "mob/chicken/plop" + ], + "subtitle": "subtitles.entity.llama.chest" + }, + "entity.llama.death": { + "sounds": [ + "mob/llama/death1", + "mob/llama/death2" + ], + "subtitle": "subtitles.entity.llama.death" + }, + "entity.llama.eat": { + "sounds": [ + "mob/llama/eat1", + "mob/llama/eat2", + "mob/llama/eat3" + ], + "subtitle": "subtitles.entity.llama.eat" + }, + "entity.llama.hurt": { + "sounds": [ + "mob/llama/hurt1", + "mob/llama/hurt2", + "mob/llama/hurt3" + ], + "subtitle": "subtitles.entity.llama.hurt" + }, + "entity.llama.spit": { + "sounds": [ + "mob/llama/spit1", + "mob/llama/spit2" + ], + "subtitle": "subtitles.entity.llama.spit" + }, + "entity.llama.step": { + "sounds": [ + "mob/llama/step1", + "mob/llama/step2", + "mob/llama/step3", + "mob/llama/step4", + "mob/llama/step5" + ], + "subtitle": "subtitles.block.generic.footsteps" + }, + "entity.llama.swag": { + "sounds": [ + "mob/llama/swag" + ], + "subtitle": "subtitles.entity.llama.swag" + }, + "entity.magma_cube.death": { + "sounds": [ + "mob/slime/big1", + "mob/slime/big2", + "mob/slime/big3", + "mob/slime/big4" + ], + "subtitle": "subtitles.entity.magma_cube.death" + }, + "entity.magma_cube.death_small": { + "sounds": [ + "mob/slime/small1", + "mob/slime/small2", + "mob/slime/small3", + "mob/slime/small4", + "mob/slime/small5" + ], + "subtitle": "subtitles.entity.magma_cube.death" + }, + "entity.magma_cube.hurt": { + "sounds": [ + "mob/slime/big1", + "mob/slime/big2", + "mob/slime/big3", + "mob/slime/big4" + ], + "subtitle": "subtitles.entity.magma_cube.hurt" + }, + "entity.magma_cube.hurt_small": { + "sounds": [ + "mob/slime/small1", + "mob/slime/small2", + "mob/slime/small3", + "mob/slime/small4", + "mob/slime/small5" + ], + "subtitle": "subtitles.entity.magma_cube.hurt" + }, + "entity.magma_cube.jump": { + "sounds": [ + "mob/magmacube/jump1", + "mob/magmacube/jump2", + "mob/magmacube/jump3", + "mob/magmacube/jump4" + ], + "subtitle": "subtitles.entity.magma_cube.squish" + }, + "entity.magma_cube.squish": { + "sounds": [ + "mob/magmacube/big1", + "mob/magmacube/big2", + "mob/magmacube/big3", + "mob/magmacube/big4" + ], + "subtitle": "subtitles.entity.magma_cube.squish" + }, + "entity.magma_cube.squish_small": { + "sounds": [ + "mob/magmacube/small1", + "mob/magmacube/small2", + "mob/magmacube/small3", + "mob/magmacube/small4", + "mob/magmacube/small5" + ], + "subtitle": "subtitles.entity.magma_cube.squish" + }, + "entity.minecart.inside": { + "sounds": [ + "minecart/inside" + ] + }, + "entity.minecart.inside.underwater": { + "sounds": [ + "minecart/inside_underwater1", + "minecart/inside_underwater2", + "minecart/inside_underwater3" + ] + }, + "entity.minecart.riding": { + "sounds": [ + "minecart/base" + ], + "subtitle": "subtitles.entity.minecart.riding" + }, + "entity.mooshroom.convert": { + "sounds": [ + { + "name": "mob/mooshroom/convert1", + "volume": 0.75 + }, + { + "name": "mob/mooshroom/convert2", + "volume": 0.75 + } + ], + "subtitle": "subtitles.entity.mooshroom.convert" + }, + "entity.mooshroom.eat": { + "sounds": [ + "mob/mooshroom/eat1", + { + "name": "mob/mooshroom/eat1", + "pitch": 0.95 + }, + { + "name": "mob/mooshroom/eat1", + "pitch": 1.05 + }, + "mob/mooshroom/eat2", + { + "name": "mob/mooshroom/eat2", + "pitch": 0.95 + }, + { + "name": "mob/mooshroom/eat2", + "pitch": 1.05 + }, + "mob/mooshroom/eat3", + { + "name": "mob/mooshroom/eat3", + "pitch": 0.95 + }, + { + "name": "mob/mooshroom/eat3", + "pitch": 1.05 + }, + "mob/mooshroom/eat4", + { + "name": "mob/mooshroom/eat4", + "pitch": 0.95 + }, + { + "name": "mob/mooshroom/eat4", + "pitch": 1.05 + } + ], + "subtitle": "subtitles.entity.mooshroom.eat" + }, + "entity.mooshroom.milk": { + "sounds": [ + "mob/mooshroom/milk1", + { + "name": "mob/mooshroom/milk1", + "pitch": 0.9 + }, + { + "name": "mob/mooshroom/milk1", + "pitch": 1.1 + }, + "mob/mooshroom/milk2", + { + "name": "mob/mooshroom/milk2", + "pitch": 0.9 + }, + { + "name": "mob/mooshroom/milk2", + "pitch": 1.1 + }, + "mob/mooshroom/milk3", + { + "name": "mob/mooshroom/milk3", + "pitch": 0.9 + }, + { + "name": "mob/mooshroom/milk3", + "pitch": 1.1 + } + ], + "subtitle": "subtitles.entity.mooshroom.milk" + }, + "entity.mooshroom.shear": { + "sounds": [ + "mob/sheep/shear" + ], + "subtitle": "subtitles.item.shears.shear" + }, + "entity.mooshroom.suspicious_milk": { + "sounds": [ + "mob/mooshroom/milk1", + { + "name": "mob/mooshroom/milk1", + "pitch": 0.9 + }, + { + "name": "mob/mooshroom/milk1", + "pitch": 1.1 + }, + "mob/mooshroom/milk2", + { + "name": "mob/mooshroom/milk2", + "pitch": 0.9 + }, + { + "name": "mob/mooshroom/milk2", + "pitch": 1.1 + }, + "mob/mooshroom/milk3", + { + "name": "mob/mooshroom/milk3", + "pitch": 0.9 + }, + { + "name": "mob/mooshroom/milk3", + "pitch": 1.1 + } + ], + "subtitle": "subtitles.entity.mooshroom.suspicious_milk" + }, + "entity.mule.ambient": { + "sounds": [ + "mob/horse/donkey/idle1", + "mob/horse/donkey/idle2", + "mob/horse/donkey/idle3" + ], + "subtitle": "subtitles.entity.mule.ambient" + }, + "entity.mule.angry": { + "sounds": [ + "mob/horse/donkey/angry1", + "mob/horse/donkey/angry2" + ], + "subtitle": "subtitles.entity.mule.angry" + }, + "entity.mule.chest": { + "sounds": [ + "mob/chicken/plop" + ], + "subtitle": "subtitles.entity.mule.chest" + }, + "entity.mule.death": { + "sounds": [ + "mob/horse/donkey/death" + ], + "subtitle": "subtitles.entity.mule.death" + }, + "entity.mule.eat": { + "sounds": [ + "entity/horse/eat1", + "entity/horse/eat2", + "entity/horse/eat3", + "entity/horse/eat4", + "entity/horse/eat5" + ], + "subtitle": "subtitles.entity.mule.eat" + }, + "entity.mule.hurt": { + "sounds": [ + "mob/horse/donkey/hit1", + "mob/horse/donkey/hit2", + "mob/horse/donkey/hit3" + ], + "subtitle": "subtitles.entity.mule.hurt" + }, + "entity.mule.jump": { + "sounds": [ + "mob/horse/jump" + ], + "subtitle": "subtitles.entity.mule.jump" + }, + "entity.ocelot.ambient": { + "sounds": [ + { + "name": "mob/cat/ocelot/idle1", + "volume": 0.3 + }, + { + "name": "mob/cat/ocelot/idle2", + "volume": 0.3 + }, + { + "name": "mob/cat/ocelot/idle3", + "volume": 0.35 + }, + { + "name": "mob/cat/ocelot/idle4", + "volume": 0.45 + } + ], + "subtitle": "subtitles.entity.cat.ambient" + }, + "entity.ocelot.death": { + "sounds": [ + { + "name": "mob/cat/ocelot/death1", + "volume": 0.45 + }, + { + "name": "mob/cat/ocelot/death2", + "volume": 0.45 + }, + { + "name": "mob/cat/ocelot/death3", + "volume": 0.45 + } + ], + "subtitle": "subtitles.entity.cat.death" + }, + "entity.ocelot.hurt": { + "sounds": [ + { + "name": "mob/cat/hitt1", + "volume": 0.45 + }, + { + "name": "mob/cat/hitt2", + "volume": 0.45 + }, + { + "name": "mob/cat/hitt3", + "volume": 0.45 + } + ], + "subtitle": "subtitles.entity.cat.hurt" + }, + "entity.painting.break": { + "sounds": [ + "entity/painting/break1", + "entity/painting/break2", + "entity/painting/break3" + ], + "subtitle": "subtitles.entity.painting.break" + }, + "entity.painting.place": { + "sounds": [ + "entity/painting/place1", + "entity/painting/place2", + "entity/painting/place3", + "entity/painting/place4" + ], + "subtitle": "subtitles.entity.painting.place" + }, + "entity.panda.aggressive_ambient": { + "sounds": [ + "mob/panda/aggressive/aggressive1", + "mob/panda/aggressive/aggressive2", + "mob/panda/aggressive/aggressive3", + { + "name": "mob/panda/aggressive/aggressive4", + "volume": 0.8 + }, + "mob/panda/nosebreath2", + "mob/panda/nosebreath3", + "mob/panda/pant1", + "mob/panda/pant2" + ], + "subtitle": "subtitles.entity.panda.aggressive_ambient" + }, + "entity.panda.ambient": { + "sounds": [ + "mob/panda/idle1", + "mob/panda/idle2", + "mob/panda/idle3", + "mob/panda/idle4", + "mob/panda/nosebreath1", + "mob/panda/nosebreath2", + "mob/panda/nosebreath3", + "mob/panda/pant1", + "mob/panda/pant2" + ], + "subtitle": "subtitles.entity.panda.ambient" + }, + "entity.panda.bite": { + "sounds": [ + "mob/panda/bite1", + "mob/panda/bite2", + "mob/panda/bite3" + ], + "subtitle": "subtitles.entity.panda.bite" + }, + "entity.panda.cant_breed": { + "sounds": [ + "mob/panda/cant_breed1", + "mob/panda/cant_breed2", + "mob/panda/cant_breed3", + "mob/panda/cant_breed4", + "mob/panda/cant_breed5" + ], + "subtitle": "subtitles.entity.panda.cant_breed" + }, + "entity.panda.death": { + "sounds": [ + { + "name": "mob/panda/death1", + "volume": 0.82 + }, + { + "name": "mob/panda/death2", + "volume": 0.82 + }, + { + "name": "mob/panda/death3", + "volume": 0.82 + }, + { + "name": "mob/panda/death4", + "volume": 0.82 + } + ], + "subtitle": "subtitles.entity.panda.death" + }, + "entity.panda.eat": { + "sounds": [ + "mob/panda/eat1", + "mob/panda/eat2", + "mob/panda/eat3", + "mob/panda/eat4", + { + "name": "mob/panda/eat5", + "volume": 0.85 + }, + "mob/panda/eat6", + "mob/panda/eat7", + "mob/panda/eat8", + "mob/panda/eat9", + "mob/panda/eat10", + "mob/panda/eat11", + "mob/panda/eat12" + ], + "subtitle": "subtitles.entity.panda.eat" + }, + "entity.panda.hurt": { + "sounds": [ + { + "name": "mob/panda/hurt1", + "volume": 0.82 + }, + { + "name": "mob/panda/hurt2", + "volume": 0.82 + }, + { + "name": "mob/panda/hurt3", + "volume": 0.82 + }, + { + "name": "mob/panda/hurt4", + "volume": 0.82 + }, + { + "name": "mob/panda/hurt5", + "volume": 0.82 + }, + { + "name": "mob/panda/hurt6", + "volume": 0.82 + } + ], + "subtitle": "subtitles.entity.panda.hurt" + }, + "entity.panda.pre_sneeze": { + "sounds": [ + "mob/panda/pre_sneeze" + ], + "subtitle": "subtitles.entity.panda.pre_sneeze" + }, + "entity.panda.sneeze": { + "sounds": [ + "mob/panda/sneeze1", + "mob/panda/sneeze2", + "mob/panda/sneeze3" + ], + "subtitle": "subtitles.entity.panda.sneeze" + }, + "entity.panda.step": { + "sounds": [ + "mob/panda/step1", + "mob/panda/step2", + "mob/panda/step3", + "mob/panda/step4", + "mob/panda/step5" + ], + "subtitle": "subtitles.block.generic.footsteps" + }, + "entity.panda.worried_ambient": { + "sounds": [ + "mob/panda/pant2", + "mob/panda/worried/worried2", + "mob/panda/worried/worried3", + "mob/panda/worried/worried4", + "mob/panda/worried/worried5", + "mob/panda/worried/worried6" + ], + "subtitle": "subtitles.entity.panda.worried_ambient" + }, + "entity.parrot.ambient": { + "sounds": [ + { + "name": "mob/parrot/idle1", + "volume": 0.7 + }, + { + "name": "mob/parrot/idle2", + "volume": 0.7 + }, + { + "name": "mob/parrot/idle3", + "volume": 0.7 + }, + { + "name": "mob/parrot/idle4", + "volume": 0.7 + }, + { + "name": "mob/parrot/idle5", + "volume": 0.7 + }, + { + "name": "mob/parrot/idle6", + "volume": 0.7 + } + ], + "subtitle": "subtitles.entity.parrot.ambient" + }, + "entity.parrot.death": { + "sounds": [ + { + "name": "mob/parrot/death1", + "pitch": 0.9 + }, + { + "name": "mob/parrot/death2", + "pitch": 0.9 + }, + { + "name": "mob/parrot/death3", + "pitch": 0.9 + }, + { + "name": "mob/parrot/death4", + "pitch": 0.7 + } + ], + "subtitle": "subtitles.entity.parrot.death" + }, + "entity.parrot.eat": { + "sounds": [ + "mob/parrot/eat1", + "mob/parrot/eat2", + "mob/parrot/eat3" + ], + "subtitle": "subtitles.entity.parrot.eats" + }, + "entity.parrot.fly": { + "sounds": [ + "mob/parrot/fly1", + "mob/parrot/fly2", + "mob/parrot/fly3", + "mob/parrot/fly4", + "mob/parrot/fly5", + "mob/parrot/fly6", + "mob/parrot/fly7", + "mob/parrot/fly8" + ], + "subtitle": "subtitles.entity.parrot.fly" + }, + "entity.parrot.hurt": { + "sounds": [ + { + "name": "mob/parrot/hurt1", + "pitch": 0.8 + }, + { + "name": "mob/parrot/hurt1", + "pitch": 0.9 + }, + { + "name": "mob/parrot/hurt2", + "pitch": 0.9 + } + ], + "subtitle": "subtitles.entity.parrot.hurts" + }, + "entity.parrot.imitate.blaze": { + "sounds": [ + { + "name": "entity.blaze.ambient", + "pitch": 1.8, + "type": "event", + "volume": 0.4 + } + ], + "subtitle": "subtitles.entity.parrot.imitate.blaze" + }, + "entity.parrot.imitate.bogged": { + "sounds": [ + { + "name": "entity.bogged.ambient", + "pitch": 1.7, + "type": "event" + } + ], + "subtitle": "subtitles.entity.parrot.imitate.bogged" + }, + "entity.parrot.imitate.breeze": { + "sounds": [ + { + "name": "entity.breeze.idle_ground", + "pitch": 1.7, + "type": "event", + "volume": 0.7 + } + ], + "subtitle": "subtitles.entity.parrot.imitate.breeze" + }, + "entity.parrot.imitate.creaking": { + "sounds": [ + "mob/creaking/parrot_imitate_creaking" + ], + "subtitle": "subtitles.entity.parrot.imitate.creaking" + }, + "entity.parrot.imitate.creeper": { + "sounds": [ + { + "name": "entity.creeper.primed", + "pitch": 1.8, + "type": "event", + "volume": 0.6 + } + ], + "subtitle": "subtitles.entity.parrot.imitate.creeper" + }, + "entity.parrot.imitate.drowned": { + "sounds": [ + { + "name": "entity.drowned.ambient", + "pitch": 1.8, + "type": "event", + "volume": 0.6 + } + ], + "subtitle": "subtitles.entity.parrot.imitate.drowned" + }, + "entity.parrot.imitate.elder_guardian": { + "sounds": [ + { + "name": "entity.elder_guardian.ambient_land", + "pitch": 1.8, + "type": "event", + "volume": 0.7 + } + ], + "subtitle": "subtitles.entity.parrot.imitate.elder_guardian" + }, + "entity.parrot.imitate.ender_dragon": { + "sounds": [ + { + "name": "entity.ender_dragon.ambient", + "pitch": 1.8, + "type": "event", + "volume": 0.2 + } + ], + "subtitle": "subtitles.entity.parrot.imitate.ender_dragon" + }, + "entity.parrot.imitate.endermite": { + "sounds": [ + { + "name": "entity.endermite.ambient", + "pitch": 1.8, + "type": "event", + "volume": 0.7 + } + ], + "subtitle": "subtitles.entity.parrot.imitate.endermite" + }, + "entity.parrot.imitate.evoker": { + "sounds": [ + { + "name": "entity.evoker.cast_spell", + "pitch": 1.8, + "type": "event", + "volume": 0.6 + } + ], + "subtitle": "subtitles.entity.parrot.imitate.evoker" + }, + "entity.parrot.imitate.ghast": { + "sounds": [ + { + "name": "entity.ghast.ambient", + "pitch": 1.8, + "type": "event", + "volume": 0.7 + } + ], + "subtitle": "subtitles.entity.parrot.imitate.ghast" + }, + "entity.parrot.imitate.guardian": { + "sounds": [ + { + "name": "entity.guardian.ambient", + "pitch": 1.8, + "type": "event", + "volume": 0.4 + } + ], + "subtitle": "subtitles.entity.parrot.imitate.guardian" + }, + "entity.parrot.imitate.hoglin": { + "sounds": [ + { + "name": "entity.hoglin.ambient", + "pitch": 1.9, + "type": "event", + "volume": 0.6 + } + ], + "subtitle": "subtitles.entity.parrot.imitate.hoglin" + }, + "entity.parrot.imitate.husk": { + "sounds": [ + { + "name": "entity.husk.ambient", + "pitch": 1.8, + "type": "event", + "volume": 0.6 + } + ], + "subtitle": "subtitles.entity.parrot.imitate.husk" + }, + "entity.parrot.imitate.illusioner": { + "sounds": [ + { + "name": "entity.illusioner.ambient", + "pitch": 1.8, + "type": "event", + "volume": 0.7 + } + ], + "subtitle": "subtitles.entity.parrot.imitate.illusioner" + }, + "entity.parrot.imitate.magma_cube": { + "sounds": [ + { + "name": "entity.magma_cube.squish", + "pitch": 1.8, + "type": "event", + "volume": 0.6 + } + ], + "subtitle": "subtitles.entity.parrot.imitate.magma_cube" + }, + "entity.parrot.imitate.phantom": { + "sounds": [ + { + "name": "entity.phantom.ambient", + "pitch": 1.7, + "type": "event", + "volume": 0.6 + } + ], + "subtitle": "subtitles.entity.parrot.imitate.phantom" + }, + "entity.parrot.imitate.piglin": { + "sounds": [ + { + "name": "entity.piglin.ambient", + "pitch": 1.8, + "type": "event", + "volume": 0.6 + } + ], + "subtitle": "subtitles.entity.parrot.imitate.piglin" + }, + "entity.parrot.imitate.piglin_brute": { + "sounds": [ + { + "name": "entity.piglin_brute.ambient", + "pitch": 1.8, + "type": "event", + "volume": 0.6 + } + ], + "subtitle": "subtitles.entity.parrot.imitate.piglin_brute" + }, + "entity.parrot.imitate.pillager": { + "sounds": [ + { + "name": "entity.pillager.ambient", + "pitch": 1.8, + "type": "event", + "volume": 0.4 + } + ], + "subtitle": "subtitles.entity.parrot.imitate.pillager" + }, + "entity.parrot.imitate.ravager": { + "sounds": [ + { + "name": "entity.ravager.ambient", + "pitch": 1.8, + "type": "event", + "volume": 0.2 + } + ], + "subtitle": "subtitles.entity.parrot.imitate.ravager" + }, + "entity.parrot.imitate.shulker": { + "sounds": [ + { + "name": "entity.shulker.ambient", + "pitch": 1.7, + "type": "event", + "volume": 0.4 + } + ], + "subtitle": "subtitles.entity.parrot.imitate.shulker" + }, + "entity.parrot.imitate.silverfish": { + "sounds": [ + { + "name": "entity.silverfish.ambient", + "pitch": 1.8, + "type": "event", + "volume": 0.7 + } + ], + "subtitle": "subtitles.entity.parrot.imitate.silverfish" + }, + "entity.parrot.imitate.skeleton": { + "sounds": [ + { + "name": "entity.skeleton.ambient", + "pitch": 1.7, + "type": "event" + } + ], + "subtitle": "subtitles.entity.parrot.imitate.skeleton" + }, + "entity.parrot.imitate.slime": { + "sounds": [ + { + "name": "entity.slime.squish", + "pitch": 1.8, + "type": "event", + "volume": 0.6 + } + ], + "subtitle": "subtitles.entity.parrot.imitate.slime" + }, + "entity.parrot.imitate.spider": { + "sounds": [ + { + "name": "entity.spider.ambient", + "pitch": 1.8, + "type": "event", + "volume": 0.6 + } + ], + "subtitle": "subtitles.entity.parrot.imitate.spider" + }, + "entity.parrot.imitate.stray": { + "sounds": [ + { + "name": "entity.stray.ambient", + "pitch": 1.6, + "type": "event", + "volume": 0.6 + } + ], + "subtitle": "subtitles.entity.parrot.imitate.stray" + }, + "entity.parrot.imitate.vex": { + "sounds": [ + { + "name": "entity.vex.ambient", + "pitch": 1.6, + "type": "event", + "volume": 0.8 + } + ], + "subtitle": "subtitles.entity.parrot.imitate.vex" + }, + "entity.parrot.imitate.vindicator": { + "sounds": [ + { + "name": "entity.vindicator.ambient", + "pitch": 1.7, + "type": "event", + "volume": 0.6 + } + ], + "subtitle": "subtitles.entity.parrot.imitate.vindicator" + }, + "entity.parrot.imitate.warden": { + "sounds": [ + { + "name": "entity.warden.tendril_clicks", + "pitch": 2.0, + "type": "event", + "volume": 0.8 + } + ], + "subtitle": "subtitles.entity.parrot.imitate.warden" + }, + "entity.parrot.imitate.witch": { + "sounds": [ + { + "name": "entity.witch.ambient", + "pitch": 1.8, + "type": "event", + "volume": 0.5 + } + ], + "subtitle": "subtitles.entity.parrot.imitate.witch" + }, + "entity.parrot.imitate.wither": { + "sounds": [ + { + "name": "entity.wither.ambient", + "pitch": 1.8, + "type": "event", + "volume": 0.2 + } + ], + "subtitle": "subtitles.entity.parrot.imitate.wither" + }, + "entity.parrot.imitate.wither_skeleton": { + "sounds": [ + { + "name": "entity.wither_skeleton.ambient", + "pitch": 1.8, + "type": "event", + "volume": 0.7 + } + ], + "subtitle": "subtitles.entity.parrot.imitate.wither_skeleton" + }, + "entity.parrot.imitate.zoglin": { + "sounds": [ + { + "name": "entity.zoglin.ambient", + "pitch": 1.9, + "type": "event", + "volume": 0.6 + } + ], + "subtitle": "subtitles.entity.parrot.imitate.zoglin" + }, + "entity.parrot.imitate.zombie": { + "sounds": [ + { + "name": "entity.zombie.ambient", + "pitch": 1.8, + "type": "event", + "volume": 0.6 + } + ], + "subtitle": "subtitles.entity.parrot.imitate.zombie" + }, + "entity.parrot.imitate.zombie_villager": { + "sounds": [ + { + "name": "entity.zombie_villager.ambient", + "pitch": 1.8, + "type": "event", + "volume": 0.6 + } + ], + "subtitle": "subtitles.entity.parrot.imitate.zombie_villager" + }, + "entity.parrot.step": { + "sounds": [ + "mob/parrot/step1", + "mob/parrot/step2", + "mob/parrot/step3", + "mob/parrot/step4", + "mob/parrot/step5" + ] + }, + "entity.phantom.ambient": { + "sounds": [ + { + "name": "mob/phantom/idle1", + "volume": 0.8 + }, + { + "name": "mob/phantom/idle2", + "volume": 0.8 + }, + { + "name": "mob/phantom/idle3", + "volume": 0.8 + }, + { + "name": "mob/phantom/idle4", + "volume": 0.8 + }, + { + "name": "mob/phantom/idle5", + "volume": 0.8 + } + ], + "subtitle": "subtitles.entity.phantom.ambient" + }, + "entity.phantom.bite": { + "sounds": [ + "mob/phantom/bite1", + "mob/phantom/bite2" + ], + "subtitle": "subtitles.entity.phantom.bite" + }, + "entity.phantom.death": { + "sounds": [ + "mob/phantom/death1", + "mob/phantom/death2", + "mob/phantom/death3" + ], + "subtitle": "subtitles.entity.phantom.death" + }, + "entity.phantom.flap": { + "sounds": [ + { + "name": "mob/phantom/flap1", + "volume": 0.9 + }, + { + "name": "mob/phantom/flap2", + "volume": 0.9 + }, + { + "name": "mob/phantom/flap3", + "volume": 0.9 + }, + { + "name": "mob/phantom/flap4", + "volume": 0.9 + }, + { + "name": "mob/phantom/flap5", + "volume": 0.9 + }, + { + "name": "mob/phantom/flap6", + "volume": 0.9 + } + ], + "subtitle": "subtitles.entity.phantom.flap" + }, + "entity.phantom.hurt": { + "sounds": [ + { + "name": "mob/phantom/hurt1", + "volume": 0.75 + }, + { + "name": "mob/phantom/hurt2", + "volume": 0.75 + }, + { + "name": "mob/phantom/hurt3", + "volume": 0.75 + } + ], + "subtitle": "subtitles.entity.phantom.hurt" + }, + "entity.phantom.swoop": { + "sounds": [ + { + "name": "mob/phantom/swoop1", + "volume": 0.7 + }, + { + "name": "mob/phantom/swoop2", + "volume": 0.7 + }, + { + "name": "mob/phantom/swoop3", + "volume": 0.7 + }, + { + "name": "mob/phantom/swoop4", + "volume": 0.7 + } + ], + "subtitle": "subtitles.entity.phantom.swoop" + }, + "entity.pig.ambient": { + "sounds": [ + "mob/pig/say1", + "mob/pig/say2", + "mob/pig/say3" + ], + "subtitle": "subtitles.entity.pig.ambient" + }, + "entity.pig.death": { + "sounds": [ + "mob/pig/death" + ], + "subtitle": "subtitles.entity.pig.death" + }, + "entity.pig.hurt": { + "sounds": [ + "mob/pig/say1", + "mob/pig/say2", + "mob/pig/say3" + ], + "subtitle": "subtitles.entity.pig.hurt" + }, + "entity.pig.saddle": { + "sounds": [ + "mob/horse/leather" + ], + "subtitle": "subtitles.entity.pig.saddle" + }, + "entity.pig.step": { + "sounds": [ + "mob/pig/step1", + "mob/pig/step2", + "mob/pig/step3", + "mob/pig/step4", + "mob/pig/step5" + ], + "subtitle": "subtitles.block.generic.footsteps" + }, + "entity.piglin.admiring_item": { + "sounds": [ + { + "name": "mob/piglin/admire1", + "volume": 0.8 + }, + { + "name": "mob/piglin/admire2", + "volume": 0.8 + }, + { + "name": "mob/piglin/celebrate2", + "volume": 0.8 + }, + { + "name": "mob/piglin/celebrate4", + "volume": 0.85 + } + ], + "subtitle": "subtitles.entity.piglin.admiring_item" + }, + "entity.piglin.ambient": { + "sounds": [ + { + "name": "mob/piglin/idle1", + "volume": 0.66 + }, + { + "name": "mob/piglin/idle2", + "volume": 0.66 + }, + { + "name": "mob/piglin/idle3", + "volume": 0.66 + }, + { + "name": "mob/piglin/idle4", + "volume": 0.66 + }, + { + "name": "mob/piglin/idle5", + "volume": 0.66 + } + ], + "subtitle": "subtitles.entity.piglin.ambient" + }, + "entity.piglin.angry": { + "sounds": [ + { + "name": "mob/piglin/angry1", + "volume": 0.7 + }, + { + "name": "mob/piglin/angry2", + "volume": 0.7 + }, + { + "name": "mob/piglin/angry3", + "volume": 0.7 + }, + { + "name": "mob/piglin/angry4", + "volume": 0.7 + } + ], + "subtitle": "subtitles.entity.piglin.angry" + }, + "entity.piglin.celebrate": { + "sounds": [ + { + "name": "mob/piglin/celebrate1", + "volume": 0.8 + }, + { + "name": "mob/piglin/celebrate2", + "volume": 0.8 + }, + { + "name": "mob/piglin/celebrate3", + "volume": 0.75 + }, + { + "name": "mob/piglin/celebrate4", + "volume": 0.8 + } + ], + "subtitle": "subtitles.entity.piglin.celebrate" + }, + "entity.piglin.converted_to_zombified": { + "sounds": [ + "mob/piglin/converted1", + "mob/piglin/converted2" + ], + "subtitle": "subtitles.entity.piglin.converted_to_zombified" + }, + "entity.piglin.death": { + "sounds": [ + { + "name": "mob/piglin/death1", + "volume": 0.7 + }, + { + "name": "mob/piglin/death2", + "volume": 0.7 + }, + { + "name": "mob/piglin/death3", + "volume": 0.8 + }, + { + "name": "mob/piglin/death4", + "volume": 0.8 + } + ], + "subtitle": "subtitles.entity.piglin.death" + }, + "entity.piglin.hurt": { + "sounds": [ + { + "name": "mob/piglin/hurt1", + "volume": 0.7 + }, + { + "name": "mob/piglin/hurt2", + "volume": 0.7 + }, + { + "name": "mob/piglin/hurt3", + "volume": 0.7 + } + ], + "subtitle": "subtitles.entity.piglin.hurt" + }, + "entity.piglin.jealous": { + "sounds": [ + { + "name": "mob/piglin/jealous1", + "volume": 0.8 + }, + { + "name": "mob/piglin/jealous2", + "volume": 0.8 + }, + { + "name": "mob/piglin/jealous3", + "volume": 0.8 + }, + { + "name": "mob/piglin/jealous4", + "volume": 0.8 + }, + { + "name": "mob/piglin/jealous5", + "volume": 0.8 + } + ], + "subtitle": "subtitles.entity.piglin.jealous" + }, + "entity.piglin.retreat": { + "sounds": [ + { + "name": "mob/piglin/retreat1", + "volume": 0.65 + }, + { + "name": "mob/piglin/retreat2", + "volume": 0.65 + }, + { + "name": "mob/piglin/retreat3", + "volume": 0.65 + }, + { + "name": "mob/piglin/retreat4", + "volume": 0.65 + } + ], + "subtitle": "subtitles.entity.piglin.retreat" + }, + "entity.piglin.step": { + "sounds": [ + { + "name": "mob/piglin/step1", + "volume": 0.75 + }, + { + "name": "mob/piglin/step2", + "volume": 0.75 + }, + { + "name": "mob/piglin/step3", + "volume": 0.75 + }, + { + "name": "mob/piglin/step4", + "volume": 0.75 + }, + { + "name": "mob/piglin/step5", + "volume": 0.75 + } + ], + "subtitle": "subtitles.block.generic.footsteps" + }, + "entity.piglin_brute.ambient": { + "sounds": [ + { + "name": "mob/piglin_brute/idle1", + "volume": 0.9 + }, + { + "name": "mob/piglin_brute/idle2", + "volume": 0.9 + }, + { + "name": "mob/piglin_brute/idle3", + "volume": 0.9 + }, + { + "name": "mob/piglin_brute/idle4", + "volume": 0.9 + }, + { + "name": "mob/piglin_brute/idle5", + "volume": 0.9 + }, + { + "name": "mob/piglin_brute/idle6", + "volume": 0.9 + }, + { + "name": "mob/piglin_brute/idle7", + "volume": 0.9 + }, + { + "name": "mob/piglin_brute/idle8", + "volume": 0.9 + }, + { + "name": "mob/piglin_brute/idle9", + "volume": 0.9 + } + ], + "subtitle": "subtitles.entity.piglin_brute.ambient" + }, + "entity.piglin_brute.angry": { + "sounds": [ + { + "name": "mob/piglin_brute/angry1", + "volume": 0.9 + }, + { + "name": "mob/piglin_brute/angry2", + "volume": 0.9 + }, + { + "name": "mob/piglin_brute/angry3", + "volume": 0.9 + }, + { + "name": "mob/piglin_brute/angry4", + "volume": 0.9 + }, + { + "name": "mob/piglin_brute/angry5", + "volume": 0.9 + } + ], + "subtitle": "subtitles.entity.piglin_brute.angry" + }, + "entity.piglin_brute.converted_to_zombified": { + "sounds": [ + { + "name": "mob/piglin/converted1", + "pitch": 0.9 + }, + { + "name": "mob/piglin/converted2", + "pitch": 0.9 + } + ], + "subtitle": "subtitles.entity.piglin_brute.converted_to_zombified" + }, + "entity.piglin_brute.death": { + "sounds": [ + { + "name": "mob/piglin_brute/death1", + "volume": 0.8 + }, + { + "name": "mob/piglin_brute/death2", + "volume": 0.8 + }, + { + "name": "mob/piglin_brute/death3", + "volume": 0.8 + } + ], + "subtitle": "subtitles.entity.piglin_brute.death" + }, + "entity.piglin_brute.hurt": { + "sounds": [ + { + "name": "mob/piglin_brute/hurt1", + "volume": 0.64 + }, + { + "name": "mob/piglin_brute/hurt2", + "volume": 0.64 + }, + { + "name": "mob/piglin_brute/hurt3", + "volume": 0.64 + }, + { + "name": "mob/piglin_brute/hurt4", + "volume": 0.65 + } + ], + "subtitle": "subtitles.entity.piglin_brute.hurt" + }, + "entity.piglin_brute.step": { + "sounds": [ + { + "name": "mob/piglin_brute/step1", + "volume": 0.75 + }, + { + "name": "mob/piglin_brute/step2", + "volume": 0.75 + }, + { + "name": "mob/piglin_brute/step3", + "volume": 0.75 + }, + { + "name": "mob/piglin_brute/step4", + "volume": 0.75 + }, + { + "name": "mob/piglin_brute/step5", + "volume": 0.75 + } + ], + "subtitle": "subtitles.block.generic.footsteps" + }, + "entity.pillager.ambient": { + "sounds": [ + "mob/pillager/idle1", + "mob/pillager/idle2", + "mob/pillager/idle3", + "mob/pillager/idle4" + ], + "subtitle": "subtitles.entity.pillager.ambient" + }, + "entity.pillager.celebrate": { + "sounds": [ + "mob/pillager/celebrate1", + "mob/pillager/celebrate2", + "mob/pillager/celebrate3", + "mob/pillager/celebrate4", + "mob/pillager/horn_celebrate" + ], + "subtitle": "subtitles.entity.pillager.celebrate" + }, + "entity.pillager.death": { + "sounds": [ + "mob/pillager/death1", + "mob/pillager/death2" + ], + "subtitle": "subtitles.entity.pillager.death" + }, + "entity.pillager.hurt": { + "sounds": [ + "mob/pillager/hurt1", + "mob/pillager/hurt2", + "mob/pillager/hurt3" + ], + "subtitle": "subtitles.entity.pillager.hurt" + }, + "entity.player.attack.crit": { + "sounds": [ + { + "name": "entity/player/attack/crit1", + "volume": 0.7 + }, + { + "name": "entity/player/attack/crit2", + "volume": 0.7 + }, + { + "name": "entity/player/attack/crit3", + "volume": 0.7 + } + ], + "subtitle": "subtitles.entity.player.attack.crit" + }, + "entity.player.attack.knockback": { + "sounds": [ + { + "name": "entity/player/attack/knockback1", + "volume": 0.7 + }, + { + "name": "entity/player/attack/knockback2", + "volume": 0.7 + }, + { + "name": "entity/player/attack/knockback3", + "volume": 0.7 + }, + { + "name": "entity/player/attack/knockback4", + "volume": 0.7 + } + ], + "subtitle": "subtitles.entity.player.attack.knockback" + }, + "entity.player.attack.nodamage": { + "sounds": [ + { + "name": "entity/player/attack/weak1", + "volume": 0.7 + }, + { + "name": "entity/player/attack/weak2", + "volume": 0.7 + }, + { + "name": "entity/player/attack/weak3", + "volume": 0.7 + }, + { + "name": "entity/player/attack/weak4", + "volume": 0.7 + } + ], + "subtitle": "subtitles.entity.player.attack.weak" + }, + "entity.player.attack.strong": { + "sounds": [ + { + "name": "entity/player/attack/strong1", + "volume": 0.6 + }, + { + "name": "entity/player/attack/strong2", + "volume": 0.6 + }, + { + "name": "entity/player/attack/strong3", + "volume": 0.6 + }, + { + "name": "entity/player/attack/strong4", + "volume": 0.6 + }, + { + "name": "entity/player/attack/strong5", + "volume": 0.7 + }, + { + "name": "entity/player/attack/strong6", + "volume": 0.7 + } + ], + "subtitle": "subtitles.entity.player.attack.strong" + }, + "entity.player.attack.sweep": { + "sounds": [ + { + "name": "entity/player/attack/sweep1", + "volume": 0.7 + }, + { + "name": "entity/player/attack/sweep2", + "volume": 0.7 + }, + { + "name": "entity/player/attack/sweep3", + "volume": 0.7 + }, + { + "name": "entity/player/attack/sweep4", + "volume": 0.7 + }, + { + "name": "entity/player/attack/sweep5", + "volume": 0.7 + }, + { + "name": "entity/player/attack/sweep6", + "volume": 0.7 + }, + { + "name": "entity/player/attack/sweep7", + "volume": 0.7 + } + ], + "subtitle": "subtitles.entity.player.attack.sweep" + }, + "entity.player.attack.weak": { + "sounds": [ + { + "name": "entity/player/attack/weak1", + "volume": 0.7 + }, + { + "name": "entity/player/attack/weak2", + "volume": 0.7 + }, + { + "name": "entity/player/attack/weak3", + "volume": 0.7 + }, + { + "name": "entity/player/attack/weak4", + "volume": 0.7 + } + ], + "subtitle": "subtitles.entity.player.attack.weak" + }, + "entity.player.big_fall": { + "sounds": [ + "damage/fallbig" + ], + "subtitle": "subtitles.entity.generic.big_fall" + }, + "entity.player.breath": { + "sounds": [ + "random/breath" + ] + }, + "entity.player.burp": { + "sounds": [ + "random/burp" + ], + "subtitle": "subtitles.entity.player.burp" + }, + "entity.player.death": { + "sounds": [ + "damage/hit1", + "damage/hit2", + "damage/hit3" + ], + "subtitle": "subtitles.entity.player.death" + }, + "entity.player.hurt": { + "sounds": [ + "damage/hit1", + "damage/hit2", + "damage/hit3" + ], + "subtitle": "subtitles.entity.player.hurt" + }, + "entity.player.hurt_drown": { + "sounds": [ + "entity/player/hurt/drown1", + "entity/player/hurt/drown2", + "entity/player/hurt/drown3", + "entity/player/hurt/drown4" + ], + "subtitle": "subtitles.entity.player.hurt_drown" + }, + "entity.player.hurt_freeze": { + "sounds": [ + "entity/player/hurt/freeze_hurt1", + "entity/player/hurt/freeze_hurt2", + "entity/player/hurt/freeze_hurt3", + "entity/player/hurt/freeze_hurt4", + "entity/player/hurt/freeze_hurt5" + ], + "subtitle": "subtitles.entity.player.freeze_hurt" + }, + "entity.player.hurt_on_fire": { + "sounds": [ + "entity/player/hurt/fire_hurt1", + "entity/player/hurt/fire_hurt2", + "entity/player/hurt/fire_hurt3" + ], + "subtitle": "subtitles.entity.player.hurt_on_fire" + }, + "entity.player.hurt_sweet_berry_bush": { + "sounds": [ + "entity/player/hurt/berrybush_hurt1", + "entity/player/hurt/berrybush_hurt2" + ], + "subtitle": "subtitles.entity.player.hurt" + }, + "entity.player.levelup": { + "sounds": [ + "random/levelup" + ], + "subtitle": "subtitles.entity.player.levelup" + }, + "entity.player.small_fall": { + "sounds": [ + "damage/fallsmall" + ], + "subtitle": "subtitles.entity.generic.small_fall" + }, + "entity.player.splash": { + "sounds": [ + "liquid/splash", + "liquid/splash2" + ], + "subtitle": "subtitles.entity.generic.splash" + }, + "entity.player.splash.high_speed": { + "sounds": [ + "liquid/heavy_splash" + ], + "subtitle": "subtitles.entity.generic.splash" + }, + "entity.player.swim": { + "sounds": [ + "liquid/swim5", + "liquid/swim6", + "liquid/swim7", + "liquid/swim8", + "liquid/swim9", + "liquid/swim10", + "liquid/swim11", + "liquid/swim12", + "liquid/swim13", + "liquid/swim14", + "liquid/swim15", + "liquid/swim16", + "liquid/swim17", + "liquid/swim18" + ], + "subtitle": "subtitles.entity.generic.swim" + }, + "entity.player.teleport": { + "sounds": [ + "mob/endermen/portal", + "mob/endermen/portal2" + ], + "subtitle": "subtitles.entity.player.teleport" + }, + "entity.polar_bear.ambient": { + "sounds": [ + "mob/polarbear/idle1", + "mob/polarbear/idle2", + "mob/polarbear/idle3", + "mob/polarbear/idle4" + ], + "subtitle": "subtitles.entity.polar_bear.ambient" + }, + "entity.polar_bear.ambient_baby": { + "sounds": [ + "mob/polarbear_baby/idle1", + "mob/polarbear_baby/idle2", + "mob/polarbear_baby/idle3", + "mob/polarbear_baby/idle4" + ], + "subtitle": "subtitles.entity.polar_bear.ambient_baby" + }, + "entity.polar_bear.death": { + "sounds": [ + "mob/polarbear/death1", + "mob/polarbear/death2", + "mob/polarbear/death3" + ], + "subtitle": "subtitles.entity.polar_bear.death" + }, + "entity.polar_bear.hurt": { + "sounds": [ + "mob/polarbear/hurt1", + "mob/polarbear/hurt2", + "mob/polarbear/hurt3", + "mob/polarbear/hurt4" + ], + "subtitle": "subtitles.entity.polar_bear.hurt" + }, + "entity.polar_bear.step": { + "sounds": [ + "mob/polarbear/step1", + "mob/polarbear/step2", + "mob/polarbear/step3", + "mob/polarbear/step4" + ], + "subtitle": "subtitles.block.generic.footsteps" + }, + "entity.polar_bear.warning": { + "sounds": [ + "mob/polarbear/warning1", + "mob/polarbear/warning2", + "mob/polarbear/warning3", + { + "name": "mob/polarbear/warning3", + "pitch": 0.9 + } + ], + "subtitle": "subtitles.entity.polar_bear.warning" + }, + "entity.puffer_fish.ambient": { + "sounds": [] + }, + "entity.puffer_fish.blow_out": { + "sounds": [ + { + "name": "entity/pufferfish/blow_out1", + "volume": 0.7 + }, + { + "name": "entity/pufferfish/blow_out2", + "volume": 0.7 + } + ], + "subtitle": "subtitles.entity.puffer_fish.blow_out" + }, + "entity.puffer_fish.blow_up": { + "sounds": [ + { + "name": "entity/pufferfish/blow_up1", + "volume": 0.45 + }, + { + "name": "entity/pufferfish/blow_up2", + "volume": 0.45 + } + ], + "subtitle": "subtitles.entity.puffer_fish.blow_up" + }, + "entity.puffer_fish.death": { + "sounds": [ + "entity/pufferfish/death1", + "entity/pufferfish/death2" + ], + "subtitle": "subtitles.entity.puffer_fish.death" + }, + "entity.puffer_fish.flop": { + "sounds": [ + { + "name": "entity/pufferfish/flop1", + "volume": 0.3 + }, + { + "name": "entity/pufferfish/flop2", + "volume": 0.3 + }, + { + "name": "entity/pufferfish/flop3", + "volume": 0.3 + }, + { + "name": "entity/pufferfish/flop4", + "volume": 0.3 + } + ], + "subtitle": "subtitles.entity.puffer_fish.flop" + }, + "entity.puffer_fish.hurt": { + "sounds": [ + "entity/pufferfish/hurt1", + "entity/pufferfish/hurt2" + ], + "subtitle": "subtitles.entity.puffer_fish.hurt" + }, + "entity.puffer_fish.sting": { + "sounds": [ + "entity/pufferfish/sting1", + "entity/pufferfish/sting2" + ], + "subtitle": "subtitles.entity.puffer_fish.sting" + }, + "entity.rabbit.ambient": { + "sounds": [ + { + "name": "mob/rabbit/idle1", + "volume": 0.25 + }, + { + "name": "mob/rabbit/idle2", + "volume": 0.25 + }, + { + "name": "mob/rabbit/idle3", + "volume": 0.25 + }, + { + "name": "mob/rabbit/idle4", + "volume": 0.25 + } + ], + "subtitle": "subtitles.entity.rabbit.ambient" + }, + "entity.rabbit.attack": { + "sounds": [ + "entity/rabbit/attack1", + "entity/rabbit/attack2", + "entity/rabbit/attack3", + "entity/rabbit/attack4" + ], + "subtitle": "subtitles.entity.rabbit.attack" + }, + "entity.rabbit.death": { + "sounds": [ + { + "name": "mob/rabbit/bunnymurder", + "volume": 0.5 + } + ], + "subtitle": "subtitles.entity.rabbit.death" + }, + "entity.rabbit.hurt": { + "sounds": [ + { + "name": "mob/rabbit/hurt1", + "volume": 0.5 + }, + { + "name": "mob/rabbit/hurt2", + "volume": 0.5 + }, + { + "name": "mob/rabbit/hurt3", + "volume": 0.5 + }, + { + "name": "mob/rabbit/hurt4", + "volume": 0.5 + } + ], + "subtitle": "subtitles.entity.rabbit.hurt" + }, + "entity.rabbit.jump": { + "sounds": [ + { + "name": "mob/rabbit/hop1", + "volume": 0.1 + }, + { + "name": "mob/rabbit/hop2", + "volume": 0.1 + }, + { + "name": "mob/rabbit/hop3", + "volume": 0.1 + }, + { + "name": "mob/rabbit/hop4", + "volume": 0.1 + } + ], + "subtitle": "subtitles.entity.rabbit.jump" + }, + "entity.ravager.ambient": { + "sounds": [ + "mob/ravager/idle1", + "mob/ravager/idle2", + "mob/ravager/idle3", + "mob/ravager/idle4", + "mob/ravager/idle5", + "mob/ravager/idle6", + "mob/ravager/idle7", + "mob/ravager/idle8" + ], + "subtitle": "subtitles.entity.ravager.ambient" + }, + "entity.ravager.attack": { + "sounds": [ + "mob/ravager/bite1", + "mob/ravager/bite2", + "mob/ravager/bite3" + ], + "subtitle": "subtitles.entity.ravager.attack" + }, + "entity.ravager.celebrate": { + "sounds": [ + "mob/ravager/celebrate1", + "mob/ravager/celebrate2" + ], + "subtitle": "subtitles.entity.ravager.celebrate" + }, + "entity.ravager.death": { + "sounds": [ + "mob/ravager/death1", + "mob/ravager/death2", + "mob/ravager/death3" + ], + "subtitle": "subtitles.entity.ravager.death" + }, + "entity.ravager.hurt": { + "sounds": [ + "mob/ravager/hurt1", + "mob/ravager/hurt2", + "mob/ravager/hurt3", + "mob/ravager/hurt4" + ], + "subtitle": "subtitles.entity.ravager.hurt" + }, + "entity.ravager.roar": { + "sounds": [ + { + "attenuation_distance": 35, + "name": "mob/ravager/roar1" + }, + { + "attenuation_distance": 35, + "name": "mob/ravager/roar2" + }, + { + "attenuation_distance": 35, + "name": "mob/ravager/roar3" + }, + { + "attenuation_distance": 35, + "name": "mob/ravager/roar4" + } + ], + "subtitle": "subtitles.entity.ravager.roar" + }, + "entity.ravager.step": { + "sounds": [ + "mob/ravager/step1", + "mob/ravager/step2", + "mob/ravager/step3", + "mob/ravager/step4", + "mob/ravager/step5" + ], + "subtitle": "subtitles.block.generic.footsteps" + }, + "entity.ravager.stunned": { + "sounds": [ + "mob/ravager/stun1", + "mob/ravager/stun2", + "mob/ravager/stun3" + ], + "subtitle": "subtitles.entity.ravager.stunned" + }, + "entity.salmon.ambient": { + "sounds": [] + }, + "entity.salmon.death": { + "sounds": [ + { + "name": "entity/fish/hurt1", + "pitch": 0.8 + }, + { + "name": "entity/fish/hurt2", + "pitch": 0.8 + }, + { + "name": "entity/fish/hurt3", + "pitch": 0.8 + }, + { + "name": "entity/fish/hurt4", + "pitch": 0.8 + } + ], + "subtitle": "subtitles.entity.salmon.death" + }, + "entity.salmon.flop": { + "sounds": [ + { + "name": "entity/fish/flop1", + "pitch": 0.8, + "volume": 0.3 + }, + { + "name": "entity/fish/flop2", + "pitch": 0.8, + "volume": 0.3 + }, + { + "name": "entity/fish/flop3", + "pitch": 0.8, + "volume": 0.3 + }, + { + "name": "entity/fish/flop4", + "pitch": 0.8, + "volume": 0.3 + } + ], + "subtitle": "subtitles.entity.salmon.flop" + }, + "entity.salmon.hurt": { + "sounds": [ + { + "name": "entity/fish/hurt1", + "pitch": 0.8 + }, + { + "name": "entity/fish/hurt2", + "pitch": 0.8 + }, + { + "name": "entity/fish/hurt3", + "pitch": 0.8 + }, + { + "name": "entity/fish/hurt4", + "pitch": 0.8 + } + ], + "subtitle": "subtitles.entity.salmon.hurt" + }, + "entity.sheep.ambient": { + "sounds": [ + "mob/sheep/say1", + "mob/sheep/say2", + "mob/sheep/say3" + ], + "subtitle": "subtitles.entity.sheep.ambient" + }, + "entity.sheep.death": { + "sounds": [ + "mob/sheep/say1", + "mob/sheep/say2", + "mob/sheep/say3" + ], + "subtitle": "subtitles.entity.sheep.death" + }, + "entity.sheep.hurt": { + "sounds": [ + "mob/sheep/say1", + "mob/sheep/say2", + "mob/sheep/say3" + ], + "subtitle": "subtitles.entity.sheep.hurt" + }, + "entity.sheep.shear": { + "sounds": [ + "mob/sheep/shear" + ], + "subtitle": "subtitles.item.shears.shear" + }, + "entity.sheep.step": { + "sounds": [ + "mob/sheep/step1", + "mob/sheep/step2", + "mob/sheep/step3", + "mob/sheep/step4", + "mob/sheep/step5" + ], + "subtitle": "subtitles.block.generic.footsteps" + }, + "entity.shulker.ambient": { + "sounds": [ + "entity/shulker/ambient1", + "entity/shulker/ambient2", + "entity/shulker/ambient3", + "entity/shulker/ambient4", + "entity/shulker/ambient5", + "entity/shulker/ambient6", + "entity/shulker/ambient7" + ], + "subtitle": "subtitles.entity.shulker.ambient" + }, + "entity.shulker.close": { + "sounds": [ + "entity/shulker/close1", + "entity/shulker/close2", + "entity/shulker/close3", + "entity/shulker/close4", + "entity/shulker/close5" + ], + "subtitle": "subtitles.entity.shulker.close" + }, + "entity.shulker.death": { + "sounds": [ + "entity/shulker/death1", + "entity/shulker/death2", + "entity/shulker/death3", + "entity/shulker/death4" + ], + "subtitle": "subtitles.entity.shulker.death" + }, + "entity.shulker.hurt": { + "sounds": [ + "entity/shulker/hurt1", + "entity/shulker/hurt2", + "entity/shulker/hurt3", + "entity/shulker/hurt4" + ], + "subtitle": "subtitles.entity.shulker.hurt" + }, + "entity.shulker.hurt_closed": { + "sounds": [ + "entity/shulker/hurt_closed1", + "entity/shulker/hurt_closed2", + "entity/shulker/hurt_closed3", + "entity/shulker/hurt_closed4", + "entity/shulker/hurt_closed5" + ], + "subtitle": "subtitles.entity.shulker.hurt" + }, + "entity.shulker.open": { + "sounds": [ + "entity/shulker/open1", + "entity/shulker/open2", + "entity/shulker/open3", + "entity/shulker/open4", + "entity/shulker/open5" + ], + "subtitle": "subtitles.entity.shulker.open" + }, + "entity.shulker.shoot": { + "sounds": [ + "entity/shulker/shoot1", + "entity/shulker/shoot2", + "entity/shulker/shoot3", + "entity/shulker/shoot4" + ], + "subtitle": "subtitles.entity.shulker.shoot" + }, + "entity.shulker.teleport": { + "sounds": [ + "mob/endermen/portal", + "mob/endermen/portal2" + ], + "subtitle": "subtitles.entity.shulker.teleport" + }, + "entity.shulker_bullet.hit": { + "sounds": [ + "entity/shulker_bullet/hit1", + "entity/shulker_bullet/hit2", + "entity/shulker_bullet/hit3", + "entity/shulker_bullet/hit4" + ], + "subtitle": "subtitles.entity.shulker_bullet.hit" + }, + "entity.shulker_bullet.hurt": { + "sounds": [ + "entity/shulker_bullet/hit1", + "entity/shulker_bullet/hit2", + "entity/shulker_bullet/hit3", + "entity/shulker_bullet/hit4" + ], + "subtitle": "subtitles.entity.shulker_bullet.hurt" + }, + "entity.silverfish.ambient": { + "sounds": [ + "mob/silverfish/say1", + "mob/silverfish/say2", + "mob/silverfish/say3", + "mob/silverfish/say4" + ], + "subtitle": "subtitles.entity.silverfish.ambient" + }, + "entity.silverfish.death": { + "sounds": [ + "mob/silverfish/kill" + ], + "subtitle": "subtitles.entity.silverfish.death" + }, + "entity.silverfish.hurt": { + "sounds": [ + "mob/silverfish/hit1", + "mob/silverfish/hit2", + "mob/silverfish/hit3" + ], + "subtitle": "subtitles.entity.silverfish.hurt" + }, + "entity.silverfish.step": { + "sounds": [ + "mob/silverfish/step1", + "mob/silverfish/step2", + "mob/silverfish/step3", + "mob/silverfish/step4" + ], + "subtitle": "subtitles.block.generic.footsteps" + }, + "entity.skeleton.ambient": { + "sounds": [ + "mob/skeleton/say1", + "mob/skeleton/say2", + "mob/skeleton/say3" + ], + "subtitle": "subtitles.entity.skeleton.ambient" + }, + "entity.skeleton.converted_to_stray": { + "sounds": [ + "mob/stray/convert1", + "mob/stray/convert2", + "mob/stray/convert3" + ], + "subtitle": "subtitles.entity.skeleton.converted_to_stray" + }, + "entity.skeleton.death": { + "sounds": [ + "mob/skeleton/death" + ], + "subtitle": "subtitles.entity.skeleton.death" + }, + "entity.skeleton.hurt": { + "sounds": [ + "mob/skeleton/hurt1", + "mob/skeleton/hurt2", + "mob/skeleton/hurt3", + "mob/skeleton/hurt4" + ], + "subtitle": "subtitles.entity.skeleton.hurt" + }, + "entity.skeleton.shoot": { + "sounds": [ + "random/bow" + ], + "subtitle": "subtitles.entity.skeleton.shoot" + }, + "entity.skeleton.step": { + "sounds": [ + "mob/skeleton/step1", + "mob/skeleton/step2", + "mob/skeleton/step3", + "mob/skeleton/step4" + ], + "subtitle": "subtitles.block.generic.footsteps" + }, + "entity.skeleton_horse.ambient": { + "sounds": [ + "mob/horse/skeleton/idle1", + "mob/horse/skeleton/idle2", + "mob/horse/skeleton/idle3" + ], + "subtitle": "subtitles.entity.skeleton_horse.ambient" + }, + "entity.skeleton_horse.ambient_water": { + "sounds": [ + "mob/horse/skeleton/water/idle1", + "mob/horse/skeleton/water/idle2", + "mob/horse/skeleton/water/idle3", + "mob/horse/skeleton/water/idle4", + "mob/horse/skeleton/water/idle5" + ], + "subtitle": "subtitles.entity.skeleton_horse.ambient" + }, + "entity.skeleton_horse.death": { + "sounds": [ + "mob/horse/skeleton/death" + ], + "subtitle": "subtitles.entity.skeleton_horse.death" + }, + "entity.skeleton_horse.gallop_water": { + "sounds": [ + { + "name": "mob/horse/skeleton/water/gallop1", + "volume": 0.45 + }, + { + "name": "mob/horse/skeleton/water/gallop2", + "volume": 0.45 + }, + { + "name": "mob/horse/skeleton/water/gallop3", + "volume": 0.45 + }, + { + "name": "mob/horse/skeleton/water/gallop4", + "volume": 0.45 + } + ], + "subtitle": "subtitles.entity.horse.gallop" + }, + "entity.skeleton_horse.hurt": { + "sounds": [ + "mob/horse/skeleton/hit1", + "mob/horse/skeleton/hit2", + "mob/horse/skeleton/hit3", + "mob/horse/skeleton/hit4" + ], + "subtitle": "subtitles.entity.skeleton_horse.hurt" + }, + "entity.skeleton_horse.jump_water": { + "sounds": [ + { + "name": "mob/horse/skeleton/water/jump", + "volume": 0.8 + } + ], + "subtitle": "subtitles.entity.skeleton_horse.jump_water" + }, + "entity.skeleton_horse.step_water": { + "sounds": [ + { + "name": "mob/horse/skeleton/water/soft1", + "volume": 0.6 + }, + { + "name": "mob/horse/skeleton/water/soft2", + "volume": 0.6 + }, + { + "name": "mob/horse/skeleton/water/soft3", + "volume": 0.6 + }, + { + "name": "mob/horse/skeleton/water/soft4", + "volume": 0.6 + }, + { + "name": "mob/horse/skeleton/water/soft5", + "volume": 0.6 + }, + { + "name": "mob/horse/skeleton/water/soft6", + "volume": 0.6 + } + ], + "subtitle": "subtitles.block.generic.footsteps" + }, + "entity.skeleton_horse.swim": { + "sounds": [ + { + "name": "liquid/swim9", + "volume": 0.4 + }, + { + "name": "liquid/swim10", + "volume": 0.4 + }, + { + "name": "liquid/swim11", + "volume": 0.4 + }, + { + "name": "liquid/swim12", + "volume": 0.4 + }, + { + "name": "liquid/swim14", + "volume": 0.6 + }, + { + "name": "liquid/swim15", + "volume": 0.6 + }, + { + "name": "liquid/swim16", + "volume": 0.6 + }, + { + "name": "liquid/swim17", + "volume": 0.6 + } + ], + "subtitle": "subtitles.entity.skeleton_horse.swim" + }, + "entity.slime.attack": { + "sounds": [ + "mob/slime/attack1", + "mob/slime/attack2" + ], + "subtitle": "subtitles.entity.slime.attack" + }, + "entity.slime.death": { + "sounds": [ + "mob/slime/big1", + "mob/slime/big2", + "mob/slime/big3", + "mob/slime/big4" + ], + "subtitle": "subtitles.entity.slime.death" + }, + "entity.slime.death_small": { + "sounds": [ + "mob/slime/small1", + "mob/slime/small2", + "mob/slime/small3", + "mob/slime/small4", + "mob/slime/small5" + ], + "subtitle": "subtitles.entity.slime.death" + }, + "entity.slime.hurt": { + "sounds": [ + "mob/slime/big1", + "mob/slime/big2", + "mob/slime/big3", + "mob/slime/big4" + ], + "subtitle": "subtitles.entity.slime.hurt" + }, + "entity.slime.hurt_small": { + "sounds": [ + "mob/slime/small1", + "mob/slime/small2", + "mob/slime/small3", + "mob/slime/small4", + "mob/slime/small5" + ], + "subtitle": "subtitles.entity.slime.hurt" + }, + "entity.slime.jump": { + "sounds": [ + "mob/slime/big1", + "mob/slime/big2", + "mob/slime/big3", + "mob/slime/big4" + ], + "subtitle": "subtitles.entity.slime.squish" + }, + "entity.slime.jump_small": { + "sounds": [ + "mob/slime/small1", + "mob/slime/small2", + "mob/slime/small3", + "mob/slime/small4", + "mob/slime/small5" + ], + "subtitle": "subtitles.entity.slime.squish" + }, + "entity.slime.squish": { + "sounds": [ + "mob/slime/big1", + "mob/slime/big2", + "mob/slime/big3", + "mob/slime/big4" + ], + "subtitle": "subtitles.entity.slime.squish" + }, + "entity.slime.squish_small": { + "sounds": [ + "mob/slime/small1", + "mob/slime/small2", + "mob/slime/small3", + "mob/slime/small4", + "mob/slime/small5" + ], + "subtitle": "subtitles.entity.slime.squish" + }, + "entity.sniffer.death": { + "sounds": [ + "mob/sniffer/death1", + "mob/sniffer/death2" + ], + "subtitle": "subtitles.entity.sniffer.death" + }, + "entity.sniffer.digging": { + "sounds": [ + "mob/sniffer/longdig1", + "mob/sniffer/longdig2" + ], + "subtitle": "subtitles.entity.sniffer.digging" + }, + "entity.sniffer.digging_stop": { + "sounds": [ + "mob/sniffer/digging_stop1", + "mob/sniffer/digging_stop2" + ], + "subtitle": "subtitles.entity.sniffer.digging_stop" + }, + "entity.sniffer.drop_seed": { + "sounds": [ + { + "name": "random/pop", + "pitch": 0.6, + "volume": 0.8 + }, + { + "name": "random/pop", + "pitch": 0.7, + "volume": 0.8 + }, + { + "name": "random/pop", + "pitch": 0.8, + "volume": 0.8 + } + ], + "subtitle": "subtitles.entity.sniffer.drop_seed" + }, + "entity.sniffer.eat": { + "sounds": [ + { + "name": "mob/sniffer/eat1", + "volume": 0.7 + }, + { + "name": "mob/sniffer/eat2", + "volume": 0.7 + }, + { + "name": "mob/sniffer/eat3", + "volume": 0.7 + } + ], + "subtitle": "subtitles.entity.sniffer.eat" + }, + "entity.sniffer.happy": { + "sounds": [ + "mob/sniffer/happy1", + "mob/sniffer/happy2", + "mob/sniffer/happy3", + "mob/sniffer/happy4", + "mob/sniffer/happy5" + ], + "subtitle": "subtitles.entity.sniffer.happy" + }, + "entity.sniffer.hurt": { + "sounds": [ + "mob/sniffer/hurt1", + "mob/sniffer/hurt2", + "mob/sniffer/hurt3" + ], + "subtitle": "subtitles.entity.sniffer.hurt" + }, + "entity.sniffer.idle": { + "sounds": [ + "mob/sniffer/idle1", + "mob/sniffer/idle2", + "mob/sniffer/idle3", + "mob/sniffer/idle4", + "mob/sniffer/idle5", + "mob/sniffer/idle6", + "mob/sniffer/idle7", + "mob/sniffer/idle8", + "mob/sniffer/idle9", + "mob/sniffer/idle10", + "mob/sniffer/idle11" + ], + "subtitle": "subtitles.entity.sniffer.idle" + }, + "entity.sniffer.scenting": { + "sounds": [ + "mob/sniffer/scenting1", + "mob/sniffer/scenting2", + "mob/sniffer/scenting3" + ], + "subtitle": "subtitles.entity.sniffer.scenting" + }, + "entity.sniffer.searching": { + "sounds": [ + "mob/sniffer/searching1", + { + "name": "mob/sniffer/searching1", + "volume": 0.8 + }, + "mob/sniffer/searching2", + { + "name": "mob/sniffer/searching2", + "volume": 0.8 + }, + "mob/sniffer/searching3", + { + "name": "mob/sniffer/searching3", + "volume": 0.8 + }, + "mob/sniffer/searching4", + { + "name": "mob/sniffer/searching4", + "volume": 0.8 + }, + "mob/sniffer/searching5", + { + "name": "mob/sniffer/searching5", + "volume": 0.8 + }, + "mob/sniffer/searching6", + { + "name": "mob/sniffer/searching6", + "volume": 0.8 + } + ], + "subtitle": "subtitles.entity.sniffer.searching" + }, + "entity.sniffer.sniffing": { + "sounds": [ + "mob/sniffer/sniffing1", + "mob/sniffer/sniffing2", + "mob/sniffer/sniffing3" + ], + "subtitle": "subtitles.entity.sniffer.sniffing" + }, + "entity.sniffer.step": { + "sounds": [ + "mob/sniffer/step1", + "mob/sniffer/step2", + "mob/sniffer/step3", + "mob/sniffer/step4", + "mob/sniffer/step5", + "mob/sniffer/step6" + ], + "subtitle": "subtitles.block.generic.footsteps" + }, + "entity.snow_golem.ambient": { + "sounds": [] + }, + "entity.snow_golem.death": { + "sounds": [ + "entity/snowman/death1", + "entity/snowman/death2", + "entity/snowman/death3" + ], + "subtitle": "subtitles.entity.snow_golem.death" + }, + "entity.snow_golem.hurt": { + "sounds": [ + "entity/snowman/hurt1", + "entity/snowman/hurt2", + "entity/snowman/hurt3" + ], + "subtitle": "subtitles.entity.snow_golem.hurt" + }, + "entity.snow_golem.shear": { + "sounds": [ + "mob/sheep/shear" + ], + "subtitle": "subtitles.item.shears.shear" + }, + "entity.snow_golem.shoot": { + "sounds": [ + "random/bow" + ], + "subtitle": "subtitles.entity.snowball.throw" + }, + "entity.snowball.throw": { + "sounds": [ + "random/bow" + ], + "subtitle": "subtitles.entity.snowball.throw" + }, + "entity.spider.ambient": { + "sounds": [ + "mob/spider/say1", + "mob/spider/say2", + "mob/spider/say3", + "mob/spider/say4" + ], + "subtitle": "subtitles.entity.spider.ambient" + }, + "entity.spider.death": { + "sounds": [ + "mob/spider/death" + ], + "subtitle": "subtitles.entity.spider.death" + }, + "entity.spider.hurt": { + "sounds": [ + "mob/spider/say1", + "mob/spider/say2", + "mob/spider/say3", + "mob/spider/say4" + ], + "subtitle": "subtitles.entity.spider.hurt" + }, + "entity.spider.step": { + "sounds": [ + "mob/spider/step1", + "mob/spider/step2", + "mob/spider/step3", + "mob/spider/step4" + ], + "subtitle": "subtitles.block.generic.footsteps" + }, + "entity.splash_potion.break": { + "sounds": [ + "random/glass1", + "random/glass2", + "random/glass3" + ], + "subtitle": "subtitles.entity.potion.splash" + }, + "entity.splash_potion.throw": { + "sounds": [ + "random/bow" + ], + "subtitle": "subtitles.entity.potion.throw" + }, + "entity.squid.ambient": { + "sounds": [ + "entity/squid/ambient1", + "entity/squid/ambient2", + "entity/squid/ambient3", + "entity/squid/ambient4", + "entity/squid/ambient5" + ], + "subtitle": "subtitles.entity.squid.ambient" + }, + "entity.squid.death": { + "sounds": [ + "entity/squid/death1", + "entity/squid/death2", + "entity/squid/death3" + ], + "subtitle": "subtitles.entity.squid.death" + }, + "entity.squid.hurt": { + "sounds": [ + "entity/squid/hurt1", + "entity/squid/hurt2", + "entity/squid/hurt3", + "entity/squid/hurt4" + ], + "subtitle": "subtitles.entity.squid.hurt" + }, + "entity.squid.squirt": { + "sounds": [ + "entity/squid/squirt1", + "entity/squid/squirt2", + "entity/squid/squirt3" + ], + "subtitle": "subtitles.entity.squid.squirt" + }, + "entity.stray.ambient": { + "sounds": [ + "mob/stray/idle1", + "mob/stray/idle2", + "mob/stray/idle3", + "mob/stray/idle4" + ], + "subtitle": "subtitles.entity.stray.ambient" + }, + "entity.stray.death": { + "sounds": [ + "mob/stray/death1", + "mob/stray/death2" + ], + "subtitle": "subtitles.entity.stray.death" + }, + "entity.stray.hurt": { + "sounds": [ + "mob/stray/hurt1", + "mob/stray/hurt2", + "mob/stray/hurt3", + "mob/stray/hurt4" + ], + "subtitle": "subtitles.entity.stray.hurt" + }, + "entity.stray.step": { + "sounds": [ + "mob/stray/step1", + "mob/stray/step2", + "mob/stray/step3", + "mob/stray/step4" + ], + "subtitle": "subtitles.block.generic.footsteps" + }, + "entity.strider.ambient": { + "sounds": [ + "mob/strider/idle1", + "mob/strider/idle2", + "mob/strider/idle3", + "mob/strider/idle4", + "mob/strider/idle5", + "mob/strider/idle6" + ], + "subtitle": "subtitles.entity.strider.idle" + }, + "entity.strider.death": { + "sounds": [ + "mob/strider/death1", + "mob/strider/death2", + "mob/strider/death3", + "mob/strider/death4" + ], + "subtitle": "subtitles.entity.strider.death" + }, + "entity.strider.eat": { + "sounds": [ + "mob/strider/eat1", + "mob/strider/eat2", + "mob/strider/eat3" + ], + "subtitle": "subtitles.entity.strider.eat" + }, + "entity.strider.happy": { + "sounds": [ + "mob/strider/happy1", + "mob/strider/happy2", + "mob/strider/happy3", + "mob/strider/happy4", + "mob/strider/happy5" + ], + "subtitle": "subtitles.entity.strider.happy" + }, + "entity.strider.hurt": { + "sounds": [ + "mob/strider/hurt1", + "mob/strider/hurt2", + "mob/strider/hurt3", + "mob/strider/hurt4" + ], + "subtitle": "subtitles.entity.strider.hurt" + }, + "entity.strider.retreat": { + "sounds": [ + { + "name": "mob/strider/retreat1", + "volume": 0.8 + }, + { + "name": "mob/strider/retreat2", + "volume": 0.8 + }, + { + "name": "mob/strider/retreat3", + "volume": 0.8 + }, + { + "name": "mob/strider/retreat4", + "volume": 0.8 + }, + { + "name": "mob/strider/retreat5", + "volume": 0.8 + } + ], + "subtitle": "subtitles.entity.strider.retreat" + }, + "entity.strider.saddle": { + "sounds": [ + "mob/horse/leather" + ] + }, + "entity.strider.step": { + "sounds": [ + { + "name": "mob/strider/step1", + "volume": 0.25 + }, + { + "name": "mob/strider/step2", + "volume": 0.25 + }, + { + "name": "mob/strider/step3", + "volume": 0.25 + }, + { + "name": "mob/strider/step4", + "volume": 0.25 + }, + { + "name": "mob/strider/step5", + "volume": 0.25 + } + ], + "subtitle": "subtitles.block.generic.footsteps" + }, + "entity.strider.step_lava": { + "sounds": [ + { + "name": "mob/strider/step_lava1", + "volume": 0.2 + }, + { + "name": "mob/strider/step_lava2", + "volume": 0.2 + }, + { + "name": "mob/strider/step_lava3", + "volume": 0.2 + }, + { + "name": "mob/strider/step_lava4", + "volume": 0.2 + }, + { + "name": "mob/strider/step_lava5", + "volume": 0.2 + }, + { + "name": "mob/strider/step_lava6", + "volume": 0.2 + } + ], + "subtitle": "subtitles.block.generic.footsteps" + }, + "entity.tadpole.death": { + "sounds": [ + "mob/tadpole/death1", + "mob/tadpole/death2" + ], + "subtitle": "subtitles.entity.tadpole.death" + }, + "entity.tadpole.flop": { + "sounds": [ + { + "name": "entity.tropical_fish.flop", + "type": "event" + } + ], + "subtitle": "subtitles.entity.tadpole.flop" + }, + "entity.tadpole.grow_up": { + "sounds": [ + { + "name": "mob/frog/idle1", + "pitch": 1.2, + "volume": 0.75 + }, + { + "name": "mob/frog/idle2", + "pitch": 1.2, + "volume": 0.75 + }, + { + "name": "mob/frog/idle3", + "pitch": 1.2, + "volume": 0.75 + }, + { + "name": "mob/frog/idle4", + "pitch": 1.2, + "volume": 0.75 + }, + { + "name": "mob/frog/idle5", + "pitch": 1.2, + "volume": 0.75 + }, + { + "name": "mob/frog/idle6", + "pitch": 1.2, + "volume": 0.75 + }, + { + "name": "mob/frog/idle7", + "pitch": 1.2, + "volume": 0.75 + }, + { + "name": "mob/frog/idle8", + "pitch": 1.2, + "volume": 0.75 + } + ], + "subtitle": "subtitles.entity.tadpole.grow_up" + }, + "entity.tadpole.hurt": { + "sounds": [ + "mob/tadpole/hurt1", + "mob/tadpole/hurt2", + "mob/tadpole/hurt3", + "mob/tadpole/hurt4" + ], + "subtitle": "subtitles.entity.tadpole.hurt" + }, + "entity.tnt.primed": { + "sounds": [ + "random/fuse" + ], + "subtitle": "subtitles.entity.tnt.primed" + }, + "entity.tropical_fish.ambient": { + "sounds": [] + }, + "entity.tropical_fish.death": { + "sounds": [ + { + "name": "entity/fish/hurt1", + "pitch": 0.8 + }, + { + "name": "entity/fish/hurt2", + "pitch": 0.8 + }, + { + "name": "entity/fish/hurt3", + "pitch": 0.8 + }, + { + "name": "entity/fish/hurt4", + "pitch": 0.8 + } + ], + "subtitle": "subtitles.entity.tropical_fish.death" + }, + "entity.tropical_fish.flop": { + "sounds": [ + { + "name": "entity/fish/flop1", + "volume": 0.3 + }, + { + "name": "entity/fish/flop2", + "volume": 0.3 + }, + { + "name": "entity/fish/flop3", + "volume": 0.3 + }, + { + "name": "entity/fish/flop4", + "volume": 0.3 + } + ], + "subtitle": "subtitles.entity.tropical_fish.flop" + }, + "entity.tropical_fish.hurt": { + "sounds": [ + "entity/fish/hurt1", + "entity/fish/hurt2", + "entity/fish/hurt3", + "entity/fish/hurt4" + ], + "subtitle": "subtitles.entity.tropical_fish.hurt" + }, + "entity.turtle.ambient_land": { + "sounds": [ + { + "name": "mob/turtle/idle1", + "volume": 0.8 + }, + { + "name": "mob/turtle/idle2", + "volume": 0.7 + }, + { + "name": "mob/turtle/idle3", + "volume": 0.8 + } + ], + "subtitle": "subtitles.entity.turtle.ambient_land" + }, + "entity.turtle.death": { + "sounds": [ + "mob/turtle/death1", + "mob/turtle/death2", + "mob/turtle/death3" + ], + "subtitle": "subtitles.entity.turtle.death" + }, + "entity.turtle.death_baby": { + "sounds": [ + "mob/turtle/baby/death1", + "mob/turtle/baby/death2" + ], + "subtitle": "subtitles.entity.turtle.death_baby" + }, + "entity.turtle.egg_break": { + "sounds": [ + "mob/turtle/egg/egg_break1", + "mob/turtle/egg/egg_break2" + ], + "subtitle": "subtitles.entity.turtle.egg_break" + }, + "entity.turtle.egg_crack": { + "sounds": [ + "mob/turtle/egg/egg_crack1", + "mob/turtle/egg/egg_crack2", + "mob/turtle/egg/egg_crack3", + "mob/turtle/egg/egg_crack4", + "mob/turtle/egg/egg_crack5" + ], + "subtitle": "subtitles.entity.turtle.egg_crack" + }, + "entity.turtle.egg_hatch": { + "sounds": [ + "mob/turtle/baby/egg_hatched1", + "mob/turtle/baby/egg_hatched2", + "mob/turtle/baby/egg_hatched3" + ], + "subtitle": "subtitles.entity.turtle.egg_hatch" + }, + "entity.turtle.hurt": { + "sounds": [ + "mob/turtle/hurt1", + "mob/turtle/hurt2", + "mob/turtle/hurt3", + "mob/turtle/hurt4", + "mob/turtle/hurt5" + ], + "subtitle": "subtitles.entity.turtle.hurt" + }, + "entity.turtle.hurt_baby": { + "sounds": [ + "mob/turtle/baby/hurt1", + "mob/turtle/baby/hurt2" + ], + "subtitle": "subtitles.entity.turtle.hurt_baby" + }, + "entity.turtle.lay_egg": { + "sounds": [ + "mob/turtle/egg/drop_egg1", + "mob/turtle/egg/drop_egg2" + ], + "subtitle": "subtitles.entity.turtle.lay_egg" + }, + "entity.turtle.shamble": { + "sounds": [ + "mob/turtle/walk1", + "mob/turtle/walk2", + "mob/turtle/walk3", + "mob/turtle/walk4", + "mob/turtle/walk5" + ], + "subtitle": "subtitles.entity.turtle.shamble" + }, + "entity.turtle.shamble_baby": { + "sounds": [ + "mob/turtle/baby/shamble1", + "mob/turtle/baby/shamble2", + "mob/turtle/baby/shamble3", + "mob/turtle/baby/shamble4" + ], + "subtitle": "subtitles.entity.turtle.shamble_baby" + }, + "entity.turtle.swim": { + "sounds": [ + { + "name": "mob/turtle/swim/swim1", + "volume": 0.6 + }, + { + "name": "mob/turtle/swim/swim2", + "volume": 0.3 + }, + { + "name": "mob/turtle/swim/swim3", + "volume": 0.2 + }, + { + "name": "mob/turtle/swim/swim4", + "volume": 0.6 + }, + { + "name": "mob/turtle/swim/swim5", + "volume": 0.3 + } + ], + "subtitle": "subtitles.entity.turtle.swim" + }, + "entity.vex.ambient": { + "sounds": [ + "mob/vex/idle1", + "mob/vex/idle2", + "mob/vex/idle3", + "mob/vex/idle4" + ], + "subtitle": "subtitles.entity.vex.ambient" + }, + "entity.vex.charge": { + "sounds": [ + "mob/vex/charge1", + "mob/vex/charge2", + "mob/vex/charge3" + ], + "subtitle": "subtitles.entity.vex.charge" + }, + "entity.vex.death": { + "sounds": [ + "mob/vex/death1", + "mob/vex/death2" + ], + "subtitle": "subtitles.entity.vex.death" + }, + "entity.vex.hurt": { + "sounds": [ + "mob/vex/hurt1", + "mob/vex/hurt2" + ], + "subtitle": "subtitles.entity.vex.hurt" + }, + "entity.villager.ambient": { + "sounds": [ + "mob/villager/idle1", + "mob/villager/idle2", + "mob/villager/idle3" + ], + "subtitle": "subtitles.entity.villager.ambient" + }, + "entity.villager.celebrate": { + "sounds": [ + "mob/villager/yes1", + "mob/villager/yes2", + "mob/villager/yes3" + ], + "subtitle": "subtitles.entity.villager.celebrate" + }, + "entity.villager.death": { + "sounds": [ + "mob/villager/death" + ], + "subtitle": "subtitles.entity.villager.death" + }, + "entity.villager.hurt": { + "sounds": [ + "mob/villager/hit1", + "mob/villager/hit2", + "mob/villager/hit3", + "mob/villager/hit4" + ], + "subtitle": "subtitles.entity.villager.hurt" + }, + "entity.villager.no": { + "sounds": [ + "mob/villager/no1", + "mob/villager/no2", + "mob/villager/no3" + ], + "subtitle": "subtitles.entity.villager.no" + }, + "entity.villager.trade": { + "sounds": [ + "mob/villager/haggle1", + "mob/villager/haggle2", + "mob/villager/haggle3" + ], + "subtitle": "subtitles.entity.villager.trade" + }, + "entity.villager.work_armorer": { + "sounds": [ + "block/blastfurnace/blastfurnace1", + "block/blastfurnace/blastfurnace2", + "block/blastfurnace/blastfurnace3", + "block/blastfurnace/blastfurnace4", + "block/blastfurnace/blastfurnace5" + ], + "subtitle": "subtitles.entity.villager.work_armorer" + }, + "entity.villager.work_butcher": { + "sounds": [ + "block/smoker/smoker1", + "block/smoker/smoker2", + "block/smoker/smoker3", + "block/smoker/smoker4", + "block/smoker/smoker5" + ], + "subtitle": "subtitles.entity.villager.work_butcher" + }, + "entity.villager.work_cartographer": { + "sounds": [ + "ui/cartography_table/drawmap1", + "ui/cartography_table/drawmap2", + "ui/cartography_table/drawmap3" + ], + "subtitle": "subtitles.entity.villager.work_cartographer" + }, + "entity.villager.work_cleric": { + "sounds": [ + "block/brewing_stand/brew1", + "block/brewing_stand/brew2" + ], + "subtitle": "subtitles.entity.villager.work_cleric" + }, + "entity.villager.work_farmer": { + "sounds": [ + "block/composter/fill_success1", + "block/composter/fill_success2", + "block/composter/fill_success3", + "block/composter/fill_success4" + ], + "subtitle": "subtitles.entity.villager.work_farmer" + }, + "entity.villager.work_fisherman": { + "sounds": [ + "block/barrel/open1", + "block/barrel/open2" + ], + "subtitle": "subtitles.entity.villager.work_fisherman" + }, + "entity.villager.work_fletcher": { + "sounds": [ + "block/fletching_table/fletching_table1", + "block/fletching_table/fletching_table2" + ], + "subtitle": "subtitles.entity.villager.work_fletcher" + }, + "entity.villager.work_leatherworker": { + "sounds": [ + { + "name": "block/cauldron/dye1", + "volume": 0.9 + }, + { + "name": "block/cauldron/dye2", + "volume": 0.9 + }, + { + "name": "block/cauldron/dye3", + "volume": 0.9 + } + ], + "subtitle": "subtitles.entity.villager.work_leatherworker" + }, + "entity.villager.work_librarian": { + "sounds": [ + { + "name": "item/book/open_flip1", + "volume": 2.0 + }, + { + "name": "item/book/open_flip2", + "volume": 2.0 + }, + { + "name": "item/book/open_flip3", + "volume": 2.0 + } + ], + "subtitle": "subtitles.entity.villager.work_librarian" + }, + "entity.villager.work_mason": { + "sounds": [ + "ui/stonecutter/cut1", + { + "name": "ui/stonecutter/cut1", + "pitch": 0.92 + }, + "ui/stonecutter/cut2", + { + "name": "ui/stonecutter/cut2", + "pitch": 0.92 + } + ], + "subtitle": "subtitles.entity.villager.work_mason" + }, + "entity.villager.work_shepherd": { + "sounds": [ + { + "name": "ui/loom/take_result1", + "volume": 0.5 + }, + { + "name": "ui/loom/take_result2", + "volume": 0.5 + } + ], + "subtitle": "subtitles.entity.villager.work_shepherd" + }, + "entity.villager.work_toolsmith": { + "sounds": [ + "block/smithing_table/smithing_table1", + "block/smithing_table/smithing_table2", + "block/smithing_table/smithing_table3" + ], + "subtitle": "subtitles.entity.villager.work_toolsmith" + }, + "entity.villager.work_weaponsmith": { + "sounds": [ + { + "name": "block/grindstone/grindstone1", + "volume": 0.5 + }, + { + "name": "block/grindstone/grindstone2", + "volume": 0.5 + }, + { + "name": "block/grindstone/grindstone3", + "volume": 0.5 + } + ], + "subtitle": "subtitles.entity.villager.work_weaponsmith" + }, + "entity.villager.yes": { + "sounds": [ + "mob/villager/yes1", + "mob/villager/yes2", + "mob/villager/yes3" + ], + "subtitle": "subtitles.entity.villager.yes" + }, + "entity.vindicator.ambient": { + "sounds": [ + "mob/vindication_illager/idle1", + "mob/vindication_illager/idle2", + "mob/vindication_illager/idle3", + "mob/vindication_illager/idle4", + "mob/vindication_illager/idle5" + ], + "subtitle": "subtitles.entity.vindicator.ambient" + }, + "entity.vindicator.celebrate": { + "sounds": [ + "mob/vindication_illager/celebrate1", + "mob/vindication_illager/celebrate2" + ], + "subtitle": "subtitles.entity.vindicator.celebrate" + }, + "entity.vindicator.death": { + "sounds": [ + "mob/vindication_illager/death1", + "mob/vindication_illager/death2" + ], + "subtitle": "subtitles.entity.vindicator.death" + }, + "entity.vindicator.hurt": { + "sounds": [ + "mob/vindication_illager/hurt1", + "mob/vindication_illager/hurt2", + "mob/vindication_illager/hurt3" + ], + "subtitle": "subtitles.entity.vindicator.hurt" + }, + "entity.wandering_trader.ambient": { + "sounds": [ + "mob/wandering_trader/idle1", + "mob/wandering_trader/idle2", + "mob/wandering_trader/idle3", + "mob/wandering_trader/idle4", + "mob/wandering_trader/idle5" + ], + "subtitle": "subtitles.entity.wandering_trader.ambient" + }, + "entity.wandering_trader.death": { + "sounds": [ + "mob/wandering_trader/death" + ], + "subtitle": "subtitles.entity.wandering_trader.death" + }, + "entity.wandering_trader.disappeared": { + "sounds": [ + { + "name": "mob/wandering_trader/disappeared1", + "volume": 0.8 + }, + { + "name": "mob/wandering_trader/disappeared2", + "volume": 0.8 + } + ], + "subtitle": "subtitles.entity.wandering_trader.disappeared" + }, + "entity.wandering_trader.drink_milk": { + "sounds": [ + "mob/wandering_trader/drink_milk1", + "mob/wandering_trader/drink_milk2", + "mob/wandering_trader/drink_milk3", + "mob/wandering_trader/drink_milk4", + "mob/wandering_trader/drink_milk5" + ], + "subtitle": "subtitles.entity.wandering_trader.drink_milk" + }, + "entity.wandering_trader.drink_potion": { + "sounds": [ + { + "name": "mob/wandering_trader/drink_potion", + "volume": 0.7 + }, + { + "name": "random/drink", + "volume": 0.65 + } + ], + "subtitle": "subtitles.entity.wandering_trader.drink_potion" + }, + "entity.wandering_trader.hurt": { + "sounds": [ + "mob/wandering_trader/hurt1", + "mob/wandering_trader/hurt2", + "mob/wandering_trader/hurt3", + "mob/wandering_trader/hurt4" + ], + "subtitle": "subtitles.entity.wandering_trader.hurt" + }, + "entity.wandering_trader.no": { + "sounds": [ + "mob/wandering_trader/no1", + "mob/wandering_trader/no2", + "mob/wandering_trader/no3", + "mob/wandering_trader/no4", + "mob/wandering_trader/no5" + ], + "subtitle": "subtitles.entity.wandering_trader.no" + }, + "entity.wandering_trader.reappeared": { + "sounds": [ + { + "name": "mob/wandering_trader/reappeared1", + "volume": 0.8 + }, + { + "name": "mob/wandering_trader/reappeared2", + "volume": 0.8 + } + ], + "subtitle": "subtitles.entity.wandering_trader.reappeared" + }, + "entity.wandering_trader.trade": { + "sounds": [ + "mob/wandering_trader/haggle1", + "mob/wandering_trader/haggle2", + "mob/wandering_trader/haggle3" + ], + "subtitle": "subtitles.entity.wandering_trader.trade" + }, + "entity.wandering_trader.yes": { + "sounds": [ + "mob/wandering_trader/yes1", + "mob/wandering_trader/yes2", + "mob/wandering_trader/yes3", + "mob/wandering_trader/yes4" + ], + "subtitle": "subtitles.entity.wandering_trader.yes" + }, + "entity.warden.agitated": { + "sounds": [ + "mob/warden/agitated_1", + "mob/warden/agitated_2", + "mob/warden/agitated_3", + "mob/warden/agitated_4", + "mob/warden/agitated_5", + "mob/warden/agitated_6" + ], + "subtitle": "subtitles.entity.warden.agitated" + }, + "entity.warden.ambient": { + "sounds": [ + "mob/warden/ambient_1", + "mob/warden/ambient_2", + "mob/warden/ambient_3", + "mob/warden/ambient_4", + "mob/warden/ambient_5", + "mob/warden/ambient_6", + "mob/warden/ambient_7", + "mob/warden/ambient_8", + "mob/warden/ambient_9", + "mob/warden/ambient_10", + "mob/warden/ambient_11", + "mob/warden/ambient_12" + ], + "subtitle": "subtitles.entity.warden.ambient" + }, + "entity.warden.angry": { + "sounds": [ + "mob/warden/angry_1", + "mob/warden/angry_2", + "mob/warden/angry_3", + "mob/warden/angry_4", + "mob/warden/angry_5", + "mob/warden/angry_6" + ], + "subtitle": "subtitles.entity.warden.angry" + }, + "entity.warden.attack_impact": { + "sounds": [ + "mob/warden/attack_impact_1", + "mob/warden/attack_impact_2" + ], + "subtitle": "subtitles.entity.warden.attack_impact" + }, + "entity.warden.death": { + "sounds": [ + "mob/warden/death_1", + "mob/warden/death_2" + ], + "subtitle": "subtitles.entity.warden.death" + }, + "entity.warden.dig": { + "sounds": [ + "mob/warden/dig" + ], + "subtitle": "subtitles.entity.warden.dig" + }, + "entity.warden.emerge": { + "sounds": [ + "mob/warden/emerge" + ], + "subtitle": "subtitles.entity.warden.emerge" + }, + "entity.warden.heartbeat": { + "sounds": [ + "mob/warden/heartbeat_1", + "mob/warden/heartbeat_2", + "mob/warden/heartbeat_3", + "mob/warden/heartbeat_4" + ], + "subtitle": "subtitles.entity.warden.heartbeat" + }, + "entity.warden.hurt": { + "sounds": [ + "mob/warden/hurt_1", + "mob/warden/hurt_2", + "mob/warden/hurt_3", + "mob/warden/hurt_4" + ], + "subtitle": "subtitles.entity.warden.hurt" + }, + "entity.warden.listening": { + "sounds": [ + "mob/warden/listening_1", + "mob/warden/listening_2", + "mob/warden/listening_3", + "mob/warden/listening_4", + "mob/warden/listening_5" + ], + "subtitle": "subtitles.entity.warden.listening" + }, + "entity.warden.listening_angry": { + "sounds": [ + "mob/warden/listening_angry_1", + "mob/warden/listening_angry_2", + "mob/warden/listening_angry_3", + "mob/warden/listening_angry_4", + "mob/warden/listening_angry_5" + ], + "subtitle": "subtitles.entity.warden.listening_angry" + }, + "entity.warden.nearby_close": { + "sounds": [ + "mob/warden/nearby_close_1", + "mob/warden/nearby_close_2", + "mob/warden/nearby_close_3", + "mob/warden/nearby_close_4" + ], + "subtitle": "subtitles.entity.warden.nearby_close" + }, + "entity.warden.nearby_closer": { + "sounds": [ + "mob/warden/nearby_closer_1", + "mob/warden/nearby_closer_2", + "mob/warden/nearby_closer_3" + ], + "subtitle": "subtitles.entity.warden.nearby_closer" + }, + "entity.warden.nearby_closest": { + "sounds": [ + "mob/warden/nearby_closest_1", + "mob/warden/nearby_closest_2", + "mob/warden/nearby_closest_3" + ], + "subtitle": "subtitles.entity.warden.nearby_closest" + }, + "entity.warden.roar": { + "sounds": [ + "mob/warden/roar_1", + "mob/warden/roar_2", + "mob/warden/roar_3", + "mob/warden/roar_4", + "mob/warden/roar_5" + ], + "subtitle": "subtitles.entity.warden.roar" + }, + "entity.warden.sniff": { + "sounds": [ + { + "name": "mob/warden/sniff_1", + "volume": 0.75 + }, + { + "name": "mob/warden/sniff_2", + "volume": 0.75 + }, + { + "name": "mob/warden/sniff_3", + "volume": 0.75 + }, + { + "name": "mob/warden/sniff_4", + "volume": 0.75 + } + ], + "subtitle": "subtitles.entity.warden.sniff" + }, + "entity.warden.sonic_boom": { + "sounds": [ + "mob/warden/sonic_boom1", + "mob/warden/sonic_boom2", + "mob/warden/sonic_boom3", + "mob/warden/sonic_boom4" + ], + "subtitle": "subtitles.entity.warden.sonic_boom" + }, + "entity.warden.sonic_charge": { + "sounds": [ + "mob/warden/sonic_charge1", + "mob/warden/sonic_charge2", + "mob/warden/sonic_charge3", + "mob/warden/sonic_charge4" + ], + "subtitle": "subtitles.entity.warden.sonic_charge" + }, + "entity.warden.step": { + "sounds": [ + { + "name": "mob/warden/step_1", + "volume": 0.3 + }, + { + "name": "mob/warden/step_2", + "volume": 0.3 + }, + { + "name": "mob/warden/step_3", + "volume": 0.3 + }, + { + "name": "mob/warden/step_4", + "volume": 0.3 + } + ], + "subtitle": "subtitles.block.generic.footsteps" + }, + "entity.warden.tendril_clicks": { + "sounds": [ + "mob/warden/tendril_clicks_1", + "mob/warden/tendril_clicks_2", + "mob/warden/tendril_clicks_3", + "mob/warden/tendril_clicks_4", + "mob/warden/tendril_clicks_5", + "mob/warden/tendril_clicks_6" + ], + "subtitle": "subtitles.entity.warden.tendril_clicks" + }, + "entity.wind_charge.throw": { + "sounds": [ + "random/bow" + ], + "subtitle": "subtitles.entity.wind_charge.throw" + }, + "entity.wind_charge.wind_burst": { + "sounds": [ + { + "attenuation_distance": 8, + "name": "entity/wind_charge/wind_burst1", + "pitch": 1.25 + }, + { + "attenuation_distance": 8, + "name": "entity/wind_charge/wind_burst2", + "pitch": 1.25 + }, + { + "attenuation_distance": 8, + "name": "entity/wind_charge/wind_burst3", + "pitch": 1.25 + } + ], + "subtitle": "subtitles.entity.wind_charge.wind_burst" + }, + "entity.witch.ambient": { + "sounds": [ + "entity/witch/ambient1", + "entity/witch/ambient2", + "entity/witch/ambient3", + "entity/witch/ambient4", + "entity/witch/ambient5", + { + "name": "entity/witch/ambient5", + "pitch": 0.9 + } + ], + "subtitle": "subtitles.entity.witch.ambient" + }, + "entity.witch.celebrate": { + "sounds": [ + "entity/witch/ambient1", + "entity/witch/ambient4", + "entity/witch/celebrate" + ], + "subtitle": "subtitles.entity.witch.celebrate" + }, + "entity.witch.death": { + "sounds": [ + "entity/witch/death1", + "entity/witch/death2", + "entity/witch/death3" + ], + "subtitle": "subtitles.entity.witch.death" + }, + "entity.witch.drink": { + "sounds": [ + "entity/witch/drink1", + "entity/witch/drink2", + "entity/witch/drink3", + "entity/witch/drink4" + ], + "subtitle": "subtitles.entity.witch.drink" + }, + "entity.witch.hurt": { + "sounds": [ + "entity/witch/hurt1", + "entity/witch/hurt2", + "entity/witch/hurt3" + ], + "subtitle": "subtitles.entity.witch.hurt" + }, + "entity.witch.throw": { + "sounds": [ + "entity/witch/throw1", + "entity/witch/throw2", + "entity/witch/throw3" + ], + "subtitle": "subtitles.entity.witch.throw" + }, + "entity.wither.ambient": { + "sounds": [ + "mob/wither/idle1", + "mob/wither/idle2", + "mob/wither/idle3", + "mob/wither/idle4" + ], + "subtitle": "subtitles.entity.wither.ambient" + }, + "entity.wither.break_block": { + "sounds": [ + "mob/zombie/woodbreak" + ], + "subtitle": "subtitles.entity.wither.shoot" + }, + "entity.wither.death": { + "sounds": [ + "mob/wither/death" + ], + "subtitle": "subtitles.entity.wither.death" + }, + "entity.wither.hurt": { + "sounds": [ + "mob/wither/hurt1", + "mob/wither/hurt2", + "mob/wither/hurt3", + "mob/wither/hurt4" + ], + "subtitle": "subtitles.entity.wither.hurt" + }, + "entity.wither.shoot": { + "sounds": [ + "mob/wither/shoot" + ], + "subtitle": "subtitles.entity.wither.shoot" + }, + "entity.wither.spawn": { + "sounds": [ + "mob/wither/spawn" + ], + "subtitle": "subtitles.entity.wither.spawn" + }, + "entity.wither_skeleton.ambient": { + "sounds": [ + "mob/wither_skeleton/idle1", + "mob/wither_skeleton/idle2", + "mob/wither_skeleton/idle3" + ], + "subtitle": "subtitles.entity.wither_skeleton.ambient" + }, + "entity.wither_skeleton.death": { + "sounds": [ + "mob/wither_skeleton/death1", + "mob/wither_skeleton/death2" + ], + "subtitle": "subtitles.entity.wither_skeleton.death" + }, + "entity.wither_skeleton.hurt": { + "sounds": [ + "mob/wither_skeleton/hurt1", + "mob/wither_skeleton/hurt2", + "mob/wither_skeleton/hurt3", + "mob/wither_skeleton/hurt4" + ], + "subtitle": "subtitles.entity.wither_skeleton.hurt" + }, + "entity.wither_skeleton.step": { + "sounds": [ + "mob/wither_skeleton/step1", + "mob/wither_skeleton/step2", + "mob/wither_skeleton/step3", + "mob/wither_skeleton/step4" + ], + "subtitle": "subtitles.block.generic.footsteps" + }, + "entity.wolf.ambient": { + "sounds": [ + "mob/wolf/bark1", + "mob/wolf/bark2", + "mob/wolf/bark3" + ], + "subtitle": "subtitles.entity.wolf.ambient" + }, + "entity.wolf.death": { + "sounds": [ + "mob/wolf/death" + ], + "subtitle": "subtitles.entity.wolf.death" + }, + "entity.wolf.growl": { + "sounds": [ + "mob/wolf/growl1", + "mob/wolf/growl2", + "mob/wolf/growl3" + ], + "subtitle": "subtitles.entity.wolf.growl" + }, + "entity.wolf.howl": { + "sounds": [ + "mob/wolf/howl1", + "mob/wolf/howl2" + ] + }, + "entity.wolf.hurt": { + "sounds": [ + "mob/wolf/hurt1", + "mob/wolf/hurt2", + "mob/wolf/hurt3" + ], + "subtitle": "subtitles.entity.wolf.hurt" + }, + "entity.wolf.pant": { + "sounds": [ + "mob/wolf/panting" + ], + "subtitle": "subtitles.entity.wolf.ambient" + }, + "entity.wolf.shake": { + "sounds": [ + "mob/wolf/shake" + ], + "subtitle": "subtitles.entity.wolf.shake" + }, + "entity.wolf.step": { + "sounds": [ + "mob/wolf/step1", + "mob/wolf/step2", + "mob/wolf/step3", + "mob/wolf/step4", + "mob/wolf/step5" + ], + "subtitle": "subtitles.block.generic.footsteps" + }, + "entity.wolf.whine": { + "sounds": [ + "mob/wolf/whine" + ], + "subtitle": "subtitles.entity.wolf.ambient" + }, + "entity.zoglin.ambient": { + "sounds": [ + { + "name": "mob/zoglin/idle1", + "volume": 0.9 + }, + { + "name": "mob/zoglin/idle1", + "pitch": 0.8, + "volume": 0.9 + }, + { + "name": "mob/zoglin/idle2", + "volume": 0.9 + }, + { + "name": "mob/zoglin/idle3", + "volume": 0.9 + }, + { + "name": "mob/zoglin/idle4", + "volume": 0.9 + }, + { + "name": "mob/zoglin/idle5", + "volume": 0.9 + }, + { + "name": "mob/zoglin/idle6", + "volume": 0.9 + } + ], + "subtitle": "subtitles.entity.zoglin.ambient" + }, + "entity.zoglin.angry": { + "sounds": [ + { + "name": "mob/zoglin/angry1", + "volume": 0.8 + }, + { + "name": "mob/zoglin/angry2", + "volume": 0.8 + }, + { + "name": "mob/zoglin/angry3", + "volume": 0.8 + } + ], + "subtitle": "subtitles.entity.zoglin.angry" + }, + "entity.zoglin.attack": { + "sounds": [ + { + "name": "mob/zoglin/attack1", + "volume": 0.8 + }, + { + "name": "mob/zoglin/attack1", + "pitch": 0.8, + "volume": 0.8 + }, + { + "name": "mob/zoglin/attack2", + "volume": 0.8 + }, + { + "name": "mob/zoglin/attack2", + "pitch": 0.8, + "volume": 0.8 + } + ], + "subtitle": "subtitles.entity.zoglin.attack" + }, + "entity.zoglin.death": { + "sounds": [ + { + "name": "mob/zoglin/death1", + "volume": 0.93 + }, + { + "name": "mob/zoglin/death2", + "volume": 0.93 + }, + { + "name": "mob/zoglin/death3", + "volume": 0.93 + } + ], + "subtitle": "subtitles.entity.zoglin.death" + }, + "entity.zoglin.hurt": { + "sounds": [ + { + "name": "mob/zoglin/hurt1", + "volume": 0.83 + }, + { + "name": "mob/zoglin/hurt2", + "volume": 0.9 + }, + { + "name": "mob/zoglin/hurt3", + "volume": 0.9 + } + ], + "subtitle": "subtitles.entity.zoglin.hurt" + }, + "entity.zoglin.step": { + "sounds": [ + "mob/zoglin/step1", + "mob/zoglin/step2", + "mob/zoglin/step3", + "mob/zoglin/step4", + "mob/zoglin/step5" + ], + "subtitle": "subtitles.block.generic.footsteps" + }, + "entity.zombie.ambient": { + "sounds": [ + "mob/zombie/say1", + "mob/zombie/say2", + "mob/zombie/say3" + ], + "subtitle": "subtitles.entity.zombie.ambient" + }, + "entity.zombie.attack_iron_door": { + "sounds": [ + "mob/zombie/metal1", + "mob/zombie/metal2", + "mob/zombie/metal3" + ], + "subtitle": "subtitles.block.generic.break" + }, + "entity.zombie.attack_wooden_door": { + "sounds": [ + "mob/zombie/wood1", + "mob/zombie/wood2", + "mob/zombie/wood3", + "mob/zombie/wood4" + ], + "subtitle": "subtitles.entity.zombie.attack_wooden_door" + }, + "entity.zombie.break_wooden_door": { + "sounds": [ + "mob/zombie/woodbreak" + ], + "subtitle": "subtitles.entity.zombie.break_wooden_door" + }, + "entity.zombie.converted_to_drowned": { + "sounds": [ + "mob/drowned/convert1", + "mob/drowned/convert2", + "mob/drowned/convert3" + ], + "subtitle": "subtitles.entity.zombie.converted_to_drowned" + }, + "entity.zombie.death": { + "sounds": [ + "mob/zombie/death" + ], + "subtitle": "subtitles.entity.zombie.death" + }, + "entity.zombie.destroy_egg": { + "sounds": [ + "mob/turtle/egg/jump_egg1", + "mob/turtle/egg/jump_egg2", + "mob/turtle/egg/jump_egg3", + "mob/turtle/egg/jump_egg4" + ], + "subtitle": "subtitles.entity.zombie.destroy_egg" + }, + "entity.zombie.hurt": { + "sounds": [ + "mob/zombie/hurt1", + "mob/zombie/hurt2" + ], + "subtitle": "subtitles.entity.zombie.hurt" + }, + "entity.zombie.infect": { + "sounds": [ + "mob/zombie/infect" + ], + "subtitle": "subtitles.entity.zombie.infect" + }, + "entity.zombie.step": { + "sounds": [ + "mob/zombie/step1", + "mob/zombie/step2", + "mob/zombie/step3", + "mob/zombie/step4", + "mob/zombie/step5" + ], + "subtitle": "subtitles.block.generic.footsteps" + }, + "entity.zombie_horse.ambient": { + "sounds": [ + "mob/horse/zombie/idle1", + "mob/horse/zombie/idle2", + "mob/horse/zombie/idle3" + ], + "subtitle": "subtitles.entity.zombie_horse.ambient" + }, + "entity.zombie_horse.death": { + "sounds": [ + "mob/horse/zombie/death" + ], + "subtitle": "subtitles.entity.zombie_horse.death" + }, + "entity.zombie_horse.hurt": { + "sounds": [ + "mob/horse/zombie/hit1", + "mob/horse/zombie/hit2", + "mob/horse/zombie/hit3", + "mob/horse/zombie/hit4" + ], + "subtitle": "subtitles.entity.zombie_horse.hurt" + }, + "entity.zombie_villager.ambient": { + "sounds": [ + "mob/zombie_villager/say1", + "mob/zombie_villager/say2", + "mob/zombie_villager/say3" + ], + "subtitle": "subtitles.entity.zombie_villager.ambient" + }, + "entity.zombie_villager.converted": { + "sounds": [ + "mob/zombie/unfect" + ], + "subtitle": "subtitles.entity.zombie_villager.converted" + }, + "entity.zombie_villager.cure": { + "sounds": [ + "mob/zombie/remedy" + ], + "subtitle": "subtitles.entity.zombie_villager.cure" + }, + "entity.zombie_villager.death": { + "sounds": [ + "mob/zombie_villager/death" + ], + "subtitle": "subtitles.entity.zombie_villager.death" + }, + "entity.zombie_villager.hurt": { + "sounds": [ + "mob/zombie_villager/hurt1", + "mob/zombie_villager/hurt2" + ], + "subtitle": "subtitles.entity.zombie_villager.hurt" + }, + "entity.zombie_villager.step": { + "sounds": [ + "mob/zombie/step1", + "mob/zombie/step2", + "mob/zombie/step3", + "mob/zombie/step4", + "mob/zombie/step5" + ], + "subtitle": "subtitles.block.generic.footsteps" + }, + "entity.zombified_piglin.ambient": { + "sounds": [ + "mob/zombified_piglin/zpig1", + "mob/zombified_piglin/zpig2", + "mob/zombified_piglin/zpig3", + "mob/zombified_piglin/zpig4" + ], + "subtitle": "subtitles.entity.zombified_piglin.ambient" + }, + "entity.zombified_piglin.angry": { + "sounds": [ + "mob/zombified_piglin/zpigangry1", + "mob/zombified_piglin/zpigangry2", + "mob/zombified_piglin/zpigangry3", + "mob/zombified_piglin/zpigangry4" + ], + "subtitle": "subtitles.entity.zombified_piglin.angry" + }, + "entity.zombified_piglin.death": { + "sounds": [ + "mob/zombified_piglin/zpigdeath" + ], + "subtitle": "subtitles.entity.zombified_piglin.death" + }, + "entity.zombified_piglin.hurt": { + "sounds": [ + "mob/zombified_piglin/zpighurt1", + "mob/zombified_piglin/zpighurt2" + ], + "subtitle": "subtitles.entity.zombified_piglin.hurt" + }, + "event.mob_effect.bad_omen": { + "sounds": [ + "event/mob_effects/bad_omen" + ], + "subtitle": "subtitles.event.mob_effect.bad_omen" + }, + "event.mob_effect.raid_omen": { + "sounds": [ + "event/mob_effects/raid_omen" + ], + "subtitle": "subtitles.event.mob_effect.raid_omen" + }, + "event.mob_effect.trial_omen": { + "sounds": [ + "event/mob_effects/trial_omen" + ], + "subtitle": "subtitles.event.mob_effect.trial_omen" + }, + "event.raid.horn": { + "sounds": [ + { + "name": "event/raid/raidhorn_01", + "volume": 0.01 + }, + { + "name": "event/raid/raidhorn_02", + "volume": 0.01 + }, + { + "name": "event/raid/raidhorn_03", + "volume": 0.01 + }, + { + "name": "event/raid/raidhorn_04", + "volume": 0.01 + } + ], + "subtitle": "subtitles.event.raid.horn" + }, + "item.armor.equip_chain": { + "sounds": [ + "item/armor/equip_chain1", + "item/armor/equip_chain2", + "item/armor/equip_chain3", + "item/armor/equip_chain4", + "item/armor/equip_chain5", + "item/armor/equip_chain6" + ], + "subtitle": "subtitles.item.armor.equip_chain" + }, + "item.armor.equip_diamond": { + "sounds": [ + "item/armor/equip_diamond1", + "item/armor/equip_diamond2", + "item/armor/equip_diamond3", + "item/armor/equip_diamond4", + "item/armor/equip_diamond5", + "item/armor/equip_diamond6" + ], + "subtitle": "subtitles.item.armor.equip_diamond" + }, + "item.armor.equip_elytra": { + "sounds": [ + "item/armor/equip_leather1", + "item/armor/equip_leather2", + "item/armor/equip_leather3", + "item/armor/equip_leather4", + "item/armor/equip_leather5", + "item/armor/equip_leather6" + ], + "subtitle": "subtitles.item.armor.equip_elytra" + }, + "item.armor.equip_generic": { + "sounds": [ + "item/armor/equip_generic1", + "item/armor/equip_generic2", + "item/armor/equip_generic3", + "item/armor/equip_generic4", + "item/armor/equip_generic5", + "item/armor/equip_generic6" + ], + "subtitle": "subtitles.item.armor.equip" + }, + "item.armor.equip_gold": { + "sounds": [ + "item/armor/equip_gold1", + "item/armor/equip_gold2", + "item/armor/equip_gold3", + "item/armor/equip_gold4", + "item/armor/equip_gold5", + "item/armor/equip_gold6" + ], + "subtitle": "subtitles.item.armor.equip_gold" + }, + "item.armor.equip_iron": { + "sounds": [ + "item/armor/equip_iron1", + "item/armor/equip_iron2", + "item/armor/equip_iron3", + "item/armor/equip_iron4", + "item/armor/equip_iron5", + "item/armor/equip_iron6" + ], + "subtitle": "subtitles.item.armor.equip_iron" + }, + "item.armor.equip_leather": { + "sounds": [ + "item/armor/equip_leather1", + "item/armor/equip_leather2", + "item/armor/equip_leather3", + "item/armor/equip_leather4", + "item/armor/equip_leather5", + "item/armor/equip_leather6" + ], + "subtitle": "subtitles.item.armor.equip_leather" + }, + "item.armor.equip_netherite": { + "sounds": [ + { + "name": "item/armor/equip_netherite1", + "volume": 0.8 + }, + { + "name": "item/armor/equip_netherite1", + "pitch": 0.9, + "volume": 0.8 + }, + { + "name": "item/armor/equip_netherite2", + "volume": 0.8 + }, + { + "name": "item/armor/equip_netherite2", + "pitch": 0.9, + "volume": 0.8 + }, + { + "name": "item/armor/equip_netherite3", + "volume": 0.8 + }, + { + "name": "item/armor/equip_netherite3", + "pitch": 0.9, + "volume": 0.8 + }, + { + "name": "item/armor/equip_netherite4", + "volume": 0.8 + }, + { + "name": "item/armor/equip_netherite4", + "pitch": 0.9, + "volume": 0.8 + } + ], + "subtitle": "subtitles.item.armor.equip_netherite" + }, + "item.armor.equip_turtle": { + "sounds": [ + "mob/turtle/armor", + { + "name": "mob/turtle/armor", + "pitch": 0.85 + }, + { + "name": "mob/turtle/armor", + "pitch": 1.1 + } + ], + "subtitle": "subtitles.item.armor.equip_turtle" + }, + "item.armor.equip_wolf": { + "sounds": [ + "item/armor/equip_wolf1", + { + "name": "item/armor/equip_wolf1", + "pitch": 1.1 + }, + "item/armor/equip_wolf2", + { + "name": "item/armor/equip_wolf2", + "pitch": 1.1 + } + ], + "subtitle": "subtitles.item.armor.equip_wolf" + }, + "item.armor.unequip_wolf": { + "sounds": [ + "item/armor/unequip_wolf1", + "item/armor/unequip_wolf2" + ], + "subtitle": "subtitles.item.armor.unequip_wolf" + }, + "item.axe.scrape": { + "sounds": [ + "item/axe/scrape1", + { + "name": "item/axe/scrape1", + "pitch": 0.9 + }, + { + "name": "item/axe/scrape1", + "pitch": 1.1 + }, + "item/axe/scrape2", + { + "name": "item/axe/scrape2", + "pitch": 0.9 + }, + { + "name": "item/axe/scrape2", + "pitch": 1.1 + }, + "item/axe/scrape3", + { + "name": "item/axe/scrape3", + "pitch": 0.9 + }, + { + "name": "item/axe/scrape3", + "pitch": 1.1 + } + ], + "subtitle": "subtitles.item.axe.scrape" + }, + "item.axe.strip": { + "sounds": [ + { + "name": "item/axe/strip1", + "volume": 0.9 + }, + { + "name": "item/axe/strip1", + "pitch": 0.85, + "volume": 0.9 + }, + { + "name": "item/axe/strip2", + "volume": 0.9 + }, + { + "name": "item/axe/strip2", + "pitch": 0.85, + "volume": 0.9 + }, + { + "name": "item/axe/strip3", + "volume": 0.9 + }, + { + "name": "item/axe/strip3", + "pitch": 0.85, + "volume": 0.9 + }, + { + "name": "item/axe/strip4", + "volume": 0.9 + }, + { + "name": "item/axe/strip4", + "pitch": 0.85, + "volume": 0.9 + } + ], + "subtitle": "subtitles.item.axe.strip" + }, + "item.axe.wax_off": { + "sounds": [ + "item/axe/wax_off1", + { + "name": "item/axe/wax_off1", + "pitch": 0.9 + }, + { + "name": "item/axe/wax_off1", + "pitch": 1.1 + }, + "item/axe/wax_off2", + { + "name": "item/axe/wax_off2", + "pitch": 0.9 + }, + { + "name": "item/axe/wax_off2", + "pitch": 1.1 + }, + "item/axe/wax_off3", + { + "name": "item/axe/wax_off3", + "pitch": 0.9 + }, + { + "name": "item/axe/wax_off3", + "pitch": 1.1 + } + ], + "subtitle": "subtitles.item.axe.wax_off" + }, + "item.bone_meal.use": { + "sounds": [ + "item/bonemeal/bonemeal1", + { + "name": "item/bonemeal/bonemeal1", + "pitch": 0.9 + }, + { + "name": "item/bonemeal/bonemeal1", + "pitch": 1.1 + }, + "item/bonemeal/bonemeal2", + { + "name": "item/bonemeal/bonemeal2", + "pitch": 0.9 + }, + { + "name": "item/bonemeal/bonemeal2", + "pitch": 1.1 + }, + "item/bonemeal/bonemeal3", + { + "name": "item/bonemeal/bonemeal3", + "pitch": 0.9 + }, + { + "name": "item/bonemeal/bonemeal3", + "pitch": 1.1 + }, + "item/bonemeal/bonemeal4", + { + "name": "item/bonemeal/bonemeal4", + "pitch": 0.9 + }, + { + "name": "item/bonemeal/bonemeal4", + "pitch": 1.1 + }, + "item/bonemeal/bonemeal5", + { + "name": "item/bonemeal/bonemeal5", + "pitch": 0.9 + }, + { + "name": "item/bonemeal/bonemeal5", + "pitch": 1.1 + } + ], + "subtitle": "subtitles.item.bone_meal.use" + }, + "item.book.page_turn": { + "sounds": [ + { + "name": "item/book/open_flip1", + "volume": 2.0 + }, + { + "name": "item/book/open_flip2", + "volume": 2.0 + }, + { + "name": "item/book/open_flip3", + "volume": 2.0 + } + ], + "subtitle": "subtitles.item.book.page_turn" + }, + "item.book.put": { + "sounds": [ + "item/book/close_put1", + "item/book/close_put2" + ], + "subtitle": "subtitles.item.book.put" + }, + "item.bottle.empty": { + "sounds": [ + "item/bottle/empty1", + "item/bottle/empty2" + ], + "subtitle": "subtitles.item.bottle.empty" + }, + "item.bottle.fill": { + "sounds": [ + "item/bottle/fill1", + "item/bottle/fill2", + "item/bottle/fill3", + "item/bottle/fill4" + ], + "subtitle": "subtitles.item.bottle.fill" + }, + "item.bottle.fill_dragonbreath": { + "sounds": [ + "item/bottle/fill_dragonbreath1", + "item/bottle/fill_dragonbreath2" + ], + "subtitle": "subtitles.item.bottle.fill" + }, + "item.brush.brushing.generic": { + "sounds": [ + { + "name": "item/brush/brushing_generic1", + "pitch": 0.8, + "volume": 0.4 + }, + { + "name": "item/brush/brushing_generic2", + "pitch": 0.8, + "volume": 0.4 + }, + { + "name": "item/brush/brushing_generic3", + "pitch": 0.8, + "volume": 0.4 + }, + { + "name": "item/brush/brushing_generic4", + "pitch": 0.8, + "volume": 0.4 + } + ], + "subtitle": "subtitles.item.brush.brushing.generic" + }, + "item.brush.brushing.gravel": { + "sounds": [ + { + "name": "item/brush/brushing_gravel1", + "pitch": 0.6, + "volume": 0.6 + }, + { + "name": "item/brush/brushing_gravel2", + "pitch": 0.6, + "volume": 0.6 + }, + { + "name": "item/brush/brushing_gravel3", + "pitch": 0.6, + "volume": 0.6 + }, + { + "name": "item/brush/brushing_gravel4", + "pitch": 0.6, + "volume": 0.6 + } + ], + "subtitle": "subtitles.item.brush.brushing.gravel" + }, + "item.brush.brushing.gravel.complete": { + "sounds": [ + "item/brush/brushing_gravel_complete1", + "item/brush/brushing_gravel_complete2", + "item/brush/brushing_gravel_complete3", + "item/brush/brushing_gravel_complete4" + ], + "subtitle": "subtitles.item.brush.brushing.gravel.complete" + }, + "item.brush.brushing.sand": { + "sounds": [ + { + "name": "item/brush/brushing_sand1", + "pitch": 0.6, + "volume": 0.6 + }, + { + "name": "item/brush/brushing_sand2", + "pitch": 0.6, + "volume": 0.6 + }, + { + "name": "item/brush/brushing_sand3", + "pitch": 0.6, + "volume": 0.6 + }, + { + "name": "item/brush/brushing_sand4", + "pitch": 0.6, + "volume": 0.6 + } + ], + "subtitle": "subtitles.item.brush.brushing.sand" + }, + "item.brush.brushing.sand.complete": { + "sounds": [ + "item/brush/brush_sand_complete1", + "item/brush/brush_sand_complete2", + "item/brush/brush_sand_complete3", + "item/brush/brush_sand_complete4", + "item/brush/brush_sand_complete5" + ], + "subtitle": "subtitles.item.brush.brushing.sand.complete" + }, + "item.bucket.empty": { + "sounds": [ + "item/bucket/empty1", + { + "name": "item/bucket/empty1", + "pitch": 0.9 + }, + "item/bucket/empty2", + "item/bucket/empty3" + ], + "subtitle": "subtitles.item.bucket.empty" + }, + "item.bucket.empty_axolotl": { + "sounds": [ + "item/bucket/empty_fish1", + "item/bucket/empty_fish2", + "item/bucket/empty_fish3" + ], + "subtitle": "subtitles.item.bucket.empty" + }, + "item.bucket.empty_fish": { + "sounds": [ + "item/bucket/empty_fish1", + "item/bucket/empty_fish2", + "item/bucket/empty_fish3" + ], + "subtitle": "subtitles.item.bucket.empty" + }, + "item.bucket.empty_lava": { + "sounds": [ + "item/bucket/empty_lava1", + "item/bucket/empty_lava2", + "item/bucket/empty_lava3" + ], + "subtitle": "subtitles.item.bucket.empty" + }, + "item.bucket.empty_powder_snow": { + "sounds": [ + "item/bucket/empty_powder_snow1", + { + "name": "item/bucket/empty_powder_snow1", + "pitch": 0.95 + }, + { + "name": "item/bucket/empty_powder_snow1", + "pitch": 1.1 + }, + "item/bucket/empty_powder_snow2", + { + "name": "item/bucket/empty_powder_snow2", + "pitch": 0.95 + }, + { + "name": "item/bucket/empty_powder_snow2", + "pitch": 1.1 + } + ], + "subtitle": "subtitles.item.bucket.empty" + }, + "item.bucket.empty_tadpole": { + "sounds": [ + { + "name": "item/bucket/empty_fish1", + "pitch": 1.5, + "volume": 0.5 + }, + { + "name": "item/bucket/empty_fish2", + "pitch": 1.5, + "volume": 0.5 + }, + { + "name": "item/bucket/empty_fish3", + "pitch": 1.5, + "volume": 0.5 + } + ], + "subtitle": "subtitles.item.bucket.empty" + }, + "item.bucket.fill": { + "sounds": [ + "item/bucket/fill1", + "item/bucket/fill2", + "item/bucket/fill3" + ], + "subtitle": "subtitles.item.bucket.fill" + }, + "item.bucket.fill_axolotl": { + "sounds": [ + "item/bucket/fill_axolotl1", + "item/bucket/fill_axolotl2", + "item/bucket/fill_axolotl3" + ], + "subtitle": "subtitles.item.bucket.fill_axolotl" + }, + "item.bucket.fill_fish": { + "sounds": [ + "item/bucket/fill_fish1", + "item/bucket/fill_fish2", + "item/bucket/fill_fish3" + ], + "subtitle": "subtitles.item.bucket.fill_fish" + }, + "item.bucket.fill_lava": { + "sounds": [ + "item/bucket/fill_lava1", + "item/bucket/fill_lava2", + "item/bucket/fill_lava3" + ], + "subtitle": "subtitles.item.bucket.fill" + }, + "item.bucket.fill_powder_snow": { + "sounds": [ + "item/bucket/fill_powder_snow1", + { + "name": "item/bucket/fill_powder_snow1", + "pitch": 0.9 + }, + { + "name": "item/bucket/fill_powder_snow1", + "pitch": 1.1 + }, + "item/bucket/fill_powder_snow2", + { + "name": "item/bucket/fill_powder_snow2", + "pitch": 0.9 + }, + { + "name": "item/bucket/fill_powder_snow2", + "pitch": 1.1 + } + ], + "subtitle": "subtitles.item.bucket.fill" + }, + "item.bucket.fill_tadpole": { + "sounds": [ + { + "name": "item/bucket/fill_fish1", + "pitch": 1.5, + "volume": 0.5 + }, + { + "name": "item/bucket/fill_fish2", + "pitch": 1.5, + "volume": 0.5 + }, + { + "name": "item/bucket/fill_fish3", + "pitch": 1.5, + "volume": 0.5 + } + ], + "subtitle": "subtitles.item.bucket.fill_tadpole" + }, + "item.bundle.drop_contents": { + "sounds": [ + "item/bundle/drop_contents1", + { + "name": "item/bundle/drop_contents1", + "pitch": 0.95 + }, + "item/bundle/drop_contents2", + { + "name": "item/bundle/drop_contents2", + "pitch": 0.95 + }, + "item/bundle/drop_contents3", + { + "name": "item/bundle/drop_contents3", + "pitch": 0.95 + } + ], + "subtitle": "subtitles.item.bundle.drop_contents" + }, + "item.bundle.insert": { + "sounds": [ + "item/bundle/insert1", + { + "name": "item/bundle/insert1", + "pitch": 0.95 + }, + { + "name": "item/bundle/insert1", + "pitch": 1.05 + }, + "item/bundle/insert2", + { + "name": "item/bundle/insert2", + "pitch": 0.95 + }, + { + "name": "item/bundle/insert2", + "pitch": 1.05 + }, + "item/bundle/insert3", + { + "name": "item/bundle/insert3", + "pitch": 0.95 + }, + { + "name": "item/bundle/insert3", + "pitch": 1.05 + } + ], + "subtitle": "subtitles.item.bundle.insert" + }, + "item.bundle.insert_fail": { + "sounds": [ + "item/bundle/insert_fail" + ], + "subtitle": "subtitles.item.bundle.insert_fail" + }, + "item.bundle.remove_one": { + "sounds": [ + "item/bundle/remove_one1", + { + "name": "item/bundle/remove_one1", + "pitch": 1.05 + }, + { + "name": "item/bundle/remove_one1", + "pitch": 1.1 + }, + "item/bundle/remove_one2", + { + "name": "item/bundle/remove_one2", + "pitch": 1.05 + }, + { + "name": "item/bundle/remove_one2", + "pitch": 1.1 + }, + "item/bundle/remove_one3", + { + "name": "item/bundle/remove_one3", + "pitch": 1.05 + }, + { + "name": "item/bundle/remove_one3", + "pitch": 1.1 + } + ], + "subtitle": "subtitles.item.bundle.remove_one" + }, + "item.chorus_fruit.teleport": { + "sounds": [ + "mob/endermen/portal", + "mob/endermen/portal2" + ], + "subtitle": "subtitles.item.chorus_fruit.teleport" + }, + "item.crop.plant": { + "sounds": [ + { + "name": "item/plant/crop1", + "volume": 0.45 + }, + { + "name": "item/plant/crop1", + "pitch": 1.2, + "volume": 0.45 + }, + { + "name": "item/plant/crop2", + "volume": 0.45 + }, + { + "name": "item/plant/crop2", + "pitch": 1.2, + "volume": 0.45 + }, + { + "name": "item/plant/crop3", + "volume": 0.45 + }, + { + "name": "item/plant/crop3", + "pitch": 1.2, + "volume": 0.45 + }, + { + "name": "item/plant/crop4", + "volume": 0.45 + }, + { + "name": "item/plant/crop4", + "pitch": 1.2, + "volume": 0.45 + }, + { + "name": "item/plant/crop5", + "volume": 0.45 + }, + { + "name": "item/plant/crop5", + "pitch": 1.2, + "volume": 0.45 + }, + { + "name": "item/plant/crop6", + "volume": 0.45 + }, + { + "name": "item/plant/crop6", + "pitch": 1.2, + "volume": 0.45 + } + ], + "subtitle": "subtitles.block.generic.place" + }, + "item.crossbow.hit": { + "sounds": [ + "random/bowhit1", + "random/bowhit2", + "random/bowhit3", + "random/bowhit4" + ], + "subtitle": "subtitles.item.crossbow.hit" + }, + "item.crossbow.loading_end": { + "sounds": [ + "item/crossbow/loading_end" + ], + "subtitle": "subtitles.item.crossbow.load" + }, + "item.crossbow.loading_middle": { + "sounds": [ + { + "name": "item/crossbow/loading_middle1", + "volume": 0.65 + }, + { + "name": "item/crossbow/loading_middle1", + "pitch": 0.95, + "volume": 0.65 + }, + { + "name": "item/crossbow/loading_middle1", + "pitch": 1.2, + "volume": 0.65 + }, + { + "name": "item/crossbow/loading_middle2", + "volume": 0.65 + }, + { + "name": "item/crossbow/loading_middle2", + "pitch": 0.9, + "volume": 0.65 + }, + { + "name": "item/crossbow/loading_middle2", + "pitch": 1.05, + "volume": 0.65 + }, + { + "name": "item/crossbow/loading_middle3", + "volume": 0.65 + }, + { + "name": "item/crossbow/loading_middle3", + "pitch": 0.9, + "volume": 0.65 + }, + { + "name": "item/crossbow/loading_middle3", + "pitch": 1.05, + "volume": 0.65 + }, + { + "name": "item/crossbow/loading_middle4", + "volume": 0.65 + } + ], + "subtitle": "subtitles.item.crossbow.charge" + }, + "item.crossbow.loading_start": { + "sounds": [ + { + "name": "item/crossbow/loading_start", + "volume": 0.3 + } + ], + "subtitle": "subtitles.item.crossbow.charge" + }, + "item.crossbow.quick_charge_1": { + "sounds": [ + { + "name": "item/crossbow/quick_charge/quick1_1", + "volume": 0.65 + }, + { + "name": "item/crossbow/quick_charge/quick1_1", + "pitch": 0.9, + "volume": 0.5 + }, + { + "name": "item/crossbow/quick_charge/quick1_2", + "volume": 0.65 + }, + { + "name": "item/crossbow/quick_charge/quick1_2", + "pitch": 0.95, + "volume": 0.65 + }, + { + "name": "item/crossbow/quick_charge/quick1_3", + "volume": 0.65 + } + ], + "subtitle": "subtitles.item.crossbow.charge" + }, + "item.crossbow.quick_charge_2": { + "sounds": [ + { + "name": "item/crossbow/quick_charge/quick2_1", + "volume": 0.65 + }, + { + "name": "item/crossbow/quick_charge/quick2_1", + "pitch": 0.95, + "volume": 0.5 + }, + { + "name": "item/crossbow/quick_charge/quick2_2", + "volume": 0.65 + }, + { + "name": "item/crossbow/quick_charge/quick2_2", + "pitch": 0.95, + "volume": 0.65 + }, + { + "name": "item/crossbow/quick_charge/quick2_2", + "pitch": 1.05, + "volume": 0.65 + }, + { + "name": "item/crossbow/quick_charge/quick2_3", + "volume": 0.65 + }, + { + "name": "item/crossbow/quick_charge/quick2_3", + "pitch": 0.9, + "volume": 0.65 + }, + { + "name": "item/crossbow/quick_charge/quick2_3", + "pitch": 1.05, + "volume": 0.65 + } + ], + "subtitle": "subtitles.item.crossbow.charge" + }, + "item.crossbow.quick_charge_3": { + "sounds": [ + { + "name": "item/crossbow/quick_charge/quick3_1", + "volume": 0.65 + }, + { + "name": "item/crossbow/quick_charge/quick3_1", + "pitch": 0.95, + "volume": 0.5 + }, + { + "name": "item/crossbow/quick_charge/quick3_2", + "volume": 0.65 + }, + { + "name": "item/crossbow/quick_charge/quick3_2", + "pitch": 0.95, + "volume": 0.65 + }, + { + "name": "item/crossbow/quick_charge/quick3_2", + "pitch": 1.05, + "volume": 0.65 + }, + { + "name": "item/crossbow/quick_charge/quick3_3", + "volume": 0.65 + }, + { + "name": "item/crossbow/quick_charge/quick3_3", + "pitch": 0.9, + "volume": 0.65 + }, + { + "name": "item/crossbow/quick_charge/quick3_3", + "pitch": 1.05, + "volume": 0.65 + } + ], + "subtitle": "subtitles.item.crossbow.charge" + }, + "item.crossbow.shoot": { + "sounds": [ + { + "name": "item/crossbow/shoot1", + "volume": 0.8 + }, + { + "name": "item/crossbow/shoot1", + "volume": 0.9 + }, + { + "name": "item/crossbow/shoot1", + "pitch": 0.9, + "volume": 0.9 + }, + { + "name": "item/crossbow/shoot2", + "volume": 0.8 + }, + { + "name": "item/crossbow/shoot2", + "volume": 0.9 + }, + { + "name": "item/crossbow/shoot2", + "pitch": 0.9, + "volume": 0.9 + }, + { + "name": "item/crossbow/shoot3", + "volume": 0.8 + }, + { + "name": "item/crossbow/shoot3", + "volume": 0.9 + }, + { + "name": "item/crossbow/shoot3", + "pitch": 0.9, + "volume": 0.9 + } + ], + "subtitle": "subtitles.item.crossbow.shoot" + }, + "item.dye.use": { + "sounds": [ + "item/dye/dye", + { + "name": "item/dye/dye", + "pitch": 0.9 + }, + { + "name": "item/dye/dye", + "pitch": 0.95 + }, + { + "name": "item/dye/dye", + "pitch": 1.1 + } + ], + "subtitle": "subtitles.item.dye.use" + }, + "item.elytra.flying": { + "sounds": [ + { + "name": "item/elytra/elytra_loop", + "volume": 0.6 + } + ], + "subtitle": "subtitles.item.elytra.flying" + }, + "item.firecharge.use": { + "sounds": [ + "mob/ghast/fireball4" + ], + "subtitle": "subtitles.item.firecharge.use" + }, + "item.flintandsteel.use": { + "sounds": [ + "fire/ignite" + ], + "subtitle": "subtitles.item.flintandsteel.use" + }, + "item.glow_ink_sac.use": { + "sounds": [ + "item/ink_sac/ink_sac1", + { + "name": "item/ink_sac/ink_sac1", + "pitch": 0.95 + }, + { + "name": "item/ink_sac/ink_sac1", + "pitch": 1.05 + }, + "item/ink_sac/ink_sac2", + { + "name": "item/ink_sac/ink_sac2", + "pitch": 0.95 + }, + { + "name": "item/ink_sac/ink_sac2", + "pitch": 1.05 + }, + "item/ink_sac/ink_sac3", + { + "name": "item/ink_sac/ink_sac3", + "pitch": 0.95 + }, + { + "name": "item/ink_sac/ink_sac3", + "pitch": 1.05 + } + ], + "subtitle": "subtitles.item.glow_ink_sac.use" + }, + "item.goat_horn.sound.0": { + "sounds": [ + "item/goat_horn/call0" + ], + "subtitle": "subtitles.item.goat_horn.play" + }, + "item.goat_horn.sound.1": { + "sounds": [ + "item/goat_horn/call1" + ], + "subtitle": "subtitles.item.goat_horn.play" + }, + "item.goat_horn.sound.2": { + "sounds": [ + "item/goat_horn/call2" + ], + "subtitle": "subtitles.item.goat_horn.play" + }, + "item.goat_horn.sound.3": { + "sounds": [ + "item/goat_horn/call3" + ], + "subtitle": "subtitles.item.goat_horn.play" + }, + "item.goat_horn.sound.4": { + "sounds": [ + "item/goat_horn/call4" + ], + "subtitle": "subtitles.item.goat_horn.play" + }, + "item.goat_horn.sound.5": { + "sounds": [ + "item/goat_horn/call5" + ], + "subtitle": "subtitles.item.goat_horn.play" + }, + "item.goat_horn.sound.6": { + "sounds": [ + "item/goat_horn/call6" + ], + "subtitle": "subtitles.item.goat_horn.play" + }, + "item.goat_horn.sound.7": { + "sounds": [ + "item/goat_horn/call7" + ], + "subtitle": "subtitles.item.goat_horn.play" + }, + "item.hoe.till": { + "sounds": [ + "item/hoe/till1", + "item/hoe/till2", + "item/hoe/till3", + "item/hoe/till4" + ], + "subtitle": "subtitles.item.hoe.till" + }, + "item.honey_bottle.drink": { + "sounds": [ + "item/bottle/drink_honey1", + "item/bottle/drink_honey2", + { + "name": "item/bottle/drink_honey3", + "volume": 0.35 + }, + { + "name": "item/bottle/drink_honey3", + "volume": 0.75 + } + ], + "subtitle": "subtitles.item.honey_bottle.drink" + }, + "item.honeycomb.wax_on": { + "sounds": [ + "item/honeycomb/wax_on1", + { + "name": "item/honeycomb/wax_on1", + "pitch": 0.9 + }, + { + "name": "item/honeycomb/wax_on1", + "pitch": 1.1 + }, + "item/honeycomb/wax_on2", + { + "name": "item/honeycomb/wax_on2", + "pitch": 0.9 + }, + { + "name": "item/honeycomb/wax_on2", + "pitch": 1.1 + }, + "item/honeycomb/wax_on3", + { + "name": "item/honeycomb/wax_on3", + "pitch": 0.9 + }, + { + "name": "item/honeycomb/wax_on3", + "pitch": 1.1 + } + ], + "subtitle": "subtitles.item.honeycomb.wax_on" + }, + "item.ink_sac.use": { + "sounds": [ + { + "name": "item/ink_sac/ink_sac1", + "pitch": 0.85 + }, + { + "name": "item/ink_sac/ink_sac1", + "pitch": 0.88 + }, + { + "name": "item/ink_sac/ink_sac1", + "pitch": 0.9 + }, + { + "name": "item/ink_sac/ink_sac2", + "pitch": 0.85 + }, + { + "name": "item/ink_sac/ink_sac2", + "pitch": 0.88 + }, + { + "name": "item/ink_sac/ink_sac2", + "pitch": 0.9 + }, + { + "name": "item/ink_sac/ink_sac3", + "pitch": 0.85 + }, + { + "name": "item/ink_sac/ink_sac3", + "pitch": 0.88 + }, + { + "name": "item/ink_sac/ink_sac3", + "pitch": 0.9 + } + ], + "subtitle": "subtitles.item.ink_sac.use" + }, + "item.lodestone_compass.lock": { + "sounds": [ + { + "name": "block/lodestone/lock1", + "pitch": 0.85 + }, + { + "name": "block/lodestone/lock1", + "pitch": 0.95 + }, + { + "name": "block/lodestone/lock2", + "pitch": 0.85 + }, + { + "name": "block/lodestone/lock2", + "pitch": 0.95 + } + ], + "subtitle": "subtitles.item.lodestone_compass.lock" + }, + "item.mace.smash_air": { + "sounds": [ + "item/mace/smash_air1", + "item/mace/smash_air2", + "item/mace/smash_air3" + ], + "subtitle": "subtitles.item.mace.smash_air" + }, + "item.mace.smash_ground": { + "sounds": [ + "item/mace/smash_ground1", + "item/mace/smash_ground2", + "item/mace/smash_ground3", + "item/mace/smash_ground4" + ], + "subtitle": "subtitles.item.mace.smash_ground" + }, + "item.mace.smash_ground_heavy": { + "sounds": [ + "item/mace/smash_ground_heavy" + ], + "subtitle": "subtitles.item.mace.smash_ground" + }, + "item.nether_wart.plant": { + "sounds": [ + { + "name": "item/plant/netherwart1", + "volume": 0.9 + }, + { + "name": "item/plant/netherwart1", + "pitch": 1.12, + "volume": 0.9 + }, + { + "name": "item/plant/netherwart2", + "volume": 0.9 + }, + { + "name": "item/plant/netherwart2", + "pitch": 1.12, + "volume": 0.9 + }, + { + "name": "item/plant/netherwart3", + "volume": 0.9 + }, + { + "name": "item/plant/netherwart3", + "pitch": 1.12, + "volume": 0.9 + }, + { + "name": "item/plant/netherwart4", + "volume": 0.9 + }, + { + "name": "item/plant/netherwart4", + "pitch": 1.12, + "volume": 0.9 + }, + { + "name": "item/plant/netherwart5", + "volume": 0.9 + }, + { + "name": "item/plant/netherwart5", + "pitch": 1.12, + "volume": 0.9 + }, + { + "name": "item/plant/netherwart6", + "volume": 0.9 + }, + { + "name": "item/plant/netherwart6", + "pitch": 1.12, + "volume": 0.9 + } + ], + "subtitle": "subtitles.block.generic.place" + }, + "item.ominous_bottle.dispose": { + "sounds": [ + "item/ominous_bottle/dispose" + ], + "subtitle": "subtitles.item.ominous_bottle.dispose" + }, + "item.shield.block": { + "sounds": [ + "item/shield/block1", + "item/shield/block2", + "item/shield/block3", + "item/shield/block4", + "item/shield/block5" + ], + "subtitle": "subtitles.item.shield.block" + }, + "item.shield.break": { + "sounds": [ + "random/break" + ], + "subtitle": "subtitles.entity.item.break" + }, + "item.shovel.flatten": { + "sounds": [ + "item/shovel/flatten1", + "item/shovel/flatten2", + "item/shovel/flatten3", + "item/shovel/flatten4" + ], + "subtitle": "subtitles.item.shovel.flatten" + }, + "item.spyglass.stop_using": { + "sounds": [ + { + "name": "item/spyglass/stop", + "volume": 0.5 + }, + { + "name": "item/spyglass/stop", + "pitch": 0.8, + "volume": 0.5 + }, + { + "name": "item/spyglass/stop", + "pitch": 0.9, + "volume": 0.5 + } + ], + "subtitle": "subtitles.item.spyglass.stop_using" + }, + "item.spyglass.use": { + "sounds": [ + { + "name": "item/spyglass/use", + "pitch": 1.15, + "volume": 0.5 + }, + { + "name": "item/spyglass/use", + "pitch": 1.33, + "volume": 0.5 + }, + { + "name": "item/spyglass/use", + "pitch": 1.4, + "volume": 0.5 + }, + { + "name": "item/spyglass/use", + "pitch": 1.55, + "volume": 0.5 + } + ], + "subtitle": "subtitles.item.spyglass.use" + }, + "item.totem.use": { + "sounds": [ + "item/totem/use_totem" + ], + "subtitle": "subtitles.item.totem.use" + }, + "item.trident.hit": { + "sounds": [ + "item/trident/pierce1", + "item/trident/pierce2", + "item/trident/pierce3" + ], + "subtitle": "subtitles.item.trident.hit" + }, + "item.trident.hit_ground": { + "sounds": [ + { + "name": "item/trident/ground_impact1", + "volume": 0.9 + }, + { + "name": "item/trident/ground_impact2", + "volume": 0.9 + }, + { + "name": "item/trident/ground_impact3", + "volume": 0.9 + }, + { + "name": "item/trident/ground_impact4", + "volume": 0.9 + } + ], + "subtitle": "subtitles.item.trident.hit_ground" + }, + "item.trident.return": { + "sounds": [ + { + "name": "item/trident/return1", + "volume": 0.8 + }, + { + "name": "item/trident/return2", + "volume": 0.8 + }, + { + "name": "item/trident/return2", + "pitch": 0.8, + "volume": 0.8 + }, + { + "name": "item/trident/return2", + "pitch": 1.2, + "volume": 0.8 + }, + { + "name": "item/trident/return2", + "pitch": 1.2, + "volume": 0.8 + }, + { + "name": "item/trident/return3", + "volume": 0.8 + }, + { + "name": "item/trident/return3", + "pitch": 0.8, + "volume": 0.8 + }, + { + "name": "item/trident/return3", + "pitch": 0.8, + "volume": 0.8 + }, + { + "name": "item/trident/return3", + "pitch": 1.2, + "volume": 0.8 + } + ], + "subtitle": "subtitles.item.trident.return" + }, + "item.trident.riptide_1": { + "sounds": [ + "item/trident/riptide1" + ], + "subtitle": "subtitles.item.trident.riptide" + }, + "item.trident.riptide_2": { + "sounds": [ + "item/trident/riptide2" + ], + "subtitle": "subtitles.item.trident.riptide" + }, + "item.trident.riptide_3": { + "sounds": [ + "item/trident/riptide3" + ], + "subtitle": "subtitles.item.trident.riptide" + }, + "item.trident.throw": { + "sounds": [ + "item/trident/throw1", + "item/trident/throw2" + ], + "subtitle": "subtitles.item.trident.throw" + }, + "item.trident.thunder": { + "sounds": [ + "item/trident/thunder1", + "item/trident/thunder2" + ], + "subtitle": "subtitles.item.trident.thunder" + }, + "item.wolf_armor.break": { + "sounds": [ + "item/armor/break_wolf" + ], + "subtitle": "subtitles.item.wolf_armor.break" + }, + "item.wolf_armor.crack": { + "sounds": [ + "item/armor/crack_wolf1", + "item/armor/crack_wolf2", + "item/armor/crack_wolf3", + "item/armor/crack_wolf4" + ], + "subtitle": "subtitles.item.wolf_armor.crack" + }, + "item.wolf_armor.damage": { + "sounds": [ + "item/armor/damage_wolf1", + "item/armor/damage_wolf2", + "item/armor/damage_wolf3", + "item/armor/damage_wolf4" + ], + "subtitle": "subtitles.item.wolf_armor.damage" + }, + "item.wolf_armor.repair": { + "sounds": [ + "item/armor/repair_wolf1", + "item/armor/repair_wolf2", + "item/armor/repair_wolf3", + "item/armor/repair_wolf4" + ], + "subtitle": "subtitles.item.wolf_armor.repair" + }, + "music.creative": { + "sounds": [ + { + "name": "music.game", + "type": "event" + }, + { + "name": "music/game/creative/aria_math", + "stream": true + }, + { + "name": "music/game/creative/biome_fest", + "stream": true + }, + { + "name": "music/game/creative/blind_spots", + "stream": true + }, + { + "name": "music/game/creative/dreiton", + "stream": true + }, + { + "name": "music/game/creative/haunt_muskie", + "stream": true + }, + { + "name": "music/game/creative/taswell", + "stream": true + } + ] + }, + "music.credits": { + "sounds": [ + { + "name": "music/game/end/alpha", + "stream": true + } + ] + }, + "music.dragon": { + "sounds": [ + { + "name": "music/game/end/boss", + "stream": true + } + ] + }, + "music.end": { + "sounds": [ + { + "name": "music/game/end/the_end", + "stream": true + } + ] + }, + "music.game": { + "sounds": [ + { + "name": "music/game/a_familiar_room", + "stream": true, + "volume": 0.4 + }, + { + "name": "music/game/clark", + "stream": true + }, + { + "name": "music/game/comforting_memories", + "stream": true, + "volume": 0.4 + }, + { + "name": "music/game/danny", + "stream": true + }, + { + "name": "music/game/dry_hands", + "stream": true + }, + { + "name": "music/game/featherfall", + "stream": true, + "volume": 0.4 + }, + { + "name": "music/game/floating_dream", + "stream": true, + "volume": 0.4 + }, + { + "name": "music/game/haggstrom", + "stream": true + }, + { + "name": "music/game/key", + "stream": true + }, + { + "name": "music/game/komorebi", + "stream": true, + "volume": 0.8 + }, + { + "name": "music/game/left_to_bloom", + "stream": true, + "volume": 0.4 + }, + { + "name": "music/game/living_mice", + "stream": true + }, + { + "name": "music/game/mice_on_venus", + "stream": true + }, + { + "name": "music/game/minecraft", + "stream": true + }, + { + "name": "music/game/one_more_day", + "stream": true, + "volume": 0.4 + }, + { + "name": "music/game/oxygene", + "stream": true + }, + { + "name": "music/game/puzzlebox", + "stream": true, + "volume": 0.4 + }, + { + "name": "music/game/subwoofer_lullaby", + "stream": true + }, + { + "name": "music/game/sweden", + "stream": true + }, + { + "name": "music/game/watcher", + "stream": true, + "volume": 0.4 + }, + { + "name": "music/game/wet_hands", + "stream": true + }, + { + "name": "music/game/yakusoku", + "stream": true, + "volume": 0.8 + } + ] + }, + "music.menu": { + "sounds": [ + { + "name": "music/game/deeper", + "stream": true, + "volume": 0.4 + }, + { + "name": "music/game/eld_unknown", + "stream": true, + "volume": 0.4 + }, + { + "name": "music/game/endless", + "stream": true, + "volume": 0.4 + }, + { + "name": "music/game/featherfall", + "stream": true, + "volume": 0.4 + }, + { + "name": "music/game/komorebi", + "stream": true, + "volume": 0.8 + }, + { + "name": "music/game/pokopoko", + "stream": true, + "volume": 0.8 + }, + { + "name": "music/game/puzzlebox", + "stream": true, + "volume": 0.4 + }, + { + "name": "music/game/watcher", + "stream": true, + "volume": 0.4 + }, + { + "name": "music/game/yakusoku", + "stream": true, + "volume": 0.8 + }, + { + "name": "music/menu/beginning_2", + "stream": true + }, + { + "name": "music/menu/floating_trees", + "stream": true + }, + { + "name": "music/menu/moog_city_2", + "stream": true + }, + { + "name": "music/menu/mutation", + "stream": true + } + ] + }, + "music.nether.basalt_deltas": { + "sounds": [ + { + "name": "music/game/nether/ballad_of_the_cats", + "stream": true + }, + { + "name": "music/game/nether/concrete_halls", + "stream": true + }, + { + "name": "music/game/nether/dead_voxel", + "stream": true + }, + { + "name": "music/game/nether/soulsand_valley/so_below", + "stream": true, + "volume": 0.5, + "weight": 7 + }, + { + "name": "music/game/nether/warmth", + "stream": true + } + ] + }, + "music.nether.crimson_forest": { + "sounds": [ + { + "name": "music/game/nether/ballad_of_the_cats", + "stream": true + }, + { + "name": "music/game/nether/concrete_halls", + "stream": true + }, + { + "name": "music/game/nether/crimson_forest/chrysopoeia", + "stream": true, + "volume": 0.5, + "weight": 7 + }, + { + "name": "music/game/nether/dead_voxel", + "stream": true + }, + { + "name": "music/game/nether/warmth", + "stream": true + } + ] + }, + "music.nether.nether_wastes": { + "sounds": [ + { + "name": "music/game/nether/ballad_of_the_cats", + "stream": true + }, + { + "name": "music/game/nether/concrete_halls", + "stream": true + }, + { + "name": "music/game/nether/dead_voxel", + "stream": true + }, + { + "name": "music/game/nether/nether_wastes/rubedo", + "stream": true, + "volume": 0.5, + "weight": 6 + }, + { + "name": "music/game/nether/warmth", + "stream": true + } + ] + }, + "music.nether.soul_sand_valley": { + "sounds": [ + { + "name": "music/game/nether/ballad_of_the_cats", + "stream": true + }, + { + "name": "music/game/nether/concrete_halls", + "stream": true + }, + { + "name": "music/game/nether/dead_voxel", + "stream": true + }, + { + "name": "music/game/nether/soulsand_valley/so_below", + "stream": true, + "volume": 0.5, + "weight": 7 + }, + { + "name": "music/game/nether/warmth", + "stream": true + } + ] + }, + "music.nether.warped_forest": { + "sounds": [] + }, + "music.overworld.badlands": { + "sounds": [ + { + "name": "music/game/crescent_dunes", + "stream": true, + "volume": 0.4, + "weight": 2 + }, + { + "name": "music/game/danny", + "stream": true + }, + { + "name": "music/game/dry_hands", + "stream": true + }, + { + "name": "music/game/echo_in_the_wind", + "stream": true, + "volume": 0.4 + }, + { + "name": "music/game/featherfall", + "stream": true, + "volume": 0.4 + }, + { + "name": "music/game/haggstrom", + "stream": true + }, + { + "name": "music/game/key", + "stream": true + }, + { + "name": "music/game/living_mice", + "stream": true + }, + { + "name": "music/game/mice_on_venus", + "stream": true + }, + { + "name": "music/game/one_more_day", + "stream": true, + "volume": 0.4 + }, + { + "name": "music/game/oxygene", + "stream": true + }, + { + "name": "music/game/subwoofer_lullaby", + "stream": true + }, + { + "name": "music/game/wet_hands", + "stream": true + } + ] + }, + "music.overworld.bamboo_jungle": { + "sounds": [ + { + "name": "music/game/bromeliad", + "stream": true, + "volume": 0.4, + "weight": 2 + }, + { + "name": "music/game/danny", + "stream": true + }, + { + "name": "music/game/dry_hands", + "stream": true + }, + { + "name": "music/game/haggstrom", + "stream": true + }, + { + "name": "music/game/key", + "stream": true + }, + { + "name": "music/game/left_to_bloom", + "stream": true, + "volume": 0.4 + }, + { + "name": "music/game/living_mice", + "stream": true + }, + { + "name": "music/game/mice_on_venus", + "stream": true + }, + { + "name": "music/game/oxygene", + "stream": true + }, + { + "name": "music/game/subwoofer_lullaby", + "stream": true + }, + { + "name": "music/game/wet_hands", + "stream": true + } + ] + }, + "music.overworld.cherry_grove": { + "sounds": [ + { + "name": "music/game/bromeliad", + "stream": true, + "volume": 0.4, + "weight": 3 + }, + { + "name": "music/game/clark", + "stream": true + }, + { + "name": "music/game/echo_in_the_wind", + "stream": true, + "volume": 0.4, + "weight": 3 + }, + { + "name": "music/game/featherfall", + "stream": true, + "volume": 0.4, + "weight": 3 + }, + { + "name": "music/game/left_to_bloom", + "stream": true, + "volume": 0.4 + }, + { + "name": "music/game/minecraft", + "stream": true + }, + { + "name": "music/game/sweden", + "stream": true + } + ] + }, + "music.overworld.deep_dark": { + "sounds": [ + { + "name": "music/game/ancestry", + "stream": true + }, + { + "name": "music/game/deeper", + "stream": true, + "volume": 0.4 + } + ] + }, + "music.overworld.desert": { + "sounds": [ + { + "name": "music/game/crescent_dunes", + "stream": true, + "volume": 0.4, + "weight": 3 + }, + { + "name": "music/game/danny", + "stream": true + }, + { + "name": "music/game/haggstrom", + "stream": true + }, + { + "name": "music/game/key", + "stream": true + }, + { + "name": "music/game/living_mice", + "stream": true + }, + { + "name": "music/game/one_more_day", + "stream": true, + "volume": 0.4 + }, + { + "name": "music/game/oxygene", + "stream": true + }, + { + "name": "music/game/subwoofer_lullaby", + "stream": true + } + ] + }, + "music.overworld.dripstone_caves": { + "sounds": [ + { + "name": "music/game/an_ordinary_day", + "stream": true + }, + { + "name": "music/game/danny", + "stream": true + }, + { + "name": "music/game/deeper", + "stream": true, + "volume": 0.4 + }, + { + "name": "music/game/eld_unknown", + "stream": true, + "volume": 0.4, + "weight": 2 + }, + { + "name": "music/game/endless", + "stream": true, + "volume": 0.4, + "weight": 2 + }, + { + "name": "music/game/infinite_amethyst", + "stream": true, + "volume": 0.4 + }, + { + "name": "music/game/key", + "stream": true + }, + { + "name": "music/game/oxygene", + "stream": true + }, + { + "name": "music/game/pokopoko", + "stream": true, + "volume": 0.8, + "weight": 2 + }, + { + "name": "music/game/subwoofer_lullaby", + "stream": true + }, + { + "name": "music/game/wending", + "stream": true, + "volume": 0.4, + "weight": 2 + } + ] + }, + "music.overworld.flower_forest": { + "sounds": [ + { + "name": "music/game/bromeliad", + "stream": true, + "volume": 0.4 + }, + { + "name": "music/game/danny", + "stream": true + }, + { + "name": "music/game/echo_in_the_wind", + "stream": true, + "volume": 0.4 + }, + { + "name": "music/game/featherfall", + "stream": true, + "volume": 0.4, + "weight": 2 + }, + { + "name": "music/game/haggstrom", + "stream": true + }, + { + "name": "music/game/key", + "stream": true + }, + { + "name": "music/game/left_to_bloom", + "stream": true, + "volume": 0.4 + }, + { + "name": "music/game/living_mice", + "stream": true + }, + { + "name": "music/game/oxygene", + "stream": true + }, + { + "name": "music/game/subwoofer_lullaby", + "stream": true + } + ] + }, + "music.overworld.forest": { + "sounds": [ + { + "name": "music/game/bromeliad", + "stream": true, + "volume": 0.4 + }, + { + "name": "music/game/clark", + "stream": true + }, + { + "name": "music/game/comforting_memories", + "stream": true, + "volume": 0.4 + }, + { + "name": "music/game/danny", + "stream": true + }, + { + "name": "music/game/dry_hands", + "stream": true + }, + { + "name": "music/game/floating_dream", + "stream": true, + "volume": 0.4 + }, + { + "name": "music/game/haggstrom", + "stream": true + }, + { + "name": "music/game/key", + "stream": true + }, + { + "name": "music/game/left_to_bloom", + "stream": true, + "volume": 0.4 + }, + { + "name": "music/game/living_mice", + "stream": true + }, + { + "name": "music/game/mice_on_venus", + "stream": true + }, + { + "name": "music/game/minecraft", + "stream": true + }, + { + "name": "music/game/one_more_day", + "stream": true, + "volume": 0.4 + }, + { + "name": "music/game/oxygene", + "stream": true + }, + { + "name": "music/game/subwoofer_lullaby", + "stream": true + }, + { + "name": "music/game/swamp/aerie", + "stream": true, + "volume": 0.4 + }, + { + "name": "music/game/swamp/firebugs", + "stream": true, + "volume": 0.4 + }, + { + "name": "music/game/swamp/labyrinthine", + "stream": true, + "volume": 0.4 + }, + { + "name": "music/game/sweden", + "stream": true + }, + { + "name": "music/game/wet_hands", + "stream": true + } + ] + }, + "music.overworld.frozen_peaks": { + "sounds": [ + { + "name": "music/game/danny", + "stream": true + }, + { + "name": "music/game/dry_hands", + "stream": true + }, + { + "name": "music/game/haggstrom", + "stream": true + }, + { + "name": "music/game/living_mice", + "stream": true + }, + { + "name": "music/game/mice_on_venus", + "stream": true + }, + { + "name": "music/game/stand_tall", + "stream": true, + "volume": 0.4, + "weight": 2 + }, + { + "name": "music/game/subwoofer_lullaby", + "stream": true + }, + { + "name": "music/game/wet_hands", + "stream": true + } + ] + }, + "music.overworld.grove": { + "sounds": [ + { + "name": "music/game/clark", + "stream": true + }, + { + "name": "music/game/comforting_memories", + "stream": true, + "volume": 0.4 + }, + { + "name": "music/game/eld_unknown", + "stream": true, + "volume": 0.4 + }, + { + "name": "music/game/endless", + "stream": true, + "volume": 0.4 + }, + { + "name": "music/game/infinite_amethyst", + "stream": true, + "volume": 0.4 + }, + { + "name": "music/game/key", + "stream": true + }, + { + "name": "music/game/mice_on_venus", + "stream": true + }, + { + "name": "music/game/minecraft", + "stream": true + }, + { + "name": "music/game/oxygene", + "stream": true + }, + { + "name": "music/game/pokopoko", + "stream": true, + "volume": 0.8 + }, + { + "name": "music/game/sweden", + "stream": true + }, + { + "name": "music/game/wending", + "stream": true, + "volume": 0.4 + } + ] + }, + "music.overworld.jagged_peaks": { + "sounds": [ + { + "name": "music/game/dry_hands", + "stream": true + }, + { + "name": "music/game/eld_unknown", + "stream": true, + "volume": 0.4 + }, + { + "name": "music/game/endless", + "stream": true, + "volume": 0.4 + }, + { + "name": "music/game/floating_dream", + "stream": true, + "volume": 0.4 + }, + { + "name": "music/game/key", + "stream": true + }, + { + "name": "music/game/living_mice", + "stream": true + }, + { + "name": "music/game/mice_on_venus", + "stream": true + }, + { + "name": "music/game/oxygene", + "stream": true + }, + { + "name": "music/game/pokopoko", + "stream": true, + "volume": 0.8 + }, + { + "name": "music/game/stand_tall", + "stream": true, + "volume": 0.4 + }, + { + "name": "music/game/subwoofer_lullaby", + "stream": true + }, + { + "name": "music/game/wending", + "stream": true, + "volume": 0.4 + }, + { + "name": "music/game/wet_hands", + "stream": true + } + ] + }, + "music.overworld.jungle": { + "sounds": [ + { + "name": "music/game/bromeliad", + "stream": true, + "volume": 0.4, + "weight": 3 + }, + { + "name": "music/game/danny", + "stream": true + }, + { + "name": "music/game/dry_hands", + "stream": true + }, + { + "name": "music/game/haggstrom", + "stream": true + }, + { + "name": "music/game/key", + "stream": true + }, + { + "name": "music/game/left_to_bloom", + "volume": 0.4 + }, + { + "name": "music/game/living_mice", + "stream": true + }, + { + "name": "music/game/mice_on_venus", + "stream": true + }, + { + "name": "music/game/oxygene", + "stream": true + }, + { + "name": "music/game/subwoofer_lullaby", + "stream": true + }, + { + "name": "music/game/wet_hands", + "stream": true + } + ] + }, + "music.overworld.lush_caves": { + "sounds": [ + { + "name": "music/game/an_ordinary_day", + "stream": true, + "weight": 2 + }, + { + "name": "music/game/clark", + "stream": true, + "weight": 2 + }, + { + "name": "music/game/echo_in_the_wind", + "stream": true, + "volume": 0.4, + "weight": 2 + }, + { + "name": "music/game/featherfall", + "stream": true, + "volume": 0.4, + "weight": 2 + }, + { + "name": "music/game/floating_dream", + "stream": true, + "weight": 2 + }, + { + "name": "music/game/left_to_bloom", + "stream": true, + "volume": 0.4, + "weight": 4 + }, + { + "name": "music/game/mice_on_venus", + "stream": true, + "weight": 2 + }, + { + "name": "music/game/minecraft", + "stream": true, + "weight": 2 + }, + { + "name": "music/game/one_more_day", + "stream": true, + "volume": 0.4, + "weight": 2 + }, + { + "name": "music/game/swamp/aerie", + "stream": true, + "volume": 0.4 + }, + { + "name": "music/game/swamp/firebugs", + "stream": true, + "volume": 0.4 + }, + { + "name": "music/game/swamp/labyrinthine", + "stream": true, + "volume": 0.4 + }, + { + "name": "music/game/sweden", + "stream": true, + "weight": 2 + } + ] + }, + "music.overworld.meadow": { + "sounds": [ + { + "name": "music/game/danny", + "stream": true + }, + { + "name": "music/game/haggstrom", + "stream": true + }, + { + "name": "music/game/left_to_bloom", + "stream": true, + "volume": 0.4 + }, + { + "name": "music/game/living_mice", + "stream": true + }, + { + "name": "music/game/one_more_day", + "stream": true, + "volume": 0.4, + "weight": 2 + }, + { + "name": "music/game/subwoofer_lullaby", + "stream": true + } + ] + }, + "music.overworld.old_growth_taiga": { + "sounds": [ + { + "name": "music/game/clark", + "stream": true, + "weight": 3 + }, + { + "name": "music/game/comforting_memories", + "stream": true, + "volume": 0.4, + "weight": 3 + }, + { + "name": "music/game/danny", + "stream": true, + "weight": 3 + }, + { + "name": "music/game/dry_hands", + "stream": true, + "weight": 3 + }, + { + "name": "music/game/floating_dream", + "stream": true, + "volume": 0.4, + "weight": 3 + }, + { + "name": "music/game/haggstrom", + "stream": true, + "weight": 3 + }, + { + "name": "music/game/key", + "stream": true, + "weight": 3 + }, + { + "name": "music/game/left_to_bloom", + "stream": true, + "volume": 0.4, + "weight": 3 + }, + { + "name": "music/game/living_mice", + "stream": true, + "weight": 3 + }, + { + "name": "music/game/mice_on_venus", + "stream": true, + "weight": 3 + }, + { + "name": "music/game/minecraft", + "stream": true, + "weight": 3 + }, + { + "name": "music/game/one_more_day", + "stream": true, + "volume": 0.4, + "weight": 3 + }, + { + "name": "music/game/oxygene", + "stream": true, + "weight": 3 + }, + { + "name": "music/game/subwoofer_lullaby", + "stream": true, + "weight": 3 + }, + { + "name": "music/game/swamp/aerie", + "stream": true, + "volume": 0.4 + }, + { + "name": "music/game/swamp/firebugs", + "stream": true, + "volume": 0.4 + }, + { + "name": "music/game/swamp/labyrinthine", + "stream": true, + "volume": 0.4 + }, + { + "name": "music/game/sweden", + "stream": true, + "weight": 3 + }, + { + "name": "music/game/wet_hands", + "stream": true, + "weight": 3 + } + ] + }, + "music.overworld.snowy_slopes": { + "sounds": [ + { + "name": "music/game/an_ordinary_day", + "stream": true, + "volume": 0.4 + }, + { + "name": "music/game/haggstrom", + "stream": true + }, + { + "name": "music/game/living_mice", + "stream": true + }, + { + "name": "music/game/one_more_day", + "stream": true, + "volume": 0.4 + }, + { + "name": "music/game/pokopoko", + "stream": true, + "volume": 0.8 + }, + { + "name": "music/game/stand_tall", + "stream": true, + "volume": 0.4 + }, + { + "name": "music/game/subwoofer_lullaby", + "stream": true + } + ] + }, + "music.overworld.sparse_jungle": { + "sounds": [ + { + "name": "music/game/bromeliad", + "stream": true, + "volume": 0.4, + "weight": 2 + }, + { + "name": "music/game/danny", + "stream": true + }, + { + "name": "music/game/dry_hands", + "stream": true + }, + { + "name": "music/game/haggstrom", + "stream": true + }, + { + "name": "music/game/key", + "stream": true + }, + { + "name": "music/game/left_to_bloom", + "stream": true, + "volume": 0.4 + }, + { + "name": "music/game/living_mice", + "stream": true + }, + { + "name": "music/game/mice_on_venus", + "stream": true + }, + { + "name": "music/game/oxygene", + "stream": true + }, + { + "name": "music/game/subwoofer_lullaby", + "stream": true + }, + { + "name": "music/game/wet_hands", + "stream": true + } + ] + }, + "music.overworld.stony_peaks": { + "sounds": [ + { + "name": "music/game/danny", + "stream": true + }, + { + "name": "music/game/dry_hands", + "stream": true + }, + { + "name": "music/game/eld_unknown", + "volume": 0.4, + "weight": 2 + }, + { + "name": "music/game/endless", + "stream": true, + "volume": 0.4 + }, + { + "name": "music/game/haggstrom", + "stream": true + }, + { + "name": "music/game/living_mice", + "stream": true + }, + { + "name": "music/game/mice_on_venus", + "stream": true + }, + { + "name": "music/game/stand_tall", + "stream": true, + "volume": 0.4, + "weight": 2 + }, + { + "name": "music/game/subwoofer_lullaby", + "stream": true + }, + { + "name": "music/game/wending", + "stream": true, + "volume": 0.4 + }, + { + "name": "music/game/wet_hands", + "stream": true + } + ] + }, + "music.overworld.swamp": { + "sounds": [ + { + "name": "music/game/swamp/aerie", + "stream": true, + "volume": 0.4 + }, + { + "name": "music/game/swamp/firebugs", + "stream": true, + "volume": 0.4 + }, + { + "name": "music/game/swamp/labyrinthine", + "stream": true, + "volume": 0.4 + } + ] + }, + "music.under_water": { + "sounds": [ + { + "name": "music/game/water/axolotl", + "stream": true, + "volume": 0.4 + }, + { + "name": "music/game/water/dragon_fish", + "stream": true, + "volume": 0.4 + }, + { + "name": "music/game/water/shuniji", + "stream": true, + "volume": 0.4 + } + ] + }, + "music_disc.11": { + "sounds": [ + { + "name": "records/11", + "stream": true + } + ] + }, + "music_disc.13": { + "sounds": [ + { + "name": "records/13", + "stream": true + } + ] + }, + "music_disc.5": { + "sounds": [ + { + "name": "records/5", + "stream": true + } + ] + }, + "music_disc.blocks": { + "sounds": [ + { + "name": "records/blocks", + "stream": true + } + ] + }, + "music_disc.cat": { + "sounds": [ + { + "name": "records/cat", + "stream": true + } + ] + }, + "music_disc.chirp": { + "sounds": [ + { + "name": "records/chirp", + "stream": true + } + ] + }, + "music_disc.creator": { + "sounds": [ + { + "name": "records/creator", + "stream": true + } + ] + }, + "music_disc.creator_music_box": { + "sounds": [ + { + "name": "records/creator_music_box", + "stream": true + } + ] + }, + "music_disc.far": { + "sounds": [ + { + "name": "records/far", + "stream": true + } + ] + }, + "music_disc.mall": { + "sounds": [ + { + "name": "records/mall", + "stream": true + } + ] + }, + "music_disc.mellohi": { + "sounds": [ + { + "name": "records/mellohi", + "stream": true + } + ] + }, + "music_disc.otherside": { + "sounds": [ + { + "name": "records/otherside", + "stream": true + } + ] + }, + "music_disc.pigstep": { + "sounds": [ + { + "name": "records/pigstep", + "stream": true + } + ] + }, + "music_disc.precipice": { + "sounds": [ + { + "name": "records/precipice", + "stream": true + } + ] + }, + "music_disc.relic": { + "sounds": [ + { + "name": "records/relic", + "stream": true + } + ] + }, + "music_disc.stal": { + "sounds": [ + { + "name": "records/stal", + "stream": true + } + ] + }, + "music_disc.strad": { + "sounds": [ + { + "name": "records/strad", + "stream": true + } + ] + }, + "music_disc.wait": { + "sounds": [ + { + "name": "records/wait", + "stream": true + } + ] + }, + "music_disc.ward": { + "sounds": [ + { + "name": "records/ward", + "stream": true + } + ] + }, + "particle.soul_escape": { + "sounds": [ + { + "attenuation_distance": 12, + "name": "enchant/soulspeed/soulspeed1", + "volume": 0.25 + }, + { + "attenuation_distance": 12, + "name": "enchant/soulspeed/soulspeed2", + "volume": 0.25 + }, + { + "attenuation_distance": 12, + "name": "enchant/soulspeed/soulspeed3", + "volume": 0.25 + }, + { + "attenuation_distance": 12, + "name": "enchant/soulspeed/soulspeed4", + "volume": 0.25 + }, + { + "attenuation_distance": 12, + "name": "enchant/soulspeed/soulspeed5", + "volume": 0.25 + }, + { + "attenuation_distance": 12, + "name": "enchant/soulspeed/soulspeed6", + "volume": 0.25 + }, + { + "attenuation_distance": 12, + "name": "enchant/soulspeed/soulspeed7", + "volume": 0.25 + }, + { + "attenuation_distance": 12, + "name": "enchant/soulspeed/soulspeed8", + "volume": 0.25 + }, + { + "attenuation_distance": 12, + "name": "enchant/soulspeed/soulspeed9", + "volume": 0.25 + }, + { + "attenuation_distance": 12, + "name": "enchant/soulspeed/soulspeed10", + "volume": 0.25 + }, + { + "attenuation_distance": 12, + "name": "enchant/soulspeed/soulspeed11", + "volume": 0.25 + }, + { + "attenuation_distance": 12, + "name": "enchant/soulspeed/soulspeed12", + "volume": 0.25 + }, + { + "attenuation_distance": 12, + "name": "enchant/soulspeed/soulspeed13", + "volume": 0.25 + } + ], + "subtitle": "subtitles.particle.soul_escape" + }, + "ui.button.click": { + "sounds": [ + "random/click_stereo" + ] + }, + "ui.cartography_table.take_result": { + "sounds": [ + "ui/cartography_table/drawmap1", + "ui/cartography_table/drawmap2", + "ui/cartography_table/drawmap3" + ], + "subtitle": "subtitles.ui.cartography_table.take_result" + }, + "ui.hud.bubble_pop": { + "sounds": [ + "ui/hud/hud_bubble" + ], + "subtitle": "subtitles.ui.hud.bubble_pop" + }, + "ui.loom.select_pattern": { + "sounds": [ + "ui/loom/select_pattern1", + "ui/loom/select_pattern2", + "ui/loom/select_pattern3", + "ui/loom/select_pattern4", + "ui/loom/select_pattern5" + ] + }, + "ui.loom.take_result": { + "sounds": [ + { + "name": "ui/loom/take_result1", + "volume": 0.5 + }, + { + "name": "ui/loom/take_result2", + "volume": 0.5 + } + ], + "subtitle": "subtitles.ui.loom.take_result" + }, + "ui.stonecutter.select_recipe": { + "sounds": [ + "random/click" + ] + }, + "ui.stonecutter.take_result": { + "sounds": [ + "ui/stonecutter/cut1", + { + "name": "ui/stonecutter/cut1", + "pitch": 0.92 + }, + "ui/stonecutter/cut2", + { + "name": "ui/stonecutter/cut2", + "pitch": 0.92 + } + ], + "subtitle": "subtitles.ui.stonecutter.take_result" + }, + "ui.toast.challenge_complete": { + "sounds": [ + { + "name": "ui/toast/challenge_complete", + "volume": 0.6 + } + ] + }, + "ui.toast.in": { + "sounds": [ + { + "name": "ui/toast/in", + "volume": 0.4 + } + ] + }, + "ui.toast.out": { + "sounds": [ + { + "name": "ui/toast/out", + "volume": 0.4 + } + ] + }, + "weather.rain": { + "sounds": [ + "ambient/weather/rain1", + "ambient/weather/rain2", + "ambient/weather/rain3", + "ambient/weather/rain4", + "ambient/weather/rain5", + "ambient/weather/rain6", + "ambient/weather/rain7", + "ambient/weather/rain8" + ], + "subtitle": "subtitles.weather.rain" + }, + "weather.rain.above": { + "sounds": [ + "ambient/weather/rain1", + "ambient/weather/rain2", + "ambient/weather/rain3", + "ambient/weather/rain4" + ], + "subtitle": "subtitles.weather.rain" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/acacia_boat.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/acacia_boat.json new file mode 100644 index 000000000..5b93e9865 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/acacia_boat.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/acacia_boat" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/acacia_button.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/acacia_button.json new file mode 100644 index 000000000..d5affffa7 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/acacia_button.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/acacia_button_inventory" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/acacia_chest_boat.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/acacia_chest_boat.json new file mode 100644 index 000000000..fbac5cb80 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/acacia_chest_boat.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/acacia_chest_boat" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/acacia_door.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/acacia_door.json new file mode 100644 index 000000000..7ecc5bbd8 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/acacia_door.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/acacia_door" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/acacia_fence.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/acacia_fence.json new file mode 100644 index 000000000..4db3c8918 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/acacia_fence.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/acacia_fence_inventory" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/acacia_fence_gate.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/acacia_fence_gate.json new file mode 100644 index 000000000..f58755330 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/acacia_fence_gate.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/acacia_fence_gate" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/acacia_hanging_sign.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/acacia_hanging_sign.json new file mode 100644 index 000000000..16c7c4030 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/acacia_hanging_sign.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/acacia_hanging_sign" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/acacia_leaves.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/acacia_leaves.json new file mode 100644 index 000000000..b1ef8fa9a --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/acacia_leaves.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/acacia_leaves" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/acacia_log.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/acacia_log.json new file mode 100644 index 000000000..0b9f607e0 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/acacia_log.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/acacia_log" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/acacia_planks.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/acacia_planks.json new file mode 100644 index 000000000..3c90abef5 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/acacia_planks.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/acacia_planks" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/acacia_pressure_plate.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/acacia_pressure_plate.json new file mode 100644 index 000000000..318e49ad9 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/acacia_pressure_plate.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/acacia_pressure_plate" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/acacia_sapling.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/acacia_sapling.json new file mode 100644 index 000000000..89e557914 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/acacia_sapling.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:block/acacia_sapling" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/acacia_sign.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/acacia_sign.json new file mode 100644 index 000000000..05032df9c --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/acacia_sign.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/acacia_sign" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/acacia_slab.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/acacia_slab.json new file mode 100644 index 000000000..bb3480c72 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/acacia_slab.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/acacia_slab" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/acacia_stairs.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/acacia_stairs.json new file mode 100644 index 000000000..58ab5e2d4 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/acacia_stairs.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/acacia_stairs" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/acacia_trapdoor.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/acacia_trapdoor.json new file mode 100644 index 000000000..701a68627 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/acacia_trapdoor.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/acacia_trapdoor_bottom" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/acacia_wood.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/acacia_wood.json new file mode 100644 index 000000000..4a5086de4 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/acacia_wood.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/acacia_wood" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/activator_rail.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/activator_rail.json new file mode 100644 index 000000000..9ae2bd074 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/activator_rail.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:block/activator_rail" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/air.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/air.json new file mode 100644 index 000000000..2c63c0851 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/air.json @@ -0,0 +1,2 @@ +{ +} diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/allay_spawn_egg.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/allay_spawn_egg.json new file mode 100644 index 000000000..d1aaa9d6e --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/allay_spawn_egg.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:item/template_spawn_egg" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/allium.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/allium.json new file mode 100644 index 000000000..cf132b4b3 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/allium.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:block/allium" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/amethyst_block.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/amethyst_block.json new file mode 100644 index 000000000..b48995154 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/amethyst_block.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/amethyst_block" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/amethyst_bud.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/amethyst_bud.json new file mode 100644 index 000000000..d3bd62823 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/amethyst_bud.json @@ -0,0 +1,20 @@ +{ + "parent": "minecraft:item/generated", + "display": { + "firstperson_righthand": { + "rotation": [ 0, -90, 25 ], + "translation": [ 0, 5, 0 ], + "scale": [ 0.68, 0.68, 0.68 ] + }, + "thirdperson_righthand": { + "translation": [ 0, 4, 1 ], + "scale": [ 0.55, 0.55, 0.55 ] + }, + "head": { + "translation": [ 0, 14, -5 ] + }, + "gui": { + "translation": [ 0, 2, 0 ] + } + } +} diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/amethyst_cluster.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/amethyst_cluster.json new file mode 100644 index 000000000..abc8c7d35 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/amethyst_cluster.json @@ -0,0 +1,11 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:block/amethyst_cluster" + }, + "display": { + "head": { + "translation": [ 0, 14, -5 ] + } + } +} diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/amethyst_shard.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/amethyst_shard.json new file mode 100644 index 000000000..a0bab4ff7 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/amethyst_shard.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/amethyst_shard" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/ancient_debris.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/ancient_debris.json new file mode 100644 index 000000000..f8c6c3d5f --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/ancient_debris.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/ancient_debris" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/andesite.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/andesite.json new file mode 100644 index 000000000..d6b76e17b --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/andesite.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/andesite" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/andesite_slab.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/andesite_slab.json new file mode 100644 index 000000000..4bd787706 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/andesite_slab.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/andesite_slab" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/andesite_stairs.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/andesite_stairs.json new file mode 100644 index 000000000..03e452df3 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/andesite_stairs.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/andesite_stairs" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/andesite_wall.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/andesite_wall.json new file mode 100644 index 000000000..f10f1ec36 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/andesite_wall.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/andesite_wall_inventory" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/angler_pottery_sherd.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/angler_pottery_sherd.json new file mode 100644 index 000000000..b805ab216 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/angler_pottery_sherd.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/angler_pottery_sherd" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/anvil.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/anvil.json new file mode 100644 index 000000000..9168b26bb --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/anvil.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/anvil" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/apple.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/apple.json new file mode 100644 index 000000000..c314b0587 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/apple.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/apple" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/archer_pottery_sherd.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/archer_pottery_sherd.json new file mode 100644 index 000000000..1b73b22dc --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/archer_pottery_sherd.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/archer_pottery_sherd" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/armadillo_scute.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/armadillo_scute.json new file mode 100644 index 000000000..ca4d17d0d --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/armadillo_scute.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/armadillo_scute" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/armadillo_spawn_egg.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/armadillo_spawn_egg.json new file mode 100644 index 000000000..d1aaa9d6e --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/armadillo_spawn_egg.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:item/template_spawn_egg" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/armor_stand.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/armor_stand.json new file mode 100644 index 000000000..f8f34a7b5 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/armor_stand.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/armor_stand" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/arms_up_pottery_sherd.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/arms_up_pottery_sherd.json new file mode 100644 index 000000000..94339d522 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/arms_up_pottery_sherd.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/arms_up_pottery_sherd" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/arrow.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/arrow.json new file mode 100644 index 000000000..37689ea02 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/arrow.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/arrow" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/axolotl_bucket.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/axolotl_bucket.json new file mode 100644 index 000000000..221f7fa6e --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/axolotl_bucket.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/axolotl_bucket" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/axolotl_spawn_egg.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/axolotl_spawn_egg.json new file mode 100644 index 000000000..d1aaa9d6e --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/axolotl_spawn_egg.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:item/template_spawn_egg" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/azalea.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/azalea.json new file mode 100644 index 000000000..062330c7e --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/azalea.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/azalea" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/azalea_leaves.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/azalea_leaves.json new file mode 100644 index 000000000..6b26318be --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/azalea_leaves.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/azalea_leaves" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/azure_bluet.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/azure_bluet.json new file mode 100644 index 000000000..5d4725150 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/azure_bluet.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:block/azure_bluet" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/baked_potato.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/baked_potato.json new file mode 100644 index 000000000..b9324fe71 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/baked_potato.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/baked_potato" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/bamboo.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/bamboo.json new file mode 100644 index 000000000..2a46e1c3e --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/bamboo.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/handheld", + "textures": { + "layer0": "minecraft:item/bamboo" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/bamboo_block.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/bamboo_block.json new file mode 100644 index 000000000..f75fac0f5 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/bamboo_block.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/bamboo_block" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/bamboo_button.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/bamboo_button.json new file mode 100644 index 000000000..c1152b507 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/bamboo_button.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/bamboo_button_inventory" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/bamboo_chest_raft.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/bamboo_chest_raft.json new file mode 100644 index 000000000..93370902d --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/bamboo_chest_raft.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/bamboo_chest_raft" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/bamboo_door.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/bamboo_door.json new file mode 100644 index 000000000..ff7c997db --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/bamboo_door.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/bamboo_door" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/bamboo_fence.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/bamboo_fence.json new file mode 100644 index 000000000..2b11ca8c7 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/bamboo_fence.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/bamboo_fence_inventory" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/bamboo_fence_gate.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/bamboo_fence_gate.json new file mode 100644 index 000000000..eba9a06e1 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/bamboo_fence_gate.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/bamboo_fence_gate" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/bamboo_hanging_sign.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/bamboo_hanging_sign.json new file mode 100644 index 000000000..a634960ab --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/bamboo_hanging_sign.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/bamboo_hanging_sign" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/bamboo_mosaic.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/bamboo_mosaic.json new file mode 100644 index 000000000..6892f31f0 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/bamboo_mosaic.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/bamboo_mosaic" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/bamboo_mosaic_slab.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/bamboo_mosaic_slab.json new file mode 100644 index 000000000..d7b3e3e2e --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/bamboo_mosaic_slab.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/bamboo_mosaic_slab" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/bamboo_mosaic_stairs.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/bamboo_mosaic_stairs.json new file mode 100644 index 000000000..e6ae86d05 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/bamboo_mosaic_stairs.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/bamboo_mosaic_stairs" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/bamboo_planks.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/bamboo_planks.json new file mode 100644 index 000000000..4e591abe4 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/bamboo_planks.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/bamboo_planks" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/bamboo_pressure_plate.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/bamboo_pressure_plate.json new file mode 100644 index 000000000..8a7a0ff5a --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/bamboo_pressure_plate.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/bamboo_pressure_plate" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/bamboo_raft.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/bamboo_raft.json new file mode 100644 index 000000000..84ded131a --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/bamboo_raft.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/bamboo_raft" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/bamboo_sign.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/bamboo_sign.json new file mode 100644 index 000000000..2d6bb57c7 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/bamboo_sign.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/bamboo_sign" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/bamboo_slab.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/bamboo_slab.json new file mode 100644 index 000000000..0d94c19fc --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/bamboo_slab.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/bamboo_slab" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/bamboo_stairs.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/bamboo_stairs.json new file mode 100644 index 000000000..c96c60693 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/bamboo_stairs.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/bamboo_stairs" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/bamboo_trapdoor.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/bamboo_trapdoor.json new file mode 100644 index 000000000..cd10b18e9 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/bamboo_trapdoor.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/bamboo_trapdoor_bottom" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/barrel.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/barrel.json new file mode 100644 index 000000000..553ec3e04 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/barrel.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/barrel" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/barrier.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/barrier.json new file mode 100644 index 000000000..080cff20c --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/barrier.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/barrier" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/basalt.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/basalt.json new file mode 100644 index 000000000..eaa67e624 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/basalt.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/basalt" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/bat_spawn_egg.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/bat_spawn_egg.json new file mode 100644 index 000000000..d1aaa9d6e --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/bat_spawn_egg.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:item/template_spawn_egg" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/beacon.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/beacon.json new file mode 100644 index 000000000..b6a014e6f --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/beacon.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/beacon" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/bedrock.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/bedrock.json new file mode 100644 index 000000000..c1b8427e8 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/bedrock.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/bedrock" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/bee_nest.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/bee_nest.json new file mode 100644 index 000000000..39634a5b1 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/bee_nest.json @@ -0,0 +1,17 @@ +{ + "parent": "minecraft:block/bee_nest_empty", + "overrides" : [ + { + "predicate" : { + "honey_level" : 0 + }, + "model" : "item/bee_nest_empty" + }, + { + "predicate" : { + "honey_level" : 1 + }, + "model" : "item/bee_nest_honey" + } + ] +} diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/bee_nest_empty.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/bee_nest_empty.json new file mode 100644 index 000000000..ac0aa6236 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/bee_nest_empty.json @@ -0,0 +1,10 @@ +{ + "parent": "minecraft:block/orientable_with_bottom", + "textures": { + "bottom": "minecraft:block/bee_nest_bottom", + "front": "minecraft:block/bee_nest_front", + "particle": "minecraft:block/bee_nest_side", + "side": "minecraft:block/bee_nest_side", + "top": "minecraft:block/bee_nest_top" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/bee_nest_honey.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/bee_nest_honey.json new file mode 100644 index 000000000..25850dbf4 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/bee_nest_honey.json @@ -0,0 +1,10 @@ +{ + "parent": "minecraft:block/orientable_with_bottom", + "textures": { + "bottom": "minecraft:block/bee_nest_bottom", + "front": "minecraft:block/bee_nest_front_honey", + "particle": "minecraft:block/bee_nest_side", + "side": "minecraft:block/bee_nest_side", + "top": "minecraft:block/bee_nest_top" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/bee_spawn_egg.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/bee_spawn_egg.json new file mode 100644 index 000000000..d1aaa9d6e --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/bee_spawn_egg.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:item/template_spawn_egg" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/beef.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/beef.json new file mode 100644 index 000000000..5545b3c82 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/beef.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/beef" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/beehive.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/beehive.json new file mode 100644 index 000000000..afc4081bd --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/beehive.json @@ -0,0 +1,17 @@ +{ + "parent": "minecraft:block/beehive_empty", + "overrides" : [ + { + "predicate" : { + "honey_level" : 0 + }, + "model" : "item/beehive_empty" + }, + { + "predicate" : { + "honey_level" : 1 + }, + "model" : "item/beehive_honey" + } + ] +} diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/beehive_empty.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/beehive_empty.json new file mode 100644 index 000000000..4c875e63a --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/beehive_empty.json @@ -0,0 +1,10 @@ +{ + "parent": "minecraft:block/orientable_with_bottom", + "textures": { + "bottom": "minecraft:block/beehive_end", + "front": "minecraft:block/beehive_front", + "particle": "minecraft:block/beehive_side", + "side": "minecraft:block/beehive_side", + "top": "minecraft:block/beehive_end" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/beehive_honey.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/beehive_honey.json new file mode 100644 index 000000000..1973867cd --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/beehive_honey.json @@ -0,0 +1,10 @@ +{ + "parent": "minecraft:block/orientable_with_bottom", + "textures": { + "bottom": "minecraft:block/beehive_end", + "front": "minecraft:block/beehive_front_honey", + "particle": "minecraft:block/beehive_side", + "side": "minecraft:block/beehive_side", + "top": "minecraft:block/beehive_end" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/beetroot.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/beetroot.json new file mode 100644 index 000000000..dcc7276a1 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/beetroot.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/beetroot" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/beetroot_seeds.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/beetroot_seeds.json new file mode 100644 index 000000000..d20b2cd44 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/beetroot_seeds.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/beetroot_seeds" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/beetroot_soup.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/beetroot_soup.json new file mode 100644 index 000000000..3a0755d68 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/beetroot_soup.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/beetroot_soup" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/bell.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/bell.json new file mode 100644 index 000000000..fe24c1f4c --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/bell.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/bell" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/big_dripleaf.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/big_dripleaf.json new file mode 100644 index 000000000..56cc7f0ed --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/big_dripleaf.json @@ -0,0 +1,25 @@ +{ + "parent": "minecraft:block/big_dripleaf", + "display": { + "gui": { + "rotation": [ 30, 225, 0 ], + "translation": [ 0, -2, 0], + "scale":[ 0.625, 0.625, 0.625 ] + }, + "fixed": { + "rotation": [ 0, 0, 0 ], + "translation": [ 0, 0, -1 ], + "scale":[ 0.5, 0.5, 0.5 ] + }, + "thirdperson_righthand": { + "rotation": [ 0, 0, 0 ], + "translation": [ 0, 1, 0 ], + "scale": [ 0.55, 0.55, 0.55 ] + }, + "firstperson_righthand": { + "rotation": [ 0, 0, 0 ], + "translation": [ 1.13, 0, 1.13], + "scale": [ 0.68, 0.68, 0.68 ] + } + } +} diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/birch_boat.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/birch_boat.json new file mode 100644 index 000000000..20f68b32d --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/birch_boat.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/birch_boat" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/birch_button.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/birch_button.json new file mode 100644 index 000000000..f0065c479 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/birch_button.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/birch_button_inventory" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/birch_chest_boat.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/birch_chest_boat.json new file mode 100644 index 000000000..b7549aeb9 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/birch_chest_boat.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/birch_chest_boat" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/birch_door.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/birch_door.json new file mode 100644 index 000000000..2b0e4f916 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/birch_door.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/birch_door" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/birch_fence.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/birch_fence.json new file mode 100644 index 000000000..ca097fb1a --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/birch_fence.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/birch_fence_inventory" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/birch_fence_gate.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/birch_fence_gate.json new file mode 100644 index 000000000..732026b87 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/birch_fence_gate.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/birch_fence_gate" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/birch_hanging_sign.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/birch_hanging_sign.json new file mode 100644 index 000000000..9d15f706c --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/birch_hanging_sign.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/birch_hanging_sign" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/birch_leaves.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/birch_leaves.json new file mode 100644 index 000000000..4f543d46a --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/birch_leaves.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/birch_leaves" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/birch_log.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/birch_log.json new file mode 100644 index 000000000..cd42b0b7a --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/birch_log.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/birch_log" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/birch_planks.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/birch_planks.json new file mode 100644 index 000000000..06e3a6d36 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/birch_planks.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/birch_planks" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/birch_pressure_plate.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/birch_pressure_plate.json new file mode 100644 index 000000000..e8dfb6427 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/birch_pressure_plate.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/birch_pressure_plate" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/birch_sapling.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/birch_sapling.json new file mode 100644 index 000000000..3c45f3b6a --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/birch_sapling.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:block/birch_sapling" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/birch_sign.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/birch_sign.json new file mode 100644 index 000000000..d10beadcd --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/birch_sign.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/birch_sign" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/birch_slab.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/birch_slab.json new file mode 100644 index 000000000..c17a8e794 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/birch_slab.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/birch_slab" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/birch_stairs.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/birch_stairs.json new file mode 100644 index 000000000..ec8fd2b96 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/birch_stairs.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/birch_stairs" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/birch_trapdoor.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/birch_trapdoor.json new file mode 100644 index 000000000..7db49741f --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/birch_trapdoor.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/birch_trapdoor_bottom" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/birch_wood.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/birch_wood.json new file mode 100644 index 000000000..cd1881b08 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/birch_wood.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/birch_wood" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/black_banner.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/black_banner.json new file mode 100644 index 000000000..661a106df --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/black_banner.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:item/template_banner" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/black_bed.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/black_bed.json new file mode 100644 index 000000000..c8757a9ae --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/black_bed.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/template_bed", + "textures": { + "particle": "minecraft:block/black_wool" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/black_bundle.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/black_bundle.json new file mode 100644 index 000000000..84299e450 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/black_bundle.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/black_bundle" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/black_bundle_open_back.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/black_bundle_open_back.json new file mode 100644 index 000000000..863e592b8 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/black_bundle_open_back.json @@ -0,0 +1,6 @@ +{ + "parent": "item/bundle", + "textures": { + "layer0": "item/black_bundle_open_back" + } +} diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/black_bundle_open_front.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/black_bundle_open_front.json new file mode 100644 index 000000000..d0159a8fd --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/black_bundle_open_front.json @@ -0,0 +1,6 @@ +{ + "parent": "item/bundle", + "textures": { + "layer0": "item/black_bundle_open_front" + } +} diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/black_candle.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/black_candle.json new file mode 100644 index 000000000..837c9349a --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/black_candle.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/black_candle" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/black_carpet.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/black_carpet.json new file mode 100644 index 000000000..618d21305 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/black_carpet.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/black_carpet" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/black_concrete.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/black_concrete.json new file mode 100644 index 000000000..eb5aadc33 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/black_concrete.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/black_concrete" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/black_concrete_powder.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/black_concrete_powder.json new file mode 100644 index 000000000..03af09ea0 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/black_concrete_powder.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/black_concrete_powder" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/black_dye.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/black_dye.json new file mode 100644 index 000000000..0502b4054 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/black_dye.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/black_dye" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/black_glazed_terracotta.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/black_glazed_terracotta.json new file mode 100644 index 000000000..e1f73ff88 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/black_glazed_terracotta.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/black_glazed_terracotta" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/black_shulker_box.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/black_shulker_box.json new file mode 100644 index 000000000..5f45328d1 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/black_shulker_box.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/template_shulker_box", + "textures": { + "particle": "minecraft:block/black_shulker_box" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/black_stained_glass.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/black_stained_glass.json new file mode 100644 index 000000000..dfc8fab34 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/black_stained_glass.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/black_stained_glass" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/black_stained_glass_pane.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/black_stained_glass_pane.json new file mode 100644 index 000000000..75081749e --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/black_stained_glass_pane.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:block/black_stained_glass" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/black_terracotta.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/black_terracotta.json new file mode 100644 index 000000000..eee57e8e1 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/black_terracotta.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/black_terracotta" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/black_wool.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/black_wool.json new file mode 100644 index 000000000..a0e49abc2 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/black_wool.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/black_wool" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/blackstone.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/blackstone.json new file mode 100644 index 000000000..e4defbd65 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/blackstone.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/blackstone" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/blackstone_slab.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/blackstone_slab.json new file mode 100644 index 000000000..481376f49 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/blackstone_slab.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/blackstone_slab" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/blackstone_stairs.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/blackstone_stairs.json new file mode 100644 index 000000000..83a61e181 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/blackstone_stairs.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/blackstone_stairs" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/blackstone_wall.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/blackstone_wall.json new file mode 100644 index 000000000..8c2bc6d61 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/blackstone_wall.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/blackstone_wall_inventory" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/blade_pottery_sherd.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/blade_pottery_sherd.json new file mode 100644 index 000000000..0795cc804 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/blade_pottery_sherd.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/blade_pottery_sherd" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/blast_furnace.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/blast_furnace.json new file mode 100644 index 000000000..5189a0134 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/blast_furnace.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/blast_furnace" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/blaze_powder.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/blaze_powder.json new file mode 100644 index 000000000..1e735c193 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/blaze_powder.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/blaze_powder" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/blaze_rod.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/blaze_rod.json new file mode 100644 index 000000000..2c8c052a6 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/blaze_rod.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/handheld", + "textures": { + "layer0": "minecraft:item/blaze_rod" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/blaze_spawn_egg.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/blaze_spawn_egg.json new file mode 100644 index 000000000..d1aaa9d6e --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/blaze_spawn_egg.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:item/template_spawn_egg" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/blue_banner.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/blue_banner.json new file mode 100644 index 000000000..661a106df --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/blue_banner.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:item/template_banner" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/blue_bed.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/blue_bed.json new file mode 100644 index 000000000..59f7f2ba3 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/blue_bed.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/template_bed", + "textures": { + "particle": "minecraft:block/blue_wool" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/blue_bundle.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/blue_bundle.json new file mode 100644 index 000000000..f6005a3c9 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/blue_bundle.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/blue_bundle" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/blue_bundle_open_back.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/blue_bundle_open_back.json new file mode 100644 index 000000000..29011ca3e --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/blue_bundle_open_back.json @@ -0,0 +1,6 @@ +{ + "parent": "item/bundle", + "textures": { + "layer0": "item/blue_bundle_open_back" + } +} diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/blue_bundle_open_front.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/blue_bundle_open_front.json new file mode 100644 index 000000000..0dca2593f --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/blue_bundle_open_front.json @@ -0,0 +1,6 @@ +{ + "parent": "item/bundle", + "textures": { + "layer0": "item/blue_bundle_open_front" + } +} diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/blue_candle.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/blue_candle.json new file mode 100644 index 000000000..e561230f5 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/blue_candle.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/blue_candle" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/blue_carpet.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/blue_carpet.json new file mode 100644 index 000000000..0ced6287e --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/blue_carpet.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/blue_carpet" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/blue_concrete.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/blue_concrete.json new file mode 100644 index 000000000..4c15897c1 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/blue_concrete.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/blue_concrete" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/blue_concrete_powder.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/blue_concrete_powder.json new file mode 100644 index 000000000..e5f13d4a5 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/blue_concrete_powder.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/blue_concrete_powder" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/blue_dye.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/blue_dye.json new file mode 100644 index 000000000..4235b5988 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/blue_dye.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/blue_dye" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/blue_glazed_terracotta.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/blue_glazed_terracotta.json new file mode 100644 index 000000000..f7b0efbbc --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/blue_glazed_terracotta.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/blue_glazed_terracotta" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/blue_ice.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/blue_ice.json new file mode 100644 index 000000000..86d267e58 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/blue_ice.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/blue_ice" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/blue_orchid.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/blue_orchid.json new file mode 100644 index 000000000..13449dc1a --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/blue_orchid.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:block/blue_orchid" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/blue_shulker_box.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/blue_shulker_box.json new file mode 100644 index 000000000..62a9dfd81 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/blue_shulker_box.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/template_shulker_box", + "textures": { + "particle": "minecraft:block/blue_shulker_box" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/blue_stained_glass.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/blue_stained_glass.json new file mode 100644 index 000000000..c3727cd87 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/blue_stained_glass.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/blue_stained_glass" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/blue_stained_glass_pane.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/blue_stained_glass_pane.json new file mode 100644 index 000000000..c48900628 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/blue_stained_glass_pane.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:block/blue_stained_glass" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/blue_terracotta.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/blue_terracotta.json new file mode 100644 index 000000000..a89b057d0 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/blue_terracotta.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/blue_terracotta" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/blue_wool.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/blue_wool.json new file mode 100644 index 000000000..22458dbdf --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/blue_wool.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/blue_wool" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/bogged_spawn_egg.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/bogged_spawn_egg.json new file mode 100644 index 000000000..d1aaa9d6e --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/bogged_spawn_egg.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:item/template_spawn_egg" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/bolt_armor_trim_smithing_template.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/bolt_armor_trim_smithing_template.json new file mode 100644 index 000000000..dfaada50d --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/bolt_armor_trim_smithing_template.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/bolt_armor_trim_smithing_template" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/bone.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/bone.json new file mode 100644 index 000000000..3063401c6 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/bone.json @@ -0,0 +1,13 @@ +{ + "parent": "item/handheld", + "textures": { + "layer0": "item/bone" + }, + "display": { + "head": { + "rotation": [ 0, 0, -45 ], + "translation": [ 0, -4.5, -6.5], + "scale":[ 1, 1, 1 ] + } + } +} diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/bone_block.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/bone_block.json new file mode 100644 index 000000000..1374ccda6 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/bone_block.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/bone_block" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/bone_meal.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/bone_meal.json new file mode 100644 index 000000000..60f7c5f09 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/bone_meal.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/bone_meal" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/book.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/book.json new file mode 100644 index 000000000..1ca201bfe --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/book.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/book" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/bookshelf.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/bookshelf.json new file mode 100644 index 000000000..57943d425 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/bookshelf.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/bookshelf" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/bordure_indented_banner_pattern.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/bordure_indented_banner_pattern.json new file mode 100644 index 000000000..02706b20c --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/bordure_indented_banner_pattern.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/bordure_indented_banner_pattern" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/bow.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/bow.json new file mode 100644 index 000000000..c2128757d --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/bow.json @@ -0,0 +1,50 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "item/bow" + }, + "display": { + "thirdperson_righthand": { + "rotation": [ -80, 260, -40 ], + "translation": [ -1, -2, 2.5 ], + "scale": [ 0.9, 0.9, 0.9 ] + }, + "thirdperson_lefthand": { + "rotation": [ -80, -280, 40 ], + "translation": [ -1, -2, 2.5 ], + "scale": [ 0.9, 0.9, 0.9 ] + }, + "firstperson_righthand": { + "rotation": [ 0, -90, 25 ], + "translation": [ 1.13, 3.2, 1.13], + "scale": [ 0.68, 0.68, 0.68 ] + }, + "firstperson_lefthand": { + "rotation": [ 0, 90, -25 ], + "translation": [ 1.13, 3.2, 1.13], + "scale": [ 0.68, 0.68, 0.68 ] + } + }, + "overrides": [ + { + "predicate": { + "pulling": 1 + }, + "model": "item/bow_pulling_0" + }, + { + "predicate": { + "pulling": 1, + "pull": 0.65 + }, + "model": "item/bow_pulling_1" + }, + { + "predicate": { + "pulling": 1, + "pull": 0.9 + }, + "model": "item/bow_pulling_2" + } + ] +} diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/bow_pulling_0.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/bow_pulling_0.json new file mode 100644 index 000000000..8a44db208 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/bow_pulling_0.json @@ -0,0 +1,6 @@ +{ + "parent": "item/bow", + "textures": { + "layer0": "item/bow_pulling_0" + } +} diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/bow_pulling_1.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/bow_pulling_1.json new file mode 100644 index 000000000..5fd94893b --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/bow_pulling_1.json @@ -0,0 +1,6 @@ +{ + "parent": "item/bow", + "textures": { + "layer0": "item/bow_pulling_1" + } +} diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/bow_pulling_2.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/bow_pulling_2.json new file mode 100644 index 000000000..8584d5b3d --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/bow_pulling_2.json @@ -0,0 +1,6 @@ +{ + "parent": "item/bow", + "textures": { + "layer0": "item/bow_pulling_2" + } +} diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/bowl.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/bowl.json new file mode 100644 index 000000000..d6a579ca4 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/bowl.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/bowl" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/brain_coral.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/brain_coral.json new file mode 100644 index 000000000..68c13d9d0 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/brain_coral.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:block/brain_coral" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/brain_coral_block.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/brain_coral_block.json new file mode 100644 index 000000000..04d112ab0 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/brain_coral_block.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/brain_coral_block" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/brain_coral_fan.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/brain_coral_fan.json new file mode 100644 index 000000000..9b00117a0 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/brain_coral_fan.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:block/brain_coral_fan" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/bread.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/bread.json new file mode 100644 index 000000000..9f62cd758 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/bread.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/bread" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/breeze_rod.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/breeze_rod.json new file mode 100644 index 000000000..3e621f36d --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/breeze_rod.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/handheld", + "textures": { + "layer0": "minecraft:item/breeze_rod" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/breeze_spawn_egg.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/breeze_spawn_egg.json new file mode 100644 index 000000000..d1aaa9d6e --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/breeze_spawn_egg.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:item/template_spawn_egg" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/brewer_pottery_sherd.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/brewer_pottery_sherd.json new file mode 100644 index 000000000..88b36e178 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/brewer_pottery_sherd.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/brewer_pottery_sherd" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/brewing_stand.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/brewing_stand.json new file mode 100644 index 000000000..414f4eccd --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/brewing_stand.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/brewing_stand" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/brick.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/brick.json new file mode 100644 index 000000000..4ba38e868 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/brick.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/brick" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/brick_slab.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/brick_slab.json new file mode 100644 index 000000000..754deec6c --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/brick_slab.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/brick_slab" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/brick_stairs.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/brick_stairs.json new file mode 100644 index 000000000..2a2318dce --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/brick_stairs.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/brick_stairs" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/brick_wall.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/brick_wall.json new file mode 100644 index 000000000..52dcc04ef --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/brick_wall.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/brick_wall_inventory" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/bricks.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/bricks.json new file mode 100644 index 000000000..dd257a865 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/bricks.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/bricks" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/broken_elytra.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/broken_elytra.json new file mode 100644 index 000000000..ca77df44f --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/broken_elytra.json @@ -0,0 +1,6 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "item/broken_elytra" + } +} diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/brown_banner.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/brown_banner.json new file mode 100644 index 000000000..661a106df --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/brown_banner.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:item/template_banner" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/brown_bed.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/brown_bed.json new file mode 100644 index 000000000..fd4abaa04 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/brown_bed.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/template_bed", + "textures": { + "particle": "minecraft:block/brown_wool" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/brown_bundle.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/brown_bundle.json new file mode 100644 index 000000000..7f289642b --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/brown_bundle.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/brown_bundle" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/brown_bundle_open_back.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/brown_bundle_open_back.json new file mode 100644 index 000000000..bf1e27b07 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/brown_bundle_open_back.json @@ -0,0 +1,6 @@ +{ + "parent": "item/bundle", + "textures": { + "layer0": "item/brown_bundle_open_back" + } +} diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/brown_bundle_open_front.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/brown_bundle_open_front.json new file mode 100644 index 000000000..637ad47e0 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/brown_bundle_open_front.json @@ -0,0 +1,6 @@ +{ + "parent": "item/bundle", + "textures": { + "layer0": "item/brown_bundle_open_front" + } +} diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/brown_candle.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/brown_candle.json new file mode 100644 index 000000000..0486b2818 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/brown_candle.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/brown_candle" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/brown_carpet.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/brown_carpet.json new file mode 100644 index 000000000..144ce5ad6 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/brown_carpet.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/brown_carpet" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/brown_concrete.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/brown_concrete.json new file mode 100644 index 000000000..7aec153e9 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/brown_concrete.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/brown_concrete" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/brown_concrete_powder.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/brown_concrete_powder.json new file mode 100644 index 000000000..e228eaaa9 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/brown_concrete_powder.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/brown_concrete_powder" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/brown_dye.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/brown_dye.json new file mode 100644 index 000000000..d9cb87fbf --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/brown_dye.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/brown_dye" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/brown_glazed_terracotta.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/brown_glazed_terracotta.json new file mode 100644 index 000000000..8ed9bac45 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/brown_glazed_terracotta.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/brown_glazed_terracotta" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/brown_mushroom.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/brown_mushroom.json new file mode 100644 index 000000000..f1779d5c9 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/brown_mushroom.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:block/brown_mushroom" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/brown_mushroom_block.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/brown_mushroom_block.json new file mode 100644 index 000000000..c9d6b06e7 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/brown_mushroom_block.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/brown_mushroom_block_inventory" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/brown_shulker_box.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/brown_shulker_box.json new file mode 100644 index 000000000..c28ee18a0 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/brown_shulker_box.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/template_shulker_box", + "textures": { + "particle": "minecraft:block/brown_shulker_box" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/brown_stained_glass.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/brown_stained_glass.json new file mode 100644 index 000000000..a3aac5722 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/brown_stained_glass.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/brown_stained_glass" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/brown_stained_glass_pane.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/brown_stained_glass_pane.json new file mode 100644 index 000000000..0a40ae5fc --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/brown_stained_glass_pane.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:block/brown_stained_glass" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/brown_terracotta.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/brown_terracotta.json new file mode 100644 index 000000000..17f524a73 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/brown_terracotta.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/brown_terracotta" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/brown_wool.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/brown_wool.json new file mode 100644 index 000000000..85520a1bc --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/brown_wool.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/brown_wool" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/brush.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/brush.json new file mode 100644 index 000000000..231aa70cd --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/brush.json @@ -0,0 +1,43 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "item/brush" + }, + "display": { + "firstperson_lefthand": { + "rotation": [ 55, -85, 0 ], + "translation": [ 8.0, 0.5, -5.5 ], + "scale": [ 1.0, 1.0, 1.0 ] + }, + "thirdperson_righthand": { + "rotation": [ 0, 0, 45 ], + "translation": [ 0, 4, 0 ], + "scale": [ 0.9, 0.9, 0.9 ] + }, + "thirdperson_lefthand": { + "rotation": [ 0, 0, -45 ], + "translation": [ 0, 4, 0 ], + "scale": [ 0.9, 0.9, 0.9 ] + } + }, + "overrides": [ + { + "predicate": { + "brushing": 0.25 + }, + "model": "item/brush_brushing_0" + }, + { + "predicate": { + "brushing": 0.5 + }, + "model": "item/brush_brushing_1" + }, + { + "predicate": { + "brushing": 0.75 + }, + "model": "item/brush_brushing_2" + } + ] +} diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/brush_brushing_0.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/brush_brushing_0.json new file mode 100644 index 000000000..672921573 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/brush_brushing_0.json @@ -0,0 +1,23 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "item/brush" + }, + "display": { + "firstperson_lefthand": { + "rotation": [ 55, -85, 0 ], + "translation": [ 8.0, 0.5, -5.5 ], + "scale": [ 1.0, 1.0, 1.0 ] + }, + "thirdperson_righthand": { + "rotation": [ 0, 0, 0 ], + "translation": [ 4, 2, 0 ], + "scale": [ 0.9, 0.9, 0.9 ] + }, + "thirdperson_lefthand": { + "rotation": [ 0, 0, 0], + "translation": [ -4, 2, 0 ], + "scale": [ 0.9, 0.9, 0.9 ] + } + } +} diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/brush_brushing_1.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/brush_brushing_1.json new file mode 100644 index 000000000..8973ac981 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/brush_brushing_1.json @@ -0,0 +1,23 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "item/brush" + }, + "display": { + "firstperson_lefthand": { + "rotation": [ 55, -85, 0 ], + "translation": [ 8.0, 0.5, -5.5 ], + "scale": [ 1.0, 1.0, 1.0 ] + }, + "thirdperson_righthand": { + "rotation": [ 0, 0, 45 ], + "translation": [ 0, 4, 0 ], + "scale": [ 0.9, 0.9, 0.9 ] + }, + "thirdperson_lefthand": { + "rotation": [ 0, 0, -45 ], + "translation": [ 0, 4, 0 ], + "scale": [ 0.9, 0.9, 0.9 ] + } + } +} diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/brush_brushing_2.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/brush_brushing_2.json new file mode 100644 index 000000000..729697bec --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/brush_brushing_2.json @@ -0,0 +1,23 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "item/brush" + }, + "display": { + "firstperson_lefthand": { + "rotation": [ 55, -85, 0 ], + "translation": [ 8.0, 0.5, -5.5 ], + "scale": [ 1.0, 1.0, 1.0 ] + }, + "thirdperson_righthand": { + "rotation": [ 0, 0, 90 ], + "translation": [ -4, 2, 0 ], + "scale": [ 0.9, 0.9, 0.9 ] + }, + "thirdperson_lefthand": { + "rotation": [ 0, 0, -90 ], + "translation": [ 4, 2, 0 ], + "scale": [ 0.9, 0.9, 0.9 ] + } + } +} diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/bubble_coral.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/bubble_coral.json new file mode 100644 index 000000000..8d8ea3f8e --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/bubble_coral.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:block/bubble_coral" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/bubble_coral_block.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/bubble_coral_block.json new file mode 100644 index 000000000..05a1309f6 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/bubble_coral_block.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/bubble_coral_block" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/bubble_coral_fan.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/bubble_coral_fan.json new file mode 100644 index 000000000..40a144167 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/bubble_coral_fan.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:block/bubble_coral_fan" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/bucket.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/bucket.json new file mode 100644 index 000000000..727318a40 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/bucket.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/bucket" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/budding_amethyst.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/budding_amethyst.json new file mode 100644 index 000000000..c210bd6e9 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/budding_amethyst.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/budding_amethyst" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/bundle.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/bundle.json new file mode 100644 index 000000000..af189a9c9 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/bundle.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/bundle" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/bundle_open_back.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/bundle_open_back.json new file mode 100644 index 000000000..66851f188 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/bundle_open_back.json @@ -0,0 +1,6 @@ +{ + "parent": "item/bundle", + "textures": { + "layer0": "item/bundle_open_back" + } +} diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/bundle_open_front.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/bundle_open_front.json new file mode 100644 index 000000000..9c2545706 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/bundle_open_front.json @@ -0,0 +1,6 @@ +{ + "parent": "item/bundle", + "textures": { + "layer0": "item/bundle_open_front" + } +} diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/burn_pottery_sherd.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/burn_pottery_sherd.json new file mode 100644 index 000000000..1c81d466b --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/burn_pottery_sherd.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/burn_pottery_sherd" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/cactus.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/cactus.json new file mode 100644 index 000000000..d1413ecfa --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/cactus.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/cactus" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/cake.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/cake.json new file mode 100644 index 000000000..70a9bd0af --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/cake.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/cake" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/calcite.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/calcite.json new file mode 100644 index 000000000..11a880b3c --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/calcite.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/calcite" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/calibrated_sculk_sensor.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/calibrated_sculk_sensor.json new file mode 100644 index 000000000..d99476e50 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/calibrated_sculk_sensor.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/calibrated_sculk_sensor_inactive" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/camel_spawn_egg.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/camel_spawn_egg.json new file mode 100644 index 000000000..d1aaa9d6e --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/camel_spawn_egg.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:item/template_spawn_egg" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/campfire.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/campfire.json new file mode 100644 index 000000000..8042feb6d --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/campfire.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/campfire" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/candle.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/candle.json new file mode 100644 index 000000000..9e4f4d11a --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/candle.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/candle" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/carrot.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/carrot.json new file mode 100644 index 000000000..3fe4125ee --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/carrot.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/carrot" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/carrot_on_a_stick.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/carrot_on_a_stick.json new file mode 100644 index 000000000..a768c1f25 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/carrot_on_a_stick.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/handheld_rod", + "textures": { + "layer0": "minecraft:item/carrot_on_a_stick" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/cartography_table.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/cartography_table.json new file mode 100644 index 000000000..b7fe4e474 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/cartography_table.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/cartography_table" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/carved_pumpkin.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/carved_pumpkin.json new file mode 100644 index 000000000..54f009c07 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/carved_pumpkin.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/carved_pumpkin" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/cat_spawn_egg.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/cat_spawn_egg.json new file mode 100644 index 000000000..d1aaa9d6e --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/cat_spawn_egg.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:item/template_spawn_egg" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/cauldron.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/cauldron.json new file mode 100644 index 000000000..43b8a2480 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/cauldron.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/cauldron" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/cave_spider_spawn_egg.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/cave_spider_spawn_egg.json new file mode 100644 index 000000000..d1aaa9d6e --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/cave_spider_spawn_egg.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:item/template_spawn_egg" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/chain.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/chain.json new file mode 100644 index 000000000..c6ed30bf1 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/chain.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/chain" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/chain_command_block.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/chain_command_block.json new file mode 100644 index 000000000..44af865a8 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/chain_command_block.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/chain_command_block" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/chainmail_boots.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/chainmail_boots.json new file mode 100644 index 000000000..1e54e8c65 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/chainmail_boots.json @@ -0,0 +1,68 @@ +{ + "parent": "minecraft:item/generated", + "overrides": [ + { + "model": "minecraft:item/chainmail_boots_quartz_trim", + "predicate": { + "trim_type": 0.1 + } + }, + { + "model": "minecraft:item/chainmail_boots_iron_trim", + "predicate": { + "trim_type": 0.2 + } + }, + { + "model": "minecraft:item/chainmail_boots_netherite_trim", + "predicate": { + "trim_type": 0.3 + } + }, + { + "model": "minecraft:item/chainmail_boots_redstone_trim", + "predicate": { + "trim_type": 0.4 + } + }, + { + "model": "minecraft:item/chainmail_boots_copper_trim", + "predicate": { + "trim_type": 0.5 + } + }, + { + "model": "minecraft:item/chainmail_boots_gold_trim", + "predicate": { + "trim_type": 0.6 + } + }, + { + "model": "minecraft:item/chainmail_boots_emerald_trim", + "predicate": { + "trim_type": 0.7 + } + }, + { + "model": "minecraft:item/chainmail_boots_diamond_trim", + "predicate": { + "trim_type": 0.8 + } + }, + { + "model": "minecraft:item/chainmail_boots_lapis_trim", + "predicate": { + "trim_type": 0.9 + } + }, + { + "model": "minecraft:item/chainmail_boots_amethyst_trim", + "predicate": { + "trim_type": 1.0 + } + } + ], + "textures": { + "layer0": "minecraft:item/chainmail_boots" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/chainmail_boots_amethyst_trim.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/chainmail_boots_amethyst_trim.json new file mode 100644 index 000000000..14ea3c2b1 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/chainmail_boots_amethyst_trim.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/chainmail_boots", + "layer1": "minecraft:trims/items/boots_trim_amethyst" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/chainmail_boots_copper_trim.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/chainmail_boots_copper_trim.json new file mode 100644 index 000000000..d05f56ae5 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/chainmail_boots_copper_trim.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/chainmail_boots", + "layer1": "minecraft:trims/items/boots_trim_copper" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/chainmail_boots_diamond_trim.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/chainmail_boots_diamond_trim.json new file mode 100644 index 000000000..c66f7f1cc --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/chainmail_boots_diamond_trim.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/chainmail_boots", + "layer1": "minecraft:trims/items/boots_trim_diamond" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/chainmail_boots_emerald_trim.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/chainmail_boots_emerald_trim.json new file mode 100644 index 000000000..748078fe8 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/chainmail_boots_emerald_trim.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/chainmail_boots", + "layer1": "minecraft:trims/items/boots_trim_emerald" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/chainmail_boots_gold_trim.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/chainmail_boots_gold_trim.json new file mode 100644 index 000000000..6be04b71a --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/chainmail_boots_gold_trim.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/chainmail_boots", + "layer1": "minecraft:trims/items/boots_trim_gold" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/chainmail_boots_iron_trim.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/chainmail_boots_iron_trim.json new file mode 100644 index 000000000..fc71c6d8b --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/chainmail_boots_iron_trim.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/chainmail_boots", + "layer1": "minecraft:trims/items/boots_trim_iron" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/chainmail_boots_lapis_trim.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/chainmail_boots_lapis_trim.json new file mode 100644 index 000000000..105d7c72d --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/chainmail_boots_lapis_trim.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/chainmail_boots", + "layer1": "minecraft:trims/items/boots_trim_lapis" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/chainmail_boots_netherite_trim.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/chainmail_boots_netherite_trim.json new file mode 100644 index 000000000..ecc9975e1 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/chainmail_boots_netherite_trim.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/chainmail_boots", + "layer1": "minecraft:trims/items/boots_trim_netherite" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/chainmail_boots_quartz_trim.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/chainmail_boots_quartz_trim.json new file mode 100644 index 000000000..2657964ae --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/chainmail_boots_quartz_trim.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/chainmail_boots", + "layer1": "minecraft:trims/items/boots_trim_quartz" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/chainmail_boots_redstone_trim.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/chainmail_boots_redstone_trim.json new file mode 100644 index 000000000..48eee0190 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/chainmail_boots_redstone_trim.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/chainmail_boots", + "layer1": "minecraft:trims/items/boots_trim_redstone" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/chainmail_chestplate.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/chainmail_chestplate.json new file mode 100644 index 000000000..0bdb24bb8 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/chainmail_chestplate.json @@ -0,0 +1,68 @@ +{ + "parent": "minecraft:item/generated", + "overrides": [ + { + "model": "minecraft:item/chainmail_chestplate_quartz_trim", + "predicate": { + "trim_type": 0.1 + } + }, + { + "model": "minecraft:item/chainmail_chestplate_iron_trim", + "predicate": { + "trim_type": 0.2 + } + }, + { + "model": "minecraft:item/chainmail_chestplate_netherite_trim", + "predicate": { + "trim_type": 0.3 + } + }, + { + "model": "minecraft:item/chainmail_chestplate_redstone_trim", + "predicate": { + "trim_type": 0.4 + } + }, + { + "model": "minecraft:item/chainmail_chestplate_copper_trim", + "predicate": { + "trim_type": 0.5 + } + }, + { + "model": "minecraft:item/chainmail_chestplate_gold_trim", + "predicate": { + "trim_type": 0.6 + } + }, + { + "model": "minecraft:item/chainmail_chestplate_emerald_trim", + "predicate": { + "trim_type": 0.7 + } + }, + { + "model": "minecraft:item/chainmail_chestplate_diamond_trim", + "predicate": { + "trim_type": 0.8 + } + }, + { + "model": "minecraft:item/chainmail_chestplate_lapis_trim", + "predicate": { + "trim_type": 0.9 + } + }, + { + "model": "minecraft:item/chainmail_chestplate_amethyst_trim", + "predicate": { + "trim_type": 1.0 + } + } + ], + "textures": { + "layer0": "minecraft:item/chainmail_chestplate" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/chainmail_chestplate_amethyst_trim.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/chainmail_chestplate_amethyst_trim.json new file mode 100644 index 000000000..d3af51849 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/chainmail_chestplate_amethyst_trim.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/chainmail_chestplate", + "layer1": "minecraft:trims/items/chestplate_trim_amethyst" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/chainmail_chestplate_copper_trim.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/chainmail_chestplate_copper_trim.json new file mode 100644 index 000000000..7c8c3c439 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/chainmail_chestplate_copper_trim.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/chainmail_chestplate", + "layer1": "minecraft:trims/items/chestplate_trim_copper" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/chainmail_chestplate_diamond_trim.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/chainmail_chestplate_diamond_trim.json new file mode 100644 index 000000000..374ccdb9a --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/chainmail_chestplate_diamond_trim.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/chainmail_chestplate", + "layer1": "minecraft:trims/items/chestplate_trim_diamond" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/chainmail_chestplate_emerald_trim.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/chainmail_chestplate_emerald_trim.json new file mode 100644 index 000000000..3e871cda2 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/chainmail_chestplate_emerald_trim.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/chainmail_chestplate", + "layer1": "minecraft:trims/items/chestplate_trim_emerald" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/chainmail_chestplate_gold_trim.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/chainmail_chestplate_gold_trim.json new file mode 100644 index 000000000..cc80f46da --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/chainmail_chestplate_gold_trim.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/chainmail_chestplate", + "layer1": "minecraft:trims/items/chestplate_trim_gold" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/chainmail_chestplate_iron_trim.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/chainmail_chestplate_iron_trim.json new file mode 100644 index 000000000..81a5242c5 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/chainmail_chestplate_iron_trim.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/chainmail_chestplate", + "layer1": "minecraft:trims/items/chestplate_trim_iron" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/chainmail_chestplate_lapis_trim.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/chainmail_chestplate_lapis_trim.json new file mode 100644 index 000000000..865560ab4 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/chainmail_chestplate_lapis_trim.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/chainmail_chestplate", + "layer1": "minecraft:trims/items/chestplate_trim_lapis" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/chainmail_chestplate_netherite_trim.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/chainmail_chestplate_netherite_trim.json new file mode 100644 index 000000000..4c9e2289d --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/chainmail_chestplate_netherite_trim.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/chainmail_chestplate", + "layer1": "minecraft:trims/items/chestplate_trim_netherite" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/chainmail_chestplate_quartz_trim.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/chainmail_chestplate_quartz_trim.json new file mode 100644 index 000000000..291441ae8 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/chainmail_chestplate_quartz_trim.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/chainmail_chestplate", + "layer1": "minecraft:trims/items/chestplate_trim_quartz" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/chainmail_chestplate_redstone_trim.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/chainmail_chestplate_redstone_trim.json new file mode 100644 index 000000000..4ee218315 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/chainmail_chestplate_redstone_trim.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/chainmail_chestplate", + "layer1": "minecraft:trims/items/chestplate_trim_redstone" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/chainmail_helmet.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/chainmail_helmet.json new file mode 100644 index 000000000..dc35c600d --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/chainmail_helmet.json @@ -0,0 +1,68 @@ +{ + "parent": "minecraft:item/generated", + "overrides": [ + { + "model": "minecraft:item/chainmail_helmet_quartz_trim", + "predicate": { + "trim_type": 0.1 + } + }, + { + "model": "minecraft:item/chainmail_helmet_iron_trim", + "predicate": { + "trim_type": 0.2 + } + }, + { + "model": "minecraft:item/chainmail_helmet_netherite_trim", + "predicate": { + "trim_type": 0.3 + } + }, + { + "model": "minecraft:item/chainmail_helmet_redstone_trim", + "predicate": { + "trim_type": 0.4 + } + }, + { + "model": "minecraft:item/chainmail_helmet_copper_trim", + "predicate": { + "trim_type": 0.5 + } + }, + { + "model": "minecraft:item/chainmail_helmet_gold_trim", + "predicate": { + "trim_type": 0.6 + } + }, + { + "model": "minecraft:item/chainmail_helmet_emerald_trim", + "predicate": { + "trim_type": 0.7 + } + }, + { + "model": "minecraft:item/chainmail_helmet_diamond_trim", + "predicate": { + "trim_type": 0.8 + } + }, + { + "model": "minecraft:item/chainmail_helmet_lapis_trim", + "predicate": { + "trim_type": 0.9 + } + }, + { + "model": "minecraft:item/chainmail_helmet_amethyst_trim", + "predicate": { + "trim_type": 1.0 + } + } + ], + "textures": { + "layer0": "minecraft:item/chainmail_helmet" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/chainmail_helmet_amethyst_trim.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/chainmail_helmet_amethyst_trim.json new file mode 100644 index 000000000..d1fdcc920 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/chainmail_helmet_amethyst_trim.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/chainmail_helmet", + "layer1": "minecraft:trims/items/helmet_trim_amethyst" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/chainmail_helmet_copper_trim.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/chainmail_helmet_copper_trim.json new file mode 100644 index 000000000..ef16e96f3 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/chainmail_helmet_copper_trim.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/chainmail_helmet", + "layer1": "minecraft:trims/items/helmet_trim_copper" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/chainmail_helmet_diamond_trim.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/chainmail_helmet_diamond_trim.json new file mode 100644 index 000000000..e004f2d17 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/chainmail_helmet_diamond_trim.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/chainmail_helmet", + "layer1": "minecraft:trims/items/helmet_trim_diamond" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/chainmail_helmet_emerald_trim.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/chainmail_helmet_emerald_trim.json new file mode 100644 index 000000000..cf1b7fb64 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/chainmail_helmet_emerald_trim.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/chainmail_helmet", + "layer1": "minecraft:trims/items/helmet_trim_emerald" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/chainmail_helmet_gold_trim.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/chainmail_helmet_gold_trim.json new file mode 100644 index 000000000..c83e53433 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/chainmail_helmet_gold_trim.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/chainmail_helmet", + "layer1": "minecraft:trims/items/helmet_trim_gold" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/chainmail_helmet_iron_trim.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/chainmail_helmet_iron_trim.json new file mode 100644 index 000000000..56b43947f --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/chainmail_helmet_iron_trim.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/chainmail_helmet", + "layer1": "minecraft:trims/items/helmet_trim_iron" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/chainmail_helmet_lapis_trim.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/chainmail_helmet_lapis_trim.json new file mode 100644 index 000000000..8cae5aea5 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/chainmail_helmet_lapis_trim.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/chainmail_helmet", + "layer1": "minecraft:trims/items/helmet_trim_lapis" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/chainmail_helmet_netherite_trim.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/chainmail_helmet_netherite_trim.json new file mode 100644 index 000000000..d7b200160 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/chainmail_helmet_netherite_trim.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/chainmail_helmet", + "layer1": "minecraft:trims/items/helmet_trim_netherite" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/chainmail_helmet_quartz_trim.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/chainmail_helmet_quartz_trim.json new file mode 100644 index 000000000..83b8eba24 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/chainmail_helmet_quartz_trim.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/chainmail_helmet", + "layer1": "minecraft:trims/items/helmet_trim_quartz" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/chainmail_helmet_redstone_trim.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/chainmail_helmet_redstone_trim.json new file mode 100644 index 000000000..03406139f --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/chainmail_helmet_redstone_trim.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/chainmail_helmet", + "layer1": "minecraft:trims/items/helmet_trim_redstone" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/chainmail_leggings.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/chainmail_leggings.json new file mode 100644 index 000000000..23bebc655 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/chainmail_leggings.json @@ -0,0 +1,68 @@ +{ + "parent": "minecraft:item/generated", + "overrides": [ + { + "model": "minecraft:item/chainmail_leggings_quartz_trim", + "predicate": { + "trim_type": 0.1 + } + }, + { + "model": "minecraft:item/chainmail_leggings_iron_trim", + "predicate": { + "trim_type": 0.2 + } + }, + { + "model": "minecraft:item/chainmail_leggings_netherite_trim", + "predicate": { + "trim_type": 0.3 + } + }, + { + "model": "minecraft:item/chainmail_leggings_redstone_trim", + "predicate": { + "trim_type": 0.4 + } + }, + { + "model": "minecraft:item/chainmail_leggings_copper_trim", + "predicate": { + "trim_type": 0.5 + } + }, + { + "model": "minecraft:item/chainmail_leggings_gold_trim", + "predicate": { + "trim_type": 0.6 + } + }, + { + "model": "minecraft:item/chainmail_leggings_emerald_trim", + "predicate": { + "trim_type": 0.7 + } + }, + { + "model": "minecraft:item/chainmail_leggings_diamond_trim", + "predicate": { + "trim_type": 0.8 + } + }, + { + "model": "minecraft:item/chainmail_leggings_lapis_trim", + "predicate": { + "trim_type": 0.9 + } + }, + { + "model": "minecraft:item/chainmail_leggings_amethyst_trim", + "predicate": { + "trim_type": 1.0 + } + } + ], + "textures": { + "layer0": "minecraft:item/chainmail_leggings" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/chainmail_leggings_amethyst_trim.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/chainmail_leggings_amethyst_trim.json new file mode 100644 index 000000000..7c1b0e8f0 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/chainmail_leggings_amethyst_trim.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/chainmail_leggings", + "layer1": "minecraft:trims/items/leggings_trim_amethyst" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/chainmail_leggings_copper_trim.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/chainmail_leggings_copper_trim.json new file mode 100644 index 000000000..510189833 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/chainmail_leggings_copper_trim.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/chainmail_leggings", + "layer1": "minecraft:trims/items/leggings_trim_copper" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/chainmail_leggings_diamond_trim.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/chainmail_leggings_diamond_trim.json new file mode 100644 index 000000000..6344872e2 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/chainmail_leggings_diamond_trim.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/chainmail_leggings", + "layer1": "minecraft:trims/items/leggings_trim_diamond" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/chainmail_leggings_emerald_trim.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/chainmail_leggings_emerald_trim.json new file mode 100644 index 000000000..747b1f3a6 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/chainmail_leggings_emerald_trim.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/chainmail_leggings", + "layer1": "minecraft:trims/items/leggings_trim_emerald" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/chainmail_leggings_gold_trim.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/chainmail_leggings_gold_trim.json new file mode 100644 index 000000000..4d23f0579 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/chainmail_leggings_gold_trim.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/chainmail_leggings", + "layer1": "minecraft:trims/items/leggings_trim_gold" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/chainmail_leggings_iron_trim.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/chainmail_leggings_iron_trim.json new file mode 100644 index 000000000..71034c608 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/chainmail_leggings_iron_trim.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/chainmail_leggings", + "layer1": "minecraft:trims/items/leggings_trim_iron" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/chainmail_leggings_lapis_trim.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/chainmail_leggings_lapis_trim.json new file mode 100644 index 000000000..d54897c6c --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/chainmail_leggings_lapis_trim.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/chainmail_leggings", + "layer1": "minecraft:trims/items/leggings_trim_lapis" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/chainmail_leggings_netherite_trim.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/chainmail_leggings_netherite_trim.json new file mode 100644 index 000000000..ff14a3878 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/chainmail_leggings_netherite_trim.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/chainmail_leggings", + "layer1": "minecraft:trims/items/leggings_trim_netherite" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/chainmail_leggings_quartz_trim.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/chainmail_leggings_quartz_trim.json new file mode 100644 index 000000000..97a0aa847 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/chainmail_leggings_quartz_trim.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/chainmail_leggings", + "layer1": "minecraft:trims/items/leggings_trim_quartz" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/chainmail_leggings_redstone_trim.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/chainmail_leggings_redstone_trim.json new file mode 100644 index 000000000..8117e44af --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/chainmail_leggings_redstone_trim.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/chainmail_leggings", + "layer1": "minecraft:trims/items/leggings_trim_redstone" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/charcoal.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/charcoal.json new file mode 100644 index 000000000..d50222351 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/charcoal.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/charcoal" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/cherry_boat.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/cherry_boat.json new file mode 100644 index 000000000..dae18f875 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/cherry_boat.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/cherry_boat" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/cherry_button.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/cherry_button.json new file mode 100644 index 000000000..bec3bdc69 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/cherry_button.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/cherry_button_inventory" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/cherry_chest_boat.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/cherry_chest_boat.json new file mode 100644 index 000000000..3be1e98f8 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/cherry_chest_boat.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/cherry_chest_boat" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/cherry_door.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/cherry_door.json new file mode 100644 index 000000000..bd650f606 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/cherry_door.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/cherry_door" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/cherry_fence.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/cherry_fence.json new file mode 100644 index 000000000..ffe1fb32f --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/cherry_fence.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/cherry_fence_inventory" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/cherry_fence_gate.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/cherry_fence_gate.json new file mode 100644 index 000000000..b4137071d --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/cherry_fence_gate.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/cherry_fence_gate" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/cherry_hanging_sign.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/cherry_hanging_sign.json new file mode 100644 index 000000000..0d513d12b --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/cherry_hanging_sign.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/cherry_hanging_sign" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/cherry_leaves.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/cherry_leaves.json new file mode 100644 index 000000000..0b0683e9a --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/cherry_leaves.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/cherry_leaves" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/cherry_log.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/cherry_log.json new file mode 100644 index 000000000..7aceccbdf --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/cherry_log.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/cherry_log" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/cherry_planks.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/cherry_planks.json new file mode 100644 index 000000000..d4f8dfeff --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/cherry_planks.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/cherry_planks" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/cherry_pressure_plate.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/cherry_pressure_plate.json new file mode 100644 index 000000000..b207b042a --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/cherry_pressure_plate.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/cherry_pressure_plate" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/cherry_sapling.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/cherry_sapling.json new file mode 100644 index 000000000..44470b530 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/cherry_sapling.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:block/cherry_sapling" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/cherry_sign.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/cherry_sign.json new file mode 100644 index 000000000..e82a317d1 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/cherry_sign.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/cherry_sign" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/cherry_slab.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/cherry_slab.json new file mode 100644 index 000000000..507749105 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/cherry_slab.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/cherry_slab" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/cherry_stairs.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/cherry_stairs.json new file mode 100644 index 000000000..df08ac739 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/cherry_stairs.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/cherry_stairs" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/cherry_trapdoor.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/cherry_trapdoor.json new file mode 100644 index 000000000..19daaafae --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/cherry_trapdoor.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/cherry_trapdoor_bottom" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/cherry_wood.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/cherry_wood.json new file mode 100644 index 000000000..71e59d450 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/cherry_wood.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/cherry_wood" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/chest.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/chest.json new file mode 100644 index 000000000..cdfd54886 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/chest.json @@ -0,0 +1,38 @@ +{ + "parent": "builtin/entity", + "textures": { + "particle": "block/oak_planks" + }, + "display": { + "gui": { + "rotation": [ 30, 45, 0 ], + "translation": [ 0, 0, 0], + "scale":[ 0.625, 0.625, 0.625 ] + }, + "ground": { + "rotation": [ 0, 0, 0 ], + "translation": [ 0, 3, 0], + "scale":[ 0.25, 0.25, 0.25 ] + }, + "head": { + "rotation": [ 0, 180, 0 ], + "translation": [ 0, 0, 0], + "scale":[ 1, 1, 1] + }, + "fixed": { + "rotation": [ 0, 180, 0 ], + "translation": [ 0, 0, 0], + "scale":[ 0.5, 0.5, 0.5 ] + }, + "thirdperson_righthand": { + "rotation": [ 75, 315, 0 ], + "translation": [ 0, 2.5, 0], + "scale": [ 0.375, 0.375, 0.375 ] + }, + "firstperson_righthand": { + "rotation": [ 0, 315, 0 ], + "translation": [ 0, 0, 0], + "scale": [ 0.4, 0.4, 0.4 ] + } + } +} diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/chest_minecart.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/chest_minecart.json new file mode 100644 index 000000000..bacac30e2 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/chest_minecart.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/chest_minecart" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/chicken.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/chicken.json new file mode 100644 index 000000000..661e00acf --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/chicken.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/chicken" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/chicken_spawn_egg.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/chicken_spawn_egg.json new file mode 100644 index 000000000..d1aaa9d6e --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/chicken_spawn_egg.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:item/template_spawn_egg" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/chipped_anvil.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/chipped_anvil.json new file mode 100644 index 000000000..46804e59c --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/chipped_anvil.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/chipped_anvil" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/chiseled_bookshelf.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/chiseled_bookshelf.json new file mode 100644 index 000000000..90befea8a --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/chiseled_bookshelf.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/chiseled_bookshelf_inventory" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/chiseled_copper.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/chiseled_copper.json new file mode 100644 index 000000000..b88e810ba --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/chiseled_copper.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/chiseled_copper" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/chiseled_deepslate.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/chiseled_deepslate.json new file mode 100644 index 000000000..811f62f9d --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/chiseled_deepslate.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/chiseled_deepslate" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/chiseled_nether_bricks.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/chiseled_nether_bricks.json new file mode 100644 index 000000000..fb134fe3d --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/chiseled_nether_bricks.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/chiseled_nether_bricks" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/chiseled_polished_blackstone.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/chiseled_polished_blackstone.json new file mode 100644 index 000000000..a26153457 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/chiseled_polished_blackstone.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/chiseled_polished_blackstone" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/chiseled_quartz_block.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/chiseled_quartz_block.json new file mode 100644 index 000000000..f8b206168 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/chiseled_quartz_block.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/chiseled_quartz_block" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/chiseled_red_sandstone.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/chiseled_red_sandstone.json new file mode 100644 index 000000000..e3ded796d --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/chiseled_red_sandstone.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/chiseled_red_sandstone" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/chiseled_sandstone.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/chiseled_sandstone.json new file mode 100644 index 000000000..f62617250 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/chiseled_sandstone.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/chiseled_sandstone" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/chiseled_stone_bricks.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/chiseled_stone_bricks.json new file mode 100644 index 000000000..ac7e5e66f --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/chiseled_stone_bricks.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/chiseled_stone_bricks" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/chiseled_tuff.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/chiseled_tuff.json new file mode 100644 index 000000000..845bc289b --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/chiseled_tuff.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/chiseled_tuff" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/chiseled_tuff_bricks.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/chiseled_tuff_bricks.json new file mode 100644 index 000000000..6bea9351d --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/chiseled_tuff_bricks.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/chiseled_tuff_bricks" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/chorus_flower.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/chorus_flower.json new file mode 100644 index 000000000..dc807298f --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/chorus_flower.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/chorus_flower" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/chorus_fruit.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/chorus_fruit.json new file mode 100644 index 000000000..8c84c4f33 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/chorus_fruit.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/chorus_fruit" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/chorus_plant.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/chorus_plant.json new file mode 100644 index 000000000..b0741a699 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/chorus_plant.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/chorus_plant" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/clay.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/clay.json new file mode 100644 index 000000000..2510d78a1 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/clay.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/clay" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/clay_ball.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/clay_ball.json new file mode 100644 index 000000000..1cfb12b5f --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/clay_ball.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/clay_ball" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/clock.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/clock.json new file mode 100644 index 000000000..407b8aa72 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/clock.json @@ -0,0 +1,73 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "item/clock_00" + }, + "overrides": [ + { "predicate": { "time": 0.0000000 }, "model": "item/clock" }, + { "predicate": { "time": 0.0078125 }, "model": "item/clock_01" }, + { "predicate": { "time": 0.0234375 }, "model": "item/clock_02" }, + { "predicate": { "time": 0.0390625 }, "model": "item/clock_03" }, + { "predicate": { "time": 0.0546875 }, "model": "item/clock_04" }, + { "predicate": { "time": 0.0703125 }, "model": "item/clock_05" }, + { "predicate": { "time": 0.0859375 }, "model": "item/clock_06" }, + { "predicate": { "time": 0.1015625 }, "model": "item/clock_07" }, + { "predicate": { "time": 0.1171875 }, "model": "item/clock_08" }, + { "predicate": { "time": 0.1328125 }, "model": "item/clock_09" }, + { "predicate": { "time": 0.1484375 }, "model": "item/clock_10" }, + { "predicate": { "time": 0.1640625 }, "model": "item/clock_11" }, + { "predicate": { "time": 0.1796875 }, "model": "item/clock_12" }, + { "predicate": { "time": 0.1953125 }, "model": "item/clock_13" }, + { "predicate": { "time": 0.2109375 }, "model": "item/clock_14" }, + { "predicate": { "time": 0.2265625 }, "model": "item/clock_15" }, + { "predicate": { "time": 0.2421875 }, "model": "item/clock_16" }, + { "predicate": { "time": 0.2578125 }, "model": "item/clock_17" }, + { "predicate": { "time": 0.2734375 }, "model": "item/clock_18" }, + { "predicate": { "time": 0.2890625 }, "model": "item/clock_19" }, + { "predicate": { "time": 0.3046875 }, "model": "item/clock_20" }, + { "predicate": { "time": 0.3203125 }, "model": "item/clock_21" }, + { "predicate": { "time": 0.3359375 }, "model": "item/clock_22" }, + { "predicate": { "time": 0.3515625 }, "model": "item/clock_23" }, + { "predicate": { "time": 0.3671875 }, "model": "item/clock_24" }, + { "predicate": { "time": 0.3828125 }, "model": "item/clock_25" }, + { "predicate": { "time": 0.3984375 }, "model": "item/clock_26" }, + { "predicate": { "time": 0.4140625 }, "model": "item/clock_27" }, + { "predicate": { "time": 0.4296875 }, "model": "item/clock_28" }, + { "predicate": { "time": 0.4453125 }, "model": "item/clock_29" }, + { "predicate": { "time": 0.4609375 }, "model": "item/clock_30" }, + { "predicate": { "time": 0.4765625 }, "model": "item/clock_31" }, + { "predicate": { "time": 0.4921875 }, "model": "item/clock_32" }, + { "predicate": { "time": 0.5078125 }, "model": "item/clock_33" }, + { "predicate": { "time": 0.5234375 }, "model": "item/clock_34" }, + { "predicate": { "time": 0.5390625 }, "model": "item/clock_35" }, + { "predicate": { "time": 0.5546875 }, "model": "item/clock_36" }, + { "predicate": { "time": 0.5703125 }, "model": "item/clock_37" }, + { "predicate": { "time": 0.5859375 }, "model": "item/clock_38" }, + { "predicate": { "time": 0.6015625 }, "model": "item/clock_39" }, + { "predicate": { "time": 0.6171875 }, "model": "item/clock_40" }, + { "predicate": { "time": 0.6328125 }, "model": "item/clock_41" }, + { "predicate": { "time": 0.6484375 }, "model": "item/clock_42" }, + { "predicate": { "time": 0.6640625 }, "model": "item/clock_43" }, + { "predicate": { "time": 0.6796875 }, "model": "item/clock_44" }, + { "predicate": { "time": 0.6953125 }, "model": "item/clock_45" }, + { "predicate": { "time": 0.7109375 }, "model": "item/clock_46" }, + { "predicate": { "time": 0.7265625 }, "model": "item/clock_47" }, + { "predicate": { "time": 0.7421875 }, "model": "item/clock_48" }, + { "predicate": { "time": 0.7578125 }, "model": "item/clock_49" }, + { "predicate": { "time": 0.7734375 }, "model": "item/clock_50" }, + { "predicate": { "time": 0.7890625 }, "model": "item/clock_51" }, + { "predicate": { "time": 0.8046875 }, "model": "item/clock_52" }, + { "predicate": { "time": 0.8203125 }, "model": "item/clock_53" }, + { "predicate": { "time": 0.8359375 }, "model": "item/clock_54" }, + { "predicate": { "time": 0.8515625 }, "model": "item/clock_55" }, + { "predicate": { "time": 0.8671875 }, "model": "item/clock_56" }, + { "predicate": { "time": 0.8828125 }, "model": "item/clock_57" }, + { "predicate": { "time": 0.8984375 }, "model": "item/clock_58" }, + { "predicate": { "time": 0.9140625 }, "model": "item/clock_59" }, + { "predicate": { "time": 0.9296875 }, "model": "item/clock_60" }, + { "predicate": { "time": 0.9453125 }, "model": "item/clock_61" }, + { "predicate": { "time": 0.9609375 }, "model": "item/clock_62" }, + { "predicate": { "time": 0.9765625 }, "model": "item/clock_63" }, + { "predicate": { "time": 0.9921875 }, "model": "item/clock" } + ] +} diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/clock_01.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/clock_01.json new file mode 100644 index 000000000..fc6b62936 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/clock_01.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/clock_01" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/clock_02.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/clock_02.json new file mode 100644 index 000000000..329f07c4b --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/clock_02.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/clock_02" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/clock_03.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/clock_03.json new file mode 100644 index 000000000..2f727967d --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/clock_03.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/clock_03" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/clock_04.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/clock_04.json new file mode 100644 index 000000000..a29f62930 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/clock_04.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/clock_04" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/clock_05.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/clock_05.json new file mode 100644 index 000000000..c054a610d --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/clock_05.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/clock_05" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/clock_06.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/clock_06.json new file mode 100644 index 000000000..45d346d6a --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/clock_06.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/clock_06" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/clock_07.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/clock_07.json new file mode 100644 index 000000000..6e218b17e --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/clock_07.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/clock_07" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/clock_08.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/clock_08.json new file mode 100644 index 000000000..5bacb1d17 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/clock_08.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/clock_08" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/clock_09.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/clock_09.json new file mode 100644 index 000000000..af1b9d9eb --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/clock_09.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/clock_09" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/clock_10.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/clock_10.json new file mode 100644 index 000000000..f4c66214e --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/clock_10.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/clock_10" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/clock_11.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/clock_11.json new file mode 100644 index 000000000..9ddde2ece --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/clock_11.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/clock_11" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/clock_12.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/clock_12.json new file mode 100644 index 000000000..42cdfdde0 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/clock_12.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/clock_12" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/clock_13.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/clock_13.json new file mode 100644 index 000000000..a81db14bf --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/clock_13.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/clock_13" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/clock_14.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/clock_14.json new file mode 100644 index 000000000..5eb2e365f --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/clock_14.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/clock_14" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/clock_15.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/clock_15.json new file mode 100644 index 000000000..34b71c539 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/clock_15.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/clock_15" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/clock_16.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/clock_16.json new file mode 100644 index 000000000..6ad0e2c4c --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/clock_16.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/clock_16" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/clock_17.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/clock_17.json new file mode 100644 index 000000000..ce4688087 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/clock_17.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/clock_17" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/clock_18.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/clock_18.json new file mode 100644 index 000000000..ecda55f2b --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/clock_18.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/clock_18" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/clock_19.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/clock_19.json new file mode 100644 index 000000000..750bf76e2 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/clock_19.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/clock_19" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/clock_20.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/clock_20.json new file mode 100644 index 000000000..aa1136d58 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/clock_20.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/clock_20" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/clock_21.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/clock_21.json new file mode 100644 index 000000000..aabcd1303 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/clock_21.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/clock_21" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/clock_22.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/clock_22.json new file mode 100644 index 000000000..0c9cfe8ea --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/clock_22.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/clock_22" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/clock_23.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/clock_23.json new file mode 100644 index 000000000..18752a4ce --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/clock_23.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/clock_23" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/clock_24.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/clock_24.json new file mode 100644 index 000000000..7e875df9a --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/clock_24.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/clock_24" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/clock_25.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/clock_25.json new file mode 100644 index 000000000..4c939e6a6 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/clock_25.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/clock_25" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/clock_26.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/clock_26.json new file mode 100644 index 000000000..8039bdef0 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/clock_26.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/clock_26" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/clock_27.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/clock_27.json new file mode 100644 index 000000000..76fd7d6e5 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/clock_27.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/clock_27" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/clock_28.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/clock_28.json new file mode 100644 index 000000000..ef5c699b6 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/clock_28.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/clock_28" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/clock_29.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/clock_29.json new file mode 100644 index 000000000..f95d697fe --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/clock_29.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/clock_29" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/clock_30.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/clock_30.json new file mode 100644 index 000000000..328a5161e --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/clock_30.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/clock_30" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/clock_31.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/clock_31.json new file mode 100644 index 000000000..28b91d101 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/clock_31.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/clock_31" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/clock_32.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/clock_32.json new file mode 100644 index 000000000..c6d18099b --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/clock_32.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/clock_32" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/clock_33.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/clock_33.json new file mode 100644 index 000000000..c5a1932f2 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/clock_33.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/clock_33" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/clock_34.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/clock_34.json new file mode 100644 index 000000000..584f10d3e --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/clock_34.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/clock_34" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/clock_35.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/clock_35.json new file mode 100644 index 000000000..aad78040a --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/clock_35.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/clock_35" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/clock_36.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/clock_36.json new file mode 100644 index 000000000..d1a8c92bf --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/clock_36.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/clock_36" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/clock_37.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/clock_37.json new file mode 100644 index 000000000..ef30c8237 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/clock_37.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/clock_37" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/clock_38.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/clock_38.json new file mode 100644 index 000000000..243825acf --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/clock_38.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/clock_38" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/clock_39.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/clock_39.json new file mode 100644 index 000000000..59de1c0a9 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/clock_39.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/clock_39" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/clock_40.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/clock_40.json new file mode 100644 index 000000000..1c629d8f0 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/clock_40.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/clock_40" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/clock_41.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/clock_41.json new file mode 100644 index 000000000..646d162e0 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/clock_41.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/clock_41" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/clock_42.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/clock_42.json new file mode 100644 index 000000000..8f3f38d11 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/clock_42.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/clock_42" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/clock_43.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/clock_43.json new file mode 100644 index 000000000..4930ee49d --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/clock_43.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/clock_43" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/clock_44.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/clock_44.json new file mode 100644 index 000000000..e98964dad --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/clock_44.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/clock_44" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/clock_45.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/clock_45.json new file mode 100644 index 000000000..dd8a50ea7 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/clock_45.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/clock_45" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/clock_46.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/clock_46.json new file mode 100644 index 000000000..7bc0f9beb --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/clock_46.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/clock_46" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/clock_47.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/clock_47.json new file mode 100644 index 000000000..97835facd --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/clock_47.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/clock_47" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/clock_48.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/clock_48.json new file mode 100644 index 000000000..617408133 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/clock_48.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/clock_48" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/clock_49.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/clock_49.json new file mode 100644 index 000000000..3c6067e62 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/clock_49.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/clock_49" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/clock_50.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/clock_50.json new file mode 100644 index 000000000..3e30e1d8b --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/clock_50.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/clock_50" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/clock_51.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/clock_51.json new file mode 100644 index 000000000..45af5151e --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/clock_51.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/clock_51" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/clock_52.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/clock_52.json new file mode 100644 index 000000000..9a28ead08 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/clock_52.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/clock_52" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/clock_53.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/clock_53.json new file mode 100644 index 000000000..85176573d --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/clock_53.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/clock_53" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/clock_54.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/clock_54.json new file mode 100644 index 000000000..096b67a56 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/clock_54.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/clock_54" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/clock_55.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/clock_55.json new file mode 100644 index 000000000..730b22c00 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/clock_55.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/clock_55" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/clock_56.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/clock_56.json new file mode 100644 index 000000000..ad087180d --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/clock_56.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/clock_56" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/clock_57.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/clock_57.json new file mode 100644 index 000000000..47711b17c --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/clock_57.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/clock_57" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/clock_58.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/clock_58.json new file mode 100644 index 000000000..420370eae --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/clock_58.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/clock_58" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/clock_59.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/clock_59.json new file mode 100644 index 000000000..d8ca2ed35 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/clock_59.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/clock_59" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/clock_60.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/clock_60.json new file mode 100644 index 000000000..2b50d056d --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/clock_60.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/clock_60" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/clock_61.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/clock_61.json new file mode 100644 index 000000000..c0cba9653 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/clock_61.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/clock_61" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/clock_62.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/clock_62.json new file mode 100644 index 000000000..cb92524ba --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/clock_62.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/clock_62" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/clock_63.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/clock_63.json new file mode 100644 index 000000000..db6691c95 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/clock_63.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/clock_63" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/coal.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/coal.json new file mode 100644 index 000000000..551d462ed --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/coal.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/coal" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/coal_block.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/coal_block.json new file mode 100644 index 000000000..ee2426737 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/coal_block.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/coal_block" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/coal_ore.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/coal_ore.json new file mode 100644 index 000000000..d6971d353 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/coal_ore.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/coal_ore" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/coarse_dirt.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/coarse_dirt.json new file mode 100644 index 000000000..797b7cc79 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/coarse_dirt.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/coarse_dirt" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/coast_armor_trim_smithing_template.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/coast_armor_trim_smithing_template.json new file mode 100644 index 000000000..598b27c88 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/coast_armor_trim_smithing_template.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/coast_armor_trim_smithing_template" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/cobbled_deepslate.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/cobbled_deepslate.json new file mode 100644 index 000000000..aceda4d8d --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/cobbled_deepslate.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/cobbled_deepslate" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/cobbled_deepslate_slab.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/cobbled_deepslate_slab.json new file mode 100644 index 000000000..a4ea4d2d8 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/cobbled_deepslate_slab.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/cobbled_deepslate_slab" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/cobbled_deepslate_stairs.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/cobbled_deepslate_stairs.json new file mode 100644 index 000000000..054c8e6cc --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/cobbled_deepslate_stairs.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/cobbled_deepslate_stairs" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/cobbled_deepslate_wall.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/cobbled_deepslate_wall.json new file mode 100644 index 000000000..25b446455 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/cobbled_deepslate_wall.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/cobbled_deepslate_wall_inventory" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/cobblestone.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/cobblestone.json new file mode 100644 index 000000000..35e828df6 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/cobblestone.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/cobblestone" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/cobblestone_slab.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/cobblestone_slab.json new file mode 100644 index 000000000..701123f08 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/cobblestone_slab.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/cobblestone_slab" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/cobblestone_stairs.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/cobblestone_stairs.json new file mode 100644 index 000000000..48910bcc5 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/cobblestone_stairs.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/cobblestone_stairs" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/cobblestone_wall.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/cobblestone_wall.json new file mode 100644 index 000000000..5c603a85e --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/cobblestone_wall.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/cobblestone_wall_inventory" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/cobweb.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/cobweb.json new file mode 100644 index 000000000..64ebc0bd1 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/cobweb.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:block/cobweb" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/cocoa_beans.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/cocoa_beans.json new file mode 100644 index 000000000..cb83b5d4d --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/cocoa_beans.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/cocoa_beans" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/cod.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/cod.json new file mode 100644 index 000000000..a36ba0c8e --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/cod.json @@ -0,0 +1,13 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "item/cod" + }, + "display": { + "head": { + "rotation": [ 0, 90, -60 ], + "translation": [ -7, -4, -7], + "scale":[ 0.8, 0.8, 0.8] + } + } +} diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/cod_bucket.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/cod_bucket.json new file mode 100644 index 000000000..35c4ca0f5 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/cod_bucket.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/cod_bucket" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/cod_spawn_egg.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/cod_spawn_egg.json new file mode 100644 index 000000000..d1aaa9d6e --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/cod_spawn_egg.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:item/template_spawn_egg" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/command_block.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/command_block.json new file mode 100644 index 000000000..43605276d --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/command_block.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/command_block" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/command_block_minecart.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/command_block_minecart.json new file mode 100644 index 000000000..7a3cf69b6 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/command_block_minecart.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/command_block_minecart" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/comparator.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/comparator.json new file mode 100644 index 000000000..6aa4fbe2d --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/comparator.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/comparator" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/compass.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/compass.json new file mode 100644 index 000000000..ec66bb16d --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/compass.json @@ -0,0 +1,41 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "item/compass_16" + }, + "overrides": [ + { "predicate": { "angle": 0.000000 }, "model": "item/compass" }, + { "predicate": { "angle": 0.015625 }, "model": "item/compass_17" }, + { "predicate": { "angle": 0.046875 }, "model": "item/compass_18" }, + { "predicate": { "angle": 0.078125 }, "model": "item/compass_19" }, + { "predicate": { "angle": 0.109375 }, "model": "item/compass_20" }, + { "predicate": { "angle": 0.140625 }, "model": "item/compass_21" }, + { "predicate": { "angle": 0.171875 }, "model": "item/compass_22" }, + { "predicate": { "angle": 0.203125 }, "model": "item/compass_23" }, + { "predicate": { "angle": 0.234375 }, "model": "item/compass_24" }, + { "predicate": { "angle": 0.265625 }, "model": "item/compass_25" }, + { "predicate": { "angle": 0.296875 }, "model": "item/compass_26" }, + { "predicate": { "angle": 0.328125 }, "model": "item/compass_27" }, + { "predicate": { "angle": 0.359375 }, "model": "item/compass_28" }, + { "predicate": { "angle": 0.390625 }, "model": "item/compass_29" }, + { "predicate": { "angle": 0.421875 }, "model": "item/compass_30" }, + { "predicate": { "angle": 0.453125 }, "model": "item/compass_31" }, + { "predicate": { "angle": 0.484375 }, "model": "item/compass_00" }, + { "predicate": { "angle": 0.515625 }, "model": "item/compass_01" }, + { "predicate": { "angle": 0.546875 }, "model": "item/compass_02" }, + { "predicate": { "angle": 0.578125 }, "model": "item/compass_03" }, + { "predicate": { "angle": 0.609375 }, "model": "item/compass_04" }, + { "predicate": { "angle": 0.640625 }, "model": "item/compass_05" }, + { "predicate": { "angle": 0.671875 }, "model": "item/compass_06" }, + { "predicate": { "angle": 0.703125 }, "model": "item/compass_07" }, + { "predicate": { "angle": 0.734375 }, "model": "item/compass_08" }, + { "predicate": { "angle": 0.765625 }, "model": "item/compass_09" }, + { "predicate": { "angle": 0.796875 }, "model": "item/compass_10" }, + { "predicate": { "angle": 0.828125 }, "model": "item/compass_11" }, + { "predicate": { "angle": 0.859375 }, "model": "item/compass_12" }, + { "predicate": { "angle": 0.890625 }, "model": "item/compass_13" }, + { "predicate": { "angle": 0.921875 }, "model": "item/compass_14" }, + { "predicate": { "angle": 0.953125 }, "model": "item/compass_15" }, + { "predicate": { "angle": 0.984375 }, "model": "item/compass" } + ] +} diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/compass_00.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/compass_00.json new file mode 100644 index 000000000..dc856843d --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/compass_00.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/compass_00" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/compass_01.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/compass_01.json new file mode 100644 index 000000000..75d4178dc --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/compass_01.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/compass_01" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/compass_02.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/compass_02.json new file mode 100644 index 000000000..b91b4ba83 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/compass_02.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/compass_02" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/compass_03.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/compass_03.json new file mode 100644 index 000000000..10bf34a65 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/compass_03.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/compass_03" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/compass_04.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/compass_04.json new file mode 100644 index 000000000..cf2e7eb7a --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/compass_04.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/compass_04" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/compass_05.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/compass_05.json new file mode 100644 index 000000000..e78ede9ca --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/compass_05.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/compass_05" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/compass_06.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/compass_06.json new file mode 100644 index 000000000..3679f2293 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/compass_06.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/compass_06" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/compass_07.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/compass_07.json new file mode 100644 index 000000000..37c1d3102 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/compass_07.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/compass_07" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/compass_08.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/compass_08.json new file mode 100644 index 000000000..706d7fb84 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/compass_08.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/compass_08" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/compass_09.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/compass_09.json new file mode 100644 index 000000000..1a0dd1a36 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/compass_09.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/compass_09" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/compass_10.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/compass_10.json new file mode 100644 index 000000000..965ec5602 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/compass_10.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/compass_10" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/compass_11.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/compass_11.json new file mode 100644 index 000000000..dde2e5592 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/compass_11.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/compass_11" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/compass_12.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/compass_12.json new file mode 100644 index 000000000..ffe3aa7dc --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/compass_12.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/compass_12" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/compass_13.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/compass_13.json new file mode 100644 index 000000000..985d2d38b --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/compass_13.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/compass_13" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/compass_14.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/compass_14.json new file mode 100644 index 000000000..27fc108b4 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/compass_14.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/compass_14" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/compass_15.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/compass_15.json new file mode 100644 index 000000000..0b72926ee --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/compass_15.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/compass_15" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/compass_17.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/compass_17.json new file mode 100644 index 000000000..ddcb506f2 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/compass_17.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/compass_17" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/compass_18.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/compass_18.json new file mode 100644 index 000000000..5f47bcdbe --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/compass_18.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/compass_18" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/compass_19.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/compass_19.json new file mode 100644 index 000000000..256894713 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/compass_19.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/compass_19" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/compass_20.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/compass_20.json new file mode 100644 index 000000000..26b95b334 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/compass_20.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/compass_20" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/compass_21.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/compass_21.json new file mode 100644 index 000000000..0948b81aa --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/compass_21.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/compass_21" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/compass_22.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/compass_22.json new file mode 100644 index 000000000..a594efd24 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/compass_22.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/compass_22" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/compass_23.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/compass_23.json new file mode 100644 index 000000000..8e7b9c002 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/compass_23.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/compass_23" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/compass_24.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/compass_24.json new file mode 100644 index 000000000..b9bba9033 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/compass_24.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/compass_24" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/compass_25.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/compass_25.json new file mode 100644 index 000000000..b896c210c --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/compass_25.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/compass_25" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/compass_26.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/compass_26.json new file mode 100644 index 000000000..8c6c7aac3 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/compass_26.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/compass_26" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/compass_27.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/compass_27.json new file mode 100644 index 000000000..f5e26c56e --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/compass_27.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/compass_27" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/compass_28.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/compass_28.json new file mode 100644 index 000000000..7a766cfd2 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/compass_28.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/compass_28" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/compass_29.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/compass_29.json new file mode 100644 index 000000000..990c9054f --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/compass_29.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/compass_29" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/compass_30.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/compass_30.json new file mode 100644 index 000000000..725443ad2 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/compass_30.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/compass_30" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/compass_31.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/compass_31.json new file mode 100644 index 000000000..bbbd539fc --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/compass_31.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/compass_31" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/composter.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/composter.json new file mode 100644 index 000000000..a8a9be3b2 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/composter.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/composter" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/conduit.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/conduit.json new file mode 100644 index 000000000..f5785cdf7 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/conduit.json @@ -0,0 +1,38 @@ +{ + "parent": "builtin/entity", + "textures": { + "particle": "block/conduit" + }, + "display": { + "gui": { + "rotation": [ 30, 45, 0 ], + "translation": [ 0, 0, 0], + "scale":[ 1.0, 1.0, 1.0 ] + }, + "ground": { + "rotation": [ 0, 0, 0 ], + "translation": [ 0, 3, 0], + "scale":[ 0.5, 0.5, 0.5 ] + }, + "head": { + "rotation": [ 0, 180, 0 ], + "translation": [ 0, 0, 0], + "scale":[ 1, 1, 1] + }, + "fixed": { + "rotation": [ 0, 180, 0 ], + "translation": [ 0, 0, 0], + "scale":[ 1, 1, 1 ] + }, + "thirdperson_righthand": { + "rotation": [ 75, 315, 0 ], + "translation": [ 0, 2.5, 0], + "scale": [ 0.5, 0.5, 0.5 ] + }, + "firstperson_righthand": { + "rotation": [ 0, 315, 0 ], + "translation": [ 0, 0, 0], + "scale": [ 0.8, 0.8, 0.8 ] + } + } +} diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/cooked_beef.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/cooked_beef.json new file mode 100644 index 000000000..2360514a2 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/cooked_beef.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/cooked_beef" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/cooked_chicken.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/cooked_chicken.json new file mode 100644 index 000000000..6608b49c2 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/cooked_chicken.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/cooked_chicken" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/cooked_cod.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/cooked_cod.json new file mode 100644 index 000000000..ed4d23924 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/cooked_cod.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/cooked_cod" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/cooked_mutton.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/cooked_mutton.json new file mode 100644 index 000000000..41455e0e2 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/cooked_mutton.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/cooked_mutton" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/cooked_porkchop.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/cooked_porkchop.json new file mode 100644 index 000000000..85a6bb4f0 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/cooked_porkchop.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/cooked_porkchop" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/cooked_rabbit.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/cooked_rabbit.json new file mode 100644 index 000000000..7217b8a86 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/cooked_rabbit.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/cooked_rabbit" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/cooked_salmon.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/cooked_salmon.json new file mode 100644 index 000000000..d4be30a79 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/cooked_salmon.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/cooked_salmon" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/cookie.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/cookie.json new file mode 100644 index 000000000..c1addfd8f --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/cookie.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/cookie" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/copper_block.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/copper_block.json new file mode 100644 index 000000000..7bc2c0184 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/copper_block.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/copper_block" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/copper_bulb.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/copper_bulb.json new file mode 100644 index 000000000..bdf2e1755 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/copper_bulb.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/copper_bulb" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/copper_door.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/copper_door.json new file mode 100644 index 000000000..88468c6b4 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/copper_door.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/copper_door" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/copper_grate.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/copper_grate.json new file mode 100644 index 000000000..f4cff5139 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/copper_grate.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/copper_grate" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/copper_ingot.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/copper_ingot.json new file mode 100644 index 000000000..c8feae647 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/copper_ingot.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/copper_ingot" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/copper_ore.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/copper_ore.json new file mode 100644 index 000000000..773d45934 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/copper_ore.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/copper_ore" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/copper_trapdoor.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/copper_trapdoor.json new file mode 100644 index 000000000..77db2f8d3 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/copper_trapdoor.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/copper_trapdoor_bottom" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/cornflower.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/cornflower.json new file mode 100644 index 000000000..ca317c8b2 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/cornflower.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:block/cornflower" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/cow_spawn_egg.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/cow_spawn_egg.json new file mode 100644 index 000000000..d1aaa9d6e --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/cow_spawn_egg.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:item/template_spawn_egg" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/cracked_deepslate_bricks.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/cracked_deepslate_bricks.json new file mode 100644 index 000000000..5edc2399b --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/cracked_deepslate_bricks.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/cracked_deepslate_bricks" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/cracked_deepslate_tiles.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/cracked_deepslate_tiles.json new file mode 100644 index 000000000..9fc7a8c02 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/cracked_deepslate_tiles.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/cracked_deepslate_tiles" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/cracked_nether_bricks.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/cracked_nether_bricks.json new file mode 100644 index 000000000..09da8a18a --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/cracked_nether_bricks.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/cracked_nether_bricks" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/cracked_polished_blackstone_bricks.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/cracked_polished_blackstone_bricks.json new file mode 100644 index 000000000..87b9f26e6 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/cracked_polished_blackstone_bricks.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/cracked_polished_blackstone_bricks" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/cracked_stone_bricks.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/cracked_stone_bricks.json new file mode 100644 index 000000000..46802074e --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/cracked_stone_bricks.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/cracked_stone_bricks" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/crafter.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/crafter.json new file mode 100644 index 000000000..65fda3009 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/crafter.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/crafter" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/crafting_table.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/crafting_table.json new file mode 100644 index 000000000..323e84b6e --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/crafting_table.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/crafting_table" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/creaking_heart.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/creaking_heart.json new file mode 100644 index 000000000..a071b7265 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/creaking_heart.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/creaking_heart" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/creaking_spawn_egg.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/creaking_spawn_egg.json new file mode 100644 index 000000000..d1aaa9d6e --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/creaking_spawn_egg.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:item/template_spawn_egg" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/creeper_banner_pattern.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/creeper_banner_pattern.json new file mode 100644 index 000000000..d626b7310 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/creeper_banner_pattern.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/creeper_banner_pattern" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/creeper_head.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/creeper_head.json new file mode 100644 index 000000000..364b6e65f --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/creeper_head.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:item/template_skull" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/creeper_spawn_egg.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/creeper_spawn_egg.json new file mode 100644 index 000000000..d1aaa9d6e --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/creeper_spawn_egg.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:item/template_spawn_egg" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/crimson_button.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/crimson_button.json new file mode 100644 index 000000000..f58c71fc6 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/crimson_button.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/crimson_button_inventory" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/crimson_door.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/crimson_door.json new file mode 100644 index 000000000..ef94c1cc8 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/crimson_door.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/crimson_door" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/crimson_fence.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/crimson_fence.json new file mode 100644 index 000000000..3bdd71d1d --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/crimson_fence.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/crimson_fence_inventory" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/crimson_fence_gate.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/crimson_fence_gate.json new file mode 100644 index 000000000..36ef1c8ca --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/crimson_fence_gate.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/crimson_fence_gate" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/crimson_fungus.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/crimson_fungus.json new file mode 100644 index 000000000..6fdfd2fa2 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/crimson_fungus.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:block/crimson_fungus" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/crimson_hanging_sign.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/crimson_hanging_sign.json new file mode 100644 index 000000000..47d3729d9 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/crimson_hanging_sign.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/crimson_hanging_sign" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/crimson_hyphae.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/crimson_hyphae.json new file mode 100644 index 000000000..6efe46101 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/crimson_hyphae.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/crimson_hyphae" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/crimson_nylium.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/crimson_nylium.json new file mode 100644 index 000000000..74f939241 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/crimson_nylium.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/crimson_nylium" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/crimson_planks.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/crimson_planks.json new file mode 100644 index 000000000..759128e13 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/crimson_planks.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/crimson_planks" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/crimson_pressure_plate.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/crimson_pressure_plate.json new file mode 100644 index 000000000..436b0ba9a --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/crimson_pressure_plate.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/crimson_pressure_plate" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/crimson_roots.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/crimson_roots.json new file mode 100644 index 000000000..19ea0092c --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/crimson_roots.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:block/crimson_roots" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/crimson_sign.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/crimson_sign.json new file mode 100644 index 000000000..3d2a86b74 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/crimson_sign.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/crimson_sign" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/crimson_slab.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/crimson_slab.json new file mode 100644 index 000000000..63ad29274 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/crimson_slab.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/crimson_slab" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/crimson_stairs.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/crimson_stairs.json new file mode 100644 index 000000000..9cefb2d27 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/crimson_stairs.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/crimson_stairs" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/crimson_stem.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/crimson_stem.json new file mode 100644 index 000000000..56d2001dc --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/crimson_stem.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/crimson_stem" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/crimson_trapdoor.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/crimson_trapdoor.json new file mode 100644 index 000000000..b1cba031f --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/crimson_trapdoor.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/crimson_trapdoor_bottom" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/crossbow.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/crossbow.json new file mode 100644 index 000000000..0cddcac42 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/crossbow.json @@ -0,0 +1,63 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "item/crossbow_standby" + }, + "display": { + "thirdperson_righthand": { + "rotation": [ -90, 0, -60 ], + "translation": [ 2, 0.1, -3 ], + "scale": [ 0.9, 0.9, 0.9 ] + }, + "thirdperson_lefthand": { + "rotation": [ -90, 0, 30 ], + "translation": [ 2, 0.1, -3 ], + "scale": [ 0.9, 0.9, 0.9 ] + }, + "firstperson_righthand": { + "rotation": [ -90, 0, -55 ], + "translation": [ 1.13, 3.2, 1.13], + "scale": [ 0.68, 0.68, 0.68 ] + }, + "firstperson_lefthand": { + "rotation": [ -90, 0, 35 ], + "translation": [ 1.13, 3.2, 1.13], + "scale": [ 0.68, 0.68, 0.68 ] + } + }, + "overrides": [ + { + "predicate": { + "pulling": 1 + }, + "model": "item/crossbow_pulling_0" + }, + { + "predicate": { + "pulling": 1, + "pull": 0.58 + }, + "model": "item/crossbow_pulling_1" + }, + { + "predicate": { + "pulling": 1, + "pull": 1.0 + }, + "model": "item/crossbow_pulling_2" + }, + { + "predicate": { + "charged": 1 + }, + "model": "item/crossbow_arrow" + }, + { + "predicate": { + "charged": 1, + "firework": 1 + }, + "model": "item/crossbow_firework" + } + ] +} diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/crossbow_arrow.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/crossbow_arrow.json new file mode 100644 index 000000000..bc3e3543c --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/crossbow_arrow.json @@ -0,0 +1,6 @@ +{ + "parent": "item/crossbow", + "textures": { + "layer0": "item/crossbow_arrow" + } +} diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/crossbow_firework.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/crossbow_firework.json new file mode 100644 index 000000000..1ebe175ad --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/crossbow_firework.json @@ -0,0 +1,6 @@ +{ + "parent": "item/crossbow", + "textures": { + "layer0": "item/crossbow_firework" + } +} diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/crossbow_pulling_0.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/crossbow_pulling_0.json new file mode 100644 index 000000000..afd73b86a --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/crossbow_pulling_0.json @@ -0,0 +1,6 @@ +{ + "parent": "item/crossbow", + "textures": { + "layer0": "item/crossbow_pulling_0" + } +} diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/crossbow_pulling_1.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/crossbow_pulling_1.json new file mode 100644 index 000000000..1c48a748b --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/crossbow_pulling_1.json @@ -0,0 +1,6 @@ +{ + "parent": "item/crossbow", + "textures": { + "layer0": "item/crossbow_pulling_1" + } +} diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/crossbow_pulling_2.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/crossbow_pulling_2.json new file mode 100644 index 000000000..3c2df5001 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/crossbow_pulling_2.json @@ -0,0 +1,6 @@ +{ + "parent": "item/crossbow", + "textures": { + "layer0": "item/crossbow_pulling_2" + } +} diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/crying_obsidian.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/crying_obsidian.json new file mode 100644 index 000000000..0d94bfb8e --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/crying_obsidian.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/crying_obsidian" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/cut_copper.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/cut_copper.json new file mode 100644 index 000000000..ce1ec597d --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/cut_copper.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/cut_copper" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/cut_copper_slab.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/cut_copper_slab.json new file mode 100644 index 000000000..b6b05101c --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/cut_copper_slab.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/cut_copper_slab" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/cut_copper_stairs.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/cut_copper_stairs.json new file mode 100644 index 000000000..7376f52cc --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/cut_copper_stairs.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/cut_copper_stairs" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/cut_red_sandstone.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/cut_red_sandstone.json new file mode 100644 index 000000000..665df158c --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/cut_red_sandstone.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/cut_red_sandstone" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/cut_red_sandstone_slab.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/cut_red_sandstone_slab.json new file mode 100644 index 000000000..7767595ca --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/cut_red_sandstone_slab.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/cut_red_sandstone_slab" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/cut_sandstone.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/cut_sandstone.json new file mode 100644 index 000000000..865262dc0 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/cut_sandstone.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/cut_sandstone" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/cut_sandstone_slab.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/cut_sandstone_slab.json new file mode 100644 index 000000000..cccc00353 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/cut_sandstone_slab.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/cut_sandstone_slab" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/cyan_banner.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/cyan_banner.json new file mode 100644 index 000000000..661a106df --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/cyan_banner.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:item/template_banner" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/cyan_bed.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/cyan_bed.json new file mode 100644 index 000000000..046fa8118 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/cyan_bed.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/template_bed", + "textures": { + "particle": "minecraft:block/cyan_wool" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/cyan_bundle.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/cyan_bundle.json new file mode 100644 index 000000000..996896862 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/cyan_bundle.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/cyan_bundle" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/cyan_bundle_open_back.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/cyan_bundle_open_back.json new file mode 100644 index 000000000..27a03d17f --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/cyan_bundle_open_back.json @@ -0,0 +1,6 @@ +{ + "parent": "item/bundle", + "textures": { + "layer0": "item/cyan_bundle_open_back" + } +} diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/cyan_bundle_open_front.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/cyan_bundle_open_front.json new file mode 100644 index 000000000..c7eccd842 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/cyan_bundle_open_front.json @@ -0,0 +1,6 @@ +{ + "parent": "item/bundle", + "textures": { + "layer0": "item/cyan_bundle_open_front" + } +} diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/cyan_candle.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/cyan_candle.json new file mode 100644 index 000000000..4b565936e --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/cyan_candle.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/cyan_candle" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/cyan_carpet.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/cyan_carpet.json new file mode 100644 index 000000000..f67e70625 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/cyan_carpet.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/cyan_carpet" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/cyan_concrete.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/cyan_concrete.json new file mode 100644 index 000000000..210de1016 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/cyan_concrete.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/cyan_concrete" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/cyan_concrete_powder.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/cyan_concrete_powder.json new file mode 100644 index 000000000..8fe4c5464 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/cyan_concrete_powder.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/cyan_concrete_powder" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/cyan_dye.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/cyan_dye.json new file mode 100644 index 000000000..634aa6ec1 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/cyan_dye.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/cyan_dye" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/cyan_glazed_terracotta.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/cyan_glazed_terracotta.json new file mode 100644 index 000000000..c98c2ac8e --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/cyan_glazed_terracotta.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/cyan_glazed_terracotta" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/cyan_shulker_box.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/cyan_shulker_box.json new file mode 100644 index 000000000..e06a479cd --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/cyan_shulker_box.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/template_shulker_box", + "textures": { + "particle": "minecraft:block/cyan_shulker_box" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/cyan_stained_glass.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/cyan_stained_glass.json new file mode 100644 index 000000000..8cdd4b939 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/cyan_stained_glass.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/cyan_stained_glass" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/cyan_stained_glass_pane.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/cyan_stained_glass_pane.json new file mode 100644 index 000000000..61db9a4d2 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/cyan_stained_glass_pane.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:block/cyan_stained_glass" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/cyan_terracotta.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/cyan_terracotta.json new file mode 100644 index 000000000..4053734c1 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/cyan_terracotta.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/cyan_terracotta" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/cyan_wool.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/cyan_wool.json new file mode 100644 index 000000000..30c92e7a3 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/cyan_wool.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/cyan_wool" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/damaged_anvil.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/damaged_anvil.json new file mode 100644 index 000000000..657cbd68a --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/damaged_anvil.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/damaged_anvil" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/dandelion.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/dandelion.json new file mode 100644 index 000000000..1628250e4 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/dandelion.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:block/dandelion" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/danger_pottery_sherd.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/danger_pottery_sherd.json new file mode 100644 index 000000000..136b5d965 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/danger_pottery_sherd.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/danger_pottery_sherd" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/dark_oak_boat.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/dark_oak_boat.json new file mode 100644 index 000000000..66ced7960 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/dark_oak_boat.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/dark_oak_boat" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/dark_oak_button.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/dark_oak_button.json new file mode 100644 index 000000000..f2ff59ba9 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/dark_oak_button.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/dark_oak_button_inventory" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/dark_oak_chest_boat.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/dark_oak_chest_boat.json new file mode 100644 index 000000000..bc981607d --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/dark_oak_chest_boat.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/dark_oak_chest_boat" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/dark_oak_door.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/dark_oak_door.json new file mode 100644 index 000000000..89ad212f2 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/dark_oak_door.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/dark_oak_door" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/dark_oak_fence.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/dark_oak_fence.json new file mode 100644 index 000000000..c624d9c99 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/dark_oak_fence.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/dark_oak_fence_inventory" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/dark_oak_fence_gate.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/dark_oak_fence_gate.json new file mode 100644 index 000000000..25cbe8054 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/dark_oak_fence_gate.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/dark_oak_fence_gate" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/dark_oak_hanging_sign.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/dark_oak_hanging_sign.json new file mode 100644 index 000000000..5d095e988 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/dark_oak_hanging_sign.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/dark_oak_hanging_sign" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/dark_oak_leaves.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/dark_oak_leaves.json new file mode 100644 index 000000000..395882a7a --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/dark_oak_leaves.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/dark_oak_leaves" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/dark_oak_log.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/dark_oak_log.json new file mode 100644 index 000000000..6304aefb9 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/dark_oak_log.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/dark_oak_log" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/dark_oak_planks.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/dark_oak_planks.json new file mode 100644 index 000000000..a3adda1d8 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/dark_oak_planks.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/dark_oak_planks" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/dark_oak_pressure_plate.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/dark_oak_pressure_plate.json new file mode 100644 index 000000000..7cd16b9d6 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/dark_oak_pressure_plate.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/dark_oak_pressure_plate" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/dark_oak_sapling.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/dark_oak_sapling.json new file mode 100644 index 000000000..1a02b3242 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/dark_oak_sapling.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:block/dark_oak_sapling" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/dark_oak_sign.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/dark_oak_sign.json new file mode 100644 index 000000000..962a237af --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/dark_oak_sign.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/dark_oak_sign" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/dark_oak_slab.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/dark_oak_slab.json new file mode 100644 index 000000000..c66e4e434 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/dark_oak_slab.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/dark_oak_slab" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/dark_oak_stairs.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/dark_oak_stairs.json new file mode 100644 index 000000000..1d7b821bf --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/dark_oak_stairs.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/dark_oak_stairs" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/dark_oak_trapdoor.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/dark_oak_trapdoor.json new file mode 100644 index 000000000..a91f3c8fe --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/dark_oak_trapdoor.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/dark_oak_trapdoor_bottom" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/dark_oak_wood.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/dark_oak_wood.json new file mode 100644 index 000000000..3a285ba3d --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/dark_oak_wood.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/dark_oak_wood" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/dark_prismarine.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/dark_prismarine.json new file mode 100644 index 000000000..461468dff --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/dark_prismarine.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/dark_prismarine" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/dark_prismarine_slab.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/dark_prismarine_slab.json new file mode 100644 index 000000000..a9605d9f8 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/dark_prismarine_slab.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/dark_prismarine_slab" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/dark_prismarine_stairs.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/dark_prismarine_stairs.json new file mode 100644 index 000000000..2a11deadb --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/dark_prismarine_stairs.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/dark_prismarine_stairs" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/daylight_detector.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/daylight_detector.json new file mode 100644 index 000000000..f52d6d9a8 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/daylight_detector.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/daylight_detector" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/dead_brain_coral.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/dead_brain_coral.json new file mode 100644 index 000000000..8e2439122 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/dead_brain_coral.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:block/dead_brain_coral" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/dead_brain_coral_block.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/dead_brain_coral_block.json new file mode 100644 index 000000000..3134d2b74 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/dead_brain_coral_block.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/dead_brain_coral_block" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/dead_brain_coral_fan.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/dead_brain_coral_fan.json new file mode 100644 index 000000000..a6488a838 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/dead_brain_coral_fan.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:block/dead_brain_coral_fan" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/dead_bubble_coral.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/dead_bubble_coral.json new file mode 100644 index 000000000..7802938b9 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/dead_bubble_coral.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:block/dead_bubble_coral" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/dead_bubble_coral_block.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/dead_bubble_coral_block.json new file mode 100644 index 000000000..ba3411da6 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/dead_bubble_coral_block.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/dead_bubble_coral_block" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/dead_bubble_coral_fan.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/dead_bubble_coral_fan.json new file mode 100644 index 000000000..e06ea5f95 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/dead_bubble_coral_fan.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:block/dead_bubble_coral_fan" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/dead_bush.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/dead_bush.json new file mode 100644 index 000000000..cb8a5f08f --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/dead_bush.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:block/dead_bush" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/dead_fire_coral.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/dead_fire_coral.json new file mode 100644 index 000000000..7795cff34 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/dead_fire_coral.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:block/dead_fire_coral" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/dead_fire_coral_block.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/dead_fire_coral_block.json new file mode 100644 index 000000000..f169720a6 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/dead_fire_coral_block.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/dead_fire_coral_block" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/dead_fire_coral_fan.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/dead_fire_coral_fan.json new file mode 100644 index 000000000..7d33a6e77 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/dead_fire_coral_fan.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:block/dead_fire_coral_fan" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/dead_horn_coral.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/dead_horn_coral.json new file mode 100644 index 000000000..8dc414ad3 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/dead_horn_coral.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:block/dead_horn_coral" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/dead_horn_coral_block.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/dead_horn_coral_block.json new file mode 100644 index 000000000..a7ed136d5 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/dead_horn_coral_block.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/dead_horn_coral_block" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/dead_horn_coral_fan.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/dead_horn_coral_fan.json new file mode 100644 index 000000000..4e2715a9b --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/dead_horn_coral_fan.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:block/dead_horn_coral_fan" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/dead_tube_coral.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/dead_tube_coral.json new file mode 100644 index 000000000..1d08eff69 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/dead_tube_coral.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:block/dead_tube_coral" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/dead_tube_coral_block.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/dead_tube_coral_block.json new file mode 100644 index 000000000..a16902f98 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/dead_tube_coral_block.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/dead_tube_coral_block" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/dead_tube_coral_fan.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/dead_tube_coral_fan.json new file mode 100644 index 000000000..86ad4fd4c --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/dead_tube_coral_fan.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:block/dead_tube_coral_fan" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/debug_stick.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/debug_stick.json new file mode 100644 index 000000000..f0dc3b971 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/debug_stick.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/handheld", + "textures": { + "layer0": "minecraft:item/stick" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/decorated_pot.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/decorated_pot.json new file mode 100644 index 000000000..70c96e0fd --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/decorated_pot.json @@ -0,0 +1,39 @@ +{ + "parent": "builtin/entity", + "gui_light": "front", + "textures": { + "particle": "entity/decorated_pot/decorated_pot_side" + }, + "display": { + "thirdperson_righthand": { + "rotation": [ 0, 90, 0 ], + "translation": [ 0, 2, 0.5], + "scale":[ 0.375, 0.375, 0.375] + }, + "firstperson_righthand": { + "rotation": [ 0, 90, 0 ], + "translation": [ 0, 0, 0], + "scale":[ 0.375, 0.375, 0.375] + }, + "gui": { + "rotation": [ 30, 45, 0 ], + "translation": [ 0, 0, 0], + "scale":[ 0.60, 0.60, 0.60] + }, + "ground": { + "rotation": [ 0, 0, 0 ], + "translation": [ 0, 1, 0], + "scale":[ 0.25, 0.25, 0.25] + }, + "head": { + "rotation": [ 0, 180, 0 ], + "translation": [ 0, 16, 0], + "scale":[ 1.5, 1.5, 1.5 ] + }, + "fixed": { + "rotation": [ 0, 180, 0 ], + "translation": [ 0, 0, 0], + "scale":[ 0.5, 0.5, 0.5] + } + } +} diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/deepslate.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/deepslate.json new file mode 100644 index 000000000..13980a844 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/deepslate.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/deepslate" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/deepslate_brick_slab.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/deepslate_brick_slab.json new file mode 100644 index 000000000..7e35175de --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/deepslate_brick_slab.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/deepslate_brick_slab" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/deepslate_brick_stairs.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/deepslate_brick_stairs.json new file mode 100644 index 000000000..38c5e3f96 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/deepslate_brick_stairs.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/deepslate_brick_stairs" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/deepslate_brick_wall.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/deepslate_brick_wall.json new file mode 100644 index 000000000..d13b4d425 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/deepslate_brick_wall.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/deepslate_brick_wall_inventory" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/deepslate_bricks.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/deepslate_bricks.json new file mode 100644 index 000000000..5c1525883 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/deepslate_bricks.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/deepslate_bricks" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/deepslate_coal_ore.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/deepslate_coal_ore.json new file mode 100644 index 000000000..f94aeadab --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/deepslate_coal_ore.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/deepslate_coal_ore" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/deepslate_copper_ore.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/deepslate_copper_ore.json new file mode 100644 index 000000000..b5425550d --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/deepslate_copper_ore.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/deepslate_copper_ore" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/deepslate_diamond_ore.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/deepslate_diamond_ore.json new file mode 100644 index 000000000..24eb2e5af --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/deepslate_diamond_ore.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/deepslate_diamond_ore" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/deepslate_emerald_ore.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/deepslate_emerald_ore.json new file mode 100644 index 000000000..a5354b18c --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/deepslate_emerald_ore.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/deepslate_emerald_ore" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/deepslate_gold_ore.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/deepslate_gold_ore.json new file mode 100644 index 000000000..910ff2f7b --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/deepslate_gold_ore.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/deepslate_gold_ore" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/deepslate_iron_ore.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/deepslate_iron_ore.json new file mode 100644 index 000000000..0b10edeaa --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/deepslate_iron_ore.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/deepslate_iron_ore" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/deepslate_lapis_ore.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/deepslate_lapis_ore.json new file mode 100644 index 000000000..d829cea2f --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/deepslate_lapis_ore.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/deepslate_lapis_ore" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/deepslate_redstone_ore.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/deepslate_redstone_ore.json new file mode 100644 index 000000000..c9832e9a8 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/deepslate_redstone_ore.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/deepslate_redstone_ore" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/deepslate_tile_slab.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/deepslate_tile_slab.json new file mode 100644 index 000000000..f09796405 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/deepslate_tile_slab.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/deepslate_tile_slab" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/deepslate_tile_stairs.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/deepslate_tile_stairs.json new file mode 100644 index 000000000..2a7ec05e6 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/deepslate_tile_stairs.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/deepslate_tile_stairs" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/deepslate_tile_wall.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/deepslate_tile_wall.json new file mode 100644 index 000000000..226fa452a --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/deepslate_tile_wall.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/deepslate_tile_wall_inventory" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/deepslate_tiles.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/deepslate_tiles.json new file mode 100644 index 000000000..bdaaaec5f --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/deepslate_tiles.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/deepslate_tiles" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/detector_rail.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/detector_rail.json new file mode 100644 index 000000000..707b24920 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/detector_rail.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:block/detector_rail" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/diamond.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/diamond.json new file mode 100644 index 000000000..dacde7f16 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/diamond.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/diamond" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/diamond_axe.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/diamond_axe.json new file mode 100644 index 000000000..9ab049970 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/diamond_axe.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/handheld", + "textures": { + "layer0": "minecraft:item/diamond_axe" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/diamond_block.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/diamond_block.json new file mode 100644 index 000000000..48d351c4b --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/diamond_block.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/diamond_block" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/diamond_boots.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/diamond_boots.json new file mode 100644 index 000000000..2badf8fd5 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/diamond_boots.json @@ -0,0 +1,68 @@ +{ + "parent": "minecraft:item/generated", + "overrides": [ + { + "model": "minecraft:item/diamond_boots_quartz_trim", + "predicate": { + "trim_type": 0.1 + } + }, + { + "model": "minecraft:item/diamond_boots_iron_trim", + "predicate": { + "trim_type": 0.2 + } + }, + { + "model": "minecraft:item/diamond_boots_netherite_trim", + "predicate": { + "trim_type": 0.3 + } + }, + { + "model": "minecraft:item/diamond_boots_redstone_trim", + "predicate": { + "trim_type": 0.4 + } + }, + { + "model": "minecraft:item/diamond_boots_copper_trim", + "predicate": { + "trim_type": 0.5 + } + }, + { + "model": "minecraft:item/diamond_boots_gold_trim", + "predicate": { + "trim_type": 0.6 + } + }, + { + "model": "minecraft:item/diamond_boots_emerald_trim", + "predicate": { + "trim_type": 0.7 + } + }, + { + "model": "minecraft:item/diamond_boots_diamond_darker_trim", + "predicate": { + "trim_type": 0.8 + } + }, + { + "model": "minecraft:item/diamond_boots_lapis_trim", + "predicate": { + "trim_type": 0.9 + } + }, + { + "model": "minecraft:item/diamond_boots_amethyst_trim", + "predicate": { + "trim_type": 1.0 + } + } + ], + "textures": { + "layer0": "minecraft:item/diamond_boots" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/diamond_boots_amethyst_trim.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/diamond_boots_amethyst_trim.json new file mode 100644 index 000000000..a193a70c4 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/diamond_boots_amethyst_trim.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/diamond_boots", + "layer1": "minecraft:trims/items/boots_trim_amethyst" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/diamond_boots_copper_trim.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/diamond_boots_copper_trim.json new file mode 100644 index 000000000..5ad8de504 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/diamond_boots_copper_trim.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/diamond_boots", + "layer1": "minecraft:trims/items/boots_trim_copper" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/diamond_boots_diamond_darker_trim.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/diamond_boots_diamond_darker_trim.json new file mode 100644 index 000000000..9dd940a29 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/diamond_boots_diamond_darker_trim.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/diamond_boots", + "layer1": "minecraft:trims/items/boots_trim_diamond_darker" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/diamond_boots_emerald_trim.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/diamond_boots_emerald_trim.json new file mode 100644 index 000000000..039509d04 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/diamond_boots_emerald_trim.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/diamond_boots", + "layer1": "minecraft:trims/items/boots_trim_emerald" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/diamond_boots_gold_trim.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/diamond_boots_gold_trim.json new file mode 100644 index 000000000..99c5a53b8 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/diamond_boots_gold_trim.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/diamond_boots", + "layer1": "minecraft:trims/items/boots_trim_gold" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/diamond_boots_iron_trim.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/diamond_boots_iron_trim.json new file mode 100644 index 000000000..f692720f3 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/diamond_boots_iron_trim.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/diamond_boots", + "layer1": "minecraft:trims/items/boots_trim_iron" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/diamond_boots_lapis_trim.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/diamond_boots_lapis_trim.json new file mode 100644 index 000000000..411b13107 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/diamond_boots_lapis_trim.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/diamond_boots", + "layer1": "minecraft:trims/items/boots_trim_lapis" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/diamond_boots_netherite_trim.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/diamond_boots_netherite_trim.json new file mode 100644 index 000000000..55b29ae24 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/diamond_boots_netherite_trim.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/diamond_boots", + "layer1": "minecraft:trims/items/boots_trim_netherite" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/diamond_boots_quartz_trim.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/diamond_boots_quartz_trim.json new file mode 100644 index 000000000..fdecfc8b8 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/diamond_boots_quartz_trim.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/diamond_boots", + "layer1": "minecraft:trims/items/boots_trim_quartz" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/diamond_boots_redstone_trim.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/diamond_boots_redstone_trim.json new file mode 100644 index 000000000..5661c5216 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/diamond_boots_redstone_trim.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/diamond_boots", + "layer1": "minecraft:trims/items/boots_trim_redstone" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/diamond_chestplate.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/diamond_chestplate.json new file mode 100644 index 000000000..b87eb4b50 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/diamond_chestplate.json @@ -0,0 +1,68 @@ +{ + "parent": "minecraft:item/generated", + "overrides": [ + { + "model": "minecraft:item/diamond_chestplate_quartz_trim", + "predicate": { + "trim_type": 0.1 + } + }, + { + "model": "minecraft:item/diamond_chestplate_iron_trim", + "predicate": { + "trim_type": 0.2 + } + }, + { + "model": "minecraft:item/diamond_chestplate_netherite_trim", + "predicate": { + "trim_type": 0.3 + } + }, + { + "model": "minecraft:item/diamond_chestplate_redstone_trim", + "predicate": { + "trim_type": 0.4 + } + }, + { + "model": "minecraft:item/diamond_chestplate_copper_trim", + "predicate": { + "trim_type": 0.5 + } + }, + { + "model": "minecraft:item/diamond_chestplate_gold_trim", + "predicate": { + "trim_type": 0.6 + } + }, + { + "model": "minecraft:item/diamond_chestplate_emerald_trim", + "predicate": { + "trim_type": 0.7 + } + }, + { + "model": "minecraft:item/diamond_chestplate_diamond_darker_trim", + "predicate": { + "trim_type": 0.8 + } + }, + { + "model": "minecraft:item/diamond_chestplate_lapis_trim", + "predicate": { + "trim_type": 0.9 + } + }, + { + "model": "minecraft:item/diamond_chestplate_amethyst_trim", + "predicate": { + "trim_type": 1.0 + } + } + ], + "textures": { + "layer0": "minecraft:item/diamond_chestplate" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/diamond_chestplate_amethyst_trim.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/diamond_chestplate_amethyst_trim.json new file mode 100644 index 000000000..34901619b --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/diamond_chestplate_amethyst_trim.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/diamond_chestplate", + "layer1": "minecraft:trims/items/chestplate_trim_amethyst" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/diamond_chestplate_copper_trim.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/diamond_chestplate_copper_trim.json new file mode 100644 index 000000000..9a1c45212 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/diamond_chestplate_copper_trim.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/diamond_chestplate", + "layer1": "minecraft:trims/items/chestplate_trim_copper" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/diamond_chestplate_diamond_darker_trim.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/diamond_chestplate_diamond_darker_trim.json new file mode 100644 index 000000000..731236728 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/diamond_chestplate_diamond_darker_trim.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/diamond_chestplate", + "layer1": "minecraft:trims/items/chestplate_trim_diamond_darker" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/diamond_chestplate_emerald_trim.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/diamond_chestplate_emerald_trim.json new file mode 100644 index 000000000..7656f0b93 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/diamond_chestplate_emerald_trim.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/diamond_chestplate", + "layer1": "minecraft:trims/items/chestplate_trim_emerald" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/diamond_chestplate_gold_trim.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/diamond_chestplate_gold_trim.json new file mode 100644 index 000000000..b3b7c9916 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/diamond_chestplate_gold_trim.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/diamond_chestplate", + "layer1": "minecraft:trims/items/chestplate_trim_gold" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/diamond_chestplate_iron_trim.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/diamond_chestplate_iron_trim.json new file mode 100644 index 000000000..6eeae07fb --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/diamond_chestplate_iron_trim.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/diamond_chestplate", + "layer1": "minecraft:trims/items/chestplate_trim_iron" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/diamond_chestplate_lapis_trim.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/diamond_chestplate_lapis_trim.json new file mode 100644 index 000000000..a973c512c --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/diamond_chestplate_lapis_trim.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/diamond_chestplate", + "layer1": "minecraft:trims/items/chestplate_trim_lapis" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/diamond_chestplate_netherite_trim.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/diamond_chestplate_netherite_trim.json new file mode 100644 index 000000000..bb5a1007a --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/diamond_chestplate_netherite_trim.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/diamond_chestplate", + "layer1": "minecraft:trims/items/chestplate_trim_netherite" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/diamond_chestplate_quartz_trim.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/diamond_chestplate_quartz_trim.json new file mode 100644 index 000000000..937d5ee31 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/diamond_chestplate_quartz_trim.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/diamond_chestplate", + "layer1": "minecraft:trims/items/chestplate_trim_quartz" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/diamond_chestplate_redstone_trim.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/diamond_chestplate_redstone_trim.json new file mode 100644 index 000000000..63d776079 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/diamond_chestplate_redstone_trim.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/diamond_chestplate", + "layer1": "minecraft:trims/items/chestplate_trim_redstone" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/diamond_helmet.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/diamond_helmet.json new file mode 100644 index 000000000..982a1110d --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/diamond_helmet.json @@ -0,0 +1,68 @@ +{ + "parent": "minecraft:item/generated", + "overrides": [ + { + "model": "minecraft:item/diamond_helmet_quartz_trim", + "predicate": { + "trim_type": 0.1 + } + }, + { + "model": "minecraft:item/diamond_helmet_iron_trim", + "predicate": { + "trim_type": 0.2 + } + }, + { + "model": "minecraft:item/diamond_helmet_netherite_trim", + "predicate": { + "trim_type": 0.3 + } + }, + { + "model": "minecraft:item/diamond_helmet_redstone_trim", + "predicate": { + "trim_type": 0.4 + } + }, + { + "model": "minecraft:item/diamond_helmet_copper_trim", + "predicate": { + "trim_type": 0.5 + } + }, + { + "model": "minecraft:item/diamond_helmet_gold_trim", + "predicate": { + "trim_type": 0.6 + } + }, + { + "model": "minecraft:item/diamond_helmet_emerald_trim", + "predicate": { + "trim_type": 0.7 + } + }, + { + "model": "minecraft:item/diamond_helmet_diamond_darker_trim", + "predicate": { + "trim_type": 0.8 + } + }, + { + "model": "minecraft:item/diamond_helmet_lapis_trim", + "predicate": { + "trim_type": 0.9 + } + }, + { + "model": "minecraft:item/diamond_helmet_amethyst_trim", + "predicate": { + "trim_type": 1.0 + } + } + ], + "textures": { + "layer0": "minecraft:item/diamond_helmet" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/diamond_helmet_amethyst_trim.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/diamond_helmet_amethyst_trim.json new file mode 100644 index 000000000..623a571ed --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/diamond_helmet_amethyst_trim.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/diamond_helmet", + "layer1": "minecraft:trims/items/helmet_trim_amethyst" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/diamond_helmet_copper_trim.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/diamond_helmet_copper_trim.json new file mode 100644 index 000000000..c0a1d8824 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/diamond_helmet_copper_trim.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/diamond_helmet", + "layer1": "minecraft:trims/items/helmet_trim_copper" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/diamond_helmet_diamond_darker_trim.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/diamond_helmet_diamond_darker_trim.json new file mode 100644 index 000000000..0d82b9c02 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/diamond_helmet_diamond_darker_trim.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/diamond_helmet", + "layer1": "minecraft:trims/items/helmet_trim_diamond_darker" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/diamond_helmet_emerald_trim.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/diamond_helmet_emerald_trim.json new file mode 100644 index 000000000..d23a9a6ea --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/diamond_helmet_emerald_trim.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/diamond_helmet", + "layer1": "minecraft:trims/items/helmet_trim_emerald" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/diamond_helmet_gold_trim.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/diamond_helmet_gold_trim.json new file mode 100644 index 000000000..cd80cebe0 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/diamond_helmet_gold_trim.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/diamond_helmet", + "layer1": "minecraft:trims/items/helmet_trim_gold" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/diamond_helmet_iron_trim.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/diamond_helmet_iron_trim.json new file mode 100644 index 000000000..694acc9b5 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/diamond_helmet_iron_trim.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/diamond_helmet", + "layer1": "minecraft:trims/items/helmet_trim_iron" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/diamond_helmet_lapis_trim.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/diamond_helmet_lapis_trim.json new file mode 100644 index 000000000..014fe7355 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/diamond_helmet_lapis_trim.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/diamond_helmet", + "layer1": "minecraft:trims/items/helmet_trim_lapis" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/diamond_helmet_netherite_trim.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/diamond_helmet_netherite_trim.json new file mode 100644 index 000000000..35098eb05 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/diamond_helmet_netherite_trim.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/diamond_helmet", + "layer1": "minecraft:trims/items/helmet_trim_netherite" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/diamond_helmet_quartz_trim.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/diamond_helmet_quartz_trim.json new file mode 100644 index 000000000..104fb171a --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/diamond_helmet_quartz_trim.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/diamond_helmet", + "layer1": "minecraft:trims/items/helmet_trim_quartz" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/diamond_helmet_redstone_trim.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/diamond_helmet_redstone_trim.json new file mode 100644 index 000000000..f520dae20 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/diamond_helmet_redstone_trim.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/diamond_helmet", + "layer1": "minecraft:trims/items/helmet_trim_redstone" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/diamond_hoe.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/diamond_hoe.json new file mode 100644 index 000000000..c777b6d39 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/diamond_hoe.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/handheld", + "textures": { + "layer0": "minecraft:item/diamond_hoe" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/diamond_horse_armor.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/diamond_horse_armor.json new file mode 100644 index 000000000..017194b73 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/diamond_horse_armor.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/diamond_horse_armor" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/diamond_leggings.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/diamond_leggings.json new file mode 100644 index 000000000..fdc94914e --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/diamond_leggings.json @@ -0,0 +1,68 @@ +{ + "parent": "minecraft:item/generated", + "overrides": [ + { + "model": "minecraft:item/diamond_leggings_quartz_trim", + "predicate": { + "trim_type": 0.1 + } + }, + { + "model": "minecraft:item/diamond_leggings_iron_trim", + "predicate": { + "trim_type": 0.2 + } + }, + { + "model": "minecraft:item/diamond_leggings_netherite_trim", + "predicate": { + "trim_type": 0.3 + } + }, + { + "model": "minecraft:item/diamond_leggings_redstone_trim", + "predicate": { + "trim_type": 0.4 + } + }, + { + "model": "minecraft:item/diamond_leggings_copper_trim", + "predicate": { + "trim_type": 0.5 + } + }, + { + "model": "minecraft:item/diamond_leggings_gold_trim", + "predicate": { + "trim_type": 0.6 + } + }, + { + "model": "minecraft:item/diamond_leggings_emerald_trim", + "predicate": { + "trim_type": 0.7 + } + }, + { + "model": "minecraft:item/diamond_leggings_diamond_darker_trim", + "predicate": { + "trim_type": 0.8 + } + }, + { + "model": "minecraft:item/diamond_leggings_lapis_trim", + "predicate": { + "trim_type": 0.9 + } + }, + { + "model": "minecraft:item/diamond_leggings_amethyst_trim", + "predicate": { + "trim_type": 1.0 + } + } + ], + "textures": { + "layer0": "minecraft:item/diamond_leggings" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/diamond_leggings_amethyst_trim.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/diamond_leggings_amethyst_trim.json new file mode 100644 index 000000000..355ce9663 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/diamond_leggings_amethyst_trim.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/diamond_leggings", + "layer1": "minecraft:trims/items/leggings_trim_amethyst" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/diamond_leggings_copper_trim.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/diamond_leggings_copper_trim.json new file mode 100644 index 000000000..882c71998 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/diamond_leggings_copper_trim.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/diamond_leggings", + "layer1": "minecraft:trims/items/leggings_trim_copper" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/diamond_leggings_diamond_darker_trim.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/diamond_leggings_diamond_darker_trim.json new file mode 100644 index 000000000..2d6367397 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/diamond_leggings_diamond_darker_trim.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/diamond_leggings", + "layer1": "minecraft:trims/items/leggings_trim_diamond_darker" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/diamond_leggings_emerald_trim.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/diamond_leggings_emerald_trim.json new file mode 100644 index 000000000..4bacdd8b6 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/diamond_leggings_emerald_trim.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/diamond_leggings", + "layer1": "minecraft:trims/items/leggings_trim_emerald" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/diamond_leggings_gold_trim.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/diamond_leggings_gold_trim.json new file mode 100644 index 000000000..90655d486 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/diamond_leggings_gold_trim.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/diamond_leggings", + "layer1": "minecraft:trims/items/leggings_trim_gold" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/diamond_leggings_iron_trim.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/diamond_leggings_iron_trim.json new file mode 100644 index 000000000..7503db5e3 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/diamond_leggings_iron_trim.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/diamond_leggings", + "layer1": "minecraft:trims/items/leggings_trim_iron" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/diamond_leggings_lapis_trim.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/diamond_leggings_lapis_trim.json new file mode 100644 index 000000000..8f0a3f847 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/diamond_leggings_lapis_trim.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/diamond_leggings", + "layer1": "minecraft:trims/items/leggings_trim_lapis" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/diamond_leggings_netherite_trim.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/diamond_leggings_netherite_trim.json new file mode 100644 index 000000000..9d8085c8e --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/diamond_leggings_netherite_trim.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/diamond_leggings", + "layer1": "minecraft:trims/items/leggings_trim_netherite" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/diamond_leggings_quartz_trim.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/diamond_leggings_quartz_trim.json new file mode 100644 index 000000000..85edee564 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/diamond_leggings_quartz_trim.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/diamond_leggings", + "layer1": "minecraft:trims/items/leggings_trim_quartz" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/diamond_leggings_redstone_trim.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/diamond_leggings_redstone_trim.json new file mode 100644 index 000000000..2232f1a3b --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/diamond_leggings_redstone_trim.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/diamond_leggings", + "layer1": "minecraft:trims/items/leggings_trim_redstone" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/diamond_ore.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/diamond_ore.json new file mode 100644 index 000000000..da18313d3 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/diamond_ore.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/diamond_ore" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/diamond_pickaxe.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/diamond_pickaxe.json new file mode 100644 index 000000000..88301e5cf --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/diamond_pickaxe.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/handheld", + "textures": { + "layer0": "minecraft:item/diamond_pickaxe" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/diamond_shovel.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/diamond_shovel.json new file mode 100644 index 000000000..dc4e6c84b --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/diamond_shovel.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/handheld", + "textures": { + "layer0": "minecraft:item/diamond_shovel" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/diamond_sword.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/diamond_sword.json new file mode 100644 index 000000000..26f4a2e09 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/diamond_sword.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/handheld", + "textures": { + "layer0": "minecraft:item/diamond_sword" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/diorite.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/diorite.json new file mode 100644 index 000000000..f9d3f6b46 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/diorite.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/diorite" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/diorite_slab.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/diorite_slab.json new file mode 100644 index 000000000..fbfbc7a6f --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/diorite_slab.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/diorite_slab" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/diorite_stairs.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/diorite_stairs.json new file mode 100644 index 000000000..fdfa11abe --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/diorite_stairs.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/diorite_stairs" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/diorite_wall.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/diorite_wall.json new file mode 100644 index 000000000..192d72827 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/diorite_wall.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/diorite_wall_inventory" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/dirt.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/dirt.json new file mode 100644 index 000000000..8f9dbab5e --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/dirt.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/dirt" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/dirt_path.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/dirt_path.json new file mode 100644 index 000000000..e60515e4d --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/dirt_path.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/dirt_path" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/disc_fragment_5.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/disc_fragment_5.json new file mode 100644 index 000000000..806624c7b --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/disc_fragment_5.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/disc_fragment_5" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/dispenser.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/dispenser.json new file mode 100644 index 000000000..b88156bcf --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/dispenser.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/dispenser" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/dolphin_spawn_egg.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/dolphin_spawn_egg.json new file mode 100644 index 000000000..d1aaa9d6e --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/dolphin_spawn_egg.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:item/template_spawn_egg" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/donkey_spawn_egg.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/donkey_spawn_egg.json new file mode 100644 index 000000000..d1aaa9d6e --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/donkey_spawn_egg.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:item/template_spawn_egg" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/dragon_breath.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/dragon_breath.json new file mode 100644 index 000000000..424980b1d --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/dragon_breath.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/dragon_breath" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/dragon_egg.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/dragon_egg.json new file mode 100644 index 000000000..1570a78ad --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/dragon_egg.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/dragon_egg" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/dragon_head.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/dragon_head.json new file mode 100644 index 000000000..862647621 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/dragon_head.json @@ -0,0 +1,15 @@ +{ + "parent": "item/template_skull", + "display": { + "gui": { + "translation": [ -2, 2, 0 ], + "rotation": [ 30, 45, 0 ], + "scale": [ 0.6, 0.6, 0.6 ] + }, + "thirdperson_righthand": { + "rotation": [ 0, 180, 0 ], + "translation": [ 0, -1, 2 ], + "scale": [ 0.5, 0.5, 0.5 ] + } + } +} diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/dried_kelp.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/dried_kelp.json new file mode 100644 index 000000000..a4e4efffc --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/dried_kelp.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/dried_kelp" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/dried_kelp_block.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/dried_kelp_block.json new file mode 100644 index 000000000..2f3f1c329 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/dried_kelp_block.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/dried_kelp_block" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/dripstone_block.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/dripstone_block.json new file mode 100644 index 000000000..d6d9c09d6 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/dripstone_block.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/dripstone_block" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/dropper.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/dropper.json new file mode 100644 index 000000000..a8b40e592 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/dropper.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/dropper" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/drowned_spawn_egg.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/drowned_spawn_egg.json new file mode 100644 index 000000000..d1aaa9d6e --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/drowned_spawn_egg.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:item/template_spawn_egg" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/dune_armor_trim_smithing_template.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/dune_armor_trim_smithing_template.json new file mode 100644 index 000000000..eaf0f46c1 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/dune_armor_trim_smithing_template.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/dune_armor_trim_smithing_template" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/echo_shard.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/echo_shard.json new file mode 100644 index 000000000..a6f71e738 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/echo_shard.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/echo_shard" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/egg.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/egg.json new file mode 100644 index 000000000..86ec3cae9 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/egg.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/egg" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/elder_guardian_spawn_egg.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/elder_guardian_spawn_egg.json new file mode 100644 index 000000000..d1aaa9d6e --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/elder_guardian_spawn_egg.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:item/template_spawn_egg" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/elytra.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/elytra.json new file mode 100644 index 000000000..3909ded52 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/elytra.json @@ -0,0 +1,14 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "item/elytra" + }, + "overrides": [ + { + "predicate": { + "broken": 1 + }, + "model": "item/broken_elytra" + } + ] +} diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/emerald.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/emerald.json new file mode 100644 index 000000000..4f19c1d9f --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/emerald.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/emerald" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/emerald_block.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/emerald_block.json new file mode 100644 index 000000000..27c3713ad --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/emerald_block.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/emerald_block" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/emerald_ore.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/emerald_ore.json new file mode 100644 index 000000000..3569bde18 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/emerald_ore.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/emerald_ore" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/enchanted_book.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/enchanted_book.json new file mode 100644 index 000000000..b6a35e577 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/enchanted_book.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/enchanted_book" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/enchanted_golden_apple.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/enchanted_golden_apple.json new file mode 100644 index 000000000..868c92193 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/enchanted_golden_apple.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/golden_apple" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/enchanting_table.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/enchanting_table.json new file mode 100644 index 000000000..9f76fca22 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/enchanting_table.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/enchanting_table" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/end_crystal.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/end_crystal.json new file mode 100644 index 000000000..15aa5897f --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/end_crystal.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/end_crystal" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/end_portal_frame.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/end_portal_frame.json new file mode 100644 index 000000000..718814c22 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/end_portal_frame.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/end_portal_frame" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/end_rod.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/end_rod.json new file mode 100644 index 000000000..809dec3fd --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/end_rod.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/end_rod" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/end_stone.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/end_stone.json new file mode 100644 index 000000000..fc4cf92a4 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/end_stone.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/end_stone" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/end_stone_brick_slab.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/end_stone_brick_slab.json new file mode 100644 index 000000000..3daf70724 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/end_stone_brick_slab.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/end_stone_brick_slab" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/end_stone_brick_stairs.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/end_stone_brick_stairs.json new file mode 100644 index 000000000..b43fdfe6d --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/end_stone_brick_stairs.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/end_stone_brick_stairs" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/end_stone_brick_wall.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/end_stone_brick_wall.json new file mode 100644 index 000000000..a0a4f8439 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/end_stone_brick_wall.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/end_stone_brick_wall_inventory" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/end_stone_bricks.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/end_stone_bricks.json new file mode 100644 index 000000000..a0bb1b983 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/end_stone_bricks.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/end_stone_bricks" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/ender_chest.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/ender_chest.json new file mode 100644 index 000000000..58aba3388 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/ender_chest.json @@ -0,0 +1,6 @@ +{ + "parent": "item/chest", + "textures": { + "particle": "block/obsidian" + } +} diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/ender_dragon_spawn_egg.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/ender_dragon_spawn_egg.json new file mode 100644 index 000000000..d1aaa9d6e --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/ender_dragon_spawn_egg.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:item/template_spawn_egg" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/ender_eye.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/ender_eye.json new file mode 100644 index 000000000..d29cc4e08 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/ender_eye.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/ender_eye" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/ender_pearl.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/ender_pearl.json new file mode 100644 index 000000000..e6ccd02fa --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/ender_pearl.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/ender_pearl" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/enderman_spawn_egg.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/enderman_spawn_egg.json new file mode 100644 index 000000000..d1aaa9d6e --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/enderman_spawn_egg.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:item/template_spawn_egg" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/endermite_spawn_egg.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/endermite_spawn_egg.json new file mode 100644 index 000000000..d1aaa9d6e --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/endermite_spawn_egg.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:item/template_spawn_egg" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/evoker_spawn_egg.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/evoker_spawn_egg.json new file mode 100644 index 000000000..d1aaa9d6e --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/evoker_spawn_egg.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:item/template_spawn_egg" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/experience_bottle.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/experience_bottle.json new file mode 100644 index 000000000..22a77fe72 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/experience_bottle.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/experience_bottle" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/explorer_pottery_sherd.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/explorer_pottery_sherd.json new file mode 100644 index 000000000..affa6dd29 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/explorer_pottery_sherd.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/explorer_pottery_sherd" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/exposed_chiseled_copper.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/exposed_chiseled_copper.json new file mode 100644 index 000000000..11278b6ad --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/exposed_chiseled_copper.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/exposed_chiseled_copper" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/exposed_copper.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/exposed_copper.json new file mode 100644 index 000000000..5881fd7b3 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/exposed_copper.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/exposed_copper" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/exposed_copper_bulb.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/exposed_copper_bulb.json new file mode 100644 index 000000000..6ddcba9ae --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/exposed_copper_bulb.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/exposed_copper_bulb" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/exposed_copper_door.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/exposed_copper_door.json new file mode 100644 index 000000000..78a9d4d8d --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/exposed_copper_door.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/exposed_copper_door" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/exposed_copper_grate.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/exposed_copper_grate.json new file mode 100644 index 000000000..b7a3c78e2 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/exposed_copper_grate.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/exposed_copper_grate" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/exposed_copper_trapdoor.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/exposed_copper_trapdoor.json new file mode 100644 index 000000000..7546ce3c9 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/exposed_copper_trapdoor.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/exposed_copper_trapdoor_bottom" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/exposed_cut_copper.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/exposed_cut_copper.json new file mode 100644 index 000000000..b5c7d8f01 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/exposed_cut_copper.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/exposed_cut_copper" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/exposed_cut_copper_slab.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/exposed_cut_copper_slab.json new file mode 100644 index 000000000..29ce47239 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/exposed_cut_copper_slab.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/exposed_cut_copper_slab" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/exposed_cut_copper_stairs.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/exposed_cut_copper_stairs.json new file mode 100644 index 000000000..24bdd2851 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/exposed_cut_copper_stairs.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/exposed_cut_copper_stairs" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/eye_armor_trim_smithing_template.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/eye_armor_trim_smithing_template.json new file mode 100644 index 000000000..d629fc1b6 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/eye_armor_trim_smithing_template.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/eye_armor_trim_smithing_template" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/farmland.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/farmland.json new file mode 100644 index 000000000..1c5eceae5 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/farmland.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/farmland" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/feather.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/feather.json new file mode 100644 index 000000000..1b88f92d8 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/feather.json @@ -0,0 +1,13 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "item/feather" + }, + "display": { + "head": { + "rotation": [ 0, 0, 45 ], + "translation": [ -1, 13, 7], + "scale":[ 1, 1, 1] + } + } +} diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/fermented_spider_eye.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/fermented_spider_eye.json new file mode 100644 index 000000000..06bbefceb --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/fermented_spider_eye.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/fermented_spider_eye" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/fern.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/fern.json new file mode 100644 index 000000000..851ce5d38 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/fern.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:block/fern" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/field_masoned_banner_pattern.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/field_masoned_banner_pattern.json new file mode 100644 index 000000000..404fbedee --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/field_masoned_banner_pattern.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/field_masoned_banner_pattern" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/filled_map.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/filled_map.json new file mode 100644 index 000000000..077d2530e --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/filled_map.json @@ -0,0 +1,7 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "item/filled_map", + "layer1": "item/filled_map_markings" + } +} diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/fire_charge.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/fire_charge.json new file mode 100644 index 000000000..27d3f0d81 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/fire_charge.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/fire_charge" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/fire_coral.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/fire_coral.json new file mode 100644 index 000000000..8585f4c8f --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/fire_coral.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:block/fire_coral" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/fire_coral_block.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/fire_coral_block.json new file mode 100644 index 000000000..eebe05e14 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/fire_coral_block.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/fire_coral_block" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/fire_coral_fan.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/fire_coral_fan.json new file mode 100644 index 000000000..c27e2d3a1 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/fire_coral_fan.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:block/fire_coral_fan" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/firework_rocket.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/firework_rocket.json new file mode 100644 index 000000000..cb7cf197c --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/firework_rocket.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/firework_rocket" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/firework_star.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/firework_star.json new file mode 100644 index 000000000..4e2e9fe80 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/firework_star.json @@ -0,0 +1,7 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "item/firework_star", + "layer1": "item/firework_star_overlay" + } +} diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/fishing_rod.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/fishing_rod.json new file mode 100644 index 000000000..6d52bb97e --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/fishing_rod.json @@ -0,0 +1,14 @@ +{ + "parent": "item/handheld_rod", + "textures": { + "layer0": "item/fishing_rod" + }, + "overrides": [ + { + "predicate": { + "cast": 1 + }, + "model": "item/fishing_rod_cast" + } + ] +} diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/fishing_rod_cast.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/fishing_rod_cast.json new file mode 100644 index 000000000..55c2a5253 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/fishing_rod_cast.json @@ -0,0 +1,6 @@ +{ + "parent": "item/fishing_rod", + "textures": { + "layer0": "item/fishing_rod_cast" + } +} diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/fletching_table.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/fletching_table.json new file mode 100644 index 000000000..bc2b1bdc7 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/fletching_table.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/fletching_table" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/flint.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/flint.json new file mode 100644 index 000000000..3a5572958 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/flint.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/flint" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/flint_and_steel.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/flint_and_steel.json new file mode 100644 index 000000000..d11a12a90 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/flint_and_steel.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/flint_and_steel" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/flow_armor_trim_smithing_template.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/flow_armor_trim_smithing_template.json new file mode 100644 index 000000000..0aec5a447 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/flow_armor_trim_smithing_template.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/flow_armor_trim_smithing_template" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/flow_banner_pattern.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/flow_banner_pattern.json new file mode 100644 index 000000000..82c9af4ba --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/flow_banner_pattern.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/flow_banner_pattern" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/flow_pottery_sherd.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/flow_pottery_sherd.json new file mode 100644 index 000000000..ad6dac5dc --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/flow_pottery_sherd.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/flow_pottery_sherd" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/flower_banner_pattern.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/flower_banner_pattern.json new file mode 100644 index 000000000..ea8b8215f --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/flower_banner_pattern.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/flower_banner_pattern" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/flower_pot.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/flower_pot.json new file mode 100644 index 000000000..e50e0fa1a --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/flower_pot.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/flower_pot" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/flowering_azalea.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/flowering_azalea.json new file mode 100644 index 000000000..e5f437e8c --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/flowering_azalea.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/flowering_azalea" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/flowering_azalea_leaves.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/flowering_azalea_leaves.json new file mode 100644 index 000000000..c3ecf6e7d --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/flowering_azalea_leaves.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/flowering_azalea_leaves" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/fox_spawn_egg.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/fox_spawn_egg.json new file mode 100644 index 000000000..d1aaa9d6e --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/fox_spawn_egg.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:item/template_spawn_egg" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/friend_pottery_sherd.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/friend_pottery_sherd.json new file mode 100644 index 000000000..b618f305d --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/friend_pottery_sherd.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/friend_pottery_sherd" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/frog_spawn_egg.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/frog_spawn_egg.json new file mode 100644 index 000000000..d1aaa9d6e --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/frog_spawn_egg.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:item/template_spawn_egg" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/frogspawn.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/frogspawn.json new file mode 100644 index 000000000..6fd44430f --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/frogspawn.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:block/frogspawn" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/furnace.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/furnace.json new file mode 100644 index 000000000..593027e9d --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/furnace.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/furnace" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/furnace_minecart.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/furnace_minecart.json new file mode 100644 index 000000000..e3e6f2223 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/furnace_minecart.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/furnace_minecart" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/generated.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/generated.json new file mode 100644 index 000000000..89aa79e95 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/generated.json @@ -0,0 +1,30 @@ +{ + "parent": "builtin/generated", + "gui_light": "front", + "display": { + "ground": { + "rotation": [ 0, 0, 0 ], + "translation": [ 0, 2, 0], + "scale":[ 0.5, 0.5, 0.5 ] + }, + "head": { + "rotation": [ 0, 180, 0 ], + "translation": [ 0, 13, 7], + "scale":[ 1, 1, 1] + }, + "thirdperson_righthand": { + "rotation": [ 0, 0, 0 ], + "translation": [ 0, 3, 1 ], + "scale": [ 0.55, 0.55, 0.55 ] + }, + "firstperson_righthand": { + "rotation": [ 0, -90, 25 ], + "translation": [ 1.13, 3.2, 1.13], + "scale": [ 0.68, 0.68, 0.68 ] + }, + "fixed": { + "rotation": [ 0, 180, 0 ], + "scale": [ 1, 1, 1 ] + } + } +} diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/ghast_spawn_egg.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/ghast_spawn_egg.json new file mode 100644 index 000000000..d1aaa9d6e --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/ghast_spawn_egg.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:item/template_spawn_egg" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/ghast_tear.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/ghast_tear.json new file mode 100644 index 000000000..d7d6e6f3a --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/ghast_tear.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/ghast_tear" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/gilded_blackstone.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/gilded_blackstone.json new file mode 100644 index 000000000..a0779ccd8 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/gilded_blackstone.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/gilded_blackstone" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/glass.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/glass.json new file mode 100644 index 000000000..658254343 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/glass.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/glass" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/glass_bottle.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/glass_bottle.json new file mode 100644 index 000000000..9b4ab510c --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/glass_bottle.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/glass_bottle" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/glass_pane.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/glass_pane.json new file mode 100644 index 000000000..de799dcff --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/glass_pane.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:block/glass" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/glistering_melon_slice.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/glistering_melon_slice.json new file mode 100644 index 000000000..90c290a08 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/glistering_melon_slice.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/glistering_melon_slice" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/globe_banner_pattern.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/globe_banner_pattern.json new file mode 100644 index 000000000..3948f16f7 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/globe_banner_pattern.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/globe_banner_pattern" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/glow_berries.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/glow_berries.json new file mode 100644 index 000000000..b77ea725e --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/glow_berries.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/glow_berries" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/glow_ink_sac.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/glow_ink_sac.json new file mode 100644 index 000000000..fc21cec42 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/glow_ink_sac.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/glow_ink_sac" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/glow_item_frame.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/glow_item_frame.json new file mode 100644 index 000000000..a2323a19b --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/glow_item_frame.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/glow_item_frame" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/glow_lichen.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/glow_lichen.json new file mode 100644 index 000000000..7b796f838 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/glow_lichen.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:block/glow_lichen" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/glow_squid_spawn_egg.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/glow_squid_spawn_egg.json new file mode 100644 index 000000000..d1aaa9d6e --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/glow_squid_spawn_egg.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:item/template_spawn_egg" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/glowstone.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/glowstone.json new file mode 100644 index 000000000..5567a8878 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/glowstone.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/glowstone" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/glowstone_dust.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/glowstone_dust.json new file mode 100644 index 000000000..4b78f60be --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/glowstone_dust.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/glowstone_dust" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/goat_horn.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/goat_horn.json new file mode 100644 index 000000000..eb549504e --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/goat_horn.json @@ -0,0 +1,36 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "item/goat_horn" + }, + "display": { + "thirdperson_righthand": { + "rotation": [ 0, 180, 0 ], + "translation": [ 0, 3, 1 ], + "scale": [ 0.55, 0.55, 0.55 ] + }, + "thirdperson_lefthand": { + "rotation": [ 0, 0, 0 ], + "translation": [ 0, 3, 1 ], + "scale": [ 0.55, 0.55, 0.55 ] + }, + "firstperson_righthand": { + "rotation": [ 0, -90, 25 ], + "translation": [ 1.13, 3.2, 1.13 ], + "scale": [ 0.68, 0.68, 0.68 ] + }, + "firstperson_lefthand": { + "rotation": [ 0, 90, -25 ], + "translation": [ 1.13, 3.2, 1.13 ], + "scale": [ 0.68, 0.68, 0.68 ] + } + }, + "overrides": [ + { + "predicate": { + "tooting": 1 + }, + "model": "item/tooting_goat_horn" + } + ] +} diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/goat_spawn_egg.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/goat_spawn_egg.json new file mode 100644 index 000000000..d1aaa9d6e --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/goat_spawn_egg.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:item/template_spawn_egg" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/gold_block.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/gold_block.json new file mode 100644 index 000000000..f9cefd04e --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/gold_block.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/gold_block" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/gold_ingot.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/gold_ingot.json new file mode 100644 index 000000000..230e3111f --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/gold_ingot.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/gold_ingot" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/gold_nugget.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/gold_nugget.json new file mode 100644 index 000000000..3da43c93d --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/gold_nugget.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/gold_nugget" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/gold_ore.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/gold_ore.json new file mode 100644 index 000000000..64c164535 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/gold_ore.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/gold_ore" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/golden_apple.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/golden_apple.json new file mode 100644 index 000000000..868c92193 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/golden_apple.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/golden_apple" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/golden_axe.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/golden_axe.json new file mode 100644 index 000000000..42008eeae --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/golden_axe.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/handheld", + "textures": { + "layer0": "minecraft:item/golden_axe" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/golden_boots.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/golden_boots.json new file mode 100644 index 000000000..427896c37 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/golden_boots.json @@ -0,0 +1,68 @@ +{ + "parent": "minecraft:item/generated", + "overrides": [ + { + "model": "minecraft:item/golden_boots_quartz_trim", + "predicate": { + "trim_type": 0.1 + } + }, + { + "model": "minecraft:item/golden_boots_iron_trim", + "predicate": { + "trim_type": 0.2 + } + }, + { + "model": "minecraft:item/golden_boots_netherite_trim", + "predicate": { + "trim_type": 0.3 + } + }, + { + "model": "minecraft:item/golden_boots_redstone_trim", + "predicate": { + "trim_type": 0.4 + } + }, + { + "model": "minecraft:item/golden_boots_copper_trim", + "predicate": { + "trim_type": 0.5 + } + }, + { + "model": "minecraft:item/golden_boots_gold_darker_trim", + "predicate": { + "trim_type": 0.6 + } + }, + { + "model": "minecraft:item/golden_boots_emerald_trim", + "predicate": { + "trim_type": 0.7 + } + }, + { + "model": "minecraft:item/golden_boots_diamond_trim", + "predicate": { + "trim_type": 0.8 + } + }, + { + "model": "minecraft:item/golden_boots_lapis_trim", + "predicate": { + "trim_type": 0.9 + } + }, + { + "model": "minecraft:item/golden_boots_amethyst_trim", + "predicate": { + "trim_type": 1.0 + } + } + ], + "textures": { + "layer0": "minecraft:item/golden_boots" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/golden_boots_amethyst_trim.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/golden_boots_amethyst_trim.json new file mode 100644 index 000000000..da31bd587 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/golden_boots_amethyst_trim.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/golden_boots", + "layer1": "minecraft:trims/items/boots_trim_amethyst" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/golden_boots_copper_trim.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/golden_boots_copper_trim.json new file mode 100644 index 000000000..e79eb60a1 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/golden_boots_copper_trim.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/golden_boots", + "layer1": "minecraft:trims/items/boots_trim_copper" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/golden_boots_diamond_trim.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/golden_boots_diamond_trim.json new file mode 100644 index 000000000..2ced80f9a --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/golden_boots_diamond_trim.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/golden_boots", + "layer1": "minecraft:trims/items/boots_trim_diamond" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/golden_boots_emerald_trim.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/golden_boots_emerald_trim.json new file mode 100644 index 000000000..78154d772 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/golden_boots_emerald_trim.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/golden_boots", + "layer1": "minecraft:trims/items/boots_trim_emerald" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/golden_boots_gold_darker_trim.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/golden_boots_gold_darker_trim.json new file mode 100644 index 000000000..354544588 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/golden_boots_gold_darker_trim.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/golden_boots", + "layer1": "minecraft:trims/items/boots_trim_gold_darker" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/golden_boots_iron_trim.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/golden_boots_iron_trim.json new file mode 100644 index 000000000..b63010f02 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/golden_boots_iron_trim.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/golden_boots", + "layer1": "minecraft:trims/items/boots_trim_iron" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/golden_boots_lapis_trim.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/golden_boots_lapis_trim.json new file mode 100644 index 000000000..268ab549a --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/golden_boots_lapis_trim.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/golden_boots", + "layer1": "minecraft:trims/items/boots_trim_lapis" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/golden_boots_netherite_trim.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/golden_boots_netherite_trim.json new file mode 100644 index 000000000..e329b9cbc --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/golden_boots_netherite_trim.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/golden_boots", + "layer1": "minecraft:trims/items/boots_trim_netherite" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/golden_boots_quartz_trim.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/golden_boots_quartz_trim.json new file mode 100644 index 000000000..4e8cc2d3b --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/golden_boots_quartz_trim.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/golden_boots", + "layer1": "minecraft:trims/items/boots_trim_quartz" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/golden_boots_redstone_trim.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/golden_boots_redstone_trim.json new file mode 100644 index 000000000..bda608e0b --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/golden_boots_redstone_trim.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/golden_boots", + "layer1": "minecraft:trims/items/boots_trim_redstone" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/golden_carrot.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/golden_carrot.json new file mode 100644 index 000000000..8d36365f3 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/golden_carrot.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/golden_carrot" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/golden_chestplate.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/golden_chestplate.json new file mode 100644 index 000000000..b828f0323 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/golden_chestplate.json @@ -0,0 +1,68 @@ +{ + "parent": "minecraft:item/generated", + "overrides": [ + { + "model": "minecraft:item/golden_chestplate_quartz_trim", + "predicate": { + "trim_type": 0.1 + } + }, + { + "model": "minecraft:item/golden_chestplate_iron_trim", + "predicate": { + "trim_type": 0.2 + } + }, + { + "model": "minecraft:item/golden_chestplate_netherite_trim", + "predicate": { + "trim_type": 0.3 + } + }, + { + "model": "minecraft:item/golden_chestplate_redstone_trim", + "predicate": { + "trim_type": 0.4 + } + }, + { + "model": "minecraft:item/golden_chestplate_copper_trim", + "predicate": { + "trim_type": 0.5 + } + }, + { + "model": "minecraft:item/golden_chestplate_gold_darker_trim", + "predicate": { + "trim_type": 0.6 + } + }, + { + "model": "minecraft:item/golden_chestplate_emerald_trim", + "predicate": { + "trim_type": 0.7 + } + }, + { + "model": "minecraft:item/golden_chestplate_diamond_trim", + "predicate": { + "trim_type": 0.8 + } + }, + { + "model": "minecraft:item/golden_chestplate_lapis_trim", + "predicate": { + "trim_type": 0.9 + } + }, + { + "model": "minecraft:item/golden_chestplate_amethyst_trim", + "predicate": { + "trim_type": 1.0 + } + } + ], + "textures": { + "layer0": "minecraft:item/golden_chestplate" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/golden_chestplate_amethyst_trim.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/golden_chestplate_amethyst_trim.json new file mode 100644 index 000000000..d0b4b1816 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/golden_chestplate_amethyst_trim.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/golden_chestplate", + "layer1": "minecraft:trims/items/chestplate_trim_amethyst" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/golden_chestplate_copper_trim.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/golden_chestplate_copper_trim.json new file mode 100644 index 000000000..f9b9f9382 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/golden_chestplate_copper_trim.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/golden_chestplate", + "layer1": "minecraft:trims/items/chestplate_trim_copper" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/golden_chestplate_diamond_trim.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/golden_chestplate_diamond_trim.json new file mode 100644 index 000000000..adf1bc6f7 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/golden_chestplate_diamond_trim.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/golden_chestplate", + "layer1": "minecraft:trims/items/chestplate_trim_diamond" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/golden_chestplate_emerald_trim.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/golden_chestplate_emerald_trim.json new file mode 100644 index 000000000..af97428b3 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/golden_chestplate_emerald_trim.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/golden_chestplate", + "layer1": "minecraft:trims/items/chestplate_trim_emerald" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/golden_chestplate_gold_darker_trim.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/golden_chestplate_gold_darker_trim.json new file mode 100644 index 000000000..3328597c2 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/golden_chestplate_gold_darker_trim.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/golden_chestplate", + "layer1": "minecraft:trims/items/chestplate_trim_gold_darker" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/golden_chestplate_iron_trim.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/golden_chestplate_iron_trim.json new file mode 100644 index 000000000..ed2aa0edd --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/golden_chestplate_iron_trim.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/golden_chestplate", + "layer1": "minecraft:trims/items/chestplate_trim_iron" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/golden_chestplate_lapis_trim.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/golden_chestplate_lapis_trim.json new file mode 100644 index 000000000..4c748a101 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/golden_chestplate_lapis_trim.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/golden_chestplate", + "layer1": "minecraft:trims/items/chestplate_trim_lapis" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/golden_chestplate_netherite_trim.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/golden_chestplate_netherite_trim.json new file mode 100644 index 000000000..aab4dfb37 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/golden_chestplate_netherite_trim.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/golden_chestplate", + "layer1": "minecraft:trims/items/chestplate_trim_netherite" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/golden_chestplate_quartz_trim.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/golden_chestplate_quartz_trim.json new file mode 100644 index 000000000..1632e6ce6 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/golden_chestplate_quartz_trim.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/golden_chestplate", + "layer1": "minecraft:trims/items/chestplate_trim_quartz" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/golden_chestplate_redstone_trim.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/golden_chestplate_redstone_trim.json new file mode 100644 index 000000000..2f24fa905 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/golden_chestplate_redstone_trim.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/golden_chestplate", + "layer1": "minecraft:trims/items/chestplate_trim_redstone" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/golden_helmet.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/golden_helmet.json new file mode 100644 index 000000000..114e56935 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/golden_helmet.json @@ -0,0 +1,68 @@ +{ + "parent": "minecraft:item/generated", + "overrides": [ + { + "model": "minecraft:item/golden_helmet_quartz_trim", + "predicate": { + "trim_type": 0.1 + } + }, + { + "model": "minecraft:item/golden_helmet_iron_trim", + "predicate": { + "trim_type": 0.2 + } + }, + { + "model": "minecraft:item/golden_helmet_netherite_trim", + "predicate": { + "trim_type": 0.3 + } + }, + { + "model": "minecraft:item/golden_helmet_redstone_trim", + "predicate": { + "trim_type": 0.4 + } + }, + { + "model": "minecraft:item/golden_helmet_copper_trim", + "predicate": { + "trim_type": 0.5 + } + }, + { + "model": "minecraft:item/golden_helmet_gold_darker_trim", + "predicate": { + "trim_type": 0.6 + } + }, + { + "model": "minecraft:item/golden_helmet_emerald_trim", + "predicate": { + "trim_type": 0.7 + } + }, + { + "model": "minecraft:item/golden_helmet_diamond_trim", + "predicate": { + "trim_type": 0.8 + } + }, + { + "model": "minecraft:item/golden_helmet_lapis_trim", + "predicate": { + "trim_type": 0.9 + } + }, + { + "model": "minecraft:item/golden_helmet_amethyst_trim", + "predicate": { + "trim_type": 1.0 + } + } + ], + "textures": { + "layer0": "minecraft:item/golden_helmet" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/golden_helmet_amethyst_trim.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/golden_helmet_amethyst_trim.json new file mode 100644 index 000000000..47ccae21b --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/golden_helmet_amethyst_trim.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/golden_helmet", + "layer1": "minecraft:trims/items/helmet_trim_amethyst" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/golden_helmet_copper_trim.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/golden_helmet_copper_trim.json new file mode 100644 index 000000000..4a3ee8e40 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/golden_helmet_copper_trim.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/golden_helmet", + "layer1": "minecraft:trims/items/helmet_trim_copper" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/golden_helmet_diamond_trim.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/golden_helmet_diamond_trim.json new file mode 100644 index 000000000..2ad2462a9 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/golden_helmet_diamond_trim.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/golden_helmet", + "layer1": "minecraft:trims/items/helmet_trim_diamond" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/golden_helmet_emerald_trim.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/golden_helmet_emerald_trim.json new file mode 100644 index 000000000..f9623b16d --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/golden_helmet_emerald_trim.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/golden_helmet", + "layer1": "minecraft:trims/items/helmet_trim_emerald" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/golden_helmet_gold_darker_trim.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/golden_helmet_gold_darker_trim.json new file mode 100644 index 000000000..2276b5ad1 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/golden_helmet_gold_darker_trim.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/golden_helmet", + "layer1": "minecraft:trims/items/helmet_trim_gold_darker" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/golden_helmet_iron_trim.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/golden_helmet_iron_trim.json new file mode 100644 index 000000000..81f10c4d8 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/golden_helmet_iron_trim.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/golden_helmet", + "layer1": "minecraft:trims/items/helmet_trim_iron" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/golden_helmet_lapis_trim.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/golden_helmet_lapis_trim.json new file mode 100644 index 000000000..ff7d2b4d6 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/golden_helmet_lapis_trim.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/golden_helmet", + "layer1": "minecraft:trims/items/helmet_trim_lapis" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/golden_helmet_netherite_trim.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/golden_helmet_netherite_trim.json new file mode 100644 index 000000000..bbbb72913 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/golden_helmet_netherite_trim.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/golden_helmet", + "layer1": "minecraft:trims/items/helmet_trim_netherite" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/golden_helmet_quartz_trim.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/golden_helmet_quartz_trim.json new file mode 100644 index 000000000..583d8cda9 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/golden_helmet_quartz_trim.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/golden_helmet", + "layer1": "minecraft:trims/items/helmet_trim_quartz" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/golden_helmet_redstone_trim.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/golden_helmet_redstone_trim.json new file mode 100644 index 000000000..3a85360b6 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/golden_helmet_redstone_trim.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/golden_helmet", + "layer1": "minecraft:trims/items/helmet_trim_redstone" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/golden_hoe.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/golden_hoe.json new file mode 100644 index 000000000..7d2a2e5df --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/golden_hoe.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/handheld", + "textures": { + "layer0": "minecraft:item/golden_hoe" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/golden_horse_armor.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/golden_horse_armor.json new file mode 100644 index 000000000..9fbc0e909 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/golden_horse_armor.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/golden_horse_armor" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/golden_leggings.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/golden_leggings.json new file mode 100644 index 000000000..285ffb0d8 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/golden_leggings.json @@ -0,0 +1,68 @@ +{ + "parent": "minecraft:item/generated", + "overrides": [ + { + "model": "minecraft:item/golden_leggings_quartz_trim", + "predicate": { + "trim_type": 0.1 + } + }, + { + "model": "minecraft:item/golden_leggings_iron_trim", + "predicate": { + "trim_type": 0.2 + } + }, + { + "model": "minecraft:item/golden_leggings_netherite_trim", + "predicate": { + "trim_type": 0.3 + } + }, + { + "model": "minecraft:item/golden_leggings_redstone_trim", + "predicate": { + "trim_type": 0.4 + } + }, + { + "model": "minecraft:item/golden_leggings_copper_trim", + "predicate": { + "trim_type": 0.5 + } + }, + { + "model": "minecraft:item/golden_leggings_gold_darker_trim", + "predicate": { + "trim_type": 0.6 + } + }, + { + "model": "minecraft:item/golden_leggings_emerald_trim", + "predicate": { + "trim_type": 0.7 + } + }, + { + "model": "minecraft:item/golden_leggings_diamond_trim", + "predicate": { + "trim_type": 0.8 + } + }, + { + "model": "minecraft:item/golden_leggings_lapis_trim", + "predicate": { + "trim_type": 0.9 + } + }, + { + "model": "minecraft:item/golden_leggings_amethyst_trim", + "predicate": { + "trim_type": 1.0 + } + } + ], + "textures": { + "layer0": "minecraft:item/golden_leggings" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/golden_leggings_amethyst_trim.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/golden_leggings_amethyst_trim.json new file mode 100644 index 000000000..3d4bb850b --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/golden_leggings_amethyst_trim.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/golden_leggings", + "layer1": "minecraft:trims/items/leggings_trim_amethyst" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/golden_leggings_copper_trim.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/golden_leggings_copper_trim.json new file mode 100644 index 000000000..41e999edc --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/golden_leggings_copper_trim.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/golden_leggings", + "layer1": "minecraft:trims/items/leggings_trim_copper" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/golden_leggings_diamond_trim.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/golden_leggings_diamond_trim.json new file mode 100644 index 000000000..d85fda9b2 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/golden_leggings_diamond_trim.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/golden_leggings", + "layer1": "minecraft:trims/items/leggings_trim_diamond" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/golden_leggings_emerald_trim.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/golden_leggings_emerald_trim.json new file mode 100644 index 000000000..544b209fa --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/golden_leggings_emerald_trim.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/golden_leggings", + "layer1": "minecraft:trims/items/leggings_trim_emerald" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/golden_leggings_gold_darker_trim.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/golden_leggings_gold_darker_trim.json new file mode 100644 index 000000000..23eae507f --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/golden_leggings_gold_darker_trim.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/golden_leggings", + "layer1": "minecraft:trims/items/leggings_trim_gold_darker" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/golden_leggings_iron_trim.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/golden_leggings_iron_trim.json new file mode 100644 index 000000000..877cb174d --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/golden_leggings_iron_trim.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/golden_leggings", + "layer1": "minecraft:trims/items/leggings_trim_iron" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/golden_leggings_lapis_trim.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/golden_leggings_lapis_trim.json new file mode 100644 index 000000000..bb2fca2b8 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/golden_leggings_lapis_trim.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/golden_leggings", + "layer1": "minecraft:trims/items/leggings_trim_lapis" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/golden_leggings_netherite_trim.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/golden_leggings_netherite_trim.json new file mode 100644 index 000000000..0a41f244c --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/golden_leggings_netherite_trim.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/golden_leggings", + "layer1": "minecraft:trims/items/leggings_trim_netherite" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/golden_leggings_quartz_trim.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/golden_leggings_quartz_trim.json new file mode 100644 index 000000000..c966b6d5e --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/golden_leggings_quartz_trim.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/golden_leggings", + "layer1": "minecraft:trims/items/leggings_trim_quartz" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/golden_leggings_redstone_trim.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/golden_leggings_redstone_trim.json new file mode 100644 index 000000000..ec9e671ff --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/golden_leggings_redstone_trim.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/golden_leggings", + "layer1": "minecraft:trims/items/leggings_trim_redstone" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/golden_pickaxe.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/golden_pickaxe.json new file mode 100644 index 000000000..185c855bc --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/golden_pickaxe.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/handheld", + "textures": { + "layer0": "minecraft:item/golden_pickaxe" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/golden_shovel.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/golden_shovel.json new file mode 100644 index 000000000..c2d1dc003 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/golden_shovel.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/handheld", + "textures": { + "layer0": "minecraft:item/golden_shovel" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/golden_sword.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/golden_sword.json new file mode 100644 index 000000000..02e540976 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/golden_sword.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/handheld", + "textures": { + "layer0": "minecraft:item/golden_sword" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/granite.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/granite.json new file mode 100644 index 000000000..4dd54d023 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/granite.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/granite" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/granite_slab.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/granite_slab.json new file mode 100644 index 000000000..95ee61093 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/granite_slab.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/granite_slab" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/granite_stairs.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/granite_stairs.json new file mode 100644 index 000000000..68b4e669c --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/granite_stairs.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/granite_stairs" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/granite_wall.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/granite_wall.json new file mode 100644 index 000000000..de4942707 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/granite_wall.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/granite_wall_inventory" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/grass_block.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/grass_block.json new file mode 100644 index 000000000..f54d345a2 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/grass_block.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/grass_block" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/gravel.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/gravel.json new file mode 100644 index 000000000..ee8cbc03e --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/gravel.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/gravel" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/gray_banner.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/gray_banner.json new file mode 100644 index 000000000..661a106df --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/gray_banner.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:item/template_banner" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/gray_bed.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/gray_bed.json new file mode 100644 index 000000000..306670549 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/gray_bed.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/template_bed", + "textures": { + "particle": "minecraft:block/gray_wool" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/gray_bundle.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/gray_bundle.json new file mode 100644 index 000000000..a076d1563 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/gray_bundle.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/gray_bundle" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/gray_bundle_open_back.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/gray_bundle_open_back.json new file mode 100644 index 000000000..7b4a9a7d9 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/gray_bundle_open_back.json @@ -0,0 +1,6 @@ +{ + "parent": "item/bundle", + "textures": { + "layer0": "item/gray_bundle_open_back" + } +} diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/gray_bundle_open_front.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/gray_bundle_open_front.json new file mode 100644 index 000000000..cbcccfeca --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/gray_bundle_open_front.json @@ -0,0 +1,6 @@ +{ + "parent": "item/bundle", + "textures": { + "layer0": "item/gray_bundle_open_front" + } +} diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/gray_candle.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/gray_candle.json new file mode 100644 index 000000000..176cf59ff --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/gray_candle.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/gray_candle" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/gray_carpet.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/gray_carpet.json new file mode 100644 index 000000000..5fe85f098 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/gray_carpet.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/gray_carpet" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/gray_concrete.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/gray_concrete.json new file mode 100644 index 000000000..9b89dd7b6 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/gray_concrete.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/gray_concrete" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/gray_concrete_powder.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/gray_concrete_powder.json new file mode 100644 index 000000000..47d3dd50c --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/gray_concrete_powder.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/gray_concrete_powder" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/gray_dye.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/gray_dye.json new file mode 100644 index 000000000..f3c301065 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/gray_dye.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/gray_dye" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/gray_glazed_terracotta.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/gray_glazed_terracotta.json new file mode 100644 index 000000000..d58bce8a9 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/gray_glazed_terracotta.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/gray_glazed_terracotta" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/gray_shulker_box.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/gray_shulker_box.json new file mode 100644 index 000000000..c70434932 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/gray_shulker_box.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/template_shulker_box", + "textures": { + "particle": "minecraft:block/gray_shulker_box" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/gray_stained_glass.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/gray_stained_glass.json new file mode 100644 index 000000000..34c0fa6cc --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/gray_stained_glass.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/gray_stained_glass" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/gray_stained_glass_pane.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/gray_stained_glass_pane.json new file mode 100644 index 000000000..e2b88aa70 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/gray_stained_glass_pane.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:block/gray_stained_glass" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/gray_terracotta.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/gray_terracotta.json new file mode 100644 index 000000000..6c415c038 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/gray_terracotta.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/gray_terracotta" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/gray_wool.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/gray_wool.json new file mode 100644 index 000000000..88c930a64 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/gray_wool.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/gray_wool" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/green_banner.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/green_banner.json new file mode 100644 index 000000000..661a106df --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/green_banner.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:item/template_banner" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/green_bed.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/green_bed.json new file mode 100644 index 000000000..d7c7154a2 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/green_bed.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/template_bed", + "textures": { + "particle": "minecraft:block/green_wool" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/green_bundle.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/green_bundle.json new file mode 100644 index 000000000..c4589577d --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/green_bundle.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/green_bundle" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/green_bundle_open_back.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/green_bundle_open_back.json new file mode 100644 index 000000000..a0b9c2a7f --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/green_bundle_open_back.json @@ -0,0 +1,6 @@ +{ + "parent": "item/bundle", + "textures": { + "layer0": "item/green_bundle_open_back" + } +} diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/green_bundle_open_front.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/green_bundle_open_front.json new file mode 100644 index 000000000..23dd69896 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/green_bundle_open_front.json @@ -0,0 +1,6 @@ +{ + "parent": "item/bundle", + "textures": { + "layer0": "item/green_bundle_open_front" + } +} diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/green_candle.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/green_candle.json new file mode 100644 index 000000000..494c6ed42 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/green_candle.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/green_candle" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/green_carpet.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/green_carpet.json new file mode 100644 index 000000000..772c294ff --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/green_carpet.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/green_carpet" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/green_concrete.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/green_concrete.json new file mode 100644 index 000000000..0e3b0f95d --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/green_concrete.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/green_concrete" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/green_concrete_powder.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/green_concrete_powder.json new file mode 100644 index 000000000..4c9c70f0e --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/green_concrete_powder.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/green_concrete_powder" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/green_dye.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/green_dye.json new file mode 100644 index 000000000..2ded932e7 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/green_dye.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/green_dye" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/green_glazed_terracotta.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/green_glazed_terracotta.json new file mode 100644 index 000000000..68333f848 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/green_glazed_terracotta.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/green_glazed_terracotta" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/green_shulker_box.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/green_shulker_box.json new file mode 100644 index 000000000..6e8e01e7a --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/green_shulker_box.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/template_shulker_box", + "textures": { + "particle": "minecraft:block/green_shulker_box" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/green_stained_glass.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/green_stained_glass.json new file mode 100644 index 000000000..e10e37a8a --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/green_stained_glass.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/green_stained_glass" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/green_stained_glass_pane.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/green_stained_glass_pane.json new file mode 100644 index 000000000..ff4a30f74 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/green_stained_glass_pane.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:block/green_stained_glass" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/green_terracotta.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/green_terracotta.json new file mode 100644 index 000000000..bf20f272f --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/green_terracotta.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/green_terracotta" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/green_wool.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/green_wool.json new file mode 100644 index 000000000..a8cfdf478 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/green_wool.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/green_wool" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/grindstone.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/grindstone.json new file mode 100644 index 000000000..2faa8ae80 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/grindstone.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/grindstone" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/guardian_spawn_egg.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/guardian_spawn_egg.json new file mode 100644 index 000000000..d1aaa9d6e --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/guardian_spawn_egg.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:item/template_spawn_egg" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/gunpowder.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/gunpowder.json new file mode 100644 index 000000000..82faa64c6 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/gunpowder.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/gunpowder" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/guster_banner_pattern.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/guster_banner_pattern.json new file mode 100644 index 000000000..c24b83c7c --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/guster_banner_pattern.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/guster_banner_pattern" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/guster_pottery_sherd.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/guster_pottery_sherd.json new file mode 100644 index 000000000..f1bda3e1f --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/guster_pottery_sherd.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/guster_pottery_sherd" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/handheld.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/handheld.json new file mode 100644 index 000000000..51ea90fc5 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/handheld.json @@ -0,0 +1,25 @@ +{ + "parent": "item/generated", + "display": { + "thirdperson_righthand": { + "rotation": [ 0, -90, 55 ], + "translation": [ 0, 4.0, 0.5 ], + "scale": [ 0.85, 0.85, 0.85 ] + }, + "thirdperson_lefthand": { + "rotation": [ 0, 90, -55 ], + "translation": [ 0, 4.0, 0.5 ], + "scale": [ 0.85, 0.85, 0.85 ] + }, + "firstperson_righthand": { + "rotation": [ 0, -90, 25 ], + "translation": [ 1.13, 3.2, 1.13 ], + "scale": [ 0.68, 0.68, 0.68 ] + }, + "firstperson_lefthand": { + "rotation": [ 0, 90, -25 ], + "translation": [ 1.13, 3.2, 1.13 ], + "scale": [ 0.68, 0.68, 0.68 ] + } + } +} diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/handheld_mace.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/handheld_mace.json new file mode 100644 index 000000000..928ce0d22 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/handheld_mace.json @@ -0,0 +1,25 @@ +{ + "parent": "item/handheld", + "display": { + "thirdperson_righthand": { + "rotation": [ 0, -90, 55 ], + "translation": [ 0, 4.0, 1 ], + "scale": [ 1, 1, 1 ] + }, + "thirdperson_lefthand": { + "rotation": [ 0, 90, -55 ], + "translation": [ 0, 4.0, 1 ], + "scale": [ 1, 1, 1 ] + }, + "firstperson_righthand": { + "rotation": [ 0, -90, 25 ], + "translation": [ 0, 3, 0.8 ], + "scale": [ 0.9, 0.9, 0.9 ] + }, + "firstperson_lefthand": { + "rotation": [ 0, 90, -25 ], + "translation": [ 0, 3, 0.8 ], + "scale": [ 0.9, 0.9, 0.9 ] + } + } +} diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/handheld_rod.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/handheld_rod.json new file mode 100644 index 000000000..de794a4ad --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/handheld_rod.json @@ -0,0 +1,25 @@ +{ + "parent": "item/handheld", + "display": { + "thirdperson_righthand": { + "rotation": [ 0, 90, 55 ], + "translation": [ 0, 4.0, 2.5 ], + "scale": [ 0.85, 0.85, 0.85 ] + }, + "thirdperson_lefthand": { + "rotation": [ 0, -90, -55 ], + "translation": [ 0, 4.0, 2.5 ], + "scale": [ 0.85, 0.85, 0.85 ] + }, + "firstperson_righthand": { + "rotation": [ 0, 90, 25 ], + "translation": [ 0, 1.6, 0.8 ], + "scale": [ 0.68, 0.68, 0.68 ] + }, + "firstperson_lefthand": { + "rotation": [ 0, -90, -25 ], + "translation": [ 0, 1.6, 0.8 ], + "scale": [ 0.68, 0.68, 0.68 ] + } + } +} diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/hanging_roots.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/hanging_roots.json new file mode 100644 index 000000000..05320edbb --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/hanging_roots.json @@ -0,0 +1,18 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "minecraft:block/hanging_roots" + }, + "display": { + "thirdperson_righthand": { + "rotation": [ 0, 0, 0 ], + "translation": [ 0, 0, 1 ], + "scale": [ 0.55, 0.55, 0.55 ] + }, + "firstperson_righthand": { + "rotation": [ 0, -90, 25 ], + "translation": [ 1.13, 0, 1.13], + "scale": [ 0.68, 0.68, 0.68 ] + } + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/hay_block.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/hay_block.json new file mode 100644 index 000000000..6c92e25d0 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/hay_block.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/hay_block" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/heart_of_the_sea.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/heart_of_the_sea.json new file mode 100644 index 000000000..eb299204f --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/heart_of_the_sea.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/heart_of_the_sea" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/heart_pottery_sherd.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/heart_pottery_sherd.json new file mode 100644 index 000000000..e5c457415 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/heart_pottery_sherd.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/heart_pottery_sherd" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/heartbreak_pottery_sherd.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/heartbreak_pottery_sherd.json new file mode 100644 index 000000000..48c49fa4f --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/heartbreak_pottery_sherd.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/heartbreak_pottery_sherd" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/heavy_core.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/heavy_core.json new file mode 100644 index 000000000..aed92e076 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/heavy_core.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/heavy_core" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/heavy_weighted_pressure_plate.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/heavy_weighted_pressure_plate.json new file mode 100644 index 000000000..ef384772b --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/heavy_weighted_pressure_plate.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/heavy_weighted_pressure_plate" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/hoglin_spawn_egg.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/hoglin_spawn_egg.json new file mode 100644 index 000000000..d1aaa9d6e --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/hoglin_spawn_egg.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:item/template_spawn_egg" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/honey_block.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/honey_block.json new file mode 100644 index 000000000..29818ade0 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/honey_block.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/honey_block" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/honey_bottle.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/honey_bottle.json new file mode 100644 index 000000000..2a69e5f9d --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/honey_bottle.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/honey_bottle" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/honeycomb.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/honeycomb.json new file mode 100644 index 000000000..b183a8eca --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/honeycomb.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/honeycomb" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/honeycomb_block.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/honeycomb_block.json new file mode 100644 index 000000000..0a2c9541e --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/honeycomb_block.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/honeycomb_block" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/hopper.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/hopper.json new file mode 100644 index 000000000..b9e548805 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/hopper.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/hopper" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/hopper_minecart.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/hopper_minecart.json new file mode 100644 index 000000000..8bf456072 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/hopper_minecart.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/hopper_minecart" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/horn_coral.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/horn_coral.json new file mode 100644 index 000000000..5994465ff --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/horn_coral.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:block/horn_coral" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/horn_coral_block.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/horn_coral_block.json new file mode 100644 index 000000000..ba702d24c --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/horn_coral_block.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/horn_coral_block" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/horn_coral_fan.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/horn_coral_fan.json new file mode 100644 index 000000000..e2078bf4b --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/horn_coral_fan.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:block/horn_coral_fan" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/horse_spawn_egg.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/horse_spawn_egg.json new file mode 100644 index 000000000..d1aaa9d6e --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/horse_spawn_egg.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:item/template_spawn_egg" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/host_armor_trim_smithing_template.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/host_armor_trim_smithing_template.json new file mode 100644 index 000000000..cff91b211 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/host_armor_trim_smithing_template.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/host_armor_trim_smithing_template" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/howl_pottery_sherd.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/howl_pottery_sherd.json new file mode 100644 index 000000000..377031992 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/howl_pottery_sherd.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/howl_pottery_sherd" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/husk_spawn_egg.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/husk_spawn_egg.json new file mode 100644 index 000000000..d1aaa9d6e --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/husk_spawn_egg.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:item/template_spawn_egg" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/ice.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/ice.json new file mode 100644 index 000000000..1ec90d771 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/ice.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/ice" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/infested_chiseled_stone_bricks.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/infested_chiseled_stone_bricks.json new file mode 100644 index 000000000..ac7e5e66f --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/infested_chiseled_stone_bricks.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/chiseled_stone_bricks" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/infested_cobblestone.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/infested_cobblestone.json new file mode 100644 index 000000000..35e828df6 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/infested_cobblestone.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/cobblestone" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/infested_cracked_stone_bricks.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/infested_cracked_stone_bricks.json new file mode 100644 index 000000000..46802074e --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/infested_cracked_stone_bricks.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/cracked_stone_bricks" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/infested_deepslate.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/infested_deepslate.json new file mode 100644 index 000000000..13980a844 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/infested_deepslate.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/deepslate" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/infested_mossy_stone_bricks.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/infested_mossy_stone_bricks.json new file mode 100644 index 000000000..a9fe750fe --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/infested_mossy_stone_bricks.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/mossy_stone_bricks" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/infested_stone.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/infested_stone.json new file mode 100644 index 000000000..37f27f10b --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/infested_stone.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/stone" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/infested_stone_bricks.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/infested_stone_bricks.json new file mode 100644 index 000000000..51de871c0 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/infested_stone_bricks.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/stone_bricks" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/ink_sac.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/ink_sac.json new file mode 100644 index 000000000..4e528dcd0 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/ink_sac.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/ink_sac" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/iron_axe.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/iron_axe.json new file mode 100644 index 000000000..6ddc54911 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/iron_axe.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/handheld", + "textures": { + "layer0": "minecraft:item/iron_axe" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/iron_bars.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/iron_bars.json new file mode 100644 index 000000000..97aa41fc7 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/iron_bars.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:block/iron_bars" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/iron_block.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/iron_block.json new file mode 100644 index 000000000..acac52cae --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/iron_block.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/iron_block" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/iron_boots.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/iron_boots.json new file mode 100644 index 000000000..a1f2a4fcf --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/iron_boots.json @@ -0,0 +1,68 @@ +{ + "parent": "minecraft:item/generated", + "overrides": [ + { + "model": "minecraft:item/iron_boots_quartz_trim", + "predicate": { + "trim_type": 0.1 + } + }, + { + "model": "minecraft:item/iron_boots_iron_darker_trim", + "predicate": { + "trim_type": 0.2 + } + }, + { + "model": "minecraft:item/iron_boots_netherite_trim", + "predicate": { + "trim_type": 0.3 + } + }, + { + "model": "minecraft:item/iron_boots_redstone_trim", + "predicate": { + "trim_type": 0.4 + } + }, + { + "model": "minecraft:item/iron_boots_copper_trim", + "predicate": { + "trim_type": 0.5 + } + }, + { + "model": "minecraft:item/iron_boots_gold_trim", + "predicate": { + "trim_type": 0.6 + } + }, + { + "model": "minecraft:item/iron_boots_emerald_trim", + "predicate": { + "trim_type": 0.7 + } + }, + { + "model": "minecraft:item/iron_boots_diamond_trim", + "predicate": { + "trim_type": 0.8 + } + }, + { + "model": "minecraft:item/iron_boots_lapis_trim", + "predicate": { + "trim_type": 0.9 + } + }, + { + "model": "minecraft:item/iron_boots_amethyst_trim", + "predicate": { + "trim_type": 1.0 + } + } + ], + "textures": { + "layer0": "minecraft:item/iron_boots" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/iron_boots_amethyst_trim.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/iron_boots_amethyst_trim.json new file mode 100644 index 000000000..c520b66aa --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/iron_boots_amethyst_trim.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/iron_boots", + "layer1": "minecraft:trims/items/boots_trim_amethyst" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/iron_boots_copper_trim.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/iron_boots_copper_trim.json new file mode 100644 index 000000000..f4321a79a --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/iron_boots_copper_trim.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/iron_boots", + "layer1": "minecraft:trims/items/boots_trim_copper" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/iron_boots_diamond_trim.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/iron_boots_diamond_trim.json new file mode 100644 index 000000000..58dfbd8a3 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/iron_boots_diamond_trim.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/iron_boots", + "layer1": "minecraft:trims/items/boots_trim_diamond" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/iron_boots_emerald_trim.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/iron_boots_emerald_trim.json new file mode 100644 index 000000000..ebba41162 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/iron_boots_emerald_trim.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/iron_boots", + "layer1": "minecraft:trims/items/boots_trim_emerald" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/iron_boots_gold_trim.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/iron_boots_gold_trim.json new file mode 100644 index 000000000..b1601c91a --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/iron_boots_gold_trim.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/iron_boots", + "layer1": "minecraft:trims/items/boots_trim_gold" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/iron_boots_iron_darker_trim.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/iron_boots_iron_darker_trim.json new file mode 100644 index 000000000..65b960829 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/iron_boots_iron_darker_trim.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/iron_boots", + "layer1": "minecraft:trims/items/boots_trim_iron_darker" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/iron_boots_lapis_trim.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/iron_boots_lapis_trim.json new file mode 100644 index 000000000..1aefdf66a --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/iron_boots_lapis_trim.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/iron_boots", + "layer1": "minecraft:trims/items/boots_trim_lapis" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/iron_boots_netherite_trim.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/iron_boots_netherite_trim.json new file mode 100644 index 000000000..f6a2d1021 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/iron_boots_netherite_trim.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/iron_boots", + "layer1": "minecraft:trims/items/boots_trim_netherite" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/iron_boots_quartz_trim.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/iron_boots_quartz_trim.json new file mode 100644 index 000000000..52af0ee74 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/iron_boots_quartz_trim.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/iron_boots", + "layer1": "minecraft:trims/items/boots_trim_quartz" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/iron_boots_redstone_trim.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/iron_boots_redstone_trim.json new file mode 100644 index 000000000..a838412c6 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/iron_boots_redstone_trim.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/iron_boots", + "layer1": "minecraft:trims/items/boots_trim_redstone" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/iron_chestplate.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/iron_chestplate.json new file mode 100644 index 000000000..a0385c25e --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/iron_chestplate.json @@ -0,0 +1,68 @@ +{ + "parent": "minecraft:item/generated", + "overrides": [ + { + "model": "minecraft:item/iron_chestplate_quartz_trim", + "predicate": { + "trim_type": 0.1 + } + }, + { + "model": "minecraft:item/iron_chestplate_iron_darker_trim", + "predicate": { + "trim_type": 0.2 + } + }, + { + "model": "minecraft:item/iron_chestplate_netherite_trim", + "predicate": { + "trim_type": 0.3 + } + }, + { + "model": "minecraft:item/iron_chestplate_redstone_trim", + "predicate": { + "trim_type": 0.4 + } + }, + { + "model": "minecraft:item/iron_chestplate_copper_trim", + "predicate": { + "trim_type": 0.5 + } + }, + { + "model": "minecraft:item/iron_chestplate_gold_trim", + "predicate": { + "trim_type": 0.6 + } + }, + { + "model": "minecraft:item/iron_chestplate_emerald_trim", + "predicate": { + "trim_type": 0.7 + } + }, + { + "model": "minecraft:item/iron_chestplate_diamond_trim", + "predicate": { + "trim_type": 0.8 + } + }, + { + "model": "minecraft:item/iron_chestplate_lapis_trim", + "predicate": { + "trim_type": 0.9 + } + }, + { + "model": "minecraft:item/iron_chestplate_amethyst_trim", + "predicate": { + "trim_type": 1.0 + } + } + ], + "textures": { + "layer0": "minecraft:item/iron_chestplate" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/iron_chestplate_amethyst_trim.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/iron_chestplate_amethyst_trim.json new file mode 100644 index 000000000..ab82095dc --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/iron_chestplate_amethyst_trim.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/iron_chestplate", + "layer1": "minecraft:trims/items/chestplate_trim_amethyst" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/iron_chestplate_copper_trim.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/iron_chestplate_copper_trim.json new file mode 100644 index 000000000..956ba4845 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/iron_chestplate_copper_trim.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/iron_chestplate", + "layer1": "minecraft:trims/items/chestplate_trim_copper" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/iron_chestplate_diamond_trim.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/iron_chestplate_diamond_trim.json new file mode 100644 index 000000000..e559d7cc5 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/iron_chestplate_diamond_trim.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/iron_chestplate", + "layer1": "minecraft:trims/items/chestplate_trim_diamond" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/iron_chestplate_emerald_trim.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/iron_chestplate_emerald_trim.json new file mode 100644 index 000000000..e143c99de --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/iron_chestplate_emerald_trim.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/iron_chestplate", + "layer1": "minecraft:trims/items/chestplate_trim_emerald" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/iron_chestplate_gold_trim.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/iron_chestplate_gold_trim.json new file mode 100644 index 000000000..f5dfee4c3 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/iron_chestplate_gold_trim.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/iron_chestplate", + "layer1": "minecraft:trims/items/chestplate_trim_gold" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/iron_chestplate_iron_darker_trim.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/iron_chestplate_iron_darker_trim.json new file mode 100644 index 000000000..38ba7c1b2 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/iron_chestplate_iron_darker_trim.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/iron_chestplate", + "layer1": "minecraft:trims/items/chestplate_trim_iron_darker" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/iron_chestplate_lapis_trim.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/iron_chestplate_lapis_trim.json new file mode 100644 index 000000000..03ae6fbd1 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/iron_chestplate_lapis_trim.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/iron_chestplate", + "layer1": "minecraft:trims/items/chestplate_trim_lapis" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/iron_chestplate_netherite_trim.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/iron_chestplate_netherite_trim.json new file mode 100644 index 000000000..ccb152452 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/iron_chestplate_netherite_trim.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/iron_chestplate", + "layer1": "minecraft:trims/items/chestplate_trim_netherite" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/iron_chestplate_quartz_trim.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/iron_chestplate_quartz_trim.json new file mode 100644 index 000000000..981e14a3e --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/iron_chestplate_quartz_trim.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/iron_chestplate", + "layer1": "minecraft:trims/items/chestplate_trim_quartz" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/iron_chestplate_redstone_trim.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/iron_chestplate_redstone_trim.json new file mode 100644 index 000000000..208a2524f --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/iron_chestplate_redstone_trim.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/iron_chestplate", + "layer1": "minecraft:trims/items/chestplate_trim_redstone" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/iron_door.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/iron_door.json new file mode 100644 index 000000000..a057f8f8c --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/iron_door.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/iron_door" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/iron_golem_spawn_egg.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/iron_golem_spawn_egg.json new file mode 100644 index 000000000..d1aaa9d6e --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/iron_golem_spawn_egg.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:item/template_spawn_egg" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/iron_helmet.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/iron_helmet.json new file mode 100644 index 000000000..a2e575f93 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/iron_helmet.json @@ -0,0 +1,68 @@ +{ + "parent": "minecraft:item/generated", + "overrides": [ + { + "model": "minecraft:item/iron_helmet_quartz_trim", + "predicate": { + "trim_type": 0.1 + } + }, + { + "model": "minecraft:item/iron_helmet_iron_darker_trim", + "predicate": { + "trim_type": 0.2 + } + }, + { + "model": "minecraft:item/iron_helmet_netherite_trim", + "predicate": { + "trim_type": 0.3 + } + }, + { + "model": "minecraft:item/iron_helmet_redstone_trim", + "predicate": { + "trim_type": 0.4 + } + }, + { + "model": "minecraft:item/iron_helmet_copper_trim", + "predicate": { + "trim_type": 0.5 + } + }, + { + "model": "minecraft:item/iron_helmet_gold_trim", + "predicate": { + "trim_type": 0.6 + } + }, + { + "model": "minecraft:item/iron_helmet_emerald_trim", + "predicate": { + "trim_type": 0.7 + } + }, + { + "model": "minecraft:item/iron_helmet_diamond_trim", + "predicate": { + "trim_type": 0.8 + } + }, + { + "model": "minecraft:item/iron_helmet_lapis_trim", + "predicate": { + "trim_type": 0.9 + } + }, + { + "model": "minecraft:item/iron_helmet_amethyst_trim", + "predicate": { + "trim_type": 1.0 + } + } + ], + "textures": { + "layer0": "minecraft:item/iron_helmet" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/iron_helmet_amethyst_trim.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/iron_helmet_amethyst_trim.json new file mode 100644 index 000000000..53b64e68a --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/iron_helmet_amethyst_trim.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/iron_helmet", + "layer1": "minecraft:trims/items/helmet_trim_amethyst" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/iron_helmet_copper_trim.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/iron_helmet_copper_trim.json new file mode 100644 index 000000000..61314f95e --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/iron_helmet_copper_trim.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/iron_helmet", + "layer1": "minecraft:trims/items/helmet_trim_copper" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/iron_helmet_diamond_trim.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/iron_helmet_diamond_trim.json new file mode 100644 index 000000000..d469b22f0 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/iron_helmet_diamond_trim.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/iron_helmet", + "layer1": "minecraft:trims/items/helmet_trim_diamond" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/iron_helmet_emerald_trim.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/iron_helmet_emerald_trim.json new file mode 100644 index 000000000..bc596c65b --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/iron_helmet_emerald_trim.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/iron_helmet", + "layer1": "minecraft:trims/items/helmet_trim_emerald" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/iron_helmet_gold_trim.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/iron_helmet_gold_trim.json new file mode 100644 index 000000000..f68de78da --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/iron_helmet_gold_trim.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/iron_helmet", + "layer1": "minecraft:trims/items/helmet_trim_gold" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/iron_helmet_iron_darker_trim.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/iron_helmet_iron_darker_trim.json new file mode 100644 index 000000000..b471361fe --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/iron_helmet_iron_darker_trim.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/iron_helmet", + "layer1": "minecraft:trims/items/helmet_trim_iron_darker" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/iron_helmet_lapis_trim.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/iron_helmet_lapis_trim.json new file mode 100644 index 000000000..ef272104f --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/iron_helmet_lapis_trim.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/iron_helmet", + "layer1": "minecraft:trims/items/helmet_trim_lapis" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/iron_helmet_netherite_trim.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/iron_helmet_netherite_trim.json new file mode 100644 index 000000000..9f6c5f523 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/iron_helmet_netherite_trim.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/iron_helmet", + "layer1": "minecraft:trims/items/helmet_trim_netherite" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/iron_helmet_quartz_trim.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/iron_helmet_quartz_trim.json new file mode 100644 index 000000000..c34faf479 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/iron_helmet_quartz_trim.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/iron_helmet", + "layer1": "minecraft:trims/items/helmet_trim_quartz" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/iron_helmet_redstone_trim.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/iron_helmet_redstone_trim.json new file mode 100644 index 000000000..9ad0a7b50 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/iron_helmet_redstone_trim.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/iron_helmet", + "layer1": "minecraft:trims/items/helmet_trim_redstone" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/iron_hoe.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/iron_hoe.json new file mode 100644 index 000000000..889dd3a38 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/iron_hoe.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/handheld", + "textures": { + "layer0": "minecraft:item/iron_hoe" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/iron_horse_armor.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/iron_horse_armor.json new file mode 100644 index 000000000..3a560516f --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/iron_horse_armor.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/iron_horse_armor" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/iron_ingot.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/iron_ingot.json new file mode 100644 index 000000000..1fc74dfc6 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/iron_ingot.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/iron_ingot" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/iron_leggings.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/iron_leggings.json new file mode 100644 index 000000000..826c4f73f --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/iron_leggings.json @@ -0,0 +1,68 @@ +{ + "parent": "minecraft:item/generated", + "overrides": [ + { + "model": "minecraft:item/iron_leggings_quartz_trim", + "predicate": { + "trim_type": 0.1 + } + }, + { + "model": "minecraft:item/iron_leggings_iron_darker_trim", + "predicate": { + "trim_type": 0.2 + } + }, + { + "model": "minecraft:item/iron_leggings_netherite_trim", + "predicate": { + "trim_type": 0.3 + } + }, + { + "model": "minecraft:item/iron_leggings_redstone_trim", + "predicate": { + "trim_type": 0.4 + } + }, + { + "model": "minecraft:item/iron_leggings_copper_trim", + "predicate": { + "trim_type": 0.5 + } + }, + { + "model": "minecraft:item/iron_leggings_gold_trim", + "predicate": { + "trim_type": 0.6 + } + }, + { + "model": "minecraft:item/iron_leggings_emerald_trim", + "predicate": { + "trim_type": 0.7 + } + }, + { + "model": "minecraft:item/iron_leggings_diamond_trim", + "predicate": { + "trim_type": 0.8 + } + }, + { + "model": "minecraft:item/iron_leggings_lapis_trim", + "predicate": { + "trim_type": 0.9 + } + }, + { + "model": "minecraft:item/iron_leggings_amethyst_trim", + "predicate": { + "trim_type": 1.0 + } + } + ], + "textures": { + "layer0": "minecraft:item/iron_leggings" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/iron_leggings_amethyst_trim.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/iron_leggings_amethyst_trim.json new file mode 100644 index 000000000..e64f52a62 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/iron_leggings_amethyst_trim.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/iron_leggings", + "layer1": "minecraft:trims/items/leggings_trim_amethyst" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/iron_leggings_copper_trim.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/iron_leggings_copper_trim.json new file mode 100644 index 000000000..48a46fe8c --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/iron_leggings_copper_trim.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/iron_leggings", + "layer1": "minecraft:trims/items/leggings_trim_copper" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/iron_leggings_diamond_trim.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/iron_leggings_diamond_trim.json new file mode 100644 index 000000000..a706ce346 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/iron_leggings_diamond_trim.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/iron_leggings", + "layer1": "minecraft:trims/items/leggings_trim_diamond" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/iron_leggings_emerald_trim.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/iron_leggings_emerald_trim.json new file mode 100644 index 000000000..88c613757 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/iron_leggings_emerald_trim.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/iron_leggings", + "layer1": "minecraft:trims/items/leggings_trim_emerald" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/iron_leggings_gold_trim.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/iron_leggings_gold_trim.json new file mode 100644 index 000000000..90ca5a6ad --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/iron_leggings_gold_trim.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/iron_leggings", + "layer1": "minecraft:trims/items/leggings_trim_gold" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/iron_leggings_iron_darker_trim.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/iron_leggings_iron_darker_trim.json new file mode 100644 index 000000000..e85d215ec --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/iron_leggings_iron_darker_trim.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/iron_leggings", + "layer1": "minecraft:trims/items/leggings_trim_iron_darker" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/iron_leggings_lapis_trim.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/iron_leggings_lapis_trim.json new file mode 100644 index 000000000..063137c1f --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/iron_leggings_lapis_trim.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/iron_leggings", + "layer1": "minecraft:trims/items/leggings_trim_lapis" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/iron_leggings_netherite_trim.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/iron_leggings_netherite_trim.json new file mode 100644 index 000000000..5afcdf928 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/iron_leggings_netherite_trim.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/iron_leggings", + "layer1": "minecraft:trims/items/leggings_trim_netherite" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/iron_leggings_quartz_trim.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/iron_leggings_quartz_trim.json new file mode 100644 index 000000000..5ce4703ca --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/iron_leggings_quartz_trim.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/iron_leggings", + "layer1": "minecraft:trims/items/leggings_trim_quartz" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/iron_leggings_redstone_trim.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/iron_leggings_redstone_trim.json new file mode 100644 index 000000000..c907c7a1e --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/iron_leggings_redstone_trim.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/iron_leggings", + "layer1": "minecraft:trims/items/leggings_trim_redstone" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/iron_nugget.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/iron_nugget.json new file mode 100644 index 000000000..3873a52ac --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/iron_nugget.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/iron_nugget" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/iron_ore.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/iron_ore.json new file mode 100644 index 000000000..5a3561391 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/iron_ore.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/iron_ore" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/iron_pickaxe.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/iron_pickaxe.json new file mode 100644 index 000000000..8a5f40797 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/iron_pickaxe.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/handheld", + "textures": { + "layer0": "minecraft:item/iron_pickaxe" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/iron_shovel.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/iron_shovel.json new file mode 100644 index 000000000..26674cfb2 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/iron_shovel.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/handheld", + "textures": { + "layer0": "minecraft:item/iron_shovel" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/iron_sword.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/iron_sword.json new file mode 100644 index 000000000..ebbcd4118 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/iron_sword.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/handheld", + "textures": { + "layer0": "minecraft:item/iron_sword" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/iron_trapdoor.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/iron_trapdoor.json new file mode 100644 index 000000000..b3a30b76d --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/iron_trapdoor.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/iron_trapdoor_bottom" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/item_frame.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/item_frame.json new file mode 100644 index 000000000..09797547d --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/item_frame.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/item_frame" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/jack_o_lantern.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/jack_o_lantern.json new file mode 100644 index 000000000..d23072034 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/jack_o_lantern.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/jack_o_lantern" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/jigsaw.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/jigsaw.json new file mode 100644 index 000000000..b0c476303 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/jigsaw.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/jigsaw" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/jukebox.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/jukebox.json new file mode 100644 index 000000000..4d2923ac5 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/jukebox.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/jukebox" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/jungle_boat.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/jungle_boat.json new file mode 100644 index 000000000..4cc14d5c7 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/jungle_boat.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/jungle_boat" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/jungle_button.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/jungle_button.json new file mode 100644 index 000000000..360738a39 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/jungle_button.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/jungle_button_inventory" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/jungle_chest_boat.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/jungle_chest_boat.json new file mode 100644 index 000000000..e2b2e3bbf --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/jungle_chest_boat.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/jungle_chest_boat" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/jungle_door.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/jungle_door.json new file mode 100644 index 000000000..2fbc71f50 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/jungle_door.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/jungle_door" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/jungle_fence.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/jungle_fence.json new file mode 100644 index 000000000..c5e6b2aa0 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/jungle_fence.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/jungle_fence_inventory" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/jungle_fence_gate.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/jungle_fence_gate.json new file mode 100644 index 000000000..8612c91d2 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/jungle_fence_gate.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/jungle_fence_gate" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/jungle_hanging_sign.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/jungle_hanging_sign.json new file mode 100644 index 000000000..19222949e --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/jungle_hanging_sign.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/jungle_hanging_sign" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/jungle_leaves.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/jungle_leaves.json new file mode 100644 index 000000000..4be7c1ad4 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/jungle_leaves.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/jungle_leaves" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/jungle_log.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/jungle_log.json new file mode 100644 index 000000000..2e6c371bd --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/jungle_log.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/jungle_log" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/jungle_planks.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/jungle_planks.json new file mode 100644 index 000000000..03f6926ae --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/jungle_planks.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/jungle_planks" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/jungle_pressure_plate.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/jungle_pressure_plate.json new file mode 100644 index 000000000..18a6d0f5a --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/jungle_pressure_plate.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/jungle_pressure_plate" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/jungle_sapling.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/jungle_sapling.json new file mode 100644 index 000000000..4dd71de23 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/jungle_sapling.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:block/jungle_sapling" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/jungle_sign.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/jungle_sign.json new file mode 100644 index 000000000..2ee2828e1 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/jungle_sign.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/jungle_sign" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/jungle_slab.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/jungle_slab.json new file mode 100644 index 000000000..ed5a4321f --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/jungle_slab.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/jungle_slab" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/jungle_stairs.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/jungle_stairs.json new file mode 100644 index 000000000..87e9264c6 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/jungle_stairs.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/jungle_stairs" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/jungle_trapdoor.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/jungle_trapdoor.json new file mode 100644 index 000000000..996f2808f --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/jungle_trapdoor.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/jungle_trapdoor_bottom" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/jungle_wood.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/jungle_wood.json new file mode 100644 index 000000000..c993caea2 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/jungle_wood.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/jungle_wood" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/kelp.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/kelp.json new file mode 100644 index 000000000..b701d7b50 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/kelp.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/kelp" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/knowledge_book.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/knowledge_book.json new file mode 100644 index 000000000..bc355f72a --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/knowledge_book.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/knowledge_book" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/ladder.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/ladder.json new file mode 100644 index 000000000..b4fd6267c --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/ladder.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:block/ladder" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/lantern.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/lantern.json new file mode 100644 index 000000000..ce9e5c103 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/lantern.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/lantern" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/lapis_block.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/lapis_block.json new file mode 100644 index 000000000..1dcdaf6e8 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/lapis_block.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/lapis_block" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/lapis_lazuli.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/lapis_lazuli.json new file mode 100644 index 000000000..ee8bdea52 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/lapis_lazuli.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/lapis_lazuli" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/lapis_ore.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/lapis_ore.json new file mode 100644 index 000000000..87cec1e47 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/lapis_ore.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/lapis_ore" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/large_amethyst_bud.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/large_amethyst_bud.json new file mode 100644 index 000000000..0e601416d --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/large_amethyst_bud.json @@ -0,0 +1,11 @@ + { + "parent": "item/amethyst_bud", + "textures": { + "layer0": "minecraft:block/large_amethyst_bud" + }, + "display": { + "fixed": { + "translation": [ 0, 4, 0 ] + } + } +} diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/large_fern.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/large_fern.json new file mode 100644 index 000000000..1072e9402 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/large_fern.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:block/large_fern_top" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/lava_bucket.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/lava_bucket.json new file mode 100644 index 000000000..4052c615e --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/lava_bucket.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/lava_bucket" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/lead.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/lead.json new file mode 100644 index 000000000..df628d663 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/lead.json @@ -0,0 +1,13 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "item/lead" + }, + "display": { + "head": { + "rotation": [ 0, 0, 0 ], + "translation": [ 2.75, -2.75, -6.5], + "scale":[ 0.8, 0.8, 0.8] + } + } +} diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/leather.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/leather.json new file mode 100644 index 000000000..2b48d1f83 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/leather.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/leather" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/leather_boots.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/leather_boots.json new file mode 100644 index 000000000..fcba9da9d --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/leather_boots.json @@ -0,0 +1,69 @@ +{ + "parent": "minecraft:item/generated", + "overrides": [ + { + "model": "minecraft:item/leather_boots_quartz_trim", + "predicate": { + "trim_type": 0.1 + } + }, + { + "model": "minecraft:item/leather_boots_iron_trim", + "predicate": { + "trim_type": 0.2 + } + }, + { + "model": "minecraft:item/leather_boots_netherite_trim", + "predicate": { + "trim_type": 0.3 + } + }, + { + "model": "minecraft:item/leather_boots_redstone_trim", + "predicate": { + "trim_type": 0.4 + } + }, + { + "model": "minecraft:item/leather_boots_copper_trim", + "predicate": { + "trim_type": 0.5 + } + }, + { + "model": "minecraft:item/leather_boots_gold_trim", + "predicate": { + "trim_type": 0.6 + } + }, + { + "model": "minecraft:item/leather_boots_emerald_trim", + "predicate": { + "trim_type": 0.7 + } + }, + { + "model": "minecraft:item/leather_boots_diamond_trim", + "predicate": { + "trim_type": 0.8 + } + }, + { + "model": "minecraft:item/leather_boots_lapis_trim", + "predicate": { + "trim_type": 0.9 + } + }, + { + "model": "minecraft:item/leather_boots_amethyst_trim", + "predicate": { + "trim_type": 1.0 + } + } + ], + "textures": { + "layer0": "minecraft:item/leather_boots", + "layer1": "minecraft:item/leather_boots_overlay" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/leather_boots_amethyst_trim.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/leather_boots_amethyst_trim.json new file mode 100644 index 000000000..2b6f4a7e5 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/leather_boots_amethyst_trim.json @@ -0,0 +1,8 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/leather_boots", + "layer1": "minecraft:item/leather_boots_overlay", + "layer2": "minecraft:trims/items/boots_trim_amethyst" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/leather_boots_copper_trim.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/leather_boots_copper_trim.json new file mode 100644 index 000000000..e6a7f7c87 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/leather_boots_copper_trim.json @@ -0,0 +1,8 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/leather_boots", + "layer1": "minecraft:item/leather_boots_overlay", + "layer2": "minecraft:trims/items/boots_trim_copper" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/leather_boots_diamond_trim.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/leather_boots_diamond_trim.json new file mode 100644 index 000000000..07dc69b0f --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/leather_boots_diamond_trim.json @@ -0,0 +1,8 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/leather_boots", + "layer1": "minecraft:item/leather_boots_overlay", + "layer2": "minecraft:trims/items/boots_trim_diamond" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/leather_boots_emerald_trim.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/leather_boots_emerald_trim.json new file mode 100644 index 000000000..9ebfe59ed --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/leather_boots_emerald_trim.json @@ -0,0 +1,8 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/leather_boots", + "layer1": "minecraft:item/leather_boots_overlay", + "layer2": "minecraft:trims/items/boots_trim_emerald" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/leather_boots_gold_trim.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/leather_boots_gold_trim.json new file mode 100644 index 000000000..e17c9a74b --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/leather_boots_gold_trim.json @@ -0,0 +1,8 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/leather_boots", + "layer1": "minecraft:item/leather_boots_overlay", + "layer2": "minecraft:trims/items/boots_trim_gold" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/leather_boots_iron_trim.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/leather_boots_iron_trim.json new file mode 100644 index 000000000..196913b60 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/leather_boots_iron_trim.json @@ -0,0 +1,8 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/leather_boots", + "layer1": "minecraft:item/leather_boots_overlay", + "layer2": "minecraft:trims/items/boots_trim_iron" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/leather_boots_lapis_trim.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/leather_boots_lapis_trim.json new file mode 100644 index 000000000..8c5b3bdd5 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/leather_boots_lapis_trim.json @@ -0,0 +1,8 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/leather_boots", + "layer1": "minecraft:item/leather_boots_overlay", + "layer2": "minecraft:trims/items/boots_trim_lapis" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/leather_boots_netherite_trim.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/leather_boots_netherite_trim.json new file mode 100644 index 000000000..254a56366 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/leather_boots_netherite_trim.json @@ -0,0 +1,8 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/leather_boots", + "layer1": "minecraft:item/leather_boots_overlay", + "layer2": "minecraft:trims/items/boots_trim_netherite" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/leather_boots_quartz_trim.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/leather_boots_quartz_trim.json new file mode 100644 index 000000000..5d056ad76 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/leather_boots_quartz_trim.json @@ -0,0 +1,8 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/leather_boots", + "layer1": "minecraft:item/leather_boots_overlay", + "layer2": "minecraft:trims/items/boots_trim_quartz" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/leather_boots_redstone_trim.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/leather_boots_redstone_trim.json new file mode 100644 index 000000000..c85de7a41 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/leather_boots_redstone_trim.json @@ -0,0 +1,8 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/leather_boots", + "layer1": "minecraft:item/leather_boots_overlay", + "layer2": "minecraft:trims/items/boots_trim_redstone" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/leather_chestplate.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/leather_chestplate.json new file mode 100644 index 000000000..93976e782 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/leather_chestplate.json @@ -0,0 +1,69 @@ +{ + "parent": "minecraft:item/generated", + "overrides": [ + { + "model": "minecraft:item/leather_chestplate_quartz_trim", + "predicate": { + "trim_type": 0.1 + } + }, + { + "model": "minecraft:item/leather_chestplate_iron_trim", + "predicate": { + "trim_type": 0.2 + } + }, + { + "model": "minecraft:item/leather_chestplate_netherite_trim", + "predicate": { + "trim_type": 0.3 + } + }, + { + "model": "minecraft:item/leather_chestplate_redstone_trim", + "predicate": { + "trim_type": 0.4 + } + }, + { + "model": "minecraft:item/leather_chestplate_copper_trim", + "predicate": { + "trim_type": 0.5 + } + }, + { + "model": "minecraft:item/leather_chestplate_gold_trim", + "predicate": { + "trim_type": 0.6 + } + }, + { + "model": "minecraft:item/leather_chestplate_emerald_trim", + "predicate": { + "trim_type": 0.7 + } + }, + { + "model": "minecraft:item/leather_chestplate_diamond_trim", + "predicate": { + "trim_type": 0.8 + } + }, + { + "model": "minecraft:item/leather_chestplate_lapis_trim", + "predicate": { + "trim_type": 0.9 + } + }, + { + "model": "minecraft:item/leather_chestplate_amethyst_trim", + "predicate": { + "trim_type": 1.0 + } + } + ], + "textures": { + "layer0": "minecraft:item/leather_chestplate", + "layer1": "minecraft:item/leather_chestplate_overlay" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/leather_chestplate_amethyst_trim.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/leather_chestplate_amethyst_trim.json new file mode 100644 index 000000000..b615e9476 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/leather_chestplate_amethyst_trim.json @@ -0,0 +1,8 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/leather_chestplate", + "layer1": "minecraft:item/leather_chestplate_overlay", + "layer2": "minecraft:trims/items/chestplate_trim_amethyst" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/leather_chestplate_copper_trim.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/leather_chestplate_copper_trim.json new file mode 100644 index 000000000..cccfd3c0a --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/leather_chestplate_copper_trim.json @@ -0,0 +1,8 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/leather_chestplate", + "layer1": "minecraft:item/leather_chestplate_overlay", + "layer2": "minecraft:trims/items/chestplate_trim_copper" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/leather_chestplate_diamond_trim.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/leather_chestplate_diamond_trim.json new file mode 100644 index 000000000..660d6665a --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/leather_chestplate_diamond_trim.json @@ -0,0 +1,8 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/leather_chestplate", + "layer1": "minecraft:item/leather_chestplate_overlay", + "layer2": "minecraft:trims/items/chestplate_trim_diamond" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/leather_chestplate_emerald_trim.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/leather_chestplate_emerald_trim.json new file mode 100644 index 000000000..38ab18ae7 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/leather_chestplate_emerald_trim.json @@ -0,0 +1,8 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/leather_chestplate", + "layer1": "minecraft:item/leather_chestplate_overlay", + "layer2": "minecraft:trims/items/chestplate_trim_emerald" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/leather_chestplate_gold_trim.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/leather_chestplate_gold_trim.json new file mode 100644 index 000000000..7dd884934 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/leather_chestplate_gold_trim.json @@ -0,0 +1,8 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/leather_chestplate", + "layer1": "minecraft:item/leather_chestplate_overlay", + "layer2": "minecraft:trims/items/chestplate_trim_gold" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/leather_chestplate_iron_trim.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/leather_chestplate_iron_trim.json new file mode 100644 index 000000000..9b6fcf497 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/leather_chestplate_iron_trim.json @@ -0,0 +1,8 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/leather_chestplate", + "layer1": "minecraft:item/leather_chestplate_overlay", + "layer2": "minecraft:trims/items/chestplate_trim_iron" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/leather_chestplate_lapis_trim.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/leather_chestplate_lapis_trim.json new file mode 100644 index 000000000..343d68283 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/leather_chestplate_lapis_trim.json @@ -0,0 +1,8 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/leather_chestplate", + "layer1": "minecraft:item/leather_chestplate_overlay", + "layer2": "minecraft:trims/items/chestplate_trim_lapis" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/leather_chestplate_netherite_trim.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/leather_chestplate_netherite_trim.json new file mode 100644 index 000000000..a95532ca9 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/leather_chestplate_netherite_trim.json @@ -0,0 +1,8 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/leather_chestplate", + "layer1": "minecraft:item/leather_chestplate_overlay", + "layer2": "minecraft:trims/items/chestplate_trim_netherite" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/leather_chestplate_quartz_trim.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/leather_chestplate_quartz_trim.json new file mode 100644 index 000000000..319aa4473 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/leather_chestplate_quartz_trim.json @@ -0,0 +1,8 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/leather_chestplate", + "layer1": "minecraft:item/leather_chestplate_overlay", + "layer2": "minecraft:trims/items/chestplate_trim_quartz" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/leather_chestplate_redstone_trim.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/leather_chestplate_redstone_trim.json new file mode 100644 index 000000000..cb2008c1a --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/leather_chestplate_redstone_trim.json @@ -0,0 +1,8 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/leather_chestplate", + "layer1": "minecraft:item/leather_chestplate_overlay", + "layer2": "minecraft:trims/items/chestplate_trim_redstone" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/leather_helmet.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/leather_helmet.json new file mode 100644 index 000000000..616e6ebdc --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/leather_helmet.json @@ -0,0 +1,69 @@ +{ + "parent": "minecraft:item/generated", + "overrides": [ + { + "model": "minecraft:item/leather_helmet_quartz_trim", + "predicate": { + "trim_type": 0.1 + } + }, + { + "model": "minecraft:item/leather_helmet_iron_trim", + "predicate": { + "trim_type": 0.2 + } + }, + { + "model": "minecraft:item/leather_helmet_netherite_trim", + "predicate": { + "trim_type": 0.3 + } + }, + { + "model": "minecraft:item/leather_helmet_redstone_trim", + "predicate": { + "trim_type": 0.4 + } + }, + { + "model": "minecraft:item/leather_helmet_copper_trim", + "predicate": { + "trim_type": 0.5 + } + }, + { + "model": "minecraft:item/leather_helmet_gold_trim", + "predicate": { + "trim_type": 0.6 + } + }, + { + "model": "minecraft:item/leather_helmet_emerald_trim", + "predicate": { + "trim_type": 0.7 + } + }, + { + "model": "minecraft:item/leather_helmet_diamond_trim", + "predicate": { + "trim_type": 0.8 + } + }, + { + "model": "minecraft:item/leather_helmet_lapis_trim", + "predicate": { + "trim_type": 0.9 + } + }, + { + "model": "minecraft:item/leather_helmet_amethyst_trim", + "predicate": { + "trim_type": 1.0 + } + } + ], + "textures": { + "layer0": "minecraft:item/leather_helmet", + "layer1": "minecraft:item/leather_helmet_overlay" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/leather_helmet_amethyst_trim.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/leather_helmet_amethyst_trim.json new file mode 100644 index 000000000..6f4df1bbe --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/leather_helmet_amethyst_trim.json @@ -0,0 +1,8 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/leather_helmet", + "layer1": "minecraft:item/leather_helmet_overlay", + "layer2": "minecraft:trims/items/helmet_trim_amethyst" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/leather_helmet_copper_trim.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/leather_helmet_copper_trim.json new file mode 100644 index 000000000..2c1275a89 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/leather_helmet_copper_trim.json @@ -0,0 +1,8 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/leather_helmet", + "layer1": "minecraft:item/leather_helmet_overlay", + "layer2": "minecraft:trims/items/helmet_trim_copper" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/leather_helmet_diamond_trim.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/leather_helmet_diamond_trim.json new file mode 100644 index 000000000..315eb0dec --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/leather_helmet_diamond_trim.json @@ -0,0 +1,8 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/leather_helmet", + "layer1": "minecraft:item/leather_helmet_overlay", + "layer2": "minecraft:trims/items/helmet_trim_diamond" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/leather_helmet_emerald_trim.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/leather_helmet_emerald_trim.json new file mode 100644 index 000000000..0167efb86 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/leather_helmet_emerald_trim.json @@ -0,0 +1,8 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/leather_helmet", + "layer1": "minecraft:item/leather_helmet_overlay", + "layer2": "minecraft:trims/items/helmet_trim_emerald" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/leather_helmet_gold_trim.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/leather_helmet_gold_trim.json new file mode 100644 index 000000000..0e8c4560c --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/leather_helmet_gold_trim.json @@ -0,0 +1,8 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/leather_helmet", + "layer1": "minecraft:item/leather_helmet_overlay", + "layer2": "minecraft:trims/items/helmet_trim_gold" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/leather_helmet_iron_trim.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/leather_helmet_iron_trim.json new file mode 100644 index 000000000..7b1b8b853 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/leather_helmet_iron_trim.json @@ -0,0 +1,8 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/leather_helmet", + "layer1": "minecraft:item/leather_helmet_overlay", + "layer2": "minecraft:trims/items/helmet_trim_iron" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/leather_helmet_lapis_trim.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/leather_helmet_lapis_trim.json new file mode 100644 index 000000000..555c28286 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/leather_helmet_lapis_trim.json @@ -0,0 +1,8 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/leather_helmet", + "layer1": "minecraft:item/leather_helmet_overlay", + "layer2": "minecraft:trims/items/helmet_trim_lapis" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/leather_helmet_netherite_trim.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/leather_helmet_netherite_trim.json new file mode 100644 index 000000000..9e3ddb7db --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/leather_helmet_netherite_trim.json @@ -0,0 +1,8 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/leather_helmet", + "layer1": "minecraft:item/leather_helmet_overlay", + "layer2": "minecraft:trims/items/helmet_trim_netherite" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/leather_helmet_quartz_trim.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/leather_helmet_quartz_trim.json new file mode 100644 index 000000000..63fe5bc15 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/leather_helmet_quartz_trim.json @@ -0,0 +1,8 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/leather_helmet", + "layer1": "minecraft:item/leather_helmet_overlay", + "layer2": "minecraft:trims/items/helmet_trim_quartz" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/leather_helmet_redstone_trim.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/leather_helmet_redstone_trim.json new file mode 100644 index 000000000..df0448307 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/leather_helmet_redstone_trim.json @@ -0,0 +1,8 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/leather_helmet", + "layer1": "minecraft:item/leather_helmet_overlay", + "layer2": "minecraft:trims/items/helmet_trim_redstone" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/leather_horse_armor.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/leather_horse_armor.json new file mode 100644 index 000000000..f96eae753 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/leather_horse_armor.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/leather_horse_armor" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/leather_leggings.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/leather_leggings.json new file mode 100644 index 000000000..dcf68e178 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/leather_leggings.json @@ -0,0 +1,69 @@ +{ + "parent": "minecraft:item/generated", + "overrides": [ + { + "model": "minecraft:item/leather_leggings_quartz_trim", + "predicate": { + "trim_type": 0.1 + } + }, + { + "model": "minecraft:item/leather_leggings_iron_trim", + "predicate": { + "trim_type": 0.2 + } + }, + { + "model": "minecraft:item/leather_leggings_netherite_trim", + "predicate": { + "trim_type": 0.3 + } + }, + { + "model": "minecraft:item/leather_leggings_redstone_trim", + "predicate": { + "trim_type": 0.4 + } + }, + { + "model": "minecraft:item/leather_leggings_copper_trim", + "predicate": { + "trim_type": 0.5 + } + }, + { + "model": "minecraft:item/leather_leggings_gold_trim", + "predicate": { + "trim_type": 0.6 + } + }, + { + "model": "minecraft:item/leather_leggings_emerald_trim", + "predicate": { + "trim_type": 0.7 + } + }, + { + "model": "minecraft:item/leather_leggings_diamond_trim", + "predicate": { + "trim_type": 0.8 + } + }, + { + "model": "minecraft:item/leather_leggings_lapis_trim", + "predicate": { + "trim_type": 0.9 + } + }, + { + "model": "minecraft:item/leather_leggings_amethyst_trim", + "predicate": { + "trim_type": 1.0 + } + } + ], + "textures": { + "layer0": "minecraft:item/leather_leggings", + "layer1": "minecraft:item/leather_leggings_overlay" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/leather_leggings_amethyst_trim.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/leather_leggings_amethyst_trim.json new file mode 100644 index 000000000..331e2096c --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/leather_leggings_amethyst_trim.json @@ -0,0 +1,8 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/leather_leggings", + "layer1": "minecraft:item/leather_leggings_overlay", + "layer2": "minecraft:trims/items/leggings_trim_amethyst" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/leather_leggings_copper_trim.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/leather_leggings_copper_trim.json new file mode 100644 index 000000000..cc6a39454 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/leather_leggings_copper_trim.json @@ -0,0 +1,8 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/leather_leggings", + "layer1": "minecraft:item/leather_leggings_overlay", + "layer2": "minecraft:trims/items/leggings_trim_copper" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/leather_leggings_diamond_trim.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/leather_leggings_diamond_trim.json new file mode 100644 index 000000000..9a5313eae --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/leather_leggings_diamond_trim.json @@ -0,0 +1,8 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/leather_leggings", + "layer1": "minecraft:item/leather_leggings_overlay", + "layer2": "minecraft:trims/items/leggings_trim_diamond" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/leather_leggings_emerald_trim.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/leather_leggings_emerald_trim.json new file mode 100644 index 000000000..71156943a --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/leather_leggings_emerald_trim.json @@ -0,0 +1,8 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/leather_leggings", + "layer1": "minecraft:item/leather_leggings_overlay", + "layer2": "minecraft:trims/items/leggings_trim_emerald" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/leather_leggings_gold_trim.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/leather_leggings_gold_trim.json new file mode 100644 index 000000000..528c94e7a --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/leather_leggings_gold_trim.json @@ -0,0 +1,8 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/leather_leggings", + "layer1": "minecraft:item/leather_leggings_overlay", + "layer2": "minecraft:trims/items/leggings_trim_gold" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/leather_leggings_iron_trim.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/leather_leggings_iron_trim.json new file mode 100644 index 000000000..3e9d66348 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/leather_leggings_iron_trim.json @@ -0,0 +1,8 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/leather_leggings", + "layer1": "minecraft:item/leather_leggings_overlay", + "layer2": "minecraft:trims/items/leggings_trim_iron" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/leather_leggings_lapis_trim.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/leather_leggings_lapis_trim.json new file mode 100644 index 000000000..6858077cd --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/leather_leggings_lapis_trim.json @@ -0,0 +1,8 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/leather_leggings", + "layer1": "minecraft:item/leather_leggings_overlay", + "layer2": "minecraft:trims/items/leggings_trim_lapis" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/leather_leggings_netherite_trim.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/leather_leggings_netherite_trim.json new file mode 100644 index 000000000..abf3b6157 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/leather_leggings_netherite_trim.json @@ -0,0 +1,8 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/leather_leggings", + "layer1": "minecraft:item/leather_leggings_overlay", + "layer2": "minecraft:trims/items/leggings_trim_netherite" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/leather_leggings_quartz_trim.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/leather_leggings_quartz_trim.json new file mode 100644 index 000000000..29b21d50c --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/leather_leggings_quartz_trim.json @@ -0,0 +1,8 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/leather_leggings", + "layer1": "minecraft:item/leather_leggings_overlay", + "layer2": "minecraft:trims/items/leggings_trim_quartz" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/leather_leggings_redstone_trim.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/leather_leggings_redstone_trim.json new file mode 100644 index 000000000..9b35d59f1 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/leather_leggings_redstone_trim.json @@ -0,0 +1,8 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/leather_leggings", + "layer1": "minecraft:item/leather_leggings_overlay", + "layer2": "minecraft:trims/items/leggings_trim_redstone" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/lectern.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/lectern.json new file mode 100644 index 000000000..4f2c887a5 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/lectern.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/lectern" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/lever.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/lever.json new file mode 100644 index 000000000..d5a62d479 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/lever.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:block/lever" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/light.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/light.json new file mode 100644 index 000000000..f53de1b53 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/light.json @@ -0,0 +1,24 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/light" + }, + "overrides": [ + { "predicate": { "level": 0.0000 }, "model": "item/light_00" }, + { "predicate": { "level": 0.0625 }, "model": "item/light_01" }, + { "predicate": { "level": 0.1250 }, "model": "item/light_02" }, + { "predicate": { "level": 0.1875 }, "model": "item/light_03" }, + { "predicate": { "level": 0.2500 }, "model": "item/light_04" }, + { "predicate": { "level": 0.3125 }, "model": "item/light_05" }, + { "predicate": { "level": 0.3750 }, "model": "item/light_06" }, + { "predicate": { "level": 0.4375 }, "model": "item/light_07" }, + { "predicate": { "level": 0.5000 }, "model": "item/light_08" }, + { "predicate": { "level": 0.5625 }, "model": "item/light_09" }, + { "predicate": { "level": 0.6250 }, "model": "item/light_10" }, + { "predicate": { "level": 0.6875 }, "model": "item/light_11" }, + { "predicate": { "level": 0.7500 }, "model": "item/light_12" }, + { "predicate": { "level": 0.8125 }, "model": "item/light_13" }, + { "predicate": { "level": 0.8750 }, "model": "item/light_14" }, + { "predicate": { "level": 0.9375 }, "model": "item/light_15" } + ] +} diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/light_00.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/light_00.json new file mode 100644 index 000000000..f6029196c --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/light_00.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/light_00" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/light_01.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/light_01.json new file mode 100644 index 000000000..50fe9d526 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/light_01.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/light_01" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/light_02.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/light_02.json new file mode 100644 index 000000000..3112e828d --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/light_02.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/light_02" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/light_03.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/light_03.json new file mode 100644 index 000000000..7b7d13046 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/light_03.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/light_03" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/light_04.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/light_04.json new file mode 100644 index 000000000..eeca8b9c1 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/light_04.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/light_04" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/light_05.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/light_05.json new file mode 100644 index 000000000..920f2957c --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/light_05.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/light_05" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/light_06.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/light_06.json new file mode 100644 index 000000000..f60f6bf7e --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/light_06.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/light_06" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/light_07.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/light_07.json new file mode 100644 index 000000000..b795ac71e --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/light_07.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/light_07" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/light_08.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/light_08.json new file mode 100644 index 000000000..d34ca3a15 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/light_08.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/light_08" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/light_09.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/light_09.json new file mode 100644 index 000000000..861002fe1 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/light_09.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/light_09" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/light_10.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/light_10.json new file mode 100644 index 000000000..3bda0d190 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/light_10.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/light_10" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/light_11.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/light_11.json new file mode 100644 index 000000000..582b6183d --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/light_11.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/light_11" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/light_12.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/light_12.json new file mode 100644 index 000000000..f9dc8d109 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/light_12.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/light_12" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/light_13.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/light_13.json new file mode 100644 index 000000000..2f9d3815e --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/light_13.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/light_13" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/light_14.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/light_14.json new file mode 100644 index 000000000..263b45fe3 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/light_14.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/light_14" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/light_15.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/light_15.json new file mode 100644 index 000000000..6f39d142a --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/light_15.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/light_15" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/light_blue_banner.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/light_blue_banner.json new file mode 100644 index 000000000..661a106df --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/light_blue_banner.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:item/template_banner" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/light_blue_bed.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/light_blue_bed.json new file mode 100644 index 000000000..fac4cda76 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/light_blue_bed.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/template_bed", + "textures": { + "particle": "minecraft:block/light_blue_wool" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/light_blue_bundle.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/light_blue_bundle.json new file mode 100644 index 000000000..7f4e733b1 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/light_blue_bundle.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/light_blue_bundle" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/light_blue_bundle_open_back.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/light_blue_bundle_open_back.json new file mode 100644 index 000000000..3a0cfc265 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/light_blue_bundle_open_back.json @@ -0,0 +1,6 @@ +{ + "parent": "item/bundle", + "textures": { + "layer0": "item/light_blue_bundle_open_back" + } +} diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/light_blue_bundle_open_front.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/light_blue_bundle_open_front.json new file mode 100644 index 000000000..824e3ccda --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/light_blue_bundle_open_front.json @@ -0,0 +1,6 @@ +{ + "parent": "item/bundle", + "textures": { + "layer0": "item/light_blue_bundle_open_front" + } +} diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/light_blue_candle.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/light_blue_candle.json new file mode 100644 index 000000000..e445d4ad5 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/light_blue_candle.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/light_blue_candle" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/light_blue_carpet.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/light_blue_carpet.json new file mode 100644 index 000000000..9f199e5c9 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/light_blue_carpet.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/light_blue_carpet" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/light_blue_concrete.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/light_blue_concrete.json new file mode 100644 index 000000000..68a0890f1 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/light_blue_concrete.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/light_blue_concrete" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/light_blue_concrete_powder.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/light_blue_concrete_powder.json new file mode 100644 index 000000000..22ec71d5a --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/light_blue_concrete_powder.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/light_blue_concrete_powder" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/light_blue_dye.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/light_blue_dye.json new file mode 100644 index 000000000..297407daf --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/light_blue_dye.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/light_blue_dye" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/light_blue_glazed_terracotta.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/light_blue_glazed_terracotta.json new file mode 100644 index 000000000..3d2b3bd70 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/light_blue_glazed_terracotta.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/light_blue_glazed_terracotta" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/light_blue_shulker_box.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/light_blue_shulker_box.json new file mode 100644 index 000000000..d17a7729e --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/light_blue_shulker_box.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/template_shulker_box", + "textures": { + "particle": "minecraft:block/light_blue_shulker_box" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/light_blue_stained_glass.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/light_blue_stained_glass.json new file mode 100644 index 000000000..0aef7a927 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/light_blue_stained_glass.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/light_blue_stained_glass" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/light_blue_stained_glass_pane.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/light_blue_stained_glass_pane.json new file mode 100644 index 000000000..d810047f1 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/light_blue_stained_glass_pane.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:block/light_blue_stained_glass" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/light_blue_terracotta.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/light_blue_terracotta.json new file mode 100644 index 000000000..06294ea2e --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/light_blue_terracotta.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/light_blue_terracotta" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/light_blue_wool.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/light_blue_wool.json new file mode 100644 index 000000000..4f7bd4de3 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/light_blue_wool.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/light_blue_wool" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/light_gray_banner.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/light_gray_banner.json new file mode 100644 index 000000000..661a106df --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/light_gray_banner.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:item/template_banner" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/light_gray_bed.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/light_gray_bed.json new file mode 100644 index 000000000..67c2af9eb --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/light_gray_bed.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/template_bed", + "textures": { + "particle": "minecraft:block/light_gray_wool" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/light_gray_bundle.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/light_gray_bundle.json new file mode 100644 index 000000000..88a6b82d3 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/light_gray_bundle.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/light_gray_bundle" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/light_gray_bundle_open_back.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/light_gray_bundle_open_back.json new file mode 100644 index 000000000..cbeab6291 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/light_gray_bundle_open_back.json @@ -0,0 +1,6 @@ +{ + "parent": "item/bundle", + "textures": { + "layer0": "item/light_gray_bundle_open_back" + } +} diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/light_gray_bundle_open_front.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/light_gray_bundle_open_front.json new file mode 100644 index 000000000..bb274a9be --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/light_gray_bundle_open_front.json @@ -0,0 +1,6 @@ +{ + "parent": "item/bundle", + "textures": { + "layer0": "item/light_gray_bundle_open_front" + } +} diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/light_gray_candle.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/light_gray_candle.json new file mode 100644 index 000000000..332e87c61 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/light_gray_candle.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/light_gray_candle" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/light_gray_carpet.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/light_gray_carpet.json new file mode 100644 index 000000000..f603263e1 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/light_gray_carpet.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/light_gray_carpet" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/light_gray_concrete.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/light_gray_concrete.json new file mode 100644 index 000000000..9a4e67de2 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/light_gray_concrete.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/light_gray_concrete" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/light_gray_concrete_powder.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/light_gray_concrete_powder.json new file mode 100644 index 000000000..6726d5691 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/light_gray_concrete_powder.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/light_gray_concrete_powder" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/light_gray_dye.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/light_gray_dye.json new file mode 100644 index 000000000..40a44accb --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/light_gray_dye.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/light_gray_dye" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/light_gray_glazed_terracotta.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/light_gray_glazed_terracotta.json new file mode 100644 index 000000000..46b9f1765 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/light_gray_glazed_terracotta.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/light_gray_glazed_terracotta" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/light_gray_shulker_box.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/light_gray_shulker_box.json new file mode 100644 index 000000000..0efe127aa --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/light_gray_shulker_box.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/template_shulker_box", + "textures": { + "particle": "minecraft:block/light_gray_shulker_box" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/light_gray_stained_glass.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/light_gray_stained_glass.json new file mode 100644 index 000000000..e05c7e8d5 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/light_gray_stained_glass.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/light_gray_stained_glass" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/light_gray_stained_glass_pane.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/light_gray_stained_glass_pane.json new file mode 100644 index 000000000..502847437 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/light_gray_stained_glass_pane.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:block/light_gray_stained_glass" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/light_gray_terracotta.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/light_gray_terracotta.json new file mode 100644 index 000000000..a6cbc2418 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/light_gray_terracotta.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/light_gray_terracotta" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/light_gray_wool.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/light_gray_wool.json new file mode 100644 index 000000000..0bdc80f41 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/light_gray_wool.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/light_gray_wool" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/light_weighted_pressure_plate.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/light_weighted_pressure_plate.json new file mode 100644 index 000000000..0922c6701 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/light_weighted_pressure_plate.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/light_weighted_pressure_plate" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/lightning_rod.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/lightning_rod.json new file mode 100644 index 000000000..d701601a0 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/lightning_rod.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/lightning_rod" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/lilac.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/lilac.json new file mode 100644 index 000000000..7e062c921 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/lilac.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:block/lilac_top" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/lily_of_the_valley.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/lily_of_the_valley.json new file mode 100644 index 000000000..2cd5a1cd0 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/lily_of_the_valley.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:block/lily_of_the_valley" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/lily_pad.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/lily_pad.json new file mode 100644 index 000000000..e3aaf7f9e --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/lily_pad.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:block/lily_pad" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/lime_banner.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/lime_banner.json new file mode 100644 index 000000000..661a106df --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/lime_banner.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:item/template_banner" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/lime_bed.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/lime_bed.json new file mode 100644 index 000000000..3efda22b0 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/lime_bed.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/template_bed", + "textures": { + "particle": "minecraft:block/lime_wool" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/lime_bundle.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/lime_bundle.json new file mode 100644 index 000000000..3af851fbf --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/lime_bundle.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/lime_bundle" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/lime_bundle_open_back.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/lime_bundle_open_back.json new file mode 100644 index 000000000..5516ba153 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/lime_bundle_open_back.json @@ -0,0 +1,6 @@ +{ + "parent": "item/bundle", + "textures": { + "layer0": "item/lime_bundle_open_back" + } +} diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/lime_bundle_open_front.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/lime_bundle_open_front.json new file mode 100644 index 000000000..2179105a1 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/lime_bundle_open_front.json @@ -0,0 +1,6 @@ +{ + "parent": "item/bundle", + "textures": { + "layer0": "item/lime_bundle_open_front" + } +} diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/lime_candle.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/lime_candle.json new file mode 100644 index 000000000..84617ccf8 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/lime_candle.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/lime_candle" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/lime_carpet.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/lime_carpet.json new file mode 100644 index 000000000..b6f18c0a3 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/lime_carpet.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/lime_carpet" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/lime_concrete.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/lime_concrete.json new file mode 100644 index 000000000..6becad9d9 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/lime_concrete.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/lime_concrete" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/lime_concrete_powder.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/lime_concrete_powder.json new file mode 100644 index 000000000..a74380d09 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/lime_concrete_powder.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/lime_concrete_powder" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/lime_dye.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/lime_dye.json new file mode 100644 index 000000000..36ae6c824 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/lime_dye.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/lime_dye" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/lime_glazed_terracotta.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/lime_glazed_terracotta.json new file mode 100644 index 000000000..14b5723d0 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/lime_glazed_terracotta.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/lime_glazed_terracotta" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/lime_shulker_box.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/lime_shulker_box.json new file mode 100644 index 000000000..5e0062e22 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/lime_shulker_box.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/template_shulker_box", + "textures": { + "particle": "minecraft:block/lime_shulker_box" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/lime_stained_glass.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/lime_stained_glass.json new file mode 100644 index 000000000..becc32963 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/lime_stained_glass.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/lime_stained_glass" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/lime_stained_glass_pane.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/lime_stained_glass_pane.json new file mode 100644 index 000000000..7f15356d4 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/lime_stained_glass_pane.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:block/lime_stained_glass" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/lime_terracotta.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/lime_terracotta.json new file mode 100644 index 000000000..e61230306 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/lime_terracotta.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/lime_terracotta" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/lime_wool.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/lime_wool.json new file mode 100644 index 000000000..e6600fa83 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/lime_wool.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/lime_wool" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/lingering_potion.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/lingering_potion.json new file mode 100644 index 000000000..35ce5d798 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/lingering_potion.json @@ -0,0 +1,7 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "item/potion_overlay", + "layer1": "item/lingering_potion" + } +} diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/llama_spawn_egg.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/llama_spawn_egg.json new file mode 100644 index 000000000..d1aaa9d6e --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/llama_spawn_egg.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:item/template_spawn_egg" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/lodestone.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/lodestone.json new file mode 100644 index 000000000..f926ec2e0 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/lodestone.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/lodestone" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/loom.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/loom.json new file mode 100644 index 000000000..0fe6a7fa6 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/loom.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/loom" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/mace.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/mace.json new file mode 100644 index 000000000..b62af83de --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/mace.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/handheld_mace", + "textures": { + "layer0": "minecraft:item/mace" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/magenta_banner.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/magenta_banner.json new file mode 100644 index 000000000..661a106df --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/magenta_banner.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:item/template_banner" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/magenta_bed.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/magenta_bed.json new file mode 100644 index 000000000..19af87b67 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/magenta_bed.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/template_bed", + "textures": { + "particle": "minecraft:block/magenta_wool" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/magenta_bundle.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/magenta_bundle.json new file mode 100644 index 000000000..973ef505f --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/magenta_bundle.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/magenta_bundle" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/magenta_bundle_open_back.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/magenta_bundle_open_back.json new file mode 100644 index 000000000..6d8ed84d1 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/magenta_bundle_open_back.json @@ -0,0 +1,6 @@ +{ + "parent": "item/bundle", + "textures": { + "layer0": "item/magenta_bundle_open_back" + } +} diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/magenta_bundle_open_front.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/magenta_bundle_open_front.json new file mode 100644 index 000000000..89b5a6228 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/magenta_bundle_open_front.json @@ -0,0 +1,6 @@ +{ + "parent": "item/bundle", + "textures": { + "layer0": "item/magenta_bundle_open_front" + } +} diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/magenta_candle.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/magenta_candle.json new file mode 100644 index 000000000..b4b756203 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/magenta_candle.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/magenta_candle" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/magenta_carpet.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/magenta_carpet.json new file mode 100644 index 000000000..386f8fcc7 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/magenta_carpet.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/magenta_carpet" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/magenta_concrete.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/magenta_concrete.json new file mode 100644 index 000000000..8dce5e8f5 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/magenta_concrete.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/magenta_concrete" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/magenta_concrete_powder.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/magenta_concrete_powder.json new file mode 100644 index 000000000..e221911bd --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/magenta_concrete_powder.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/magenta_concrete_powder" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/magenta_dye.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/magenta_dye.json new file mode 100644 index 000000000..f1ebae5bc --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/magenta_dye.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/magenta_dye" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/magenta_glazed_terracotta.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/magenta_glazed_terracotta.json new file mode 100644 index 000000000..45b94ea37 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/magenta_glazed_terracotta.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/magenta_glazed_terracotta" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/magenta_shulker_box.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/magenta_shulker_box.json new file mode 100644 index 000000000..f21cad42d --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/magenta_shulker_box.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/template_shulker_box", + "textures": { + "particle": "minecraft:block/magenta_shulker_box" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/magenta_stained_glass.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/magenta_stained_glass.json new file mode 100644 index 000000000..62ff86a5e --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/magenta_stained_glass.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/magenta_stained_glass" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/magenta_stained_glass_pane.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/magenta_stained_glass_pane.json new file mode 100644 index 000000000..ad9621d10 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/magenta_stained_glass_pane.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:block/magenta_stained_glass" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/magenta_terracotta.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/magenta_terracotta.json new file mode 100644 index 000000000..07d441995 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/magenta_terracotta.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/magenta_terracotta" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/magenta_wool.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/magenta_wool.json new file mode 100644 index 000000000..e3ef178ba --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/magenta_wool.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/magenta_wool" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/magma_block.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/magma_block.json new file mode 100644 index 000000000..ac1aa2f4b --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/magma_block.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/magma_block" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/magma_cream.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/magma_cream.json new file mode 100644 index 000000000..f9d7a14d7 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/magma_cream.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/magma_cream" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/magma_cube_spawn_egg.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/magma_cube_spawn_egg.json new file mode 100644 index 000000000..d1aaa9d6e --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/magma_cube_spawn_egg.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:item/template_spawn_egg" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/mangrove_boat.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/mangrove_boat.json new file mode 100644 index 000000000..6816d9e02 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/mangrove_boat.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/mangrove_boat" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/mangrove_button.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/mangrove_button.json new file mode 100644 index 000000000..4bab5228e --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/mangrove_button.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/mangrove_button_inventory" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/mangrove_chest_boat.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/mangrove_chest_boat.json new file mode 100644 index 000000000..006def690 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/mangrove_chest_boat.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/mangrove_chest_boat" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/mangrove_door.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/mangrove_door.json new file mode 100644 index 000000000..c67a120c4 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/mangrove_door.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/mangrove_door" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/mangrove_fence.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/mangrove_fence.json new file mode 100644 index 000000000..b0d4d8c40 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/mangrove_fence.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/mangrove_fence_inventory" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/mangrove_fence_gate.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/mangrove_fence_gate.json new file mode 100644 index 000000000..7eddb3396 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/mangrove_fence_gate.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/mangrove_fence_gate" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/mangrove_hanging_sign.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/mangrove_hanging_sign.json new file mode 100644 index 000000000..431863612 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/mangrove_hanging_sign.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/mangrove_hanging_sign" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/mangrove_leaves.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/mangrove_leaves.json new file mode 100644 index 000000000..be1fca786 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/mangrove_leaves.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/mangrove_leaves" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/mangrove_log.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/mangrove_log.json new file mode 100644 index 000000000..9dbddf082 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/mangrove_log.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/mangrove_log" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/mangrove_planks.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/mangrove_planks.json new file mode 100644 index 000000000..4c4f23bc2 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/mangrove_planks.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/mangrove_planks" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/mangrove_pressure_plate.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/mangrove_pressure_plate.json new file mode 100644 index 000000000..90b728fe2 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/mangrove_pressure_plate.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/mangrove_pressure_plate" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/mangrove_propagule.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/mangrove_propagule.json new file mode 100644 index 000000000..38a689e6b --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/mangrove_propagule.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/mangrove_propagule" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/mangrove_roots.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/mangrove_roots.json new file mode 100644 index 000000000..39131b24f --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/mangrove_roots.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/mangrove_roots" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/mangrove_sign.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/mangrove_sign.json new file mode 100644 index 000000000..867584b16 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/mangrove_sign.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/mangrove_sign" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/mangrove_slab.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/mangrove_slab.json new file mode 100644 index 000000000..036a10f77 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/mangrove_slab.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/mangrove_slab" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/mangrove_stairs.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/mangrove_stairs.json new file mode 100644 index 000000000..281b61b54 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/mangrove_stairs.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/mangrove_stairs" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/mangrove_trapdoor.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/mangrove_trapdoor.json new file mode 100644 index 000000000..dec13fdec --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/mangrove_trapdoor.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/mangrove_trapdoor_bottom" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/mangrove_wood.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/mangrove_wood.json new file mode 100644 index 000000000..99e25bc79 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/mangrove_wood.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/mangrove_wood" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/map.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/map.json new file mode 100644 index 000000000..282650e26 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/map.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/map" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/medium_amethyst_bud.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/medium_amethyst_bud.json new file mode 100644 index 000000000..686d48f48 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/medium_amethyst_bud.json @@ -0,0 +1,11 @@ + { + "parent": "item/amethyst_bud", + "textures": { + "layer0": "minecraft:block/medium_amethyst_bud" + }, + "display": { + "fixed": { + "translation": [ 0, 6, 0 ] + } + } +} diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/melon.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/melon.json new file mode 100644 index 000000000..f0bcf44e2 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/melon.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/melon" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/melon_seeds.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/melon_seeds.json new file mode 100644 index 000000000..71e34075f --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/melon_seeds.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/melon_seeds" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/melon_slice.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/melon_slice.json new file mode 100644 index 000000000..70a587eb8 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/melon_slice.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/melon_slice" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/milk_bucket.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/milk_bucket.json new file mode 100644 index 000000000..4f4a252f6 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/milk_bucket.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/milk_bucket" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/minecart.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/minecart.json new file mode 100644 index 000000000..f478d37cc --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/minecart.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/minecart" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/miner_pottery_sherd.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/miner_pottery_sherd.json new file mode 100644 index 000000000..c31761d1e --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/miner_pottery_sherd.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/miner_pottery_sherd" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/mojang_banner_pattern.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/mojang_banner_pattern.json new file mode 100644 index 000000000..bfac8a9e3 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/mojang_banner_pattern.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/mojang_banner_pattern" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/mooshroom_spawn_egg.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/mooshroom_spawn_egg.json new file mode 100644 index 000000000..d1aaa9d6e --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/mooshroom_spawn_egg.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:item/template_spawn_egg" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/moss_block.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/moss_block.json new file mode 100644 index 000000000..14bf2a81b --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/moss_block.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/moss_block" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/moss_carpet.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/moss_carpet.json new file mode 100644 index 000000000..86a4dfd8e --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/moss_carpet.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/moss_carpet" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/mossy_cobblestone.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/mossy_cobblestone.json new file mode 100644 index 000000000..e865e8fc8 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/mossy_cobblestone.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/mossy_cobblestone" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/mossy_cobblestone_slab.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/mossy_cobblestone_slab.json new file mode 100644 index 000000000..814e6a7a8 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/mossy_cobblestone_slab.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/mossy_cobblestone_slab" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/mossy_cobblestone_stairs.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/mossy_cobblestone_stairs.json new file mode 100644 index 000000000..bc2712d25 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/mossy_cobblestone_stairs.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/mossy_cobblestone_stairs" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/mossy_cobblestone_wall.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/mossy_cobblestone_wall.json new file mode 100644 index 000000000..8baaff2b7 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/mossy_cobblestone_wall.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/mossy_cobblestone_wall_inventory" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/mossy_stone_brick_slab.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/mossy_stone_brick_slab.json new file mode 100644 index 000000000..539b74242 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/mossy_stone_brick_slab.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/mossy_stone_brick_slab" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/mossy_stone_brick_stairs.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/mossy_stone_brick_stairs.json new file mode 100644 index 000000000..2366348b2 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/mossy_stone_brick_stairs.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/mossy_stone_brick_stairs" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/mossy_stone_brick_wall.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/mossy_stone_brick_wall.json new file mode 100644 index 000000000..185b158a2 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/mossy_stone_brick_wall.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/mossy_stone_brick_wall_inventory" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/mossy_stone_bricks.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/mossy_stone_bricks.json new file mode 100644 index 000000000..a9fe750fe --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/mossy_stone_bricks.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/mossy_stone_bricks" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/mourner_pottery_sherd.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/mourner_pottery_sherd.json new file mode 100644 index 000000000..08950424b --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/mourner_pottery_sherd.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/mourner_pottery_sherd" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/mud.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/mud.json new file mode 100644 index 000000000..bee0b1b02 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/mud.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/mud" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/mud_brick_slab.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/mud_brick_slab.json new file mode 100644 index 000000000..06e29291c --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/mud_brick_slab.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/mud_brick_slab" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/mud_brick_stairs.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/mud_brick_stairs.json new file mode 100644 index 000000000..f6d908dd1 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/mud_brick_stairs.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/mud_brick_stairs" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/mud_brick_wall.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/mud_brick_wall.json new file mode 100644 index 000000000..1679aa639 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/mud_brick_wall.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/mud_brick_wall_inventory" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/mud_bricks.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/mud_bricks.json new file mode 100644 index 000000000..4ff42f1ca --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/mud_bricks.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/mud_bricks" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/muddy_mangrove_roots.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/muddy_mangrove_roots.json new file mode 100644 index 000000000..a23b27d15 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/muddy_mangrove_roots.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/muddy_mangrove_roots" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/mule_spawn_egg.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/mule_spawn_egg.json new file mode 100644 index 000000000..d1aaa9d6e --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/mule_spawn_egg.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:item/template_spawn_egg" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/mushroom_stem.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/mushroom_stem.json new file mode 100644 index 000000000..b791415fc --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/mushroom_stem.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/mushroom_stem_inventory" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/mushroom_stew.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/mushroom_stew.json new file mode 100644 index 000000000..70e31deb8 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/mushroom_stew.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/mushroom_stew" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/music_disc_11.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/music_disc_11.json new file mode 100644 index 000000000..aa9afb6fe --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/music_disc_11.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/template_music_disc", + "textures": { + "layer0": "minecraft:item/music_disc_11" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/music_disc_13.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/music_disc_13.json new file mode 100644 index 000000000..eb7eee8b7 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/music_disc_13.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/template_music_disc", + "textures": { + "layer0": "minecraft:item/music_disc_13" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/music_disc_5.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/music_disc_5.json new file mode 100644 index 000000000..c431c6704 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/music_disc_5.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/template_music_disc", + "textures": { + "layer0": "minecraft:item/music_disc_5" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/music_disc_blocks.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/music_disc_blocks.json new file mode 100644 index 000000000..fa70fbc5d --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/music_disc_blocks.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/template_music_disc", + "textures": { + "layer0": "minecraft:item/music_disc_blocks" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/music_disc_cat.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/music_disc_cat.json new file mode 100644 index 000000000..86c9ff552 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/music_disc_cat.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/template_music_disc", + "textures": { + "layer0": "minecraft:item/music_disc_cat" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/music_disc_chirp.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/music_disc_chirp.json new file mode 100644 index 000000000..b89464c2e --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/music_disc_chirp.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/template_music_disc", + "textures": { + "layer0": "minecraft:item/music_disc_chirp" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/music_disc_creator.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/music_disc_creator.json new file mode 100644 index 000000000..cd8e281c1 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/music_disc_creator.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/template_music_disc", + "textures": { + "layer0": "minecraft:item/music_disc_creator" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/music_disc_creator_music_box.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/music_disc_creator_music_box.json new file mode 100644 index 000000000..eeece1829 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/music_disc_creator_music_box.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/template_music_disc", + "textures": { + "layer0": "minecraft:item/music_disc_creator_music_box" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/music_disc_far.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/music_disc_far.json new file mode 100644 index 000000000..3fe312854 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/music_disc_far.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/template_music_disc", + "textures": { + "layer0": "minecraft:item/music_disc_far" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/music_disc_mall.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/music_disc_mall.json new file mode 100644 index 000000000..41eea3675 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/music_disc_mall.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/template_music_disc", + "textures": { + "layer0": "minecraft:item/music_disc_mall" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/music_disc_mellohi.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/music_disc_mellohi.json new file mode 100644 index 000000000..8b6fc61cc --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/music_disc_mellohi.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/template_music_disc", + "textures": { + "layer0": "minecraft:item/music_disc_mellohi" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/music_disc_otherside.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/music_disc_otherside.json new file mode 100644 index 000000000..3cfc540e2 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/music_disc_otherside.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/template_music_disc", + "textures": { + "layer0": "minecraft:item/music_disc_otherside" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/music_disc_pigstep.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/music_disc_pigstep.json new file mode 100644 index 000000000..241ffa8e1 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/music_disc_pigstep.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/template_music_disc", + "textures": { + "layer0": "minecraft:item/music_disc_pigstep" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/music_disc_precipice.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/music_disc_precipice.json new file mode 100644 index 000000000..051ae5e8a --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/music_disc_precipice.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/template_music_disc", + "textures": { + "layer0": "minecraft:item/music_disc_precipice" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/music_disc_relic.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/music_disc_relic.json new file mode 100644 index 000000000..d225ce681 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/music_disc_relic.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/template_music_disc", + "textures": { + "layer0": "minecraft:item/music_disc_relic" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/music_disc_stal.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/music_disc_stal.json new file mode 100644 index 000000000..b9b968211 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/music_disc_stal.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/template_music_disc", + "textures": { + "layer0": "minecraft:item/music_disc_stal" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/music_disc_strad.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/music_disc_strad.json new file mode 100644 index 000000000..add37ea1d --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/music_disc_strad.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/template_music_disc", + "textures": { + "layer0": "minecraft:item/music_disc_strad" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/music_disc_wait.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/music_disc_wait.json new file mode 100644 index 000000000..215e160de --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/music_disc_wait.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/template_music_disc", + "textures": { + "layer0": "minecraft:item/music_disc_wait" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/music_disc_ward.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/music_disc_ward.json new file mode 100644 index 000000000..24bb7ee92 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/music_disc_ward.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/template_music_disc", + "textures": { + "layer0": "minecraft:item/music_disc_ward" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/mutton.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/mutton.json new file mode 100644 index 000000000..56c070d45 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/mutton.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/mutton" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/mycelium.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/mycelium.json new file mode 100644 index 000000000..c97f2ec0a --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/mycelium.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/mycelium" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/name_tag.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/name_tag.json new file mode 100644 index 000000000..ee668ff55 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/name_tag.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/name_tag" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/nautilus_shell.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/nautilus_shell.json new file mode 100644 index 000000000..35a8e5097 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/nautilus_shell.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/nautilus_shell" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/nether_brick.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/nether_brick.json new file mode 100644 index 000000000..b72605844 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/nether_brick.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/nether_brick" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/nether_brick_fence.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/nether_brick_fence.json new file mode 100644 index 000000000..5a72d31a7 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/nether_brick_fence.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/nether_brick_fence_inventory" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/nether_brick_slab.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/nether_brick_slab.json new file mode 100644 index 000000000..dc7b20972 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/nether_brick_slab.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/nether_brick_slab" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/nether_brick_stairs.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/nether_brick_stairs.json new file mode 100644 index 000000000..c0669dfe3 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/nether_brick_stairs.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/nether_brick_stairs" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/nether_brick_wall.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/nether_brick_wall.json new file mode 100644 index 000000000..e01270d4c --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/nether_brick_wall.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/nether_brick_wall_inventory" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/nether_bricks.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/nether_bricks.json new file mode 100644 index 000000000..ada571f62 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/nether_bricks.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/nether_bricks" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/nether_gold_ore.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/nether_gold_ore.json new file mode 100644 index 000000000..ca989c791 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/nether_gold_ore.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/nether_gold_ore" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/nether_quartz_ore.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/nether_quartz_ore.json new file mode 100644 index 000000000..4c6d1bf76 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/nether_quartz_ore.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/nether_quartz_ore" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/nether_sprouts.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/nether_sprouts.json new file mode 100644 index 000000000..847698f84 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/nether_sprouts.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/nether_sprouts" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/nether_star.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/nether_star.json new file mode 100644 index 000000000..b2874c285 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/nether_star.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/nether_star" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/nether_wart.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/nether_wart.json new file mode 100644 index 000000000..de82d450e --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/nether_wart.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/nether_wart" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/nether_wart_block.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/nether_wart_block.json new file mode 100644 index 000000000..a66f9a274 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/nether_wart_block.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/nether_wart_block" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/netherite_axe.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/netherite_axe.json new file mode 100644 index 000000000..50d50009a --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/netherite_axe.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/handheld", + "textures": { + "layer0": "minecraft:item/netherite_axe" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/netherite_block.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/netherite_block.json new file mode 100644 index 000000000..828da634f --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/netherite_block.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/netherite_block" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/netherite_boots.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/netherite_boots.json new file mode 100644 index 000000000..6aa46fb3c --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/netherite_boots.json @@ -0,0 +1,68 @@ +{ + "parent": "minecraft:item/generated", + "overrides": [ + { + "model": "minecraft:item/netherite_boots_quartz_trim", + "predicate": { + "trim_type": 0.1 + } + }, + { + "model": "minecraft:item/netherite_boots_iron_trim", + "predicate": { + "trim_type": 0.2 + } + }, + { + "model": "minecraft:item/netherite_boots_netherite_darker_trim", + "predicate": { + "trim_type": 0.3 + } + }, + { + "model": "minecraft:item/netherite_boots_redstone_trim", + "predicate": { + "trim_type": 0.4 + } + }, + { + "model": "minecraft:item/netherite_boots_copper_trim", + "predicate": { + "trim_type": 0.5 + } + }, + { + "model": "minecraft:item/netherite_boots_gold_trim", + "predicate": { + "trim_type": 0.6 + } + }, + { + "model": "minecraft:item/netherite_boots_emerald_trim", + "predicate": { + "trim_type": 0.7 + } + }, + { + "model": "minecraft:item/netherite_boots_diamond_trim", + "predicate": { + "trim_type": 0.8 + } + }, + { + "model": "minecraft:item/netherite_boots_lapis_trim", + "predicate": { + "trim_type": 0.9 + } + }, + { + "model": "minecraft:item/netherite_boots_amethyst_trim", + "predicate": { + "trim_type": 1.0 + } + } + ], + "textures": { + "layer0": "minecraft:item/netherite_boots" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/netherite_boots_amethyst_trim.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/netherite_boots_amethyst_trim.json new file mode 100644 index 000000000..e2049a22f --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/netherite_boots_amethyst_trim.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/netherite_boots", + "layer1": "minecraft:trims/items/boots_trim_amethyst" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/netherite_boots_copper_trim.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/netherite_boots_copper_trim.json new file mode 100644 index 000000000..f0b92c017 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/netherite_boots_copper_trim.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/netherite_boots", + "layer1": "minecraft:trims/items/boots_trim_copper" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/netherite_boots_diamond_trim.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/netherite_boots_diamond_trim.json new file mode 100644 index 000000000..8be51aca8 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/netherite_boots_diamond_trim.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/netherite_boots", + "layer1": "minecraft:trims/items/boots_trim_diamond" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/netherite_boots_emerald_trim.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/netherite_boots_emerald_trim.json new file mode 100644 index 000000000..65a08e500 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/netherite_boots_emerald_trim.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/netherite_boots", + "layer1": "minecraft:trims/items/boots_trim_emerald" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/netherite_boots_gold_trim.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/netherite_boots_gold_trim.json new file mode 100644 index 000000000..806f861b3 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/netherite_boots_gold_trim.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/netherite_boots", + "layer1": "minecraft:trims/items/boots_trim_gold" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/netherite_boots_iron_trim.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/netherite_boots_iron_trim.json new file mode 100644 index 000000000..2bffc3498 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/netherite_boots_iron_trim.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/netherite_boots", + "layer1": "minecraft:trims/items/boots_trim_iron" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/netherite_boots_lapis_trim.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/netherite_boots_lapis_trim.json new file mode 100644 index 000000000..5d68abb3d --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/netherite_boots_lapis_trim.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/netherite_boots", + "layer1": "minecraft:trims/items/boots_trim_lapis" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/netherite_boots_netherite_darker_trim.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/netherite_boots_netherite_darker_trim.json new file mode 100644 index 000000000..b5c31415d --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/netherite_boots_netherite_darker_trim.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/netherite_boots", + "layer1": "minecraft:trims/items/boots_trim_netherite_darker" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/netherite_boots_quartz_trim.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/netherite_boots_quartz_trim.json new file mode 100644 index 000000000..23ff1d64a --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/netherite_boots_quartz_trim.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/netherite_boots", + "layer1": "minecraft:trims/items/boots_trim_quartz" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/netherite_boots_redstone_trim.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/netherite_boots_redstone_trim.json new file mode 100644 index 000000000..1c68b81f3 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/netherite_boots_redstone_trim.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/netherite_boots", + "layer1": "minecraft:trims/items/boots_trim_redstone" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/netherite_chestplate.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/netherite_chestplate.json new file mode 100644 index 000000000..64e84e2ae --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/netherite_chestplate.json @@ -0,0 +1,68 @@ +{ + "parent": "minecraft:item/generated", + "overrides": [ + { + "model": "minecraft:item/netherite_chestplate_quartz_trim", + "predicate": { + "trim_type": 0.1 + } + }, + { + "model": "minecraft:item/netherite_chestplate_iron_trim", + "predicate": { + "trim_type": 0.2 + } + }, + { + "model": "minecraft:item/netherite_chestplate_netherite_darker_trim", + "predicate": { + "trim_type": 0.3 + } + }, + { + "model": "minecraft:item/netherite_chestplate_redstone_trim", + "predicate": { + "trim_type": 0.4 + } + }, + { + "model": "minecraft:item/netherite_chestplate_copper_trim", + "predicate": { + "trim_type": 0.5 + } + }, + { + "model": "minecraft:item/netherite_chestplate_gold_trim", + "predicate": { + "trim_type": 0.6 + } + }, + { + "model": "minecraft:item/netherite_chestplate_emerald_trim", + "predicate": { + "trim_type": 0.7 + } + }, + { + "model": "minecraft:item/netherite_chestplate_diamond_trim", + "predicate": { + "trim_type": 0.8 + } + }, + { + "model": "minecraft:item/netherite_chestplate_lapis_trim", + "predicate": { + "trim_type": 0.9 + } + }, + { + "model": "minecraft:item/netherite_chestplate_amethyst_trim", + "predicate": { + "trim_type": 1.0 + } + } + ], + "textures": { + "layer0": "minecraft:item/netherite_chestplate" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/netherite_chestplate_amethyst_trim.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/netherite_chestplate_amethyst_trim.json new file mode 100644 index 000000000..945363a35 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/netherite_chestplate_amethyst_trim.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/netherite_chestplate", + "layer1": "minecraft:trims/items/chestplate_trim_amethyst" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/netherite_chestplate_copper_trim.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/netherite_chestplate_copper_trim.json new file mode 100644 index 000000000..51c30e494 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/netherite_chestplate_copper_trim.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/netherite_chestplate", + "layer1": "minecraft:trims/items/chestplate_trim_copper" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/netherite_chestplate_diamond_trim.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/netherite_chestplate_diamond_trim.json new file mode 100644 index 000000000..3a38051a9 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/netherite_chestplate_diamond_trim.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/netherite_chestplate", + "layer1": "minecraft:trims/items/chestplate_trim_diamond" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/netherite_chestplate_emerald_trim.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/netherite_chestplate_emerald_trim.json new file mode 100644 index 000000000..e774df9d7 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/netherite_chestplate_emerald_trim.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/netherite_chestplate", + "layer1": "minecraft:trims/items/chestplate_trim_emerald" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/netherite_chestplate_gold_trim.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/netherite_chestplate_gold_trim.json new file mode 100644 index 000000000..fcd52da7d --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/netherite_chestplate_gold_trim.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/netherite_chestplate", + "layer1": "minecraft:trims/items/chestplate_trim_gold" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/netherite_chestplate_iron_trim.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/netherite_chestplate_iron_trim.json new file mode 100644 index 000000000..09d65529f --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/netherite_chestplate_iron_trim.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/netherite_chestplate", + "layer1": "minecraft:trims/items/chestplate_trim_iron" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/netherite_chestplate_lapis_trim.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/netherite_chestplate_lapis_trim.json new file mode 100644 index 000000000..ee2a9d3e3 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/netherite_chestplate_lapis_trim.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/netherite_chestplate", + "layer1": "minecraft:trims/items/chestplate_trim_lapis" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/netherite_chestplate_netherite_darker_trim.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/netherite_chestplate_netherite_darker_trim.json new file mode 100644 index 000000000..b80d9cff2 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/netherite_chestplate_netherite_darker_trim.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/netherite_chestplate", + "layer1": "minecraft:trims/items/chestplate_trim_netherite_darker" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/netherite_chestplate_quartz_trim.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/netherite_chestplate_quartz_trim.json new file mode 100644 index 000000000..51af51b88 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/netherite_chestplate_quartz_trim.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/netherite_chestplate", + "layer1": "minecraft:trims/items/chestplate_trim_quartz" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/netherite_chestplate_redstone_trim.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/netherite_chestplate_redstone_trim.json new file mode 100644 index 000000000..a1979f266 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/netherite_chestplate_redstone_trim.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/netherite_chestplate", + "layer1": "minecraft:trims/items/chestplate_trim_redstone" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/netherite_helmet.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/netherite_helmet.json new file mode 100644 index 000000000..a39c9484b --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/netherite_helmet.json @@ -0,0 +1,68 @@ +{ + "parent": "minecraft:item/generated", + "overrides": [ + { + "model": "minecraft:item/netherite_helmet_quartz_trim", + "predicate": { + "trim_type": 0.1 + } + }, + { + "model": "minecraft:item/netherite_helmet_iron_trim", + "predicate": { + "trim_type": 0.2 + } + }, + { + "model": "minecraft:item/netherite_helmet_netherite_darker_trim", + "predicate": { + "trim_type": 0.3 + } + }, + { + "model": "minecraft:item/netherite_helmet_redstone_trim", + "predicate": { + "trim_type": 0.4 + } + }, + { + "model": "minecraft:item/netherite_helmet_copper_trim", + "predicate": { + "trim_type": 0.5 + } + }, + { + "model": "minecraft:item/netherite_helmet_gold_trim", + "predicate": { + "trim_type": 0.6 + } + }, + { + "model": "minecraft:item/netherite_helmet_emerald_trim", + "predicate": { + "trim_type": 0.7 + } + }, + { + "model": "minecraft:item/netherite_helmet_diamond_trim", + "predicate": { + "trim_type": 0.8 + } + }, + { + "model": "minecraft:item/netherite_helmet_lapis_trim", + "predicate": { + "trim_type": 0.9 + } + }, + { + "model": "minecraft:item/netherite_helmet_amethyst_trim", + "predicate": { + "trim_type": 1.0 + } + } + ], + "textures": { + "layer0": "minecraft:item/netherite_helmet" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/netherite_helmet_amethyst_trim.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/netherite_helmet_amethyst_trim.json new file mode 100644 index 000000000..534ef695d --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/netherite_helmet_amethyst_trim.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/netherite_helmet", + "layer1": "minecraft:trims/items/helmet_trim_amethyst" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/netherite_helmet_copper_trim.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/netherite_helmet_copper_trim.json new file mode 100644 index 000000000..d435422bd --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/netherite_helmet_copper_trim.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/netherite_helmet", + "layer1": "minecraft:trims/items/helmet_trim_copper" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/netherite_helmet_diamond_trim.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/netherite_helmet_diamond_trim.json new file mode 100644 index 000000000..e50ce756c --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/netherite_helmet_diamond_trim.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/netherite_helmet", + "layer1": "minecraft:trims/items/helmet_trim_diamond" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/netherite_helmet_emerald_trim.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/netherite_helmet_emerald_trim.json new file mode 100644 index 000000000..22876e114 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/netherite_helmet_emerald_trim.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/netherite_helmet", + "layer1": "minecraft:trims/items/helmet_trim_emerald" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/netherite_helmet_gold_trim.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/netherite_helmet_gold_trim.json new file mode 100644 index 000000000..405e6bbce --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/netherite_helmet_gold_trim.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/netherite_helmet", + "layer1": "minecraft:trims/items/helmet_trim_gold" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/netherite_helmet_iron_trim.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/netherite_helmet_iron_trim.json new file mode 100644 index 000000000..c7afe68c0 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/netherite_helmet_iron_trim.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/netherite_helmet", + "layer1": "minecraft:trims/items/helmet_trim_iron" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/netherite_helmet_lapis_trim.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/netherite_helmet_lapis_trim.json new file mode 100644 index 000000000..3bc06d400 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/netherite_helmet_lapis_trim.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/netherite_helmet", + "layer1": "minecraft:trims/items/helmet_trim_lapis" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/netherite_helmet_netherite_darker_trim.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/netherite_helmet_netherite_darker_trim.json new file mode 100644 index 000000000..630061661 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/netherite_helmet_netherite_darker_trim.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/netherite_helmet", + "layer1": "minecraft:trims/items/helmet_trim_netherite_darker" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/netherite_helmet_quartz_trim.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/netherite_helmet_quartz_trim.json new file mode 100644 index 000000000..3b614408a --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/netherite_helmet_quartz_trim.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/netherite_helmet", + "layer1": "minecraft:trims/items/helmet_trim_quartz" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/netherite_helmet_redstone_trim.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/netherite_helmet_redstone_trim.json new file mode 100644 index 000000000..533466cb3 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/netherite_helmet_redstone_trim.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/netherite_helmet", + "layer1": "minecraft:trims/items/helmet_trim_redstone" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/netherite_hoe.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/netherite_hoe.json new file mode 100644 index 000000000..d9c185dcd --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/netherite_hoe.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/handheld", + "textures": { + "layer0": "minecraft:item/netherite_hoe" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/netherite_ingot.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/netherite_ingot.json new file mode 100644 index 000000000..0ef436c07 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/netherite_ingot.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/netherite_ingot" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/netherite_leggings.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/netherite_leggings.json new file mode 100644 index 000000000..eb7328071 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/netherite_leggings.json @@ -0,0 +1,68 @@ +{ + "parent": "minecraft:item/generated", + "overrides": [ + { + "model": "minecraft:item/netherite_leggings_quartz_trim", + "predicate": { + "trim_type": 0.1 + } + }, + { + "model": "minecraft:item/netherite_leggings_iron_trim", + "predicate": { + "trim_type": 0.2 + } + }, + { + "model": "minecraft:item/netherite_leggings_netherite_darker_trim", + "predicate": { + "trim_type": 0.3 + } + }, + { + "model": "minecraft:item/netherite_leggings_redstone_trim", + "predicate": { + "trim_type": 0.4 + } + }, + { + "model": "minecraft:item/netherite_leggings_copper_trim", + "predicate": { + "trim_type": 0.5 + } + }, + { + "model": "minecraft:item/netherite_leggings_gold_trim", + "predicate": { + "trim_type": 0.6 + } + }, + { + "model": "minecraft:item/netherite_leggings_emerald_trim", + "predicate": { + "trim_type": 0.7 + } + }, + { + "model": "minecraft:item/netherite_leggings_diamond_trim", + "predicate": { + "trim_type": 0.8 + } + }, + { + "model": "minecraft:item/netherite_leggings_lapis_trim", + "predicate": { + "trim_type": 0.9 + } + }, + { + "model": "minecraft:item/netherite_leggings_amethyst_trim", + "predicate": { + "trim_type": 1.0 + } + } + ], + "textures": { + "layer0": "minecraft:item/netherite_leggings" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/netherite_leggings_amethyst_trim.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/netherite_leggings_amethyst_trim.json new file mode 100644 index 000000000..7a254f283 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/netherite_leggings_amethyst_trim.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/netherite_leggings", + "layer1": "minecraft:trims/items/leggings_trim_amethyst" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/netherite_leggings_copper_trim.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/netherite_leggings_copper_trim.json new file mode 100644 index 000000000..3c2f5f3fc --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/netherite_leggings_copper_trim.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/netherite_leggings", + "layer1": "minecraft:trims/items/leggings_trim_copper" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/netherite_leggings_diamond_trim.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/netherite_leggings_diamond_trim.json new file mode 100644 index 000000000..ac71f9eed --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/netherite_leggings_diamond_trim.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/netherite_leggings", + "layer1": "minecraft:trims/items/leggings_trim_diamond" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/netherite_leggings_emerald_trim.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/netherite_leggings_emerald_trim.json new file mode 100644 index 000000000..a30340338 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/netherite_leggings_emerald_trim.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/netherite_leggings", + "layer1": "minecraft:trims/items/leggings_trim_emerald" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/netherite_leggings_gold_trim.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/netherite_leggings_gold_trim.json new file mode 100644 index 000000000..1e49fde47 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/netherite_leggings_gold_trim.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/netherite_leggings", + "layer1": "minecraft:trims/items/leggings_trim_gold" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/netherite_leggings_iron_trim.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/netherite_leggings_iron_trim.json new file mode 100644 index 000000000..09d1dbb99 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/netherite_leggings_iron_trim.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/netherite_leggings", + "layer1": "minecraft:trims/items/leggings_trim_iron" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/netherite_leggings_lapis_trim.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/netherite_leggings_lapis_trim.json new file mode 100644 index 000000000..62a4e71d9 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/netherite_leggings_lapis_trim.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/netherite_leggings", + "layer1": "minecraft:trims/items/leggings_trim_lapis" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/netherite_leggings_netherite_darker_trim.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/netherite_leggings_netherite_darker_trim.json new file mode 100644 index 000000000..734ea70e5 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/netherite_leggings_netherite_darker_trim.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/netherite_leggings", + "layer1": "minecraft:trims/items/leggings_trim_netherite_darker" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/netherite_leggings_quartz_trim.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/netherite_leggings_quartz_trim.json new file mode 100644 index 000000000..55e5445e4 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/netherite_leggings_quartz_trim.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/netherite_leggings", + "layer1": "minecraft:trims/items/leggings_trim_quartz" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/netherite_leggings_redstone_trim.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/netherite_leggings_redstone_trim.json new file mode 100644 index 000000000..e6bafbe73 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/netherite_leggings_redstone_trim.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/netherite_leggings", + "layer1": "minecraft:trims/items/leggings_trim_redstone" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/netherite_pickaxe.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/netherite_pickaxe.json new file mode 100644 index 000000000..663d51627 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/netherite_pickaxe.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/handheld", + "textures": { + "layer0": "minecraft:item/netherite_pickaxe" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/netherite_scrap.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/netherite_scrap.json new file mode 100644 index 000000000..8465c6781 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/netherite_scrap.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/netherite_scrap" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/netherite_shovel.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/netherite_shovel.json new file mode 100644 index 000000000..88e93948e --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/netherite_shovel.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/handheld", + "textures": { + "layer0": "minecraft:item/netherite_shovel" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/netherite_sword.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/netherite_sword.json new file mode 100644 index 000000000..a2d7ef428 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/netherite_sword.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/handheld", + "textures": { + "layer0": "minecraft:item/netherite_sword" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/netherite_upgrade_smithing_template.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/netherite_upgrade_smithing_template.json new file mode 100644 index 000000000..17012d1bf --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/netherite_upgrade_smithing_template.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/netherite_upgrade_smithing_template" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/netherrack.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/netherrack.json new file mode 100644 index 000000000..39d75ee84 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/netherrack.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/netherrack" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/note_block.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/note_block.json new file mode 100644 index 000000000..dd873344e --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/note_block.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/note_block" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/oak_boat.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/oak_boat.json new file mode 100644 index 000000000..793cf5206 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/oak_boat.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/oak_boat" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/oak_button.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/oak_button.json new file mode 100644 index 000000000..7e99608e5 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/oak_button.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/oak_button_inventory" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/oak_chest_boat.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/oak_chest_boat.json new file mode 100644 index 000000000..0d6c1c49b --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/oak_chest_boat.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/oak_chest_boat" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/oak_door.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/oak_door.json new file mode 100644 index 000000000..93f7e7351 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/oak_door.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/oak_door" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/oak_fence.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/oak_fence.json new file mode 100644 index 000000000..039fd9143 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/oak_fence.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/oak_fence_inventory" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/oak_fence_gate.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/oak_fence_gate.json new file mode 100644 index 000000000..04dee087b --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/oak_fence_gate.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/oak_fence_gate" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/oak_hanging_sign.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/oak_hanging_sign.json new file mode 100644 index 000000000..400c727f1 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/oak_hanging_sign.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/oak_hanging_sign" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/oak_leaves.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/oak_leaves.json new file mode 100644 index 000000000..a54fc8a7a --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/oak_leaves.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/oak_leaves" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/oak_log.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/oak_log.json new file mode 100644 index 000000000..b450f38fa --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/oak_log.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/oak_log" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/oak_planks.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/oak_planks.json new file mode 100644 index 000000000..a03517532 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/oak_planks.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/oak_planks" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/oak_pressure_plate.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/oak_pressure_plate.json new file mode 100644 index 000000000..ec3f44562 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/oak_pressure_plate.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/oak_pressure_plate" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/oak_sapling.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/oak_sapling.json new file mode 100644 index 000000000..93a96b44e --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/oak_sapling.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:block/oak_sapling" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/oak_sign.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/oak_sign.json new file mode 100644 index 000000000..0f6a0f050 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/oak_sign.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/oak_sign" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/oak_slab.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/oak_slab.json new file mode 100644 index 000000000..263d7d00d --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/oak_slab.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/oak_slab" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/oak_stairs.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/oak_stairs.json new file mode 100644 index 000000000..282b43100 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/oak_stairs.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/oak_stairs" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/oak_trapdoor.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/oak_trapdoor.json new file mode 100644 index 000000000..a041a5b48 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/oak_trapdoor.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/oak_trapdoor_bottom" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/oak_wood.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/oak_wood.json new file mode 100644 index 000000000..a51270ef8 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/oak_wood.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/oak_wood" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/observer.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/observer.json new file mode 100644 index 000000000..c1e1ddfed --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/observer.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/observer" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/obsidian.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/obsidian.json new file mode 100644 index 000000000..0c124ed6f --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/obsidian.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/obsidian" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/ocelot_spawn_egg.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/ocelot_spawn_egg.json new file mode 100644 index 000000000..d1aaa9d6e --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/ocelot_spawn_egg.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:item/template_spawn_egg" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/ochre_froglight.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/ochre_froglight.json new file mode 100644 index 000000000..d5bf2ba40 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/ochre_froglight.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/ochre_froglight" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/ominous_bottle.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/ominous_bottle.json new file mode 100644 index 000000000..de2d68f74 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/ominous_bottle.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/ominous_bottle" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/ominous_trial_key.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/ominous_trial_key.json new file mode 100644 index 000000000..32057a58b --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/ominous_trial_key.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/ominous_trial_key" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/orange_banner.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/orange_banner.json new file mode 100644 index 000000000..661a106df --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/orange_banner.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:item/template_banner" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/orange_bed.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/orange_bed.json new file mode 100644 index 000000000..c014375aa --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/orange_bed.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/template_bed", + "textures": { + "particle": "minecraft:block/orange_wool" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/orange_bundle.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/orange_bundle.json new file mode 100644 index 000000000..593cfc8d3 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/orange_bundle.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/orange_bundle" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/orange_bundle_open_back.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/orange_bundle_open_back.json new file mode 100644 index 000000000..f99807204 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/orange_bundle_open_back.json @@ -0,0 +1,6 @@ +{ + "parent": "item/bundle", + "textures": { + "layer0": "item/orange_bundle_open_back" + } +} diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/orange_bundle_open_front.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/orange_bundle_open_front.json new file mode 100644 index 000000000..4387fded3 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/orange_bundle_open_front.json @@ -0,0 +1,6 @@ +{ + "parent": "item/bundle", + "textures": { + "layer0": "item/orange_bundle_open_front" + } +} diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/orange_candle.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/orange_candle.json new file mode 100644 index 000000000..9f35bc60e --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/orange_candle.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/orange_candle" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/orange_carpet.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/orange_carpet.json new file mode 100644 index 000000000..f1421e235 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/orange_carpet.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/orange_carpet" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/orange_concrete.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/orange_concrete.json new file mode 100644 index 000000000..6238369f9 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/orange_concrete.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/orange_concrete" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/orange_concrete_powder.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/orange_concrete_powder.json new file mode 100644 index 000000000..3c854fe1a --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/orange_concrete_powder.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/orange_concrete_powder" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/orange_dye.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/orange_dye.json new file mode 100644 index 000000000..4c5e5e9b9 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/orange_dye.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/orange_dye" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/orange_glazed_terracotta.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/orange_glazed_terracotta.json new file mode 100644 index 000000000..9a67ff627 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/orange_glazed_terracotta.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/orange_glazed_terracotta" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/orange_shulker_box.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/orange_shulker_box.json new file mode 100644 index 000000000..e8a725a2b --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/orange_shulker_box.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/template_shulker_box", + "textures": { + "particle": "minecraft:block/orange_shulker_box" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/orange_stained_glass.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/orange_stained_glass.json new file mode 100644 index 000000000..b00fed28b --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/orange_stained_glass.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/orange_stained_glass" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/orange_stained_glass_pane.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/orange_stained_glass_pane.json new file mode 100644 index 000000000..756f767a6 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/orange_stained_glass_pane.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:block/orange_stained_glass" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/orange_terracotta.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/orange_terracotta.json new file mode 100644 index 000000000..6d399783a --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/orange_terracotta.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/orange_terracotta" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/orange_tulip.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/orange_tulip.json new file mode 100644 index 000000000..70ba2d3af --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/orange_tulip.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:block/orange_tulip" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/orange_wool.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/orange_wool.json new file mode 100644 index 000000000..e7c54f33f --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/orange_wool.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/orange_wool" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/oxeye_daisy.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/oxeye_daisy.json new file mode 100644 index 000000000..dc6eaab32 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/oxeye_daisy.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:block/oxeye_daisy" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/oxidized_chiseled_copper.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/oxidized_chiseled_copper.json new file mode 100644 index 000000000..720204270 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/oxidized_chiseled_copper.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/oxidized_chiseled_copper" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/oxidized_copper.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/oxidized_copper.json new file mode 100644 index 000000000..63a0dabe3 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/oxidized_copper.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/oxidized_copper" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/oxidized_copper_bulb.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/oxidized_copper_bulb.json new file mode 100644 index 000000000..1624fe6e0 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/oxidized_copper_bulb.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/oxidized_copper_bulb" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/oxidized_copper_door.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/oxidized_copper_door.json new file mode 100644 index 000000000..cd2edca38 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/oxidized_copper_door.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/oxidized_copper_door" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/oxidized_copper_grate.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/oxidized_copper_grate.json new file mode 100644 index 000000000..e2521c38e --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/oxidized_copper_grate.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/oxidized_copper_grate" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/oxidized_copper_trapdoor.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/oxidized_copper_trapdoor.json new file mode 100644 index 000000000..3685e9b2e --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/oxidized_copper_trapdoor.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/oxidized_copper_trapdoor_bottom" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/oxidized_cut_copper.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/oxidized_cut_copper.json new file mode 100644 index 000000000..36dfa030a --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/oxidized_cut_copper.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/oxidized_cut_copper" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/oxidized_cut_copper_slab.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/oxidized_cut_copper_slab.json new file mode 100644 index 000000000..a3d022426 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/oxidized_cut_copper_slab.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/oxidized_cut_copper_slab" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/oxidized_cut_copper_stairs.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/oxidized_cut_copper_stairs.json new file mode 100644 index 000000000..fd8af1aab --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/oxidized_cut_copper_stairs.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/oxidized_cut_copper_stairs" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/packed_ice.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/packed_ice.json new file mode 100644 index 000000000..bada5d8ee --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/packed_ice.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/packed_ice" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/packed_mud.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/packed_mud.json new file mode 100644 index 000000000..8ac65758b --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/packed_mud.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/packed_mud" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/painting.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/painting.json new file mode 100644 index 000000000..0222609b7 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/painting.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/painting" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/pale_hanging_moss.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/pale_hanging_moss.json new file mode 100644 index 000000000..41100eeda --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/pale_hanging_moss.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:block/pale_hanging_moss" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/pale_moss_block.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/pale_moss_block.json new file mode 100644 index 000000000..89a69ea6d --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/pale_moss_block.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/pale_moss_block" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/pale_moss_carpet.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/pale_moss_carpet.json new file mode 100644 index 000000000..26f94ad46 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/pale_moss_carpet.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/pale_moss_carpet" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/pale_oak_boat.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/pale_oak_boat.json new file mode 100644 index 000000000..d40a5136e --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/pale_oak_boat.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/pale_oak_boat" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/pale_oak_button.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/pale_oak_button.json new file mode 100644 index 000000000..cdad389ac --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/pale_oak_button.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/pale_oak_button_inventory" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/pale_oak_chest_boat.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/pale_oak_chest_boat.json new file mode 100644 index 000000000..00d122ead --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/pale_oak_chest_boat.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/pale_oak_chest_boat" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/pale_oak_door.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/pale_oak_door.json new file mode 100644 index 000000000..0f7964be1 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/pale_oak_door.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/pale_oak_door" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/pale_oak_fence.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/pale_oak_fence.json new file mode 100644 index 000000000..b5b713542 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/pale_oak_fence.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/pale_oak_fence_inventory" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/pale_oak_fence_gate.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/pale_oak_fence_gate.json new file mode 100644 index 000000000..1c5a842ac --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/pale_oak_fence_gate.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/pale_oak_fence_gate" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/pale_oak_hanging_sign.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/pale_oak_hanging_sign.json new file mode 100644 index 000000000..4d5f08f48 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/pale_oak_hanging_sign.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/pale_oak_hanging_sign" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/pale_oak_leaves.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/pale_oak_leaves.json new file mode 100644 index 000000000..5b7e13626 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/pale_oak_leaves.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/pale_oak_leaves" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/pale_oak_log.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/pale_oak_log.json new file mode 100644 index 000000000..0eb844ba0 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/pale_oak_log.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/pale_oak_log" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/pale_oak_planks.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/pale_oak_planks.json new file mode 100644 index 000000000..d797221c5 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/pale_oak_planks.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/pale_oak_planks" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/pale_oak_pressure_plate.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/pale_oak_pressure_plate.json new file mode 100644 index 000000000..4cd5b4f21 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/pale_oak_pressure_plate.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/pale_oak_pressure_plate" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/pale_oak_sapling.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/pale_oak_sapling.json new file mode 100644 index 000000000..7c162db68 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/pale_oak_sapling.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:block/pale_oak_sapling" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/pale_oak_sign.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/pale_oak_sign.json new file mode 100644 index 000000000..c9018638a --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/pale_oak_sign.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/pale_oak_sign" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/pale_oak_slab.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/pale_oak_slab.json new file mode 100644 index 000000000..bcd617eca --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/pale_oak_slab.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/pale_oak_slab" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/pale_oak_stairs.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/pale_oak_stairs.json new file mode 100644 index 000000000..6b6827725 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/pale_oak_stairs.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/pale_oak_stairs" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/pale_oak_trapdoor.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/pale_oak_trapdoor.json new file mode 100644 index 000000000..4da9662e9 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/pale_oak_trapdoor.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/pale_oak_trapdoor_bottom" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/pale_oak_wood.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/pale_oak_wood.json new file mode 100644 index 000000000..60be9f583 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/pale_oak_wood.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/pale_oak_wood" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/panda_spawn_egg.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/panda_spawn_egg.json new file mode 100644 index 000000000..d1aaa9d6e --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/panda_spawn_egg.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:item/template_spawn_egg" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/paper.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/paper.json new file mode 100644 index 000000000..5cfa9dd85 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/paper.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/paper" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/parrot_spawn_egg.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/parrot_spawn_egg.json new file mode 100644 index 000000000..d1aaa9d6e --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/parrot_spawn_egg.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:item/template_spawn_egg" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/pearlescent_froglight.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/pearlescent_froglight.json new file mode 100644 index 000000000..3a9d87f48 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/pearlescent_froglight.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/pearlescent_froglight" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/peony.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/peony.json new file mode 100644 index 000000000..b87b076e9 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/peony.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:block/peony_top" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/petrified_oak_slab.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/petrified_oak_slab.json new file mode 100644 index 000000000..36ecfd7c2 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/petrified_oak_slab.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/petrified_oak_slab" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/phantom_membrane.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/phantom_membrane.json new file mode 100644 index 000000000..aa7891ced --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/phantom_membrane.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/phantom_membrane" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/phantom_spawn_egg.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/phantom_spawn_egg.json new file mode 100644 index 000000000..d1aaa9d6e --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/phantom_spawn_egg.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:item/template_spawn_egg" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/pig_spawn_egg.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/pig_spawn_egg.json new file mode 100644 index 000000000..d1aaa9d6e --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/pig_spawn_egg.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:item/template_spawn_egg" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/piglin_banner_pattern.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/piglin_banner_pattern.json new file mode 100644 index 000000000..e19d96c8c --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/piglin_banner_pattern.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/piglin_banner_pattern" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/piglin_brute_spawn_egg.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/piglin_brute_spawn_egg.json new file mode 100644 index 000000000..d1aaa9d6e --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/piglin_brute_spawn_egg.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:item/template_spawn_egg" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/piglin_head.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/piglin_head.json new file mode 100644 index 000000000..364b6e65f --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/piglin_head.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:item/template_skull" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/piglin_spawn_egg.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/piglin_spawn_egg.json new file mode 100644 index 000000000..d1aaa9d6e --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/piglin_spawn_egg.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:item/template_spawn_egg" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/pillager_spawn_egg.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/pillager_spawn_egg.json new file mode 100644 index 000000000..d1aaa9d6e --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/pillager_spawn_egg.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:item/template_spawn_egg" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/pink_banner.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/pink_banner.json new file mode 100644 index 000000000..661a106df --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/pink_banner.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:item/template_banner" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/pink_bed.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/pink_bed.json new file mode 100644 index 000000000..7565d98f1 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/pink_bed.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/template_bed", + "textures": { + "particle": "minecraft:block/pink_wool" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/pink_bundle.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/pink_bundle.json new file mode 100644 index 000000000..2d76ab30e --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/pink_bundle.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/pink_bundle" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/pink_bundle_open_back.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/pink_bundle_open_back.json new file mode 100644 index 000000000..c30768bb2 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/pink_bundle_open_back.json @@ -0,0 +1,6 @@ +{ + "parent": "item/bundle", + "textures": { + "layer0": "item/pink_bundle_open_back" + } +} diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/pink_bundle_open_front.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/pink_bundle_open_front.json new file mode 100644 index 000000000..26d8f26d8 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/pink_bundle_open_front.json @@ -0,0 +1,6 @@ +{ + "parent": "item/bundle", + "textures": { + "layer0": "item/pink_bundle_open_front" + } +} diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/pink_candle.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/pink_candle.json new file mode 100644 index 000000000..0d64b1caf --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/pink_candle.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/pink_candle" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/pink_carpet.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/pink_carpet.json new file mode 100644 index 000000000..b27091087 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/pink_carpet.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/pink_carpet" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/pink_concrete.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/pink_concrete.json new file mode 100644 index 000000000..770e1febc --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/pink_concrete.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/pink_concrete" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/pink_concrete_powder.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/pink_concrete_powder.json new file mode 100644 index 000000000..29803f664 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/pink_concrete_powder.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/pink_concrete_powder" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/pink_dye.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/pink_dye.json new file mode 100644 index 000000000..bf230ebc6 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/pink_dye.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/pink_dye" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/pink_glazed_terracotta.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/pink_glazed_terracotta.json new file mode 100644 index 000000000..c8ea2b254 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/pink_glazed_terracotta.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/pink_glazed_terracotta" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/pink_petals.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/pink_petals.json new file mode 100644 index 000000000..ce099c8a5 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/pink_petals.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/pink_petals" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/pink_shulker_box.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/pink_shulker_box.json new file mode 100644 index 000000000..e71465fea --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/pink_shulker_box.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/template_shulker_box", + "textures": { + "particle": "minecraft:block/pink_shulker_box" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/pink_stained_glass.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/pink_stained_glass.json new file mode 100644 index 000000000..b0bc89687 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/pink_stained_glass.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/pink_stained_glass" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/pink_stained_glass_pane.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/pink_stained_glass_pane.json new file mode 100644 index 000000000..13681586a --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/pink_stained_glass_pane.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:block/pink_stained_glass" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/pink_terracotta.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/pink_terracotta.json new file mode 100644 index 000000000..2e5587491 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/pink_terracotta.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/pink_terracotta" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/pink_tulip.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/pink_tulip.json new file mode 100644 index 000000000..9d76762d5 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/pink_tulip.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:block/pink_tulip" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/pink_wool.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/pink_wool.json new file mode 100644 index 000000000..9f1e510fb --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/pink_wool.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/pink_wool" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/piston.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/piston.json new file mode 100644 index 000000000..669d1c40d --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/piston.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/piston_inventory" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/pitcher_plant.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/pitcher_plant.json new file mode 100644 index 000000000..e5898a0fa --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/pitcher_plant.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/pitcher_plant" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/pitcher_pod.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/pitcher_pod.json new file mode 100644 index 000000000..b5f561ac3 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/pitcher_pod.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/pitcher_pod" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/player_head.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/player_head.json new file mode 100644 index 000000000..364b6e65f --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/player_head.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:item/template_skull" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/plenty_pottery_sherd.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/plenty_pottery_sherd.json new file mode 100644 index 000000000..c3fd23217 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/plenty_pottery_sherd.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/plenty_pottery_sherd" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/podzol.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/podzol.json new file mode 100644 index 000000000..ec0474983 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/podzol.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/podzol" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/pointed_dripstone.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/pointed_dripstone.json new file mode 100644 index 000000000..f30f9594f --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/pointed_dripstone.json @@ -0,0 +1,18 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/pointed_dripstone" + }, + "display": { + "thirdperson_righthand": { + "rotation": [ 0, 100, 0 ], + "translation": [ -1, -1, 0], + "scale": [ 0.9, 0.9, 0.9 ] + }, + "firstperson_righthand": { + "rotation": [ 0, 100, 0 ], + "translation": [ 0, -2, 0], + "scale": [ 0.9, 0.9, 0.9 ] + } + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/poisonous_potato.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/poisonous_potato.json new file mode 100644 index 000000000..f35777956 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/poisonous_potato.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/poisonous_potato" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/polar_bear_spawn_egg.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/polar_bear_spawn_egg.json new file mode 100644 index 000000000..d1aaa9d6e --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/polar_bear_spawn_egg.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:item/template_spawn_egg" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/polished_andesite.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/polished_andesite.json new file mode 100644 index 000000000..4968aa477 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/polished_andesite.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/polished_andesite" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/polished_andesite_slab.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/polished_andesite_slab.json new file mode 100644 index 000000000..dbaf20ca5 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/polished_andesite_slab.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/polished_andesite_slab" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/polished_andesite_stairs.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/polished_andesite_stairs.json new file mode 100644 index 000000000..0695848c6 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/polished_andesite_stairs.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/polished_andesite_stairs" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/polished_basalt.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/polished_basalt.json new file mode 100644 index 000000000..00d0a8ab0 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/polished_basalt.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/polished_basalt" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/polished_blackstone.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/polished_blackstone.json new file mode 100644 index 000000000..b60255afe --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/polished_blackstone.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/polished_blackstone" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/polished_blackstone_brick_slab.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/polished_blackstone_brick_slab.json new file mode 100644 index 000000000..35a5786cb --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/polished_blackstone_brick_slab.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/polished_blackstone_brick_slab" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/polished_blackstone_brick_stairs.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/polished_blackstone_brick_stairs.json new file mode 100644 index 000000000..bfdf49c15 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/polished_blackstone_brick_stairs.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/polished_blackstone_brick_stairs" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/polished_blackstone_brick_wall.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/polished_blackstone_brick_wall.json new file mode 100644 index 000000000..58262eeda --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/polished_blackstone_brick_wall.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/polished_blackstone_brick_wall_inventory" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/polished_blackstone_bricks.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/polished_blackstone_bricks.json new file mode 100644 index 000000000..2c7c6530e --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/polished_blackstone_bricks.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/polished_blackstone_bricks" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/polished_blackstone_button.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/polished_blackstone_button.json new file mode 100644 index 000000000..e815336ba --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/polished_blackstone_button.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/polished_blackstone_button_inventory" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/polished_blackstone_pressure_plate.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/polished_blackstone_pressure_plate.json new file mode 100644 index 000000000..766e8c663 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/polished_blackstone_pressure_plate.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/polished_blackstone_pressure_plate" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/polished_blackstone_slab.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/polished_blackstone_slab.json new file mode 100644 index 000000000..ab598bb6e --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/polished_blackstone_slab.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/polished_blackstone_slab" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/polished_blackstone_stairs.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/polished_blackstone_stairs.json new file mode 100644 index 000000000..a21c5771d --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/polished_blackstone_stairs.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/polished_blackstone_stairs" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/polished_blackstone_wall.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/polished_blackstone_wall.json new file mode 100644 index 000000000..23e2c0d43 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/polished_blackstone_wall.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/polished_blackstone_wall_inventory" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/polished_deepslate.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/polished_deepslate.json new file mode 100644 index 000000000..a2e3fde15 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/polished_deepslate.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/polished_deepslate" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/polished_deepslate_slab.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/polished_deepslate_slab.json new file mode 100644 index 000000000..0bb032412 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/polished_deepslate_slab.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/polished_deepslate_slab" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/polished_deepslate_stairs.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/polished_deepslate_stairs.json new file mode 100644 index 000000000..06f41f9f6 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/polished_deepslate_stairs.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/polished_deepslate_stairs" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/polished_deepslate_wall.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/polished_deepslate_wall.json new file mode 100644 index 000000000..1d05cf88b --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/polished_deepslate_wall.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/polished_deepslate_wall_inventory" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/polished_diorite.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/polished_diorite.json new file mode 100644 index 000000000..aed477503 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/polished_diorite.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/polished_diorite" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/polished_diorite_slab.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/polished_diorite_slab.json new file mode 100644 index 000000000..2fd79e187 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/polished_diorite_slab.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/polished_diorite_slab" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/polished_diorite_stairs.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/polished_diorite_stairs.json new file mode 100644 index 000000000..0ec5d5a68 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/polished_diorite_stairs.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/polished_diorite_stairs" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/polished_granite.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/polished_granite.json new file mode 100644 index 000000000..11ee51c44 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/polished_granite.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/polished_granite" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/polished_granite_slab.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/polished_granite_slab.json new file mode 100644 index 000000000..add758b6b --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/polished_granite_slab.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/polished_granite_slab" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/polished_granite_stairs.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/polished_granite_stairs.json new file mode 100644 index 000000000..083d71c89 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/polished_granite_stairs.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/polished_granite_stairs" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/polished_tuff.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/polished_tuff.json new file mode 100644 index 000000000..a34c7b0a7 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/polished_tuff.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/polished_tuff" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/polished_tuff_slab.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/polished_tuff_slab.json new file mode 100644 index 000000000..948607bf7 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/polished_tuff_slab.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/polished_tuff_slab" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/polished_tuff_stairs.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/polished_tuff_stairs.json new file mode 100644 index 000000000..98b91c002 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/polished_tuff_stairs.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/polished_tuff_stairs" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/polished_tuff_wall.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/polished_tuff_wall.json new file mode 100644 index 000000000..c0a8bed68 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/polished_tuff_wall.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/polished_tuff_wall_inventory" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/popped_chorus_fruit.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/popped_chorus_fruit.json new file mode 100644 index 000000000..b5357bde3 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/popped_chorus_fruit.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/popped_chorus_fruit" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/poppy.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/poppy.json new file mode 100644 index 000000000..089cf3ed3 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/poppy.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:block/poppy" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/porkchop.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/porkchop.json new file mode 100644 index 000000000..7de45731d --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/porkchop.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/porkchop" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/potato.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/potato.json new file mode 100644 index 000000000..3ba923817 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/potato.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/potato" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/potion.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/potion.json new file mode 100644 index 000000000..73c2a578b --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/potion.json @@ -0,0 +1,7 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "item/potion_overlay", + "layer1": "item/potion" + } +} diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/powder_snow_bucket.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/powder_snow_bucket.json new file mode 100644 index 000000000..e99a5f9f0 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/powder_snow_bucket.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/powder_snow_bucket" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/powered_rail.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/powered_rail.json new file mode 100644 index 000000000..ecaf13bf2 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/powered_rail.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:block/powered_rail" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/prismarine.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/prismarine.json new file mode 100644 index 000000000..052a4159f --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/prismarine.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/prismarine" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/prismarine_brick_slab.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/prismarine_brick_slab.json new file mode 100644 index 000000000..905e44298 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/prismarine_brick_slab.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/prismarine_brick_slab" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/prismarine_brick_stairs.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/prismarine_brick_stairs.json new file mode 100644 index 000000000..e5f6c0f4a --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/prismarine_brick_stairs.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/prismarine_brick_stairs" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/prismarine_bricks.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/prismarine_bricks.json new file mode 100644 index 000000000..dfe1634ff --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/prismarine_bricks.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/prismarine_bricks" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/prismarine_crystals.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/prismarine_crystals.json new file mode 100644 index 000000000..6883eebef --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/prismarine_crystals.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/prismarine_crystals" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/prismarine_shard.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/prismarine_shard.json new file mode 100644 index 000000000..7b533d3f9 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/prismarine_shard.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/prismarine_shard" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/prismarine_slab.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/prismarine_slab.json new file mode 100644 index 000000000..9894ef18d --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/prismarine_slab.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/prismarine_slab" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/prismarine_stairs.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/prismarine_stairs.json new file mode 100644 index 000000000..356abf591 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/prismarine_stairs.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/prismarine_stairs" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/prismarine_wall.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/prismarine_wall.json new file mode 100644 index 000000000..16dec992c --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/prismarine_wall.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/prismarine_wall_inventory" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/prize_pottery_sherd.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/prize_pottery_sherd.json new file mode 100644 index 000000000..f73490ab0 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/prize_pottery_sherd.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/prize_pottery_sherd" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/pufferfish.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/pufferfish.json new file mode 100644 index 000000000..11ebd2190 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/pufferfish.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/pufferfish" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/pufferfish_bucket.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/pufferfish_bucket.json new file mode 100644 index 000000000..b5abbd8f1 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/pufferfish_bucket.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/pufferfish_bucket" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/pufferfish_spawn_egg.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/pufferfish_spawn_egg.json new file mode 100644 index 000000000..d1aaa9d6e --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/pufferfish_spawn_egg.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:item/template_spawn_egg" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/pumpkin.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/pumpkin.json new file mode 100644 index 000000000..f725b4769 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/pumpkin.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/pumpkin" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/pumpkin_pie.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/pumpkin_pie.json new file mode 100644 index 000000000..72ba77d56 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/pumpkin_pie.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/pumpkin_pie" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/pumpkin_seeds.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/pumpkin_seeds.json new file mode 100644 index 000000000..bd203f063 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/pumpkin_seeds.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/pumpkin_seeds" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/purple_banner.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/purple_banner.json new file mode 100644 index 000000000..661a106df --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/purple_banner.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:item/template_banner" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/purple_bed.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/purple_bed.json new file mode 100644 index 000000000..606fae8c2 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/purple_bed.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/template_bed", + "textures": { + "particle": "minecraft:block/purple_wool" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/purple_bundle.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/purple_bundle.json new file mode 100644 index 000000000..a6a56bf61 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/purple_bundle.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/purple_bundle" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/purple_bundle_open_back.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/purple_bundle_open_back.json new file mode 100644 index 000000000..17cf859ec --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/purple_bundle_open_back.json @@ -0,0 +1,6 @@ +{ + "parent": "item/bundle", + "textures": { + "layer0": "item/purple_bundle_open_back" + } +} diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/purple_bundle_open_front.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/purple_bundle_open_front.json new file mode 100644 index 000000000..6ac614970 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/purple_bundle_open_front.json @@ -0,0 +1,6 @@ +{ + "parent": "item/bundle", + "textures": { + "layer0": "item/purple_bundle_open_front" + } +} diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/purple_candle.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/purple_candle.json new file mode 100644 index 000000000..9a0d2020a --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/purple_candle.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/purple_candle" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/purple_carpet.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/purple_carpet.json new file mode 100644 index 000000000..94ffd9f44 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/purple_carpet.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/purple_carpet" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/purple_concrete.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/purple_concrete.json new file mode 100644 index 000000000..437f58fcf --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/purple_concrete.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/purple_concrete" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/purple_concrete_powder.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/purple_concrete_powder.json new file mode 100644 index 000000000..77dba4327 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/purple_concrete_powder.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/purple_concrete_powder" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/purple_dye.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/purple_dye.json new file mode 100644 index 000000000..a4082d107 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/purple_dye.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/purple_dye" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/purple_glazed_terracotta.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/purple_glazed_terracotta.json new file mode 100644 index 000000000..be42ab1a7 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/purple_glazed_terracotta.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/purple_glazed_terracotta" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/purple_shulker_box.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/purple_shulker_box.json new file mode 100644 index 000000000..8521d10fe --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/purple_shulker_box.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/template_shulker_box", + "textures": { + "particle": "minecraft:block/purple_shulker_box" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/purple_stained_glass.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/purple_stained_glass.json new file mode 100644 index 000000000..cf2ee6736 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/purple_stained_glass.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/purple_stained_glass" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/purple_stained_glass_pane.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/purple_stained_glass_pane.json new file mode 100644 index 000000000..646a69b90 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/purple_stained_glass_pane.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:block/purple_stained_glass" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/purple_terracotta.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/purple_terracotta.json new file mode 100644 index 000000000..a69670d85 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/purple_terracotta.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/purple_terracotta" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/purple_wool.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/purple_wool.json new file mode 100644 index 000000000..71160d268 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/purple_wool.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/purple_wool" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/purpur_block.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/purpur_block.json new file mode 100644 index 000000000..3e7dfa5a4 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/purpur_block.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/purpur_block" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/purpur_pillar.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/purpur_pillar.json new file mode 100644 index 000000000..2cb1ab30e --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/purpur_pillar.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/purpur_pillar" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/purpur_slab.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/purpur_slab.json new file mode 100644 index 000000000..385a03bef --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/purpur_slab.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/purpur_slab" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/purpur_stairs.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/purpur_stairs.json new file mode 100644 index 000000000..4f8810267 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/purpur_stairs.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/purpur_stairs" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/quartz.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/quartz.json new file mode 100644 index 000000000..6da4a8601 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/quartz.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/quartz" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/quartz_block.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/quartz_block.json new file mode 100644 index 000000000..f0966126c --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/quartz_block.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/quartz_block" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/quartz_bricks.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/quartz_bricks.json new file mode 100644 index 000000000..d2d45cf7c --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/quartz_bricks.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/quartz_bricks" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/quartz_pillar.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/quartz_pillar.json new file mode 100644 index 000000000..52905d111 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/quartz_pillar.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/quartz_pillar" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/quartz_slab.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/quartz_slab.json new file mode 100644 index 000000000..9cd0ebe73 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/quartz_slab.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/quartz_slab" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/quartz_stairs.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/quartz_stairs.json new file mode 100644 index 000000000..4126d6e4d --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/quartz_stairs.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/quartz_stairs" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/rabbit.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/rabbit.json new file mode 100644 index 000000000..0c0294fff --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/rabbit.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/rabbit" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/rabbit_foot.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/rabbit_foot.json new file mode 100644 index 000000000..dc68690a2 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/rabbit_foot.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/rabbit_foot" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/rabbit_hide.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/rabbit_hide.json new file mode 100644 index 000000000..b6327793e --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/rabbit_hide.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/rabbit_hide" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/rabbit_spawn_egg.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/rabbit_spawn_egg.json new file mode 100644 index 000000000..d1aaa9d6e --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/rabbit_spawn_egg.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:item/template_spawn_egg" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/rabbit_stew.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/rabbit_stew.json new file mode 100644 index 000000000..311dfe991 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/rabbit_stew.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/rabbit_stew" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/rail.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/rail.json new file mode 100644 index 000000000..4e07db100 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/rail.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:block/rail" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/raiser_armor_trim_smithing_template.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/raiser_armor_trim_smithing_template.json new file mode 100644 index 000000000..b80f4a01d --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/raiser_armor_trim_smithing_template.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/raiser_armor_trim_smithing_template" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/ravager_spawn_egg.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/ravager_spawn_egg.json new file mode 100644 index 000000000..d1aaa9d6e --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/ravager_spawn_egg.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:item/template_spawn_egg" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/raw_copper.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/raw_copper.json new file mode 100644 index 000000000..94712fdeb --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/raw_copper.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/raw_copper" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/raw_copper_block.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/raw_copper_block.json new file mode 100644 index 000000000..d24df4666 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/raw_copper_block.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/raw_copper_block" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/raw_gold.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/raw_gold.json new file mode 100644 index 000000000..df31aa71a --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/raw_gold.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/raw_gold" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/raw_gold_block.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/raw_gold_block.json new file mode 100644 index 000000000..915e94b9c --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/raw_gold_block.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/raw_gold_block" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/raw_iron.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/raw_iron.json new file mode 100644 index 000000000..57ba62723 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/raw_iron.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/raw_iron" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/raw_iron_block.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/raw_iron_block.json new file mode 100644 index 000000000..b6e6e032f --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/raw_iron_block.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/raw_iron_block" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/recovery_compass.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/recovery_compass.json new file mode 100644 index 000000000..91fb13b8c --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/recovery_compass.json @@ -0,0 +1,41 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "item/recovery_compass_16" + }, + "overrides": [ + { "predicate": { "angle": 0.000000 }, "model": "item/recovery_compass" }, + { "predicate": { "angle": 0.015625 }, "model": "item/recovery_compass_17" }, + { "predicate": { "angle": 0.046875 }, "model": "item/recovery_compass_18" }, + { "predicate": { "angle": 0.078125 }, "model": "item/recovery_compass_19" }, + { "predicate": { "angle": 0.109375 }, "model": "item/recovery_compass_20" }, + { "predicate": { "angle": 0.140625 }, "model": "item/recovery_compass_21" }, + { "predicate": { "angle": 0.171875 }, "model": "item/recovery_compass_22" }, + { "predicate": { "angle": 0.203125 }, "model": "item/recovery_compass_23" }, + { "predicate": { "angle": 0.234375 }, "model": "item/recovery_compass_24" }, + { "predicate": { "angle": 0.265625 }, "model": "item/recovery_compass_25" }, + { "predicate": { "angle": 0.296875 }, "model": "item/recovery_compass_26" }, + { "predicate": { "angle": 0.328125 }, "model": "item/recovery_compass_27" }, + { "predicate": { "angle": 0.359375 }, "model": "item/recovery_compass_28" }, + { "predicate": { "angle": 0.390625 }, "model": "item/recovery_compass_29" }, + { "predicate": { "angle": 0.421875 }, "model": "item/recovery_compass_30" }, + { "predicate": { "angle": 0.453125 }, "model": "item/recovery_compass_31" }, + { "predicate": { "angle": 0.484375 }, "model": "item/recovery_compass_00" }, + { "predicate": { "angle": 0.515625 }, "model": "item/recovery_compass_01" }, + { "predicate": { "angle": 0.546875 }, "model": "item/recovery_compass_02" }, + { "predicate": { "angle": 0.578125 }, "model": "item/recovery_compass_03" }, + { "predicate": { "angle": 0.609375 }, "model": "item/recovery_compass_04" }, + { "predicate": { "angle": 0.640625 }, "model": "item/recovery_compass_05" }, + { "predicate": { "angle": 0.671875 }, "model": "item/recovery_compass_06" }, + { "predicate": { "angle": 0.703125 }, "model": "item/recovery_compass_07" }, + { "predicate": { "angle": 0.734375 }, "model": "item/recovery_compass_08" }, + { "predicate": { "angle": 0.765625 }, "model": "item/recovery_compass_09" }, + { "predicate": { "angle": 0.796875 }, "model": "item/recovery_compass_10" }, + { "predicate": { "angle": 0.828125 }, "model": "item/recovery_compass_11" }, + { "predicate": { "angle": 0.859375 }, "model": "item/recovery_compass_12" }, + { "predicate": { "angle": 0.890625 }, "model": "item/recovery_compass_13" }, + { "predicate": { "angle": 0.921875 }, "model": "item/recovery_compass_14" }, + { "predicate": { "angle": 0.953125 }, "model": "item/recovery_compass_15" }, + { "predicate": { "angle": 0.984375 }, "model": "item/recovery_compass" } + ] +} diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/recovery_compass_00.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/recovery_compass_00.json new file mode 100644 index 000000000..753be1b22 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/recovery_compass_00.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/recovery_compass_00" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/recovery_compass_01.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/recovery_compass_01.json new file mode 100644 index 000000000..3e0630888 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/recovery_compass_01.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/recovery_compass_01" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/recovery_compass_02.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/recovery_compass_02.json new file mode 100644 index 000000000..c6bfef5db --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/recovery_compass_02.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/recovery_compass_02" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/recovery_compass_03.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/recovery_compass_03.json new file mode 100644 index 000000000..874a349e1 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/recovery_compass_03.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/recovery_compass_03" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/recovery_compass_04.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/recovery_compass_04.json new file mode 100644 index 000000000..d1fb39c2f --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/recovery_compass_04.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/recovery_compass_04" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/recovery_compass_05.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/recovery_compass_05.json new file mode 100644 index 000000000..c1958b511 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/recovery_compass_05.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/recovery_compass_05" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/recovery_compass_06.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/recovery_compass_06.json new file mode 100644 index 000000000..7ebdd8c82 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/recovery_compass_06.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/recovery_compass_06" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/recovery_compass_07.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/recovery_compass_07.json new file mode 100644 index 000000000..eabb1f035 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/recovery_compass_07.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/recovery_compass_07" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/recovery_compass_08.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/recovery_compass_08.json new file mode 100644 index 000000000..d59f4c131 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/recovery_compass_08.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/recovery_compass_08" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/recovery_compass_09.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/recovery_compass_09.json new file mode 100644 index 000000000..cb2ddbc9f --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/recovery_compass_09.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/recovery_compass_09" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/recovery_compass_10.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/recovery_compass_10.json new file mode 100644 index 000000000..30618a33f --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/recovery_compass_10.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/recovery_compass_10" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/recovery_compass_11.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/recovery_compass_11.json new file mode 100644 index 000000000..6d29eae1f --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/recovery_compass_11.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/recovery_compass_11" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/recovery_compass_12.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/recovery_compass_12.json new file mode 100644 index 000000000..c455ce86f --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/recovery_compass_12.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/recovery_compass_12" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/recovery_compass_13.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/recovery_compass_13.json new file mode 100644 index 000000000..9982cc53d --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/recovery_compass_13.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/recovery_compass_13" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/recovery_compass_14.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/recovery_compass_14.json new file mode 100644 index 000000000..0ba7e45b2 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/recovery_compass_14.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/recovery_compass_14" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/recovery_compass_15.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/recovery_compass_15.json new file mode 100644 index 000000000..adb5c1298 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/recovery_compass_15.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/recovery_compass_15" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/recovery_compass_17.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/recovery_compass_17.json new file mode 100644 index 000000000..5a906f0b0 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/recovery_compass_17.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/recovery_compass_17" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/recovery_compass_18.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/recovery_compass_18.json new file mode 100644 index 000000000..d2665866a --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/recovery_compass_18.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/recovery_compass_18" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/recovery_compass_19.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/recovery_compass_19.json new file mode 100644 index 000000000..fe36dcac0 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/recovery_compass_19.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/recovery_compass_19" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/recovery_compass_20.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/recovery_compass_20.json new file mode 100644 index 000000000..1632015ef --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/recovery_compass_20.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/recovery_compass_20" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/recovery_compass_21.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/recovery_compass_21.json new file mode 100644 index 000000000..1f52a2cfb --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/recovery_compass_21.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/recovery_compass_21" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/recovery_compass_22.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/recovery_compass_22.json new file mode 100644 index 000000000..bae9ef118 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/recovery_compass_22.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/recovery_compass_22" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/recovery_compass_23.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/recovery_compass_23.json new file mode 100644 index 000000000..f46180c5c --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/recovery_compass_23.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/recovery_compass_23" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/recovery_compass_24.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/recovery_compass_24.json new file mode 100644 index 000000000..c7acb6b87 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/recovery_compass_24.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/recovery_compass_24" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/recovery_compass_25.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/recovery_compass_25.json new file mode 100644 index 000000000..234b7ab93 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/recovery_compass_25.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/recovery_compass_25" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/recovery_compass_26.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/recovery_compass_26.json new file mode 100644 index 000000000..0f988f3b6 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/recovery_compass_26.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/recovery_compass_26" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/recovery_compass_27.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/recovery_compass_27.json new file mode 100644 index 000000000..1587617bc --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/recovery_compass_27.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/recovery_compass_27" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/recovery_compass_28.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/recovery_compass_28.json new file mode 100644 index 000000000..4153fb073 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/recovery_compass_28.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/recovery_compass_28" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/recovery_compass_29.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/recovery_compass_29.json new file mode 100644 index 000000000..47e3fff10 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/recovery_compass_29.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/recovery_compass_29" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/recovery_compass_30.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/recovery_compass_30.json new file mode 100644 index 000000000..6a39baad3 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/recovery_compass_30.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/recovery_compass_30" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/recovery_compass_31.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/recovery_compass_31.json new file mode 100644 index 000000000..e1bb4c130 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/recovery_compass_31.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/recovery_compass_31" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/red_banner.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/red_banner.json new file mode 100644 index 000000000..661a106df --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/red_banner.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:item/template_banner" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/red_bed.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/red_bed.json new file mode 100644 index 000000000..7a15f5512 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/red_bed.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/template_bed", + "textures": { + "particle": "minecraft:block/red_wool" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/red_bundle.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/red_bundle.json new file mode 100644 index 000000000..2b450a41e --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/red_bundle.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/red_bundle" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/red_bundle_open_back.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/red_bundle_open_back.json new file mode 100644 index 000000000..1ff1d08e0 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/red_bundle_open_back.json @@ -0,0 +1,6 @@ +{ + "parent": "item/bundle", + "textures": { + "layer0": "item/red_bundle_open_back" + } +} diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/red_bundle_open_front.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/red_bundle_open_front.json new file mode 100644 index 000000000..b8fe9c321 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/red_bundle_open_front.json @@ -0,0 +1,6 @@ +{ + "parent": "item/bundle", + "textures": { + "layer0": "item/red_bundle_open_front" + } +} diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/red_candle.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/red_candle.json new file mode 100644 index 000000000..54fbba028 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/red_candle.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/red_candle" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/red_carpet.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/red_carpet.json new file mode 100644 index 000000000..18e4d52eb --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/red_carpet.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/red_carpet" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/red_concrete.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/red_concrete.json new file mode 100644 index 000000000..34a0630b7 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/red_concrete.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/red_concrete" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/red_concrete_powder.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/red_concrete_powder.json new file mode 100644 index 000000000..36e0ede7a --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/red_concrete_powder.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/red_concrete_powder" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/red_dye.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/red_dye.json new file mode 100644 index 000000000..77765d363 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/red_dye.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/red_dye" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/red_glazed_terracotta.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/red_glazed_terracotta.json new file mode 100644 index 000000000..3870bc2ca --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/red_glazed_terracotta.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/red_glazed_terracotta" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/red_mushroom.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/red_mushroom.json new file mode 100644 index 000000000..3be0c03ff --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/red_mushroom.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:block/red_mushroom" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/red_mushroom_block.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/red_mushroom_block.json new file mode 100644 index 000000000..5ed44fb45 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/red_mushroom_block.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/red_mushroom_block_inventory" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/red_nether_brick_slab.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/red_nether_brick_slab.json new file mode 100644 index 000000000..73ba1684a --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/red_nether_brick_slab.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/red_nether_brick_slab" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/red_nether_brick_stairs.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/red_nether_brick_stairs.json new file mode 100644 index 000000000..98d716be0 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/red_nether_brick_stairs.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/red_nether_brick_stairs" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/red_nether_brick_wall.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/red_nether_brick_wall.json new file mode 100644 index 000000000..48f50a647 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/red_nether_brick_wall.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/red_nether_brick_wall_inventory" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/red_nether_bricks.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/red_nether_bricks.json new file mode 100644 index 000000000..51d3d11c2 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/red_nether_bricks.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/red_nether_bricks" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/red_sand.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/red_sand.json new file mode 100644 index 000000000..f3459a820 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/red_sand.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/red_sand" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/red_sandstone.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/red_sandstone.json new file mode 100644 index 000000000..305751fa5 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/red_sandstone.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/red_sandstone" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/red_sandstone_slab.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/red_sandstone_slab.json new file mode 100644 index 000000000..c74735659 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/red_sandstone_slab.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/red_sandstone_slab" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/red_sandstone_stairs.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/red_sandstone_stairs.json new file mode 100644 index 000000000..6c0f1c52e --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/red_sandstone_stairs.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/red_sandstone_stairs" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/red_sandstone_wall.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/red_sandstone_wall.json new file mode 100644 index 000000000..7dc10d93d --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/red_sandstone_wall.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/red_sandstone_wall_inventory" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/red_shulker_box.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/red_shulker_box.json new file mode 100644 index 000000000..618ccff66 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/red_shulker_box.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/template_shulker_box", + "textures": { + "particle": "minecraft:block/red_shulker_box" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/red_stained_glass.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/red_stained_glass.json new file mode 100644 index 000000000..235d35da2 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/red_stained_glass.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/red_stained_glass" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/red_stained_glass_pane.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/red_stained_glass_pane.json new file mode 100644 index 000000000..699b006f1 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/red_stained_glass_pane.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:block/red_stained_glass" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/red_terracotta.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/red_terracotta.json new file mode 100644 index 000000000..2ded3a9d5 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/red_terracotta.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/red_terracotta" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/red_tulip.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/red_tulip.json new file mode 100644 index 000000000..406b1ecef --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/red_tulip.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:block/red_tulip" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/red_wool.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/red_wool.json new file mode 100644 index 000000000..b0dd8dd66 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/red_wool.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/red_wool" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/redstone.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/redstone.json new file mode 100644 index 000000000..d273009e4 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/redstone.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/redstone" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/redstone_block.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/redstone_block.json new file mode 100644 index 000000000..71d9d176c --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/redstone_block.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/redstone_block" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/redstone_lamp.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/redstone_lamp.json new file mode 100644 index 000000000..47f36c435 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/redstone_lamp.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/redstone_lamp" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/redstone_ore.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/redstone_ore.json new file mode 100644 index 000000000..503fed06e --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/redstone_ore.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/redstone_ore" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/redstone_torch.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/redstone_torch.json new file mode 100644 index 000000000..ba2060bba --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/redstone_torch.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:block/redstone_torch" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/reinforced_deepslate.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/reinforced_deepslate.json new file mode 100644 index 000000000..624fd3c45 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/reinforced_deepslate.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/reinforced_deepslate" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/repeater.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/repeater.json new file mode 100644 index 000000000..7a8b05fb4 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/repeater.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/repeater" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/repeating_command_block.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/repeating_command_block.json new file mode 100644 index 000000000..75492a4b9 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/repeating_command_block.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/repeating_command_block" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/respawn_anchor.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/respawn_anchor.json new file mode 100644 index 000000000..7fa102a3d --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/respawn_anchor.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/respawn_anchor_0" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/rib_armor_trim_smithing_template.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/rib_armor_trim_smithing_template.json new file mode 100644 index 000000000..dce771717 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/rib_armor_trim_smithing_template.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/rib_armor_trim_smithing_template" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/rooted_dirt.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/rooted_dirt.json new file mode 100644 index 000000000..3d6a9cda4 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/rooted_dirt.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/rooted_dirt" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/rose_bush.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/rose_bush.json new file mode 100644 index 000000000..4a71ea357 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/rose_bush.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:block/rose_bush_top" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/rotten_flesh.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/rotten_flesh.json new file mode 100644 index 000000000..6d7899529 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/rotten_flesh.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/rotten_flesh" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/saddle.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/saddle.json new file mode 100644 index 000000000..91895cb40 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/saddle.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/saddle" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/salmon.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/salmon.json new file mode 100644 index 000000000..dcac1db78 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/salmon.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/salmon" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/salmon_bucket.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/salmon_bucket.json new file mode 100644 index 000000000..15217f222 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/salmon_bucket.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/salmon_bucket" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/salmon_spawn_egg.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/salmon_spawn_egg.json new file mode 100644 index 000000000..d1aaa9d6e --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/salmon_spawn_egg.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:item/template_spawn_egg" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/sand.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/sand.json new file mode 100644 index 000000000..96c1d00d9 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/sand.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/sand" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/sandstone.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/sandstone.json new file mode 100644 index 000000000..474b0ddba --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/sandstone.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/sandstone" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/sandstone_slab.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/sandstone_slab.json new file mode 100644 index 000000000..7b8fc6bdf --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/sandstone_slab.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/sandstone_slab" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/sandstone_stairs.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/sandstone_stairs.json new file mode 100644 index 000000000..989e41fff --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/sandstone_stairs.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/sandstone_stairs" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/sandstone_wall.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/sandstone_wall.json new file mode 100644 index 000000000..b4f2149ba --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/sandstone_wall.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/sandstone_wall_inventory" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/scaffolding.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/scaffolding.json new file mode 100644 index 000000000..1946d80f5 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/scaffolding.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/scaffolding_stable" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/scrape_pottery_sherd.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/scrape_pottery_sherd.json new file mode 100644 index 000000000..52717375a --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/scrape_pottery_sherd.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/scrape_pottery_sherd" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/sculk.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/sculk.json new file mode 100644 index 000000000..12d25d5fa --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/sculk.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/sculk" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/sculk_catalyst.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/sculk_catalyst.json new file mode 100644 index 000000000..89e0b5f7b --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/sculk_catalyst.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/sculk_catalyst" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/sculk_sensor.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/sculk_sensor.json new file mode 100644 index 000000000..a2b8a77da --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/sculk_sensor.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/sculk_sensor_inactive" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/sculk_shrieker.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/sculk_shrieker.json new file mode 100644 index 000000000..a6c19ae0b --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/sculk_shrieker.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/sculk_shrieker" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/sculk_vein.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/sculk_vein.json new file mode 100644 index 000000000..78df0e28f --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/sculk_vein.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:block/sculk_vein" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/sea_lantern.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/sea_lantern.json new file mode 100644 index 000000000..72561fc08 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/sea_lantern.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/sea_lantern" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/sea_pickle.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/sea_pickle.json new file mode 100644 index 000000000..c7f2f9688 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/sea_pickle.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/sea_pickle" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/seagrass.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/seagrass.json new file mode 100644 index 000000000..91c88ccb5 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/seagrass.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/seagrass" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/sentry_armor_trim_smithing_template.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/sentry_armor_trim_smithing_template.json new file mode 100644 index 000000000..37c62bc90 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/sentry_armor_trim_smithing_template.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/sentry_armor_trim_smithing_template" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/shaper_armor_trim_smithing_template.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/shaper_armor_trim_smithing_template.json new file mode 100644 index 000000000..0d10c46b6 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/shaper_armor_trim_smithing_template.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/shaper_armor_trim_smithing_template" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/sheaf_pottery_sherd.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/sheaf_pottery_sherd.json new file mode 100644 index 000000000..f5f85477d --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/sheaf_pottery_sherd.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/sheaf_pottery_sherd" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/shears.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/shears.json new file mode 100644 index 000000000..bc9bf0148 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/shears.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/shears" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/sheep_spawn_egg.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/sheep_spawn_egg.json new file mode 100644 index 000000000..d1aaa9d6e --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/sheep_spawn_egg.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:item/template_spawn_egg" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/shelter_pottery_sherd.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/shelter_pottery_sherd.json new file mode 100644 index 000000000..11fc43b3c --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/shelter_pottery_sherd.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/shelter_pottery_sherd" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/shield.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/shield.json new file mode 100644 index 000000000..dbfc19385 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/shield.json @@ -0,0 +1,52 @@ +{ + "parent": "builtin/entity", + "gui_light": "front", + "textures": { + "particle": "block/dark_oak_planks" + }, + "display": { + "thirdperson_righthand": { + "rotation": [ 0, 90, 0 ], + "translation": [ 10, 6, -4 ], + "scale": [ 1, 1, 1 ] + }, + "thirdperson_lefthand": { + "rotation": [ 0, 90, 0 ], + "translation": [ 10, 6, 12 ], + "scale": [ 1, 1, 1 ] + }, + "firstperson_righthand": { + "rotation": [ 0, 180, 5 ], + "translation": [ -10, 2, -10 ], + "scale": [ 1.25, 1.25, 1.25 ] + }, + "firstperson_lefthand": { + "rotation": [ 0, 180, 5 ], + "translation": [ 10, 0, -10 ], + "scale": [ 1.25, 1.25, 1.25 ] + }, + "gui": { + "rotation": [ 15, -25, -5 ], + "translation": [ 2, 3, 0 ], + "scale": [ 0.65, 0.65, 0.65 ] + }, + "fixed": { + "rotation": [ 0, 180, 0 ], + "translation": [ -4.5, 4.5, -5], + "scale":[ 0.55, 0.55, 0.55] + }, + "ground": { + "rotation": [ 0, 0, 0 ], + "translation": [ 2, 4, 2], + "scale":[ 0.25, 0.25, 0.25] + } + }, + "overrides": [ + { + "predicate": { + "blocking": 1 + }, + "model": "item/shield_blocking" + } + ] +} diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/shield_blocking.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/shield_blocking.json new file mode 100644 index 000000000..c68d1cf30 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/shield_blocking.json @@ -0,0 +1,34 @@ +{ + "parent": "builtin/entity", + "gui_light": "front", + "textures": { + "particle": "block/dark_oak_planks" + }, + "display": { + "thirdperson_righthand": { + "rotation": [ 45, 155, 0 ], + "translation": [ -3.49, 11, -2 ], + "scale": [ 1, 1, 1 ] + }, + "thirdperson_lefthand": { + "rotation": [ 45, 155, 0 ], + "translation": [ 11.51, 7, 2.5 ], + "scale": [ 1, 1, 1 ] + }, + "firstperson_righthand": { + "rotation": [ 0, 180, -5 ], + "translation": [ -15, 5, -11 ], + "scale": [ 1.25, 1.25, 1.25 ] + }, + "firstperson_lefthand": { + "rotation": [ 0, 180, -5 ], + "translation": [ 5, 5, -11 ], + "scale": [ 1.25, 1.25, 1.25 ] + }, + "gui": { + "rotation": [ 15, -25, -5 ], + "translation": [ 2, 3, 0 ], + "scale": [ 0.65, 0.65, 0.65 ] + } + } +} diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/short_grass.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/short_grass.json new file mode 100644 index 000000000..50fc8466b --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/short_grass.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:block/short_grass" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/shroomlight.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/shroomlight.json new file mode 100644 index 000000000..5d8aef635 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/shroomlight.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/shroomlight" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/shulker_box.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/shulker_box.json new file mode 100644 index 000000000..f547516b2 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/shulker_box.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/template_shulker_box", + "textures": { + "particle": "minecraft:block/shulker_box" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/shulker_shell.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/shulker_shell.json new file mode 100644 index 000000000..6aae0f45e --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/shulker_shell.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/shulker_shell" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/shulker_spawn_egg.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/shulker_spawn_egg.json new file mode 100644 index 000000000..d1aaa9d6e --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/shulker_spawn_egg.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:item/template_spawn_egg" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/silence_armor_trim_smithing_template.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/silence_armor_trim_smithing_template.json new file mode 100644 index 000000000..5254eced6 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/silence_armor_trim_smithing_template.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/silence_armor_trim_smithing_template" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/silverfish_spawn_egg.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/silverfish_spawn_egg.json new file mode 100644 index 000000000..d1aaa9d6e --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/silverfish_spawn_egg.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:item/template_spawn_egg" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/skeleton_horse_spawn_egg.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/skeleton_horse_spawn_egg.json new file mode 100644 index 000000000..d1aaa9d6e --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/skeleton_horse_spawn_egg.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:item/template_spawn_egg" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/skeleton_skull.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/skeleton_skull.json new file mode 100644 index 000000000..364b6e65f --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/skeleton_skull.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:item/template_skull" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/skeleton_spawn_egg.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/skeleton_spawn_egg.json new file mode 100644 index 000000000..d1aaa9d6e --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/skeleton_spawn_egg.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:item/template_spawn_egg" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/skull_banner_pattern.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/skull_banner_pattern.json new file mode 100644 index 000000000..a39281f76 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/skull_banner_pattern.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/skull_banner_pattern" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/skull_pottery_sherd.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/skull_pottery_sherd.json new file mode 100644 index 000000000..b7765121c --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/skull_pottery_sherd.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/skull_pottery_sherd" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/slime_ball.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/slime_ball.json new file mode 100644 index 000000000..812f0860a --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/slime_ball.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/slime_ball" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/slime_block.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/slime_block.json new file mode 100644 index 000000000..848fbdafc --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/slime_block.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/slime_block" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/slime_spawn_egg.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/slime_spawn_egg.json new file mode 100644 index 000000000..d1aaa9d6e --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/slime_spawn_egg.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:item/template_spawn_egg" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/small_amethyst_bud.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/small_amethyst_bud.json new file mode 100644 index 000000000..cfa83d8e1 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/small_amethyst_bud.json @@ -0,0 +1,16 @@ +{ + "parent": "item/amethyst_bud", + "textures": { + "layer0": "minecraft:block/small_amethyst_bud" + }, + "display": { + "firstperson_righthand": { + "rotation": [ 0, -90, 25 ], + "translation": [ 0, 6, 0 ], + "scale": [ 0.68, 0.68, 0.68 ] + }, + "fixed": { + "translation": [ 0, 7, 0 ] + } + } +} diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/small_dripleaf.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/small_dripleaf.json new file mode 100644 index 000000000..488841ff7 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/small_dripleaf.json @@ -0,0 +1,15 @@ +{ + "parent": "minecraft:block/small_dripleaf_top", + "display": { + "thirdperson_righthand": { + "rotation": [ 0, 0, 0 ], + "translation": [ 0, 4, 1 ], + "scale": [ 0.55, 0.55, 0.55 ] + }, + "firstperson_righthand": { + "rotation": [ 0, 45, 0 ], + "translation": [ 0, 3.2, 0 ], + "scale": [ 0.40, 0.40, 0.40 ] + } + } +} diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/smithing_table.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/smithing_table.json new file mode 100644 index 000000000..3028d70f1 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/smithing_table.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/smithing_table" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/smoker.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/smoker.json new file mode 100644 index 000000000..7d2740184 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/smoker.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/smoker" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/smooth_basalt.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/smooth_basalt.json new file mode 100644 index 000000000..327e00547 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/smooth_basalt.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/smooth_basalt" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/smooth_quartz.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/smooth_quartz.json new file mode 100644 index 000000000..b2047c832 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/smooth_quartz.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/smooth_quartz" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/smooth_quartz_slab.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/smooth_quartz_slab.json new file mode 100644 index 000000000..55c15fa9e --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/smooth_quartz_slab.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/smooth_quartz_slab" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/smooth_quartz_stairs.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/smooth_quartz_stairs.json new file mode 100644 index 000000000..bddcd1cc2 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/smooth_quartz_stairs.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/smooth_quartz_stairs" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/smooth_red_sandstone.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/smooth_red_sandstone.json new file mode 100644 index 000000000..3e8943e41 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/smooth_red_sandstone.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/smooth_red_sandstone" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/smooth_red_sandstone_slab.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/smooth_red_sandstone_slab.json new file mode 100644 index 000000000..cae67922c --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/smooth_red_sandstone_slab.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/smooth_red_sandstone_slab" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/smooth_red_sandstone_stairs.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/smooth_red_sandstone_stairs.json new file mode 100644 index 000000000..1ba4dd5e7 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/smooth_red_sandstone_stairs.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/smooth_red_sandstone_stairs" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/smooth_sandstone.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/smooth_sandstone.json new file mode 100644 index 000000000..d702d2871 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/smooth_sandstone.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/smooth_sandstone" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/smooth_sandstone_slab.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/smooth_sandstone_slab.json new file mode 100644 index 000000000..934c7adac --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/smooth_sandstone_slab.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/smooth_sandstone_slab" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/smooth_sandstone_stairs.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/smooth_sandstone_stairs.json new file mode 100644 index 000000000..74ab5a1a7 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/smooth_sandstone_stairs.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/smooth_sandstone_stairs" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/smooth_stone.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/smooth_stone.json new file mode 100644 index 000000000..393605bd2 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/smooth_stone.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/smooth_stone" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/smooth_stone_slab.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/smooth_stone_slab.json new file mode 100644 index 000000000..e33dcb4c9 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/smooth_stone_slab.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/smooth_stone_slab" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/sniffer_egg.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/sniffer_egg.json new file mode 100644 index 000000000..0f35a4d91 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/sniffer_egg.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/sniffer_egg" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/sniffer_spawn_egg.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/sniffer_spawn_egg.json new file mode 100644 index 000000000..d1aaa9d6e --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/sniffer_spawn_egg.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:item/template_spawn_egg" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/snort_pottery_sherd.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/snort_pottery_sherd.json new file mode 100644 index 000000000..d3a8ebc30 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/snort_pottery_sherd.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/snort_pottery_sherd" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/snout_armor_trim_smithing_template.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/snout_armor_trim_smithing_template.json new file mode 100644 index 000000000..a6c6c622e --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/snout_armor_trim_smithing_template.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/snout_armor_trim_smithing_template" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/snow.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/snow.json new file mode 100644 index 000000000..a4d1c9894 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/snow.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/snow_height2" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/snow_block.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/snow_block.json new file mode 100644 index 000000000..1564e7759 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/snow_block.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/snow_block" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/snow_golem_spawn_egg.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/snow_golem_spawn_egg.json new file mode 100644 index 000000000..d1aaa9d6e --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/snow_golem_spawn_egg.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:item/template_spawn_egg" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/snowball.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/snowball.json new file mode 100644 index 000000000..7dec4deea --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/snowball.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/snowball" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/soul_campfire.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/soul_campfire.json new file mode 100644 index 000000000..ef63b765a --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/soul_campfire.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/soul_campfire" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/soul_lantern.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/soul_lantern.json new file mode 100644 index 000000000..53e659088 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/soul_lantern.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/soul_lantern" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/soul_sand.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/soul_sand.json new file mode 100644 index 000000000..50df79cfb --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/soul_sand.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/soul_sand" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/soul_soil.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/soul_soil.json new file mode 100644 index 000000000..c8c62d360 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/soul_soil.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/soul_soil" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/soul_torch.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/soul_torch.json new file mode 100644 index 000000000..96dbfdfb9 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/soul_torch.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:block/soul_torch" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/spawner.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/spawner.json new file mode 100644 index 000000000..f54a94f6b --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/spawner.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/spawner" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/spectral_arrow.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/spectral_arrow.json new file mode 100644 index 000000000..33a79f8ef --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/spectral_arrow.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/spectral_arrow" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/spider_eye.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/spider_eye.json new file mode 100644 index 000000000..fd7547f4a --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/spider_eye.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/spider_eye" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/spider_spawn_egg.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/spider_spawn_egg.json new file mode 100644 index 000000000..d1aaa9d6e --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/spider_spawn_egg.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:item/template_spawn_egg" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/spire_armor_trim_smithing_template.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/spire_armor_trim_smithing_template.json new file mode 100644 index 000000000..fe7a6df08 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/spire_armor_trim_smithing_template.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/spire_armor_trim_smithing_template" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/splash_potion.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/splash_potion.json new file mode 100644 index 000000000..d9aaa6b84 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/splash_potion.json @@ -0,0 +1,7 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "item/potion_overlay", + "layer1": "item/splash_potion" + } +} diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/sponge.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/sponge.json new file mode 100644 index 000000000..4e456fd9d --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/sponge.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/sponge" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/spore_blossom.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/spore_blossom.json new file mode 100644 index 000000000..3eb054c87 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/spore_blossom.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/spore_blossom" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/spruce_boat.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/spruce_boat.json new file mode 100644 index 000000000..a425c2c8e --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/spruce_boat.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/spruce_boat" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/spruce_button.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/spruce_button.json new file mode 100644 index 000000000..91d8bc033 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/spruce_button.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/spruce_button_inventory" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/spruce_chest_boat.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/spruce_chest_boat.json new file mode 100644 index 000000000..36d7a7f59 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/spruce_chest_boat.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/spruce_chest_boat" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/spruce_door.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/spruce_door.json new file mode 100644 index 000000000..c1a3bf29c --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/spruce_door.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/spruce_door" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/spruce_fence.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/spruce_fence.json new file mode 100644 index 000000000..e2c378405 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/spruce_fence.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/spruce_fence_inventory" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/spruce_fence_gate.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/spruce_fence_gate.json new file mode 100644 index 000000000..6f4473e4a --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/spruce_fence_gate.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/spruce_fence_gate" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/spruce_hanging_sign.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/spruce_hanging_sign.json new file mode 100644 index 000000000..90c40e299 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/spruce_hanging_sign.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/spruce_hanging_sign" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/spruce_leaves.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/spruce_leaves.json new file mode 100644 index 000000000..6c64eda57 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/spruce_leaves.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/spruce_leaves" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/spruce_log.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/spruce_log.json new file mode 100644 index 000000000..84bd7dc31 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/spruce_log.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/spruce_log" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/spruce_planks.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/spruce_planks.json new file mode 100644 index 000000000..d87b17208 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/spruce_planks.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/spruce_planks" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/spruce_pressure_plate.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/spruce_pressure_plate.json new file mode 100644 index 000000000..b0de07876 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/spruce_pressure_plate.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/spruce_pressure_plate" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/spruce_sapling.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/spruce_sapling.json new file mode 100644 index 000000000..1c9752de5 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/spruce_sapling.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:block/spruce_sapling" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/spruce_sign.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/spruce_sign.json new file mode 100644 index 000000000..f5c26ebf9 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/spruce_sign.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/spruce_sign" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/spruce_slab.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/spruce_slab.json new file mode 100644 index 000000000..d5fa4c0f3 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/spruce_slab.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/spruce_slab" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/spruce_stairs.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/spruce_stairs.json new file mode 100644 index 000000000..7957a5a1d --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/spruce_stairs.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/spruce_stairs" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/spruce_trapdoor.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/spruce_trapdoor.json new file mode 100644 index 000000000..0eb91e4ac --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/spruce_trapdoor.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/spruce_trapdoor_bottom" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/spruce_wood.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/spruce_wood.json new file mode 100644 index 000000000..593e4ec82 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/spruce_wood.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/spruce_wood" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/spyglass.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/spyglass.json new file mode 100644 index 000000000..c5d7e691c --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/spyglass.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/spyglass" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/spyglass_in_hand.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/spyglass_in_hand.json new file mode 100644 index 000000000..073bfd290 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/spyglass_in_hand.json @@ -0,0 +1,52 @@ +{ + "textures": { + "spyglass": "item/spyglass_model" + }, + "elements": [ + { + "from": [7, 8.5, 7], + "to": [9, 13.5, 9], + "faces": { + "north": {"uv": [0, 2, 2, 7], "texture": "#spyglass"}, + "east": {"uv": [0, 2, 2, 7], "texture": "#spyglass"}, + "south": {"uv": [0, 2, 2, 7], "texture": "#spyglass"}, + "west": {"uv": [0, 2, 2, 7], "texture": "#spyglass"}, + "up": {"uv": [0, 0, 2, 2], "texture": "#spyglass"} + } + }, + { + "from": [6.9, 2.4, 6.9], + "to": [9.1, 8.6, 9.1], + "faces": { + "north": {"uv": [0, 7, 2, 13], "texture": "#spyglass"}, + "east": {"uv": [0, 7, 2, 13], "texture": "#spyglass"}, + "south": {"uv": [0, 7, 2, 13], "texture": "#spyglass"}, + "west": {"uv": [0, 7, 2, 13], "texture": "#spyglass"}, + "up": {"uv": [0, 5, 2, 7], "texture": "#spyglass"}, + "down": {"uv": [0, 13, 2, 15], "texture": "#spyglass"} + } + } + ], + "gui_light": "front", + "display": { + "thirdperson_righthand": { + "translation": [0, -2, 0] + }, + "ground": { + "rotation": [90, 0, 0] + }, + "gui": { + "rotation": [-67.5, 0, 45], + "scale": [1.5, 1.5, 1.5] + }, + "head": { + "rotation": [90, 0, 0], + "translation": [0, 0, -16], + "scale": [1.6, 1.6, 1.6] + }, + "fixed": { + "translation": [0, 0, -1.5], + "scale": [1.5, 1.5, 1.5] + } + } +} diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/squid_spawn_egg.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/squid_spawn_egg.json new file mode 100644 index 000000000..d1aaa9d6e --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/squid_spawn_egg.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:item/template_spawn_egg" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/stick.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/stick.json new file mode 100644 index 000000000..f0dc3b971 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/stick.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/handheld", + "textures": { + "layer0": "minecraft:item/stick" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/sticky_piston.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/sticky_piston.json new file mode 100644 index 000000000..69bfdc943 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/sticky_piston.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/sticky_piston_inventory" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/stone.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/stone.json new file mode 100644 index 000000000..37f27f10b --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/stone.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/stone" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/stone_axe.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/stone_axe.json new file mode 100644 index 000000000..1e3bc7e89 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/stone_axe.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/handheld", + "textures": { + "layer0": "minecraft:item/stone_axe" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/stone_brick_slab.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/stone_brick_slab.json new file mode 100644 index 000000000..9dd874ac4 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/stone_brick_slab.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/stone_brick_slab" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/stone_brick_stairs.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/stone_brick_stairs.json new file mode 100644 index 000000000..d62eb4b36 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/stone_brick_stairs.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/stone_brick_stairs" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/stone_brick_wall.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/stone_brick_wall.json new file mode 100644 index 000000000..929da51fe --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/stone_brick_wall.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/stone_brick_wall_inventory" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/stone_bricks.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/stone_bricks.json new file mode 100644 index 000000000..51de871c0 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/stone_bricks.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/stone_bricks" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/stone_button.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/stone_button.json new file mode 100644 index 000000000..8802ddfbf --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/stone_button.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/stone_button_inventory" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/stone_hoe.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/stone_hoe.json new file mode 100644 index 000000000..13f40c63b --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/stone_hoe.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/handheld", + "textures": { + "layer0": "minecraft:item/stone_hoe" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/stone_pickaxe.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/stone_pickaxe.json new file mode 100644 index 000000000..dec09cbe7 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/stone_pickaxe.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/handheld", + "textures": { + "layer0": "minecraft:item/stone_pickaxe" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/stone_pressure_plate.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/stone_pressure_plate.json new file mode 100644 index 000000000..bcb76d79b --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/stone_pressure_plate.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/stone_pressure_plate" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/stone_shovel.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/stone_shovel.json new file mode 100644 index 000000000..727a68b95 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/stone_shovel.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/handheld", + "textures": { + "layer0": "minecraft:item/stone_shovel" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/stone_slab.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/stone_slab.json new file mode 100644 index 000000000..63de5381d --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/stone_slab.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/stone_slab" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/stone_stairs.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/stone_stairs.json new file mode 100644 index 000000000..7b9a82a95 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/stone_stairs.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/stone_stairs" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/stone_sword.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/stone_sword.json new file mode 100644 index 000000000..ba4a89f15 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/stone_sword.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/handheld", + "textures": { + "layer0": "minecraft:item/stone_sword" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/stonecutter.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/stonecutter.json new file mode 100644 index 000000000..54ffedeb2 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/stonecutter.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/stonecutter" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/stray_spawn_egg.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/stray_spawn_egg.json new file mode 100644 index 000000000..d1aaa9d6e --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/stray_spawn_egg.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:item/template_spawn_egg" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/strider_spawn_egg.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/strider_spawn_egg.json new file mode 100644 index 000000000..d1aaa9d6e --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/strider_spawn_egg.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:item/template_spawn_egg" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/string.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/string.json new file mode 100644 index 000000000..ca6251bf8 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/string.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/string" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/stripped_acacia_log.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/stripped_acacia_log.json new file mode 100644 index 000000000..d9a3ce1f7 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/stripped_acacia_log.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/stripped_acacia_log" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/stripped_acacia_wood.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/stripped_acacia_wood.json new file mode 100644 index 000000000..4c6537235 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/stripped_acacia_wood.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/stripped_acacia_wood" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/stripped_bamboo_block.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/stripped_bamboo_block.json new file mode 100644 index 000000000..38c93f323 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/stripped_bamboo_block.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/stripped_bamboo_block" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/stripped_birch_log.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/stripped_birch_log.json new file mode 100644 index 000000000..d984bf7da --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/stripped_birch_log.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/stripped_birch_log" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/stripped_birch_wood.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/stripped_birch_wood.json new file mode 100644 index 000000000..dc0b6698a --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/stripped_birch_wood.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/stripped_birch_wood" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/stripped_cherry_log.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/stripped_cherry_log.json new file mode 100644 index 000000000..6fb61fed7 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/stripped_cherry_log.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/stripped_cherry_log" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/stripped_cherry_wood.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/stripped_cherry_wood.json new file mode 100644 index 000000000..73a11cdc1 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/stripped_cherry_wood.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/stripped_cherry_wood" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/stripped_crimson_hyphae.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/stripped_crimson_hyphae.json new file mode 100644 index 000000000..254d55150 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/stripped_crimson_hyphae.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/stripped_crimson_hyphae" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/stripped_crimson_stem.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/stripped_crimson_stem.json new file mode 100644 index 000000000..701f56705 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/stripped_crimson_stem.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/stripped_crimson_stem" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/stripped_dark_oak_log.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/stripped_dark_oak_log.json new file mode 100644 index 000000000..d193f5f09 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/stripped_dark_oak_log.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/stripped_dark_oak_log" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/stripped_dark_oak_wood.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/stripped_dark_oak_wood.json new file mode 100644 index 000000000..683446da5 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/stripped_dark_oak_wood.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/stripped_dark_oak_wood" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/stripped_jungle_log.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/stripped_jungle_log.json new file mode 100644 index 000000000..1c6cf473b --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/stripped_jungle_log.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/stripped_jungle_log" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/stripped_jungle_wood.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/stripped_jungle_wood.json new file mode 100644 index 000000000..ed78aec7a --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/stripped_jungle_wood.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/stripped_jungle_wood" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/stripped_mangrove_log.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/stripped_mangrove_log.json new file mode 100644 index 000000000..4155be189 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/stripped_mangrove_log.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/stripped_mangrove_log" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/stripped_mangrove_wood.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/stripped_mangrove_wood.json new file mode 100644 index 000000000..159d89d92 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/stripped_mangrove_wood.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/stripped_mangrove_wood" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/stripped_oak_log.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/stripped_oak_log.json new file mode 100644 index 000000000..bb3cafbe7 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/stripped_oak_log.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/stripped_oak_log" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/stripped_oak_wood.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/stripped_oak_wood.json new file mode 100644 index 000000000..9ba3fb2ab --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/stripped_oak_wood.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/stripped_oak_wood" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/stripped_pale_oak_log.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/stripped_pale_oak_log.json new file mode 100644 index 000000000..3021c2852 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/stripped_pale_oak_log.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/stripped_pale_oak_log" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/stripped_pale_oak_wood.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/stripped_pale_oak_wood.json new file mode 100644 index 000000000..c55c0a6a2 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/stripped_pale_oak_wood.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/stripped_pale_oak_wood" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/stripped_spruce_log.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/stripped_spruce_log.json new file mode 100644 index 000000000..e110cdf53 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/stripped_spruce_log.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/stripped_spruce_log" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/stripped_spruce_wood.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/stripped_spruce_wood.json new file mode 100644 index 000000000..658f768b5 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/stripped_spruce_wood.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/stripped_spruce_wood" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/stripped_warped_hyphae.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/stripped_warped_hyphae.json new file mode 100644 index 000000000..0ebe2320b --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/stripped_warped_hyphae.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/stripped_warped_hyphae" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/stripped_warped_stem.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/stripped_warped_stem.json new file mode 100644 index 000000000..6147725dc --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/stripped_warped_stem.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/stripped_warped_stem" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/structure_block.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/structure_block.json new file mode 100644 index 000000000..1325f7708 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/structure_block.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/structure_block" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/structure_void.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/structure_void.json new file mode 100644 index 000000000..65fb4840e --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/structure_void.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/structure_void" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/sugar.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/sugar.json new file mode 100644 index 000000000..74e73ebd9 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/sugar.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/sugar" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/sugar_cane.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/sugar_cane.json new file mode 100644 index 000000000..ee6d1fc12 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/sugar_cane.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/sugar_cane" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/sunflower.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/sunflower.json new file mode 100644 index 000000000..694e244c8 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/sunflower.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:block/sunflower_front" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/suspicious_gravel.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/suspicious_gravel.json new file mode 100644 index 000000000..dd5bed5f7 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/suspicious_gravel.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/suspicious_gravel_0" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/suspicious_sand.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/suspicious_sand.json new file mode 100644 index 000000000..c8a0dcb06 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/suspicious_sand.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/suspicious_sand_0" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/suspicious_stew.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/suspicious_stew.json new file mode 100644 index 000000000..15e645a3d --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/suspicious_stew.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/suspicious_stew" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/sweet_berries.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/sweet_berries.json new file mode 100644 index 000000000..e16589413 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/sweet_berries.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/sweet_berries" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/tadpole_bucket.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/tadpole_bucket.json new file mode 100644 index 000000000..44e1336b0 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/tadpole_bucket.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/tadpole_bucket" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/tadpole_spawn_egg.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/tadpole_spawn_egg.json new file mode 100644 index 000000000..d1aaa9d6e --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/tadpole_spawn_egg.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:item/template_spawn_egg" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/tall_grass.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/tall_grass.json new file mode 100644 index 000000000..df809ea7b --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/tall_grass.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:block/tall_grass_top" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/target.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/target.json new file mode 100644 index 000000000..0e4e696b0 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/target.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/target" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/template_banner.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/template_banner.json new file mode 100644 index 000000000..d59875551 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/template_banner.json @@ -0,0 +1,39 @@ +{ + "parent": "builtin/entity", + "gui_light": "front", + "textures": { + "particle": "block/oak_planks" + }, + "display": { + "thirdperson_righthand": { + "rotation": [ 0, 90, 0 ], + "translation": [ 0, 2, 0.5], + "scale":[ 0.375, 0.375, 0.375] + }, + "firstperson_righthand": { + "rotation": [ 0, 90, 0 ], + "translation": [ 0, 0, 0], + "scale":[ 0.375, 0.375, 0.375] + }, + "gui": { + "rotation": [ 30, 20, 0 ], + "translation": [ 0, -3.25, 0], + "scale":[ 0.5325, 0.5325, 0.5325] + }, + "ground": { + "rotation": [ 0, 0, 0 ], + "translation": [ 0, 1, 0], + "scale":[ 0.25, 0.25, 0.25] + }, + "head": { + "rotation": [ 0, 180, 0 ], + "translation": [ 0, 16, 7], + "scale":[ 1.5, 1.5, 1.5 ] + }, + "fixed": { + "rotation": [ 0, 180, 0 ], + "translation": [ 0, 0, 0], + "scale":[ 0.5, 0.5, 0.5] + } + } +} diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/template_bed.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/template_bed.json new file mode 100644 index 000000000..2f5d69799 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/template_bed.json @@ -0,0 +1,35 @@ +{ + "parent": "builtin/entity", + "display": { + "thirdperson_righthand": { + "rotation": [ 30, 160, 0 ], + "translation": [ 0, 3, -2], + "scale":[ 0.23, 0.23, 0.23] + }, + "firstperson_righthand": { + "rotation": [ 30, 160, 0 ], + "translation": [ 0, 3, 0], + "scale":[ 0.375, 0.375, 0.375] + }, + "gui": { + "rotation": [ 30, 160, 0 ], + "translation": [ 2, 3, 0], + "scale":[ 0.5325, 0.5325, 0.5325] + }, + "ground": { + "rotation": [ 0, 0, 0 ], + "translation": [ 0, 1, 2], + "scale":[ 0.25, 0.25, 0.25] + }, + "head": { + "rotation": [ 0, 180, 0 ], + "translation": [ 0, 10, -8], + "scale":[ 1,1,1 ] + }, + "fixed": { + "rotation": [ 270, 0, 0 ], + "translation": [ 0, 4, -2], + "scale":[ 0.5, 0.5, 0.5] + } + } +} diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/template_music_disc.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/template_music_disc.json new file mode 100644 index 000000000..41268452c --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/template_music_disc.json @@ -0,0 +1,10 @@ +{ + "parent": "item/generated", + "gui_light": "front", + "display": { + "fixed": { + "rotation": [ 0, 180, 0 ], + "translation": [ -0.5, 0, 0 ] + } + } +} diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/template_shulker_box.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/template_shulker_box.json new file mode 100644 index 000000000..7bfe2e696 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/template_shulker_box.json @@ -0,0 +1,35 @@ +{ + "parent": "builtin/entity", + "display": { + "gui": { + "rotation": [ 30, 45, 0 ], + "translation": [ 0, 0, 0], + "scale":[ 0.625, 0.625, 0.625 ] + }, + "ground": { + "rotation": [ 0, 0, 0 ], + "translation": [ 0, 3, 0], + "scale":[ 0.25, 0.25, 0.25 ] + }, + "head": { + "rotation": [ 0, 180, 0 ], + "translation": [ 0, 0, 0], + "scale":[ 1, 1, 1] + }, + "fixed": { + "rotation": [ 0, 180, 0 ], + "translation": [ 0, 0, 0], + "scale":[ 0.5, 0.5, 0.5 ] + }, + "thirdperson_righthand": { + "rotation": [ 75, 315, 0 ], + "translation": [ 0, 2.5, 0], + "scale": [ 0.375, 0.375, 0.375 ] + }, + "firstperson_righthand": { + "rotation": [ 0, 315, 0 ], + "translation": [ 0, 0, 0], + "scale": [ 0.4, 0.4, 0.4 ] + } + } +} diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/template_skull.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/template_skull.json new file mode 100644 index 000000000..232416fc4 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/template_skull.json @@ -0,0 +1,28 @@ +{ + "parent": "builtin/entity", + "textures": { + "particle": "block/soul_sand" + }, + "display": { + "gui": { + "rotation": [ 30, 45, 0 ], + "translation": [ 0, 3, 0 ], + "scale": [ 1, 1, 1 ] + }, + "fixed": { + "rotation": [ 0, 180, 0 ], + "translation": [ 0, 4, 0], + "scale":[ 1, 1, 1 ] + }, + "ground": { + "rotation": [ 0, 0, 0 ], + "translation": [ 0, 3, 0 ], + "scale": [ 0.5, 0.5, 0.5 ] + }, + "thirdperson_righthand": { + "rotation": [ 45, 45, 0 ], + "translation": [ 0, 3, 0 ], + "scale": [ 0.5, 0.5, 0.5 ] + } + } +} diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/template_spawn_egg.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/template_spawn_egg.json new file mode 100644 index 000000000..4ae4b4c28 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/template_spawn_egg.json @@ -0,0 +1,7 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "item/spawn_egg", + "layer1": "item/spawn_egg_overlay" + } +} diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/terracotta.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/terracotta.json new file mode 100644 index 000000000..c443c8902 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/terracotta.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/terracotta" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/tide_armor_trim_smithing_template.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/tide_armor_trim_smithing_template.json new file mode 100644 index 000000000..f3c544053 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/tide_armor_trim_smithing_template.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/tide_armor_trim_smithing_template" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/tinted_glass.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/tinted_glass.json new file mode 100644 index 000000000..18f610b87 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/tinted_glass.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/tinted_glass" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/tipped_arrow.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/tipped_arrow.json new file mode 100644 index 000000000..578defec7 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/tipped_arrow.json @@ -0,0 +1,7 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "item/tipped_arrow_head", + "layer1": "item/tipped_arrow_base" + } +} diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/tnt.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/tnt.json new file mode 100644 index 000000000..688d3f954 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/tnt.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/tnt" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/tnt_minecart.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/tnt_minecart.json new file mode 100644 index 000000000..c3c326048 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/tnt_minecart.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/tnt_minecart" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/tooting_goat_horn.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/tooting_goat_horn.json new file mode 100644 index 000000000..c412562eb --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/tooting_goat_horn.json @@ -0,0 +1,26 @@ +{ + "parent": "item/generated", + "textures": { + "layer0": "item/goat_horn" + }, + "display": { + "thirdperson_righthand": { + "rotation": [ 0, -125, 0 ], + "translation": [ -1, 2, 2 ], + "scale": [ 0.5, 0.5, 0.5 ] + }, + "thirdperson_lefthand": { + "rotation": [ 0, 55, 0 ], + "translation": [ -1, 2, 2 ], + "scale": [ 0.5, 0.5, 0.5 ] + }, + "firstperson_righthand": { + "rotation": [ 0, -55, -5 ], + "translation": [ -1, -2.5, -7.5 ] + }, + "firstperson_lefthand": { + "rotation": [ 0, 115, 5 ], + "translation": [ 0 , -2.5, -7.5 ] + } + } +} diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/torch.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/torch.json new file mode 100644 index 000000000..a734b43bc --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/torch.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:block/torch" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/torchflower.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/torchflower.json new file mode 100644 index 000000000..bac7a8253 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/torchflower.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:block/torchflower" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/torchflower_seeds.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/torchflower_seeds.json new file mode 100644 index 000000000..6637aa8cb --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/torchflower_seeds.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/torchflower_seeds" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/totem_of_undying.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/totem_of_undying.json new file mode 100644 index 000000000..abefc0572 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/totem_of_undying.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/totem_of_undying" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/trader_llama_spawn_egg.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/trader_llama_spawn_egg.json new file mode 100644 index 000000000..d1aaa9d6e --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/trader_llama_spawn_egg.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:item/template_spawn_egg" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/trapped_chest.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/trapped_chest.json new file mode 100644 index 000000000..c74357148 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/trapped_chest.json @@ -0,0 +1,3 @@ +{ + "parent": "item/chest" +} diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/trial_key.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/trial_key.json new file mode 100644 index 000000000..0ff9e82f0 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/trial_key.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/trial_key" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/trial_spawner.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/trial_spawner.json new file mode 100644 index 000000000..22e70fe93 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/trial_spawner.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/trial_spawner" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/trident.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/trident.json new file mode 100644 index 000000000..f129b55e9 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/trident.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/trident" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/trident_in_hand.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/trident_in_hand.json new file mode 100644 index 000000000..6685dcca5 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/trident_in_hand.json @@ -0,0 +1,52 @@ +{ + "parent": "builtin/entity", + "gui_light": "front", + "textures": { + "particle": "item/trident" + }, + "display": { + "thirdperson_righthand": { + "rotation": [ 0, 60, 0 ], + "translation": [ 11, 17, -2 ], + "scale": [ 1, 1, 1 ] + }, + "thirdperson_lefthand": { + "rotation": [ 0, 60, 0 ], + "translation": [ 3, 17, 12 ], + "scale": [ 1, 1, 1 ] + }, + "firstperson_righthand": { + "rotation": [ 0, -90, 25 ], + "translation": [ -3, 17, 1], + "scale": [ 1, 1, 1 ] + }, + "firstperson_lefthand": { + "rotation": [ 0, 90, -25 ], + "translation": [ 13, 17, 1], + "scale": [ 1, 1, 1 ] + }, + "gui": { + "rotation": [ 15, -25, -5 ], + "translation": [ 2, 3, 0 ], + "scale": [ 0.65, 0.65, 0.65 ] + }, + "fixed": { + "rotation": [ 0, 180, 0 ], + "translation": [ -2, 4, -5], + "scale":[ 0.5, 0.5, 0.5] + }, + "ground": { + "rotation": [ 0, 0, 0 ], + "translation": [ 4, 4, 2], + "scale":[ 0.25, 0.25, 0.25] + } + }, + "overrides": [ + { + "predicate": { + "throwing": 1 + }, + "model": "item/trident_throwing" + } + ] +} diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/trident_throwing.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/trident_throwing.json new file mode 100644 index 000000000..fb8e96a3a --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/trident_throwing.json @@ -0,0 +1,44 @@ +{ + "parent": "builtin/entity", + "gui_light": "front", + "textures": { + "particle": "item/trident" + }, + "display": { + "thirdperson_righthand": { + "rotation": [ 0, 90, 180 ], + "translation": [ 8, -17, 9 ], + "scale": [ 1, 1, 1 ] + }, + "thirdperson_lefthand": { + "rotation": [ 0, 90, 180 ], + "translation": [ 8, -17, -7 ], + "scale": [ 1, 1, 1 ] + }, + "firstperson_righthand": { + "rotation": [ 0, -90, 25 ], + "translation": [ -3, 17, 1], + "scale": [ 1, 1, 1 ] + }, + "firstperson_lefthand": { + "rotation": [ 0, 90, -25 ], + "translation": [ 13, 17, 1], + "scale": [ 1, 1, 1 ] + }, + "gui": { + "rotation": [ 15, -25, -5 ], + "translation": [ 2, 3, 0 ], + "scale": [ 0.65, 0.65, 0.65 ] + }, + "fixed": { + "rotation": [ 0, 180, 0 ], + "translation": [ -2, 4, -5], + "scale":[ 0.5, 0.5, 0.5] + }, + "ground": { + "rotation": [ 0, 0, 0 ], + "translation": [ 4, 4, 2], + "scale":[ 0.25, 0.25, 0.25] + } + } +} diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/tripwire_hook.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/tripwire_hook.json new file mode 100644 index 000000000..b4a83abd0 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/tripwire_hook.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:block/tripwire_hook" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/tropical_fish.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/tropical_fish.json new file mode 100644 index 000000000..d8e9ebc63 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/tropical_fish.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/tropical_fish" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/tropical_fish_bucket.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/tropical_fish_bucket.json new file mode 100644 index 000000000..2ea21229b --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/tropical_fish_bucket.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/tropical_fish_bucket" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/tropical_fish_spawn_egg.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/tropical_fish_spawn_egg.json new file mode 100644 index 000000000..d1aaa9d6e --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/tropical_fish_spawn_egg.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:item/template_spawn_egg" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/tube_coral.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/tube_coral.json new file mode 100644 index 000000000..dc0358e15 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/tube_coral.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:block/tube_coral" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/tube_coral_block.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/tube_coral_block.json new file mode 100644 index 000000000..14e2d5761 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/tube_coral_block.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/tube_coral_block" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/tube_coral_fan.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/tube_coral_fan.json new file mode 100644 index 000000000..76c880f73 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/tube_coral_fan.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:block/tube_coral_fan" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/tuff.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/tuff.json new file mode 100644 index 000000000..187958d90 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/tuff.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/tuff" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/tuff_brick_slab.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/tuff_brick_slab.json new file mode 100644 index 000000000..b793fc27c --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/tuff_brick_slab.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/tuff_brick_slab" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/tuff_brick_stairs.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/tuff_brick_stairs.json new file mode 100644 index 000000000..d5156694f --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/tuff_brick_stairs.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/tuff_brick_stairs" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/tuff_brick_wall.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/tuff_brick_wall.json new file mode 100644 index 000000000..bfb8d8b5a --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/tuff_brick_wall.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/tuff_brick_wall_inventory" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/tuff_bricks.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/tuff_bricks.json new file mode 100644 index 000000000..d13c6e5a8 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/tuff_bricks.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/tuff_bricks" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/tuff_slab.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/tuff_slab.json new file mode 100644 index 000000000..5f0374307 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/tuff_slab.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/tuff_slab" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/tuff_stairs.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/tuff_stairs.json new file mode 100644 index 000000000..eacc1e5e9 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/tuff_stairs.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/tuff_stairs" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/tuff_wall.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/tuff_wall.json new file mode 100644 index 000000000..91a87f521 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/tuff_wall.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/tuff_wall_inventory" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/turtle_egg.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/turtle_egg.json new file mode 100644 index 000000000..bbc29d4a5 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/turtle_egg.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/turtle_egg" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/turtle_helmet.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/turtle_helmet.json new file mode 100644 index 000000000..e61aa3c8d --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/turtle_helmet.json @@ -0,0 +1,68 @@ +{ + "parent": "minecraft:item/generated", + "overrides": [ + { + "model": "minecraft:item/turtle_helmet_quartz_trim", + "predicate": { + "trim_type": 0.1 + } + }, + { + "model": "minecraft:item/turtle_helmet_iron_trim", + "predicate": { + "trim_type": 0.2 + } + }, + { + "model": "minecraft:item/turtle_helmet_netherite_trim", + "predicate": { + "trim_type": 0.3 + } + }, + { + "model": "minecraft:item/turtle_helmet_redstone_trim", + "predicate": { + "trim_type": 0.4 + } + }, + { + "model": "minecraft:item/turtle_helmet_copper_trim", + "predicate": { + "trim_type": 0.5 + } + }, + { + "model": "minecraft:item/turtle_helmet_gold_trim", + "predicate": { + "trim_type": 0.6 + } + }, + { + "model": "minecraft:item/turtle_helmet_emerald_trim", + "predicate": { + "trim_type": 0.7 + } + }, + { + "model": "minecraft:item/turtle_helmet_diamond_trim", + "predicate": { + "trim_type": 0.8 + } + }, + { + "model": "minecraft:item/turtle_helmet_lapis_trim", + "predicate": { + "trim_type": 0.9 + } + }, + { + "model": "minecraft:item/turtle_helmet_amethyst_trim", + "predicate": { + "trim_type": 1.0 + } + } + ], + "textures": { + "layer0": "minecraft:item/turtle_helmet" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/turtle_helmet_amethyst_trim.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/turtle_helmet_amethyst_trim.json new file mode 100644 index 000000000..b957586d4 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/turtle_helmet_amethyst_trim.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/turtle_helmet", + "layer1": "minecraft:trims/items/helmet_trim_amethyst" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/turtle_helmet_copper_trim.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/turtle_helmet_copper_trim.json new file mode 100644 index 000000000..dcbbfcfe5 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/turtle_helmet_copper_trim.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/turtle_helmet", + "layer1": "minecraft:trims/items/helmet_trim_copper" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/turtle_helmet_diamond_trim.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/turtle_helmet_diamond_trim.json new file mode 100644 index 000000000..759556164 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/turtle_helmet_diamond_trim.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/turtle_helmet", + "layer1": "minecraft:trims/items/helmet_trim_diamond" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/turtle_helmet_emerald_trim.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/turtle_helmet_emerald_trim.json new file mode 100644 index 000000000..15cca0893 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/turtle_helmet_emerald_trim.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/turtle_helmet", + "layer1": "minecraft:trims/items/helmet_trim_emerald" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/turtle_helmet_gold_trim.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/turtle_helmet_gold_trim.json new file mode 100644 index 000000000..d7b0c824b --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/turtle_helmet_gold_trim.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/turtle_helmet", + "layer1": "minecraft:trims/items/helmet_trim_gold" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/turtle_helmet_iron_trim.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/turtle_helmet_iron_trim.json new file mode 100644 index 000000000..2f4cbc6fc --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/turtle_helmet_iron_trim.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/turtle_helmet", + "layer1": "minecraft:trims/items/helmet_trim_iron" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/turtle_helmet_lapis_trim.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/turtle_helmet_lapis_trim.json new file mode 100644 index 000000000..95d3bc725 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/turtle_helmet_lapis_trim.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/turtle_helmet", + "layer1": "minecraft:trims/items/helmet_trim_lapis" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/turtle_helmet_netherite_trim.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/turtle_helmet_netherite_trim.json new file mode 100644 index 000000000..7c16fa614 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/turtle_helmet_netherite_trim.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/turtle_helmet", + "layer1": "minecraft:trims/items/helmet_trim_netherite" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/turtle_helmet_quartz_trim.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/turtle_helmet_quartz_trim.json new file mode 100644 index 000000000..6bcfbb694 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/turtle_helmet_quartz_trim.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/turtle_helmet", + "layer1": "minecraft:trims/items/helmet_trim_quartz" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/turtle_helmet_redstone_trim.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/turtle_helmet_redstone_trim.json new file mode 100644 index 000000000..4c694cbb5 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/turtle_helmet_redstone_trim.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/turtle_helmet", + "layer1": "minecraft:trims/items/helmet_trim_redstone" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/turtle_scute.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/turtle_scute.json new file mode 100644 index 000000000..64af43c32 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/turtle_scute.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/turtle_scute" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/turtle_spawn_egg.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/turtle_spawn_egg.json new file mode 100644 index 000000000..d1aaa9d6e --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/turtle_spawn_egg.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:item/template_spawn_egg" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/twisting_vines.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/twisting_vines.json new file mode 100644 index 000000000..fe4d57c09 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/twisting_vines.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:block/twisting_vines_plant" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/vault.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/vault.json new file mode 100644 index 000000000..848fa3097 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/vault.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/vault" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/verdant_froglight.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/verdant_froglight.json new file mode 100644 index 000000000..6b9f7d214 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/verdant_froglight.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/verdant_froglight" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/vex_armor_trim_smithing_template.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/vex_armor_trim_smithing_template.json new file mode 100644 index 000000000..93ec389ee --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/vex_armor_trim_smithing_template.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/vex_armor_trim_smithing_template" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/vex_spawn_egg.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/vex_spawn_egg.json new file mode 100644 index 000000000..d1aaa9d6e --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/vex_spawn_egg.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:item/template_spawn_egg" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/villager_spawn_egg.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/villager_spawn_egg.json new file mode 100644 index 000000000..d1aaa9d6e --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/villager_spawn_egg.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:item/template_spawn_egg" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/vindicator_spawn_egg.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/vindicator_spawn_egg.json new file mode 100644 index 000000000..d1aaa9d6e --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/vindicator_spawn_egg.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:item/template_spawn_egg" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/vine.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/vine.json new file mode 100644 index 000000000..c1eaec402 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/vine.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:block/vine" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/wandering_trader_spawn_egg.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/wandering_trader_spawn_egg.json new file mode 100644 index 000000000..d1aaa9d6e --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/wandering_trader_spawn_egg.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:item/template_spawn_egg" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/ward_armor_trim_smithing_template.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/ward_armor_trim_smithing_template.json new file mode 100644 index 000000000..b8be109ee --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/ward_armor_trim_smithing_template.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/ward_armor_trim_smithing_template" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/warden_spawn_egg.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/warden_spawn_egg.json new file mode 100644 index 000000000..d1aaa9d6e --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/warden_spawn_egg.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:item/template_spawn_egg" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/warped_button.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/warped_button.json new file mode 100644 index 000000000..182a0ac61 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/warped_button.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/warped_button_inventory" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/warped_door.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/warped_door.json new file mode 100644 index 000000000..5bc37290d --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/warped_door.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/warped_door" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/warped_fence.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/warped_fence.json new file mode 100644 index 000000000..d45dd46dc --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/warped_fence.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/warped_fence_inventory" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/warped_fence_gate.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/warped_fence_gate.json new file mode 100644 index 000000000..1f521bc73 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/warped_fence_gate.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/warped_fence_gate" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/warped_fungus.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/warped_fungus.json new file mode 100644 index 000000000..eecb3bfdc --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/warped_fungus.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:block/warped_fungus" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/warped_fungus_on_a_stick.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/warped_fungus_on_a_stick.json new file mode 100644 index 000000000..562fe25cd --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/warped_fungus_on_a_stick.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/handheld_rod", + "textures": { + "layer0": "minecraft:item/warped_fungus_on_a_stick" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/warped_hanging_sign.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/warped_hanging_sign.json new file mode 100644 index 000000000..fe9180a77 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/warped_hanging_sign.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/warped_hanging_sign" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/warped_hyphae.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/warped_hyphae.json new file mode 100644 index 000000000..6cc4c5a4d --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/warped_hyphae.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/warped_hyphae" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/warped_nylium.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/warped_nylium.json new file mode 100644 index 000000000..20309492a --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/warped_nylium.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/warped_nylium" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/warped_planks.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/warped_planks.json new file mode 100644 index 000000000..92cfb4ca6 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/warped_planks.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/warped_planks" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/warped_pressure_plate.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/warped_pressure_plate.json new file mode 100644 index 000000000..58d9b4438 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/warped_pressure_plate.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/warped_pressure_plate" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/warped_roots.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/warped_roots.json new file mode 100644 index 000000000..d44aa5776 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/warped_roots.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:block/warped_roots" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/warped_sign.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/warped_sign.json new file mode 100644 index 000000000..82db6f279 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/warped_sign.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/warped_sign" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/warped_slab.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/warped_slab.json new file mode 100644 index 000000000..ce7153c40 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/warped_slab.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/warped_slab" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/warped_stairs.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/warped_stairs.json new file mode 100644 index 000000000..08260fdd6 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/warped_stairs.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/warped_stairs" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/warped_stem.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/warped_stem.json new file mode 100644 index 000000000..0bab3df69 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/warped_stem.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/warped_stem" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/warped_trapdoor.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/warped_trapdoor.json new file mode 100644 index 000000000..c716c4684 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/warped_trapdoor.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/warped_trapdoor_bottom" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/warped_wart_block.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/warped_wart_block.json new file mode 100644 index 000000000..754439abc --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/warped_wart_block.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/warped_wart_block" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/water_bucket.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/water_bucket.json new file mode 100644 index 000000000..af17e57d7 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/water_bucket.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/water_bucket" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/waxed_chiseled_copper.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/waxed_chiseled_copper.json new file mode 100644 index 000000000..b88e810ba --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/waxed_chiseled_copper.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/chiseled_copper" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/waxed_copper_block.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/waxed_copper_block.json new file mode 100644 index 000000000..7bc2c0184 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/waxed_copper_block.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/copper_block" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/waxed_copper_bulb.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/waxed_copper_bulb.json new file mode 100644 index 000000000..08e49a530 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/waxed_copper_bulb.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:item/copper_bulb" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/waxed_copper_door.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/waxed_copper_door.json new file mode 100644 index 000000000..4466e7a34 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/waxed_copper_door.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:item/copper_door" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/waxed_copper_grate.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/waxed_copper_grate.json new file mode 100644 index 000000000..f4cff5139 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/waxed_copper_grate.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/copper_grate" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/waxed_copper_trapdoor.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/waxed_copper_trapdoor.json new file mode 100644 index 000000000..87df71b2e --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/waxed_copper_trapdoor.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:item/copper_trapdoor" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/waxed_cut_copper.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/waxed_cut_copper.json new file mode 100644 index 000000000..ce1ec597d --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/waxed_cut_copper.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/cut_copper" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/waxed_cut_copper_slab.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/waxed_cut_copper_slab.json new file mode 100644 index 000000000..b6b05101c --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/waxed_cut_copper_slab.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/cut_copper_slab" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/waxed_cut_copper_stairs.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/waxed_cut_copper_stairs.json new file mode 100644 index 000000000..7376f52cc --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/waxed_cut_copper_stairs.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/cut_copper_stairs" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/waxed_exposed_chiseled_copper.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/waxed_exposed_chiseled_copper.json new file mode 100644 index 000000000..11278b6ad --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/waxed_exposed_chiseled_copper.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/exposed_chiseled_copper" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/waxed_exposed_copper.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/waxed_exposed_copper.json new file mode 100644 index 000000000..5881fd7b3 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/waxed_exposed_copper.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/exposed_copper" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/waxed_exposed_copper_bulb.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/waxed_exposed_copper_bulb.json new file mode 100644 index 000000000..efd8e9d99 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/waxed_exposed_copper_bulb.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:item/exposed_copper_bulb" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/waxed_exposed_copper_door.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/waxed_exposed_copper_door.json new file mode 100644 index 000000000..7e3a70453 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/waxed_exposed_copper_door.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:item/exposed_copper_door" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/waxed_exposed_copper_grate.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/waxed_exposed_copper_grate.json new file mode 100644 index 000000000..b7a3c78e2 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/waxed_exposed_copper_grate.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/exposed_copper_grate" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/waxed_exposed_copper_trapdoor.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/waxed_exposed_copper_trapdoor.json new file mode 100644 index 000000000..e3f5e9add --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/waxed_exposed_copper_trapdoor.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:item/exposed_copper_trapdoor" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/waxed_exposed_cut_copper.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/waxed_exposed_cut_copper.json new file mode 100644 index 000000000..b5c7d8f01 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/waxed_exposed_cut_copper.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/exposed_cut_copper" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/waxed_exposed_cut_copper_slab.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/waxed_exposed_cut_copper_slab.json new file mode 100644 index 000000000..29ce47239 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/waxed_exposed_cut_copper_slab.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/exposed_cut_copper_slab" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/waxed_exposed_cut_copper_stairs.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/waxed_exposed_cut_copper_stairs.json new file mode 100644 index 000000000..24bdd2851 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/waxed_exposed_cut_copper_stairs.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/exposed_cut_copper_stairs" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/waxed_oxidized_chiseled_copper.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/waxed_oxidized_chiseled_copper.json new file mode 100644 index 000000000..720204270 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/waxed_oxidized_chiseled_copper.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/oxidized_chiseled_copper" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/waxed_oxidized_copper.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/waxed_oxidized_copper.json new file mode 100644 index 000000000..63a0dabe3 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/waxed_oxidized_copper.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/oxidized_copper" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/waxed_oxidized_copper_bulb.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/waxed_oxidized_copper_bulb.json new file mode 100644 index 000000000..59b8fb7b2 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/waxed_oxidized_copper_bulb.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:item/oxidized_copper_bulb" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/waxed_oxidized_copper_door.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/waxed_oxidized_copper_door.json new file mode 100644 index 000000000..313143e13 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/waxed_oxidized_copper_door.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:item/oxidized_copper_door" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/waxed_oxidized_copper_grate.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/waxed_oxidized_copper_grate.json new file mode 100644 index 000000000..e2521c38e --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/waxed_oxidized_copper_grate.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/oxidized_copper_grate" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/waxed_oxidized_copper_trapdoor.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/waxed_oxidized_copper_trapdoor.json new file mode 100644 index 000000000..9d3a8bee8 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/waxed_oxidized_copper_trapdoor.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:item/oxidized_copper_trapdoor" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/waxed_oxidized_cut_copper.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/waxed_oxidized_cut_copper.json new file mode 100644 index 000000000..36dfa030a --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/waxed_oxidized_cut_copper.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/oxidized_cut_copper" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/waxed_oxidized_cut_copper_slab.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/waxed_oxidized_cut_copper_slab.json new file mode 100644 index 000000000..a3d022426 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/waxed_oxidized_cut_copper_slab.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/oxidized_cut_copper_slab" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/waxed_oxidized_cut_copper_stairs.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/waxed_oxidized_cut_copper_stairs.json new file mode 100644 index 000000000..fd8af1aab --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/waxed_oxidized_cut_copper_stairs.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/oxidized_cut_copper_stairs" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/waxed_weathered_chiseled_copper.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/waxed_weathered_chiseled_copper.json new file mode 100644 index 000000000..c27086d6e --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/waxed_weathered_chiseled_copper.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/weathered_chiseled_copper" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/waxed_weathered_copper.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/waxed_weathered_copper.json new file mode 100644 index 000000000..743af49ae --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/waxed_weathered_copper.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/weathered_copper" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/waxed_weathered_copper_bulb.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/waxed_weathered_copper_bulb.json new file mode 100644 index 000000000..6e29d2919 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/waxed_weathered_copper_bulb.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:item/weathered_copper_bulb" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/waxed_weathered_copper_door.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/waxed_weathered_copper_door.json new file mode 100644 index 000000000..409c8efa3 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/waxed_weathered_copper_door.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:item/weathered_copper_door" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/waxed_weathered_copper_grate.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/waxed_weathered_copper_grate.json new file mode 100644 index 000000000..17430d640 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/waxed_weathered_copper_grate.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/weathered_copper_grate" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/waxed_weathered_copper_trapdoor.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/waxed_weathered_copper_trapdoor.json new file mode 100644 index 000000000..7c3335de5 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/waxed_weathered_copper_trapdoor.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:item/weathered_copper_trapdoor" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/waxed_weathered_cut_copper.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/waxed_weathered_cut_copper.json new file mode 100644 index 000000000..e49a231b6 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/waxed_weathered_cut_copper.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/weathered_cut_copper" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/waxed_weathered_cut_copper_slab.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/waxed_weathered_cut_copper_slab.json new file mode 100644 index 000000000..acda09e0a --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/waxed_weathered_cut_copper_slab.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/weathered_cut_copper_slab" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/waxed_weathered_cut_copper_stairs.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/waxed_weathered_cut_copper_stairs.json new file mode 100644 index 000000000..01ce59724 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/waxed_weathered_cut_copper_stairs.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/weathered_cut_copper_stairs" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/wayfinder_armor_trim_smithing_template.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/wayfinder_armor_trim_smithing_template.json new file mode 100644 index 000000000..0d31b00cc --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/wayfinder_armor_trim_smithing_template.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/wayfinder_armor_trim_smithing_template" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/weathered_chiseled_copper.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/weathered_chiseled_copper.json new file mode 100644 index 000000000..c27086d6e --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/weathered_chiseled_copper.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/weathered_chiseled_copper" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/weathered_copper.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/weathered_copper.json new file mode 100644 index 000000000..743af49ae --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/weathered_copper.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/weathered_copper" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/weathered_copper_bulb.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/weathered_copper_bulb.json new file mode 100644 index 000000000..276559f80 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/weathered_copper_bulb.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/weathered_copper_bulb" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/weathered_copper_door.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/weathered_copper_door.json new file mode 100644 index 000000000..91c28c7bc --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/weathered_copper_door.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/weathered_copper_door" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/weathered_copper_grate.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/weathered_copper_grate.json new file mode 100644 index 000000000..17430d640 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/weathered_copper_grate.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/weathered_copper_grate" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/weathered_copper_trapdoor.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/weathered_copper_trapdoor.json new file mode 100644 index 000000000..7b067302c --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/weathered_copper_trapdoor.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/weathered_copper_trapdoor_bottom" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/weathered_cut_copper.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/weathered_cut_copper.json new file mode 100644 index 000000000..e49a231b6 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/weathered_cut_copper.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/weathered_cut_copper" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/weathered_cut_copper_slab.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/weathered_cut_copper_slab.json new file mode 100644 index 000000000..acda09e0a --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/weathered_cut_copper_slab.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/weathered_cut_copper_slab" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/weathered_cut_copper_stairs.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/weathered_cut_copper_stairs.json new file mode 100644 index 000000000..01ce59724 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/weathered_cut_copper_stairs.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/weathered_cut_copper_stairs" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/weeping_vines.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/weeping_vines.json new file mode 100644 index 000000000..834b71c51 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/weeping_vines.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:block/weeping_vines_plant" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/wet_sponge.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/wet_sponge.json new file mode 100644 index 000000000..d662daaeb --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/wet_sponge.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/wet_sponge" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/wheat.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/wheat.json new file mode 100644 index 000000000..f77a8c8f3 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/wheat.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/wheat" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/wheat_seeds.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/wheat_seeds.json new file mode 100644 index 000000000..8fd9068f7 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/wheat_seeds.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/wheat_seeds" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/white_banner.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/white_banner.json new file mode 100644 index 000000000..661a106df --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/white_banner.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:item/template_banner" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/white_bed.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/white_bed.json new file mode 100644 index 000000000..93d81aff0 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/white_bed.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/template_bed", + "textures": { + "particle": "minecraft:block/white_wool" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/white_bundle.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/white_bundle.json new file mode 100644 index 000000000..6efd8ccb8 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/white_bundle.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/white_bundle" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/white_bundle_open_back.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/white_bundle_open_back.json new file mode 100644 index 000000000..6692dda4d --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/white_bundle_open_back.json @@ -0,0 +1,6 @@ +{ + "parent": "item/bundle", + "textures": { + "layer0": "item/white_bundle_open_back" + } +} diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/white_bundle_open_front.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/white_bundle_open_front.json new file mode 100644 index 000000000..ca14ae3b6 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/white_bundle_open_front.json @@ -0,0 +1,6 @@ +{ + "parent": "item/bundle", + "textures": { + "layer0": "item/white_bundle_open_front" + } +} diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/white_candle.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/white_candle.json new file mode 100644 index 000000000..d13392c4e --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/white_candle.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/white_candle" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/white_carpet.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/white_carpet.json new file mode 100644 index 000000000..8ef6f034c --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/white_carpet.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/white_carpet" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/white_concrete.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/white_concrete.json new file mode 100644 index 000000000..16475ed43 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/white_concrete.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/white_concrete" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/white_concrete_powder.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/white_concrete_powder.json new file mode 100644 index 000000000..c001b3839 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/white_concrete_powder.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/white_concrete_powder" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/white_dye.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/white_dye.json new file mode 100644 index 000000000..68b02c07c --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/white_dye.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/white_dye" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/white_glazed_terracotta.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/white_glazed_terracotta.json new file mode 100644 index 000000000..55881dbcd --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/white_glazed_terracotta.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/white_glazed_terracotta" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/white_shulker_box.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/white_shulker_box.json new file mode 100644 index 000000000..6fd0156e7 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/white_shulker_box.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/template_shulker_box", + "textures": { + "particle": "minecraft:block/white_shulker_box" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/white_stained_glass.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/white_stained_glass.json new file mode 100644 index 000000000..28c61d954 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/white_stained_glass.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/white_stained_glass" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/white_stained_glass_pane.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/white_stained_glass_pane.json new file mode 100644 index 000000000..dbe66a16a --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/white_stained_glass_pane.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:block/white_stained_glass" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/white_terracotta.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/white_terracotta.json new file mode 100644 index 000000000..973fa9667 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/white_terracotta.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/white_terracotta" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/white_tulip.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/white_tulip.json new file mode 100644 index 000000000..f19409060 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/white_tulip.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:block/white_tulip" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/white_wool.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/white_wool.json new file mode 100644 index 000000000..5908f3401 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/white_wool.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/white_wool" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/wild_armor_trim_smithing_template.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/wild_armor_trim_smithing_template.json new file mode 100644 index 000000000..52c438c78 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/wild_armor_trim_smithing_template.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/wild_armor_trim_smithing_template" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/wind_charge.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/wind_charge.json new file mode 100644 index 000000000..821c34ebb --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/wind_charge.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/wind_charge" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/witch_spawn_egg.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/witch_spawn_egg.json new file mode 100644 index 000000000..d1aaa9d6e --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/witch_spawn_egg.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:item/template_spawn_egg" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/wither_rose.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/wither_rose.json new file mode 100644 index 000000000..9579e7c48 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/wither_rose.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:block/wither_rose" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/wither_skeleton_skull.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/wither_skeleton_skull.json new file mode 100644 index 000000000..364b6e65f --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/wither_skeleton_skull.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:item/template_skull" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/wither_skeleton_spawn_egg.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/wither_skeleton_spawn_egg.json new file mode 100644 index 000000000..d1aaa9d6e --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/wither_skeleton_spawn_egg.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:item/template_spawn_egg" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/wither_spawn_egg.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/wither_spawn_egg.json new file mode 100644 index 000000000..d1aaa9d6e --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/wither_spawn_egg.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:item/template_spawn_egg" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/wolf_armor.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/wolf_armor.json new file mode 100644 index 000000000..b08d08290 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/wolf_armor.json @@ -0,0 +1,7 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/wolf_armor", + "layer1": "minecraft:item/wolf_armor_overlay" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/wolf_spawn_egg.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/wolf_spawn_egg.json new file mode 100644 index 000000000..d1aaa9d6e --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/wolf_spawn_egg.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:item/template_spawn_egg" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/wooden_axe.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/wooden_axe.json new file mode 100644 index 000000000..e08423dbf --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/wooden_axe.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/handheld", + "textures": { + "layer0": "minecraft:item/wooden_axe" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/wooden_hoe.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/wooden_hoe.json new file mode 100644 index 000000000..a925c76b1 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/wooden_hoe.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/handheld", + "textures": { + "layer0": "minecraft:item/wooden_hoe" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/wooden_pickaxe.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/wooden_pickaxe.json new file mode 100644 index 000000000..5b9bbab7d --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/wooden_pickaxe.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/handheld", + "textures": { + "layer0": "minecraft:item/wooden_pickaxe" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/wooden_shovel.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/wooden_shovel.json new file mode 100644 index 000000000..7c4d82876 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/wooden_shovel.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/handheld", + "textures": { + "layer0": "minecraft:item/wooden_shovel" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/wooden_sword.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/wooden_sword.json new file mode 100644 index 000000000..4024a58a0 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/wooden_sword.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/handheld", + "textures": { + "layer0": "minecraft:item/wooden_sword" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/writable_book.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/writable_book.json new file mode 100644 index 000000000..9398becac --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/writable_book.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/writable_book" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/written_book.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/written_book.json new file mode 100644 index 000000000..45a096029 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/written_book.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/written_book" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/yellow_banner.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/yellow_banner.json new file mode 100644 index 000000000..661a106df --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/yellow_banner.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:item/template_banner" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/yellow_bed.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/yellow_bed.json new file mode 100644 index 000000000..cc67ceffa --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/yellow_bed.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/template_bed", + "textures": { + "particle": "minecraft:block/yellow_wool" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/yellow_bundle.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/yellow_bundle.json new file mode 100644 index 000000000..c685714df --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/yellow_bundle.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/yellow_bundle" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/yellow_bundle_open_back.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/yellow_bundle_open_back.json new file mode 100644 index 000000000..9f598be77 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/yellow_bundle_open_back.json @@ -0,0 +1,6 @@ +{ + "parent": "item/bundle", + "textures": { + "layer0": "item/yellow_bundle_open_back" + } +} diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/yellow_bundle_open_front.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/yellow_bundle_open_front.json new file mode 100644 index 000000000..9c3f41e13 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/yellow_bundle_open_front.json @@ -0,0 +1,6 @@ +{ + "parent": "item/bundle", + "textures": { + "layer0": "item/yellow_bundle_open_front" + } +} diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/yellow_candle.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/yellow_candle.json new file mode 100644 index 000000000..8f2e07288 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/yellow_candle.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/yellow_candle" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/yellow_carpet.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/yellow_carpet.json new file mode 100644 index 000000000..c3b3710e0 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/yellow_carpet.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/yellow_carpet" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/yellow_concrete.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/yellow_concrete.json new file mode 100644 index 000000000..ed8ebe4c0 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/yellow_concrete.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/yellow_concrete" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/yellow_concrete_powder.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/yellow_concrete_powder.json new file mode 100644 index 000000000..38bac8bf6 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/yellow_concrete_powder.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/yellow_concrete_powder" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/yellow_dye.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/yellow_dye.json new file mode 100644 index 000000000..14d6bb6a0 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/yellow_dye.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:item/yellow_dye" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/yellow_glazed_terracotta.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/yellow_glazed_terracotta.json new file mode 100644 index 000000000..4d8199842 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/yellow_glazed_terracotta.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/yellow_glazed_terracotta" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/yellow_shulker_box.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/yellow_shulker_box.json new file mode 100644 index 000000000..318a620e7 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/yellow_shulker_box.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/template_shulker_box", + "textures": { + "particle": "minecraft:block/yellow_shulker_box" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/yellow_stained_glass.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/yellow_stained_glass.json new file mode 100644 index 000000000..e102e2d5b --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/yellow_stained_glass.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/yellow_stained_glass" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/yellow_stained_glass_pane.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/yellow_stained_glass_pane.json new file mode 100644 index 000000000..e17c28a21 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/yellow_stained_glass_pane.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "minecraft:block/yellow_stained_glass" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/yellow_terracotta.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/yellow_terracotta.json new file mode 100644 index 000000000..50dfb7ea7 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/yellow_terracotta.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/yellow_terracotta" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/yellow_wool.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/yellow_wool.json new file mode 100644 index 000000000..e0de4bb81 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/yellow_wool.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:block/yellow_wool" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/zoglin_spawn_egg.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/zoglin_spawn_egg.json new file mode 100644 index 000000000..d1aaa9d6e --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/zoglin_spawn_egg.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:item/template_spawn_egg" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/zombie_head.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/zombie_head.json new file mode 100644 index 000000000..364b6e65f --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/zombie_head.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:item/template_skull" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/zombie_horse_spawn_egg.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/zombie_horse_spawn_egg.json new file mode 100644 index 000000000..d1aaa9d6e --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/zombie_horse_spawn_egg.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:item/template_spawn_egg" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/zombie_spawn_egg.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/zombie_spawn_egg.json new file mode 100644 index 000000000..d1aaa9d6e --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/zombie_spawn_egg.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:item/template_spawn_egg" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/zombie_villager_spawn_egg.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/zombie_villager_spawn_egg.json new file mode 100644 index 000000000..d1aaa9d6e --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/zombie_villager_spawn_egg.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:item/template_spawn_egg" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/zombified_piglin_spawn_egg.json b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/zombified_piglin_spawn_egg.json new file mode 100644 index 000000000..d1aaa9d6e --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_3/minecraft/items/zombified_piglin_spawn_egg.json @@ -0,0 +1,3 @@ +{ + "parent": "minecraft:item/template_spawn_egg" +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/acacia_boat.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/acacia_boat.json new file mode 100644 index 000000000..40c386d3a --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/acacia_boat.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/acacia_boat" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/acacia_button.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/acacia_button.json new file mode 100644 index 000000000..a3dcd423c --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/acacia_button.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/acacia_button_inventory" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/acacia_chest_boat.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/acacia_chest_boat.json new file mode 100644 index 000000000..671be37c6 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/acacia_chest_boat.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/acacia_chest_boat" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/acacia_door.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/acacia_door.json new file mode 100644 index 000000000..43b8d7c6b --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/acacia_door.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/acacia_door" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/acacia_fence.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/acacia_fence.json new file mode 100644 index 000000000..c9d21e600 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/acacia_fence.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/acacia_fence_inventory" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/acacia_fence_gate.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/acacia_fence_gate.json new file mode 100644 index 000000000..59094a4ac --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/acacia_fence_gate.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/acacia_fence_gate" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/acacia_hanging_sign.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/acacia_hanging_sign.json new file mode 100644 index 000000000..1c4ec4e65 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/acacia_hanging_sign.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/acacia_hanging_sign" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/acacia_leaves.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/acacia_leaves.json new file mode 100644 index 000000000..bbbab39ca --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/acacia_leaves.json @@ -0,0 +1,12 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/acacia_leaves", + "tints": [ + { + "type": "minecraft:constant", + "value": -12012264 + } + ] + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/acacia_log.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/acacia_log.json new file mode 100644 index 000000000..d377ce70d --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/acacia_log.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/acacia_log" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/acacia_planks.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/acacia_planks.json new file mode 100644 index 000000000..017452be8 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/acacia_planks.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/acacia_planks" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/acacia_pressure_plate.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/acacia_pressure_plate.json new file mode 100644 index 000000000..bf4e9fdcd --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/acacia_pressure_plate.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/acacia_pressure_plate" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/acacia_sapling.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/acacia_sapling.json new file mode 100644 index 000000000..ec95e0f59 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/acacia_sapling.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/acacia_sapling" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/acacia_sign.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/acacia_sign.json new file mode 100644 index 000000000..6b572ed38 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/acacia_sign.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/acacia_sign" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/acacia_slab.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/acacia_slab.json new file mode 100644 index 000000000..05c1a0ba5 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/acacia_slab.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/acacia_slab" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/acacia_stairs.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/acacia_stairs.json new file mode 100644 index 000000000..69e95274c --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/acacia_stairs.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/acacia_stairs" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/acacia_trapdoor.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/acacia_trapdoor.json new file mode 100644 index 000000000..29314826c --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/acacia_trapdoor.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/acacia_trapdoor_bottom" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/acacia_wood.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/acacia_wood.json new file mode 100644 index 000000000..8368b4cea --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/acacia_wood.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/acacia_wood" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/activator_rail.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/activator_rail.json new file mode 100644 index 000000000..855d961a3 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/activator_rail.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/activator_rail" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/air.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/air.json new file mode 100644 index 000000000..f0727913c --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/air.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/air" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/allay_spawn_egg.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/allay_spawn_egg.json new file mode 100644 index 000000000..ce06c0df4 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/allay_spawn_egg.json @@ -0,0 +1,16 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/template_spawn_egg", + "tints": [ + { + "type": "minecraft:constant", + "value": -16721153 + }, + { + "type": "minecraft:constant", + "value": -16732673 + } + ] + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/allium.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/allium.json new file mode 100644 index 000000000..3ba9a1a7f --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/allium.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/allium" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/amethyst_block.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/amethyst_block.json new file mode 100644 index 000000000..5a655def4 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/amethyst_block.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/amethyst_block" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/amethyst_cluster.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/amethyst_cluster.json new file mode 100644 index 000000000..c8bb8bea0 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/amethyst_cluster.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/amethyst_cluster" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/amethyst_shard.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/amethyst_shard.json new file mode 100644 index 000000000..47232b2bc --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/amethyst_shard.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/amethyst_shard" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/ancient_debris.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/ancient_debris.json new file mode 100644 index 000000000..f3e196500 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/ancient_debris.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/ancient_debris" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/andesite.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/andesite.json new file mode 100644 index 000000000..3f68917ad --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/andesite.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/andesite" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/andesite_slab.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/andesite_slab.json new file mode 100644 index 000000000..66a9a022b --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/andesite_slab.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/andesite_slab" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/andesite_stairs.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/andesite_stairs.json new file mode 100644 index 000000000..fb742015a --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/andesite_stairs.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/andesite_stairs" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/andesite_wall.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/andesite_wall.json new file mode 100644 index 000000000..c95364641 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/andesite_wall.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/andesite_wall_inventory" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/angler_pottery_sherd.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/angler_pottery_sherd.json new file mode 100644 index 000000000..61083360b --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/angler_pottery_sherd.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/angler_pottery_sherd" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/anvil.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/anvil.json new file mode 100644 index 000000000..8dcd36b0b --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/anvil.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/anvil" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/apple.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/apple.json new file mode 100644 index 000000000..775daabba --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/apple.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/apple" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/archer_pottery_sherd.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/archer_pottery_sherd.json new file mode 100644 index 000000000..575adb29c --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/archer_pottery_sherd.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/archer_pottery_sherd" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/armadillo_scute.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/armadillo_scute.json new file mode 100644 index 000000000..90f7a5304 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/armadillo_scute.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/armadillo_scute" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/armadillo_spawn_egg.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/armadillo_spawn_egg.json new file mode 100644 index 000000000..202c8f547 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/armadillo_spawn_egg.json @@ -0,0 +1,16 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/template_spawn_egg", + "tints": [ + { + "type": "minecraft:constant", + "value": -5410451 + }, + { + "type": "minecraft:constant", + "value": -8239032 + } + ] + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/armor_stand.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/armor_stand.json new file mode 100644 index 000000000..43398b3e7 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/armor_stand.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/armor_stand" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/arms_up_pottery_sherd.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/arms_up_pottery_sherd.json new file mode 100644 index 000000000..45ae4d926 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/arms_up_pottery_sherd.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/arms_up_pottery_sherd" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/arrow.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/arrow.json new file mode 100644 index 000000000..5915e01ea --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/arrow.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/arrow" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/axolotl_bucket.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/axolotl_bucket.json new file mode 100644 index 000000000..1fe9963c9 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/axolotl_bucket.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/axolotl_bucket" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/axolotl_spawn_egg.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/axolotl_spawn_egg.json new file mode 100644 index 000000000..4153e5bc8 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/axolotl_spawn_egg.json @@ -0,0 +1,16 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/template_spawn_egg", + "tints": [ + { + "type": "minecraft:constant", + "value": -278045 + }, + { + "type": "minecraft:constant", + "value": -5886604 + } + ] + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/azalea.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/azalea.json new file mode 100644 index 000000000..5c538e74f --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/azalea.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/azalea" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/azalea_leaves.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/azalea_leaves.json new file mode 100644 index 000000000..107c301f4 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/azalea_leaves.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/azalea_leaves" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/azure_bluet.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/azure_bluet.json new file mode 100644 index 000000000..11b192af6 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/azure_bluet.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/azure_bluet" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/baked_potato.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/baked_potato.json new file mode 100644 index 000000000..3553c526c --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/baked_potato.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/baked_potato" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/bamboo.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/bamboo.json new file mode 100644 index 000000000..30d6b5590 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/bamboo.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/bamboo" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/bamboo_block.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/bamboo_block.json new file mode 100644 index 000000000..8dc88463a --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/bamboo_block.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/bamboo_block" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/bamboo_button.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/bamboo_button.json new file mode 100644 index 000000000..57d5c8126 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/bamboo_button.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/bamboo_button_inventory" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/bamboo_chest_raft.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/bamboo_chest_raft.json new file mode 100644 index 000000000..a7b219b2f --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/bamboo_chest_raft.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/bamboo_chest_raft" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/bamboo_door.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/bamboo_door.json new file mode 100644 index 000000000..8728a4db7 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/bamboo_door.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/bamboo_door" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/bamboo_fence.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/bamboo_fence.json new file mode 100644 index 000000000..9e8424db8 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/bamboo_fence.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/bamboo_fence_inventory" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/bamboo_fence_gate.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/bamboo_fence_gate.json new file mode 100644 index 000000000..8db169324 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/bamboo_fence_gate.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/bamboo_fence_gate" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/bamboo_hanging_sign.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/bamboo_hanging_sign.json new file mode 100644 index 000000000..7e6b5d512 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/bamboo_hanging_sign.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/bamboo_hanging_sign" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/bamboo_mosaic.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/bamboo_mosaic.json new file mode 100644 index 000000000..49b0ddaed --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/bamboo_mosaic.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/bamboo_mosaic" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/bamboo_mosaic_slab.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/bamboo_mosaic_slab.json new file mode 100644 index 000000000..d475b36ae --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/bamboo_mosaic_slab.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/bamboo_mosaic_slab" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/bamboo_mosaic_stairs.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/bamboo_mosaic_stairs.json new file mode 100644 index 000000000..e59cde5cd --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/bamboo_mosaic_stairs.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/bamboo_mosaic_stairs" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/bamboo_planks.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/bamboo_planks.json new file mode 100644 index 000000000..a73c8d159 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/bamboo_planks.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/bamboo_planks" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/bamboo_pressure_plate.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/bamboo_pressure_plate.json new file mode 100644 index 000000000..490046fd2 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/bamboo_pressure_plate.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/bamboo_pressure_plate" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/bamboo_raft.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/bamboo_raft.json new file mode 100644 index 000000000..9e224bcad --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/bamboo_raft.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/bamboo_raft" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/bamboo_sign.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/bamboo_sign.json new file mode 100644 index 000000000..c916c6a7f --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/bamboo_sign.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/bamboo_sign" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/bamboo_slab.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/bamboo_slab.json new file mode 100644 index 000000000..496f820b2 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/bamboo_slab.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/bamboo_slab" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/bamboo_stairs.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/bamboo_stairs.json new file mode 100644 index 000000000..65326e0ef --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/bamboo_stairs.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/bamboo_stairs" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/bamboo_trapdoor.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/bamboo_trapdoor.json new file mode 100644 index 000000000..0855c71f5 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/bamboo_trapdoor.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/bamboo_trapdoor_bottom" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/barrel.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/barrel.json new file mode 100644 index 000000000..8f362a2f7 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/barrel.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/barrel" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/barrier.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/barrier.json new file mode 100644 index 000000000..75cc3b337 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/barrier.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/barrier" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/basalt.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/basalt.json new file mode 100644 index 000000000..33a70621f --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/basalt.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/basalt" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/bat_spawn_egg.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/bat_spawn_egg.json new file mode 100644 index 000000000..c7f1a5669 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/bat_spawn_egg.json @@ -0,0 +1,16 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/template_spawn_egg", + "tints": [ + { + "type": "minecraft:constant", + "value": -11780560 + }, + { + "type": "minecraft:constant", + "value": -15790321 + } + ] + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/beacon.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/beacon.json new file mode 100644 index 000000000..814878e5d --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/beacon.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/beacon" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/bedrock.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/bedrock.json new file mode 100644 index 000000000..89f068fe7 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/bedrock.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/bedrock" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/bee_nest.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/bee_nest.json new file mode 100644 index 000000000..cb918fe0f --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/bee_nest.json @@ -0,0 +1,20 @@ +{ + "model": { + "type": "minecraft:select", + "block_state_property": "honey_level", + "cases": [ + { + "model": { + "type": "minecraft:model", + "model": "minecraft:block/bee_nest_honey" + }, + "when": "5" + } + ], + "fallback": { + "type": "minecraft:model", + "model": "minecraft:block/bee_nest_empty" + }, + "property": "minecraft:block_state" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/bee_spawn_egg.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/bee_spawn_egg.json new file mode 100644 index 000000000..0cf00f925 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/bee_spawn_egg.json @@ -0,0 +1,16 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/template_spawn_egg", + "tints": [ + { + "type": "minecraft:constant", + "value": -1195197 + }, + { + "type": "minecraft:constant", + "value": -12377061 + } + ] + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/beef.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/beef.json new file mode 100644 index 000000000..d1bf5b046 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/beef.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/beef" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/beehive.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/beehive.json new file mode 100644 index 000000000..279dc4b8f --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/beehive.json @@ -0,0 +1,20 @@ +{ + "model": { + "type": "minecraft:select", + "block_state_property": "honey_level", + "cases": [ + { + "model": { + "type": "minecraft:model", + "model": "minecraft:block/beehive_honey" + }, + "when": "5" + } + ], + "fallback": { + "type": "minecraft:model", + "model": "minecraft:block/beehive_empty" + }, + "property": "minecraft:block_state" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/beetroot.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/beetroot.json new file mode 100644 index 000000000..fc7949949 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/beetroot.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/beetroot" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/beetroot_seeds.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/beetroot_seeds.json new file mode 100644 index 000000000..e2742c167 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/beetroot_seeds.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/beetroot_seeds" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/beetroot_soup.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/beetroot_soup.json new file mode 100644 index 000000000..ebbea11d0 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/beetroot_soup.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/beetroot_soup" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/bell.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/bell.json new file mode 100644 index 000000000..15fece84e --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/bell.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/bell" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/big_dripleaf.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/big_dripleaf.json new file mode 100644 index 000000000..aa47d6198 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/big_dripleaf.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/big_dripleaf" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/birch_boat.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/birch_boat.json new file mode 100644 index 000000000..261a254df --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/birch_boat.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/birch_boat" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/birch_button.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/birch_button.json new file mode 100644 index 000000000..3eaece396 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/birch_button.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/birch_button_inventory" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/birch_chest_boat.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/birch_chest_boat.json new file mode 100644 index 000000000..37eaf2fe3 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/birch_chest_boat.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/birch_chest_boat" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/birch_door.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/birch_door.json new file mode 100644 index 000000000..bfc2721b2 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/birch_door.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/birch_door" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/birch_fence.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/birch_fence.json new file mode 100644 index 000000000..8963c9d29 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/birch_fence.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/birch_fence_inventory" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/birch_fence_gate.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/birch_fence_gate.json new file mode 100644 index 000000000..923244ff1 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/birch_fence_gate.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/birch_fence_gate" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/birch_hanging_sign.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/birch_hanging_sign.json new file mode 100644 index 000000000..fd062e231 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/birch_hanging_sign.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/birch_hanging_sign" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/birch_leaves.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/birch_leaves.json new file mode 100644 index 000000000..f06b0a4ad --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/birch_leaves.json @@ -0,0 +1,12 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/birch_leaves", + "tints": [ + { + "type": "minecraft:constant", + "value": -8345771 + } + ] + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/birch_log.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/birch_log.json new file mode 100644 index 000000000..f4bf68832 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/birch_log.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/birch_log" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/birch_planks.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/birch_planks.json new file mode 100644 index 000000000..7dab521e4 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/birch_planks.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/birch_planks" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/birch_pressure_plate.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/birch_pressure_plate.json new file mode 100644 index 000000000..708ec1bcb --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/birch_pressure_plate.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/birch_pressure_plate" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/birch_sapling.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/birch_sapling.json new file mode 100644 index 000000000..b4cfced3d --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/birch_sapling.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/birch_sapling" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/birch_sign.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/birch_sign.json new file mode 100644 index 000000000..a160ed646 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/birch_sign.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/birch_sign" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/birch_slab.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/birch_slab.json new file mode 100644 index 000000000..b4cb850ae --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/birch_slab.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/birch_slab" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/birch_stairs.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/birch_stairs.json new file mode 100644 index 000000000..c5e8e4429 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/birch_stairs.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/birch_stairs" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/birch_trapdoor.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/birch_trapdoor.json new file mode 100644 index 000000000..db2d3a91e --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/birch_trapdoor.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/birch_trapdoor_bottom" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/birch_wood.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/birch_wood.json new file mode 100644 index 000000000..f1f5d1ea8 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/birch_wood.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/birch_wood" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/black_banner.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/black_banner.json new file mode 100644 index 000000000..62bbb531e --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/black_banner.json @@ -0,0 +1,10 @@ +{ + "model": { + "type": "minecraft:special", + "base": "minecraft:item/template_banner", + "model": { + "type": "minecraft:banner", + "color": "black" + } + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/black_bed.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/black_bed.json new file mode 100644 index 000000000..04d7e3561 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/black_bed.json @@ -0,0 +1,10 @@ +{ + "model": { + "type": "minecraft:special", + "base": "minecraft:item/black_bed", + "model": { + "type": "minecraft:bed", + "texture": "minecraft:black" + } + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/black_bundle.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/black_bundle.json new file mode 100644 index 000000000..066707b5a --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/black_bundle.json @@ -0,0 +1,39 @@ +{ + "model": { + "type": "minecraft:select", + "cases": [ + { + "model": { + "type": "minecraft:condition", + "on_false": { + "type": "minecraft:model", + "model": "minecraft:item/black_bundle" + }, + "on_true": { + "type": "minecraft:composite", + "models": [ + { + "type": "minecraft:model", + "model": "minecraft:item/black_bundle_open_back" + }, + { + "type": "minecraft:bundle/selected_item" + }, + { + "type": "minecraft:model", + "model": "minecraft:item/black_bundle_open_front" + } + ] + }, + "property": "minecraft:bundle/has_selected_item" + }, + "when": "gui" + } + ], + "fallback": { + "type": "minecraft:model", + "model": "minecraft:item/black_bundle" + }, + "property": "minecraft:display_context" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/black_candle.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/black_candle.json new file mode 100644 index 000000000..9c28b4440 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/black_candle.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/black_candle" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/black_carpet.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/black_carpet.json new file mode 100644 index 000000000..c80c9be56 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/black_carpet.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/black_carpet" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/black_concrete.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/black_concrete.json new file mode 100644 index 000000000..88adfa331 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/black_concrete.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/black_concrete" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/black_concrete_powder.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/black_concrete_powder.json new file mode 100644 index 000000000..0af5716a1 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/black_concrete_powder.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/black_concrete_powder" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/black_dye.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/black_dye.json new file mode 100644 index 000000000..a5851c21d --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/black_dye.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/black_dye" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/black_glazed_terracotta.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/black_glazed_terracotta.json new file mode 100644 index 000000000..02d6d5e50 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/black_glazed_terracotta.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/black_glazed_terracotta" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/black_shulker_box.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/black_shulker_box.json new file mode 100644 index 000000000..46fa3e1f8 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/black_shulker_box.json @@ -0,0 +1,10 @@ +{ + "model": { + "type": "minecraft:special", + "base": "minecraft:item/black_shulker_box", + "model": { + "type": "minecraft:shulker_box", + "texture": "minecraft:shulker_black" + } + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/black_stained_glass.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/black_stained_glass.json new file mode 100644 index 000000000..a87c5feaa --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/black_stained_glass.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/black_stained_glass" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/black_stained_glass_pane.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/black_stained_glass_pane.json new file mode 100644 index 000000000..f37e68005 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/black_stained_glass_pane.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/black_stained_glass_pane" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/black_terracotta.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/black_terracotta.json new file mode 100644 index 000000000..0b8b26b79 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/black_terracotta.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/black_terracotta" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/black_wool.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/black_wool.json new file mode 100644 index 000000000..178340d47 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/black_wool.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/black_wool" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/blackstone.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/blackstone.json new file mode 100644 index 000000000..142bcb059 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/blackstone.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/blackstone" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/blackstone_slab.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/blackstone_slab.json new file mode 100644 index 000000000..130a89057 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/blackstone_slab.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/blackstone_slab" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/blackstone_stairs.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/blackstone_stairs.json new file mode 100644 index 000000000..85d2c1aa1 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/blackstone_stairs.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/blackstone_stairs" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/blackstone_wall.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/blackstone_wall.json new file mode 100644 index 000000000..9d569e06f --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/blackstone_wall.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/blackstone_wall_inventory" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/blade_pottery_sherd.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/blade_pottery_sherd.json new file mode 100644 index 000000000..4d1933846 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/blade_pottery_sherd.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/blade_pottery_sherd" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/blast_furnace.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/blast_furnace.json new file mode 100644 index 000000000..b28606354 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/blast_furnace.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/blast_furnace" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/blaze_powder.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/blaze_powder.json new file mode 100644 index 000000000..812d76c01 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/blaze_powder.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/blaze_powder" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/blaze_rod.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/blaze_rod.json new file mode 100644 index 000000000..b2db009a3 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/blaze_rod.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/blaze_rod" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/blaze_spawn_egg.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/blaze_spawn_egg.json new file mode 100644 index 000000000..ba1d31f6d --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/blaze_spawn_egg.json @@ -0,0 +1,16 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/template_spawn_egg", + "tints": [ + { + "type": "minecraft:constant", + "value": -609791 + }, + { + "type": "minecraft:constant", + "value": -1922 + } + ] + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/blue_banner.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/blue_banner.json new file mode 100644 index 000000000..d985ba59a --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/blue_banner.json @@ -0,0 +1,10 @@ +{ + "model": { + "type": "minecraft:special", + "base": "minecraft:item/template_banner", + "model": { + "type": "minecraft:banner", + "color": "blue" + } + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/blue_bed.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/blue_bed.json new file mode 100644 index 000000000..73a9afb51 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/blue_bed.json @@ -0,0 +1,10 @@ +{ + "model": { + "type": "minecraft:special", + "base": "minecraft:item/blue_bed", + "model": { + "type": "minecraft:bed", + "texture": "minecraft:blue" + } + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/blue_bundle.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/blue_bundle.json new file mode 100644 index 000000000..57437107a --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/blue_bundle.json @@ -0,0 +1,39 @@ +{ + "model": { + "type": "minecraft:select", + "cases": [ + { + "model": { + "type": "minecraft:condition", + "on_false": { + "type": "minecraft:model", + "model": "minecraft:item/blue_bundle" + }, + "on_true": { + "type": "minecraft:composite", + "models": [ + { + "type": "minecraft:model", + "model": "minecraft:item/blue_bundle_open_back" + }, + { + "type": "minecraft:bundle/selected_item" + }, + { + "type": "minecraft:model", + "model": "minecraft:item/blue_bundle_open_front" + } + ] + }, + "property": "minecraft:bundle/has_selected_item" + }, + "when": "gui" + } + ], + "fallback": { + "type": "minecraft:model", + "model": "minecraft:item/blue_bundle" + }, + "property": "minecraft:display_context" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/blue_candle.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/blue_candle.json new file mode 100644 index 000000000..5cfe77a55 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/blue_candle.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/blue_candle" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/blue_carpet.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/blue_carpet.json new file mode 100644 index 000000000..1a620a576 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/blue_carpet.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/blue_carpet" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/blue_concrete.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/blue_concrete.json new file mode 100644 index 000000000..cc0b5b9dc --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/blue_concrete.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/blue_concrete" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/blue_concrete_powder.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/blue_concrete_powder.json new file mode 100644 index 000000000..3b981e85e --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/blue_concrete_powder.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/blue_concrete_powder" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/blue_dye.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/blue_dye.json new file mode 100644 index 000000000..381b71e98 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/blue_dye.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/blue_dye" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/blue_glazed_terracotta.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/blue_glazed_terracotta.json new file mode 100644 index 000000000..5cf3c1c91 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/blue_glazed_terracotta.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/blue_glazed_terracotta" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/blue_ice.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/blue_ice.json new file mode 100644 index 000000000..7f2160ded --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/blue_ice.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/blue_ice" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/blue_orchid.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/blue_orchid.json new file mode 100644 index 000000000..f76d09633 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/blue_orchid.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/blue_orchid" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/blue_shulker_box.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/blue_shulker_box.json new file mode 100644 index 000000000..299c77253 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/blue_shulker_box.json @@ -0,0 +1,10 @@ +{ + "model": { + "type": "minecraft:special", + "base": "minecraft:item/blue_shulker_box", + "model": { + "type": "minecraft:shulker_box", + "texture": "minecraft:shulker_blue" + } + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/blue_stained_glass.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/blue_stained_glass.json new file mode 100644 index 000000000..c343d93ad --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/blue_stained_glass.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/blue_stained_glass" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/blue_stained_glass_pane.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/blue_stained_glass_pane.json new file mode 100644 index 000000000..941daad69 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/blue_stained_glass_pane.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/blue_stained_glass_pane" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/blue_terracotta.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/blue_terracotta.json new file mode 100644 index 000000000..db5cdb28e --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/blue_terracotta.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/blue_terracotta" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/blue_wool.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/blue_wool.json new file mode 100644 index 000000000..171f1db04 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/blue_wool.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/blue_wool" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/bogged_spawn_egg.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/bogged_spawn_egg.json new file mode 100644 index 000000000..944206c47 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/bogged_spawn_egg.json @@ -0,0 +1,16 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/template_spawn_egg", + "tints": [ + { + "type": "minecraft:constant", + "value": -7693198 + }, + { + "type": "minecraft:constant", + "value": -13546213 + } + ] + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/bolt_armor_trim_smithing_template.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/bolt_armor_trim_smithing_template.json new file mode 100644 index 000000000..9745ca12e --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/bolt_armor_trim_smithing_template.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/bolt_armor_trim_smithing_template" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/bone.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/bone.json new file mode 100644 index 000000000..fea2360cd --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/bone.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/bone" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/bone_block.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/bone_block.json new file mode 100644 index 000000000..b949a94e7 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/bone_block.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/bone_block" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/bone_meal.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/bone_meal.json new file mode 100644 index 000000000..7b1eb0641 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/bone_meal.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/bone_meal" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/book.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/book.json new file mode 100644 index 000000000..c36707130 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/book.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/book" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/bookshelf.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/bookshelf.json new file mode 100644 index 000000000..18c77821d --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/bookshelf.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/bookshelf" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/bordure_indented_banner_pattern.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/bordure_indented_banner_pattern.json new file mode 100644 index 000000000..fb2684f67 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/bordure_indented_banner_pattern.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/bordure_indented_banner_pattern" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/bow.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/bow.json new file mode 100644 index 000000000..fa7071ce5 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/bow.json @@ -0,0 +1,35 @@ +{ + "model": { + "type": "minecraft:condition", + "on_false": { + "type": "minecraft:model", + "model": "minecraft:item/bow" + }, + "on_true": { + "type": "minecraft:range_dispatch", + "entries": [ + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/bow_pulling_1" + }, + "threshold": 0.65 + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/bow_pulling_2" + }, + "threshold": 0.9 + } + ], + "fallback": { + "type": "minecraft:model", + "model": "minecraft:item/bow_pulling_0" + }, + "property": "minecraft:use_duration", + "scale": 0.05 + }, + "property": "minecraft:using_item" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/bowl.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/bowl.json new file mode 100644 index 000000000..99459cf66 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/bowl.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/bowl" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/brain_coral.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/brain_coral.json new file mode 100644 index 000000000..fa8e2eb6a --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/brain_coral.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/brain_coral" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/brain_coral_block.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/brain_coral_block.json new file mode 100644 index 000000000..ab2ce2127 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/brain_coral_block.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/brain_coral_block" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/brain_coral_fan.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/brain_coral_fan.json new file mode 100644 index 000000000..2851549f7 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/brain_coral_fan.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/brain_coral_fan" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/bread.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/bread.json new file mode 100644 index 000000000..a90e33b52 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/bread.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/bread" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/breeze_rod.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/breeze_rod.json new file mode 100644 index 000000000..ef08b38a0 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/breeze_rod.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/breeze_rod" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/breeze_spawn_egg.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/breeze_spawn_egg.json new file mode 100644 index 000000000..a3ea35289 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/breeze_spawn_egg.json @@ -0,0 +1,16 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/template_spawn_egg", + "tints": [ + { + "type": "minecraft:constant", + "value": -5270305 + }, + { + "type": "minecraft:constant", + "value": -7248161 + } + ] + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/brewer_pottery_sherd.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/brewer_pottery_sherd.json new file mode 100644 index 000000000..0bd69ad47 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/brewer_pottery_sherd.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/brewer_pottery_sherd" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/brewing_stand.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/brewing_stand.json new file mode 100644 index 000000000..823cf558d --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/brewing_stand.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/brewing_stand" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/brick.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/brick.json new file mode 100644 index 000000000..7e6be5152 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/brick.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/brick" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/brick_slab.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/brick_slab.json new file mode 100644 index 000000000..6afe9425e --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/brick_slab.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/brick_slab" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/brick_stairs.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/brick_stairs.json new file mode 100644 index 000000000..782ee48d5 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/brick_stairs.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/brick_stairs" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/brick_wall.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/brick_wall.json new file mode 100644 index 000000000..7acc8f3e5 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/brick_wall.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/brick_wall_inventory" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/bricks.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/bricks.json new file mode 100644 index 000000000..45bb895ca --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/bricks.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/bricks" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/brown_banner.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/brown_banner.json new file mode 100644 index 000000000..21b2d0bfc --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/brown_banner.json @@ -0,0 +1,10 @@ +{ + "model": { + "type": "minecraft:special", + "base": "minecraft:item/template_banner", + "model": { + "type": "minecraft:banner", + "color": "brown" + } + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/brown_bed.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/brown_bed.json new file mode 100644 index 000000000..42492f517 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/brown_bed.json @@ -0,0 +1,10 @@ +{ + "model": { + "type": "minecraft:special", + "base": "minecraft:item/brown_bed", + "model": { + "type": "minecraft:bed", + "texture": "minecraft:brown" + } + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/brown_bundle.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/brown_bundle.json new file mode 100644 index 000000000..deb8d4ebd --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/brown_bundle.json @@ -0,0 +1,39 @@ +{ + "model": { + "type": "minecraft:select", + "cases": [ + { + "model": { + "type": "minecraft:condition", + "on_false": { + "type": "minecraft:model", + "model": "minecraft:item/brown_bundle" + }, + "on_true": { + "type": "minecraft:composite", + "models": [ + { + "type": "minecraft:model", + "model": "minecraft:item/brown_bundle_open_back" + }, + { + "type": "minecraft:bundle/selected_item" + }, + { + "type": "minecraft:model", + "model": "minecraft:item/brown_bundle_open_front" + } + ] + }, + "property": "minecraft:bundle/has_selected_item" + }, + "when": "gui" + } + ], + "fallback": { + "type": "minecraft:model", + "model": "minecraft:item/brown_bundle" + }, + "property": "minecraft:display_context" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/brown_candle.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/brown_candle.json new file mode 100644 index 000000000..d7d461486 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/brown_candle.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/brown_candle" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/brown_carpet.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/brown_carpet.json new file mode 100644 index 000000000..d32721af4 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/brown_carpet.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/brown_carpet" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/brown_concrete.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/brown_concrete.json new file mode 100644 index 000000000..9e045cf4e --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/brown_concrete.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/brown_concrete" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/brown_concrete_powder.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/brown_concrete_powder.json new file mode 100644 index 000000000..90f379579 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/brown_concrete_powder.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/brown_concrete_powder" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/brown_dye.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/brown_dye.json new file mode 100644 index 000000000..4d6d06180 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/brown_dye.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/brown_dye" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/brown_glazed_terracotta.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/brown_glazed_terracotta.json new file mode 100644 index 000000000..cca7ba048 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/brown_glazed_terracotta.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/brown_glazed_terracotta" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/brown_mushroom.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/brown_mushroom.json new file mode 100644 index 000000000..6a960e06a --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/brown_mushroom.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/brown_mushroom" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/brown_mushroom_block.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/brown_mushroom_block.json new file mode 100644 index 000000000..7c2d92c67 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/brown_mushroom_block.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/brown_mushroom_block_inventory" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/brown_shulker_box.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/brown_shulker_box.json new file mode 100644 index 000000000..a2be2cc43 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/brown_shulker_box.json @@ -0,0 +1,10 @@ +{ + "model": { + "type": "minecraft:special", + "base": "minecraft:item/brown_shulker_box", + "model": { + "type": "minecraft:shulker_box", + "texture": "minecraft:shulker_brown" + } + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/brown_stained_glass.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/brown_stained_glass.json new file mode 100644 index 000000000..f59814e67 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/brown_stained_glass.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/brown_stained_glass" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/brown_stained_glass_pane.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/brown_stained_glass_pane.json new file mode 100644 index 000000000..43c1d708f --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/brown_stained_glass_pane.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/brown_stained_glass_pane" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/brown_terracotta.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/brown_terracotta.json new file mode 100644 index 000000000..fee80a482 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/brown_terracotta.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/brown_terracotta" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/brown_wool.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/brown_wool.json new file mode 100644 index 000000000..5e4b51ac4 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/brown_wool.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/brown_wool" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/brush.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/brush.json new file mode 100644 index 000000000..a4abc74ae --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/brush.json @@ -0,0 +1,35 @@ +{ + "model": { + "type": "minecraft:range_dispatch", + "entries": [ + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/brush_brushing_0" + }, + "threshold": 0.25 + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/brush_brushing_1" + }, + "threshold": 0.5 + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/brush_brushing_2" + }, + "threshold": 0.75 + } + ], + "fallback": { + "type": "minecraft:model", + "model": "minecraft:item/brush" + }, + "period": 10.0, + "property": "minecraft:use_cycle", + "scale": 0.1 + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/bubble_coral.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/bubble_coral.json new file mode 100644 index 000000000..49349d69f --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/bubble_coral.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/bubble_coral" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/bubble_coral_block.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/bubble_coral_block.json new file mode 100644 index 000000000..c400e05fa --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/bubble_coral_block.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/bubble_coral_block" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/bubble_coral_fan.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/bubble_coral_fan.json new file mode 100644 index 000000000..893c6efe2 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/bubble_coral_fan.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/bubble_coral_fan" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/bucket.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/bucket.json new file mode 100644 index 000000000..f8209d332 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/bucket.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/bucket" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/budding_amethyst.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/budding_amethyst.json new file mode 100644 index 000000000..407a4799e --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/budding_amethyst.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/budding_amethyst" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/bundle.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/bundle.json new file mode 100644 index 000000000..dfeec3e91 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/bundle.json @@ -0,0 +1,39 @@ +{ + "model": { + "type": "minecraft:select", + "cases": [ + { + "model": { + "type": "minecraft:condition", + "on_false": { + "type": "minecraft:model", + "model": "minecraft:item/bundle" + }, + "on_true": { + "type": "minecraft:composite", + "models": [ + { + "type": "minecraft:model", + "model": "minecraft:item/bundle_open_back" + }, + { + "type": "minecraft:bundle/selected_item" + }, + { + "type": "minecraft:model", + "model": "minecraft:item/bundle_open_front" + } + ] + }, + "property": "minecraft:bundle/has_selected_item" + }, + "when": "gui" + } + ], + "fallback": { + "type": "minecraft:model", + "model": "minecraft:item/bundle" + }, + "property": "minecraft:display_context" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/burn_pottery_sherd.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/burn_pottery_sherd.json new file mode 100644 index 000000000..3c39cfc76 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/burn_pottery_sherd.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/burn_pottery_sherd" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/cactus.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/cactus.json new file mode 100644 index 000000000..2b48cc4fa --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/cactus.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/cactus" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/cake.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/cake.json new file mode 100644 index 000000000..9488638c2 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/cake.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/cake" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/calcite.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/calcite.json new file mode 100644 index 000000000..ac9e7ea25 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/calcite.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/calcite" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/calibrated_sculk_sensor.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/calibrated_sculk_sensor.json new file mode 100644 index 000000000..dfe5e99bc --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/calibrated_sculk_sensor.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/calibrated_sculk_sensor_inactive" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/camel_spawn_egg.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/camel_spawn_egg.json new file mode 100644 index 000000000..20b375c94 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/camel_spawn_egg.json @@ -0,0 +1,16 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/template_spawn_egg", + "tints": [ + { + "type": "minecraft:constant", + "value": -212119 + }, + { + "type": "minecraft:constant", + "value": -3435721 + } + ] + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/campfire.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/campfire.json new file mode 100644 index 000000000..9732767ec --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/campfire.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/campfire" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/candle.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/candle.json new file mode 100644 index 000000000..5fc19d0fa --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/candle.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/candle" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/carrot.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/carrot.json new file mode 100644 index 000000000..dc4518072 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/carrot.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/carrot" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/carrot_on_a_stick.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/carrot_on_a_stick.json new file mode 100644 index 000000000..a4105477a --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/carrot_on_a_stick.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/carrot_on_a_stick" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/cartography_table.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/cartography_table.json new file mode 100644 index 000000000..7b67cc843 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/cartography_table.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/cartography_table" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/carved_pumpkin.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/carved_pumpkin.json new file mode 100644 index 000000000..433ef242c --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/carved_pumpkin.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/carved_pumpkin" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/cat_spawn_egg.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/cat_spawn_egg.json new file mode 100644 index 000000000..4a2c56532 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/cat_spawn_egg.json @@ -0,0 +1,16 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/template_spawn_egg", + "tints": [ + { + "type": "minecraft:constant", + "value": -1062770 + }, + { + "type": "minecraft:constant", + "value": -6983082 + } + ] + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/cauldron.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/cauldron.json new file mode 100644 index 000000000..2d4a84c9b --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/cauldron.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/cauldron" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/cave_spider_spawn_egg.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/cave_spider_spawn_egg.json new file mode 100644 index 000000000..3577909ba --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/cave_spider_spawn_egg.json @@ -0,0 +1,16 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/template_spawn_egg", + "tints": [ + { + "type": "minecraft:constant", + "value": -15973810 + }, + { + "type": "minecraft:constant", + "value": -5763570 + } + ] + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/chain.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/chain.json new file mode 100644 index 000000000..a8abebe6d --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/chain.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/chain" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/chain_command_block.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/chain_command_block.json new file mode 100644 index 000000000..068829ed9 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/chain_command_block.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/chain_command_block" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/chainmail_boots.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/chainmail_boots.json new file mode 100644 index 000000000..991ffb60a --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/chainmail_boots.json @@ -0,0 +1,89 @@ +{ + "model": { + "type": "minecraft:select", + "cases": [ + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/chainmail_boots_quartz_trim" + }, + "when": "minecraft:quartz" + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/chainmail_boots_iron_trim" + }, + "when": "minecraft:iron" + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/chainmail_boots_netherite_trim" + }, + "when": "minecraft:netherite" + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/chainmail_boots_redstone_trim" + }, + "when": "minecraft:redstone" + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/chainmail_boots_copper_trim" + }, + "when": "minecraft:copper" + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/chainmail_boots_gold_trim" + }, + "when": "minecraft:gold" + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/chainmail_boots_emerald_trim" + }, + "when": "minecraft:emerald" + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/chainmail_boots_diamond_trim" + }, + "when": "minecraft:diamond" + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/chainmail_boots_lapis_trim" + }, + "when": "minecraft:lapis" + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/chainmail_boots_amethyst_trim" + }, + "when": "minecraft:amethyst" + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/chainmail_boots_resin_trim" + }, + "when": "minecraft:resin" + } + ], + "fallback": { + "type": "minecraft:model", + "model": "minecraft:item/chainmail_boots" + }, + "property": "minecraft:trim_material" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/chainmail_chestplate.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/chainmail_chestplate.json new file mode 100644 index 000000000..6f9019861 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/chainmail_chestplate.json @@ -0,0 +1,89 @@ +{ + "model": { + "type": "minecraft:select", + "cases": [ + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/chainmail_chestplate_quartz_trim" + }, + "when": "minecraft:quartz" + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/chainmail_chestplate_iron_trim" + }, + "when": "minecraft:iron" + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/chainmail_chestplate_netherite_trim" + }, + "when": "minecraft:netherite" + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/chainmail_chestplate_redstone_trim" + }, + "when": "minecraft:redstone" + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/chainmail_chestplate_copper_trim" + }, + "when": "minecraft:copper" + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/chainmail_chestplate_gold_trim" + }, + "when": "minecraft:gold" + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/chainmail_chestplate_emerald_trim" + }, + "when": "minecraft:emerald" + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/chainmail_chestplate_diamond_trim" + }, + "when": "minecraft:diamond" + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/chainmail_chestplate_lapis_trim" + }, + "when": "minecraft:lapis" + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/chainmail_chestplate_amethyst_trim" + }, + "when": "minecraft:amethyst" + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/chainmail_chestplate_resin_trim" + }, + "when": "minecraft:resin" + } + ], + "fallback": { + "type": "minecraft:model", + "model": "minecraft:item/chainmail_chestplate" + }, + "property": "minecraft:trim_material" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/chainmail_helmet.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/chainmail_helmet.json new file mode 100644 index 000000000..7f88b1a35 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/chainmail_helmet.json @@ -0,0 +1,89 @@ +{ + "model": { + "type": "minecraft:select", + "cases": [ + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/chainmail_helmet_quartz_trim" + }, + "when": "minecraft:quartz" + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/chainmail_helmet_iron_trim" + }, + "when": "minecraft:iron" + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/chainmail_helmet_netherite_trim" + }, + "when": "minecraft:netherite" + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/chainmail_helmet_redstone_trim" + }, + "when": "minecraft:redstone" + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/chainmail_helmet_copper_trim" + }, + "when": "minecraft:copper" + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/chainmail_helmet_gold_trim" + }, + "when": "minecraft:gold" + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/chainmail_helmet_emerald_trim" + }, + "when": "minecraft:emerald" + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/chainmail_helmet_diamond_trim" + }, + "when": "minecraft:diamond" + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/chainmail_helmet_lapis_trim" + }, + "when": "minecraft:lapis" + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/chainmail_helmet_amethyst_trim" + }, + "when": "minecraft:amethyst" + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/chainmail_helmet_resin_trim" + }, + "when": "minecraft:resin" + } + ], + "fallback": { + "type": "minecraft:model", + "model": "minecraft:item/chainmail_helmet" + }, + "property": "minecraft:trim_material" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/chainmail_leggings.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/chainmail_leggings.json new file mode 100644 index 000000000..7baa08494 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/chainmail_leggings.json @@ -0,0 +1,89 @@ +{ + "model": { + "type": "minecraft:select", + "cases": [ + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/chainmail_leggings_quartz_trim" + }, + "when": "minecraft:quartz" + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/chainmail_leggings_iron_trim" + }, + "when": "minecraft:iron" + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/chainmail_leggings_netherite_trim" + }, + "when": "minecraft:netherite" + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/chainmail_leggings_redstone_trim" + }, + "when": "minecraft:redstone" + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/chainmail_leggings_copper_trim" + }, + "when": "minecraft:copper" + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/chainmail_leggings_gold_trim" + }, + "when": "minecraft:gold" + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/chainmail_leggings_emerald_trim" + }, + "when": "minecraft:emerald" + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/chainmail_leggings_diamond_trim" + }, + "when": "minecraft:diamond" + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/chainmail_leggings_lapis_trim" + }, + "when": "minecraft:lapis" + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/chainmail_leggings_amethyst_trim" + }, + "when": "minecraft:amethyst" + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/chainmail_leggings_resin_trim" + }, + "when": "minecraft:resin" + } + ], + "fallback": { + "type": "minecraft:model", + "model": "minecraft:item/chainmail_leggings" + }, + "property": "minecraft:trim_material" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/charcoal.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/charcoal.json new file mode 100644 index 000000000..7e2650ad1 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/charcoal.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/charcoal" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/cherry_boat.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/cherry_boat.json new file mode 100644 index 000000000..97018953a --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/cherry_boat.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/cherry_boat" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/cherry_button.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/cherry_button.json new file mode 100644 index 000000000..51ac6149f --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/cherry_button.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/cherry_button_inventory" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/cherry_chest_boat.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/cherry_chest_boat.json new file mode 100644 index 000000000..b40831e0b --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/cherry_chest_boat.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/cherry_chest_boat" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/cherry_door.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/cherry_door.json new file mode 100644 index 000000000..214c05e67 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/cherry_door.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/cherry_door" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/cherry_fence.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/cherry_fence.json new file mode 100644 index 000000000..d96d0654c --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/cherry_fence.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/cherry_fence_inventory" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/cherry_fence_gate.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/cherry_fence_gate.json new file mode 100644 index 000000000..90201f4ad --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/cherry_fence_gate.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/cherry_fence_gate" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/cherry_hanging_sign.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/cherry_hanging_sign.json new file mode 100644 index 000000000..5088fec86 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/cherry_hanging_sign.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/cherry_hanging_sign" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/cherry_leaves.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/cherry_leaves.json new file mode 100644 index 000000000..dac17a9cd --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/cherry_leaves.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/cherry_leaves" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/cherry_log.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/cherry_log.json new file mode 100644 index 000000000..a0a2dfb89 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/cherry_log.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/cherry_log" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/cherry_planks.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/cherry_planks.json new file mode 100644 index 000000000..e1b9f3646 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/cherry_planks.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/cherry_planks" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/cherry_pressure_plate.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/cherry_pressure_plate.json new file mode 100644 index 000000000..de6054bfa --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/cherry_pressure_plate.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/cherry_pressure_plate" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/cherry_sapling.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/cherry_sapling.json new file mode 100644 index 000000000..7943de2b4 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/cherry_sapling.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/cherry_sapling" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/cherry_sign.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/cherry_sign.json new file mode 100644 index 000000000..a43d71ada --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/cherry_sign.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/cherry_sign" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/cherry_slab.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/cherry_slab.json new file mode 100644 index 000000000..91dcbb80c --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/cherry_slab.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/cherry_slab" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/cherry_stairs.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/cherry_stairs.json new file mode 100644 index 000000000..e7f74ae1e --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/cherry_stairs.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/cherry_stairs" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/cherry_trapdoor.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/cherry_trapdoor.json new file mode 100644 index 000000000..4b09f105e --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/cherry_trapdoor.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/cherry_trapdoor_bottom" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/cherry_wood.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/cherry_wood.json new file mode 100644 index 000000000..f23d6a629 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/cherry_wood.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/cherry_wood" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/chest.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/chest.json new file mode 100644 index 000000000..5e4ef78c0 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/chest.json @@ -0,0 +1,32 @@ +{ + "model": { + "type": "minecraft:select", + "cases": [ + { + "model": { + "type": "minecraft:special", + "base": "minecraft:item/chest", + "model": { + "type": "minecraft:chest", + "texture": "minecraft:christmas" + } + }, + "when": [ + "12-24", + "12-25", + "12-26" + ] + } + ], + "fallback": { + "type": "minecraft:special", + "base": "minecraft:item/chest", + "model": { + "type": "minecraft:chest", + "texture": "minecraft:normal" + } + }, + "pattern": "MM-dd", + "property": "minecraft:local_time" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/chest_minecart.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/chest_minecart.json new file mode 100644 index 000000000..3711836ac --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/chest_minecart.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/chest_minecart" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/chicken.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/chicken.json new file mode 100644 index 000000000..908f6d531 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/chicken.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/chicken" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/chicken_spawn_egg.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/chicken_spawn_egg.json new file mode 100644 index 000000000..2f3596c27 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/chicken_spawn_egg.json @@ -0,0 +1,16 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/template_spawn_egg", + "tints": [ + { + "type": "minecraft:constant", + "value": -6184543 + }, + { + "type": "minecraft:constant", + "value": -65536 + } + ] + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/chipped_anvil.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/chipped_anvil.json new file mode 100644 index 000000000..868455686 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/chipped_anvil.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/chipped_anvil" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/chiseled_bookshelf.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/chiseled_bookshelf.json new file mode 100644 index 000000000..9ba95e03c --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/chiseled_bookshelf.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/chiseled_bookshelf_inventory" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/chiseled_copper.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/chiseled_copper.json new file mode 100644 index 000000000..99d4996d5 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/chiseled_copper.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/chiseled_copper" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/chiseled_deepslate.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/chiseled_deepslate.json new file mode 100644 index 000000000..116f921f2 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/chiseled_deepslate.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/chiseled_deepslate" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/chiseled_nether_bricks.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/chiseled_nether_bricks.json new file mode 100644 index 000000000..95709a06c --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/chiseled_nether_bricks.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/chiseled_nether_bricks" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/chiseled_polished_blackstone.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/chiseled_polished_blackstone.json new file mode 100644 index 000000000..1d9b8c735 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/chiseled_polished_blackstone.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/chiseled_polished_blackstone" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/chiseled_quartz_block.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/chiseled_quartz_block.json new file mode 100644 index 000000000..508004a59 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/chiseled_quartz_block.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/chiseled_quartz_block" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/chiseled_red_sandstone.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/chiseled_red_sandstone.json new file mode 100644 index 000000000..cb5409ac9 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/chiseled_red_sandstone.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/chiseled_red_sandstone" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/chiseled_resin_bricks.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/chiseled_resin_bricks.json new file mode 100644 index 000000000..26416f11c --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/chiseled_resin_bricks.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/chiseled_resin_bricks" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/chiseled_sandstone.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/chiseled_sandstone.json new file mode 100644 index 000000000..c893eed63 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/chiseled_sandstone.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/chiseled_sandstone" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/chiseled_stone_bricks.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/chiseled_stone_bricks.json new file mode 100644 index 000000000..0001e6708 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/chiseled_stone_bricks.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/chiseled_stone_bricks" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/chiseled_tuff.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/chiseled_tuff.json new file mode 100644 index 000000000..85401994a --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/chiseled_tuff.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/chiseled_tuff" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/chiseled_tuff_bricks.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/chiseled_tuff_bricks.json new file mode 100644 index 000000000..94632a0f8 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/chiseled_tuff_bricks.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/chiseled_tuff_bricks" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/chorus_flower.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/chorus_flower.json new file mode 100644 index 000000000..a33bde47d --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/chorus_flower.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/chorus_flower" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/chorus_fruit.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/chorus_fruit.json new file mode 100644 index 000000000..65ad83c5a --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/chorus_fruit.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/chorus_fruit" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/chorus_plant.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/chorus_plant.json new file mode 100644 index 000000000..21a15f44a --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/chorus_plant.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/chorus_plant" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/clay.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/clay.json new file mode 100644 index 000000000..bacfc9378 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/clay.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/clay" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/clay_ball.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/clay_ball.json new file mode 100644 index 000000000..e8f64c098 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/clay_ball.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/clay_ball" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/clock.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/clock.json new file mode 100644 index 000000000..0d6f44d8f --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/clock.json @@ -0,0 +1,937 @@ +{ + "model": { + "type": "minecraft:select", + "cases": [ + { + "model": { + "type": "minecraft:range_dispatch", + "entries": [ + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/clock_00" + }, + "threshold": 0.0 + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/clock_01" + }, + "threshold": 0.5 + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/clock_02" + }, + "threshold": 1.5 + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/clock_03" + }, + "threshold": 2.5 + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/clock_04" + }, + "threshold": 3.5 + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/clock_05" + }, + "threshold": 4.5 + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/clock_06" + }, + "threshold": 5.5 + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/clock_07" + }, + "threshold": 6.5 + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/clock_08" + }, + "threshold": 7.5 + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/clock_09" + }, + "threshold": 8.5 + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/clock_10" + }, + "threshold": 9.5 + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/clock_11" + }, + "threshold": 10.5 + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/clock_12" + }, + "threshold": 11.5 + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/clock_13" + }, + "threshold": 12.5 + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/clock_14" + }, + "threshold": 13.5 + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/clock_15" + }, + "threshold": 14.5 + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/clock_16" + }, + "threshold": 15.5 + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/clock_17" + }, + "threshold": 16.5 + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/clock_18" + }, + "threshold": 17.5 + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/clock_19" + }, + "threshold": 18.5 + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/clock_20" + }, + "threshold": 19.5 + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/clock_21" + }, + "threshold": 20.5 + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/clock_22" + }, + "threshold": 21.5 + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/clock_23" + }, + "threshold": 22.5 + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/clock_24" + }, + "threshold": 23.5 + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/clock_25" + }, + "threshold": 24.5 + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/clock_26" + }, + "threshold": 25.5 + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/clock_27" + }, + "threshold": 26.5 + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/clock_28" + }, + "threshold": 27.5 + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/clock_29" + }, + "threshold": 28.5 + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/clock_30" + }, + "threshold": 29.5 + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/clock_31" + }, + "threshold": 30.5 + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/clock_32" + }, + "threshold": 31.5 + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/clock_33" + }, + "threshold": 32.5 + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/clock_34" + }, + "threshold": 33.5 + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/clock_35" + }, + "threshold": 34.5 + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/clock_36" + }, + "threshold": 35.5 + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/clock_37" + }, + "threshold": 36.5 + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/clock_38" + }, + "threshold": 37.5 + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/clock_39" + }, + "threshold": 38.5 + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/clock_40" + }, + "threshold": 39.5 + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/clock_41" + }, + "threshold": 40.5 + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/clock_42" + }, + "threshold": 41.5 + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/clock_43" + }, + "threshold": 42.5 + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/clock_44" + }, + "threshold": 43.5 + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/clock_45" + }, + "threshold": 44.5 + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/clock_46" + }, + "threshold": 45.5 + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/clock_47" + }, + "threshold": 46.5 + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/clock_48" + }, + "threshold": 47.5 + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/clock_49" + }, + "threshold": 48.5 + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/clock_50" + }, + "threshold": 49.5 + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/clock_51" + }, + "threshold": 50.5 + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/clock_52" + }, + "threshold": 51.5 + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/clock_53" + }, + "threshold": 52.5 + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/clock_54" + }, + "threshold": 53.5 + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/clock_55" + }, + "threshold": 54.5 + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/clock_56" + }, + "threshold": 55.5 + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/clock_57" + }, + "threshold": 56.5 + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/clock_58" + }, + "threshold": 57.5 + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/clock_59" + }, + "threshold": 58.5 + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/clock_60" + }, + "threshold": 59.5 + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/clock_61" + }, + "threshold": 60.5 + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/clock_62" + }, + "threshold": 61.5 + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/clock_63" + }, + "threshold": 62.5 + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/clock_00" + }, + "threshold": 63.5 + } + ], + "property": "minecraft:time", + "scale": 64.0, + "source": "daytime" + }, + "when": "minecraft:overworld" + } + ], + "fallback": { + "type": "minecraft:range_dispatch", + "entries": [ + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/clock_00" + }, + "threshold": 0.0 + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/clock_01" + }, + "threshold": 0.5 + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/clock_02" + }, + "threshold": 1.5 + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/clock_03" + }, + "threshold": 2.5 + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/clock_04" + }, + "threshold": 3.5 + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/clock_05" + }, + "threshold": 4.5 + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/clock_06" + }, + "threshold": 5.5 + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/clock_07" + }, + "threshold": 6.5 + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/clock_08" + }, + "threshold": 7.5 + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/clock_09" + }, + "threshold": 8.5 + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/clock_10" + }, + "threshold": 9.5 + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/clock_11" + }, + "threshold": 10.5 + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/clock_12" + }, + "threshold": 11.5 + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/clock_13" + }, + "threshold": 12.5 + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/clock_14" + }, + "threshold": 13.5 + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/clock_15" + }, + "threshold": 14.5 + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/clock_16" + }, + "threshold": 15.5 + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/clock_17" + }, + "threshold": 16.5 + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/clock_18" + }, + "threshold": 17.5 + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/clock_19" + }, + "threshold": 18.5 + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/clock_20" + }, + "threshold": 19.5 + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/clock_21" + }, + "threshold": 20.5 + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/clock_22" + }, + "threshold": 21.5 + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/clock_23" + }, + "threshold": 22.5 + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/clock_24" + }, + "threshold": 23.5 + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/clock_25" + }, + "threshold": 24.5 + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/clock_26" + }, + "threshold": 25.5 + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/clock_27" + }, + "threshold": 26.5 + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/clock_28" + }, + "threshold": 27.5 + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/clock_29" + }, + "threshold": 28.5 + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/clock_30" + }, + "threshold": 29.5 + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/clock_31" + }, + "threshold": 30.5 + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/clock_32" + }, + "threshold": 31.5 + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/clock_33" + }, + "threshold": 32.5 + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/clock_34" + }, + "threshold": 33.5 + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/clock_35" + }, + "threshold": 34.5 + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/clock_36" + }, + "threshold": 35.5 + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/clock_37" + }, + "threshold": 36.5 + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/clock_38" + }, + "threshold": 37.5 + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/clock_39" + }, + "threshold": 38.5 + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/clock_40" + }, + "threshold": 39.5 + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/clock_41" + }, + "threshold": 40.5 + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/clock_42" + }, + "threshold": 41.5 + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/clock_43" + }, + "threshold": 42.5 + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/clock_44" + }, + "threshold": 43.5 + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/clock_45" + }, + "threshold": 44.5 + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/clock_46" + }, + "threshold": 45.5 + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/clock_47" + }, + "threshold": 46.5 + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/clock_48" + }, + "threshold": 47.5 + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/clock_49" + }, + "threshold": 48.5 + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/clock_50" + }, + "threshold": 49.5 + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/clock_51" + }, + "threshold": 50.5 + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/clock_52" + }, + "threshold": 51.5 + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/clock_53" + }, + "threshold": 52.5 + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/clock_54" + }, + "threshold": 53.5 + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/clock_55" + }, + "threshold": 54.5 + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/clock_56" + }, + "threshold": 55.5 + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/clock_57" + }, + "threshold": 56.5 + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/clock_58" + }, + "threshold": 57.5 + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/clock_59" + }, + "threshold": 58.5 + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/clock_60" + }, + "threshold": 59.5 + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/clock_61" + }, + "threshold": 60.5 + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/clock_62" + }, + "threshold": 61.5 + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/clock_63" + }, + "threshold": 62.5 + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/clock_00" + }, + "threshold": 63.5 + } + ], + "property": "minecraft:time", + "scale": 64.0, + "source": "random" + }, + "property": "minecraft:context_dimension" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/closed_eyeblossom.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/closed_eyeblossom.json new file mode 100644 index 000000000..136145b5c --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/closed_eyeblossom.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/closed_eyeblossom" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/coal.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/coal.json new file mode 100644 index 000000000..0566981fc --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/coal.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/coal" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/coal_block.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/coal_block.json new file mode 100644 index 000000000..f970b5e87 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/coal_block.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/coal_block" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/coal_ore.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/coal_ore.json new file mode 100644 index 000000000..fe51726ed --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/coal_ore.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/coal_ore" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/coarse_dirt.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/coarse_dirt.json new file mode 100644 index 000000000..03a9d9845 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/coarse_dirt.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/coarse_dirt" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/coast_armor_trim_smithing_template.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/coast_armor_trim_smithing_template.json new file mode 100644 index 000000000..9e34212cc --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/coast_armor_trim_smithing_template.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/coast_armor_trim_smithing_template" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/cobbled_deepslate.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/cobbled_deepslate.json new file mode 100644 index 000000000..ff8306379 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/cobbled_deepslate.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/cobbled_deepslate" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/cobbled_deepslate_slab.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/cobbled_deepslate_slab.json new file mode 100644 index 000000000..c3ac1ae1f --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/cobbled_deepslate_slab.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/cobbled_deepslate_slab" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/cobbled_deepslate_stairs.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/cobbled_deepslate_stairs.json new file mode 100644 index 000000000..3ee9e6fdf --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/cobbled_deepslate_stairs.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/cobbled_deepslate_stairs" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/cobbled_deepslate_wall.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/cobbled_deepslate_wall.json new file mode 100644 index 000000000..97c02a347 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/cobbled_deepslate_wall.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/cobbled_deepslate_wall_inventory" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/cobblestone.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/cobblestone.json new file mode 100644 index 000000000..3bee3d364 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/cobblestone.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/cobblestone" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/cobblestone_slab.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/cobblestone_slab.json new file mode 100644 index 000000000..36c47e67d --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/cobblestone_slab.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/cobblestone_slab" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/cobblestone_stairs.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/cobblestone_stairs.json new file mode 100644 index 000000000..44b025616 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/cobblestone_stairs.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/cobblestone_stairs" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/cobblestone_wall.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/cobblestone_wall.json new file mode 100644 index 000000000..edc14d448 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/cobblestone_wall.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/cobblestone_wall_inventory" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/cobweb.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/cobweb.json new file mode 100644 index 000000000..ce2319b78 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/cobweb.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/cobweb" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/cocoa_beans.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/cocoa_beans.json new file mode 100644 index 000000000..a3c054a4c --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/cocoa_beans.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/cocoa_beans" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/cod.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/cod.json new file mode 100644 index 000000000..3f0aac7af --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/cod.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/cod" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/cod_bucket.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/cod_bucket.json new file mode 100644 index 000000000..967b87f18 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/cod_bucket.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/cod_bucket" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/cod_spawn_egg.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/cod_spawn_egg.json new file mode 100644 index 000000000..f556e0ef1 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/cod_spawn_egg.json @@ -0,0 +1,16 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/template_spawn_egg", + "tints": [ + { + "type": "minecraft:constant", + "value": -4085910 + }, + { + "type": "minecraft:constant", + "value": -1719157 + } + ] + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/command_block.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/command_block.json new file mode 100644 index 000000000..7e5c23d2d --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/command_block.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/command_block" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/command_block_minecart.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/command_block_minecart.json new file mode 100644 index 000000000..2ce1c002d --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/command_block_minecart.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/command_block_minecart" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/comparator.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/comparator.json new file mode 100644 index 000000000..cc2d4f1fb --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/comparator.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/comparator" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/compass.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/compass.json new file mode 100644 index 000000000..96043c807 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/compass.json @@ -0,0 +1,733 @@ +{ + "model": { + "type": "minecraft:condition", + "component": "minecraft:lodestone_tracker", + "on_false": { + "type": "minecraft:select", + "cases": [ + { + "model": { + "type": "minecraft:range_dispatch", + "entries": [ + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/compass_16" + }, + "threshold": 0.0 + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/compass_17" + }, + "threshold": 0.5 + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/compass_18" + }, + "threshold": 1.5 + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/compass_19" + }, + "threshold": 2.5 + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/compass_20" + }, + "threshold": 3.5 + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/compass_21" + }, + "threshold": 4.5 + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/compass_22" + }, + "threshold": 5.5 + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/compass_23" + }, + "threshold": 6.5 + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/compass_24" + }, + "threshold": 7.5 + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/compass_25" + }, + "threshold": 8.5 + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/compass_26" + }, + "threshold": 9.5 + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/compass_27" + }, + "threshold": 10.5 + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/compass_28" + }, + "threshold": 11.5 + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/compass_29" + }, + "threshold": 12.5 + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/compass_30" + }, + "threshold": 13.5 + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/compass_31" + }, + "threshold": 14.5 + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/compass_00" + }, + "threshold": 15.5 + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/compass_01" + }, + "threshold": 16.5 + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/compass_02" + }, + "threshold": 17.5 + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/compass_03" + }, + "threshold": 18.5 + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/compass_04" + }, + "threshold": 19.5 + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/compass_05" + }, + "threshold": 20.5 + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/compass_06" + }, + "threshold": 21.5 + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/compass_07" + }, + "threshold": 22.5 + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/compass_08" + }, + "threshold": 23.5 + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/compass_09" + }, + "threshold": 24.5 + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/compass_10" + }, + "threshold": 25.5 + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/compass_11" + }, + "threshold": 26.5 + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/compass_12" + }, + "threshold": 27.5 + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/compass_13" + }, + "threshold": 28.5 + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/compass_14" + }, + "threshold": 29.5 + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/compass_15" + }, + "threshold": 30.5 + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/compass_16" + }, + "threshold": 31.5 + } + ], + "property": "minecraft:compass", + "scale": 32.0, + "target": "spawn" + }, + "when": "minecraft:overworld" + } + ], + "fallback": { + "type": "minecraft:range_dispatch", + "entries": [ + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/compass_16" + }, + "threshold": 0.0 + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/compass_17" + }, + "threshold": 0.5 + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/compass_18" + }, + "threshold": 1.5 + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/compass_19" + }, + "threshold": 2.5 + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/compass_20" + }, + "threshold": 3.5 + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/compass_21" + }, + "threshold": 4.5 + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/compass_22" + }, + "threshold": 5.5 + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/compass_23" + }, + "threshold": 6.5 + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/compass_24" + }, + "threshold": 7.5 + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/compass_25" + }, + "threshold": 8.5 + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/compass_26" + }, + "threshold": 9.5 + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/compass_27" + }, + "threshold": 10.5 + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/compass_28" + }, + "threshold": 11.5 + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/compass_29" + }, + "threshold": 12.5 + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/compass_30" + }, + "threshold": 13.5 + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/compass_31" + }, + "threshold": 14.5 + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/compass_00" + }, + "threshold": 15.5 + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/compass_01" + }, + "threshold": 16.5 + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/compass_02" + }, + "threshold": 17.5 + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/compass_03" + }, + "threshold": 18.5 + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/compass_04" + }, + "threshold": 19.5 + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/compass_05" + }, + "threshold": 20.5 + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/compass_06" + }, + "threshold": 21.5 + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/compass_07" + }, + "threshold": 22.5 + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/compass_08" + }, + "threshold": 23.5 + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/compass_09" + }, + "threshold": 24.5 + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/compass_10" + }, + "threshold": 25.5 + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/compass_11" + }, + "threshold": 26.5 + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/compass_12" + }, + "threshold": 27.5 + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/compass_13" + }, + "threshold": 28.5 + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/compass_14" + }, + "threshold": 29.5 + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/compass_15" + }, + "threshold": 30.5 + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/compass_16" + }, + "threshold": 31.5 + } + ], + "property": "minecraft:compass", + "scale": 32.0, + "target": "none" + }, + "property": "minecraft:context_dimension" + }, + "on_true": { + "type": "minecraft:range_dispatch", + "entries": [ + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/compass_16" + }, + "threshold": 0.0 + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/compass_17" + }, + "threshold": 0.5 + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/compass_18" + }, + "threshold": 1.5 + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/compass_19" + }, + "threshold": 2.5 + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/compass_20" + }, + "threshold": 3.5 + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/compass_21" + }, + "threshold": 4.5 + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/compass_22" + }, + "threshold": 5.5 + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/compass_23" + }, + "threshold": 6.5 + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/compass_24" + }, + "threshold": 7.5 + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/compass_25" + }, + "threshold": 8.5 + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/compass_26" + }, + "threshold": 9.5 + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/compass_27" + }, + "threshold": 10.5 + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/compass_28" + }, + "threshold": 11.5 + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/compass_29" + }, + "threshold": 12.5 + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/compass_30" + }, + "threshold": 13.5 + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/compass_31" + }, + "threshold": 14.5 + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/compass_00" + }, + "threshold": 15.5 + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/compass_01" + }, + "threshold": 16.5 + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/compass_02" + }, + "threshold": 17.5 + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/compass_03" + }, + "threshold": 18.5 + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/compass_04" + }, + "threshold": 19.5 + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/compass_05" + }, + "threshold": 20.5 + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/compass_06" + }, + "threshold": 21.5 + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/compass_07" + }, + "threshold": 22.5 + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/compass_08" + }, + "threshold": 23.5 + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/compass_09" + }, + "threshold": 24.5 + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/compass_10" + }, + "threshold": 25.5 + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/compass_11" + }, + "threshold": 26.5 + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/compass_12" + }, + "threshold": 27.5 + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/compass_13" + }, + "threshold": 28.5 + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/compass_14" + }, + "threshold": 29.5 + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/compass_15" + }, + "threshold": 30.5 + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/compass_16" + }, + "threshold": 31.5 + } + ], + "property": "minecraft:compass", + "scale": 32.0, + "target": "lodestone" + }, + "property": "minecraft:has_component" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/composter.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/composter.json new file mode 100644 index 000000000..875bef79a --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/composter.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/composter" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/conduit.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/conduit.json new file mode 100644 index 000000000..d5c87e900 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/conduit.json @@ -0,0 +1,9 @@ +{ + "model": { + "type": "minecraft:special", + "base": "minecraft:item/conduit", + "model": { + "type": "minecraft:conduit" + } + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/cooked_beef.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/cooked_beef.json new file mode 100644 index 000000000..cc5cb0215 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/cooked_beef.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/cooked_beef" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/cooked_chicken.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/cooked_chicken.json new file mode 100644 index 000000000..3020db999 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/cooked_chicken.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/cooked_chicken" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/cooked_cod.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/cooked_cod.json new file mode 100644 index 000000000..4797e5788 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/cooked_cod.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/cooked_cod" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/cooked_mutton.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/cooked_mutton.json new file mode 100644 index 000000000..3171e1c22 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/cooked_mutton.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/cooked_mutton" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/cooked_porkchop.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/cooked_porkchop.json new file mode 100644 index 000000000..57146f2e0 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/cooked_porkchop.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/cooked_porkchop" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/cooked_rabbit.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/cooked_rabbit.json new file mode 100644 index 000000000..1284ba18e --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/cooked_rabbit.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/cooked_rabbit" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/cooked_salmon.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/cooked_salmon.json new file mode 100644 index 000000000..7a6c01056 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/cooked_salmon.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/cooked_salmon" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/cookie.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/cookie.json new file mode 100644 index 000000000..de14c9c80 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/cookie.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/cookie" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/copper_block.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/copper_block.json new file mode 100644 index 000000000..5060ed21a --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/copper_block.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/copper_block" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/copper_bulb.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/copper_bulb.json new file mode 100644 index 000000000..feafbf2c1 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/copper_bulb.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/copper_bulb" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/copper_door.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/copper_door.json new file mode 100644 index 000000000..6bc75ee4d --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/copper_door.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/copper_door" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/copper_grate.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/copper_grate.json new file mode 100644 index 000000000..7d9789bce --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/copper_grate.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/copper_grate" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/copper_ingot.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/copper_ingot.json new file mode 100644 index 000000000..e96004782 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/copper_ingot.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/copper_ingot" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/copper_ore.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/copper_ore.json new file mode 100644 index 000000000..1e6e607a9 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/copper_ore.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/copper_ore" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/copper_trapdoor.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/copper_trapdoor.json new file mode 100644 index 000000000..03981dc9b --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/copper_trapdoor.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/copper_trapdoor_bottom" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/cornflower.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/cornflower.json new file mode 100644 index 000000000..d2574a752 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/cornflower.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/cornflower" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/cow_spawn_egg.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/cow_spawn_egg.json new file mode 100644 index 000000000..b0e9ab088 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/cow_spawn_egg.json @@ -0,0 +1,16 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/template_spawn_egg", + "tints": [ + { + "type": "minecraft:constant", + "value": -12306906 + }, + { + "type": "minecraft:constant", + "value": -6184543 + } + ] + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/cracked_deepslate_bricks.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/cracked_deepslate_bricks.json new file mode 100644 index 000000000..65f9968cd --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/cracked_deepslate_bricks.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/cracked_deepslate_bricks" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/cracked_deepslate_tiles.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/cracked_deepslate_tiles.json new file mode 100644 index 000000000..6776f026f --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/cracked_deepslate_tiles.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/cracked_deepslate_tiles" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/cracked_nether_bricks.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/cracked_nether_bricks.json new file mode 100644 index 000000000..17b2f4a21 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/cracked_nether_bricks.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/cracked_nether_bricks" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/cracked_polished_blackstone_bricks.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/cracked_polished_blackstone_bricks.json new file mode 100644 index 000000000..c62bb99cf --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/cracked_polished_blackstone_bricks.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/cracked_polished_blackstone_bricks" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/cracked_stone_bricks.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/cracked_stone_bricks.json new file mode 100644 index 000000000..0d27cdde0 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/cracked_stone_bricks.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/cracked_stone_bricks" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/crafter.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/crafter.json new file mode 100644 index 000000000..946645919 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/crafter.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/crafter" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/crafting_table.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/crafting_table.json new file mode 100644 index 000000000..4b3440108 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/crafting_table.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/crafting_table" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/creaking_heart.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/creaking_heart.json new file mode 100644 index 000000000..9948ea1c6 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/creaking_heart.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/creaking_heart" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/creaking_spawn_egg.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/creaking_spawn_egg.json new file mode 100644 index 000000000..66355bea9 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/creaking_spawn_egg.json @@ -0,0 +1,16 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/template_spawn_egg", + "tints": [ + { + "type": "minecraft:constant", + "value": -10526881 + }, + { + "type": "minecraft:constant", + "value": -231406 + } + ] + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/creeper_banner_pattern.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/creeper_banner_pattern.json new file mode 100644 index 000000000..27a4d07e8 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/creeper_banner_pattern.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/creeper_banner_pattern" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/creeper_head.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/creeper_head.json new file mode 100644 index 000000000..f6f751723 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/creeper_head.json @@ -0,0 +1,10 @@ +{ + "model": { + "type": "minecraft:special", + "base": "minecraft:item/template_skull", + "model": { + "type": "minecraft:head", + "kind": "creeper" + } + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/creeper_spawn_egg.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/creeper_spawn_egg.json new file mode 100644 index 000000000..b46f7a58c --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/creeper_spawn_egg.json @@ -0,0 +1,16 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/template_spawn_egg", + "tints": [ + { + "type": "minecraft:constant", + "value": -15882485 + }, + { + "type": "minecraft:constant", + "value": -16777216 + } + ] + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/crimson_button.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/crimson_button.json new file mode 100644 index 000000000..2cdecbd06 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/crimson_button.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/crimson_button_inventory" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/crimson_door.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/crimson_door.json new file mode 100644 index 000000000..1240cf332 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/crimson_door.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/crimson_door" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/crimson_fence.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/crimson_fence.json new file mode 100644 index 000000000..812852a24 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/crimson_fence.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/crimson_fence_inventory" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/crimson_fence_gate.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/crimson_fence_gate.json new file mode 100644 index 000000000..88baf9086 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/crimson_fence_gate.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/crimson_fence_gate" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/crimson_fungus.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/crimson_fungus.json new file mode 100644 index 000000000..b6a089cc2 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/crimson_fungus.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/crimson_fungus" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/crimson_hanging_sign.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/crimson_hanging_sign.json new file mode 100644 index 000000000..04e82b760 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/crimson_hanging_sign.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/crimson_hanging_sign" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/crimson_hyphae.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/crimson_hyphae.json new file mode 100644 index 000000000..7f024ebf2 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/crimson_hyphae.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/crimson_hyphae" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/crimson_nylium.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/crimson_nylium.json new file mode 100644 index 000000000..75856f32a --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/crimson_nylium.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/crimson_nylium" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/crimson_planks.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/crimson_planks.json new file mode 100644 index 000000000..e56ca28b7 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/crimson_planks.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/crimson_planks" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/crimson_pressure_plate.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/crimson_pressure_plate.json new file mode 100644 index 000000000..ca86d5950 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/crimson_pressure_plate.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/crimson_pressure_plate" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/crimson_roots.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/crimson_roots.json new file mode 100644 index 000000000..80a592a71 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/crimson_roots.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/crimson_roots" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/crimson_sign.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/crimson_sign.json new file mode 100644 index 000000000..3d72a4816 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/crimson_sign.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/crimson_sign" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/crimson_slab.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/crimson_slab.json new file mode 100644 index 000000000..816e9385e --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/crimson_slab.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/crimson_slab" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/crimson_stairs.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/crimson_stairs.json new file mode 100644 index 000000000..205a62f9e --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/crimson_stairs.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/crimson_stairs" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/crimson_stem.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/crimson_stem.json new file mode 100644 index 000000000..4658241ca --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/crimson_stem.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/crimson_stem" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/crimson_trapdoor.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/crimson_trapdoor.json new file mode 100644 index 000000000..c11a4fd81 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/crimson_trapdoor.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/crimson_trapdoor_bottom" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/crossbow.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/crossbow.json new file mode 100644 index 000000000..3fd76bea6 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/crossbow.json @@ -0,0 +1,54 @@ +{ + "model": { + "type": "minecraft:condition", + "on_false": { + "type": "minecraft:select", + "cases": [ + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/crossbow_arrow" + }, + "when": "arrow" + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/crossbow_firework" + }, + "when": "rocket" + } + ], + "fallback": { + "type": "minecraft:model", + "model": "minecraft:item/crossbow" + }, + "property": "minecraft:charge_type" + }, + "on_true": { + "type": "minecraft:range_dispatch", + "entries": [ + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/crossbow_pulling_1" + }, + "threshold": 0.58 + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/crossbow_pulling_2" + }, + "threshold": 1.0 + } + ], + "fallback": { + "type": "minecraft:model", + "model": "minecraft:item/crossbow_pulling_0" + }, + "property": "minecraft:crossbow/pull" + }, + "property": "minecraft:using_item" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/crying_obsidian.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/crying_obsidian.json new file mode 100644 index 000000000..146f8de50 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/crying_obsidian.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/crying_obsidian" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/cut_copper.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/cut_copper.json new file mode 100644 index 000000000..69a734c6b --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/cut_copper.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/cut_copper" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/cut_copper_slab.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/cut_copper_slab.json new file mode 100644 index 000000000..1f8c61975 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/cut_copper_slab.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/cut_copper_slab" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/cut_copper_stairs.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/cut_copper_stairs.json new file mode 100644 index 000000000..d63128c1a --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/cut_copper_stairs.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/cut_copper_stairs" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/cut_red_sandstone.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/cut_red_sandstone.json new file mode 100644 index 000000000..ea4701a34 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/cut_red_sandstone.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/cut_red_sandstone" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/cut_red_sandstone_slab.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/cut_red_sandstone_slab.json new file mode 100644 index 000000000..fc25924e7 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/cut_red_sandstone_slab.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/cut_red_sandstone_slab" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/cut_sandstone.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/cut_sandstone.json new file mode 100644 index 000000000..2f1fe0cad --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/cut_sandstone.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/cut_sandstone" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/cut_sandstone_slab.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/cut_sandstone_slab.json new file mode 100644 index 000000000..bcfef093d --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/cut_sandstone_slab.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/cut_sandstone_slab" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/cyan_banner.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/cyan_banner.json new file mode 100644 index 000000000..d7c7b2ce4 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/cyan_banner.json @@ -0,0 +1,10 @@ +{ + "model": { + "type": "minecraft:special", + "base": "minecraft:item/template_banner", + "model": { + "type": "minecraft:banner", + "color": "cyan" + } + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/cyan_bed.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/cyan_bed.json new file mode 100644 index 000000000..cde65b26c --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/cyan_bed.json @@ -0,0 +1,10 @@ +{ + "model": { + "type": "minecraft:special", + "base": "minecraft:item/cyan_bed", + "model": { + "type": "minecraft:bed", + "texture": "minecraft:cyan" + } + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/cyan_bundle.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/cyan_bundle.json new file mode 100644 index 000000000..47e027450 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/cyan_bundle.json @@ -0,0 +1,39 @@ +{ + "model": { + "type": "minecraft:select", + "cases": [ + { + "model": { + "type": "minecraft:condition", + "on_false": { + "type": "minecraft:model", + "model": "minecraft:item/cyan_bundle" + }, + "on_true": { + "type": "minecraft:composite", + "models": [ + { + "type": "minecraft:model", + "model": "minecraft:item/cyan_bundle_open_back" + }, + { + "type": "minecraft:bundle/selected_item" + }, + { + "type": "minecraft:model", + "model": "minecraft:item/cyan_bundle_open_front" + } + ] + }, + "property": "minecraft:bundle/has_selected_item" + }, + "when": "gui" + } + ], + "fallback": { + "type": "minecraft:model", + "model": "minecraft:item/cyan_bundle" + }, + "property": "minecraft:display_context" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/cyan_candle.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/cyan_candle.json new file mode 100644 index 000000000..129135ed4 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/cyan_candle.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/cyan_candle" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/cyan_carpet.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/cyan_carpet.json new file mode 100644 index 000000000..3bf293b85 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/cyan_carpet.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/cyan_carpet" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/cyan_concrete.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/cyan_concrete.json new file mode 100644 index 000000000..61b934e07 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/cyan_concrete.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/cyan_concrete" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/cyan_concrete_powder.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/cyan_concrete_powder.json new file mode 100644 index 000000000..884f433c6 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/cyan_concrete_powder.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/cyan_concrete_powder" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/cyan_dye.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/cyan_dye.json new file mode 100644 index 000000000..d7e89cb52 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/cyan_dye.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/cyan_dye" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/cyan_glazed_terracotta.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/cyan_glazed_terracotta.json new file mode 100644 index 000000000..a748751d9 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/cyan_glazed_terracotta.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/cyan_glazed_terracotta" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/cyan_shulker_box.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/cyan_shulker_box.json new file mode 100644 index 000000000..7f58255e7 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/cyan_shulker_box.json @@ -0,0 +1,10 @@ +{ + "model": { + "type": "minecraft:special", + "base": "minecraft:item/cyan_shulker_box", + "model": { + "type": "minecraft:shulker_box", + "texture": "minecraft:shulker_cyan" + } + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/cyan_stained_glass.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/cyan_stained_glass.json new file mode 100644 index 000000000..c9ef053ab --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/cyan_stained_glass.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/cyan_stained_glass" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/cyan_stained_glass_pane.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/cyan_stained_glass_pane.json new file mode 100644 index 000000000..b1ea0bd46 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/cyan_stained_glass_pane.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/cyan_stained_glass_pane" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/cyan_terracotta.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/cyan_terracotta.json new file mode 100644 index 000000000..f93b202d3 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/cyan_terracotta.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/cyan_terracotta" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/cyan_wool.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/cyan_wool.json new file mode 100644 index 000000000..f9ef9a366 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/cyan_wool.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/cyan_wool" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/damaged_anvil.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/damaged_anvil.json new file mode 100644 index 000000000..afd397f7b --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/damaged_anvil.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/damaged_anvil" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/dandelion.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/dandelion.json new file mode 100644 index 000000000..382f6e83c --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/dandelion.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/dandelion" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/danger_pottery_sherd.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/danger_pottery_sherd.json new file mode 100644 index 000000000..b18e7728d --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/danger_pottery_sherd.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/danger_pottery_sherd" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/dark_oak_boat.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/dark_oak_boat.json new file mode 100644 index 000000000..1952ebc3f --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/dark_oak_boat.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/dark_oak_boat" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/dark_oak_button.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/dark_oak_button.json new file mode 100644 index 000000000..3164e1b14 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/dark_oak_button.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/dark_oak_button_inventory" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/dark_oak_chest_boat.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/dark_oak_chest_boat.json new file mode 100644 index 000000000..36fe0c084 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/dark_oak_chest_boat.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/dark_oak_chest_boat" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/dark_oak_door.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/dark_oak_door.json new file mode 100644 index 000000000..91274e3e9 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/dark_oak_door.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/dark_oak_door" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/dark_oak_fence.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/dark_oak_fence.json new file mode 100644 index 000000000..b84fa9384 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/dark_oak_fence.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/dark_oak_fence_inventory" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/dark_oak_fence_gate.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/dark_oak_fence_gate.json new file mode 100644 index 000000000..890a14c35 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/dark_oak_fence_gate.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/dark_oak_fence_gate" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/dark_oak_hanging_sign.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/dark_oak_hanging_sign.json new file mode 100644 index 000000000..d0ec9e729 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/dark_oak_hanging_sign.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/dark_oak_hanging_sign" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/dark_oak_leaves.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/dark_oak_leaves.json new file mode 100644 index 000000000..361a25da5 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/dark_oak_leaves.json @@ -0,0 +1,12 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/dark_oak_leaves", + "tints": [ + { + "type": "minecraft:constant", + "value": -12012264 + } + ] + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/dark_oak_log.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/dark_oak_log.json new file mode 100644 index 000000000..3cbf4ecdb --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/dark_oak_log.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/dark_oak_log" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/dark_oak_planks.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/dark_oak_planks.json new file mode 100644 index 000000000..acd7c7548 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/dark_oak_planks.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/dark_oak_planks" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/dark_oak_pressure_plate.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/dark_oak_pressure_plate.json new file mode 100644 index 000000000..1deb44857 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/dark_oak_pressure_plate.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/dark_oak_pressure_plate" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/dark_oak_sapling.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/dark_oak_sapling.json new file mode 100644 index 000000000..3e9a56994 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/dark_oak_sapling.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/dark_oak_sapling" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/dark_oak_sign.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/dark_oak_sign.json new file mode 100644 index 000000000..5f48fb976 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/dark_oak_sign.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/dark_oak_sign" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/dark_oak_slab.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/dark_oak_slab.json new file mode 100644 index 000000000..f1ecf6324 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/dark_oak_slab.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/dark_oak_slab" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/dark_oak_stairs.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/dark_oak_stairs.json new file mode 100644 index 000000000..97fd5d60a --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/dark_oak_stairs.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/dark_oak_stairs" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/dark_oak_trapdoor.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/dark_oak_trapdoor.json new file mode 100644 index 000000000..0c69766d2 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/dark_oak_trapdoor.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/dark_oak_trapdoor_bottom" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/dark_oak_wood.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/dark_oak_wood.json new file mode 100644 index 000000000..7d4be143c --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/dark_oak_wood.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/dark_oak_wood" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/dark_prismarine.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/dark_prismarine.json new file mode 100644 index 000000000..dbba47193 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/dark_prismarine.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/dark_prismarine" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/dark_prismarine_slab.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/dark_prismarine_slab.json new file mode 100644 index 000000000..ee4f6a9e3 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/dark_prismarine_slab.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/dark_prismarine_slab" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/dark_prismarine_stairs.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/dark_prismarine_stairs.json new file mode 100644 index 000000000..1812a3a18 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/dark_prismarine_stairs.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/dark_prismarine_stairs" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/daylight_detector.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/daylight_detector.json new file mode 100644 index 000000000..fc5cdd096 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/daylight_detector.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/daylight_detector" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/dead_brain_coral.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/dead_brain_coral.json new file mode 100644 index 000000000..b1993918b --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/dead_brain_coral.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/dead_brain_coral" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/dead_brain_coral_block.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/dead_brain_coral_block.json new file mode 100644 index 000000000..18a18322b --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/dead_brain_coral_block.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/dead_brain_coral_block" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/dead_brain_coral_fan.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/dead_brain_coral_fan.json new file mode 100644 index 000000000..797dee12c --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/dead_brain_coral_fan.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/dead_brain_coral_fan" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/dead_bubble_coral.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/dead_bubble_coral.json new file mode 100644 index 000000000..1bed424d0 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/dead_bubble_coral.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/dead_bubble_coral" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/dead_bubble_coral_block.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/dead_bubble_coral_block.json new file mode 100644 index 000000000..df88e21cd --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/dead_bubble_coral_block.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/dead_bubble_coral_block" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/dead_bubble_coral_fan.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/dead_bubble_coral_fan.json new file mode 100644 index 000000000..ce5bb921f --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/dead_bubble_coral_fan.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/dead_bubble_coral_fan" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/dead_bush.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/dead_bush.json new file mode 100644 index 000000000..32b706c4b --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/dead_bush.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/dead_bush" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/dead_fire_coral.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/dead_fire_coral.json new file mode 100644 index 000000000..97d7a23db --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/dead_fire_coral.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/dead_fire_coral" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/dead_fire_coral_block.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/dead_fire_coral_block.json new file mode 100644 index 000000000..6a4dc6c8e --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/dead_fire_coral_block.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/dead_fire_coral_block" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/dead_fire_coral_fan.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/dead_fire_coral_fan.json new file mode 100644 index 000000000..3fccaf45a --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/dead_fire_coral_fan.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/dead_fire_coral_fan" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/dead_horn_coral.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/dead_horn_coral.json new file mode 100644 index 000000000..cbd3d5b47 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/dead_horn_coral.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/dead_horn_coral" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/dead_horn_coral_block.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/dead_horn_coral_block.json new file mode 100644 index 000000000..b3ddffcfb --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/dead_horn_coral_block.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/dead_horn_coral_block" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/dead_horn_coral_fan.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/dead_horn_coral_fan.json new file mode 100644 index 000000000..9a918b171 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/dead_horn_coral_fan.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/dead_horn_coral_fan" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/dead_tube_coral.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/dead_tube_coral.json new file mode 100644 index 000000000..22b39b2cc --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/dead_tube_coral.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/dead_tube_coral" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/dead_tube_coral_block.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/dead_tube_coral_block.json new file mode 100644 index 000000000..07d1be184 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/dead_tube_coral_block.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/dead_tube_coral_block" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/dead_tube_coral_fan.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/dead_tube_coral_fan.json new file mode 100644 index 000000000..a5e9f8ef2 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/dead_tube_coral_fan.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/dead_tube_coral_fan" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/debug_stick.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/debug_stick.json new file mode 100644 index 000000000..de806dede --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/debug_stick.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/debug_stick" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/decorated_pot.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/decorated_pot.json new file mode 100644 index 000000000..24c90d56a --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/decorated_pot.json @@ -0,0 +1,9 @@ +{ + "model": { + "type": "minecraft:special", + "base": "minecraft:item/decorated_pot", + "model": { + "type": "minecraft:decorated_pot" + } + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/deepslate.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/deepslate.json new file mode 100644 index 000000000..77255c70c --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/deepslate.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/deepslate" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/deepslate_brick_slab.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/deepslate_brick_slab.json new file mode 100644 index 000000000..bbc99bad2 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/deepslate_brick_slab.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/deepslate_brick_slab" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/deepslate_brick_stairs.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/deepslate_brick_stairs.json new file mode 100644 index 000000000..96502eaf5 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/deepslate_brick_stairs.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/deepslate_brick_stairs" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/deepslate_brick_wall.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/deepslate_brick_wall.json new file mode 100644 index 000000000..738c6fe1e --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/deepslate_brick_wall.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/deepslate_brick_wall_inventory" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/deepslate_bricks.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/deepslate_bricks.json new file mode 100644 index 000000000..fbd9457a6 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/deepslate_bricks.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/deepslate_bricks" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/deepslate_coal_ore.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/deepslate_coal_ore.json new file mode 100644 index 000000000..1f90c2541 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/deepslate_coal_ore.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/deepslate_coal_ore" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/deepslate_copper_ore.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/deepslate_copper_ore.json new file mode 100644 index 000000000..3f26206e2 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/deepslate_copper_ore.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/deepslate_copper_ore" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/deepslate_diamond_ore.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/deepslate_diamond_ore.json new file mode 100644 index 000000000..848916bf5 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/deepslate_diamond_ore.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/deepslate_diamond_ore" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/deepslate_emerald_ore.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/deepslate_emerald_ore.json new file mode 100644 index 000000000..aea0b2973 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/deepslate_emerald_ore.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/deepslate_emerald_ore" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/deepslate_gold_ore.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/deepslate_gold_ore.json new file mode 100644 index 000000000..c9f3f73b6 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/deepslate_gold_ore.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/deepslate_gold_ore" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/deepslate_iron_ore.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/deepslate_iron_ore.json new file mode 100644 index 000000000..0a9817bef --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/deepslate_iron_ore.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/deepslate_iron_ore" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/deepslate_lapis_ore.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/deepslate_lapis_ore.json new file mode 100644 index 000000000..d70b96607 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/deepslate_lapis_ore.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/deepslate_lapis_ore" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/deepslate_redstone_ore.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/deepslate_redstone_ore.json new file mode 100644 index 000000000..630e4e933 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/deepslate_redstone_ore.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/deepslate_redstone_ore" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/deepslate_tile_slab.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/deepslate_tile_slab.json new file mode 100644 index 000000000..8a2479805 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/deepslate_tile_slab.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/deepslate_tile_slab" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/deepslate_tile_stairs.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/deepslate_tile_stairs.json new file mode 100644 index 000000000..dbd7c39f8 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/deepslate_tile_stairs.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/deepslate_tile_stairs" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/deepslate_tile_wall.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/deepslate_tile_wall.json new file mode 100644 index 000000000..e1b441524 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/deepslate_tile_wall.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/deepslate_tile_wall_inventory" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/deepslate_tiles.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/deepslate_tiles.json new file mode 100644 index 000000000..b2bd01fa2 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/deepslate_tiles.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/deepslate_tiles" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/detector_rail.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/detector_rail.json new file mode 100644 index 000000000..0f427f97d --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/detector_rail.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/detector_rail" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/diamond.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/diamond.json new file mode 100644 index 000000000..02943ce17 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/diamond.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/diamond" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/diamond_axe.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/diamond_axe.json new file mode 100644 index 000000000..977851810 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/diamond_axe.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/diamond_axe" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/diamond_block.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/diamond_block.json new file mode 100644 index 000000000..05528085b --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/diamond_block.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/diamond_block" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/diamond_boots.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/diamond_boots.json new file mode 100644 index 000000000..6e9f7f195 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/diamond_boots.json @@ -0,0 +1,89 @@ +{ + "model": { + "type": "minecraft:select", + "cases": [ + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/diamond_boots_quartz_trim" + }, + "when": "minecraft:quartz" + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/diamond_boots_iron_trim" + }, + "when": "minecraft:iron" + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/diamond_boots_netherite_trim" + }, + "when": "minecraft:netherite" + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/diamond_boots_redstone_trim" + }, + "when": "minecraft:redstone" + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/diamond_boots_copper_trim" + }, + "when": "minecraft:copper" + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/diamond_boots_gold_trim" + }, + "when": "minecraft:gold" + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/diamond_boots_emerald_trim" + }, + "when": "minecraft:emerald" + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/diamond_boots_diamond_trim" + }, + "when": "minecraft:diamond" + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/diamond_boots_lapis_trim" + }, + "when": "minecraft:lapis" + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/diamond_boots_amethyst_trim" + }, + "when": "minecraft:amethyst" + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/diamond_boots_resin_trim" + }, + "when": "minecraft:resin" + } + ], + "fallback": { + "type": "minecraft:model", + "model": "minecraft:item/diamond_boots" + }, + "property": "minecraft:trim_material" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/diamond_chestplate.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/diamond_chestplate.json new file mode 100644 index 000000000..792fcdc85 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/diamond_chestplate.json @@ -0,0 +1,89 @@ +{ + "model": { + "type": "minecraft:select", + "cases": [ + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/diamond_chestplate_quartz_trim" + }, + "when": "minecraft:quartz" + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/diamond_chestplate_iron_trim" + }, + "when": "minecraft:iron" + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/diamond_chestplate_netherite_trim" + }, + "when": "minecraft:netherite" + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/diamond_chestplate_redstone_trim" + }, + "when": "minecraft:redstone" + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/diamond_chestplate_copper_trim" + }, + "when": "minecraft:copper" + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/diamond_chestplate_gold_trim" + }, + "when": "minecraft:gold" + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/diamond_chestplate_emerald_trim" + }, + "when": "minecraft:emerald" + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/diamond_chestplate_diamond_trim" + }, + "when": "minecraft:diamond" + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/diamond_chestplate_lapis_trim" + }, + "when": "minecraft:lapis" + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/diamond_chestplate_amethyst_trim" + }, + "when": "minecraft:amethyst" + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/diamond_chestplate_resin_trim" + }, + "when": "minecraft:resin" + } + ], + "fallback": { + "type": "minecraft:model", + "model": "minecraft:item/diamond_chestplate" + }, + "property": "minecraft:trim_material" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/diamond_helmet.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/diamond_helmet.json new file mode 100644 index 000000000..e972bdca9 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/diamond_helmet.json @@ -0,0 +1,89 @@ +{ + "model": { + "type": "minecraft:select", + "cases": [ + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/diamond_helmet_quartz_trim" + }, + "when": "minecraft:quartz" + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/diamond_helmet_iron_trim" + }, + "when": "minecraft:iron" + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/diamond_helmet_netherite_trim" + }, + "when": "minecraft:netherite" + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/diamond_helmet_redstone_trim" + }, + "when": "minecraft:redstone" + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/diamond_helmet_copper_trim" + }, + "when": "minecraft:copper" + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/diamond_helmet_gold_trim" + }, + "when": "minecraft:gold" + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/diamond_helmet_emerald_trim" + }, + "when": "minecraft:emerald" + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/diamond_helmet_diamond_trim" + }, + "when": "minecraft:diamond" + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/diamond_helmet_lapis_trim" + }, + "when": "minecraft:lapis" + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/diamond_helmet_amethyst_trim" + }, + "when": "minecraft:amethyst" + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/diamond_helmet_resin_trim" + }, + "when": "minecraft:resin" + } + ], + "fallback": { + "type": "minecraft:model", + "model": "minecraft:item/diamond_helmet" + }, + "property": "minecraft:trim_material" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/diamond_hoe.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/diamond_hoe.json new file mode 100644 index 000000000..e870e0233 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/diamond_hoe.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/diamond_hoe" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/diamond_horse_armor.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/diamond_horse_armor.json new file mode 100644 index 000000000..0cb3d2efe --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/diamond_horse_armor.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/diamond_horse_armor" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/diamond_leggings.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/diamond_leggings.json new file mode 100644 index 000000000..b56966d3d --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/diamond_leggings.json @@ -0,0 +1,89 @@ +{ + "model": { + "type": "minecraft:select", + "cases": [ + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/diamond_leggings_quartz_trim" + }, + "when": "minecraft:quartz" + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/diamond_leggings_iron_trim" + }, + "when": "minecraft:iron" + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/diamond_leggings_netherite_trim" + }, + "when": "minecraft:netherite" + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/diamond_leggings_redstone_trim" + }, + "when": "minecraft:redstone" + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/diamond_leggings_copper_trim" + }, + "when": "minecraft:copper" + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/diamond_leggings_gold_trim" + }, + "when": "minecraft:gold" + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/diamond_leggings_emerald_trim" + }, + "when": "minecraft:emerald" + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/diamond_leggings_diamond_trim" + }, + "when": "minecraft:diamond" + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/diamond_leggings_lapis_trim" + }, + "when": "minecraft:lapis" + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/diamond_leggings_amethyst_trim" + }, + "when": "minecraft:amethyst" + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/diamond_leggings_resin_trim" + }, + "when": "minecraft:resin" + } + ], + "fallback": { + "type": "minecraft:model", + "model": "minecraft:item/diamond_leggings" + }, + "property": "minecraft:trim_material" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/diamond_ore.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/diamond_ore.json new file mode 100644 index 000000000..21cfe182a --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/diamond_ore.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/diamond_ore" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/diamond_pickaxe.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/diamond_pickaxe.json new file mode 100644 index 000000000..bb25d0e69 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/diamond_pickaxe.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/diamond_pickaxe" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/diamond_shovel.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/diamond_shovel.json new file mode 100644 index 000000000..8a66cef5e --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/diamond_shovel.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/diamond_shovel" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/diamond_sword.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/diamond_sword.json new file mode 100644 index 000000000..feaff1754 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/diamond_sword.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/diamond_sword" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/diorite.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/diorite.json new file mode 100644 index 000000000..c46df5c36 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/diorite.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/diorite" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/diorite_slab.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/diorite_slab.json new file mode 100644 index 000000000..2970c9d87 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/diorite_slab.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/diorite_slab" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/diorite_stairs.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/diorite_stairs.json new file mode 100644 index 000000000..35afcd780 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/diorite_stairs.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/diorite_stairs" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/diorite_wall.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/diorite_wall.json new file mode 100644 index 000000000..e6f625f87 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/diorite_wall.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/diorite_wall_inventory" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/dirt.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/dirt.json new file mode 100644 index 000000000..2a743f35c --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/dirt.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/dirt" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/dirt_path.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/dirt_path.json new file mode 100644 index 000000000..5acab8917 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/dirt_path.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/dirt_path" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/disc_fragment_5.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/disc_fragment_5.json new file mode 100644 index 000000000..bd88e9b05 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/disc_fragment_5.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/disc_fragment_5" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/dispenser.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/dispenser.json new file mode 100644 index 000000000..3976f3461 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/dispenser.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/dispenser" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/dolphin_spawn_egg.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/dolphin_spawn_egg.json new file mode 100644 index 000000000..84cf6744d --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/dolphin_spawn_egg.json @@ -0,0 +1,16 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/template_spawn_egg", + "tints": [ + { + "type": "minecraft:constant", + "value": -14533811 + }, + { + "type": "minecraft:constant", + "value": -394759 + } + ] + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/donkey_spawn_egg.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/donkey_spawn_egg.json new file mode 100644 index 000000000..77847f052 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/donkey_spawn_egg.json @@ -0,0 +1,16 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/template_spawn_egg", + "tints": [ + { + "type": "minecraft:constant", + "value": -11320007 + }, + { + "type": "minecraft:constant", + "value": -7965338 + } + ] + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/dragon_breath.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/dragon_breath.json new file mode 100644 index 000000000..781929042 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/dragon_breath.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/dragon_breath" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/dragon_egg.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/dragon_egg.json new file mode 100644 index 000000000..694567c09 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/dragon_egg.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/dragon_egg" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/dragon_head.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/dragon_head.json new file mode 100644 index 000000000..71017923e --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/dragon_head.json @@ -0,0 +1,10 @@ +{ + "model": { + "type": "minecraft:special", + "base": "minecraft:item/dragon_head", + "model": { + "type": "minecraft:head", + "kind": "dragon" + } + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/dried_kelp.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/dried_kelp.json new file mode 100644 index 000000000..497ffaac7 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/dried_kelp.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/dried_kelp" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/dried_kelp_block.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/dried_kelp_block.json new file mode 100644 index 000000000..6f9f27b8e --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/dried_kelp_block.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/dried_kelp_block" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/dripstone_block.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/dripstone_block.json new file mode 100644 index 000000000..de199adae --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/dripstone_block.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/dripstone_block" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/dropper.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/dropper.json new file mode 100644 index 000000000..0e5ba841f --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/dropper.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/dropper" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/drowned_spawn_egg.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/drowned_spawn_egg.json new file mode 100644 index 000000000..9733efa9d --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/drowned_spawn_egg.json @@ -0,0 +1,16 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/template_spawn_egg", + "tints": [ + { + "type": "minecraft:constant", + "value": -7343657 + }, + { + "type": "minecraft:constant", + "value": -8807323 + } + ] + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/dune_armor_trim_smithing_template.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/dune_armor_trim_smithing_template.json new file mode 100644 index 000000000..b59a172b7 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/dune_armor_trim_smithing_template.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/dune_armor_trim_smithing_template" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/echo_shard.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/echo_shard.json new file mode 100644 index 000000000..c1f986f23 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/echo_shard.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/echo_shard" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/egg.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/egg.json new file mode 100644 index 000000000..39c588275 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/egg.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/egg" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/elder_guardian_spawn_egg.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/elder_guardian_spawn_egg.json new file mode 100644 index 000000000..09fa97f4f --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/elder_guardian_spawn_egg.json @@ -0,0 +1,16 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/template_spawn_egg", + "tints": [ + { + "type": "minecraft:constant", + "value": -3224390 + }, + { + "type": "minecraft:constant", + "value": -9144685 + } + ] + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/elytra.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/elytra.json new file mode 100644 index 000000000..2ec75b20c --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/elytra.json @@ -0,0 +1,14 @@ +{ + "model": { + "type": "minecraft:condition", + "on_false": { + "type": "minecraft:model", + "model": "minecraft:item/elytra" + }, + "on_true": { + "type": "minecraft:model", + "model": "minecraft:item/elytra_broken" + }, + "property": "minecraft:broken" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/emerald.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/emerald.json new file mode 100644 index 000000000..1bb686430 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/emerald.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/emerald" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/emerald_block.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/emerald_block.json new file mode 100644 index 000000000..1cdd248ae --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/emerald_block.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/emerald_block" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/emerald_ore.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/emerald_ore.json new file mode 100644 index 000000000..fee596cc9 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/emerald_ore.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/emerald_ore" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/enchanted_book.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/enchanted_book.json new file mode 100644 index 000000000..d040f8bb6 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/enchanted_book.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/enchanted_book" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/enchanted_golden_apple.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/enchanted_golden_apple.json new file mode 100644 index 000000000..824327a4b --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/enchanted_golden_apple.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/enchanted_golden_apple" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/enchanting_table.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/enchanting_table.json new file mode 100644 index 000000000..6cfff24f8 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/enchanting_table.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/enchanting_table" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/end_crystal.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/end_crystal.json new file mode 100644 index 000000000..871b593cb --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/end_crystal.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/end_crystal" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/end_portal_frame.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/end_portal_frame.json new file mode 100644 index 000000000..764c8d353 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/end_portal_frame.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/end_portal_frame" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/end_rod.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/end_rod.json new file mode 100644 index 000000000..f7d7c6347 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/end_rod.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/end_rod" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/end_stone.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/end_stone.json new file mode 100644 index 000000000..86ea9e802 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/end_stone.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/end_stone" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/end_stone_brick_slab.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/end_stone_brick_slab.json new file mode 100644 index 000000000..5e7dc44b5 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/end_stone_brick_slab.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/end_stone_brick_slab" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/end_stone_brick_stairs.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/end_stone_brick_stairs.json new file mode 100644 index 000000000..4de71c7c3 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/end_stone_brick_stairs.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/end_stone_brick_stairs" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/end_stone_brick_wall.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/end_stone_brick_wall.json new file mode 100644 index 000000000..479e30114 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/end_stone_brick_wall.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/end_stone_brick_wall_inventory" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/end_stone_bricks.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/end_stone_bricks.json new file mode 100644 index 000000000..d66988536 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/end_stone_bricks.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/end_stone_bricks" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/ender_chest.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/ender_chest.json new file mode 100644 index 000000000..54793a77e --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/ender_chest.json @@ -0,0 +1,10 @@ +{ + "model": { + "type": "minecraft:special", + "base": "minecraft:item/ender_chest", + "model": { + "type": "minecraft:chest", + "texture": "minecraft:ender" + } + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/ender_dragon_spawn_egg.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/ender_dragon_spawn_egg.json new file mode 100644 index 000000000..cde65d582 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/ender_dragon_spawn_egg.json @@ -0,0 +1,16 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/template_spawn_egg", + "tints": [ + { + "type": "minecraft:constant", + "value": -14935012 + }, + { + "type": "minecraft:constant", + "value": -2065926 + } + ] + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/ender_eye.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/ender_eye.json new file mode 100644 index 000000000..cfa768b76 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/ender_eye.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/ender_eye" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/ender_pearl.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/ender_pearl.json new file mode 100644 index 000000000..b7bfc1508 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/ender_pearl.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/ender_pearl" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/enderman_spawn_egg.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/enderman_spawn_egg.json new file mode 100644 index 000000000..26d3e235f --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/enderman_spawn_egg.json @@ -0,0 +1,16 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/template_spawn_egg", + "tints": [ + { + "type": "minecraft:constant", + "value": -15329770 + }, + { + "type": "minecraft:constant", + "value": -16777216 + } + ] + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/endermite_spawn_egg.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/endermite_spawn_egg.json new file mode 100644 index 000000000..dded41e0c --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/endermite_spawn_egg.json @@ -0,0 +1,16 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/template_spawn_egg", + "tints": [ + { + "type": "minecraft:constant", + "value": -15329770 + }, + { + "type": "minecraft:constant", + "value": -9539986 + } + ] + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/evoker_spawn_egg.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/evoker_spawn_egg.json new file mode 100644 index 000000000..a4efa1576 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/evoker_spawn_egg.json @@ -0,0 +1,16 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/template_spawn_egg", + "tints": [ + { + "type": "minecraft:constant", + "value": -6972517 + }, + { + "type": "minecraft:constant", + "value": -14803942 + } + ] + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/experience_bottle.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/experience_bottle.json new file mode 100644 index 000000000..08f831b3b --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/experience_bottle.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/experience_bottle" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/explorer_pottery_sherd.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/explorer_pottery_sherd.json new file mode 100644 index 000000000..fdae35328 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/explorer_pottery_sherd.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/explorer_pottery_sherd" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/exposed_chiseled_copper.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/exposed_chiseled_copper.json new file mode 100644 index 000000000..22657b6a6 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/exposed_chiseled_copper.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/exposed_chiseled_copper" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/exposed_copper.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/exposed_copper.json new file mode 100644 index 000000000..632da6748 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/exposed_copper.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/exposed_copper" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/exposed_copper_bulb.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/exposed_copper_bulb.json new file mode 100644 index 000000000..d54e63062 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/exposed_copper_bulb.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/exposed_copper_bulb" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/exposed_copper_door.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/exposed_copper_door.json new file mode 100644 index 000000000..0ca6e2ca8 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/exposed_copper_door.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/exposed_copper_door" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/exposed_copper_grate.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/exposed_copper_grate.json new file mode 100644 index 000000000..07c561b46 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/exposed_copper_grate.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/exposed_copper_grate" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/exposed_copper_trapdoor.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/exposed_copper_trapdoor.json new file mode 100644 index 000000000..260b680ea --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/exposed_copper_trapdoor.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/exposed_copper_trapdoor_bottom" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/exposed_cut_copper.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/exposed_cut_copper.json new file mode 100644 index 000000000..35932366f --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/exposed_cut_copper.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/exposed_cut_copper" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/exposed_cut_copper_slab.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/exposed_cut_copper_slab.json new file mode 100644 index 000000000..818f88602 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/exposed_cut_copper_slab.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/exposed_cut_copper_slab" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/exposed_cut_copper_stairs.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/exposed_cut_copper_stairs.json new file mode 100644 index 000000000..54f5c1f06 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/exposed_cut_copper_stairs.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/exposed_cut_copper_stairs" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/eye_armor_trim_smithing_template.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/eye_armor_trim_smithing_template.json new file mode 100644 index 000000000..1c5d86eae --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/eye_armor_trim_smithing_template.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/eye_armor_trim_smithing_template" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/farmland.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/farmland.json new file mode 100644 index 000000000..394f6a5a5 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/farmland.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/farmland" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/feather.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/feather.json new file mode 100644 index 000000000..809e75b90 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/feather.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/feather" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/fermented_spider_eye.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/fermented_spider_eye.json new file mode 100644 index 000000000..5bce62ffb --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/fermented_spider_eye.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/fermented_spider_eye" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/fern.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/fern.json new file mode 100644 index 000000000..fc6e75168 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/fern.json @@ -0,0 +1,13 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/fern", + "tints": [ + { + "type": "minecraft:grass", + "downfall": 1.0, + "temperature": 0.5 + } + ] + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/field_masoned_banner_pattern.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/field_masoned_banner_pattern.json new file mode 100644 index 000000000..c6fd6ad8a --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/field_masoned_banner_pattern.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/field_masoned_banner_pattern" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/filled_map.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/filled_map.json new file mode 100644 index 000000000..9152f37cf --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/filled_map.json @@ -0,0 +1,16 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/filled_map", + "tints": [ + { + "type": "minecraft:constant", + "value": -1 + }, + { + "type": "minecraft:map_color", + "default": 4603950 + } + ] + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/fire_charge.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/fire_charge.json new file mode 100644 index 000000000..8326bf8d3 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/fire_charge.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/fire_charge" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/fire_coral.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/fire_coral.json new file mode 100644 index 000000000..835c481f3 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/fire_coral.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/fire_coral" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/fire_coral_block.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/fire_coral_block.json new file mode 100644 index 000000000..027c9f9c6 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/fire_coral_block.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/fire_coral_block" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/fire_coral_fan.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/fire_coral_fan.json new file mode 100644 index 000000000..5746686fc --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/fire_coral_fan.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/fire_coral_fan" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/firework_rocket.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/firework_rocket.json new file mode 100644 index 000000000..98341aa0f --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/firework_rocket.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/firework_rocket" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/firework_star.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/firework_star.json new file mode 100644 index 000000000..deec259f8 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/firework_star.json @@ -0,0 +1,16 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/firework_star", + "tints": [ + { + "type": "minecraft:constant", + "value": -1 + }, + { + "type": "minecraft:firework", + "default": -7697782 + } + ] + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/fishing_rod.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/fishing_rod.json new file mode 100644 index 000000000..e22968886 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/fishing_rod.json @@ -0,0 +1,14 @@ +{ + "model": { + "type": "minecraft:condition", + "on_false": { + "type": "minecraft:model", + "model": "minecraft:item/fishing_rod" + }, + "on_true": { + "type": "minecraft:model", + "model": "minecraft:item/fishing_rod_cast" + }, + "property": "minecraft:fishing_rod/cast" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/fletching_table.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/fletching_table.json new file mode 100644 index 000000000..f92820f73 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/fletching_table.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/fletching_table" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/flint.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/flint.json new file mode 100644 index 000000000..a1741a1ff --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/flint.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/flint" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/flint_and_steel.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/flint_and_steel.json new file mode 100644 index 000000000..279808b9e --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/flint_and_steel.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/flint_and_steel" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/flow_armor_trim_smithing_template.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/flow_armor_trim_smithing_template.json new file mode 100644 index 000000000..cf915b314 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/flow_armor_trim_smithing_template.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/flow_armor_trim_smithing_template" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/flow_banner_pattern.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/flow_banner_pattern.json new file mode 100644 index 000000000..bd51343af --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/flow_banner_pattern.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/flow_banner_pattern" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/flow_pottery_sherd.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/flow_pottery_sherd.json new file mode 100644 index 000000000..2c4cd8102 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/flow_pottery_sherd.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/flow_pottery_sherd" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/flower_banner_pattern.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/flower_banner_pattern.json new file mode 100644 index 000000000..000a7be87 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/flower_banner_pattern.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/flower_banner_pattern" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/flower_pot.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/flower_pot.json new file mode 100644 index 000000000..619a80d37 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/flower_pot.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/flower_pot" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/flowering_azalea.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/flowering_azalea.json new file mode 100644 index 000000000..778616a96 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/flowering_azalea.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/flowering_azalea" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/flowering_azalea_leaves.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/flowering_azalea_leaves.json new file mode 100644 index 000000000..35fe16d99 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/flowering_azalea_leaves.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/flowering_azalea_leaves" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/fox_spawn_egg.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/fox_spawn_egg.json new file mode 100644 index 000000000..cc448ddde --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/fox_spawn_egg.json @@ -0,0 +1,16 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/template_spawn_egg", + "tints": [ + { + "type": "minecraft:constant", + "value": -2771297 + }, + { + "type": "minecraft:constant", + "value": -3380960 + } + ] + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/friend_pottery_sherd.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/friend_pottery_sherd.json new file mode 100644 index 000000000..a5aef4bdc --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/friend_pottery_sherd.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/friend_pottery_sherd" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/frog_spawn_egg.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/frog_spawn_egg.json new file mode 100644 index 000000000..a29291675 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/frog_spawn_egg.json @@ -0,0 +1,16 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/template_spawn_egg", + "tints": [ + { + "type": "minecraft:constant", + "value": -3115964 + }, + { + "type": "minecraft:constant", + "value": -14468 + } + ] + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/frogspawn.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/frogspawn.json new file mode 100644 index 000000000..c78393f55 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/frogspawn.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/frogspawn" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/furnace.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/furnace.json new file mode 100644 index 000000000..6449afc3c --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/furnace.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/furnace" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/furnace_minecart.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/furnace_minecart.json new file mode 100644 index 000000000..26139fe1e --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/furnace_minecart.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/furnace_minecart" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/ghast_spawn_egg.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/ghast_spawn_egg.json new file mode 100644 index 000000000..683f9d0c2 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/ghast_spawn_egg.json @@ -0,0 +1,16 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/template_spawn_egg", + "tints": [ + { + "type": "minecraft:constant", + "value": -394759 + }, + { + "type": "minecraft:constant", + "value": -4408132 + } + ] + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/ghast_tear.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/ghast_tear.json new file mode 100644 index 000000000..fabdd2d84 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/ghast_tear.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/ghast_tear" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/gilded_blackstone.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/gilded_blackstone.json new file mode 100644 index 000000000..0ccb924d6 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/gilded_blackstone.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/gilded_blackstone" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/glass.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/glass.json new file mode 100644 index 000000000..85664175d --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/glass.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/glass" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/glass_bottle.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/glass_bottle.json new file mode 100644 index 000000000..04f3032eb --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/glass_bottle.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/glass_bottle" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/glass_pane.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/glass_pane.json new file mode 100644 index 000000000..9639bbc65 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/glass_pane.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/glass_pane" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/glistering_melon_slice.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/glistering_melon_slice.json new file mode 100644 index 000000000..843758321 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/glistering_melon_slice.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/glistering_melon_slice" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/globe_banner_pattern.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/globe_banner_pattern.json new file mode 100644 index 000000000..48bb79dbe --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/globe_banner_pattern.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/globe_banner_pattern" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/glow_berries.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/glow_berries.json new file mode 100644 index 000000000..01214a8b4 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/glow_berries.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/glow_berries" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/glow_ink_sac.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/glow_ink_sac.json new file mode 100644 index 000000000..f4b136c79 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/glow_ink_sac.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/glow_ink_sac" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/glow_item_frame.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/glow_item_frame.json new file mode 100644 index 000000000..1f30da645 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/glow_item_frame.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/glow_item_frame" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/glow_lichen.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/glow_lichen.json new file mode 100644 index 000000000..d89ad87b5 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/glow_lichen.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/glow_lichen" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/glow_squid_spawn_egg.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/glow_squid_spawn_egg.json new file mode 100644 index 000000000..be4810418 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/glow_squid_spawn_egg.json @@ -0,0 +1,16 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/template_spawn_egg", + "tints": [ + { + "type": "minecraft:constant", + "value": -16165290 + }, + { + "type": "minecraft:constant", + "value": -7999044 + } + ] + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/glowstone.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/glowstone.json new file mode 100644 index 000000000..5fde95210 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/glowstone.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/glowstone" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/glowstone_dust.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/glowstone_dust.json new file mode 100644 index 000000000..41e727715 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/glowstone_dust.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/glowstone_dust" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/goat_horn.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/goat_horn.json new file mode 100644 index 000000000..d2db83824 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/goat_horn.json @@ -0,0 +1,14 @@ +{ + "model": { + "type": "minecraft:condition", + "on_false": { + "type": "minecraft:model", + "model": "minecraft:item/goat_horn" + }, + "on_true": { + "type": "minecraft:model", + "model": "minecraft:item/tooting_goat_horn" + }, + "property": "minecraft:using_item" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/goat_spawn_egg.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/goat_spawn_egg.json new file mode 100644 index 000000000..75471773c --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/goat_spawn_egg.json @@ -0,0 +1,16 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/template_spawn_egg", + "tints": [ + { + "type": "minecraft:constant", + "value": -5925764 + }, + { + "type": "minecraft:constant", + "value": -11187906 + } + ] + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/gold_block.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/gold_block.json new file mode 100644 index 000000000..a03cc3643 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/gold_block.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/gold_block" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/gold_ingot.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/gold_ingot.json new file mode 100644 index 000000000..b9d3fdd7b --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/gold_ingot.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/gold_ingot" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/gold_nugget.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/gold_nugget.json new file mode 100644 index 000000000..f88f872e5 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/gold_nugget.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/gold_nugget" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/gold_ore.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/gold_ore.json new file mode 100644 index 000000000..d2c6805b1 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/gold_ore.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/gold_ore" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/golden_apple.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/golden_apple.json new file mode 100644 index 000000000..1cab81edb --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/golden_apple.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/golden_apple" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/golden_axe.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/golden_axe.json new file mode 100644 index 000000000..899c0e74a --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/golden_axe.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/golden_axe" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/golden_boots.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/golden_boots.json new file mode 100644 index 000000000..245b3420e --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/golden_boots.json @@ -0,0 +1,89 @@ +{ + "model": { + "type": "minecraft:select", + "cases": [ + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/golden_boots_quartz_trim" + }, + "when": "minecraft:quartz" + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/golden_boots_iron_trim" + }, + "when": "minecraft:iron" + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/golden_boots_netherite_trim" + }, + "when": "minecraft:netherite" + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/golden_boots_redstone_trim" + }, + "when": "minecraft:redstone" + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/golden_boots_copper_trim" + }, + "when": "minecraft:copper" + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/golden_boots_gold_trim" + }, + "when": "minecraft:gold" + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/golden_boots_emerald_trim" + }, + "when": "minecraft:emerald" + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/golden_boots_diamond_trim" + }, + "when": "minecraft:diamond" + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/golden_boots_lapis_trim" + }, + "when": "minecraft:lapis" + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/golden_boots_amethyst_trim" + }, + "when": "minecraft:amethyst" + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/golden_boots_resin_trim" + }, + "when": "minecraft:resin" + } + ], + "fallback": { + "type": "minecraft:model", + "model": "minecraft:item/golden_boots" + }, + "property": "minecraft:trim_material" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/golden_carrot.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/golden_carrot.json new file mode 100644 index 000000000..b6f042872 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/golden_carrot.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/golden_carrot" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/golden_chestplate.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/golden_chestplate.json new file mode 100644 index 000000000..7478fd9a5 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/golden_chestplate.json @@ -0,0 +1,89 @@ +{ + "model": { + "type": "minecraft:select", + "cases": [ + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/golden_chestplate_quartz_trim" + }, + "when": "minecraft:quartz" + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/golden_chestplate_iron_trim" + }, + "when": "minecraft:iron" + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/golden_chestplate_netherite_trim" + }, + "when": "minecraft:netherite" + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/golden_chestplate_redstone_trim" + }, + "when": "minecraft:redstone" + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/golden_chestplate_copper_trim" + }, + "when": "minecraft:copper" + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/golden_chestplate_gold_trim" + }, + "when": "minecraft:gold" + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/golden_chestplate_emerald_trim" + }, + "when": "minecraft:emerald" + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/golden_chestplate_diamond_trim" + }, + "when": "minecraft:diamond" + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/golden_chestplate_lapis_trim" + }, + "when": "minecraft:lapis" + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/golden_chestplate_amethyst_trim" + }, + "when": "minecraft:amethyst" + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/golden_chestplate_resin_trim" + }, + "when": "minecraft:resin" + } + ], + "fallback": { + "type": "minecraft:model", + "model": "minecraft:item/golden_chestplate" + }, + "property": "minecraft:trim_material" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/golden_helmet.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/golden_helmet.json new file mode 100644 index 000000000..2c999700f --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/golden_helmet.json @@ -0,0 +1,89 @@ +{ + "model": { + "type": "minecraft:select", + "cases": [ + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/golden_helmet_quartz_trim" + }, + "when": "minecraft:quartz" + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/golden_helmet_iron_trim" + }, + "when": "minecraft:iron" + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/golden_helmet_netherite_trim" + }, + "when": "minecraft:netherite" + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/golden_helmet_redstone_trim" + }, + "when": "minecraft:redstone" + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/golden_helmet_copper_trim" + }, + "when": "minecraft:copper" + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/golden_helmet_gold_trim" + }, + "when": "minecraft:gold" + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/golden_helmet_emerald_trim" + }, + "when": "minecraft:emerald" + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/golden_helmet_diamond_trim" + }, + "when": "minecraft:diamond" + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/golden_helmet_lapis_trim" + }, + "when": "minecraft:lapis" + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/golden_helmet_amethyst_trim" + }, + "when": "minecraft:amethyst" + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/golden_helmet_resin_trim" + }, + "when": "minecraft:resin" + } + ], + "fallback": { + "type": "minecraft:model", + "model": "minecraft:item/golden_helmet" + }, + "property": "minecraft:trim_material" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/golden_hoe.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/golden_hoe.json new file mode 100644 index 000000000..9efc7f14f --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/golden_hoe.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/golden_hoe" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/golden_horse_armor.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/golden_horse_armor.json new file mode 100644 index 000000000..31f2e4586 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/golden_horse_armor.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/golden_horse_armor" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/golden_leggings.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/golden_leggings.json new file mode 100644 index 000000000..59eba297f --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/golden_leggings.json @@ -0,0 +1,89 @@ +{ + "model": { + "type": "minecraft:select", + "cases": [ + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/golden_leggings_quartz_trim" + }, + "when": "minecraft:quartz" + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/golden_leggings_iron_trim" + }, + "when": "minecraft:iron" + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/golden_leggings_netherite_trim" + }, + "when": "minecraft:netherite" + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/golden_leggings_redstone_trim" + }, + "when": "minecraft:redstone" + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/golden_leggings_copper_trim" + }, + "when": "minecraft:copper" + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/golden_leggings_gold_trim" + }, + "when": "minecraft:gold" + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/golden_leggings_emerald_trim" + }, + "when": "minecraft:emerald" + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/golden_leggings_diamond_trim" + }, + "when": "minecraft:diamond" + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/golden_leggings_lapis_trim" + }, + "when": "minecraft:lapis" + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/golden_leggings_amethyst_trim" + }, + "when": "minecraft:amethyst" + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/golden_leggings_resin_trim" + }, + "when": "minecraft:resin" + } + ], + "fallback": { + "type": "minecraft:model", + "model": "minecraft:item/golden_leggings" + }, + "property": "minecraft:trim_material" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/golden_pickaxe.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/golden_pickaxe.json new file mode 100644 index 000000000..87fcc70c5 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/golden_pickaxe.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/golden_pickaxe" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/golden_shovel.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/golden_shovel.json new file mode 100644 index 000000000..88425bcd7 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/golden_shovel.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/golden_shovel" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/golden_sword.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/golden_sword.json new file mode 100644 index 000000000..2f2de3b6f --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/golden_sword.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/golden_sword" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/granite.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/granite.json new file mode 100644 index 000000000..2ca226ebd --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/granite.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/granite" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/granite_slab.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/granite_slab.json new file mode 100644 index 000000000..fe961ead1 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/granite_slab.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/granite_slab" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/granite_stairs.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/granite_stairs.json new file mode 100644 index 000000000..0ce2b72ee --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/granite_stairs.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/granite_stairs" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/granite_wall.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/granite_wall.json new file mode 100644 index 000000000..e6c7d512b --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/granite_wall.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/granite_wall_inventory" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/grass_block.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/grass_block.json new file mode 100644 index 000000000..78f1969c5 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/grass_block.json @@ -0,0 +1,13 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/grass_block", + "tints": [ + { + "type": "minecraft:grass", + "downfall": 1.0, + "temperature": 0.5 + } + ] + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/gravel.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/gravel.json new file mode 100644 index 000000000..2026e5445 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/gravel.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/gravel" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/gray_banner.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/gray_banner.json new file mode 100644 index 000000000..8949b04ff --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/gray_banner.json @@ -0,0 +1,10 @@ +{ + "model": { + "type": "minecraft:special", + "base": "minecraft:item/template_banner", + "model": { + "type": "minecraft:banner", + "color": "gray" + } + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/gray_bed.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/gray_bed.json new file mode 100644 index 000000000..79e938173 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/gray_bed.json @@ -0,0 +1,10 @@ +{ + "model": { + "type": "minecraft:special", + "base": "minecraft:item/gray_bed", + "model": { + "type": "minecraft:bed", + "texture": "minecraft:gray" + } + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/gray_bundle.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/gray_bundle.json new file mode 100644 index 000000000..631b36637 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/gray_bundle.json @@ -0,0 +1,39 @@ +{ + "model": { + "type": "minecraft:select", + "cases": [ + { + "model": { + "type": "minecraft:condition", + "on_false": { + "type": "minecraft:model", + "model": "minecraft:item/gray_bundle" + }, + "on_true": { + "type": "minecraft:composite", + "models": [ + { + "type": "minecraft:model", + "model": "minecraft:item/gray_bundle_open_back" + }, + { + "type": "minecraft:bundle/selected_item" + }, + { + "type": "minecraft:model", + "model": "minecraft:item/gray_bundle_open_front" + } + ] + }, + "property": "minecraft:bundle/has_selected_item" + }, + "when": "gui" + } + ], + "fallback": { + "type": "minecraft:model", + "model": "minecraft:item/gray_bundle" + }, + "property": "minecraft:display_context" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/gray_candle.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/gray_candle.json new file mode 100644 index 000000000..343de6d50 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/gray_candle.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/gray_candle" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/gray_carpet.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/gray_carpet.json new file mode 100644 index 000000000..640d832b3 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/gray_carpet.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/gray_carpet" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/gray_concrete.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/gray_concrete.json new file mode 100644 index 000000000..5c85b853a --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/gray_concrete.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/gray_concrete" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/gray_concrete_powder.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/gray_concrete_powder.json new file mode 100644 index 000000000..2db1dc072 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/gray_concrete_powder.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/gray_concrete_powder" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/gray_dye.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/gray_dye.json new file mode 100644 index 000000000..979ccdb56 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/gray_dye.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/gray_dye" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/gray_glazed_terracotta.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/gray_glazed_terracotta.json new file mode 100644 index 000000000..30de14b8a --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/gray_glazed_terracotta.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/gray_glazed_terracotta" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/gray_shulker_box.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/gray_shulker_box.json new file mode 100644 index 000000000..50b2e1f6e --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/gray_shulker_box.json @@ -0,0 +1,10 @@ +{ + "model": { + "type": "minecraft:special", + "base": "minecraft:item/gray_shulker_box", + "model": { + "type": "minecraft:shulker_box", + "texture": "minecraft:shulker_gray" + } + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/gray_stained_glass.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/gray_stained_glass.json new file mode 100644 index 000000000..a96dd88e4 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/gray_stained_glass.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/gray_stained_glass" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/gray_stained_glass_pane.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/gray_stained_glass_pane.json new file mode 100644 index 000000000..6443b917e --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/gray_stained_glass_pane.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/gray_stained_glass_pane" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/gray_terracotta.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/gray_terracotta.json new file mode 100644 index 000000000..b0e977fb3 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/gray_terracotta.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/gray_terracotta" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/gray_wool.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/gray_wool.json new file mode 100644 index 000000000..34a97462a --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/gray_wool.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/gray_wool" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/green_banner.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/green_banner.json new file mode 100644 index 000000000..22e57d532 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/green_banner.json @@ -0,0 +1,10 @@ +{ + "model": { + "type": "minecraft:special", + "base": "minecraft:item/template_banner", + "model": { + "type": "minecraft:banner", + "color": "green" + } + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/green_bed.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/green_bed.json new file mode 100644 index 000000000..7658b76c7 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/green_bed.json @@ -0,0 +1,10 @@ +{ + "model": { + "type": "minecraft:special", + "base": "minecraft:item/green_bed", + "model": { + "type": "minecraft:bed", + "texture": "minecraft:green" + } + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/green_bundle.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/green_bundle.json new file mode 100644 index 000000000..59bf89dc9 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/green_bundle.json @@ -0,0 +1,39 @@ +{ + "model": { + "type": "minecraft:select", + "cases": [ + { + "model": { + "type": "minecraft:condition", + "on_false": { + "type": "minecraft:model", + "model": "minecraft:item/green_bundle" + }, + "on_true": { + "type": "minecraft:composite", + "models": [ + { + "type": "minecraft:model", + "model": "minecraft:item/green_bundle_open_back" + }, + { + "type": "minecraft:bundle/selected_item" + }, + { + "type": "minecraft:model", + "model": "minecraft:item/green_bundle_open_front" + } + ] + }, + "property": "minecraft:bundle/has_selected_item" + }, + "when": "gui" + } + ], + "fallback": { + "type": "minecraft:model", + "model": "minecraft:item/green_bundle" + }, + "property": "minecraft:display_context" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/green_candle.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/green_candle.json new file mode 100644 index 000000000..6a9b8254c --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/green_candle.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/green_candle" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/green_carpet.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/green_carpet.json new file mode 100644 index 000000000..c1483ea33 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/green_carpet.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/green_carpet" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/green_concrete.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/green_concrete.json new file mode 100644 index 000000000..c8a3f219d --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/green_concrete.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/green_concrete" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/green_concrete_powder.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/green_concrete_powder.json new file mode 100644 index 000000000..28a51e628 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/green_concrete_powder.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/green_concrete_powder" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/green_dye.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/green_dye.json new file mode 100644 index 000000000..54496b266 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/green_dye.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/green_dye" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/green_glazed_terracotta.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/green_glazed_terracotta.json new file mode 100644 index 000000000..fe562296a --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/green_glazed_terracotta.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/green_glazed_terracotta" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/green_shulker_box.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/green_shulker_box.json new file mode 100644 index 000000000..96edd07a4 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/green_shulker_box.json @@ -0,0 +1,10 @@ +{ + "model": { + "type": "minecraft:special", + "base": "minecraft:item/green_shulker_box", + "model": { + "type": "minecraft:shulker_box", + "texture": "minecraft:shulker_green" + } + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/green_stained_glass.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/green_stained_glass.json new file mode 100644 index 000000000..dfe0c272a --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/green_stained_glass.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/green_stained_glass" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/green_stained_glass_pane.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/green_stained_glass_pane.json new file mode 100644 index 000000000..c1fe5ba16 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/green_stained_glass_pane.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/green_stained_glass_pane" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/green_terracotta.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/green_terracotta.json new file mode 100644 index 000000000..b86f81064 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/green_terracotta.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/green_terracotta" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/green_wool.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/green_wool.json new file mode 100644 index 000000000..b4ce7e988 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/green_wool.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/green_wool" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/grindstone.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/grindstone.json new file mode 100644 index 000000000..4c5f45b68 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/grindstone.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/grindstone" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/guardian_spawn_egg.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/guardian_spawn_egg.json new file mode 100644 index 000000000..55e053e12 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/guardian_spawn_egg.json @@ -0,0 +1,16 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/template_spawn_egg", + "tints": [ + { + "type": "minecraft:constant", + "value": -10845582 + }, + { + "type": "minecraft:constant", + "value": -950992 + } + ] + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/gunpowder.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/gunpowder.json new file mode 100644 index 000000000..5db05cef2 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/gunpowder.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/gunpowder" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/guster_banner_pattern.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/guster_banner_pattern.json new file mode 100644 index 000000000..d4e3fe1e0 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/guster_banner_pattern.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/guster_banner_pattern" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/guster_pottery_sherd.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/guster_pottery_sherd.json new file mode 100644 index 000000000..8de8ad0fa --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/guster_pottery_sherd.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/guster_pottery_sherd" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/hanging_roots.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/hanging_roots.json new file mode 100644 index 000000000..0c5ef0eb5 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/hanging_roots.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/hanging_roots" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/hay_block.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/hay_block.json new file mode 100644 index 000000000..da9a175d2 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/hay_block.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/hay_block" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/heart_of_the_sea.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/heart_of_the_sea.json new file mode 100644 index 000000000..37bab6c87 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/heart_of_the_sea.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/heart_of_the_sea" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/heart_pottery_sherd.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/heart_pottery_sherd.json new file mode 100644 index 000000000..9c0dc00d6 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/heart_pottery_sherd.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/heart_pottery_sherd" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/heartbreak_pottery_sherd.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/heartbreak_pottery_sherd.json new file mode 100644 index 000000000..14b4f6296 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/heartbreak_pottery_sherd.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/heartbreak_pottery_sherd" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/heavy_core.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/heavy_core.json new file mode 100644 index 000000000..ea03fa095 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/heavy_core.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/heavy_core" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/heavy_weighted_pressure_plate.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/heavy_weighted_pressure_plate.json new file mode 100644 index 000000000..0cc82a64a --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/heavy_weighted_pressure_plate.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/heavy_weighted_pressure_plate" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/hoglin_spawn_egg.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/hoglin_spawn_egg.json new file mode 100644 index 000000000..fe7980f46 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/hoglin_spawn_egg.json @@ -0,0 +1,16 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/template_spawn_egg", + "tints": [ + { + "type": "minecraft:constant", + "value": -3772843 + }, + { + "type": "minecraft:constant", + "value": -10525596 + } + ] + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/honey_block.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/honey_block.json new file mode 100644 index 000000000..1e6e3c2fe --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/honey_block.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/honey_block" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/honey_bottle.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/honey_bottle.json new file mode 100644 index 000000000..20f6301c2 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/honey_bottle.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/honey_bottle" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/honeycomb.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/honeycomb.json new file mode 100644 index 000000000..35526a0a4 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/honeycomb.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/honeycomb" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/honeycomb_block.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/honeycomb_block.json new file mode 100644 index 000000000..e082e65ae --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/honeycomb_block.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/honeycomb_block" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/hopper.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/hopper.json new file mode 100644 index 000000000..ff8ebdf9d --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/hopper.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/hopper" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/hopper_minecart.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/hopper_minecart.json new file mode 100644 index 000000000..b88edb127 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/hopper_minecart.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/hopper_minecart" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/horn_coral.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/horn_coral.json new file mode 100644 index 000000000..715b359f6 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/horn_coral.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/horn_coral" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/horn_coral_block.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/horn_coral_block.json new file mode 100644 index 000000000..6b986f24a --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/horn_coral_block.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/horn_coral_block" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/horn_coral_fan.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/horn_coral_fan.json new file mode 100644 index 000000000..121898de7 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/horn_coral_fan.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/horn_coral_fan" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/horse_spawn_egg.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/horse_spawn_egg.json new file mode 100644 index 000000000..89084d092 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/horse_spawn_egg.json @@ -0,0 +1,16 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/template_spawn_egg", + "tints": [ + { + "type": "minecraft:constant", + "value": -4153731 + }, + { + "type": "minecraft:constant", + "value": -1121024 + } + ] + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/host_armor_trim_smithing_template.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/host_armor_trim_smithing_template.json new file mode 100644 index 000000000..ab6fb59f5 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/host_armor_trim_smithing_template.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/host_armor_trim_smithing_template" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/howl_pottery_sherd.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/howl_pottery_sherd.json new file mode 100644 index 000000000..9f6bba7e2 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/howl_pottery_sherd.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/howl_pottery_sherd" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/husk_spawn_egg.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/husk_spawn_egg.json new file mode 100644 index 000000000..84aa544bb --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/husk_spawn_egg.json @@ -0,0 +1,16 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/template_spawn_egg", + "tints": [ + { + "type": "minecraft:constant", + "value": -8818591 + }, + { + "type": "minecraft:constant", + "value": -1651564 + } + ] + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/ice.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/ice.json new file mode 100644 index 000000000..b8991e788 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/ice.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/ice" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/infested_chiseled_stone_bricks.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/infested_chiseled_stone_bricks.json new file mode 100644 index 000000000..0001e6708 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/infested_chiseled_stone_bricks.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/chiseled_stone_bricks" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/infested_cobblestone.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/infested_cobblestone.json new file mode 100644 index 000000000..3bee3d364 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/infested_cobblestone.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/cobblestone" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/infested_cracked_stone_bricks.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/infested_cracked_stone_bricks.json new file mode 100644 index 000000000..0d27cdde0 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/infested_cracked_stone_bricks.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/cracked_stone_bricks" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/infested_deepslate.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/infested_deepslate.json new file mode 100644 index 000000000..77255c70c --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/infested_deepslate.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/deepslate" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/infested_mossy_stone_bricks.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/infested_mossy_stone_bricks.json new file mode 100644 index 000000000..431c66314 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/infested_mossy_stone_bricks.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/mossy_stone_bricks" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/infested_stone.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/infested_stone.json new file mode 100644 index 000000000..f5c9f2a0d --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/infested_stone.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/stone" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/infested_stone_bricks.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/infested_stone_bricks.json new file mode 100644 index 000000000..a61dd731d --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/infested_stone_bricks.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/stone_bricks" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/ink_sac.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/ink_sac.json new file mode 100644 index 000000000..2cfcafe9f --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/ink_sac.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/ink_sac" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/iron_axe.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/iron_axe.json new file mode 100644 index 000000000..3cd80d733 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/iron_axe.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/iron_axe" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/iron_bars.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/iron_bars.json new file mode 100644 index 000000000..9a06cea97 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/iron_bars.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/iron_bars" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/iron_block.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/iron_block.json new file mode 100644 index 000000000..36d73e913 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/iron_block.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/iron_block" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/iron_boots.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/iron_boots.json new file mode 100644 index 000000000..feb3a4568 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/iron_boots.json @@ -0,0 +1,89 @@ +{ + "model": { + "type": "minecraft:select", + "cases": [ + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/iron_boots_quartz_trim" + }, + "when": "minecraft:quartz" + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/iron_boots_iron_trim" + }, + "when": "minecraft:iron" + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/iron_boots_netherite_trim" + }, + "when": "minecraft:netherite" + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/iron_boots_redstone_trim" + }, + "when": "minecraft:redstone" + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/iron_boots_copper_trim" + }, + "when": "minecraft:copper" + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/iron_boots_gold_trim" + }, + "when": "minecraft:gold" + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/iron_boots_emerald_trim" + }, + "when": "minecraft:emerald" + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/iron_boots_diamond_trim" + }, + "when": "minecraft:diamond" + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/iron_boots_lapis_trim" + }, + "when": "minecraft:lapis" + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/iron_boots_amethyst_trim" + }, + "when": "minecraft:amethyst" + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/iron_boots_resin_trim" + }, + "when": "minecraft:resin" + } + ], + "fallback": { + "type": "minecraft:model", + "model": "minecraft:item/iron_boots" + }, + "property": "minecraft:trim_material" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/iron_chestplate.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/iron_chestplate.json new file mode 100644 index 000000000..98230f972 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/iron_chestplate.json @@ -0,0 +1,89 @@ +{ + "model": { + "type": "minecraft:select", + "cases": [ + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/iron_chestplate_quartz_trim" + }, + "when": "minecraft:quartz" + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/iron_chestplate_iron_trim" + }, + "when": "minecraft:iron" + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/iron_chestplate_netherite_trim" + }, + "when": "minecraft:netherite" + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/iron_chestplate_redstone_trim" + }, + "when": "minecraft:redstone" + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/iron_chestplate_copper_trim" + }, + "when": "minecraft:copper" + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/iron_chestplate_gold_trim" + }, + "when": "minecraft:gold" + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/iron_chestplate_emerald_trim" + }, + "when": "minecraft:emerald" + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/iron_chestplate_diamond_trim" + }, + "when": "minecraft:diamond" + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/iron_chestplate_lapis_trim" + }, + "when": "minecraft:lapis" + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/iron_chestplate_amethyst_trim" + }, + "when": "minecraft:amethyst" + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/iron_chestplate_resin_trim" + }, + "when": "minecraft:resin" + } + ], + "fallback": { + "type": "minecraft:model", + "model": "minecraft:item/iron_chestplate" + }, + "property": "minecraft:trim_material" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/iron_door.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/iron_door.json new file mode 100644 index 000000000..39748231f --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/iron_door.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/iron_door" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/iron_golem_spawn_egg.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/iron_golem_spawn_egg.json new file mode 100644 index 000000000..f333d3e6c --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/iron_golem_spawn_egg.json @@ -0,0 +1,16 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/template_spawn_egg", + "tints": [ + { + "type": "minecraft:constant", + "value": -2372158 + }, + { + "type": "minecraft:constant", + "value": -9133262 + } + ] + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/iron_helmet.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/iron_helmet.json new file mode 100644 index 000000000..719098af4 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/iron_helmet.json @@ -0,0 +1,89 @@ +{ + "model": { + "type": "minecraft:select", + "cases": [ + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/iron_helmet_quartz_trim" + }, + "when": "minecraft:quartz" + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/iron_helmet_iron_trim" + }, + "when": "minecraft:iron" + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/iron_helmet_netherite_trim" + }, + "when": "minecraft:netherite" + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/iron_helmet_redstone_trim" + }, + "when": "minecraft:redstone" + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/iron_helmet_copper_trim" + }, + "when": "minecraft:copper" + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/iron_helmet_gold_trim" + }, + "when": "minecraft:gold" + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/iron_helmet_emerald_trim" + }, + "when": "minecraft:emerald" + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/iron_helmet_diamond_trim" + }, + "when": "minecraft:diamond" + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/iron_helmet_lapis_trim" + }, + "when": "minecraft:lapis" + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/iron_helmet_amethyst_trim" + }, + "when": "minecraft:amethyst" + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/iron_helmet_resin_trim" + }, + "when": "minecraft:resin" + } + ], + "fallback": { + "type": "minecraft:model", + "model": "minecraft:item/iron_helmet" + }, + "property": "minecraft:trim_material" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/iron_hoe.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/iron_hoe.json new file mode 100644 index 000000000..fdc1b4606 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/iron_hoe.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/iron_hoe" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/iron_horse_armor.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/iron_horse_armor.json new file mode 100644 index 000000000..051f1602f --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/iron_horse_armor.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/iron_horse_armor" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/iron_ingot.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/iron_ingot.json new file mode 100644 index 000000000..bb2f3925f --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/iron_ingot.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/iron_ingot" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/iron_leggings.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/iron_leggings.json new file mode 100644 index 000000000..83b7369c6 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/iron_leggings.json @@ -0,0 +1,89 @@ +{ + "model": { + "type": "minecraft:select", + "cases": [ + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/iron_leggings_quartz_trim" + }, + "when": "minecraft:quartz" + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/iron_leggings_iron_trim" + }, + "when": "minecraft:iron" + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/iron_leggings_netherite_trim" + }, + "when": "minecraft:netherite" + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/iron_leggings_redstone_trim" + }, + "when": "minecraft:redstone" + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/iron_leggings_copper_trim" + }, + "when": "minecraft:copper" + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/iron_leggings_gold_trim" + }, + "when": "minecraft:gold" + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/iron_leggings_emerald_trim" + }, + "when": "minecraft:emerald" + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/iron_leggings_diamond_trim" + }, + "when": "minecraft:diamond" + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/iron_leggings_lapis_trim" + }, + "when": "minecraft:lapis" + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/iron_leggings_amethyst_trim" + }, + "when": "minecraft:amethyst" + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/iron_leggings_resin_trim" + }, + "when": "minecraft:resin" + } + ], + "fallback": { + "type": "minecraft:model", + "model": "minecraft:item/iron_leggings" + }, + "property": "minecraft:trim_material" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/iron_nugget.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/iron_nugget.json new file mode 100644 index 000000000..4ec573eea --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/iron_nugget.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/iron_nugget" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/iron_ore.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/iron_ore.json new file mode 100644 index 000000000..44d467e3f --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/iron_ore.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/iron_ore" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/iron_pickaxe.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/iron_pickaxe.json new file mode 100644 index 000000000..5a3f0d1b2 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/iron_pickaxe.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/iron_pickaxe" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/iron_shovel.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/iron_shovel.json new file mode 100644 index 000000000..3ff9689a9 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/iron_shovel.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/iron_shovel" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/iron_sword.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/iron_sword.json new file mode 100644 index 000000000..1bf4bb7df --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/iron_sword.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/iron_sword" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/iron_trapdoor.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/iron_trapdoor.json new file mode 100644 index 000000000..b3de8ef59 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/iron_trapdoor.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/iron_trapdoor_bottom" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/item_frame.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/item_frame.json new file mode 100644 index 000000000..b115f49f1 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/item_frame.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/item_frame" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/jack_o_lantern.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/jack_o_lantern.json new file mode 100644 index 000000000..0a1e97b40 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/jack_o_lantern.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/jack_o_lantern" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/jigsaw.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/jigsaw.json new file mode 100644 index 000000000..29fc70593 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/jigsaw.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/jigsaw" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/jukebox.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/jukebox.json new file mode 100644 index 000000000..1e9a265b7 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/jukebox.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/jukebox" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/jungle_boat.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/jungle_boat.json new file mode 100644 index 000000000..2c6c1771b --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/jungle_boat.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/jungle_boat" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/jungle_button.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/jungle_button.json new file mode 100644 index 000000000..2085f50ff --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/jungle_button.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/jungle_button_inventory" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/jungle_chest_boat.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/jungle_chest_boat.json new file mode 100644 index 000000000..8dec2a7a9 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/jungle_chest_boat.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/jungle_chest_boat" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/jungle_door.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/jungle_door.json new file mode 100644 index 000000000..28f69bb9e --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/jungle_door.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/jungle_door" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/jungle_fence.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/jungle_fence.json new file mode 100644 index 000000000..91b461cfa --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/jungle_fence.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/jungle_fence_inventory" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/jungle_fence_gate.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/jungle_fence_gate.json new file mode 100644 index 000000000..a6a07e9e3 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/jungle_fence_gate.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/jungle_fence_gate" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/jungle_hanging_sign.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/jungle_hanging_sign.json new file mode 100644 index 000000000..bffa44c27 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/jungle_hanging_sign.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/jungle_hanging_sign" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/jungle_leaves.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/jungle_leaves.json new file mode 100644 index 000000000..8454101d7 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/jungle_leaves.json @@ -0,0 +1,12 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/jungle_leaves", + "tints": [ + { + "type": "minecraft:constant", + "value": -12012264 + } + ] + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/jungle_log.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/jungle_log.json new file mode 100644 index 000000000..8298b45ba --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/jungle_log.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/jungle_log" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/jungle_planks.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/jungle_planks.json new file mode 100644 index 000000000..3b34aeba0 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/jungle_planks.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/jungle_planks" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/jungle_pressure_plate.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/jungle_pressure_plate.json new file mode 100644 index 000000000..114523418 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/jungle_pressure_plate.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/jungle_pressure_plate" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/jungle_sapling.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/jungle_sapling.json new file mode 100644 index 000000000..1daef334f --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/jungle_sapling.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/jungle_sapling" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/jungle_sign.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/jungle_sign.json new file mode 100644 index 000000000..8821883c4 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/jungle_sign.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/jungle_sign" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/jungle_slab.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/jungle_slab.json new file mode 100644 index 000000000..4bc7cfa3a --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/jungle_slab.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/jungle_slab" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/jungle_stairs.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/jungle_stairs.json new file mode 100644 index 000000000..b12a606ac --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/jungle_stairs.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/jungle_stairs" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/jungle_trapdoor.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/jungle_trapdoor.json new file mode 100644 index 000000000..20a14ec79 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/jungle_trapdoor.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/jungle_trapdoor_bottom" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/jungle_wood.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/jungle_wood.json new file mode 100644 index 000000000..4d79d4eb7 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/jungle_wood.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/jungle_wood" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/kelp.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/kelp.json new file mode 100644 index 000000000..f7a11c1b2 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/kelp.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/kelp" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/knowledge_book.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/knowledge_book.json new file mode 100644 index 000000000..87e46889b --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/knowledge_book.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/knowledge_book" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/ladder.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/ladder.json new file mode 100644 index 000000000..d65cb1d37 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/ladder.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/ladder" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/lantern.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/lantern.json new file mode 100644 index 000000000..05c3c2715 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/lantern.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/lantern" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/lapis_block.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/lapis_block.json new file mode 100644 index 000000000..a7e9736b3 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/lapis_block.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/lapis_block" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/lapis_lazuli.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/lapis_lazuli.json new file mode 100644 index 000000000..06707433c --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/lapis_lazuli.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/lapis_lazuli" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/lapis_ore.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/lapis_ore.json new file mode 100644 index 000000000..4bff6f79b --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/lapis_ore.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/lapis_ore" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/large_amethyst_bud.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/large_amethyst_bud.json new file mode 100644 index 000000000..6e2059240 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/large_amethyst_bud.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/large_amethyst_bud" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/large_fern.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/large_fern.json new file mode 100644 index 000000000..6f600341a --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/large_fern.json @@ -0,0 +1,13 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/large_fern", + "tints": [ + { + "type": "minecraft:grass", + "downfall": 1.0, + "temperature": 0.5 + } + ] + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/lava_bucket.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/lava_bucket.json new file mode 100644 index 000000000..5d7f2ff5d --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/lava_bucket.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/lava_bucket" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/lead.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/lead.json new file mode 100644 index 000000000..92105d2cc --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/lead.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/lead" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/leather.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/leather.json new file mode 100644 index 000000000..7e0715b62 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/leather.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/leather" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/leather_boots.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/leather_boots.json new file mode 100644 index 000000000..856efcaf6 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/leather_boots.json @@ -0,0 +1,161 @@ +{ + "model": { + "type": "minecraft:select", + "cases": [ + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/leather_boots_quartz_trim", + "tints": [ + { + "type": "minecraft:dye", + "default": -6265536 + } + ] + }, + "when": "minecraft:quartz" + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/leather_boots_iron_trim", + "tints": [ + { + "type": "minecraft:dye", + "default": -6265536 + } + ] + }, + "when": "minecraft:iron" + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/leather_boots_netherite_trim", + "tints": [ + { + "type": "minecraft:dye", + "default": -6265536 + } + ] + }, + "when": "minecraft:netherite" + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/leather_boots_redstone_trim", + "tints": [ + { + "type": "minecraft:dye", + "default": -6265536 + } + ] + }, + "when": "minecraft:redstone" + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/leather_boots_copper_trim", + "tints": [ + { + "type": "minecraft:dye", + "default": -6265536 + } + ] + }, + "when": "minecraft:copper" + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/leather_boots_gold_trim", + "tints": [ + { + "type": "minecraft:dye", + "default": -6265536 + } + ] + }, + "when": "minecraft:gold" + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/leather_boots_emerald_trim", + "tints": [ + { + "type": "minecraft:dye", + "default": -6265536 + } + ] + }, + "when": "minecraft:emerald" + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/leather_boots_diamond_trim", + "tints": [ + { + "type": "minecraft:dye", + "default": -6265536 + } + ] + }, + "when": "minecraft:diamond" + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/leather_boots_lapis_trim", + "tints": [ + { + "type": "minecraft:dye", + "default": -6265536 + } + ] + }, + "when": "minecraft:lapis" + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/leather_boots_amethyst_trim", + "tints": [ + { + "type": "minecraft:dye", + "default": -6265536 + } + ] + }, + "when": "minecraft:amethyst" + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/leather_boots_resin_trim", + "tints": [ + { + "type": "minecraft:dye", + "default": -6265536 + } + ] + }, + "when": "minecraft:resin" + } + ], + "fallback": { + "type": "minecraft:model", + "model": "minecraft:item/leather_boots", + "tints": [ + { + "type": "minecraft:dye", + "default": -6265536 + } + ] + }, + "property": "minecraft:trim_material" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/leather_chestplate.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/leather_chestplate.json new file mode 100644 index 000000000..178794777 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/leather_chestplate.json @@ -0,0 +1,161 @@ +{ + "model": { + "type": "minecraft:select", + "cases": [ + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/leather_chestplate_quartz_trim", + "tints": [ + { + "type": "minecraft:dye", + "default": -6265536 + } + ] + }, + "when": "minecraft:quartz" + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/leather_chestplate_iron_trim", + "tints": [ + { + "type": "minecraft:dye", + "default": -6265536 + } + ] + }, + "when": "minecraft:iron" + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/leather_chestplate_netherite_trim", + "tints": [ + { + "type": "minecraft:dye", + "default": -6265536 + } + ] + }, + "when": "minecraft:netherite" + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/leather_chestplate_redstone_trim", + "tints": [ + { + "type": "minecraft:dye", + "default": -6265536 + } + ] + }, + "when": "minecraft:redstone" + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/leather_chestplate_copper_trim", + "tints": [ + { + "type": "minecraft:dye", + "default": -6265536 + } + ] + }, + "when": "minecraft:copper" + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/leather_chestplate_gold_trim", + "tints": [ + { + "type": "minecraft:dye", + "default": -6265536 + } + ] + }, + "when": "minecraft:gold" + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/leather_chestplate_emerald_trim", + "tints": [ + { + "type": "minecraft:dye", + "default": -6265536 + } + ] + }, + "when": "minecraft:emerald" + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/leather_chestplate_diamond_trim", + "tints": [ + { + "type": "minecraft:dye", + "default": -6265536 + } + ] + }, + "when": "minecraft:diamond" + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/leather_chestplate_lapis_trim", + "tints": [ + { + "type": "minecraft:dye", + "default": -6265536 + } + ] + }, + "when": "minecraft:lapis" + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/leather_chestplate_amethyst_trim", + "tints": [ + { + "type": "minecraft:dye", + "default": -6265536 + } + ] + }, + "when": "minecraft:amethyst" + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/leather_chestplate_resin_trim", + "tints": [ + { + "type": "minecraft:dye", + "default": -6265536 + } + ] + }, + "when": "minecraft:resin" + } + ], + "fallback": { + "type": "minecraft:model", + "model": "minecraft:item/leather_chestplate", + "tints": [ + { + "type": "minecraft:dye", + "default": -6265536 + } + ] + }, + "property": "minecraft:trim_material" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/leather_helmet.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/leather_helmet.json new file mode 100644 index 000000000..feecbc7ed --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/leather_helmet.json @@ -0,0 +1,161 @@ +{ + "model": { + "type": "minecraft:select", + "cases": [ + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/leather_helmet_quartz_trim", + "tints": [ + { + "type": "minecraft:dye", + "default": -6265536 + } + ] + }, + "when": "minecraft:quartz" + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/leather_helmet_iron_trim", + "tints": [ + { + "type": "minecraft:dye", + "default": -6265536 + } + ] + }, + "when": "minecraft:iron" + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/leather_helmet_netherite_trim", + "tints": [ + { + "type": "minecraft:dye", + "default": -6265536 + } + ] + }, + "when": "minecraft:netherite" + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/leather_helmet_redstone_trim", + "tints": [ + { + "type": "minecraft:dye", + "default": -6265536 + } + ] + }, + "when": "minecraft:redstone" + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/leather_helmet_copper_trim", + "tints": [ + { + "type": "minecraft:dye", + "default": -6265536 + } + ] + }, + "when": "minecraft:copper" + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/leather_helmet_gold_trim", + "tints": [ + { + "type": "minecraft:dye", + "default": -6265536 + } + ] + }, + "when": "minecraft:gold" + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/leather_helmet_emerald_trim", + "tints": [ + { + "type": "minecraft:dye", + "default": -6265536 + } + ] + }, + "when": "minecraft:emerald" + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/leather_helmet_diamond_trim", + "tints": [ + { + "type": "minecraft:dye", + "default": -6265536 + } + ] + }, + "when": "minecraft:diamond" + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/leather_helmet_lapis_trim", + "tints": [ + { + "type": "minecraft:dye", + "default": -6265536 + } + ] + }, + "when": "minecraft:lapis" + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/leather_helmet_amethyst_trim", + "tints": [ + { + "type": "minecraft:dye", + "default": -6265536 + } + ] + }, + "when": "minecraft:amethyst" + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/leather_helmet_resin_trim", + "tints": [ + { + "type": "minecraft:dye", + "default": -6265536 + } + ] + }, + "when": "minecraft:resin" + } + ], + "fallback": { + "type": "minecraft:model", + "model": "minecraft:item/leather_helmet", + "tints": [ + { + "type": "minecraft:dye", + "default": -6265536 + } + ] + }, + "property": "minecraft:trim_material" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/leather_horse_armor.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/leather_horse_armor.json new file mode 100644 index 000000000..fff10050b --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/leather_horse_armor.json @@ -0,0 +1,12 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/leather_horse_armor", + "tints": [ + { + "type": "minecraft:dye", + "default": -6265536 + } + ] + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/leather_leggings.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/leather_leggings.json new file mode 100644 index 000000000..aea8bce84 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/leather_leggings.json @@ -0,0 +1,161 @@ +{ + "model": { + "type": "minecraft:select", + "cases": [ + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/leather_leggings_quartz_trim", + "tints": [ + { + "type": "minecraft:dye", + "default": -6265536 + } + ] + }, + "when": "minecraft:quartz" + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/leather_leggings_iron_trim", + "tints": [ + { + "type": "minecraft:dye", + "default": -6265536 + } + ] + }, + "when": "minecraft:iron" + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/leather_leggings_netherite_trim", + "tints": [ + { + "type": "minecraft:dye", + "default": -6265536 + } + ] + }, + "when": "minecraft:netherite" + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/leather_leggings_redstone_trim", + "tints": [ + { + "type": "minecraft:dye", + "default": -6265536 + } + ] + }, + "when": "minecraft:redstone" + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/leather_leggings_copper_trim", + "tints": [ + { + "type": "minecraft:dye", + "default": -6265536 + } + ] + }, + "when": "minecraft:copper" + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/leather_leggings_gold_trim", + "tints": [ + { + "type": "minecraft:dye", + "default": -6265536 + } + ] + }, + "when": "minecraft:gold" + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/leather_leggings_emerald_trim", + "tints": [ + { + "type": "minecraft:dye", + "default": -6265536 + } + ] + }, + "when": "minecraft:emerald" + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/leather_leggings_diamond_trim", + "tints": [ + { + "type": "minecraft:dye", + "default": -6265536 + } + ] + }, + "when": "minecraft:diamond" + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/leather_leggings_lapis_trim", + "tints": [ + { + "type": "minecraft:dye", + "default": -6265536 + } + ] + }, + "when": "minecraft:lapis" + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/leather_leggings_amethyst_trim", + "tints": [ + { + "type": "minecraft:dye", + "default": -6265536 + } + ] + }, + "when": "minecraft:amethyst" + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/leather_leggings_resin_trim", + "tints": [ + { + "type": "minecraft:dye", + "default": -6265536 + } + ] + }, + "when": "minecraft:resin" + } + ], + "fallback": { + "type": "minecraft:model", + "model": "minecraft:item/leather_leggings", + "tints": [ + { + "type": "minecraft:dye", + "default": -6265536 + } + ] + }, + "property": "minecraft:trim_material" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/lectern.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/lectern.json new file mode 100644 index 000000000..12099c3c3 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/lectern.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/lectern" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/lever.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/lever.json new file mode 100644 index 000000000..102071200 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/lever.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/lever" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/light.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/light.json new file mode 100644 index 000000000..01c6f2065 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/light.json @@ -0,0 +1,125 @@ +{ + "model": { + "type": "minecraft:select", + "block_state_property": "level", + "cases": [ + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/light_00" + }, + "when": "0" + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/light_01" + }, + "when": "1" + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/light_02" + }, + "when": "2" + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/light_03" + }, + "when": "3" + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/light_04" + }, + "when": "4" + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/light_05" + }, + "when": "5" + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/light_06" + }, + "when": "6" + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/light_07" + }, + "when": "7" + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/light_08" + }, + "when": "8" + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/light_09" + }, + "when": "9" + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/light_10" + }, + "when": "10" + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/light_11" + }, + "when": "11" + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/light_12" + }, + "when": "12" + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/light_13" + }, + "when": "13" + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/light_14" + }, + "when": "14" + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/light_15" + }, + "when": "15" + } + ], + "fallback": { + "type": "minecraft:model", + "model": "minecraft:item/light" + }, + "property": "minecraft:block_state" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/light_blue_banner.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/light_blue_banner.json new file mode 100644 index 000000000..6b64861d4 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/light_blue_banner.json @@ -0,0 +1,10 @@ +{ + "model": { + "type": "minecraft:special", + "base": "minecraft:item/template_banner", + "model": { + "type": "minecraft:banner", + "color": "light_blue" + } + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/light_blue_bed.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/light_blue_bed.json new file mode 100644 index 000000000..f899f0f6d --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/light_blue_bed.json @@ -0,0 +1,10 @@ +{ + "model": { + "type": "minecraft:special", + "base": "minecraft:item/light_blue_bed", + "model": { + "type": "minecraft:bed", + "texture": "minecraft:light_blue" + } + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/light_blue_bundle.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/light_blue_bundle.json new file mode 100644 index 000000000..a0c87bd55 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/light_blue_bundle.json @@ -0,0 +1,39 @@ +{ + "model": { + "type": "minecraft:select", + "cases": [ + { + "model": { + "type": "minecraft:condition", + "on_false": { + "type": "minecraft:model", + "model": "minecraft:item/light_blue_bundle" + }, + "on_true": { + "type": "minecraft:composite", + "models": [ + { + "type": "minecraft:model", + "model": "minecraft:item/light_blue_bundle_open_back" + }, + { + "type": "minecraft:bundle/selected_item" + }, + { + "type": "minecraft:model", + "model": "minecraft:item/light_blue_bundle_open_front" + } + ] + }, + "property": "minecraft:bundle/has_selected_item" + }, + "when": "gui" + } + ], + "fallback": { + "type": "minecraft:model", + "model": "minecraft:item/light_blue_bundle" + }, + "property": "minecraft:display_context" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/light_blue_candle.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/light_blue_candle.json new file mode 100644 index 000000000..4e8cf64c8 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/light_blue_candle.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/light_blue_candle" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/light_blue_carpet.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/light_blue_carpet.json new file mode 100644 index 000000000..0027a2fe5 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/light_blue_carpet.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/light_blue_carpet" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/light_blue_concrete.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/light_blue_concrete.json new file mode 100644 index 000000000..96f58785f --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/light_blue_concrete.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/light_blue_concrete" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/light_blue_concrete_powder.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/light_blue_concrete_powder.json new file mode 100644 index 000000000..2ac541e7b --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/light_blue_concrete_powder.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/light_blue_concrete_powder" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/light_blue_dye.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/light_blue_dye.json new file mode 100644 index 000000000..527ad68ad --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/light_blue_dye.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/light_blue_dye" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/light_blue_glazed_terracotta.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/light_blue_glazed_terracotta.json new file mode 100644 index 000000000..1e34edfb7 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/light_blue_glazed_terracotta.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/light_blue_glazed_terracotta" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/light_blue_shulker_box.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/light_blue_shulker_box.json new file mode 100644 index 000000000..13e5b1201 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/light_blue_shulker_box.json @@ -0,0 +1,10 @@ +{ + "model": { + "type": "minecraft:special", + "base": "minecraft:item/light_blue_shulker_box", + "model": { + "type": "minecraft:shulker_box", + "texture": "minecraft:shulker_light_blue" + } + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/light_blue_stained_glass.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/light_blue_stained_glass.json new file mode 100644 index 000000000..84a8a87cd --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/light_blue_stained_glass.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/light_blue_stained_glass" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/light_blue_stained_glass_pane.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/light_blue_stained_glass_pane.json new file mode 100644 index 000000000..4d8f49179 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/light_blue_stained_glass_pane.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/light_blue_stained_glass_pane" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/light_blue_terracotta.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/light_blue_terracotta.json new file mode 100644 index 000000000..cf18f080c --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/light_blue_terracotta.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/light_blue_terracotta" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/light_blue_wool.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/light_blue_wool.json new file mode 100644 index 000000000..d4dc15c78 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/light_blue_wool.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/light_blue_wool" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/light_gray_banner.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/light_gray_banner.json new file mode 100644 index 000000000..cec38b001 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/light_gray_banner.json @@ -0,0 +1,10 @@ +{ + "model": { + "type": "minecraft:special", + "base": "minecraft:item/template_banner", + "model": { + "type": "minecraft:banner", + "color": "light_gray" + } + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/light_gray_bed.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/light_gray_bed.json new file mode 100644 index 000000000..1b2b5fb1b --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/light_gray_bed.json @@ -0,0 +1,10 @@ +{ + "model": { + "type": "minecraft:special", + "base": "minecraft:item/light_gray_bed", + "model": { + "type": "minecraft:bed", + "texture": "minecraft:light_gray" + } + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/light_gray_bundle.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/light_gray_bundle.json new file mode 100644 index 000000000..3377fe603 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/light_gray_bundle.json @@ -0,0 +1,39 @@ +{ + "model": { + "type": "minecraft:select", + "cases": [ + { + "model": { + "type": "minecraft:condition", + "on_false": { + "type": "minecraft:model", + "model": "minecraft:item/light_gray_bundle" + }, + "on_true": { + "type": "minecraft:composite", + "models": [ + { + "type": "minecraft:model", + "model": "minecraft:item/light_gray_bundle_open_back" + }, + { + "type": "minecraft:bundle/selected_item" + }, + { + "type": "minecraft:model", + "model": "minecraft:item/light_gray_bundle_open_front" + } + ] + }, + "property": "minecraft:bundle/has_selected_item" + }, + "when": "gui" + } + ], + "fallback": { + "type": "minecraft:model", + "model": "minecraft:item/light_gray_bundle" + }, + "property": "minecraft:display_context" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/light_gray_candle.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/light_gray_candle.json new file mode 100644 index 000000000..324e9b039 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/light_gray_candle.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/light_gray_candle" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/light_gray_carpet.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/light_gray_carpet.json new file mode 100644 index 000000000..a905889df --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/light_gray_carpet.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/light_gray_carpet" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/light_gray_concrete.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/light_gray_concrete.json new file mode 100644 index 000000000..52b4e682a --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/light_gray_concrete.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/light_gray_concrete" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/light_gray_concrete_powder.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/light_gray_concrete_powder.json new file mode 100644 index 000000000..45a334cf3 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/light_gray_concrete_powder.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/light_gray_concrete_powder" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/light_gray_dye.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/light_gray_dye.json new file mode 100644 index 000000000..3d85aebda --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/light_gray_dye.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/light_gray_dye" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/light_gray_glazed_terracotta.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/light_gray_glazed_terracotta.json new file mode 100644 index 000000000..24cd3e3fc --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/light_gray_glazed_terracotta.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/light_gray_glazed_terracotta" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/light_gray_shulker_box.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/light_gray_shulker_box.json new file mode 100644 index 000000000..7b2890e77 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/light_gray_shulker_box.json @@ -0,0 +1,10 @@ +{ + "model": { + "type": "minecraft:special", + "base": "minecraft:item/light_gray_shulker_box", + "model": { + "type": "minecraft:shulker_box", + "texture": "minecraft:shulker_light_gray" + } + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/light_gray_stained_glass.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/light_gray_stained_glass.json new file mode 100644 index 000000000..f89b0d6c4 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/light_gray_stained_glass.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/light_gray_stained_glass" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/light_gray_stained_glass_pane.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/light_gray_stained_glass_pane.json new file mode 100644 index 000000000..7ffb8319b --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/light_gray_stained_glass_pane.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/light_gray_stained_glass_pane" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/light_gray_terracotta.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/light_gray_terracotta.json new file mode 100644 index 000000000..302d50eee --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/light_gray_terracotta.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/light_gray_terracotta" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/light_gray_wool.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/light_gray_wool.json new file mode 100644 index 000000000..ce28c352c --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/light_gray_wool.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/light_gray_wool" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/light_weighted_pressure_plate.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/light_weighted_pressure_plate.json new file mode 100644 index 000000000..f9fc01305 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/light_weighted_pressure_plate.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/light_weighted_pressure_plate" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/lightning_rod.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/lightning_rod.json new file mode 100644 index 000000000..318d6e169 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/lightning_rod.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/lightning_rod" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/lilac.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/lilac.json new file mode 100644 index 000000000..9dba13cd4 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/lilac.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/lilac" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/lily_of_the_valley.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/lily_of_the_valley.json new file mode 100644 index 000000000..11152cacc --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/lily_of_the_valley.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/lily_of_the_valley" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/lily_pad.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/lily_pad.json new file mode 100644 index 000000000..0952ad294 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/lily_pad.json @@ -0,0 +1,12 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/lily_pad", + "tints": [ + { + "type": "minecraft:constant", + "value": -9321636 + } + ] + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/lime_banner.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/lime_banner.json new file mode 100644 index 000000000..7a370b2f4 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/lime_banner.json @@ -0,0 +1,10 @@ +{ + "model": { + "type": "minecraft:special", + "base": "minecraft:item/template_banner", + "model": { + "type": "minecraft:banner", + "color": "lime" + } + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/lime_bed.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/lime_bed.json new file mode 100644 index 000000000..b81ee17bf --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/lime_bed.json @@ -0,0 +1,10 @@ +{ + "model": { + "type": "minecraft:special", + "base": "minecraft:item/lime_bed", + "model": { + "type": "minecraft:bed", + "texture": "minecraft:lime" + } + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/lime_bundle.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/lime_bundle.json new file mode 100644 index 000000000..3789b99dc --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/lime_bundle.json @@ -0,0 +1,39 @@ +{ + "model": { + "type": "minecraft:select", + "cases": [ + { + "model": { + "type": "minecraft:condition", + "on_false": { + "type": "minecraft:model", + "model": "minecraft:item/lime_bundle" + }, + "on_true": { + "type": "minecraft:composite", + "models": [ + { + "type": "minecraft:model", + "model": "minecraft:item/lime_bundle_open_back" + }, + { + "type": "minecraft:bundle/selected_item" + }, + { + "type": "minecraft:model", + "model": "minecraft:item/lime_bundle_open_front" + } + ] + }, + "property": "minecraft:bundle/has_selected_item" + }, + "when": "gui" + } + ], + "fallback": { + "type": "minecraft:model", + "model": "minecraft:item/lime_bundle" + }, + "property": "minecraft:display_context" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/lime_candle.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/lime_candle.json new file mode 100644 index 000000000..edd5748ee --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/lime_candle.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/lime_candle" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/lime_carpet.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/lime_carpet.json new file mode 100644 index 000000000..3dc877eb9 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/lime_carpet.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/lime_carpet" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/lime_concrete.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/lime_concrete.json new file mode 100644 index 000000000..832edacbd --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/lime_concrete.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/lime_concrete" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/lime_concrete_powder.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/lime_concrete_powder.json new file mode 100644 index 000000000..f6e39ed51 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/lime_concrete_powder.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/lime_concrete_powder" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/lime_dye.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/lime_dye.json new file mode 100644 index 000000000..cda6a9029 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/lime_dye.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/lime_dye" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/lime_glazed_terracotta.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/lime_glazed_terracotta.json new file mode 100644 index 000000000..897348b81 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/lime_glazed_terracotta.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/lime_glazed_terracotta" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/lime_shulker_box.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/lime_shulker_box.json new file mode 100644 index 000000000..2849f5e8e --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/lime_shulker_box.json @@ -0,0 +1,10 @@ +{ + "model": { + "type": "minecraft:special", + "base": "minecraft:item/lime_shulker_box", + "model": { + "type": "minecraft:shulker_box", + "texture": "minecraft:shulker_lime" + } + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/lime_stained_glass.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/lime_stained_glass.json new file mode 100644 index 000000000..c9d1ae30c --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/lime_stained_glass.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/lime_stained_glass" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/lime_stained_glass_pane.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/lime_stained_glass_pane.json new file mode 100644 index 000000000..24fb9e2b3 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/lime_stained_glass_pane.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/lime_stained_glass_pane" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/lime_terracotta.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/lime_terracotta.json new file mode 100644 index 000000000..d08631acc --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/lime_terracotta.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/lime_terracotta" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/lime_wool.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/lime_wool.json new file mode 100644 index 000000000..8e4918443 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/lime_wool.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/lime_wool" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/lingering_potion.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/lingering_potion.json new file mode 100644 index 000000000..ec8257303 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/lingering_potion.json @@ -0,0 +1,12 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/lingering_potion", + "tints": [ + { + "type": "minecraft:potion", + "default": -13083194 + } + ] + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/llama_spawn_egg.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/llama_spawn_egg.json new file mode 100644 index 000000000..2ed781896 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/llama_spawn_egg.json @@ -0,0 +1,16 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/template_spawn_egg", + "tints": [ + { + "type": "minecraft:constant", + "value": -4153731 + }, + { + "type": "minecraft:constant", + "value": -6725824 + } + ] + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/lodestone.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/lodestone.json new file mode 100644 index 000000000..2ac84d41c --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/lodestone.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/lodestone" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/loom.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/loom.json new file mode 100644 index 000000000..a83efb19d --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/loom.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/loom" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/mace.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/mace.json new file mode 100644 index 000000000..85d3c0fff --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/mace.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/mace" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/magenta_banner.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/magenta_banner.json new file mode 100644 index 000000000..102dce88f --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/magenta_banner.json @@ -0,0 +1,10 @@ +{ + "model": { + "type": "minecraft:special", + "base": "minecraft:item/template_banner", + "model": { + "type": "minecraft:banner", + "color": "magenta" + } + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/magenta_bed.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/magenta_bed.json new file mode 100644 index 000000000..1110f7794 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/magenta_bed.json @@ -0,0 +1,10 @@ +{ + "model": { + "type": "minecraft:special", + "base": "minecraft:item/magenta_bed", + "model": { + "type": "minecraft:bed", + "texture": "minecraft:magenta" + } + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/magenta_bundle.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/magenta_bundle.json new file mode 100644 index 000000000..bb122f286 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/magenta_bundle.json @@ -0,0 +1,39 @@ +{ + "model": { + "type": "minecraft:select", + "cases": [ + { + "model": { + "type": "minecraft:condition", + "on_false": { + "type": "minecraft:model", + "model": "minecraft:item/magenta_bundle" + }, + "on_true": { + "type": "minecraft:composite", + "models": [ + { + "type": "minecraft:model", + "model": "minecraft:item/magenta_bundle_open_back" + }, + { + "type": "minecraft:bundle/selected_item" + }, + { + "type": "minecraft:model", + "model": "minecraft:item/magenta_bundle_open_front" + } + ] + }, + "property": "minecraft:bundle/has_selected_item" + }, + "when": "gui" + } + ], + "fallback": { + "type": "minecraft:model", + "model": "minecraft:item/magenta_bundle" + }, + "property": "minecraft:display_context" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/magenta_candle.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/magenta_candle.json new file mode 100644 index 000000000..a21f1835a --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/magenta_candle.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/magenta_candle" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/magenta_carpet.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/magenta_carpet.json new file mode 100644 index 000000000..a4a5a70c4 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/magenta_carpet.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/magenta_carpet" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/magenta_concrete.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/magenta_concrete.json new file mode 100644 index 000000000..af52449fb --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/magenta_concrete.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/magenta_concrete" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/magenta_concrete_powder.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/magenta_concrete_powder.json new file mode 100644 index 000000000..c1e31d1c3 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/magenta_concrete_powder.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/magenta_concrete_powder" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/magenta_dye.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/magenta_dye.json new file mode 100644 index 000000000..452fe73e6 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/magenta_dye.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/magenta_dye" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/magenta_glazed_terracotta.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/magenta_glazed_terracotta.json new file mode 100644 index 000000000..b6bbeda4e --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/magenta_glazed_terracotta.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/magenta_glazed_terracotta" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/magenta_shulker_box.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/magenta_shulker_box.json new file mode 100644 index 000000000..32adfdd9d --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/magenta_shulker_box.json @@ -0,0 +1,10 @@ +{ + "model": { + "type": "minecraft:special", + "base": "minecraft:item/magenta_shulker_box", + "model": { + "type": "minecraft:shulker_box", + "texture": "minecraft:shulker_magenta" + } + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/magenta_stained_glass.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/magenta_stained_glass.json new file mode 100644 index 000000000..99403a70f --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/magenta_stained_glass.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/magenta_stained_glass" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/magenta_stained_glass_pane.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/magenta_stained_glass_pane.json new file mode 100644 index 000000000..a75bc227d --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/magenta_stained_glass_pane.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/magenta_stained_glass_pane" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/magenta_terracotta.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/magenta_terracotta.json new file mode 100644 index 000000000..c81a0ac3e --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/magenta_terracotta.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/magenta_terracotta" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/magenta_wool.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/magenta_wool.json new file mode 100644 index 000000000..e6069e309 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/magenta_wool.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/magenta_wool" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/magma_block.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/magma_block.json new file mode 100644 index 000000000..5f1fffb1f --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/magma_block.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/magma_block" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/magma_cream.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/magma_cream.json new file mode 100644 index 000000000..9cd205e6a --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/magma_cream.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/magma_cream" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/magma_cube_spawn_egg.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/magma_cube_spawn_egg.json new file mode 100644 index 000000000..6dfefdaaf --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/magma_cube_spawn_egg.json @@ -0,0 +1,16 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/template_spawn_egg", + "tints": [ + { + "type": "minecraft:constant", + "value": -13369344 + }, + { + "type": "minecraft:constant", + "value": -197632 + } + ] + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/mangrove_boat.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/mangrove_boat.json new file mode 100644 index 000000000..5a7e4ec04 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/mangrove_boat.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/mangrove_boat" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/mangrove_button.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/mangrove_button.json new file mode 100644 index 000000000..e94f44372 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/mangrove_button.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/mangrove_button_inventory" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/mangrove_chest_boat.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/mangrove_chest_boat.json new file mode 100644 index 000000000..d4dfef22a --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/mangrove_chest_boat.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/mangrove_chest_boat" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/mangrove_door.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/mangrove_door.json new file mode 100644 index 000000000..17a08b7b6 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/mangrove_door.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/mangrove_door" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/mangrove_fence.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/mangrove_fence.json new file mode 100644 index 000000000..6ae1e8701 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/mangrove_fence.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/mangrove_fence_inventory" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/mangrove_fence_gate.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/mangrove_fence_gate.json new file mode 100644 index 000000000..8ddd81081 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/mangrove_fence_gate.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/mangrove_fence_gate" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/mangrove_hanging_sign.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/mangrove_hanging_sign.json new file mode 100644 index 000000000..5d142a0c8 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/mangrove_hanging_sign.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/mangrove_hanging_sign" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/mangrove_leaves.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/mangrove_leaves.json new file mode 100644 index 000000000..3314939b8 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/mangrove_leaves.json @@ -0,0 +1,12 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/mangrove_leaves", + "tints": [ + { + "type": "minecraft:constant", + "value": -7158200 + } + ] + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/mangrove_log.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/mangrove_log.json new file mode 100644 index 000000000..1c472d673 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/mangrove_log.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/mangrove_log" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/mangrove_planks.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/mangrove_planks.json new file mode 100644 index 000000000..32ac80c9f --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/mangrove_planks.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/mangrove_planks" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/mangrove_pressure_plate.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/mangrove_pressure_plate.json new file mode 100644 index 000000000..df4bef887 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/mangrove_pressure_plate.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/mangrove_pressure_plate" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/mangrove_propagule.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/mangrove_propagule.json new file mode 100644 index 000000000..3e671460a --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/mangrove_propagule.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/mangrove_propagule" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/mangrove_roots.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/mangrove_roots.json new file mode 100644 index 000000000..c36991de0 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/mangrove_roots.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/mangrove_roots" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/mangrove_sign.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/mangrove_sign.json new file mode 100644 index 000000000..4a0b0dabd --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/mangrove_sign.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/mangrove_sign" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/mangrove_slab.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/mangrove_slab.json new file mode 100644 index 000000000..41bd62590 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/mangrove_slab.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/mangrove_slab" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/mangrove_stairs.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/mangrove_stairs.json new file mode 100644 index 000000000..568063fb3 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/mangrove_stairs.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/mangrove_stairs" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/mangrove_trapdoor.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/mangrove_trapdoor.json new file mode 100644 index 000000000..d771ef8fb --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/mangrove_trapdoor.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/mangrove_trapdoor_bottom" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/mangrove_wood.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/mangrove_wood.json new file mode 100644 index 000000000..34fa8bd84 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/mangrove_wood.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/mangrove_wood" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/map.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/map.json new file mode 100644 index 000000000..c10f8ae90 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/map.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/map" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/medium_amethyst_bud.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/medium_amethyst_bud.json new file mode 100644 index 000000000..c5b278950 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/medium_amethyst_bud.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/medium_amethyst_bud" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/melon.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/melon.json new file mode 100644 index 000000000..b3d5859e8 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/melon.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/melon" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/melon_seeds.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/melon_seeds.json new file mode 100644 index 000000000..b9c5cac89 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/melon_seeds.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/melon_seeds" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/melon_slice.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/melon_slice.json new file mode 100644 index 000000000..4753610a0 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/melon_slice.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/melon_slice" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/milk_bucket.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/milk_bucket.json new file mode 100644 index 000000000..36d245a7d --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/milk_bucket.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/milk_bucket" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/minecart.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/minecart.json new file mode 100644 index 000000000..20ea7d59f --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/minecart.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/minecart" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/miner_pottery_sherd.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/miner_pottery_sherd.json new file mode 100644 index 000000000..fcf06d747 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/miner_pottery_sherd.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/miner_pottery_sherd" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/mojang_banner_pattern.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/mojang_banner_pattern.json new file mode 100644 index 000000000..9ad39b72b --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/mojang_banner_pattern.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/mojang_banner_pattern" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/mooshroom_spawn_egg.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/mooshroom_spawn_egg.json new file mode 100644 index 000000000..a8d3720a8 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/mooshroom_spawn_egg.json @@ -0,0 +1,16 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/template_spawn_egg", + "tints": [ + { + "type": "minecraft:constant", + "value": -6287600 + }, + { + "type": "minecraft:constant", + "value": -4737097 + } + ] + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/moss_block.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/moss_block.json new file mode 100644 index 000000000..f9be97767 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/moss_block.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/moss_block" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/moss_carpet.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/moss_carpet.json new file mode 100644 index 000000000..85b607077 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/moss_carpet.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/moss_carpet" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/mossy_cobblestone.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/mossy_cobblestone.json new file mode 100644 index 000000000..5aa1d87e1 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/mossy_cobblestone.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/mossy_cobblestone" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/mossy_cobblestone_slab.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/mossy_cobblestone_slab.json new file mode 100644 index 000000000..88f15952a --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/mossy_cobblestone_slab.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/mossy_cobblestone_slab" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/mossy_cobblestone_stairs.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/mossy_cobblestone_stairs.json new file mode 100644 index 000000000..3d2ef3c7a --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/mossy_cobblestone_stairs.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/mossy_cobblestone_stairs" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/mossy_cobblestone_wall.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/mossy_cobblestone_wall.json new file mode 100644 index 000000000..7bfeb08ff --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/mossy_cobblestone_wall.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/mossy_cobblestone_wall_inventory" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/mossy_stone_brick_slab.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/mossy_stone_brick_slab.json new file mode 100644 index 000000000..f61124270 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/mossy_stone_brick_slab.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/mossy_stone_brick_slab" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/mossy_stone_brick_stairs.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/mossy_stone_brick_stairs.json new file mode 100644 index 000000000..9096a3cff --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/mossy_stone_brick_stairs.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/mossy_stone_brick_stairs" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/mossy_stone_brick_wall.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/mossy_stone_brick_wall.json new file mode 100644 index 000000000..130e597df --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/mossy_stone_brick_wall.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/mossy_stone_brick_wall_inventory" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/mossy_stone_bricks.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/mossy_stone_bricks.json new file mode 100644 index 000000000..431c66314 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/mossy_stone_bricks.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/mossy_stone_bricks" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/mourner_pottery_sherd.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/mourner_pottery_sherd.json new file mode 100644 index 000000000..e576fdb7f --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/mourner_pottery_sherd.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/mourner_pottery_sherd" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/mud.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/mud.json new file mode 100644 index 000000000..2ae0c692e --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/mud.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/mud" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/mud_brick_slab.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/mud_brick_slab.json new file mode 100644 index 000000000..bdd56fd60 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/mud_brick_slab.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/mud_brick_slab" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/mud_brick_stairs.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/mud_brick_stairs.json new file mode 100644 index 000000000..09bb42cb1 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/mud_brick_stairs.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/mud_brick_stairs" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/mud_brick_wall.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/mud_brick_wall.json new file mode 100644 index 000000000..9ec3a54ed --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/mud_brick_wall.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/mud_brick_wall_inventory" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/mud_bricks.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/mud_bricks.json new file mode 100644 index 000000000..47c0ec67f --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/mud_bricks.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/mud_bricks" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/muddy_mangrove_roots.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/muddy_mangrove_roots.json new file mode 100644 index 000000000..72ee9ad21 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/muddy_mangrove_roots.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/muddy_mangrove_roots" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/mule_spawn_egg.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/mule_spawn_egg.json new file mode 100644 index 000000000..6890dcb27 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/mule_spawn_egg.json @@ -0,0 +1,16 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/template_spawn_egg", + "tints": [ + { + "type": "minecraft:constant", + "value": -15007232 + }, + { + "type": "minecraft:constant", + "value": -11455715 + } + ] + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/mushroom_stem.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/mushroom_stem.json new file mode 100644 index 000000000..14ee4df05 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/mushroom_stem.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/mushroom_stem_inventory" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/mushroom_stew.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/mushroom_stew.json new file mode 100644 index 000000000..7d6fd975d --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/mushroom_stew.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/mushroom_stew" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/music_disc_11.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/music_disc_11.json new file mode 100644 index 000000000..8bf248c70 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/music_disc_11.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/music_disc_11" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/music_disc_13.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/music_disc_13.json new file mode 100644 index 000000000..36859fea3 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/music_disc_13.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/music_disc_13" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/music_disc_5.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/music_disc_5.json new file mode 100644 index 000000000..2d31f5951 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/music_disc_5.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/music_disc_5" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/music_disc_blocks.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/music_disc_blocks.json new file mode 100644 index 000000000..1a8def790 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/music_disc_blocks.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/music_disc_blocks" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/music_disc_cat.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/music_disc_cat.json new file mode 100644 index 000000000..a4b3d52a8 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/music_disc_cat.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/music_disc_cat" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/music_disc_chirp.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/music_disc_chirp.json new file mode 100644 index 000000000..2b5f4c057 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/music_disc_chirp.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/music_disc_chirp" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/music_disc_creator.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/music_disc_creator.json new file mode 100644 index 000000000..de47392e9 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/music_disc_creator.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/music_disc_creator" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/music_disc_creator_music_box.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/music_disc_creator_music_box.json new file mode 100644 index 000000000..e754f5e6c --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/music_disc_creator_music_box.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/music_disc_creator_music_box" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/music_disc_far.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/music_disc_far.json new file mode 100644 index 000000000..e5048148b --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/music_disc_far.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/music_disc_far" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/music_disc_mall.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/music_disc_mall.json new file mode 100644 index 000000000..7958c0e50 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/music_disc_mall.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/music_disc_mall" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/music_disc_mellohi.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/music_disc_mellohi.json new file mode 100644 index 000000000..bfa887565 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/music_disc_mellohi.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/music_disc_mellohi" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/music_disc_otherside.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/music_disc_otherside.json new file mode 100644 index 000000000..3f07b4a5a --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/music_disc_otherside.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/music_disc_otherside" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/music_disc_pigstep.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/music_disc_pigstep.json new file mode 100644 index 000000000..9610fb687 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/music_disc_pigstep.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/music_disc_pigstep" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/music_disc_precipice.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/music_disc_precipice.json new file mode 100644 index 000000000..ce782edaf --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/music_disc_precipice.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/music_disc_precipice" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/music_disc_relic.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/music_disc_relic.json new file mode 100644 index 000000000..8d951d722 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/music_disc_relic.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/music_disc_relic" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/music_disc_stal.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/music_disc_stal.json new file mode 100644 index 000000000..a8fe9b01b --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/music_disc_stal.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/music_disc_stal" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/music_disc_strad.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/music_disc_strad.json new file mode 100644 index 000000000..f33b7491a --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/music_disc_strad.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/music_disc_strad" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/music_disc_wait.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/music_disc_wait.json new file mode 100644 index 000000000..b50eb8e87 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/music_disc_wait.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/music_disc_wait" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/music_disc_ward.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/music_disc_ward.json new file mode 100644 index 000000000..166692f42 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/music_disc_ward.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/music_disc_ward" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/mutton.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/mutton.json new file mode 100644 index 000000000..5977fce09 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/mutton.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/mutton" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/mycelium.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/mycelium.json new file mode 100644 index 000000000..02add88a8 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/mycelium.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/mycelium" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/name_tag.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/name_tag.json new file mode 100644 index 000000000..2f2e54ab7 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/name_tag.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/name_tag" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/nautilus_shell.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/nautilus_shell.json new file mode 100644 index 000000000..9fd2b3333 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/nautilus_shell.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/nautilus_shell" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/nether_brick.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/nether_brick.json new file mode 100644 index 000000000..84e311d46 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/nether_brick.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/nether_brick" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/nether_brick_fence.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/nether_brick_fence.json new file mode 100644 index 000000000..11d21cf99 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/nether_brick_fence.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/nether_brick_fence_inventory" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/nether_brick_slab.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/nether_brick_slab.json new file mode 100644 index 000000000..def834b62 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/nether_brick_slab.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/nether_brick_slab" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/nether_brick_stairs.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/nether_brick_stairs.json new file mode 100644 index 000000000..0fcd602ca --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/nether_brick_stairs.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/nether_brick_stairs" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/nether_brick_wall.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/nether_brick_wall.json new file mode 100644 index 000000000..0ca47fc6f --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/nether_brick_wall.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/nether_brick_wall_inventory" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/nether_bricks.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/nether_bricks.json new file mode 100644 index 000000000..04d911a98 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/nether_bricks.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/nether_bricks" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/nether_gold_ore.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/nether_gold_ore.json new file mode 100644 index 000000000..30857376a --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/nether_gold_ore.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/nether_gold_ore" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/nether_quartz_ore.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/nether_quartz_ore.json new file mode 100644 index 000000000..d7d0101d8 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/nether_quartz_ore.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/nether_quartz_ore" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/nether_sprouts.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/nether_sprouts.json new file mode 100644 index 000000000..ce1ff8efa --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/nether_sprouts.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/nether_sprouts" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/nether_star.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/nether_star.json new file mode 100644 index 000000000..4539152fe --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/nether_star.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/nether_star" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/nether_wart.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/nether_wart.json new file mode 100644 index 000000000..b33c624d3 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/nether_wart.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/nether_wart" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/nether_wart_block.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/nether_wart_block.json new file mode 100644 index 000000000..a56620633 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/nether_wart_block.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/nether_wart_block" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/netherite_axe.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/netherite_axe.json new file mode 100644 index 000000000..02f455656 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/netherite_axe.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/netherite_axe" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/netherite_block.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/netherite_block.json new file mode 100644 index 000000000..e7e8de379 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/netherite_block.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/netherite_block" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/netherite_boots.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/netherite_boots.json new file mode 100644 index 000000000..8a7a7adc8 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/netherite_boots.json @@ -0,0 +1,89 @@ +{ + "model": { + "type": "minecraft:select", + "cases": [ + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/netherite_boots_quartz_trim" + }, + "when": "minecraft:quartz" + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/netherite_boots_iron_trim" + }, + "when": "minecraft:iron" + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/netherite_boots_netherite_trim" + }, + "when": "minecraft:netherite" + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/netherite_boots_redstone_trim" + }, + "when": "minecraft:redstone" + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/netherite_boots_copper_trim" + }, + "when": "minecraft:copper" + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/netherite_boots_gold_trim" + }, + "when": "minecraft:gold" + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/netherite_boots_emerald_trim" + }, + "when": "minecraft:emerald" + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/netherite_boots_diamond_trim" + }, + "when": "minecraft:diamond" + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/netherite_boots_lapis_trim" + }, + "when": "minecraft:lapis" + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/netherite_boots_amethyst_trim" + }, + "when": "minecraft:amethyst" + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/netherite_boots_resin_trim" + }, + "when": "minecraft:resin" + } + ], + "fallback": { + "type": "minecraft:model", + "model": "minecraft:item/netherite_boots" + }, + "property": "minecraft:trim_material" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/netherite_chestplate.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/netherite_chestplate.json new file mode 100644 index 000000000..b338ed228 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/netherite_chestplate.json @@ -0,0 +1,89 @@ +{ + "model": { + "type": "minecraft:select", + "cases": [ + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/netherite_chestplate_quartz_trim" + }, + "when": "minecraft:quartz" + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/netherite_chestplate_iron_trim" + }, + "when": "minecraft:iron" + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/netherite_chestplate_netherite_trim" + }, + "when": "minecraft:netherite" + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/netherite_chestplate_redstone_trim" + }, + "when": "minecraft:redstone" + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/netherite_chestplate_copper_trim" + }, + "when": "minecraft:copper" + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/netherite_chestplate_gold_trim" + }, + "when": "minecraft:gold" + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/netherite_chestplate_emerald_trim" + }, + "when": "minecraft:emerald" + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/netherite_chestplate_diamond_trim" + }, + "when": "minecraft:diamond" + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/netherite_chestplate_lapis_trim" + }, + "when": "minecraft:lapis" + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/netherite_chestplate_amethyst_trim" + }, + "when": "minecraft:amethyst" + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/netherite_chestplate_resin_trim" + }, + "when": "minecraft:resin" + } + ], + "fallback": { + "type": "minecraft:model", + "model": "minecraft:item/netherite_chestplate" + }, + "property": "minecraft:trim_material" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/netherite_helmet.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/netherite_helmet.json new file mode 100644 index 000000000..317699f2f --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/netherite_helmet.json @@ -0,0 +1,89 @@ +{ + "model": { + "type": "minecraft:select", + "cases": [ + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/netherite_helmet_quartz_trim" + }, + "when": "minecraft:quartz" + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/netherite_helmet_iron_trim" + }, + "when": "minecraft:iron" + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/netherite_helmet_netherite_trim" + }, + "when": "minecraft:netherite" + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/netherite_helmet_redstone_trim" + }, + "when": "minecraft:redstone" + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/netherite_helmet_copper_trim" + }, + "when": "minecraft:copper" + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/netherite_helmet_gold_trim" + }, + "when": "minecraft:gold" + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/netherite_helmet_emerald_trim" + }, + "when": "minecraft:emerald" + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/netherite_helmet_diamond_trim" + }, + "when": "minecraft:diamond" + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/netherite_helmet_lapis_trim" + }, + "when": "minecraft:lapis" + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/netherite_helmet_amethyst_trim" + }, + "when": "minecraft:amethyst" + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/netherite_helmet_resin_trim" + }, + "when": "minecraft:resin" + } + ], + "fallback": { + "type": "minecraft:model", + "model": "minecraft:item/netherite_helmet" + }, + "property": "minecraft:trim_material" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/netherite_hoe.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/netherite_hoe.json new file mode 100644 index 000000000..67625e1a8 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/netherite_hoe.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/netherite_hoe" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/netherite_ingot.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/netherite_ingot.json new file mode 100644 index 000000000..3fa2583b0 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/netherite_ingot.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/netherite_ingot" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/netherite_leggings.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/netherite_leggings.json new file mode 100644 index 000000000..61de5f894 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/netherite_leggings.json @@ -0,0 +1,89 @@ +{ + "model": { + "type": "minecraft:select", + "cases": [ + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/netherite_leggings_quartz_trim" + }, + "when": "minecraft:quartz" + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/netherite_leggings_iron_trim" + }, + "when": "minecraft:iron" + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/netherite_leggings_netherite_trim" + }, + "when": "minecraft:netherite" + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/netherite_leggings_redstone_trim" + }, + "when": "minecraft:redstone" + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/netherite_leggings_copper_trim" + }, + "when": "minecraft:copper" + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/netherite_leggings_gold_trim" + }, + "when": "minecraft:gold" + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/netherite_leggings_emerald_trim" + }, + "when": "minecraft:emerald" + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/netherite_leggings_diamond_trim" + }, + "when": "minecraft:diamond" + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/netherite_leggings_lapis_trim" + }, + "when": "minecraft:lapis" + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/netherite_leggings_amethyst_trim" + }, + "when": "minecraft:amethyst" + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/netherite_leggings_resin_trim" + }, + "when": "minecraft:resin" + } + ], + "fallback": { + "type": "minecraft:model", + "model": "minecraft:item/netherite_leggings" + }, + "property": "minecraft:trim_material" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/netherite_pickaxe.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/netherite_pickaxe.json new file mode 100644 index 000000000..a5fc75c0b --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/netherite_pickaxe.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/netherite_pickaxe" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/netherite_scrap.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/netherite_scrap.json new file mode 100644 index 000000000..0f0b6410d --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/netherite_scrap.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/netherite_scrap" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/netherite_shovel.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/netherite_shovel.json new file mode 100644 index 000000000..9fd5ed4c4 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/netherite_shovel.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/netherite_shovel" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/netherite_sword.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/netherite_sword.json new file mode 100644 index 000000000..2cf94a276 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/netherite_sword.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/netherite_sword" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/netherite_upgrade_smithing_template.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/netherite_upgrade_smithing_template.json new file mode 100644 index 000000000..62915512b --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/netherite_upgrade_smithing_template.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/netherite_upgrade_smithing_template" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/netherrack.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/netherrack.json new file mode 100644 index 000000000..b2062681f --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/netherrack.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/netherrack" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/note_block.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/note_block.json new file mode 100644 index 000000000..4b539c046 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/note_block.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/note_block" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/oak_boat.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/oak_boat.json new file mode 100644 index 000000000..f43e94b11 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/oak_boat.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/oak_boat" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/oak_button.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/oak_button.json new file mode 100644 index 000000000..d45985900 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/oak_button.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/oak_button_inventory" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/oak_chest_boat.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/oak_chest_boat.json new file mode 100644 index 000000000..26b1d7f82 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/oak_chest_boat.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/oak_chest_boat" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/oak_door.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/oak_door.json new file mode 100644 index 000000000..0e80b32d3 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/oak_door.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/oak_door" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/oak_fence.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/oak_fence.json new file mode 100644 index 000000000..4f5d32e21 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/oak_fence.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/oak_fence_inventory" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/oak_fence_gate.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/oak_fence_gate.json new file mode 100644 index 000000000..dc6c743df --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/oak_fence_gate.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/oak_fence_gate" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/oak_hanging_sign.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/oak_hanging_sign.json new file mode 100644 index 000000000..a19906d1e --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/oak_hanging_sign.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/oak_hanging_sign" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/oak_leaves.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/oak_leaves.json new file mode 100644 index 000000000..dde032961 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/oak_leaves.json @@ -0,0 +1,12 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/oak_leaves", + "tints": [ + { + "type": "minecraft:constant", + "value": -12012264 + } + ] + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/oak_log.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/oak_log.json new file mode 100644 index 000000000..81bfdf5c4 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/oak_log.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/oak_log" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/oak_planks.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/oak_planks.json new file mode 100644 index 000000000..d04c2f600 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/oak_planks.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/oak_planks" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/oak_pressure_plate.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/oak_pressure_plate.json new file mode 100644 index 000000000..c7b3844a4 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/oak_pressure_plate.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/oak_pressure_plate" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/oak_sapling.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/oak_sapling.json new file mode 100644 index 000000000..5362761a5 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/oak_sapling.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/oak_sapling" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/oak_sign.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/oak_sign.json new file mode 100644 index 000000000..85ed9a5a1 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/oak_sign.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/oak_sign" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/oak_slab.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/oak_slab.json new file mode 100644 index 000000000..86d648fc5 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/oak_slab.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/oak_slab" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/oak_stairs.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/oak_stairs.json new file mode 100644 index 000000000..4246d24da --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/oak_stairs.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/oak_stairs" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/oak_trapdoor.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/oak_trapdoor.json new file mode 100644 index 000000000..f6d7d787e --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/oak_trapdoor.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/oak_trapdoor_bottom" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/oak_wood.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/oak_wood.json new file mode 100644 index 000000000..973108be0 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/oak_wood.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/oak_wood" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/observer.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/observer.json new file mode 100644 index 000000000..3d0d40767 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/observer.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/observer" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/obsidian.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/obsidian.json new file mode 100644 index 000000000..e51b6722c --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/obsidian.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/obsidian" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/ocelot_spawn_egg.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/ocelot_spawn_egg.json new file mode 100644 index 000000000..333616e3e --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/ocelot_spawn_egg.json @@ -0,0 +1,16 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/template_spawn_egg", + "tints": [ + { + "type": "minecraft:constant", + "value": -1057155 + }, + { + "type": "minecraft:constant", + "value": -11123660 + } + ] + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/ochre_froglight.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/ochre_froglight.json new file mode 100644 index 000000000..5bec1c6dc --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/ochre_froglight.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/ochre_froglight" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/ominous_bottle.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/ominous_bottle.json new file mode 100644 index 000000000..1d68412d7 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/ominous_bottle.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/ominous_bottle" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/ominous_trial_key.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/ominous_trial_key.json new file mode 100644 index 000000000..fe0ceb49b --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/ominous_trial_key.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/ominous_trial_key" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/open_eyeblossom.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/open_eyeblossom.json new file mode 100644 index 000000000..17bad6929 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/open_eyeblossom.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/open_eyeblossom" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/orange_banner.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/orange_banner.json new file mode 100644 index 000000000..6e7f7e63d --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/orange_banner.json @@ -0,0 +1,10 @@ +{ + "model": { + "type": "minecraft:special", + "base": "minecraft:item/template_banner", + "model": { + "type": "minecraft:banner", + "color": "orange" + } + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/orange_bed.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/orange_bed.json new file mode 100644 index 000000000..a1891083c --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/orange_bed.json @@ -0,0 +1,10 @@ +{ + "model": { + "type": "minecraft:special", + "base": "minecraft:item/orange_bed", + "model": { + "type": "minecraft:bed", + "texture": "minecraft:orange" + } + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/orange_bundle.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/orange_bundle.json new file mode 100644 index 000000000..5aaf68bf8 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/orange_bundle.json @@ -0,0 +1,39 @@ +{ + "model": { + "type": "minecraft:select", + "cases": [ + { + "model": { + "type": "minecraft:condition", + "on_false": { + "type": "minecraft:model", + "model": "minecraft:item/orange_bundle" + }, + "on_true": { + "type": "minecraft:composite", + "models": [ + { + "type": "minecraft:model", + "model": "minecraft:item/orange_bundle_open_back" + }, + { + "type": "minecraft:bundle/selected_item" + }, + { + "type": "minecraft:model", + "model": "minecraft:item/orange_bundle_open_front" + } + ] + }, + "property": "minecraft:bundle/has_selected_item" + }, + "when": "gui" + } + ], + "fallback": { + "type": "minecraft:model", + "model": "minecraft:item/orange_bundle" + }, + "property": "minecraft:display_context" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/orange_candle.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/orange_candle.json new file mode 100644 index 000000000..adbc212e0 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/orange_candle.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/orange_candle" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/orange_carpet.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/orange_carpet.json new file mode 100644 index 000000000..50aefc691 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/orange_carpet.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/orange_carpet" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/orange_concrete.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/orange_concrete.json new file mode 100644 index 000000000..1fb70fdb6 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/orange_concrete.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/orange_concrete" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/orange_concrete_powder.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/orange_concrete_powder.json new file mode 100644 index 000000000..7e6c2804d --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/orange_concrete_powder.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/orange_concrete_powder" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/orange_dye.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/orange_dye.json new file mode 100644 index 000000000..1e86b0165 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/orange_dye.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/orange_dye" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/orange_glazed_terracotta.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/orange_glazed_terracotta.json new file mode 100644 index 000000000..4bd4509ac --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/orange_glazed_terracotta.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/orange_glazed_terracotta" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/orange_shulker_box.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/orange_shulker_box.json new file mode 100644 index 000000000..1a0b6939a --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/orange_shulker_box.json @@ -0,0 +1,10 @@ +{ + "model": { + "type": "minecraft:special", + "base": "minecraft:item/orange_shulker_box", + "model": { + "type": "minecraft:shulker_box", + "texture": "minecraft:shulker_orange" + } + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/orange_stained_glass.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/orange_stained_glass.json new file mode 100644 index 000000000..12e8dabb0 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/orange_stained_glass.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/orange_stained_glass" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/orange_stained_glass_pane.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/orange_stained_glass_pane.json new file mode 100644 index 000000000..9764dfcd6 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/orange_stained_glass_pane.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/orange_stained_glass_pane" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/orange_terracotta.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/orange_terracotta.json new file mode 100644 index 000000000..5d3bdc715 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/orange_terracotta.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/orange_terracotta" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/orange_tulip.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/orange_tulip.json new file mode 100644 index 000000000..eef0a7964 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/orange_tulip.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/orange_tulip" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/orange_wool.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/orange_wool.json new file mode 100644 index 000000000..46ad8f666 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/orange_wool.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/orange_wool" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/oxeye_daisy.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/oxeye_daisy.json new file mode 100644 index 000000000..f0d528422 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/oxeye_daisy.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/oxeye_daisy" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/oxidized_chiseled_copper.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/oxidized_chiseled_copper.json new file mode 100644 index 000000000..78b7eae05 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/oxidized_chiseled_copper.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/oxidized_chiseled_copper" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/oxidized_copper.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/oxidized_copper.json new file mode 100644 index 000000000..c58b7f62d --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/oxidized_copper.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/oxidized_copper" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/oxidized_copper_bulb.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/oxidized_copper_bulb.json new file mode 100644 index 000000000..aeab2c8ce --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/oxidized_copper_bulb.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/oxidized_copper_bulb" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/oxidized_copper_door.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/oxidized_copper_door.json new file mode 100644 index 000000000..b5cc84d31 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/oxidized_copper_door.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/oxidized_copper_door" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/oxidized_copper_grate.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/oxidized_copper_grate.json new file mode 100644 index 000000000..90d2a4833 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/oxidized_copper_grate.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/oxidized_copper_grate" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/oxidized_copper_trapdoor.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/oxidized_copper_trapdoor.json new file mode 100644 index 000000000..245f08ef9 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/oxidized_copper_trapdoor.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/oxidized_copper_trapdoor_bottom" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/oxidized_cut_copper.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/oxidized_cut_copper.json new file mode 100644 index 000000000..ec0748d35 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/oxidized_cut_copper.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/oxidized_cut_copper" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/oxidized_cut_copper_slab.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/oxidized_cut_copper_slab.json new file mode 100644 index 000000000..3e15eec78 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/oxidized_cut_copper_slab.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/oxidized_cut_copper_slab" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/oxidized_cut_copper_stairs.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/oxidized_cut_copper_stairs.json new file mode 100644 index 000000000..7fd0b7f0f --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/oxidized_cut_copper_stairs.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/oxidized_cut_copper_stairs" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/packed_ice.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/packed_ice.json new file mode 100644 index 000000000..46c3748d1 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/packed_ice.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/packed_ice" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/packed_mud.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/packed_mud.json new file mode 100644 index 000000000..a54ca54de --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/packed_mud.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/packed_mud" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/painting.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/painting.json new file mode 100644 index 000000000..dd9e2a156 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/painting.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/painting" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/pale_hanging_moss.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/pale_hanging_moss.json new file mode 100644 index 000000000..265249e0d --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/pale_hanging_moss.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/pale_hanging_moss" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/pale_moss_block.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/pale_moss_block.json new file mode 100644 index 000000000..752172924 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/pale_moss_block.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/pale_moss_block" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/pale_moss_carpet.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/pale_moss_carpet.json new file mode 100644 index 000000000..bfa7af73d --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/pale_moss_carpet.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/pale_moss_carpet" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/pale_oak_boat.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/pale_oak_boat.json new file mode 100644 index 000000000..0d44dbde3 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/pale_oak_boat.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/pale_oak_boat" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/pale_oak_button.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/pale_oak_button.json new file mode 100644 index 000000000..e72d35685 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/pale_oak_button.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/pale_oak_button_inventory" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/pale_oak_chest_boat.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/pale_oak_chest_boat.json new file mode 100644 index 000000000..66d0994fc --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/pale_oak_chest_boat.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/pale_oak_chest_boat" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/pale_oak_door.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/pale_oak_door.json new file mode 100644 index 000000000..4d15f541d --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/pale_oak_door.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/pale_oak_door" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/pale_oak_fence.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/pale_oak_fence.json new file mode 100644 index 000000000..43eede127 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/pale_oak_fence.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/pale_oak_fence_inventory" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/pale_oak_fence_gate.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/pale_oak_fence_gate.json new file mode 100644 index 000000000..0747be1fb --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/pale_oak_fence_gate.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/pale_oak_fence_gate" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/pale_oak_hanging_sign.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/pale_oak_hanging_sign.json new file mode 100644 index 000000000..73fc04416 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/pale_oak_hanging_sign.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/pale_oak_hanging_sign" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/pale_oak_leaves.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/pale_oak_leaves.json new file mode 100644 index 000000000..af0326dc5 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/pale_oak_leaves.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/pale_oak_leaves" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/pale_oak_log.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/pale_oak_log.json new file mode 100644 index 000000000..41dcbcd0e --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/pale_oak_log.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/pale_oak_log" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/pale_oak_planks.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/pale_oak_planks.json new file mode 100644 index 000000000..d1312cd98 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/pale_oak_planks.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/pale_oak_planks" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/pale_oak_pressure_plate.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/pale_oak_pressure_plate.json new file mode 100644 index 000000000..091b2c66d --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/pale_oak_pressure_plate.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/pale_oak_pressure_plate" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/pale_oak_sapling.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/pale_oak_sapling.json new file mode 100644 index 000000000..5005f057a --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/pale_oak_sapling.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/pale_oak_sapling" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/pale_oak_sign.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/pale_oak_sign.json new file mode 100644 index 000000000..25efa70d6 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/pale_oak_sign.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/pale_oak_sign" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/pale_oak_slab.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/pale_oak_slab.json new file mode 100644 index 000000000..99c908d1a --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/pale_oak_slab.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/pale_oak_slab" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/pale_oak_stairs.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/pale_oak_stairs.json new file mode 100644 index 000000000..b35ebc852 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/pale_oak_stairs.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/pale_oak_stairs" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/pale_oak_trapdoor.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/pale_oak_trapdoor.json new file mode 100644 index 000000000..8a0e54368 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/pale_oak_trapdoor.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/pale_oak_trapdoor_bottom" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/pale_oak_wood.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/pale_oak_wood.json new file mode 100644 index 000000000..a9ec9c6a0 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/pale_oak_wood.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/pale_oak_wood" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/panda_spawn_egg.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/panda_spawn_egg.json new file mode 100644 index 000000000..e3c983d73 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/panda_spawn_egg.json @@ -0,0 +1,16 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/template_spawn_egg", + "tints": [ + { + "type": "minecraft:constant", + "value": -1579033 + }, + { + "type": "minecraft:constant", + "value": -15000798 + } + ] + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/paper.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/paper.json new file mode 100644 index 000000000..981714c02 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/paper.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/paper" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/parrot_spawn_egg.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/parrot_spawn_egg.json new file mode 100644 index 000000000..f633eea9b --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/parrot_spawn_egg.json @@ -0,0 +1,16 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/template_spawn_egg", + "tints": [ + { + "type": "minecraft:constant", + "value": -15882485 + }, + { + "type": "minecraft:constant", + "value": -65536 + } + ] + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/pearlescent_froglight.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/pearlescent_froglight.json new file mode 100644 index 000000000..679130d89 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/pearlescent_froglight.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/pearlescent_froglight" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/peony.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/peony.json new file mode 100644 index 000000000..12cab6903 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/peony.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/peony" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/petrified_oak_slab.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/petrified_oak_slab.json new file mode 100644 index 000000000..40d996616 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/petrified_oak_slab.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/petrified_oak_slab" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/phantom_membrane.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/phantom_membrane.json new file mode 100644 index 000000000..ff4a666fd --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/phantom_membrane.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/phantom_membrane" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/phantom_spawn_egg.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/phantom_spawn_egg.json new file mode 100644 index 000000000..9ad747b67 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/phantom_spawn_egg.json @@ -0,0 +1,16 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/template_spawn_egg", + "tints": [ + { + "type": "minecraft:constant", + "value": -12365430 + }, + { + "type": "minecraft:constant", + "value": -7799040 + } + ] + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/pig_spawn_egg.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/pig_spawn_egg.json new file mode 100644 index 000000000..d1139e70e --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/pig_spawn_egg.json @@ -0,0 +1,16 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/template_spawn_egg", + "tints": [ + { + "type": "minecraft:constant", + "value": -1006174 + }, + { + "type": "minecraft:constant", + "value": -2399393 + } + ] + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/piglin_banner_pattern.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/piglin_banner_pattern.json new file mode 100644 index 000000000..b532de2ea --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/piglin_banner_pattern.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/piglin_banner_pattern" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/piglin_brute_spawn_egg.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/piglin_brute_spawn_egg.json new file mode 100644 index 000000000..68c2002eb --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/piglin_brute_spawn_egg.json @@ -0,0 +1,16 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/template_spawn_egg", + "tints": [ + { + "type": "minecraft:constant", + "value": -10933744 + }, + { + "type": "minecraft:constant", + "value": -396380 + } + ] + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/piglin_head.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/piglin_head.json new file mode 100644 index 000000000..e0f69892e --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/piglin_head.json @@ -0,0 +1,10 @@ +{ + "model": { + "type": "minecraft:special", + "base": "minecraft:item/template_skull", + "model": { + "type": "minecraft:head", + "kind": "piglin" + } + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/piglin_spawn_egg.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/piglin_spawn_egg.json new file mode 100644 index 000000000..f4976251c --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/piglin_spawn_egg.json @@ -0,0 +1,16 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/template_spawn_egg", + "tints": [ + { + "type": "minecraft:constant", + "value": -6725824 + }, + { + "type": "minecraft:constant", + "value": -396380 + } + ] + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/pillager_spawn_egg.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/pillager_spawn_egg.json new file mode 100644 index 000000000..0f961d282 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/pillager_spawn_egg.json @@ -0,0 +1,16 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/template_spawn_egg", + "tints": [ + { + "type": "minecraft:constant", + "value": -11325642 + }, + { + "type": "minecraft:constant", + "value": -6972517 + } + ] + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/pink_banner.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/pink_banner.json new file mode 100644 index 000000000..a86bb3325 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/pink_banner.json @@ -0,0 +1,10 @@ +{ + "model": { + "type": "minecraft:special", + "base": "minecraft:item/template_banner", + "model": { + "type": "minecraft:banner", + "color": "pink" + } + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/pink_bed.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/pink_bed.json new file mode 100644 index 000000000..2e686eb69 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/pink_bed.json @@ -0,0 +1,10 @@ +{ + "model": { + "type": "minecraft:special", + "base": "minecraft:item/pink_bed", + "model": { + "type": "minecraft:bed", + "texture": "minecraft:pink" + } + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/pink_bundle.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/pink_bundle.json new file mode 100644 index 000000000..327eb44c4 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/pink_bundle.json @@ -0,0 +1,39 @@ +{ + "model": { + "type": "minecraft:select", + "cases": [ + { + "model": { + "type": "minecraft:condition", + "on_false": { + "type": "minecraft:model", + "model": "minecraft:item/pink_bundle" + }, + "on_true": { + "type": "minecraft:composite", + "models": [ + { + "type": "minecraft:model", + "model": "minecraft:item/pink_bundle_open_back" + }, + { + "type": "minecraft:bundle/selected_item" + }, + { + "type": "minecraft:model", + "model": "minecraft:item/pink_bundle_open_front" + } + ] + }, + "property": "minecraft:bundle/has_selected_item" + }, + "when": "gui" + } + ], + "fallback": { + "type": "minecraft:model", + "model": "minecraft:item/pink_bundle" + }, + "property": "minecraft:display_context" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/pink_candle.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/pink_candle.json new file mode 100644 index 000000000..d94ae4628 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/pink_candle.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/pink_candle" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/pink_carpet.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/pink_carpet.json new file mode 100644 index 000000000..5080cbf2b --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/pink_carpet.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/pink_carpet" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/pink_concrete.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/pink_concrete.json new file mode 100644 index 000000000..8d09e8dbc --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/pink_concrete.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/pink_concrete" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/pink_concrete_powder.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/pink_concrete_powder.json new file mode 100644 index 000000000..2b4730814 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/pink_concrete_powder.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/pink_concrete_powder" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/pink_dye.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/pink_dye.json new file mode 100644 index 000000000..5c5bb43d4 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/pink_dye.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/pink_dye" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/pink_glazed_terracotta.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/pink_glazed_terracotta.json new file mode 100644 index 000000000..435ed0aaf --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/pink_glazed_terracotta.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/pink_glazed_terracotta" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/pink_petals.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/pink_petals.json new file mode 100644 index 000000000..3eb460ea6 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/pink_petals.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/pink_petals" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/pink_shulker_box.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/pink_shulker_box.json new file mode 100644 index 000000000..a1d380426 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/pink_shulker_box.json @@ -0,0 +1,10 @@ +{ + "model": { + "type": "minecraft:special", + "base": "minecraft:item/pink_shulker_box", + "model": { + "type": "minecraft:shulker_box", + "texture": "minecraft:shulker_pink" + } + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/pink_stained_glass.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/pink_stained_glass.json new file mode 100644 index 000000000..2c8db80fe --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/pink_stained_glass.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/pink_stained_glass" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/pink_stained_glass_pane.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/pink_stained_glass_pane.json new file mode 100644 index 000000000..34b3082e3 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/pink_stained_glass_pane.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/pink_stained_glass_pane" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/pink_terracotta.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/pink_terracotta.json new file mode 100644 index 000000000..23d6a9fd0 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/pink_terracotta.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/pink_terracotta" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/pink_tulip.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/pink_tulip.json new file mode 100644 index 000000000..ebea48cf1 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/pink_tulip.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/pink_tulip" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/pink_wool.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/pink_wool.json new file mode 100644 index 000000000..32027ca64 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/pink_wool.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/pink_wool" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/piston.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/piston.json new file mode 100644 index 000000000..b52126f9d --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/piston.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/piston_inventory" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/pitcher_plant.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/pitcher_plant.json new file mode 100644 index 000000000..2fc0921f6 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/pitcher_plant.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/pitcher_plant" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/pitcher_pod.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/pitcher_pod.json new file mode 100644 index 000000000..01c2af4b9 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/pitcher_pod.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/pitcher_pod" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/player_head.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/player_head.json new file mode 100644 index 000000000..2d522d2ff --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/player_head.json @@ -0,0 +1,10 @@ +{ + "model": { + "type": "minecraft:special", + "base": "minecraft:item/template_skull", + "model": { + "type": "minecraft:head", + "kind": "player" + } + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/plenty_pottery_sherd.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/plenty_pottery_sherd.json new file mode 100644 index 000000000..8517799f1 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/plenty_pottery_sherd.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/plenty_pottery_sherd" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/podzol.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/podzol.json new file mode 100644 index 000000000..8055b1ee3 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/podzol.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/podzol" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/pointed_dripstone.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/pointed_dripstone.json new file mode 100644 index 000000000..3570a9998 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/pointed_dripstone.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/pointed_dripstone" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/poisonous_potato.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/poisonous_potato.json new file mode 100644 index 000000000..8132ca0c2 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/poisonous_potato.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/poisonous_potato" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/polar_bear_spawn_egg.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/polar_bear_spawn_egg.json new file mode 100644 index 000000000..8beaa452d --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/polar_bear_spawn_egg.json @@ -0,0 +1,16 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/template_spawn_egg", + "tints": [ + { + "type": "minecraft:constant", + "value": -1118498 + }, + { + "type": "minecraft:constant", + "value": -2763059 + } + ] + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/polished_andesite.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/polished_andesite.json new file mode 100644 index 000000000..a1cafdbb2 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/polished_andesite.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/polished_andesite" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/polished_andesite_slab.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/polished_andesite_slab.json new file mode 100644 index 000000000..cf1fc3840 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/polished_andesite_slab.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/polished_andesite_slab" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/polished_andesite_stairs.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/polished_andesite_stairs.json new file mode 100644 index 000000000..af67153b7 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/polished_andesite_stairs.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/polished_andesite_stairs" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/polished_basalt.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/polished_basalt.json new file mode 100644 index 000000000..2640ce6c1 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/polished_basalt.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/polished_basalt" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/polished_blackstone.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/polished_blackstone.json new file mode 100644 index 000000000..181c2944d --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/polished_blackstone.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/polished_blackstone" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/polished_blackstone_brick_slab.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/polished_blackstone_brick_slab.json new file mode 100644 index 000000000..98d721208 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/polished_blackstone_brick_slab.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/polished_blackstone_brick_slab" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/polished_blackstone_brick_stairs.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/polished_blackstone_brick_stairs.json new file mode 100644 index 000000000..0d2a1ae3f --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/polished_blackstone_brick_stairs.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/polished_blackstone_brick_stairs" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/polished_blackstone_brick_wall.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/polished_blackstone_brick_wall.json new file mode 100644 index 000000000..d37c3291d --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/polished_blackstone_brick_wall.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/polished_blackstone_brick_wall_inventory" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/polished_blackstone_bricks.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/polished_blackstone_bricks.json new file mode 100644 index 000000000..6eb6188be --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/polished_blackstone_bricks.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/polished_blackstone_bricks" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/polished_blackstone_button.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/polished_blackstone_button.json new file mode 100644 index 000000000..c9aefed77 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/polished_blackstone_button.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/polished_blackstone_button_inventory" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/polished_blackstone_pressure_plate.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/polished_blackstone_pressure_plate.json new file mode 100644 index 000000000..a74aded7d --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/polished_blackstone_pressure_plate.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/polished_blackstone_pressure_plate" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/polished_blackstone_slab.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/polished_blackstone_slab.json new file mode 100644 index 000000000..2c0d2c3f6 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/polished_blackstone_slab.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/polished_blackstone_slab" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/polished_blackstone_stairs.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/polished_blackstone_stairs.json new file mode 100644 index 000000000..710e56025 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/polished_blackstone_stairs.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/polished_blackstone_stairs" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/polished_blackstone_wall.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/polished_blackstone_wall.json new file mode 100644 index 000000000..73a08c4a3 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/polished_blackstone_wall.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/polished_blackstone_wall_inventory" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/polished_deepslate.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/polished_deepslate.json new file mode 100644 index 000000000..3568e7e34 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/polished_deepslate.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/polished_deepslate" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/polished_deepslate_slab.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/polished_deepslate_slab.json new file mode 100644 index 000000000..9ea8f6a8a --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/polished_deepslate_slab.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/polished_deepslate_slab" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/polished_deepslate_stairs.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/polished_deepslate_stairs.json new file mode 100644 index 000000000..15406e1ee --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/polished_deepslate_stairs.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/polished_deepslate_stairs" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/polished_deepslate_wall.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/polished_deepslate_wall.json new file mode 100644 index 000000000..db3a3db63 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/polished_deepslate_wall.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/polished_deepslate_wall_inventory" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/polished_diorite.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/polished_diorite.json new file mode 100644 index 000000000..4e5510602 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/polished_diorite.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/polished_diorite" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/polished_diorite_slab.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/polished_diorite_slab.json new file mode 100644 index 000000000..165571e52 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/polished_diorite_slab.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/polished_diorite_slab" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/polished_diorite_stairs.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/polished_diorite_stairs.json new file mode 100644 index 000000000..d01da0011 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/polished_diorite_stairs.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/polished_diorite_stairs" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/polished_granite.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/polished_granite.json new file mode 100644 index 000000000..f563a5815 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/polished_granite.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/polished_granite" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/polished_granite_slab.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/polished_granite_slab.json new file mode 100644 index 000000000..cf284e3cd --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/polished_granite_slab.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/polished_granite_slab" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/polished_granite_stairs.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/polished_granite_stairs.json new file mode 100644 index 000000000..faf07419b --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/polished_granite_stairs.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/polished_granite_stairs" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/polished_tuff.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/polished_tuff.json new file mode 100644 index 000000000..3561f965d --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/polished_tuff.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/polished_tuff" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/polished_tuff_slab.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/polished_tuff_slab.json new file mode 100644 index 000000000..777eb8f35 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/polished_tuff_slab.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/polished_tuff_slab" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/polished_tuff_stairs.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/polished_tuff_stairs.json new file mode 100644 index 000000000..ed2f5ef88 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/polished_tuff_stairs.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/polished_tuff_stairs" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/polished_tuff_wall.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/polished_tuff_wall.json new file mode 100644 index 000000000..b0ea8fe2b --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/polished_tuff_wall.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/polished_tuff_wall_inventory" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/popped_chorus_fruit.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/popped_chorus_fruit.json new file mode 100644 index 000000000..d8b0732f3 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/popped_chorus_fruit.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/popped_chorus_fruit" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/poppy.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/poppy.json new file mode 100644 index 000000000..19cc1bc57 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/poppy.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/poppy" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/porkchop.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/porkchop.json new file mode 100644 index 000000000..f820d9ec5 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/porkchop.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/porkchop" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/potato.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/potato.json new file mode 100644 index 000000000..6926e16bb --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/potato.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/potato" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/potion.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/potion.json new file mode 100644 index 000000000..3f0b2e341 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/potion.json @@ -0,0 +1,12 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/potion", + "tints": [ + { + "type": "minecraft:potion", + "default": -13083194 + } + ] + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/powder_snow_bucket.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/powder_snow_bucket.json new file mode 100644 index 000000000..c7560238b --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/powder_snow_bucket.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/powder_snow_bucket" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/powered_rail.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/powered_rail.json new file mode 100644 index 000000000..ae1ae8a35 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/powered_rail.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/powered_rail" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/prismarine.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/prismarine.json new file mode 100644 index 000000000..8b8df6289 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/prismarine.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/prismarine" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/prismarine_brick_slab.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/prismarine_brick_slab.json new file mode 100644 index 000000000..4cfe1b8ca --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/prismarine_brick_slab.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/prismarine_brick_slab" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/prismarine_brick_stairs.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/prismarine_brick_stairs.json new file mode 100644 index 000000000..cc00e6186 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/prismarine_brick_stairs.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/prismarine_brick_stairs" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/prismarine_bricks.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/prismarine_bricks.json new file mode 100644 index 000000000..ea827dc7f --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/prismarine_bricks.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/prismarine_bricks" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/prismarine_crystals.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/prismarine_crystals.json new file mode 100644 index 000000000..65b82683e --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/prismarine_crystals.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/prismarine_crystals" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/prismarine_shard.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/prismarine_shard.json new file mode 100644 index 000000000..62e7ca534 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/prismarine_shard.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/prismarine_shard" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/prismarine_slab.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/prismarine_slab.json new file mode 100644 index 000000000..43acaf5a9 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/prismarine_slab.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/prismarine_slab" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/prismarine_stairs.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/prismarine_stairs.json new file mode 100644 index 000000000..251ebd31c --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/prismarine_stairs.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/prismarine_stairs" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/prismarine_wall.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/prismarine_wall.json new file mode 100644 index 000000000..2a8e95eca --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/prismarine_wall.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/prismarine_wall_inventory" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/prize_pottery_sherd.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/prize_pottery_sherd.json new file mode 100644 index 000000000..8caaa5586 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/prize_pottery_sherd.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/prize_pottery_sherd" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/pufferfish.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/pufferfish.json new file mode 100644 index 000000000..c509473e9 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/pufferfish.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/pufferfish" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/pufferfish_bucket.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/pufferfish_bucket.json new file mode 100644 index 000000000..a347a0279 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/pufferfish_bucket.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/pufferfish_bucket" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/pufferfish_spawn_egg.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/pufferfish_spawn_egg.json new file mode 100644 index 000000000..bd4861273 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/pufferfish_spawn_egg.json @@ -0,0 +1,16 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/template_spawn_egg", + "tints": [ + { + "type": "minecraft:constant", + "value": -609791 + }, + { + "type": "minecraft:constant", + "value": -13122574 + } + ] + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/pumpkin.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/pumpkin.json new file mode 100644 index 000000000..0faeffcb3 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/pumpkin.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/pumpkin" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/pumpkin_pie.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/pumpkin_pie.json new file mode 100644 index 000000000..82d1d8d45 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/pumpkin_pie.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/pumpkin_pie" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/pumpkin_seeds.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/pumpkin_seeds.json new file mode 100644 index 000000000..27eb2b18f --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/pumpkin_seeds.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/pumpkin_seeds" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/purple_banner.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/purple_banner.json new file mode 100644 index 000000000..a632445d0 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/purple_banner.json @@ -0,0 +1,10 @@ +{ + "model": { + "type": "minecraft:special", + "base": "minecraft:item/template_banner", + "model": { + "type": "minecraft:banner", + "color": "purple" + } + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/purple_bed.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/purple_bed.json new file mode 100644 index 000000000..ce125e53f --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/purple_bed.json @@ -0,0 +1,10 @@ +{ + "model": { + "type": "minecraft:special", + "base": "minecraft:item/purple_bed", + "model": { + "type": "minecraft:bed", + "texture": "minecraft:purple" + } + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/purple_bundle.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/purple_bundle.json new file mode 100644 index 000000000..f7f9d18e5 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/purple_bundle.json @@ -0,0 +1,39 @@ +{ + "model": { + "type": "minecraft:select", + "cases": [ + { + "model": { + "type": "minecraft:condition", + "on_false": { + "type": "minecraft:model", + "model": "minecraft:item/purple_bundle" + }, + "on_true": { + "type": "minecraft:composite", + "models": [ + { + "type": "minecraft:model", + "model": "minecraft:item/purple_bundle_open_back" + }, + { + "type": "minecraft:bundle/selected_item" + }, + { + "type": "minecraft:model", + "model": "minecraft:item/purple_bundle_open_front" + } + ] + }, + "property": "minecraft:bundle/has_selected_item" + }, + "when": "gui" + } + ], + "fallback": { + "type": "minecraft:model", + "model": "minecraft:item/purple_bundle" + }, + "property": "minecraft:display_context" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/purple_candle.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/purple_candle.json new file mode 100644 index 000000000..c7e507f7c --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/purple_candle.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/purple_candle" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/purple_carpet.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/purple_carpet.json new file mode 100644 index 000000000..3f09aedcf --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/purple_carpet.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/purple_carpet" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/purple_concrete.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/purple_concrete.json new file mode 100644 index 000000000..09e02e78f --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/purple_concrete.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/purple_concrete" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/purple_concrete_powder.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/purple_concrete_powder.json new file mode 100644 index 000000000..ba6108736 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/purple_concrete_powder.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/purple_concrete_powder" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/purple_dye.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/purple_dye.json new file mode 100644 index 000000000..4e714a5d8 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/purple_dye.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/purple_dye" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/purple_glazed_terracotta.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/purple_glazed_terracotta.json new file mode 100644 index 000000000..8d4c892a8 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/purple_glazed_terracotta.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/purple_glazed_terracotta" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/purple_shulker_box.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/purple_shulker_box.json new file mode 100644 index 000000000..3123f271c --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/purple_shulker_box.json @@ -0,0 +1,10 @@ +{ + "model": { + "type": "minecraft:special", + "base": "minecraft:item/purple_shulker_box", + "model": { + "type": "minecraft:shulker_box", + "texture": "minecraft:shulker_purple" + } + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/purple_stained_glass.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/purple_stained_glass.json new file mode 100644 index 000000000..9ee1a1a80 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/purple_stained_glass.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/purple_stained_glass" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/purple_stained_glass_pane.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/purple_stained_glass_pane.json new file mode 100644 index 000000000..8c0ca721e --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/purple_stained_glass_pane.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/purple_stained_glass_pane" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/purple_terracotta.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/purple_terracotta.json new file mode 100644 index 000000000..b8f12da09 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/purple_terracotta.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/purple_terracotta" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/purple_wool.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/purple_wool.json new file mode 100644 index 000000000..10a06042e --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/purple_wool.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/purple_wool" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/purpur_block.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/purpur_block.json new file mode 100644 index 000000000..869e90fdf --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/purpur_block.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/purpur_block" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/purpur_pillar.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/purpur_pillar.json new file mode 100644 index 000000000..1403ba779 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/purpur_pillar.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/purpur_pillar" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/purpur_slab.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/purpur_slab.json new file mode 100644 index 000000000..d8cfeb97e --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/purpur_slab.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/purpur_slab" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/purpur_stairs.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/purpur_stairs.json new file mode 100644 index 000000000..4e408c25c --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/purpur_stairs.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/purpur_stairs" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/quartz.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/quartz.json new file mode 100644 index 000000000..bb72ef579 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/quartz.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/quartz" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/quartz_block.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/quartz_block.json new file mode 100644 index 000000000..f14834d0c --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/quartz_block.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/quartz_block" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/quartz_bricks.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/quartz_bricks.json new file mode 100644 index 000000000..5b00e1702 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/quartz_bricks.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/quartz_bricks" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/quartz_pillar.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/quartz_pillar.json new file mode 100644 index 000000000..7c760921e --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/quartz_pillar.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/quartz_pillar" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/quartz_slab.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/quartz_slab.json new file mode 100644 index 000000000..5d889db04 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/quartz_slab.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/quartz_slab" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/quartz_stairs.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/quartz_stairs.json new file mode 100644 index 000000000..355f101eb --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/quartz_stairs.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/quartz_stairs" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/rabbit.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/rabbit.json new file mode 100644 index 000000000..a65a35837 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/rabbit.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/rabbit" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/rabbit_foot.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/rabbit_foot.json new file mode 100644 index 000000000..65a4362ed --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/rabbit_foot.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/rabbit_foot" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/rabbit_hide.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/rabbit_hide.json new file mode 100644 index 000000000..b125735ac --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/rabbit_hide.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/rabbit_hide" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/rabbit_spawn_egg.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/rabbit_spawn_egg.json new file mode 100644 index 000000000..499cf291b --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/rabbit_spawn_egg.json @@ -0,0 +1,16 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/template_spawn_egg", + "tints": [ + { + "type": "minecraft:constant", + "value": -6725824 + }, + { + "type": "minecraft:constant", + "value": -9222095 + } + ] + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/rabbit_stew.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/rabbit_stew.json new file mode 100644 index 000000000..3d01e38ea --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/rabbit_stew.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/rabbit_stew" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/rail.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/rail.json new file mode 100644 index 000000000..79de80b32 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/rail.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/rail" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/raiser_armor_trim_smithing_template.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/raiser_armor_trim_smithing_template.json new file mode 100644 index 000000000..9b78cc73c --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/raiser_armor_trim_smithing_template.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/raiser_armor_trim_smithing_template" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/ravager_spawn_egg.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/ravager_spawn_egg.json new file mode 100644 index 000000000..caa7b1c8f --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/ravager_spawn_egg.json @@ -0,0 +1,16 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/template_spawn_egg", + "tints": [ + { + "type": "minecraft:constant", + "value": -9079696 + }, + { + "type": "minecraft:constant", + "value": -10792887 + } + ] + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/raw_copper.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/raw_copper.json new file mode 100644 index 000000000..1acac00af --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/raw_copper.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/raw_copper" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/raw_copper_block.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/raw_copper_block.json new file mode 100644 index 000000000..74e4268c1 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/raw_copper_block.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/raw_copper_block" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/raw_gold.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/raw_gold.json new file mode 100644 index 000000000..c409fb4b7 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/raw_gold.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/raw_gold" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/raw_gold_block.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/raw_gold_block.json new file mode 100644 index 000000000..8636565f3 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/raw_gold_block.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/raw_gold_block" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/raw_iron.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/raw_iron.json new file mode 100644 index 000000000..0b5b2178b --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/raw_iron.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/raw_iron" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/raw_iron_block.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/raw_iron_block.json new file mode 100644 index 000000000..368a35a79 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/raw_iron_block.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/raw_iron_block" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/recovery_compass.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/recovery_compass.json new file mode 100644 index 000000000..676d03665 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/recovery_compass.json @@ -0,0 +1,241 @@ +{ + "model": { + "type": "minecraft:range_dispatch", + "entries": [ + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/recovery_compass_16" + }, + "threshold": 0.0 + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/recovery_compass_17" + }, + "threshold": 0.5 + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/recovery_compass_18" + }, + "threshold": 1.5 + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/recovery_compass_19" + }, + "threshold": 2.5 + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/recovery_compass_20" + }, + "threshold": 3.5 + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/recovery_compass_21" + }, + "threshold": 4.5 + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/recovery_compass_22" + }, + "threshold": 5.5 + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/recovery_compass_23" + }, + "threshold": 6.5 + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/recovery_compass_24" + }, + "threshold": 7.5 + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/recovery_compass_25" + }, + "threshold": 8.5 + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/recovery_compass_26" + }, + "threshold": 9.5 + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/recovery_compass_27" + }, + "threshold": 10.5 + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/recovery_compass_28" + }, + "threshold": 11.5 + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/recovery_compass_29" + }, + "threshold": 12.5 + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/recovery_compass_30" + }, + "threshold": 13.5 + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/recovery_compass_31" + }, + "threshold": 14.5 + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/recovery_compass_00" + }, + "threshold": 15.5 + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/recovery_compass_01" + }, + "threshold": 16.5 + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/recovery_compass_02" + }, + "threshold": 17.5 + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/recovery_compass_03" + }, + "threshold": 18.5 + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/recovery_compass_04" + }, + "threshold": 19.5 + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/recovery_compass_05" + }, + "threshold": 20.5 + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/recovery_compass_06" + }, + "threshold": 21.5 + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/recovery_compass_07" + }, + "threshold": 22.5 + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/recovery_compass_08" + }, + "threshold": 23.5 + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/recovery_compass_09" + }, + "threshold": 24.5 + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/recovery_compass_10" + }, + "threshold": 25.5 + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/recovery_compass_11" + }, + "threshold": 26.5 + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/recovery_compass_12" + }, + "threshold": 27.5 + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/recovery_compass_13" + }, + "threshold": 28.5 + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/recovery_compass_14" + }, + "threshold": 29.5 + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/recovery_compass_15" + }, + "threshold": 30.5 + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/recovery_compass_16" + }, + "threshold": 31.5 + } + ], + "property": "minecraft:compass", + "scale": 32.0, + "target": "recovery" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/red_banner.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/red_banner.json new file mode 100644 index 000000000..80cdff09c --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/red_banner.json @@ -0,0 +1,10 @@ +{ + "model": { + "type": "minecraft:special", + "base": "minecraft:item/template_banner", + "model": { + "type": "minecraft:banner", + "color": "red" + } + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/red_bed.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/red_bed.json new file mode 100644 index 000000000..9b772b375 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/red_bed.json @@ -0,0 +1,10 @@ +{ + "model": { + "type": "minecraft:special", + "base": "minecraft:item/red_bed", + "model": { + "type": "minecraft:bed", + "texture": "minecraft:red" + } + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/red_bundle.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/red_bundle.json new file mode 100644 index 000000000..811afd561 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/red_bundle.json @@ -0,0 +1,39 @@ +{ + "model": { + "type": "minecraft:select", + "cases": [ + { + "model": { + "type": "minecraft:condition", + "on_false": { + "type": "minecraft:model", + "model": "minecraft:item/red_bundle" + }, + "on_true": { + "type": "minecraft:composite", + "models": [ + { + "type": "minecraft:model", + "model": "minecraft:item/red_bundle_open_back" + }, + { + "type": "minecraft:bundle/selected_item" + }, + { + "type": "minecraft:model", + "model": "minecraft:item/red_bundle_open_front" + } + ] + }, + "property": "minecraft:bundle/has_selected_item" + }, + "when": "gui" + } + ], + "fallback": { + "type": "minecraft:model", + "model": "minecraft:item/red_bundle" + }, + "property": "minecraft:display_context" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/red_candle.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/red_candle.json new file mode 100644 index 000000000..31e3952bf --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/red_candle.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/red_candle" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/red_carpet.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/red_carpet.json new file mode 100644 index 000000000..c58019dbb --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/red_carpet.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/red_carpet" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/red_concrete.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/red_concrete.json new file mode 100644 index 000000000..756a4cea5 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/red_concrete.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/red_concrete" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/red_concrete_powder.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/red_concrete_powder.json new file mode 100644 index 000000000..2f2b48855 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/red_concrete_powder.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/red_concrete_powder" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/red_dye.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/red_dye.json new file mode 100644 index 000000000..2acc27620 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/red_dye.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/red_dye" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/red_glazed_terracotta.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/red_glazed_terracotta.json new file mode 100644 index 000000000..b2ca92200 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/red_glazed_terracotta.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/red_glazed_terracotta" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/red_mushroom.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/red_mushroom.json new file mode 100644 index 000000000..ede149295 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/red_mushroom.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/red_mushroom" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/red_mushroom_block.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/red_mushroom_block.json new file mode 100644 index 000000000..d7b804564 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/red_mushroom_block.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/red_mushroom_block_inventory" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/red_nether_brick_slab.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/red_nether_brick_slab.json new file mode 100644 index 000000000..084cc145b --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/red_nether_brick_slab.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/red_nether_brick_slab" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/red_nether_brick_stairs.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/red_nether_brick_stairs.json new file mode 100644 index 000000000..4d655dbf5 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/red_nether_brick_stairs.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/red_nether_brick_stairs" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/red_nether_brick_wall.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/red_nether_brick_wall.json new file mode 100644 index 000000000..d5a4313a3 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/red_nether_brick_wall.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/red_nether_brick_wall_inventory" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/red_nether_bricks.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/red_nether_bricks.json new file mode 100644 index 000000000..4bc5ad7de --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/red_nether_bricks.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/red_nether_bricks" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/red_sand.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/red_sand.json new file mode 100644 index 000000000..18a6982df --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/red_sand.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/red_sand" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/red_sandstone.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/red_sandstone.json new file mode 100644 index 000000000..99efe2f39 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/red_sandstone.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/red_sandstone" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/red_sandstone_slab.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/red_sandstone_slab.json new file mode 100644 index 000000000..3ab55118c --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/red_sandstone_slab.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/red_sandstone_slab" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/red_sandstone_stairs.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/red_sandstone_stairs.json new file mode 100644 index 000000000..f26d3ed89 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/red_sandstone_stairs.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/red_sandstone_stairs" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/red_sandstone_wall.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/red_sandstone_wall.json new file mode 100644 index 000000000..52cb9c270 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/red_sandstone_wall.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/red_sandstone_wall_inventory" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/red_shulker_box.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/red_shulker_box.json new file mode 100644 index 000000000..41278f48b --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/red_shulker_box.json @@ -0,0 +1,10 @@ +{ + "model": { + "type": "minecraft:special", + "base": "minecraft:item/red_shulker_box", + "model": { + "type": "minecraft:shulker_box", + "texture": "minecraft:shulker_red" + } + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/red_stained_glass.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/red_stained_glass.json new file mode 100644 index 000000000..8b567b7a1 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/red_stained_glass.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/red_stained_glass" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/red_stained_glass_pane.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/red_stained_glass_pane.json new file mode 100644 index 000000000..d65611ec1 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/red_stained_glass_pane.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/red_stained_glass_pane" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/red_terracotta.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/red_terracotta.json new file mode 100644 index 000000000..4b9940927 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/red_terracotta.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/red_terracotta" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/red_tulip.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/red_tulip.json new file mode 100644 index 000000000..dc62d0b83 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/red_tulip.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/red_tulip" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/red_wool.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/red_wool.json new file mode 100644 index 000000000..310df92d9 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/red_wool.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/red_wool" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/redstone.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/redstone.json new file mode 100644 index 000000000..d09f3de6c --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/redstone.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/redstone" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/redstone_block.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/redstone_block.json new file mode 100644 index 000000000..20d75a80d --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/redstone_block.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/redstone_block" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/redstone_lamp.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/redstone_lamp.json new file mode 100644 index 000000000..4edf1ab0d --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/redstone_lamp.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/redstone_lamp" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/redstone_ore.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/redstone_ore.json new file mode 100644 index 000000000..a6a5f3e39 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/redstone_ore.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/redstone_ore" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/redstone_torch.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/redstone_torch.json new file mode 100644 index 000000000..45deab455 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/redstone_torch.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/redstone_torch" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/reinforced_deepslate.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/reinforced_deepslate.json new file mode 100644 index 000000000..7e8fd3ec5 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/reinforced_deepslate.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/reinforced_deepslate" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/repeater.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/repeater.json new file mode 100644 index 000000000..b0446ebe9 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/repeater.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/repeater" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/repeating_command_block.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/repeating_command_block.json new file mode 100644 index 000000000..404579414 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/repeating_command_block.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/repeating_command_block" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/resin_block.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/resin_block.json new file mode 100644 index 000000000..d50dedec3 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/resin_block.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/resin_block" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/resin_brick.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/resin_brick.json new file mode 100644 index 000000000..3443227b4 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/resin_brick.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/resin_brick" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/resin_brick_slab.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/resin_brick_slab.json new file mode 100644 index 000000000..e45cebb36 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/resin_brick_slab.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/resin_brick_slab" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/resin_brick_stairs.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/resin_brick_stairs.json new file mode 100644 index 000000000..2ea91f798 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/resin_brick_stairs.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/resin_brick_stairs" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/resin_brick_wall.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/resin_brick_wall.json new file mode 100644 index 000000000..36d28477e --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/resin_brick_wall.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/resin_brick_wall_inventory" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/resin_bricks.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/resin_bricks.json new file mode 100644 index 000000000..659164ae0 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/resin_bricks.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/resin_bricks" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/resin_clump.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/resin_clump.json new file mode 100644 index 000000000..566ea5239 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/resin_clump.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/resin_clump" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/respawn_anchor.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/respawn_anchor.json new file mode 100644 index 000000000..4d9f0c72b --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/respawn_anchor.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/respawn_anchor_0" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/rib_armor_trim_smithing_template.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/rib_armor_trim_smithing_template.json new file mode 100644 index 000000000..94267177d --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/rib_armor_trim_smithing_template.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/rib_armor_trim_smithing_template" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/rooted_dirt.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/rooted_dirt.json new file mode 100644 index 000000000..c881387e0 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/rooted_dirt.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/rooted_dirt" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/rose_bush.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/rose_bush.json new file mode 100644 index 000000000..2f7fcbb65 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/rose_bush.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/rose_bush" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/rotten_flesh.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/rotten_flesh.json new file mode 100644 index 000000000..a589c2afc --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/rotten_flesh.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/rotten_flesh" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/saddle.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/saddle.json new file mode 100644 index 000000000..7fd03e7ad --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/saddle.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/saddle" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/salmon.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/salmon.json new file mode 100644 index 000000000..ad1ff9621 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/salmon.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/salmon" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/salmon_bucket.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/salmon_bucket.json new file mode 100644 index 000000000..b5c3af3d3 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/salmon_bucket.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/salmon_bucket" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/salmon_spawn_egg.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/salmon_spawn_egg.json new file mode 100644 index 000000000..bd0fd4bb5 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/salmon_spawn_egg.json @@ -0,0 +1,16 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/template_spawn_egg", + "tints": [ + { + "type": "minecraft:constant", + "value": -6287600 + }, + { + "type": "minecraft:constant", + "value": -15825804 + } + ] + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/sand.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/sand.json new file mode 100644 index 000000000..0d053d91d --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/sand.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/sand" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/sandstone.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/sandstone.json new file mode 100644 index 000000000..a8071c3d0 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/sandstone.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/sandstone" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/sandstone_slab.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/sandstone_slab.json new file mode 100644 index 000000000..63249734e --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/sandstone_slab.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/sandstone_slab" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/sandstone_stairs.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/sandstone_stairs.json new file mode 100644 index 000000000..d3bd4df77 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/sandstone_stairs.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/sandstone_stairs" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/sandstone_wall.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/sandstone_wall.json new file mode 100644 index 000000000..4c63f461a --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/sandstone_wall.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/sandstone_wall_inventory" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/scaffolding.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/scaffolding.json new file mode 100644 index 000000000..c3692b7ee --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/scaffolding.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/scaffolding_stable" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/scrape_pottery_sherd.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/scrape_pottery_sherd.json new file mode 100644 index 000000000..020a80ec4 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/scrape_pottery_sherd.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/scrape_pottery_sherd" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/sculk.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/sculk.json new file mode 100644 index 000000000..73211e5f5 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/sculk.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/sculk" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/sculk_catalyst.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/sculk_catalyst.json new file mode 100644 index 000000000..fd27d7843 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/sculk_catalyst.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/sculk_catalyst" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/sculk_sensor.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/sculk_sensor.json new file mode 100644 index 000000000..7ffe1c992 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/sculk_sensor.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/sculk_sensor_inactive" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/sculk_shrieker.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/sculk_shrieker.json new file mode 100644 index 000000000..5c4166a29 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/sculk_shrieker.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/sculk_shrieker" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/sculk_vein.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/sculk_vein.json new file mode 100644 index 000000000..468d5a93a --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/sculk_vein.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/sculk_vein" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/sea_lantern.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/sea_lantern.json new file mode 100644 index 000000000..33663f597 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/sea_lantern.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/sea_lantern" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/sea_pickle.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/sea_pickle.json new file mode 100644 index 000000000..46e93249f --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/sea_pickle.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/sea_pickle" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/seagrass.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/seagrass.json new file mode 100644 index 000000000..39d338bc9 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/seagrass.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/seagrass" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/sentry_armor_trim_smithing_template.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/sentry_armor_trim_smithing_template.json new file mode 100644 index 000000000..1c3fd1154 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/sentry_armor_trim_smithing_template.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/sentry_armor_trim_smithing_template" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/shaper_armor_trim_smithing_template.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/shaper_armor_trim_smithing_template.json new file mode 100644 index 000000000..1d7a21224 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/shaper_armor_trim_smithing_template.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/shaper_armor_trim_smithing_template" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/sheaf_pottery_sherd.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/sheaf_pottery_sherd.json new file mode 100644 index 000000000..25308a86a --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/sheaf_pottery_sherd.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/sheaf_pottery_sherd" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/shears.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/shears.json new file mode 100644 index 000000000..10f58ec82 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/shears.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/shears" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/sheep_spawn_egg.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/sheep_spawn_egg.json new file mode 100644 index 000000000..609bbd43d --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/sheep_spawn_egg.json @@ -0,0 +1,16 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/template_spawn_egg", + "tints": [ + { + "type": "minecraft:constant", + "value": -1579033 + }, + { + "type": "minecraft:constant", + "value": -19019 + } + ] + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/shelter_pottery_sherd.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/shelter_pottery_sherd.json new file mode 100644 index 000000000..392707eb5 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/shelter_pottery_sherd.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/shelter_pottery_sherd" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/shield.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/shield.json new file mode 100644 index 000000000..f6bc4b3e0 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/shield.json @@ -0,0 +1,20 @@ +{ + "model": { + "type": "minecraft:condition", + "on_false": { + "type": "minecraft:special", + "base": "minecraft:item/shield", + "model": { + "type": "minecraft:shield" + } + }, + "on_true": { + "type": "minecraft:special", + "base": "minecraft:item/shield_blocking", + "model": { + "type": "minecraft:shield" + } + }, + "property": "minecraft:using_item" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/short_grass.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/short_grass.json new file mode 100644 index 000000000..d218bc011 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/short_grass.json @@ -0,0 +1,13 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/short_grass", + "tints": [ + { + "type": "minecraft:grass", + "downfall": 1.0, + "temperature": 0.5 + } + ] + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/shroomlight.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/shroomlight.json new file mode 100644 index 000000000..2cbf73b0e --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/shroomlight.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/shroomlight" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/shulker_box.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/shulker_box.json new file mode 100644 index 000000000..b688cdb37 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/shulker_box.json @@ -0,0 +1,10 @@ +{ + "model": { + "type": "minecraft:special", + "base": "minecraft:item/shulker_box", + "model": { + "type": "minecraft:shulker_box", + "texture": "minecraft:shulker" + } + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/shulker_shell.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/shulker_shell.json new file mode 100644 index 000000000..fbb0597f7 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/shulker_shell.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/shulker_shell" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/shulker_spawn_egg.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/shulker_spawn_egg.json new file mode 100644 index 000000000..d7ff35fc8 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/shulker_spawn_egg.json @@ -0,0 +1,16 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/template_spawn_egg", + "tints": [ + { + "type": "minecraft:constant", + "value": -7051372 + }, + { + "type": "minecraft:constant", + "value": -11716526 + } + ] + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/silence_armor_trim_smithing_template.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/silence_armor_trim_smithing_template.json new file mode 100644 index 000000000..c19819d97 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/silence_armor_trim_smithing_template.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/silence_armor_trim_smithing_template" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/silverfish_spawn_egg.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/silverfish_spawn_egg.json new file mode 100644 index 000000000..8f28286f9 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/silverfish_spawn_egg.json @@ -0,0 +1,16 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/template_spawn_egg", + "tints": [ + { + "type": "minecraft:constant", + "value": -9539986 + }, + { + "type": "minecraft:constant", + "value": -13619152 + } + ] + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/skeleton_horse_spawn_egg.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/skeleton_horse_spawn_egg.json new file mode 100644 index 000000000..48c07e137 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/skeleton_horse_spawn_egg.json @@ -0,0 +1,16 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/template_spawn_egg", + "tints": [ + { + "type": "minecraft:constant", + "value": -9934769 + }, + { + "type": "minecraft:constant", + "value": -1710632 + } + ] + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/skeleton_skull.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/skeleton_skull.json new file mode 100644 index 000000000..68cf144ee --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/skeleton_skull.json @@ -0,0 +1,10 @@ +{ + "model": { + "type": "minecraft:special", + "base": "minecraft:item/template_skull", + "model": { + "type": "minecraft:head", + "kind": "skeleton" + } + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/skeleton_spawn_egg.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/skeleton_spawn_egg.json new file mode 100644 index 000000000..e6f776df7 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/skeleton_spawn_egg.json @@ -0,0 +1,16 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/template_spawn_egg", + "tints": [ + { + "type": "minecraft:constant", + "value": -4079167 + }, + { + "type": "minecraft:constant", + "value": -11974327 + } + ] + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/skull_banner_pattern.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/skull_banner_pattern.json new file mode 100644 index 000000000..9bee46be0 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/skull_banner_pattern.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/skull_banner_pattern" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/skull_pottery_sherd.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/skull_pottery_sherd.json new file mode 100644 index 000000000..22a43641b --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/skull_pottery_sherd.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/skull_pottery_sherd" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/slime_ball.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/slime_ball.json new file mode 100644 index 000000000..799ca93af --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/slime_ball.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/slime_ball" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/slime_block.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/slime_block.json new file mode 100644 index 000000000..b066f9faf --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/slime_block.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/slime_block" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/slime_spawn_egg.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/slime_spawn_egg.json new file mode 100644 index 000000000..a6d20b211 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/slime_spawn_egg.json @@ -0,0 +1,16 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/template_spawn_egg", + "tints": [ + { + "type": "minecraft:constant", + "value": -11427778 + }, + { + "type": "minecraft:constant", + "value": -8470674 + } + ] + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/small_amethyst_bud.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/small_amethyst_bud.json new file mode 100644 index 000000000..8d8a72b9b --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/small_amethyst_bud.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/small_amethyst_bud" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/small_dripleaf.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/small_dripleaf.json new file mode 100644 index 000000000..e95125a12 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/small_dripleaf.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/small_dripleaf" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/smithing_table.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/smithing_table.json new file mode 100644 index 000000000..4e3e7f1f1 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/smithing_table.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/smithing_table" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/smoker.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/smoker.json new file mode 100644 index 000000000..2d0f5cdcb --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/smoker.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/smoker" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/smooth_basalt.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/smooth_basalt.json new file mode 100644 index 000000000..7700ef6ea --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/smooth_basalt.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/smooth_basalt" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/smooth_quartz.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/smooth_quartz.json new file mode 100644 index 000000000..cac9ae924 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/smooth_quartz.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/smooth_quartz" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/smooth_quartz_slab.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/smooth_quartz_slab.json new file mode 100644 index 000000000..ec9645011 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/smooth_quartz_slab.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/smooth_quartz_slab" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/smooth_quartz_stairs.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/smooth_quartz_stairs.json new file mode 100644 index 000000000..ab1bf7303 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/smooth_quartz_stairs.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/smooth_quartz_stairs" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/smooth_red_sandstone.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/smooth_red_sandstone.json new file mode 100644 index 000000000..7f06dab46 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/smooth_red_sandstone.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/smooth_red_sandstone" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/smooth_red_sandstone_slab.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/smooth_red_sandstone_slab.json new file mode 100644 index 000000000..292247fa6 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/smooth_red_sandstone_slab.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/smooth_red_sandstone_slab" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/smooth_red_sandstone_stairs.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/smooth_red_sandstone_stairs.json new file mode 100644 index 000000000..048905e01 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/smooth_red_sandstone_stairs.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/smooth_red_sandstone_stairs" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/smooth_sandstone.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/smooth_sandstone.json new file mode 100644 index 000000000..8fca13622 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/smooth_sandstone.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/smooth_sandstone" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/smooth_sandstone_slab.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/smooth_sandstone_slab.json new file mode 100644 index 000000000..23348d0df --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/smooth_sandstone_slab.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/smooth_sandstone_slab" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/smooth_sandstone_stairs.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/smooth_sandstone_stairs.json new file mode 100644 index 000000000..9222c1549 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/smooth_sandstone_stairs.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/smooth_sandstone_stairs" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/smooth_stone.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/smooth_stone.json new file mode 100644 index 000000000..5b3ef2dd3 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/smooth_stone.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/smooth_stone" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/smooth_stone_slab.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/smooth_stone_slab.json new file mode 100644 index 000000000..fd1c9d9c9 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/smooth_stone_slab.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/smooth_stone_slab" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/sniffer_egg.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/sniffer_egg.json new file mode 100644 index 000000000..675288c07 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/sniffer_egg.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/sniffer_egg" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/sniffer_spawn_egg.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/sniffer_spawn_egg.json new file mode 100644 index 000000000..2930eba92 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/sniffer_spawn_egg.json @@ -0,0 +1,16 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/template_spawn_egg", + "tints": [ + { + "type": "minecraft:constant", + "value": -7922167 + }, + { + "type": "minecraft:constant", + "value": -14308496 + } + ] + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/snort_pottery_sherd.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/snort_pottery_sherd.json new file mode 100644 index 000000000..91e2e548c --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/snort_pottery_sherd.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/snort_pottery_sherd" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/snout_armor_trim_smithing_template.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/snout_armor_trim_smithing_template.json new file mode 100644 index 000000000..37b25e534 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/snout_armor_trim_smithing_template.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/snout_armor_trim_smithing_template" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/snow.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/snow.json new file mode 100644 index 000000000..532c74442 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/snow.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/snow_height2" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/snow_block.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/snow_block.json new file mode 100644 index 000000000..b2bb073bf --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/snow_block.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/snow_block" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/snow_golem_spawn_egg.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/snow_golem_spawn_egg.json new file mode 100644 index 000000000..cdf6accdd --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/snow_golem_spawn_egg.json @@ -0,0 +1,16 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/template_spawn_egg", + "tints": [ + { + "type": "minecraft:constant", + "value": -2493710 + }, + { + "type": "minecraft:constant", + "value": -8280924 + } + ] + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/snowball.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/snowball.json new file mode 100644 index 000000000..d33a77a4c --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/snowball.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/snowball" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/soul_campfire.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/soul_campfire.json new file mode 100644 index 000000000..e6bc30427 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/soul_campfire.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/soul_campfire" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/soul_lantern.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/soul_lantern.json new file mode 100644 index 000000000..5798a9a93 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/soul_lantern.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/soul_lantern" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/soul_sand.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/soul_sand.json new file mode 100644 index 000000000..8101cb3c7 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/soul_sand.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/soul_sand" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/soul_soil.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/soul_soil.json new file mode 100644 index 000000000..2345c55ef --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/soul_soil.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/soul_soil" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/soul_torch.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/soul_torch.json new file mode 100644 index 000000000..530bfc4fe --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/soul_torch.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/soul_torch" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/spawner.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/spawner.json new file mode 100644 index 000000000..6064177a5 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/spawner.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/spawner" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/spectral_arrow.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/spectral_arrow.json new file mode 100644 index 000000000..92b39e7e4 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/spectral_arrow.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/spectral_arrow" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/spider_eye.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/spider_eye.json new file mode 100644 index 000000000..2e5832c27 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/spider_eye.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/spider_eye" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/spider_spawn_egg.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/spider_spawn_egg.json new file mode 100644 index 000000000..2ea93aa46 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/spider_spawn_egg.json @@ -0,0 +1,16 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/template_spawn_egg", + "tints": [ + { + "type": "minecraft:constant", + "value": -13357785 + }, + { + "type": "minecraft:constant", + "value": -5763570 + } + ] + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/spire_armor_trim_smithing_template.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/spire_armor_trim_smithing_template.json new file mode 100644 index 000000000..c0ced75d0 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/spire_armor_trim_smithing_template.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/spire_armor_trim_smithing_template" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/splash_potion.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/splash_potion.json new file mode 100644 index 000000000..7fa6e714d --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/splash_potion.json @@ -0,0 +1,12 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/splash_potion", + "tints": [ + { + "type": "minecraft:potion", + "default": -13083194 + } + ] + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/sponge.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/sponge.json new file mode 100644 index 000000000..c60720eec --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/sponge.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/sponge" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/spore_blossom.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/spore_blossom.json new file mode 100644 index 000000000..7e9cc6e76 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/spore_blossom.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/spore_blossom" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/spruce_boat.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/spruce_boat.json new file mode 100644 index 000000000..59d057265 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/spruce_boat.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/spruce_boat" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/spruce_button.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/spruce_button.json new file mode 100644 index 000000000..dd3c78eb0 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/spruce_button.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/spruce_button_inventory" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/spruce_chest_boat.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/spruce_chest_boat.json new file mode 100644 index 000000000..89dbfdeb2 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/spruce_chest_boat.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/spruce_chest_boat" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/spruce_door.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/spruce_door.json new file mode 100644 index 000000000..dda164c24 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/spruce_door.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/spruce_door" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/spruce_fence.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/spruce_fence.json new file mode 100644 index 000000000..22837ca46 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/spruce_fence.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/spruce_fence_inventory" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/spruce_fence_gate.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/spruce_fence_gate.json new file mode 100644 index 000000000..539e3b6bd --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/spruce_fence_gate.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/spruce_fence_gate" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/spruce_hanging_sign.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/spruce_hanging_sign.json new file mode 100644 index 000000000..a2ccee41e --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/spruce_hanging_sign.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/spruce_hanging_sign" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/spruce_leaves.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/spruce_leaves.json new file mode 100644 index 000000000..48be842cf --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/spruce_leaves.json @@ -0,0 +1,12 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/spruce_leaves", + "tints": [ + { + "type": "minecraft:constant", + "value": -10380959 + } + ] + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/spruce_log.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/spruce_log.json new file mode 100644 index 000000000..f106ea3cd --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/spruce_log.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/spruce_log" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/spruce_planks.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/spruce_planks.json new file mode 100644 index 000000000..bda83bc8f --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/spruce_planks.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/spruce_planks" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/spruce_pressure_plate.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/spruce_pressure_plate.json new file mode 100644 index 000000000..2a85b4fe0 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/spruce_pressure_plate.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/spruce_pressure_plate" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/spruce_sapling.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/spruce_sapling.json new file mode 100644 index 000000000..ad926af2d --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/spruce_sapling.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/spruce_sapling" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/spruce_sign.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/spruce_sign.json new file mode 100644 index 000000000..e4c5355c2 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/spruce_sign.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/spruce_sign" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/spruce_slab.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/spruce_slab.json new file mode 100644 index 000000000..1f398c162 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/spruce_slab.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/spruce_slab" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/spruce_stairs.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/spruce_stairs.json new file mode 100644 index 000000000..7282b434e --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/spruce_stairs.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/spruce_stairs" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/spruce_trapdoor.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/spruce_trapdoor.json new file mode 100644 index 000000000..1aed97732 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/spruce_trapdoor.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/spruce_trapdoor_bottom" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/spruce_wood.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/spruce_wood.json new file mode 100644 index 000000000..c7f5f46f3 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/spruce_wood.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/spruce_wood" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/spyglass.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/spyglass.json new file mode 100644 index 000000000..91bbd8485 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/spyglass.json @@ -0,0 +1,23 @@ +{ + "model": { + "type": "minecraft:select", + "cases": [ + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/spyglass" + }, + "when": [ + "gui", + "ground", + "fixed" + ] + } + ], + "fallback": { + "type": "minecraft:model", + "model": "minecraft:item/spyglass_in_hand" + }, + "property": "minecraft:display_context" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/squid_spawn_egg.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/squid_spawn_egg.json new file mode 100644 index 000000000..ad34e5908 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/squid_spawn_egg.json @@ -0,0 +1,16 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/template_spawn_egg", + "tints": [ + { + "type": "minecraft:constant", + "value": -14533811 + }, + { + "type": "minecraft:constant", + "value": -9402215 + } + ] + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/stick.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/stick.json new file mode 100644 index 000000000..d2e5fd07e --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/stick.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/stick" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/sticky_piston.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/sticky_piston.json new file mode 100644 index 000000000..7d62c70d7 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/sticky_piston.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/sticky_piston_inventory" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/stone.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/stone.json new file mode 100644 index 000000000..f5c9f2a0d --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/stone.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/stone" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/stone_axe.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/stone_axe.json new file mode 100644 index 000000000..439896b14 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/stone_axe.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/stone_axe" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/stone_brick_slab.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/stone_brick_slab.json new file mode 100644 index 000000000..470cba9e9 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/stone_brick_slab.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/stone_brick_slab" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/stone_brick_stairs.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/stone_brick_stairs.json new file mode 100644 index 000000000..a80ee9645 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/stone_brick_stairs.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/stone_brick_stairs" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/stone_brick_wall.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/stone_brick_wall.json new file mode 100644 index 000000000..1690e1d7b --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/stone_brick_wall.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/stone_brick_wall_inventory" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/stone_bricks.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/stone_bricks.json new file mode 100644 index 000000000..a61dd731d --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/stone_bricks.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/stone_bricks" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/stone_button.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/stone_button.json new file mode 100644 index 000000000..fe492729d --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/stone_button.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/stone_button_inventory" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/stone_hoe.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/stone_hoe.json new file mode 100644 index 000000000..c9aa4f301 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/stone_hoe.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/stone_hoe" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/stone_pickaxe.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/stone_pickaxe.json new file mode 100644 index 000000000..43c464967 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/stone_pickaxe.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/stone_pickaxe" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/stone_pressure_plate.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/stone_pressure_plate.json new file mode 100644 index 000000000..eed8e4d58 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/stone_pressure_plate.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/stone_pressure_plate" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/stone_shovel.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/stone_shovel.json new file mode 100644 index 000000000..83c3f305e --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/stone_shovel.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/stone_shovel" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/stone_slab.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/stone_slab.json new file mode 100644 index 000000000..277a59287 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/stone_slab.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/stone_slab" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/stone_stairs.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/stone_stairs.json new file mode 100644 index 000000000..16adbff01 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/stone_stairs.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/stone_stairs" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/stone_sword.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/stone_sword.json new file mode 100644 index 000000000..7213642ef --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/stone_sword.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/stone_sword" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/stonecutter.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/stonecutter.json new file mode 100644 index 000000000..cd72ad0e2 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/stonecutter.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/stonecutter" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/stray_spawn_egg.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/stray_spawn_egg.json new file mode 100644 index 000000000..af04df236 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/stray_spawn_egg.json @@ -0,0 +1,16 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/template_spawn_egg", + "tints": [ + { + "type": "minecraft:constant", + "value": -10389897 + }, + { + "type": "minecraft:constant", + "value": -2233622 + } + ] + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/strider_spawn_egg.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/strider_spawn_egg.json new file mode 100644 index 000000000..807fdf823 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/strider_spawn_egg.json @@ -0,0 +1,16 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/template_spawn_egg", + "tints": [ + { + "type": "minecraft:constant", + "value": -6540234 + }, + { + "type": "minecraft:constant", + "value": -11712179 + } + ] + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/string.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/string.json new file mode 100644 index 000000000..8f748c80f --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/string.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/string" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/stripped_acacia_log.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/stripped_acacia_log.json new file mode 100644 index 000000000..6c34eef11 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/stripped_acacia_log.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/stripped_acacia_log" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/stripped_acacia_wood.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/stripped_acacia_wood.json new file mode 100644 index 000000000..34e2ee6dd --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/stripped_acacia_wood.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/stripped_acacia_wood" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/stripped_bamboo_block.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/stripped_bamboo_block.json new file mode 100644 index 000000000..4cabea36f --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/stripped_bamboo_block.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/stripped_bamboo_block" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/stripped_birch_log.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/stripped_birch_log.json new file mode 100644 index 000000000..c99a9a8ca --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/stripped_birch_log.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/stripped_birch_log" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/stripped_birch_wood.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/stripped_birch_wood.json new file mode 100644 index 000000000..80f86c85f --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/stripped_birch_wood.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/stripped_birch_wood" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/stripped_cherry_log.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/stripped_cherry_log.json new file mode 100644 index 000000000..47cde5ccc --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/stripped_cherry_log.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/stripped_cherry_log" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/stripped_cherry_wood.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/stripped_cherry_wood.json new file mode 100644 index 000000000..daefe8eee --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/stripped_cherry_wood.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/stripped_cherry_wood" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/stripped_crimson_hyphae.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/stripped_crimson_hyphae.json new file mode 100644 index 000000000..5cf344efd --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/stripped_crimson_hyphae.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/stripped_crimson_hyphae" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/stripped_crimson_stem.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/stripped_crimson_stem.json new file mode 100644 index 000000000..96e913a1f --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/stripped_crimson_stem.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/stripped_crimson_stem" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/stripped_dark_oak_log.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/stripped_dark_oak_log.json new file mode 100644 index 000000000..b84166629 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/stripped_dark_oak_log.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/stripped_dark_oak_log" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/stripped_dark_oak_wood.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/stripped_dark_oak_wood.json new file mode 100644 index 000000000..f673458ac --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/stripped_dark_oak_wood.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/stripped_dark_oak_wood" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/stripped_jungle_log.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/stripped_jungle_log.json new file mode 100644 index 000000000..1e1a81bcd --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/stripped_jungle_log.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/stripped_jungle_log" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/stripped_jungle_wood.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/stripped_jungle_wood.json new file mode 100644 index 000000000..79a560935 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/stripped_jungle_wood.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/stripped_jungle_wood" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/stripped_mangrove_log.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/stripped_mangrove_log.json new file mode 100644 index 000000000..ad55c4071 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/stripped_mangrove_log.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/stripped_mangrove_log" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/stripped_mangrove_wood.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/stripped_mangrove_wood.json new file mode 100644 index 000000000..a9316c1a1 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/stripped_mangrove_wood.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/stripped_mangrove_wood" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/stripped_oak_log.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/stripped_oak_log.json new file mode 100644 index 000000000..9f4bf5847 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/stripped_oak_log.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/stripped_oak_log" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/stripped_oak_wood.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/stripped_oak_wood.json new file mode 100644 index 000000000..7ad322144 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/stripped_oak_wood.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/stripped_oak_wood" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/stripped_pale_oak_log.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/stripped_pale_oak_log.json new file mode 100644 index 000000000..0446e2813 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/stripped_pale_oak_log.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/stripped_pale_oak_log" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/stripped_pale_oak_wood.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/stripped_pale_oak_wood.json new file mode 100644 index 000000000..109ad1aca --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/stripped_pale_oak_wood.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/stripped_pale_oak_wood" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/stripped_spruce_log.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/stripped_spruce_log.json new file mode 100644 index 000000000..cdd2f2928 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/stripped_spruce_log.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/stripped_spruce_log" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/stripped_spruce_wood.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/stripped_spruce_wood.json new file mode 100644 index 000000000..28cf5b63d --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/stripped_spruce_wood.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/stripped_spruce_wood" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/stripped_warped_hyphae.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/stripped_warped_hyphae.json new file mode 100644 index 000000000..4e814822d --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/stripped_warped_hyphae.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/stripped_warped_hyphae" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/stripped_warped_stem.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/stripped_warped_stem.json new file mode 100644 index 000000000..e3bbcec35 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/stripped_warped_stem.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/stripped_warped_stem" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/structure_block.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/structure_block.json new file mode 100644 index 000000000..bf984362f --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/structure_block.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/structure_block" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/structure_void.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/structure_void.json new file mode 100644 index 000000000..806791166 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/structure_void.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/structure_void" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/sugar.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/sugar.json new file mode 100644 index 000000000..8a2ac1f02 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/sugar.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/sugar" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/sugar_cane.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/sugar_cane.json new file mode 100644 index 000000000..fcffd263b --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/sugar_cane.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/sugar_cane" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/sunflower.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/sunflower.json new file mode 100644 index 000000000..db77a8cb3 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/sunflower.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/sunflower" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/suspicious_gravel.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/suspicious_gravel.json new file mode 100644 index 000000000..a2ae98d8b --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/suspicious_gravel.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/suspicious_gravel_0" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/suspicious_sand.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/suspicious_sand.json new file mode 100644 index 000000000..d1e5b53ec --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/suspicious_sand.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/suspicious_sand_0" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/suspicious_stew.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/suspicious_stew.json new file mode 100644 index 000000000..39814c701 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/suspicious_stew.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/suspicious_stew" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/sweet_berries.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/sweet_berries.json new file mode 100644 index 000000000..abce325f7 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/sweet_berries.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/sweet_berries" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/tadpole_bucket.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/tadpole_bucket.json new file mode 100644 index 000000000..6a3f1f5c6 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/tadpole_bucket.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/tadpole_bucket" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/tadpole_spawn_egg.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/tadpole_spawn_egg.json new file mode 100644 index 000000000..1a2306bfa --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/tadpole_spawn_egg.json @@ -0,0 +1,16 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/template_spawn_egg", + "tints": [ + { + "type": "minecraft:constant", + "value": -9612483 + }, + { + "type": "minecraft:constant", + "value": -15332864 + } + ] + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/tall_grass.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/tall_grass.json new file mode 100644 index 000000000..8e524c317 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/tall_grass.json @@ -0,0 +1,13 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/tall_grass", + "tints": [ + { + "type": "minecraft:grass", + "downfall": 1.0, + "temperature": 0.5 + } + ] + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/target.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/target.json new file mode 100644 index 000000000..06200fd8c --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/target.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/target" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/terracotta.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/terracotta.json new file mode 100644 index 000000000..690ee8153 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/terracotta.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/terracotta" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/tide_armor_trim_smithing_template.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/tide_armor_trim_smithing_template.json new file mode 100644 index 000000000..a4578f21b --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/tide_armor_trim_smithing_template.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/tide_armor_trim_smithing_template" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/tinted_glass.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/tinted_glass.json new file mode 100644 index 000000000..9a56958c8 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/tinted_glass.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/tinted_glass" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/tipped_arrow.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/tipped_arrow.json new file mode 100644 index 000000000..77ba8aa89 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/tipped_arrow.json @@ -0,0 +1,12 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/tipped_arrow", + "tints": [ + { + "type": "minecraft:potion", + "default": -13083194 + } + ] + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/tnt.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/tnt.json new file mode 100644 index 000000000..ed41988a6 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/tnt.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/tnt" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/tnt_minecart.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/tnt_minecart.json new file mode 100644 index 000000000..f390cb9bc --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/tnt_minecart.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/tnt_minecart" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/torch.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/torch.json new file mode 100644 index 000000000..44a5efb9f --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/torch.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/torch" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/torchflower.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/torchflower.json new file mode 100644 index 000000000..aeb1619c5 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/torchflower.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/torchflower" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/torchflower_seeds.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/torchflower_seeds.json new file mode 100644 index 000000000..d8ad414e0 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/torchflower_seeds.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/torchflower_seeds" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/totem_of_undying.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/totem_of_undying.json new file mode 100644 index 000000000..e1844f63a --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/totem_of_undying.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/totem_of_undying" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/trader_llama_spawn_egg.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/trader_llama_spawn_egg.json new file mode 100644 index 000000000..717eda548 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/trader_llama_spawn_egg.json @@ -0,0 +1,16 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/template_spawn_egg", + "tints": [ + { + "type": "minecraft:constant", + "value": -1399760 + }, + { + "type": "minecraft:constant", + "value": -12229994 + } + ] + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/trapped_chest.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/trapped_chest.json new file mode 100644 index 000000000..bac5cdb57 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/trapped_chest.json @@ -0,0 +1,32 @@ +{ + "model": { + "type": "minecraft:select", + "cases": [ + { + "model": { + "type": "minecraft:special", + "base": "minecraft:item/trapped_chest", + "model": { + "type": "minecraft:chest", + "texture": "minecraft:christmas" + } + }, + "when": [ + "12-24", + "12-25", + "12-26" + ] + } + ], + "fallback": { + "type": "minecraft:special", + "base": "minecraft:item/trapped_chest", + "model": { + "type": "minecraft:chest", + "texture": "minecraft:trapped" + } + }, + "pattern": "MM-dd", + "property": "minecraft:local_time" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/trial_key.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/trial_key.json new file mode 100644 index 000000000..3a34cbaf4 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/trial_key.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/trial_key" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/trial_spawner.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/trial_spawner.json new file mode 100644 index 000000000..809b44605 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/trial_spawner.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/trial_spawner" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/trident.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/trident.json new file mode 100644 index 000000000..9f6c47801 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/trident.json @@ -0,0 +1,37 @@ +{ + "model": { + "type": "minecraft:select", + "cases": [ + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/trident" + }, + "when": [ + "gui", + "ground", + "fixed" + ] + } + ], + "fallback": { + "type": "minecraft:condition", + "on_false": { + "type": "minecraft:special", + "base": "minecraft:item/trident_in_hand", + "model": { + "type": "minecraft:trident" + } + }, + "on_true": { + "type": "minecraft:special", + "base": "minecraft:item/trident_throwing", + "model": { + "type": "minecraft:trident" + } + }, + "property": "minecraft:using_item" + }, + "property": "minecraft:display_context" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/tripwire_hook.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/tripwire_hook.json new file mode 100644 index 000000000..f9bf5abd9 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/tripwire_hook.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/tripwire_hook" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/tropical_fish.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/tropical_fish.json new file mode 100644 index 000000000..26f2f487a --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/tropical_fish.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/tropical_fish" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/tropical_fish_bucket.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/tropical_fish_bucket.json new file mode 100644 index 000000000..2db713646 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/tropical_fish_bucket.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/tropical_fish_bucket" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/tropical_fish_spawn_egg.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/tropical_fish_spawn_egg.json new file mode 100644 index 000000000..f0966e936 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/tropical_fish_spawn_egg.json @@ -0,0 +1,16 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/template_spawn_egg", + "tints": [ + { + "type": "minecraft:constant", + "value": -1087211 + }, + { + "type": "minecraft:constant", + "value": -1553 + } + ] + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/tube_coral.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/tube_coral.json new file mode 100644 index 000000000..931087805 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/tube_coral.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/tube_coral" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/tube_coral_block.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/tube_coral_block.json new file mode 100644 index 000000000..790d51d29 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/tube_coral_block.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/tube_coral_block" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/tube_coral_fan.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/tube_coral_fan.json new file mode 100644 index 000000000..6159f2630 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/tube_coral_fan.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/tube_coral_fan" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/tuff.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/tuff.json new file mode 100644 index 000000000..610c254a3 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/tuff.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/tuff" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/tuff_brick_slab.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/tuff_brick_slab.json new file mode 100644 index 000000000..0cdb4823b --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/tuff_brick_slab.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/tuff_brick_slab" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/tuff_brick_stairs.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/tuff_brick_stairs.json new file mode 100644 index 000000000..378136c35 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/tuff_brick_stairs.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/tuff_brick_stairs" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/tuff_brick_wall.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/tuff_brick_wall.json new file mode 100644 index 000000000..7ce468095 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/tuff_brick_wall.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/tuff_brick_wall_inventory" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/tuff_bricks.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/tuff_bricks.json new file mode 100644 index 000000000..2d4f32e64 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/tuff_bricks.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/tuff_bricks" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/tuff_slab.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/tuff_slab.json new file mode 100644 index 000000000..abd0a96ab --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/tuff_slab.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/tuff_slab" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/tuff_stairs.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/tuff_stairs.json new file mode 100644 index 000000000..7011809e7 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/tuff_stairs.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/tuff_stairs" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/tuff_wall.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/tuff_wall.json new file mode 100644 index 000000000..886b4bcbf --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/tuff_wall.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/tuff_wall_inventory" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/turtle_egg.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/turtle_egg.json new file mode 100644 index 000000000..fc91fe7d0 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/turtle_egg.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/turtle_egg" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/turtle_helmet.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/turtle_helmet.json new file mode 100644 index 000000000..5fa761e95 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/turtle_helmet.json @@ -0,0 +1,89 @@ +{ + "model": { + "type": "minecraft:select", + "cases": [ + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/turtle_helmet_quartz_trim" + }, + "when": "minecraft:quartz" + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/turtle_helmet_iron_trim" + }, + "when": "minecraft:iron" + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/turtle_helmet_netherite_trim" + }, + "when": "minecraft:netherite" + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/turtle_helmet_redstone_trim" + }, + "when": "minecraft:redstone" + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/turtle_helmet_copper_trim" + }, + "when": "minecraft:copper" + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/turtle_helmet_gold_trim" + }, + "when": "minecraft:gold" + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/turtle_helmet_emerald_trim" + }, + "when": "minecraft:emerald" + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/turtle_helmet_diamond_trim" + }, + "when": "minecraft:diamond" + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/turtle_helmet_lapis_trim" + }, + "when": "minecraft:lapis" + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/turtle_helmet_amethyst_trim" + }, + "when": "minecraft:amethyst" + }, + { + "model": { + "type": "minecraft:model", + "model": "minecraft:item/turtle_helmet_resin_trim" + }, + "when": "minecraft:resin" + } + ], + "fallback": { + "type": "minecraft:model", + "model": "minecraft:item/turtle_helmet" + }, + "property": "minecraft:trim_material" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/turtle_scute.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/turtle_scute.json new file mode 100644 index 000000000..9c2501507 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/turtle_scute.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/turtle_scute" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/turtle_spawn_egg.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/turtle_spawn_egg.json new file mode 100644 index 000000000..1f072089b --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/turtle_spawn_egg.json @@ -0,0 +1,16 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/template_spawn_egg", + "tints": [ + { + "type": "minecraft:constant", + "value": -1579033 + }, + { + "type": "minecraft:constant", + "value": -16732241 + } + ] + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/twisting_vines.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/twisting_vines.json new file mode 100644 index 000000000..53aa26dde --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/twisting_vines.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/twisting_vines" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/vault.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/vault.json new file mode 100644 index 000000000..822f3d249 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/vault.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/vault" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/verdant_froglight.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/verdant_froglight.json new file mode 100644 index 000000000..78844215c --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/verdant_froglight.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/verdant_froglight" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/vex_armor_trim_smithing_template.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/vex_armor_trim_smithing_template.json new file mode 100644 index 000000000..59c22037c --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/vex_armor_trim_smithing_template.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/vex_armor_trim_smithing_template" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/vex_spawn_egg.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/vex_spawn_egg.json new file mode 100644 index 000000000..4a941b7d5 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/vex_spawn_egg.json @@ -0,0 +1,16 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/template_spawn_egg", + "tints": [ + { + "type": "minecraft:constant", + "value": -8744796 + }, + { + "type": "minecraft:constant", + "value": -1511951 + } + ] + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/villager_spawn_egg.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/villager_spawn_egg.json new file mode 100644 index 000000000..c8b680aa7 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/villager_spawn_egg.json @@ -0,0 +1,16 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/template_spawn_egg", + "tints": [ + { + "type": "minecraft:constant", + "value": -11125709 + }, + { + "type": "minecraft:constant", + "value": -4355214 + } + ] + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/vindicator_spawn_egg.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/vindicator_spawn_egg.json new file mode 100644 index 000000000..f60cf9d95 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/vindicator_spawn_egg.json @@ -0,0 +1,16 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/template_spawn_egg", + "tints": [ + { + "type": "minecraft:constant", + "value": -6972517 + }, + { + "type": "minecraft:constant", + "value": -14197151 + } + ] + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/vine.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/vine.json new file mode 100644 index 000000000..e13000c14 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/vine.json @@ -0,0 +1,12 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/vine", + "tints": [ + { + "type": "minecraft:constant", + "value": -12012264 + } + ] + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/wandering_trader_spawn_egg.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/wandering_trader_spawn_egg.json new file mode 100644 index 000000000..0e6d1b5fe --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/wandering_trader_spawn_egg.json @@ -0,0 +1,16 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/template_spawn_egg", + "tints": [ + { + "type": "minecraft:constant", + "value": -12229994 + }, + { + "type": "minecraft:constant", + "value": -1399760 + } + ] + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/ward_armor_trim_smithing_template.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/ward_armor_trim_smithing_template.json new file mode 100644 index 000000000..c329bccc9 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/ward_armor_trim_smithing_template.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/ward_armor_trim_smithing_template" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/warden_spawn_egg.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/warden_spawn_egg.json new file mode 100644 index 000000000..c51f0f271 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/warden_spawn_egg.json @@ -0,0 +1,16 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/template_spawn_egg", + "tints": [ + { + "type": "minecraft:constant", + "value": -15776183 + }, + { + "type": "minecraft:constant", + "value": -12986656 + } + ] + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/warped_button.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/warped_button.json new file mode 100644 index 000000000..aa659e22d --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/warped_button.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/warped_button_inventory" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/warped_door.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/warped_door.json new file mode 100644 index 000000000..dbeece427 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/warped_door.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/warped_door" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/warped_fence.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/warped_fence.json new file mode 100644 index 000000000..815eacdb8 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/warped_fence.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/warped_fence_inventory" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/warped_fence_gate.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/warped_fence_gate.json new file mode 100644 index 000000000..e572057d2 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/warped_fence_gate.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/warped_fence_gate" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/warped_fungus.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/warped_fungus.json new file mode 100644 index 000000000..085c1e25b --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/warped_fungus.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/warped_fungus" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/warped_fungus_on_a_stick.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/warped_fungus_on_a_stick.json new file mode 100644 index 000000000..678bf6260 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/warped_fungus_on_a_stick.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/warped_fungus_on_a_stick" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/warped_hanging_sign.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/warped_hanging_sign.json new file mode 100644 index 000000000..f823655b5 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/warped_hanging_sign.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/warped_hanging_sign" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/warped_hyphae.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/warped_hyphae.json new file mode 100644 index 000000000..cb3ab3d20 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/warped_hyphae.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/warped_hyphae" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/warped_nylium.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/warped_nylium.json new file mode 100644 index 000000000..a96277878 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/warped_nylium.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/warped_nylium" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/warped_planks.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/warped_planks.json new file mode 100644 index 000000000..25e02f2fc --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/warped_planks.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/warped_planks" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/warped_pressure_plate.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/warped_pressure_plate.json new file mode 100644 index 000000000..13d620762 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/warped_pressure_plate.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/warped_pressure_plate" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/warped_roots.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/warped_roots.json new file mode 100644 index 000000000..f9e0e5d0b --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/warped_roots.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/warped_roots" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/warped_sign.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/warped_sign.json new file mode 100644 index 000000000..c8a6a9522 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/warped_sign.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/warped_sign" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/warped_slab.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/warped_slab.json new file mode 100644 index 000000000..bcde31a96 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/warped_slab.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/warped_slab" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/warped_stairs.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/warped_stairs.json new file mode 100644 index 000000000..9d6eff56f --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/warped_stairs.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/warped_stairs" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/warped_stem.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/warped_stem.json new file mode 100644 index 000000000..6766888db --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/warped_stem.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/warped_stem" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/warped_trapdoor.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/warped_trapdoor.json new file mode 100644 index 000000000..f3a05d243 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/warped_trapdoor.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/warped_trapdoor_bottom" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/warped_wart_block.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/warped_wart_block.json new file mode 100644 index 000000000..cd1c64082 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/warped_wart_block.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/warped_wart_block" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/water_bucket.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/water_bucket.json new file mode 100644 index 000000000..0a6169595 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/water_bucket.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/water_bucket" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/waxed_chiseled_copper.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/waxed_chiseled_copper.json new file mode 100644 index 000000000..99d4996d5 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/waxed_chiseled_copper.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/chiseled_copper" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/waxed_copper_block.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/waxed_copper_block.json new file mode 100644 index 000000000..5060ed21a --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/waxed_copper_block.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/copper_block" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/waxed_copper_bulb.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/waxed_copper_bulb.json new file mode 100644 index 000000000..feafbf2c1 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/waxed_copper_bulb.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/copper_bulb" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/waxed_copper_door.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/waxed_copper_door.json new file mode 100644 index 000000000..6bc75ee4d --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/waxed_copper_door.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/copper_door" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/waxed_copper_grate.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/waxed_copper_grate.json new file mode 100644 index 000000000..7d9789bce --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/waxed_copper_grate.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/copper_grate" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/waxed_copper_trapdoor.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/waxed_copper_trapdoor.json new file mode 100644 index 000000000..03981dc9b --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/waxed_copper_trapdoor.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/copper_trapdoor_bottom" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/waxed_cut_copper.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/waxed_cut_copper.json new file mode 100644 index 000000000..69a734c6b --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/waxed_cut_copper.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/cut_copper" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/waxed_cut_copper_slab.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/waxed_cut_copper_slab.json new file mode 100644 index 000000000..1f8c61975 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/waxed_cut_copper_slab.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/cut_copper_slab" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/waxed_cut_copper_stairs.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/waxed_cut_copper_stairs.json new file mode 100644 index 000000000..d63128c1a --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/waxed_cut_copper_stairs.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/cut_copper_stairs" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/waxed_exposed_chiseled_copper.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/waxed_exposed_chiseled_copper.json new file mode 100644 index 000000000..22657b6a6 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/waxed_exposed_chiseled_copper.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/exposed_chiseled_copper" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/waxed_exposed_copper.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/waxed_exposed_copper.json new file mode 100644 index 000000000..632da6748 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/waxed_exposed_copper.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/exposed_copper" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/waxed_exposed_copper_bulb.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/waxed_exposed_copper_bulb.json new file mode 100644 index 000000000..d54e63062 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/waxed_exposed_copper_bulb.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/exposed_copper_bulb" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/waxed_exposed_copper_door.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/waxed_exposed_copper_door.json new file mode 100644 index 000000000..0ca6e2ca8 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/waxed_exposed_copper_door.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/exposed_copper_door" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/waxed_exposed_copper_grate.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/waxed_exposed_copper_grate.json new file mode 100644 index 000000000..07c561b46 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/waxed_exposed_copper_grate.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/exposed_copper_grate" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/waxed_exposed_copper_trapdoor.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/waxed_exposed_copper_trapdoor.json new file mode 100644 index 000000000..260b680ea --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/waxed_exposed_copper_trapdoor.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/exposed_copper_trapdoor_bottom" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/waxed_exposed_cut_copper.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/waxed_exposed_cut_copper.json new file mode 100644 index 000000000..35932366f --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/waxed_exposed_cut_copper.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/exposed_cut_copper" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/waxed_exposed_cut_copper_slab.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/waxed_exposed_cut_copper_slab.json new file mode 100644 index 000000000..818f88602 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/waxed_exposed_cut_copper_slab.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/exposed_cut_copper_slab" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/waxed_exposed_cut_copper_stairs.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/waxed_exposed_cut_copper_stairs.json new file mode 100644 index 000000000..54f5c1f06 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/waxed_exposed_cut_copper_stairs.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/exposed_cut_copper_stairs" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/waxed_oxidized_chiseled_copper.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/waxed_oxidized_chiseled_copper.json new file mode 100644 index 000000000..78b7eae05 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/waxed_oxidized_chiseled_copper.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/oxidized_chiseled_copper" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/waxed_oxidized_copper.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/waxed_oxidized_copper.json new file mode 100644 index 000000000..c58b7f62d --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/waxed_oxidized_copper.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/oxidized_copper" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/waxed_oxidized_copper_bulb.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/waxed_oxidized_copper_bulb.json new file mode 100644 index 000000000..aeab2c8ce --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/waxed_oxidized_copper_bulb.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/oxidized_copper_bulb" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/waxed_oxidized_copper_door.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/waxed_oxidized_copper_door.json new file mode 100644 index 000000000..b5cc84d31 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/waxed_oxidized_copper_door.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/oxidized_copper_door" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/waxed_oxidized_copper_grate.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/waxed_oxidized_copper_grate.json new file mode 100644 index 000000000..90d2a4833 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/waxed_oxidized_copper_grate.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/oxidized_copper_grate" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/waxed_oxidized_copper_trapdoor.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/waxed_oxidized_copper_trapdoor.json new file mode 100644 index 000000000..245f08ef9 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/waxed_oxidized_copper_trapdoor.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/oxidized_copper_trapdoor_bottom" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/waxed_oxidized_cut_copper.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/waxed_oxidized_cut_copper.json new file mode 100644 index 000000000..ec0748d35 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/waxed_oxidized_cut_copper.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/oxidized_cut_copper" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/waxed_oxidized_cut_copper_slab.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/waxed_oxidized_cut_copper_slab.json new file mode 100644 index 000000000..3e15eec78 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/waxed_oxidized_cut_copper_slab.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/oxidized_cut_copper_slab" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/waxed_oxidized_cut_copper_stairs.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/waxed_oxidized_cut_copper_stairs.json new file mode 100644 index 000000000..7fd0b7f0f --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/waxed_oxidized_cut_copper_stairs.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/oxidized_cut_copper_stairs" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/waxed_weathered_chiseled_copper.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/waxed_weathered_chiseled_copper.json new file mode 100644 index 000000000..f046852be --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/waxed_weathered_chiseled_copper.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/weathered_chiseled_copper" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/waxed_weathered_copper.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/waxed_weathered_copper.json new file mode 100644 index 000000000..75710bc9f --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/waxed_weathered_copper.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/weathered_copper" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/waxed_weathered_copper_bulb.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/waxed_weathered_copper_bulb.json new file mode 100644 index 000000000..5866e1d36 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/waxed_weathered_copper_bulb.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/weathered_copper_bulb" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/waxed_weathered_copper_door.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/waxed_weathered_copper_door.json new file mode 100644 index 000000000..4ec7f82f3 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/waxed_weathered_copper_door.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/weathered_copper_door" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/waxed_weathered_copper_grate.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/waxed_weathered_copper_grate.json new file mode 100644 index 000000000..c23ee2247 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/waxed_weathered_copper_grate.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/weathered_copper_grate" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/waxed_weathered_copper_trapdoor.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/waxed_weathered_copper_trapdoor.json new file mode 100644 index 000000000..d09a144f2 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/waxed_weathered_copper_trapdoor.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/weathered_copper_trapdoor_bottom" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/waxed_weathered_cut_copper.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/waxed_weathered_cut_copper.json new file mode 100644 index 000000000..15a90ec84 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/waxed_weathered_cut_copper.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/weathered_cut_copper" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/waxed_weathered_cut_copper_slab.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/waxed_weathered_cut_copper_slab.json new file mode 100644 index 000000000..0084def1c --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/waxed_weathered_cut_copper_slab.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/weathered_cut_copper_slab" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/waxed_weathered_cut_copper_stairs.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/waxed_weathered_cut_copper_stairs.json new file mode 100644 index 000000000..2050ef4d6 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/waxed_weathered_cut_copper_stairs.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/weathered_cut_copper_stairs" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/wayfinder_armor_trim_smithing_template.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/wayfinder_armor_trim_smithing_template.json new file mode 100644 index 000000000..cd3ba959e --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/wayfinder_armor_trim_smithing_template.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/wayfinder_armor_trim_smithing_template" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/weathered_chiseled_copper.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/weathered_chiseled_copper.json new file mode 100644 index 000000000..f046852be --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/weathered_chiseled_copper.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/weathered_chiseled_copper" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/weathered_copper.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/weathered_copper.json new file mode 100644 index 000000000..75710bc9f --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/weathered_copper.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/weathered_copper" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/weathered_copper_bulb.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/weathered_copper_bulb.json new file mode 100644 index 000000000..5866e1d36 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/weathered_copper_bulb.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/weathered_copper_bulb" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/weathered_copper_door.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/weathered_copper_door.json new file mode 100644 index 000000000..4ec7f82f3 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/weathered_copper_door.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/weathered_copper_door" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/weathered_copper_grate.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/weathered_copper_grate.json new file mode 100644 index 000000000..c23ee2247 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/weathered_copper_grate.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/weathered_copper_grate" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/weathered_copper_trapdoor.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/weathered_copper_trapdoor.json new file mode 100644 index 000000000..d09a144f2 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/weathered_copper_trapdoor.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/weathered_copper_trapdoor_bottom" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/weathered_cut_copper.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/weathered_cut_copper.json new file mode 100644 index 000000000..15a90ec84 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/weathered_cut_copper.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/weathered_cut_copper" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/weathered_cut_copper_slab.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/weathered_cut_copper_slab.json new file mode 100644 index 000000000..0084def1c --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/weathered_cut_copper_slab.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/weathered_cut_copper_slab" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/weathered_cut_copper_stairs.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/weathered_cut_copper_stairs.json new file mode 100644 index 000000000..2050ef4d6 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/weathered_cut_copper_stairs.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/weathered_cut_copper_stairs" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/weeping_vines.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/weeping_vines.json new file mode 100644 index 000000000..3f169a7a3 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/weeping_vines.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/weeping_vines" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/wet_sponge.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/wet_sponge.json new file mode 100644 index 000000000..7e33cdd24 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/wet_sponge.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/wet_sponge" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/wheat.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/wheat.json new file mode 100644 index 000000000..f4fb4b7b3 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/wheat.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/wheat" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/wheat_seeds.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/wheat_seeds.json new file mode 100644 index 000000000..8ae464744 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/wheat_seeds.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/wheat_seeds" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/white_banner.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/white_banner.json new file mode 100644 index 000000000..f87b23e99 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/white_banner.json @@ -0,0 +1,10 @@ +{ + "model": { + "type": "minecraft:special", + "base": "minecraft:item/template_banner", + "model": { + "type": "minecraft:banner", + "color": "white" + } + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/white_bed.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/white_bed.json new file mode 100644 index 000000000..7e3aa0062 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/white_bed.json @@ -0,0 +1,10 @@ +{ + "model": { + "type": "minecraft:special", + "base": "minecraft:item/white_bed", + "model": { + "type": "minecraft:bed", + "texture": "minecraft:white" + } + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/white_bundle.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/white_bundle.json new file mode 100644 index 000000000..05c547aff --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/white_bundle.json @@ -0,0 +1,39 @@ +{ + "model": { + "type": "minecraft:select", + "cases": [ + { + "model": { + "type": "minecraft:condition", + "on_false": { + "type": "minecraft:model", + "model": "minecraft:item/white_bundle" + }, + "on_true": { + "type": "minecraft:composite", + "models": [ + { + "type": "minecraft:model", + "model": "minecraft:item/white_bundle_open_back" + }, + { + "type": "minecraft:bundle/selected_item" + }, + { + "type": "minecraft:model", + "model": "minecraft:item/white_bundle_open_front" + } + ] + }, + "property": "minecraft:bundle/has_selected_item" + }, + "when": "gui" + } + ], + "fallback": { + "type": "minecraft:model", + "model": "minecraft:item/white_bundle" + }, + "property": "minecraft:display_context" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/white_candle.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/white_candle.json new file mode 100644 index 000000000..6d60a581e --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/white_candle.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/white_candle" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/white_carpet.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/white_carpet.json new file mode 100644 index 000000000..d56e7f94a --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/white_carpet.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/white_carpet" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/white_concrete.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/white_concrete.json new file mode 100644 index 000000000..822c0565d --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/white_concrete.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/white_concrete" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/white_concrete_powder.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/white_concrete_powder.json new file mode 100644 index 000000000..56e5f7630 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/white_concrete_powder.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/white_concrete_powder" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/white_dye.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/white_dye.json new file mode 100644 index 000000000..2684014af --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/white_dye.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/white_dye" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/white_glazed_terracotta.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/white_glazed_terracotta.json new file mode 100644 index 000000000..5cb0220c5 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/white_glazed_terracotta.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/white_glazed_terracotta" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/white_shulker_box.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/white_shulker_box.json new file mode 100644 index 000000000..3e4d8e80b --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/white_shulker_box.json @@ -0,0 +1,10 @@ +{ + "model": { + "type": "minecraft:special", + "base": "minecraft:item/white_shulker_box", + "model": { + "type": "minecraft:shulker_box", + "texture": "minecraft:shulker_white" + } + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/white_stained_glass.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/white_stained_glass.json new file mode 100644 index 000000000..ae78ae28a --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/white_stained_glass.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/white_stained_glass" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/white_stained_glass_pane.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/white_stained_glass_pane.json new file mode 100644 index 000000000..72f6e6064 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/white_stained_glass_pane.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/white_stained_glass_pane" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/white_terracotta.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/white_terracotta.json new file mode 100644 index 000000000..af76a0785 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/white_terracotta.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/white_terracotta" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/white_tulip.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/white_tulip.json new file mode 100644 index 000000000..d56307a2b --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/white_tulip.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/white_tulip" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/white_wool.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/white_wool.json new file mode 100644 index 000000000..709d4843b --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/white_wool.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/white_wool" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/wild_armor_trim_smithing_template.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/wild_armor_trim_smithing_template.json new file mode 100644 index 000000000..37b2bf40c --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/wild_armor_trim_smithing_template.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/wild_armor_trim_smithing_template" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/wind_charge.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/wind_charge.json new file mode 100644 index 000000000..b9f3a0631 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/wind_charge.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/wind_charge" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/witch_spawn_egg.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/witch_spawn_egg.json new file mode 100644 index 000000000..cf62f2ba7 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/witch_spawn_egg.json @@ -0,0 +1,16 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/template_spawn_egg", + "tints": [ + { + "type": "minecraft:constant", + "value": -13369344 + }, + { + "type": "minecraft:constant", + "value": -11427778 + } + ] + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/wither_rose.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/wither_rose.json new file mode 100644 index 000000000..558c37f75 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/wither_rose.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/wither_rose" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/wither_skeleton_skull.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/wither_skeleton_skull.json new file mode 100644 index 000000000..67302cdab --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/wither_skeleton_skull.json @@ -0,0 +1,10 @@ +{ + "model": { + "type": "minecraft:special", + "base": "minecraft:item/template_skull", + "model": { + "type": "minecraft:head", + "kind": "wither_skeleton" + } + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/wither_skeleton_spawn_egg.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/wither_skeleton_spawn_egg.json new file mode 100644 index 000000000..b59dd39d7 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/wither_skeleton_spawn_egg.json @@ -0,0 +1,16 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/template_spawn_egg", + "tints": [ + { + "type": "minecraft:constant", + "value": -15461356 + }, + { + "type": "minecraft:constant", + "value": -12104371 + } + ] + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/wither_spawn_egg.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/wither_spawn_egg.json new file mode 100644 index 000000000..c4081fb5d --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/wither_spawn_egg.json @@ -0,0 +1,16 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/template_spawn_egg", + "tints": [ + { + "type": "minecraft:constant", + "value": -15461356 + }, + { + "type": "minecraft:constant", + "value": -11701600 + } + ] + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/wolf_armor.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/wolf_armor.json new file mode 100644 index 000000000..443cc9533 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/wolf_armor.json @@ -0,0 +1,25 @@ +{ + "model": { + "type": "minecraft:condition", + "component": "minecraft:dyed_color", + "on_false": { + "type": "minecraft:model", + "model": "minecraft:item/wolf_armor" + }, + "on_true": { + "type": "minecraft:model", + "model": "minecraft:item/wolf_armor_dyed", + "tints": [ + { + "type": "minecraft:constant", + "value": -1 + }, + { + "type": "minecraft:dye", + "default": 0 + } + ] + }, + "property": "minecraft:has_component" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/wolf_spawn_egg.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/wolf_spawn_egg.json new file mode 100644 index 000000000..665280786 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/wolf_spawn_egg.json @@ -0,0 +1,16 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/template_spawn_egg", + "tints": [ + { + "type": "minecraft:constant", + "value": -2632749 + }, + { + "type": "minecraft:constant", + "value": -3231850 + } + ] + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/wooden_axe.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/wooden_axe.json new file mode 100644 index 000000000..1794004d2 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/wooden_axe.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/wooden_axe" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/wooden_hoe.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/wooden_hoe.json new file mode 100644 index 000000000..33fa0070a --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/wooden_hoe.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/wooden_hoe" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/wooden_pickaxe.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/wooden_pickaxe.json new file mode 100644 index 000000000..353c33e08 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/wooden_pickaxe.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/wooden_pickaxe" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/wooden_shovel.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/wooden_shovel.json new file mode 100644 index 000000000..5fbb6c685 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/wooden_shovel.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/wooden_shovel" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/wooden_sword.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/wooden_sword.json new file mode 100644 index 000000000..aacc2b943 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/wooden_sword.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/wooden_sword" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/writable_book.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/writable_book.json new file mode 100644 index 000000000..6cea1bd9e --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/writable_book.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/writable_book" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/written_book.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/written_book.json new file mode 100644 index 000000000..e49699a35 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/written_book.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/written_book" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/yellow_banner.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/yellow_banner.json new file mode 100644 index 000000000..1acffce44 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/yellow_banner.json @@ -0,0 +1,10 @@ +{ + "model": { + "type": "minecraft:special", + "base": "minecraft:item/template_banner", + "model": { + "type": "minecraft:banner", + "color": "yellow" + } + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/yellow_bed.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/yellow_bed.json new file mode 100644 index 000000000..184bfe999 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/yellow_bed.json @@ -0,0 +1,10 @@ +{ + "model": { + "type": "minecraft:special", + "base": "minecraft:item/yellow_bed", + "model": { + "type": "minecraft:bed", + "texture": "minecraft:yellow" + } + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/yellow_bundle.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/yellow_bundle.json new file mode 100644 index 000000000..d37eca641 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/yellow_bundle.json @@ -0,0 +1,39 @@ +{ + "model": { + "type": "minecraft:select", + "cases": [ + { + "model": { + "type": "minecraft:condition", + "on_false": { + "type": "minecraft:model", + "model": "minecraft:item/yellow_bundle" + }, + "on_true": { + "type": "minecraft:composite", + "models": [ + { + "type": "minecraft:model", + "model": "minecraft:item/yellow_bundle_open_back" + }, + { + "type": "minecraft:bundle/selected_item" + }, + { + "type": "minecraft:model", + "model": "minecraft:item/yellow_bundle_open_front" + } + ] + }, + "property": "minecraft:bundle/has_selected_item" + }, + "when": "gui" + } + ], + "fallback": { + "type": "minecraft:model", + "model": "minecraft:item/yellow_bundle" + }, + "property": "minecraft:display_context" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/yellow_candle.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/yellow_candle.json new file mode 100644 index 000000000..5ed2d61e5 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/yellow_candle.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/yellow_candle" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/yellow_carpet.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/yellow_carpet.json new file mode 100644 index 000000000..2f270df8e --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/yellow_carpet.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/yellow_carpet" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/yellow_concrete.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/yellow_concrete.json new file mode 100644 index 000000000..c55b15f19 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/yellow_concrete.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/yellow_concrete" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/yellow_concrete_powder.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/yellow_concrete_powder.json new file mode 100644 index 000000000..839a491d5 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/yellow_concrete_powder.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/yellow_concrete_powder" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/yellow_dye.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/yellow_dye.json new file mode 100644 index 000000000..a56a986b7 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/yellow_dye.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/yellow_dye" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/yellow_glazed_terracotta.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/yellow_glazed_terracotta.json new file mode 100644 index 000000000..3da8eb40d --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/yellow_glazed_terracotta.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/yellow_glazed_terracotta" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/yellow_shulker_box.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/yellow_shulker_box.json new file mode 100644 index 000000000..bd78cb729 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/yellow_shulker_box.json @@ -0,0 +1,10 @@ +{ + "model": { + "type": "minecraft:special", + "base": "minecraft:item/yellow_shulker_box", + "model": { + "type": "minecraft:shulker_box", + "texture": "minecraft:shulker_yellow" + } + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/yellow_stained_glass.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/yellow_stained_glass.json new file mode 100644 index 000000000..e4f6432a6 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/yellow_stained_glass.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/yellow_stained_glass" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/yellow_stained_glass_pane.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/yellow_stained_glass_pane.json new file mode 100644 index 000000000..bf3c03375 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/yellow_stained_glass_pane.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/yellow_stained_glass_pane" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/yellow_terracotta.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/yellow_terracotta.json new file mode 100644 index 000000000..411c0705a --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/yellow_terracotta.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/yellow_terracotta" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/yellow_wool.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/yellow_wool.json new file mode 100644 index 000000000..7e1fa9539 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/yellow_wool.json @@ -0,0 +1,6 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:block/yellow_wool" + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/zoglin_spawn_egg.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/zoglin_spawn_egg.json new file mode 100644 index 000000000..2c7633288 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/zoglin_spawn_egg.json @@ -0,0 +1,16 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/template_spawn_egg", + "tints": [ + { + "type": "minecraft:constant", + "value": -3772843 + }, + { + "type": "minecraft:constant", + "value": -1644826 + } + ] + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/zombie_head.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/zombie_head.json new file mode 100644 index 000000000..f30d13bb8 --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/zombie_head.json @@ -0,0 +1,10 @@ +{ + "model": { + "type": "minecraft:special", + "base": "minecraft:item/template_skull", + "model": { + "type": "minecraft:head", + "kind": "zombie" + } + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/zombie_horse_spawn_egg.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/zombie_horse_spawn_egg.json new file mode 100644 index 000000000..142a150eb --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/zombie_horse_spawn_egg.json @@ -0,0 +1,16 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/template_spawn_egg", + "tints": [ + { + "type": "minecraft:constant", + "value": -13544908 + }, + { + "type": "minecraft:constant", + "value": -6831484 + } + ] + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/zombie_spawn_egg.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/zombie_spawn_egg.json new file mode 100644 index 000000000..eb8b35cbd --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/zombie_spawn_egg.json @@ -0,0 +1,16 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/template_spawn_egg", + "tints": [ + { + "type": "minecraft:constant", + "value": -16732241 + }, + { + "type": "minecraft:constant", + "value": -8807323 + } + ] + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/zombie_villager_spawn_egg.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/zombie_villager_spawn_egg.json new file mode 100644 index 000000000..f351c001f --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/zombie_villager_spawn_egg.json @@ -0,0 +1,16 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/template_spawn_egg", + "tints": [ + { + "type": "minecraft:constant", + "value": -11125709 + }, + { + "type": "minecraft:constant", + "value": -8807323 + } + ] + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/zombified_piglin_spawn_egg.json b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/zombified_piglin_spawn_egg.json new file mode 100644 index 000000000..9be3d478a --- /dev/null +++ b/bukkit-loader/src/main/resources/internal/templates_1_21_4/minecraft/items/zombified_piglin_spawn_egg.json @@ -0,0 +1,16 @@ +{ + "model": { + "type": "minecraft:model", + "model": "minecraft:item/template_spawn_egg", + "tints": [ + { + "type": "minecraft:constant", + "value": -1404013 + }, + { + "type": "minecraft:constant", + "value": -11767511 + } + ] + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/mappings.yml b/bukkit-loader/src/main/resources/mappings.yml new file mode 100644 index 000000000..fc43ff532 --- /dev/null +++ b/bukkit-loader/src/main/resources/mappings.yml @@ -0,0 +1,2029 @@ +######################################################################################################################################################################################################################## +# Sapling Block +minecraft:oak_sapling[stage=1]: minecraft:oak_sapling[stage=0] +minecraft:birch_sapling[stage=1]: minecraft:birch_sapling[stage=0] +minecraft:spruce_sapling[stage=1]: minecraft:spruce_sapling[stage=0] +minecraft:jungle_sapling[stage=1]: minecraft:jungle_sapling[stage=0] +minecraft:dark_oak_sapling[stage=1]: minecraft:dark_oak_sapling[stage=0] +minecraft:acacia_sapling[stage=1]: minecraft:acacia_sapling[stage=0] +minecraft:cherry_sapling[stage=1]: minecraft:cherry_sapling[stage=0] +######################################################################################################################################################################################################################## +# Mushroom Block +#minecraft:mushroom_stem[down=true,east=true,north=true,south=true,up=true,west=true]: minecraft:mushroom_stem[down=true,east=true,north=true,south=true,up=true,west=true]# +minecraft:mushroom_stem[down=false,east=false,north=false,south=false,up=false,west=false]: minecraft:mushroom_stem[down=true,east=true,north=true,south=true,up=true,west=true] +minecraft:mushroom_stem[down=true,east=false,north=false,south=false,up=false,west=false]: minecraft:mushroom_stem[down=true,east=true,north=true,south=true,up=true,west=true] +minecraft:mushroom_stem[down=false,east=true,north=false,south=false,up=false,west=false]: minecraft:mushroom_stem[down=true,east=true,north=true,south=true,up=true,west=true] +minecraft:mushroom_stem[down=true,east=true,north=false,south=false,up=false,west=false]: minecraft:mushroom_stem[down=true,east=true,north=true,south=true,up=true,west=true] +minecraft:mushroom_stem[down=false,east=false,north=true,south=false,up=false,west=false]: minecraft:mushroom_stem[down=true,east=true,north=true,south=true,up=true,west=true] +minecraft:mushroom_stem[down=true,east=false,north=true,south=false,up=false,west=false]: minecraft:mushroom_stem[down=true,east=true,north=true,south=true,up=true,west=true] +minecraft:mushroom_stem[down=false,east=true,north=true,south=false,up=false,west=false]: minecraft:mushroom_stem[down=true,east=true,north=true,south=true,up=true,west=true] +minecraft:mushroom_stem[down=true,east=true,north=true,south=false,up=false,west=false]: minecraft:mushroom_stem[down=true,east=true,north=true,south=true,up=true,west=true] +minecraft:mushroom_stem[down=false,east=false,north=false,south=true,up=false,west=false]: minecraft:mushroom_stem[down=true,east=true,north=true,south=true,up=true,west=true] +minecraft:mushroom_stem[down=true,east=false,north=false,south=true,up=false,west=false]: minecraft:mushroom_stem[down=true,east=true,north=true,south=true,up=true,west=true] +minecraft:mushroom_stem[down=false,east=true,north=false,south=true,up=false,west=false]: minecraft:mushroom_stem[down=true,east=true,north=true,south=true,up=true,west=true] +minecraft:mushroom_stem[down=true,east=true,north=false,south=true,up=false,west=false]: minecraft:mushroom_stem[down=true,east=true,north=true,south=true,up=true,west=true] +minecraft:mushroom_stem[down=false,east=false,north=true,south=true,up=false,west=false]: minecraft:mushroom_stem[down=true,east=true,north=true,south=true,up=true,west=true] +minecraft:mushroom_stem[down=true,east=false,north=true,south=true,up=false,west=false]: minecraft:mushroom_stem[down=true,east=true,north=true,south=true,up=true,west=true] +minecraft:mushroom_stem[down=false,east=true,north=true,south=true,up=false,west=false]: minecraft:mushroom_stem[down=true,east=true,north=true,south=true,up=true,west=true] +minecraft:mushroom_stem[down=true,east=true,north=true,south=true,up=false,west=false]: minecraft:mushroom_stem[down=true,east=true,north=true,south=true,up=true,west=true] +minecraft:mushroom_stem[down=false,east=false,north=false,south=false,up=true,west=false]: minecraft:mushroom_stem[down=true,east=true,north=true,south=true,up=true,west=true] +minecraft:mushroom_stem[down=true,east=false,north=false,south=false,up=true,west=false]: minecraft:mushroom_stem[down=true,east=true,north=true,south=true,up=true,west=true] +minecraft:mushroom_stem[down=false,east=true,north=false,south=false,up=true,west=false]: minecraft:mushroom_stem[down=true,east=true,north=true,south=true,up=true,west=true] +minecraft:mushroom_stem[down=true,east=true,north=false,south=false,up=true,west=false]: minecraft:mushroom_stem[down=true,east=true,north=true,south=true,up=true,west=true] +minecraft:mushroom_stem[down=false,east=false,north=true,south=false,up=true,west=false]: minecraft:mushroom_stem[down=true,east=true,north=true,south=true,up=true,west=true] +minecraft:mushroom_stem[down=true,east=false,north=true,south=false,up=true,west=false]: minecraft:mushroom_stem[down=true,east=true,north=true,south=true,up=true,west=true] +minecraft:mushroom_stem[down=false,east=true,north=true,south=false,up=true,west=false]: minecraft:mushroom_stem[down=true,east=true,north=true,south=true,up=true,west=true] +minecraft:mushroom_stem[down=true,east=true,north=true,south=false,up=true,west=false]: minecraft:mushroom_stem[down=true,east=true,north=true,south=true,up=true,west=true] +minecraft:mushroom_stem[down=false,east=false,north=false,south=true,up=true,west=false]: minecraft:mushroom_stem[down=true,east=true,north=true,south=true,up=true,west=true] +minecraft:mushroom_stem[down=true,east=false,north=false,south=true,up=true,west=false]: minecraft:mushroom_stem[down=true,east=true,north=true,south=true,up=true,west=true] +minecraft:mushroom_stem[down=false,east=true,north=false,south=true,up=true,west=false]: minecraft:mushroom_stem[down=true,east=true,north=true,south=true,up=true,west=true] +minecraft:mushroom_stem[down=true,east=true,north=false,south=true,up=true,west=false]: minecraft:mushroom_stem[down=true,east=true,north=true,south=true,up=true,west=true] +minecraft:mushroom_stem[down=false,east=false,north=true,south=true,up=true,west=false]: minecraft:mushroom_stem[down=true,east=true,north=true,south=true,up=true,west=true] +minecraft:mushroom_stem[down=true,east=false,north=true,south=true,up=true,west=false]: minecraft:mushroom_stem[down=true,east=true,north=true,south=true,up=true,west=true] +minecraft:mushroom_stem[down=false,east=true,north=true,south=true,up=true,west=false]: minecraft:mushroom_stem[down=true,east=true,north=true,south=true,up=true,west=true] +minecraft:mushroom_stem[down=true,east=true,north=true,south=true,up=true,west=false]: minecraft:mushroom_stem[down=true,east=true,north=true,south=true,up=true,west=true] +minecraft:mushroom_stem[down=false,east=false,north=false,south=false,up=false,west=true]: minecraft:mushroom_stem[down=true,east=true,north=true,south=true,up=true,west=true] +minecraft:mushroom_stem[down=true,east=false,north=false,south=false,up=false,west=true]: minecraft:mushroom_stem[down=true,east=true,north=true,south=true,up=true,west=true] +minecraft:mushroom_stem[down=false,east=true,north=false,south=false,up=false,west=true]: minecraft:mushroom_stem[down=true,east=true,north=true,south=true,up=true,west=true] +minecraft:mushroom_stem[down=true,east=true,north=false,south=false,up=false,west=true]: minecraft:mushroom_stem[down=true,east=true,north=true,south=true,up=true,west=true] +minecraft:mushroom_stem[down=false,east=false,north=true,south=false,up=false,west=true]: minecraft:mushroom_stem[down=true,east=true,north=true,south=true,up=true,west=true] +minecraft:mushroom_stem[down=true,east=false,north=true,south=false,up=false,west=true]: minecraft:mushroom_stem[down=true,east=true,north=true,south=true,up=true,west=true] +minecraft:mushroom_stem[down=false,east=true,north=true,south=false,up=false,west=true]: minecraft:mushroom_stem[down=true,east=true,north=true,south=true,up=true,west=true] +minecraft:mushroom_stem[down=true,east=true,north=true,south=false,up=false,west=true]: minecraft:mushroom_stem[down=true,east=true,north=true,south=true,up=true,west=true] +minecraft:mushroom_stem[down=false,east=false,north=false,south=true,up=false,west=true]: minecraft:mushroom_stem[down=true,east=true,north=true,south=true,up=true,west=true] +minecraft:mushroom_stem[down=true,east=false,north=false,south=true,up=false,west=true]: minecraft:mushroom_stem[down=true,east=true,north=true,south=true,up=true,west=true] +minecraft:mushroom_stem[down=false,east=true,north=false,south=true,up=false,west=true]: minecraft:mushroom_stem[down=true,east=true,north=true,south=true,up=true,west=true] +minecraft:mushroom_stem[down=true,east=true,north=false,south=true,up=false,west=true]: minecraft:mushroom_stem[down=true,east=true,north=true,south=true,up=true,west=true] +minecraft:mushroom_stem[down=false,east=false,north=true,south=true,up=false,west=true]: minecraft:mushroom_stem[down=true,east=true,north=true,south=true,up=true,west=true] +minecraft:mushroom_stem[down=true,east=false,north=true,south=true,up=false,west=true]: minecraft:mushroom_stem[down=true,east=true,north=true,south=true,up=true,west=true] +minecraft:mushroom_stem[down=false,east=true,north=true,south=true,up=false,west=true]: minecraft:mushroom_stem[down=true,east=true,north=true,south=true,up=true,west=true] +minecraft:mushroom_stem[down=true,east=true,north=true,south=true,up=false,west=true]: minecraft:mushroom_stem[down=true,east=true,north=true,south=true,up=true,west=true] +minecraft:mushroom_stem[down=false,east=false,north=false,south=false,up=true,west=true]: minecraft:mushroom_stem[down=true,east=true,north=true,south=true,up=true,west=true] +minecraft:mushroom_stem[down=true,east=false,north=false,south=false,up=true,west=true]: minecraft:mushroom_stem[down=true,east=true,north=true,south=true,up=true,west=true] +minecraft:mushroom_stem[down=false,east=true,north=false,south=false,up=true,west=true]: minecraft:mushroom_stem[down=true,east=true,north=true,south=true,up=true,west=true] +minecraft:mushroom_stem[down=true,east=true,north=false,south=false,up=true,west=true]: minecraft:mushroom_stem[down=true,east=true,north=true,south=true,up=true,west=true] +minecraft:mushroom_stem[down=false,east=false,north=true,south=false,up=true,west=true]: minecraft:mushroom_stem[down=true,east=true,north=true,south=true,up=true,west=true] +minecraft:mushroom_stem[down=true,east=false,north=true,south=false,up=true,west=true]: minecraft:mushroom_stem[down=true,east=true,north=true,south=true,up=true,west=true] +minecraft:mushroom_stem[down=false,east=true,north=true,south=false,up=true,west=true]: minecraft:mushroom_stem[down=true,east=true,north=true,south=true,up=true,west=true] +minecraft:mushroom_stem[down=true,east=true,north=true,south=false,up=true,west=true]: minecraft:mushroom_stem[down=true,east=true,north=true,south=true,up=true,west=true] +minecraft:mushroom_stem[down=false,east=false,north=false,south=true,up=true,west=true]: minecraft:mushroom_stem[down=true,east=true,north=true,south=true,up=true,west=true] +minecraft:mushroom_stem[down=true,east=false,north=false,south=true,up=true,west=true]: minecraft:mushroom_stem[down=true,east=true,north=true,south=true,up=true,west=true] +minecraft:mushroom_stem[down=false,east=true,north=false,south=true,up=true,west=true]: minecraft:mushroom_stem[down=true,east=true,north=true,south=true,up=true,west=true] +minecraft:mushroom_stem[down=true,east=true,north=false,south=true,up=true,west=true]: minecraft:mushroom_stem[down=true,east=true,north=true,south=true,up=true,west=true] +minecraft:mushroom_stem[down=false,east=false,north=true,south=true,up=true,west=true]: minecraft:mushroom_stem[down=true,east=true,north=true,south=true,up=true,west=true] +minecraft:mushroom_stem[down=true,east=false,north=true,south=true,up=true,west=true]: minecraft:mushroom_stem[down=true,east=true,north=true,south=true,up=true,west=true] +minecraft:mushroom_stem[down=false,east=true,north=true,south=true,up=true,west=true]: minecraft:mushroom_stem[down=true,east=true,north=true,south=true,up=true,west=true] +#minecraft:brown_mushroom_block[down=true,east=true,north=true,south=true,up=true,west=true]: minecraft:brown_mushroom_block[down=true,east=true,north=true,south=true,up=true,west=true]# +minecraft:brown_mushroom_block[down=false,east=false,north=false,south=false,up=false,west=false]: minecraft:brown_mushroom_block[down=true,east=true,north=true,south=true,up=true,west=true] +minecraft:brown_mushroom_block[down=true,east=false,north=false,south=false,up=false,west=false]: minecraft:brown_mushroom_block[down=true,east=true,north=true,south=true,up=true,west=true] +minecraft:brown_mushroom_block[down=false,east=true,north=false,south=false,up=false,west=false]: minecraft:brown_mushroom_block[down=true,east=true,north=true,south=true,up=true,west=true] +minecraft:brown_mushroom_block[down=true,east=true,north=false,south=false,up=false,west=false]: minecraft:brown_mushroom_block[down=true,east=true,north=true,south=true,up=true,west=true] +minecraft:brown_mushroom_block[down=false,east=false,north=true,south=false,up=false,west=false]: minecraft:brown_mushroom_block[down=true,east=true,north=true,south=true,up=true,west=true] +minecraft:brown_mushroom_block[down=true,east=false,north=true,south=false,up=false,west=false]: minecraft:brown_mushroom_block[down=true,east=true,north=true,south=true,up=true,west=true] +minecraft:brown_mushroom_block[down=false,east=true,north=true,south=false,up=false,west=false]: minecraft:brown_mushroom_block[down=true,east=true,north=true,south=true,up=true,west=true] +minecraft:brown_mushroom_block[down=true,east=true,north=true,south=false,up=false,west=false]: minecraft:brown_mushroom_block[down=true,east=true,north=true,south=true,up=true,west=true] +minecraft:brown_mushroom_block[down=false,east=false,north=false,south=true,up=false,west=false]: minecraft:brown_mushroom_block[down=true,east=true,north=true,south=true,up=true,west=true] +minecraft:brown_mushroom_block[down=true,east=false,north=false,south=true,up=false,west=false]: minecraft:brown_mushroom_block[down=true,east=true,north=true,south=true,up=true,west=true] +minecraft:brown_mushroom_block[down=false,east=true,north=false,south=true,up=false,west=false]: minecraft:brown_mushroom_block[down=true,east=true,north=true,south=true,up=true,west=true] +minecraft:brown_mushroom_block[down=true,east=true,north=false,south=true,up=false,west=false]: minecraft:brown_mushroom_block[down=true,east=true,north=true,south=true,up=true,west=true] +minecraft:brown_mushroom_block[down=false,east=false,north=true,south=true,up=false,west=false]: minecraft:brown_mushroom_block[down=true,east=true,north=true,south=true,up=true,west=true] +minecraft:brown_mushroom_block[down=true,east=false,north=true,south=true,up=false,west=false]: minecraft:brown_mushroom_block[down=true,east=true,north=true,south=true,up=true,west=true] +minecraft:brown_mushroom_block[down=false,east=true,north=true,south=true,up=false,west=false]: minecraft:brown_mushroom_block[down=true,east=true,north=true,south=true,up=true,west=true] +minecraft:brown_mushroom_block[down=true,east=true,north=true,south=true,up=false,west=false]: minecraft:brown_mushroom_block[down=true,east=true,north=true,south=true,up=true,west=true] +minecraft:brown_mushroom_block[down=false,east=false,north=false,south=false,up=true,west=false]: minecraft:brown_mushroom_block[down=true,east=true,north=true,south=true,up=true,west=true] +minecraft:brown_mushroom_block[down=true,east=false,north=false,south=false,up=true,west=false]: minecraft:brown_mushroom_block[down=true,east=true,north=true,south=true,up=true,west=true] +minecraft:brown_mushroom_block[down=false,east=true,north=false,south=false,up=true,west=false]: minecraft:brown_mushroom_block[down=true,east=true,north=true,south=true,up=true,west=true] +minecraft:brown_mushroom_block[down=true,east=true,north=false,south=false,up=true,west=false]: minecraft:brown_mushroom_block[down=true,east=true,north=true,south=true,up=true,west=true] +minecraft:brown_mushroom_block[down=false,east=false,north=true,south=false,up=true,west=false]: minecraft:brown_mushroom_block[down=true,east=true,north=true,south=true,up=true,west=true] +minecraft:brown_mushroom_block[down=true,east=false,north=true,south=false,up=true,west=false]: minecraft:brown_mushroom_block[down=true,east=true,north=true,south=true,up=true,west=true] +minecraft:brown_mushroom_block[down=false,east=true,north=true,south=false,up=true,west=false]: minecraft:brown_mushroom_block[down=true,east=true,north=true,south=true,up=true,west=true] +minecraft:brown_mushroom_block[down=true,east=true,north=true,south=false,up=true,west=false]: minecraft:brown_mushroom_block[down=true,east=true,north=true,south=true,up=true,west=true] +minecraft:brown_mushroom_block[down=false,east=false,north=false,south=true,up=true,west=false]: minecraft:brown_mushroom_block[down=true,east=true,north=true,south=true,up=true,west=true] +minecraft:brown_mushroom_block[down=true,east=false,north=false,south=true,up=true,west=false]: minecraft:brown_mushroom_block[down=true,east=true,north=true,south=true,up=true,west=true] +minecraft:brown_mushroom_block[down=false,east=true,north=false,south=true,up=true,west=false]: minecraft:brown_mushroom_block[down=true,east=true,north=true,south=true,up=true,west=true] +minecraft:brown_mushroom_block[down=true,east=true,north=false,south=true,up=true,west=false]: minecraft:brown_mushroom_block[down=true,east=true,north=true,south=true,up=true,west=true] +minecraft:brown_mushroom_block[down=false,east=false,north=true,south=true,up=true,west=false]: minecraft:brown_mushroom_block[down=true,east=true,north=true,south=true,up=true,west=true] +minecraft:brown_mushroom_block[down=true,east=false,north=true,south=true,up=true,west=false]: minecraft:brown_mushroom_block[down=true,east=true,north=true,south=true,up=true,west=true] +minecraft:brown_mushroom_block[down=false,east=true,north=true,south=true,up=true,west=false]: minecraft:brown_mushroom_block[down=true,east=true,north=true,south=true,up=true,west=true] +minecraft:brown_mushroom_block[down=true,east=true,north=true,south=true,up=true,west=false]: minecraft:brown_mushroom_block[down=true,east=true,north=true,south=true,up=true,west=true] +minecraft:brown_mushroom_block[down=false,east=false,north=false,south=false,up=false,west=true]: minecraft:brown_mushroom_block[down=true,east=true,north=true,south=true,up=true,west=true] +minecraft:brown_mushroom_block[down=true,east=false,north=false,south=false,up=false,west=true]: minecraft:brown_mushroom_block[down=true,east=true,north=true,south=true,up=true,west=true] +minecraft:brown_mushroom_block[down=false,east=true,north=false,south=false,up=false,west=true]: minecraft:brown_mushroom_block[down=true,east=true,north=true,south=true,up=true,west=true] +minecraft:brown_mushroom_block[down=true,east=true,north=false,south=false,up=false,west=true]: minecraft:brown_mushroom_block[down=true,east=true,north=true,south=true,up=true,west=true] +minecraft:brown_mushroom_block[down=false,east=false,north=true,south=false,up=false,west=true]: minecraft:brown_mushroom_block[down=true,east=true,north=true,south=true,up=true,west=true] +minecraft:brown_mushroom_block[down=true,east=false,north=true,south=false,up=false,west=true]: minecraft:brown_mushroom_block[down=true,east=true,north=true,south=true,up=true,west=true] +minecraft:brown_mushroom_block[down=false,east=true,north=true,south=false,up=false,west=true]: minecraft:brown_mushroom_block[down=true,east=true,north=true,south=true,up=true,west=true] +minecraft:brown_mushroom_block[down=true,east=true,north=true,south=false,up=false,west=true]: minecraft:brown_mushroom_block[down=true,east=true,north=true,south=true,up=true,west=true] +minecraft:brown_mushroom_block[down=false,east=false,north=false,south=true,up=false,west=true]: minecraft:brown_mushroom_block[down=true,east=true,north=true,south=true,up=true,west=true] +minecraft:brown_mushroom_block[down=true,east=false,north=false,south=true,up=false,west=true]: minecraft:brown_mushroom_block[down=true,east=true,north=true,south=true,up=true,west=true] +minecraft:brown_mushroom_block[down=false,east=true,north=false,south=true,up=false,west=true]: minecraft:brown_mushroom_block[down=true,east=true,north=true,south=true,up=true,west=true] +minecraft:brown_mushroom_block[down=true,east=true,north=false,south=true,up=false,west=true]: minecraft:brown_mushroom_block[down=true,east=true,north=true,south=true,up=true,west=true] +minecraft:brown_mushroom_block[down=false,east=false,north=true,south=true,up=false,west=true]: minecraft:brown_mushroom_block[down=true,east=true,north=true,south=true,up=true,west=true] +minecraft:brown_mushroom_block[down=true,east=false,north=true,south=true,up=false,west=true]: minecraft:brown_mushroom_block[down=true,east=true,north=true,south=true,up=true,west=true] +minecraft:brown_mushroom_block[down=false,east=true,north=true,south=true,up=false,west=true]: minecraft:brown_mushroom_block[down=true,east=true,north=true,south=true,up=true,west=true] +minecraft:brown_mushroom_block[down=true,east=true,north=true,south=true,up=false,west=true]: minecraft:brown_mushroom_block[down=true,east=true,north=true,south=true,up=true,west=true] +minecraft:brown_mushroom_block[down=false,east=false,north=false,south=false,up=true,west=true]: minecraft:brown_mushroom_block[down=true,east=true,north=true,south=true,up=true,west=true] +minecraft:brown_mushroom_block[down=true,east=false,north=false,south=false,up=true,west=true]: minecraft:brown_mushroom_block[down=true,east=true,north=true,south=true,up=true,west=true] +minecraft:brown_mushroom_block[down=false,east=true,north=false,south=false,up=true,west=true]: minecraft:brown_mushroom_block[down=true,east=true,north=true,south=true,up=true,west=true] +minecraft:brown_mushroom_block[down=true,east=true,north=false,south=false,up=true,west=true]: minecraft:brown_mushroom_block[down=true,east=true,north=true,south=true,up=true,west=true] +minecraft:brown_mushroom_block[down=false,east=false,north=true,south=false,up=true,west=true]: minecraft:brown_mushroom_block[down=true,east=true,north=true,south=true,up=true,west=true] +minecraft:brown_mushroom_block[down=true,east=false,north=true,south=false,up=true,west=true]: minecraft:brown_mushroom_block[down=true,east=true,north=true,south=true,up=true,west=true] +minecraft:brown_mushroom_block[down=false,east=true,north=true,south=false,up=true,west=true]: minecraft:brown_mushroom_block[down=true,east=true,north=true,south=true,up=true,west=true] +minecraft:brown_mushroom_block[down=true,east=true,north=true,south=false,up=true,west=true]: minecraft:brown_mushroom_block[down=true,east=true,north=true,south=true,up=true,west=true] +minecraft:brown_mushroom_block[down=false,east=false,north=false,south=true,up=true,west=true]: minecraft:brown_mushroom_block[down=true,east=true,north=true,south=true,up=true,west=true] +minecraft:brown_mushroom_block[down=true,east=false,north=false,south=true,up=true,west=true]: minecraft:brown_mushroom_block[down=true,east=true,north=true,south=true,up=true,west=true] +minecraft:brown_mushroom_block[down=false,east=true,north=false,south=true,up=true,west=true]: minecraft:brown_mushroom_block[down=true,east=true,north=true,south=true,up=true,west=true] +minecraft:brown_mushroom_block[down=true,east=true,north=false,south=true,up=true,west=true]: minecraft:brown_mushroom_block[down=true,east=true,north=true,south=true,up=true,west=true] +minecraft:brown_mushroom_block[down=false,east=false,north=true,south=true,up=true,west=true]: minecraft:brown_mushroom_block[down=true,east=true,north=true,south=true,up=true,west=true] +minecraft:brown_mushroom_block[down=true,east=false,north=true,south=true,up=true,west=true]: minecraft:brown_mushroom_block[down=true,east=true,north=true,south=true,up=true,west=true] +minecraft:brown_mushroom_block[down=false,east=true,north=true,south=true,up=true,west=true]: minecraft:brown_mushroom_block[down=true,east=true,north=true,south=true,up=true,west=true] +#minecraft:red_mushroom_block[down=true,east=true,north=true,south=true,up=true,west=true]: minecraft:red_mushroom_block[down=true,east=true,north=true,south=true,up=true,west=true]# +minecraft:red_mushroom_block[down=false,east=false,north=false,south=false,up=false,west=false]: minecraft:red_mushroom_block[down=true,east=true,north=true,south=true,up=true,west=true] +minecraft:red_mushroom_block[down=true,east=false,north=false,south=false,up=false,west=false]: minecraft:red_mushroom_block[down=true,east=true,north=true,south=true,up=true,west=true] +minecraft:red_mushroom_block[down=false,east=true,north=false,south=false,up=false,west=false]: minecraft:red_mushroom_block[down=true,east=true,north=true,south=true,up=true,west=true] +minecraft:red_mushroom_block[down=true,east=true,north=false,south=false,up=false,west=false]: minecraft:red_mushroom_block[down=true,east=true,north=true,south=true,up=true,west=true] +minecraft:red_mushroom_block[down=false,east=false,north=true,south=false,up=false,west=false]: minecraft:red_mushroom_block[down=true,east=true,north=true,south=true,up=true,west=true] +minecraft:red_mushroom_block[down=true,east=false,north=true,south=false,up=false,west=false]: minecraft:red_mushroom_block[down=true,east=true,north=true,south=true,up=true,west=true] +minecraft:red_mushroom_block[down=false,east=true,north=true,south=false,up=false,west=false]: minecraft:red_mushroom_block[down=true,east=true,north=true,south=true,up=true,west=true] +minecraft:red_mushroom_block[down=true,east=true,north=true,south=false,up=false,west=false]: minecraft:red_mushroom_block[down=true,east=true,north=true,south=true,up=true,west=true] +minecraft:red_mushroom_block[down=false,east=false,north=false,south=true,up=false,west=false]: minecraft:red_mushroom_block[down=true,east=true,north=true,south=true,up=true,west=true] +minecraft:red_mushroom_block[down=true,east=false,north=false,south=true,up=false,west=false]: minecraft:red_mushroom_block[down=true,east=true,north=true,south=true,up=true,west=true] +minecraft:red_mushroom_block[down=false,east=true,north=false,south=true,up=false,west=false]: minecraft:red_mushroom_block[down=true,east=true,north=true,south=true,up=true,west=true] +minecraft:red_mushroom_block[down=true,east=true,north=false,south=true,up=false,west=false]: minecraft:red_mushroom_block[down=true,east=true,north=true,south=true,up=true,west=true] +minecraft:red_mushroom_block[down=false,east=false,north=true,south=true,up=false,west=false]: minecraft:red_mushroom_block[down=true,east=true,north=true,south=true,up=true,west=true] +minecraft:red_mushroom_block[down=true,east=false,north=true,south=true,up=false,west=false]: minecraft:red_mushroom_block[down=true,east=true,north=true,south=true,up=true,west=true] +minecraft:red_mushroom_block[down=false,east=true,north=true,south=true,up=false,west=false]: minecraft:red_mushroom_block[down=true,east=true,north=true,south=true,up=true,west=true] +minecraft:red_mushroom_block[down=true,east=true,north=true,south=true,up=false,west=false]: minecraft:red_mushroom_block[down=true,east=true,north=true,south=true,up=true,west=true] +minecraft:red_mushroom_block[down=false,east=false,north=false,south=false,up=true,west=false]: minecraft:red_mushroom_block[down=true,east=true,north=true,south=true,up=true,west=true] +minecraft:red_mushroom_block[down=true,east=false,north=false,south=false,up=true,west=false]: minecraft:red_mushroom_block[down=true,east=true,north=true,south=true,up=true,west=true] +minecraft:red_mushroom_block[down=false,east=true,north=false,south=false,up=true,west=false]: minecraft:red_mushroom_block[down=true,east=true,north=true,south=true,up=true,west=true] +minecraft:red_mushroom_block[down=true,east=true,north=false,south=false,up=true,west=false]: minecraft:red_mushroom_block[down=true,east=true,north=true,south=true,up=true,west=true] +minecraft:red_mushroom_block[down=false,east=false,north=true,south=false,up=true,west=false]: minecraft:red_mushroom_block[down=true,east=true,north=true,south=true,up=true,west=true] +minecraft:red_mushroom_block[down=true,east=false,north=true,south=false,up=true,west=false]: minecraft:red_mushroom_block[down=true,east=true,north=true,south=true,up=true,west=true] +minecraft:red_mushroom_block[down=false,east=true,north=true,south=false,up=true,west=false]: minecraft:red_mushroom_block[down=true,east=true,north=true,south=true,up=true,west=true] +minecraft:red_mushroom_block[down=true,east=true,north=true,south=false,up=true,west=false]: minecraft:red_mushroom_block[down=true,east=true,north=true,south=true,up=true,west=true] +minecraft:red_mushroom_block[down=false,east=false,north=false,south=true,up=true,west=false]: minecraft:red_mushroom_block[down=true,east=true,north=true,south=true,up=true,west=true] +minecraft:red_mushroom_block[down=true,east=false,north=false,south=true,up=true,west=false]: minecraft:red_mushroom_block[down=true,east=true,north=true,south=true,up=true,west=true] +minecraft:red_mushroom_block[down=false,east=true,north=false,south=true,up=true,west=false]: minecraft:red_mushroom_block[down=true,east=true,north=true,south=true,up=true,west=true] +minecraft:red_mushroom_block[down=true,east=true,north=false,south=true,up=true,west=false]: minecraft:red_mushroom_block[down=true,east=true,north=true,south=true,up=true,west=true] +minecraft:red_mushroom_block[down=false,east=false,north=true,south=true,up=true,west=false]: minecraft:red_mushroom_block[down=true,east=true,north=true,south=true,up=true,west=true] +minecraft:red_mushroom_block[down=true,east=false,north=true,south=true,up=true,west=false]: minecraft:red_mushroom_block[down=true,east=true,north=true,south=true,up=true,west=true] +minecraft:red_mushroom_block[down=false,east=true,north=true,south=true,up=true,west=false]: minecraft:red_mushroom_block[down=true,east=true,north=true,south=true,up=true,west=true] +minecraft:red_mushroom_block[down=true,east=true,north=true,south=true,up=true,west=false]: minecraft:red_mushroom_block[down=true,east=true,north=true,south=true,up=true,west=true] +minecraft:red_mushroom_block[down=false,east=false,north=false,south=false,up=false,west=true]: minecraft:red_mushroom_block[down=true,east=true,north=true,south=true,up=true,west=true] +minecraft:red_mushroom_block[down=true,east=false,north=false,south=false,up=false,west=true]: minecraft:red_mushroom_block[down=true,east=true,north=true,south=true,up=true,west=true] +minecraft:red_mushroom_block[down=false,east=true,north=false,south=false,up=false,west=true]: minecraft:red_mushroom_block[down=true,east=true,north=true,south=true,up=true,west=true] +minecraft:red_mushroom_block[down=true,east=true,north=false,south=false,up=false,west=true]: minecraft:red_mushroom_block[down=true,east=true,north=true,south=true,up=true,west=true] +minecraft:red_mushroom_block[down=false,east=false,north=true,south=false,up=false,west=true]: minecraft:red_mushroom_block[down=true,east=true,north=true,south=true,up=true,west=true] +minecraft:red_mushroom_block[down=true,east=false,north=true,south=false,up=false,west=true]: minecraft:red_mushroom_block[down=true,east=true,north=true,south=true,up=true,west=true] +minecraft:red_mushroom_block[down=false,east=true,north=true,south=false,up=false,west=true]: minecraft:red_mushroom_block[down=true,east=true,north=true,south=true,up=true,west=true] +minecraft:red_mushroom_block[down=true,east=true,north=true,south=false,up=false,west=true]: minecraft:red_mushroom_block[down=true,east=true,north=true,south=true,up=true,west=true] +minecraft:red_mushroom_block[down=false,east=false,north=false,south=true,up=false,west=true]: minecraft:red_mushroom_block[down=true,east=true,north=true,south=true,up=true,west=true] +minecraft:red_mushroom_block[down=true,east=false,north=false,south=true,up=false,west=true]: minecraft:red_mushroom_block[down=true,east=true,north=true,south=true,up=true,west=true] +minecraft:red_mushroom_block[down=false,east=true,north=false,south=true,up=false,west=true]: minecraft:red_mushroom_block[down=true,east=true,north=true,south=true,up=true,west=true] +minecraft:red_mushroom_block[down=true,east=true,north=false,south=true,up=false,west=true]: minecraft:red_mushroom_block[down=true,east=true,north=true,south=true,up=true,west=true] +minecraft:red_mushroom_block[down=false,east=false,north=true,south=true,up=false,west=true]: minecraft:red_mushroom_block[down=true,east=true,north=true,south=true,up=true,west=true] +minecraft:red_mushroom_block[down=true,east=false,north=true,south=true,up=false,west=true]: minecraft:red_mushroom_block[down=true,east=true,north=true,south=true,up=true,west=true] +minecraft:red_mushroom_block[down=false,east=true,north=true,south=true,up=false,west=true]: minecraft:red_mushroom_block[down=true,east=true,north=true,south=true,up=true,west=true] +minecraft:red_mushroom_block[down=true,east=true,north=true,south=true,up=false,west=true]: minecraft:red_mushroom_block[down=true,east=true,north=true,south=true,up=true,west=true] +minecraft:red_mushroom_block[down=false,east=false,north=false,south=false,up=true,west=true]: minecraft:red_mushroom_block[down=true,east=true,north=true,south=true,up=true,west=true] +minecraft:red_mushroom_block[down=true,east=false,north=false,south=false,up=true,west=true]: minecraft:red_mushroom_block[down=true,east=true,north=true,south=true,up=true,west=true] +minecraft:red_mushroom_block[down=false,east=true,north=false,south=false,up=true,west=true]: minecraft:red_mushroom_block[down=true,east=true,north=true,south=true,up=true,west=true] +minecraft:red_mushroom_block[down=true,east=true,north=false,south=false,up=true,west=true]: minecraft:red_mushroom_block[down=true,east=true,north=true,south=true,up=true,west=true] +minecraft:red_mushroom_block[down=false,east=false,north=true,south=false,up=true,west=true]: minecraft:red_mushroom_block[down=true,east=true,north=true,south=true,up=true,west=true] +minecraft:red_mushroom_block[down=true,east=false,north=true,south=false,up=true,west=true]: minecraft:red_mushroom_block[down=true,east=true,north=true,south=true,up=true,west=true] +minecraft:red_mushroom_block[down=false,east=true,north=true,south=false,up=true,west=true]: minecraft:red_mushroom_block[down=true,east=true,north=true,south=true,up=true,west=true] +minecraft:red_mushroom_block[down=true,east=true,north=true,south=false,up=true,west=true]: minecraft:red_mushroom_block[down=true,east=true,north=true,south=true,up=true,west=true] +minecraft:red_mushroom_block[down=false,east=false,north=false,south=true,up=true,west=true]: minecraft:red_mushroom_block[down=true,east=true,north=true,south=true,up=true,west=true] +minecraft:red_mushroom_block[down=true,east=false,north=false,south=true,up=true,west=true]: minecraft:red_mushroom_block[down=true,east=true,north=true,south=true,up=true,west=true] +minecraft:red_mushroom_block[down=false,east=true,north=false,south=true,up=true,west=true]: minecraft:red_mushroom_block[down=true,east=true,north=true,south=true,up=true,west=true] +minecraft:red_mushroom_block[down=true,east=true,north=false,south=true,up=true,west=true]: minecraft:red_mushroom_block[down=true,east=true,north=true,south=true,up=true,west=true] +minecraft:red_mushroom_block[down=false,east=false,north=true,south=true,up=true,west=true]: minecraft:red_mushroom_block[down=true,east=true,north=true,south=true,up=true,west=true] +minecraft:red_mushroom_block[down=true,east=false,north=true,south=true,up=true,west=true]: minecraft:red_mushroom_block[down=true,east=true,north=true,south=true,up=true,west=true] +minecraft:red_mushroom_block[down=false,east=true,north=true,south=true,up=true,west=true]: minecraft:red_mushroom_block[down=true,east=true,north=true,south=true,up=true,west=true] +######################################################################################################################################################################################################################## +# Kelp +#minecraft:kelp[age=0]: minecraft:kelp[age=0]# +minecraft:kelp[age=1]: minecraft:kelp[age=0] +minecraft:kelp[age=2]: minecraft:kelp[age=0] +minecraft:kelp[age=3]: minecraft:kelp[age=0] +minecraft:kelp[age=4]: minecraft:kelp[age=0] +minecraft:kelp[age=5]: minecraft:kelp[age=0] +minecraft:kelp[age=6]: minecraft:kelp[age=0] +minecraft:kelp[age=7]: minecraft:kelp[age=0] +minecraft:kelp[age=8]: minecraft:kelp[age=0] +minecraft:kelp[age=9]: minecraft:kelp[age=0] +minecraft:kelp[age=10]: minecraft:kelp[age=0] +minecraft:kelp[age=11]: minecraft:kelp[age=0] +minecraft:kelp[age=12]: minecraft:kelp[age=0] +minecraft:kelp[age=13]: minecraft:kelp[age=0] +minecraft:kelp[age=14]: minecraft:kelp[age=0] +minecraft:kelp[age=15]: minecraft:kelp[age=0] +minecraft:kelp[age=16]: minecraft:kelp[age=0] +minecraft:kelp[age=17]: minecraft:kelp[age=0] +minecraft:kelp[age=18]: minecraft:kelp[age=0] +minecraft:kelp[age=19]: minecraft:kelp[age=0] +minecraft:kelp[age=20]: minecraft:kelp[age=0] +minecraft:kelp[age=21]: minecraft:kelp[age=0] +minecraft:kelp[age=22]: minecraft:kelp[age=0] +minecraft:kelp[age=23]: minecraft:kelp[age=0] +minecraft:kelp[age=24]: minecraft:kelp[age=0] +minecraft:kelp[age=25]: minecraft:kelp[age=0] +######################################################################################################################################################################################################################## +# Weeping Vines +#minecraft:weeping_vines[age=0]: minecraft:weeping_vines[age=0]# +minecraft:weeping_vines[age=1]: minecraft:weeping_vines[age=0] +minecraft:weeping_vines[age=2]: minecraft:weeping_vines[age=0] +minecraft:weeping_vines[age=3]: minecraft:weeping_vines[age=0] +minecraft:weeping_vines[age=4]: minecraft:weeping_vines[age=0] +minecraft:weeping_vines[age=5]: minecraft:weeping_vines[age=0] +minecraft:weeping_vines[age=6]: minecraft:weeping_vines[age=0] +minecraft:weeping_vines[age=7]: minecraft:weeping_vines[age=0] +minecraft:weeping_vines[age=8]: minecraft:weeping_vines[age=0] +minecraft:weeping_vines[age=9]: minecraft:weeping_vines[age=0] +minecraft:weeping_vines[age=10]: minecraft:weeping_vines[age=0] +minecraft:weeping_vines[age=11]: minecraft:weeping_vines[age=0] +minecraft:weeping_vines[age=12]: minecraft:weeping_vines[age=0] +minecraft:weeping_vines[age=13]: minecraft:weeping_vines[age=0] +minecraft:weeping_vines[age=14]: minecraft:weeping_vines[age=0] +minecraft:weeping_vines[age=15]: minecraft:weeping_vines[age=0] +minecraft:weeping_vines[age=16]: minecraft:weeping_vines[age=0] +minecraft:weeping_vines[age=17]: minecraft:weeping_vines[age=0] +minecraft:weeping_vines[age=18]: minecraft:weeping_vines[age=0] +minecraft:weeping_vines[age=19]: minecraft:weeping_vines[age=0] +minecraft:weeping_vines[age=20]: minecraft:weeping_vines[age=0] +minecraft:weeping_vines[age=21]: minecraft:weeping_vines[age=0] +minecraft:weeping_vines[age=22]: minecraft:weeping_vines[age=0] +minecraft:weeping_vines[age=23]: minecraft:weeping_vines[age=0] +minecraft:weeping_vines[age=24]: minecraft:weeping_vines[age=0] +minecraft:weeping_vines[age=25]: minecraft:weeping_vines[age=0] +######################################################################################################################################################################################################################## +# Twisting Vines +#minecraft:twisting_vines[age=0]: minecraft:twisting_vines[age=0]# +minecraft:twisting_vines[age=1]: minecraft:twisting_vines[age=0] +minecraft:twisting_vines[age=2]: minecraft:twisting_vines[age=0] +minecraft:twisting_vines[age=3]: minecraft:twisting_vines[age=0] +minecraft:twisting_vines[age=4]: minecraft:twisting_vines[age=0] +minecraft:twisting_vines[age=5]: minecraft:twisting_vines[age=0] +minecraft:twisting_vines[age=6]: minecraft:twisting_vines[age=0] +minecraft:twisting_vines[age=7]: minecraft:twisting_vines[age=0] +minecraft:twisting_vines[age=8]: minecraft:twisting_vines[age=0] +minecraft:twisting_vines[age=9]: minecraft:twisting_vines[age=0] +minecraft:twisting_vines[age=10]: minecraft:twisting_vines[age=0] +minecraft:twisting_vines[age=11]: minecraft:twisting_vines[age=0] +minecraft:twisting_vines[age=12]: minecraft:twisting_vines[age=0] +minecraft:twisting_vines[age=13]: minecraft:twisting_vines[age=0] +minecraft:twisting_vines[age=14]: minecraft:twisting_vines[age=0] +minecraft:twisting_vines[age=15]: minecraft:twisting_vines[age=0] +minecraft:twisting_vines[age=16]: minecraft:twisting_vines[age=0] +minecraft:twisting_vines[age=17]: minecraft:twisting_vines[age=0] +minecraft:twisting_vines[age=18]: minecraft:twisting_vines[age=0] +minecraft:twisting_vines[age=19]: minecraft:twisting_vines[age=0] +minecraft:twisting_vines[age=20]: minecraft:twisting_vines[age=0] +minecraft:twisting_vines[age=21]: minecraft:twisting_vines[age=0] +minecraft:twisting_vines[age=22]: minecraft:twisting_vines[age=0] +minecraft:twisting_vines[age=23]: minecraft:twisting_vines[age=0] +minecraft:twisting_vines[age=24]: minecraft:twisting_vines[age=0] +minecraft:twisting_vines[age=25]: minecraft:twisting_vines[age=0] +######################################################################################################################################################################################################################## +# Cave Vines +#minecraft:cave_vines[age=0,berries=false]: minecraft:cave_vines[age=0,berries=false]# +minecraft:cave_vines[age=1,berries=false]: minecraft:cave_vines[age=0,berries=false] +minecraft:cave_vines[age=2,berries=false]: minecraft:cave_vines[age=0,berries=false] +minecraft:cave_vines[age=3,berries=false]: minecraft:cave_vines[age=0,berries=false] +minecraft:cave_vines[age=4,berries=false]: minecraft:cave_vines[age=0,berries=false] +minecraft:cave_vines[age=5,berries=false]: minecraft:cave_vines[age=0,berries=false] +minecraft:cave_vines[age=6,berries=false]: minecraft:cave_vines[age=0,berries=false] +minecraft:cave_vines[age=7,berries=false]: minecraft:cave_vines[age=0,berries=false] +minecraft:cave_vines[age=8,berries=false]: minecraft:cave_vines[age=0,berries=false] +minecraft:cave_vines[age=9,berries=false]: minecraft:cave_vines[age=0,berries=false] +minecraft:cave_vines[age=10,berries=false]: minecraft:cave_vines[age=0,berries=false] +minecraft:cave_vines[age=11,berries=false]: minecraft:cave_vines[age=0,berries=false] +minecraft:cave_vines[age=12,berries=false]: minecraft:cave_vines[age=0,berries=false] +minecraft:cave_vines[age=13,berries=false]: minecraft:cave_vines[age=0,berries=false] +minecraft:cave_vines[age=14,berries=false]: minecraft:cave_vines[age=0,berries=false] +minecraft:cave_vines[age=15,berries=false]: minecraft:cave_vines[age=0,berries=false] +minecraft:cave_vines[age=16,berries=false]: minecraft:cave_vines[age=0,berries=false] +minecraft:cave_vines[age=17,berries=false]: minecraft:cave_vines[age=0,berries=false] +minecraft:cave_vines[age=18,berries=false]: minecraft:cave_vines[age=0,berries=false] +minecraft:cave_vines[age=19,berries=false]: minecraft:cave_vines[age=0,berries=false] +minecraft:cave_vines[age=20,berries=false]: minecraft:cave_vines[age=0,berries=false] +minecraft:cave_vines[age=21,berries=false]: minecraft:cave_vines[age=0,berries=false] +minecraft:cave_vines[age=22,berries=false]: minecraft:cave_vines[age=0,berries=false] +minecraft:cave_vines[age=23,berries=false]: minecraft:cave_vines[age=0,berries=false] +minecraft:cave_vines[age=24,berries=false]: minecraft:cave_vines[age=0,berries=false] +minecraft:cave_vines[age=25,berries=false]: minecraft:cave_vines[age=0,berries=false] +#minecraft:cave_vines[age=0,berries=true]: minecraft:cave_vines[age=0,berries=true]# +minecraft:cave_vines[age=1,berries=true]: minecraft:cave_vines[age=0,berries=true] +minecraft:cave_vines[age=2,berries=true]: minecraft:cave_vines[age=0,berries=true] +minecraft:cave_vines[age=3,berries=true]: minecraft:cave_vines[age=0,berries=true] +minecraft:cave_vines[age=4,berries=true]: minecraft:cave_vines[age=0,berries=true] +minecraft:cave_vines[age=5,berries=true]: minecraft:cave_vines[age=0,berries=true] +minecraft:cave_vines[age=6,berries=true]: minecraft:cave_vines[age=0,berries=true] +minecraft:cave_vines[age=7,berries=true]: minecraft:cave_vines[age=0,berries=true] +minecraft:cave_vines[age=8,berries=true]: minecraft:cave_vines[age=0,berries=true] +minecraft:cave_vines[age=9,berries=true]: minecraft:cave_vines[age=0,berries=true] +minecraft:cave_vines[age=10,berries=true]: minecraft:cave_vines[age=0,berries=true] +minecraft:cave_vines[age=11,berries=true]: minecraft:cave_vines[age=0,berries=true] +minecraft:cave_vines[age=12,berries=true]: minecraft:cave_vines[age=0,berries=true] +minecraft:cave_vines[age=13,berries=true]: minecraft:cave_vines[age=0,berries=true] +minecraft:cave_vines[age=14,berries=true]: minecraft:cave_vines[age=0,berries=true] +minecraft:cave_vines[age=15,berries=true]: minecraft:cave_vines[age=0,berries=true] +minecraft:cave_vines[age=16,berries=true]: minecraft:cave_vines[age=0,berries=true] +minecraft:cave_vines[age=17,berries=true]: minecraft:cave_vines[age=0,berries=true] +minecraft:cave_vines[age=18,berries=true]: minecraft:cave_vines[age=0,berries=true] +minecraft:cave_vines[age=19,berries=true]: minecraft:cave_vines[age=0,berries=true] +minecraft:cave_vines[age=20,berries=true]: minecraft:cave_vines[age=0,berries=true] +minecraft:cave_vines[age=21,berries=true]: minecraft:cave_vines[age=0,berries=true] +minecraft:cave_vines[age=22,berries=true]: minecraft:cave_vines[age=0,berries=true] +minecraft:cave_vines[age=23,berries=true]: minecraft:cave_vines[age=0,berries=true] +minecraft:cave_vines[age=24,berries=true]: minecraft:cave_vines[age=0,berries=true] +minecraft:cave_vines[age=25,berries=true]: minecraft:cave_vines[age=0,berries=true] +######################################################################################################################################################################################################################## +# SugarCane +#minecraft:sugar_cane[age=0]: minecraft:sugar_cane[age=0]# +minecraft:sugar_cane[age=1]: minecraft:sugar_cane[age=0] +minecraft:sugar_cane[age=2]: minecraft:sugar_cane[age=0] +minecraft:sugar_cane[age=3]: minecraft:sugar_cane[age=0] +minecraft:sugar_cane[age=4]: minecraft:sugar_cane[age=0] +minecraft:sugar_cane[age=5]: minecraft:sugar_cane[age=0] +minecraft:sugar_cane[age=6]: minecraft:sugar_cane[age=0] +minecraft:sugar_cane[age=7]: minecraft:sugar_cane[age=0] +minecraft:sugar_cane[age=8]: minecraft:sugar_cane[age=0] +minecraft:sugar_cane[age=9]: minecraft:sugar_cane[age=0] +minecraft:sugar_cane[age=10]: minecraft:sugar_cane[age=0] +minecraft:sugar_cane[age=11]: minecraft:sugar_cane[age=0] +minecraft:sugar_cane[age=12]: minecraft:sugar_cane[age=0] +minecraft:sugar_cane[age=13]: minecraft:sugar_cane[age=0] +minecraft:sugar_cane[age=14]: minecraft:sugar_cane[age=0] +minecraft:sugar_cane[age=15]: minecraft:sugar_cane[age=0] +######################################################################################################################################################################################################################## +# Leaves +minecraft:oak_leaves[distance=1,persistent=false,waterlogged=false]: minecraft:oak_leaves[distance=7,persistent=true,waterlogged=false] +minecraft:oak_leaves[distance=2,persistent=false,waterlogged=false]: minecraft:oak_leaves[distance=7,persistent=true,waterlogged=false] +minecraft:oak_leaves[distance=3,persistent=false,waterlogged=false]: minecraft:oak_leaves[distance=7,persistent=true,waterlogged=false] +minecraft:oak_leaves[distance=4,persistent=false,waterlogged=false]: minecraft:oak_leaves[distance=7,persistent=true,waterlogged=false] +minecraft:oak_leaves[distance=5,persistent=false,waterlogged=false]: minecraft:oak_leaves[distance=7,persistent=true,waterlogged=false] +minecraft:oak_leaves[distance=6,persistent=false,waterlogged=false]: minecraft:oak_leaves[distance=7,persistent=true,waterlogged=false] +minecraft:oak_leaves[distance=7,persistent=false,waterlogged=false]: minecraft:oak_leaves[distance=7,persistent=true,waterlogged=false] +minecraft:oak_leaves[distance=1,persistent=true,waterlogged=false]: minecraft:oak_leaves[distance=7,persistent=true,waterlogged=false] +minecraft:oak_leaves[distance=2,persistent=true,waterlogged=false]: minecraft:oak_leaves[distance=7,persistent=true,waterlogged=false] +minecraft:oak_leaves[distance=3,persistent=true,waterlogged=false]: minecraft:oak_leaves[distance=7,persistent=true,waterlogged=false] +minecraft:oak_leaves[distance=4,persistent=true,waterlogged=false]: minecraft:oak_leaves[distance=7,persistent=true,waterlogged=false] +minecraft:oak_leaves[distance=5,persistent=true,waterlogged=false]: minecraft:oak_leaves[distance=7,persistent=true,waterlogged=false] +minecraft:oak_leaves[distance=6,persistent=true,waterlogged=false]: minecraft:oak_leaves[distance=7,persistent=true,waterlogged=false] +#minecraft:oak_leaves[distance=7,persistent=true,waterlogged=false]: minecraft:oak_leaves[distance=7,persistent=true,waterlogged=false]# +minecraft:oak_leaves[distance=1,persistent=false,waterlogged=true]: minecraft:oak_leaves[distance=7,persistent=true,waterlogged=true] +minecraft:oak_leaves[distance=2,persistent=false,waterlogged=true]: minecraft:oak_leaves[distance=7,persistent=true,waterlogged=true] +minecraft:oak_leaves[distance=3,persistent=false,waterlogged=true]: minecraft:oak_leaves[distance=7,persistent=true,waterlogged=true] +minecraft:oak_leaves[distance=4,persistent=false,waterlogged=true]: minecraft:oak_leaves[distance=7,persistent=true,waterlogged=true] +minecraft:oak_leaves[distance=5,persistent=false,waterlogged=true]: minecraft:oak_leaves[distance=7,persistent=true,waterlogged=true] +minecraft:oak_leaves[distance=6,persistent=false,waterlogged=true]: minecraft:oak_leaves[distance=7,persistent=true,waterlogged=true] +minecraft:oak_leaves[distance=7,persistent=false,waterlogged=true]: minecraft:oak_leaves[distance=7,persistent=true,waterlogged=true] +minecraft:oak_leaves[distance=1,persistent=true,waterlogged=true]: minecraft:oak_leaves[distance=7,persistent=true,waterlogged=true] +minecraft:oak_leaves[distance=2,persistent=true,waterlogged=true]: minecraft:oak_leaves[distance=7,persistent=true,waterlogged=true] +minecraft:oak_leaves[distance=3,persistent=true,waterlogged=true]: minecraft:oak_leaves[distance=7,persistent=true,waterlogged=true] +minecraft:oak_leaves[distance=4,persistent=true,waterlogged=true]: minecraft:oak_leaves[distance=7,persistent=true,waterlogged=true] +minecraft:oak_leaves[distance=5,persistent=true,waterlogged=true]: minecraft:oak_leaves[distance=7,persistent=true,waterlogged=true] +minecraft:oak_leaves[distance=6,persistent=true,waterlogged=true]: minecraft:oak_leaves[distance=7,persistent=true,waterlogged=true] +#minecraft:oak_leaves[distance=7,persistent=true,waterlogged=true]: minecraft:oak_leaves[distance=7,persistent=true,waterlogged=true]# + +minecraft:acacia_leaves[distance=1,persistent=false,waterlogged=false]: minecraft:acacia_leaves[distance=7,persistent=true,waterlogged=false] +minecraft:acacia_leaves[distance=2,persistent=false,waterlogged=false]: minecraft:acacia_leaves[distance=7,persistent=true,waterlogged=false] +minecraft:acacia_leaves[distance=3,persistent=false,waterlogged=false]: minecraft:acacia_leaves[distance=7,persistent=true,waterlogged=false] +minecraft:acacia_leaves[distance=4,persistent=false,waterlogged=false]: minecraft:acacia_leaves[distance=7,persistent=true,waterlogged=false] +minecraft:acacia_leaves[distance=5,persistent=false,waterlogged=false]: minecraft:acacia_leaves[distance=7,persistent=true,waterlogged=false] +minecraft:acacia_leaves[distance=6,persistent=false,waterlogged=false]: minecraft:acacia_leaves[distance=7,persistent=true,waterlogged=false] +minecraft:acacia_leaves[distance=7,persistent=false,waterlogged=false]: minecraft:acacia_leaves[distance=7,persistent=true,waterlogged=false] +minecraft:acacia_leaves[distance=1,persistent=true,waterlogged=false]: minecraft:acacia_leaves[distance=7,persistent=true,waterlogged=false] +minecraft:acacia_leaves[distance=2,persistent=true,waterlogged=false]: minecraft:acacia_leaves[distance=7,persistent=true,waterlogged=false] +minecraft:acacia_leaves[distance=3,persistent=true,waterlogged=false]: minecraft:acacia_leaves[distance=7,persistent=true,waterlogged=false] +minecraft:acacia_leaves[distance=4,persistent=true,waterlogged=false]: minecraft:acacia_leaves[distance=7,persistent=true,waterlogged=false] +minecraft:acacia_leaves[distance=5,persistent=true,waterlogged=false]: minecraft:acacia_leaves[distance=7,persistent=true,waterlogged=false] +minecraft:acacia_leaves[distance=6,persistent=true,waterlogged=false]: minecraft:acacia_leaves[distance=7,persistent=true,waterlogged=false] +#minecraft:acacia_leaves[distance=7,persistent=true,waterlogged=false]: minecraft:acacia_leaves[distance=7,persistent=true,waterlogged=false]# +minecraft:acacia_leaves[distance=1,persistent=false,waterlogged=true]: minecraft:acacia_leaves[distance=7,persistent=true,waterlogged=true] +minecraft:acacia_leaves[distance=2,persistent=false,waterlogged=true]: minecraft:acacia_leaves[distance=7,persistent=true,waterlogged=true] +minecraft:acacia_leaves[distance=3,persistent=false,waterlogged=true]: minecraft:acacia_leaves[distance=7,persistent=true,waterlogged=true] +minecraft:acacia_leaves[distance=4,persistent=false,waterlogged=true]: minecraft:acacia_leaves[distance=7,persistent=true,waterlogged=true] +minecraft:acacia_leaves[distance=5,persistent=false,waterlogged=true]: minecraft:acacia_leaves[distance=7,persistent=true,waterlogged=true] +minecraft:acacia_leaves[distance=6,persistent=false,waterlogged=true]: minecraft:acacia_leaves[distance=7,persistent=true,waterlogged=true] +minecraft:acacia_leaves[distance=7,persistent=false,waterlogged=true]: minecraft:acacia_leaves[distance=7,persistent=true,waterlogged=true] +minecraft:acacia_leaves[distance=1,persistent=true,waterlogged=true]: minecraft:acacia_leaves[distance=7,persistent=true,waterlogged=true] +minecraft:acacia_leaves[distance=2,persistent=true,waterlogged=true]: minecraft:acacia_leaves[distance=7,persistent=true,waterlogged=true] +minecraft:acacia_leaves[distance=3,persistent=true,waterlogged=true]: minecraft:acacia_leaves[distance=7,persistent=true,waterlogged=true] +minecraft:acacia_leaves[distance=4,persistent=true,waterlogged=true]: minecraft:acacia_leaves[distance=7,persistent=true,waterlogged=true] +minecraft:acacia_leaves[distance=5,persistent=true,waterlogged=true]: minecraft:acacia_leaves[distance=7,persistent=true,waterlogged=true] +minecraft:acacia_leaves[distance=6,persistent=true,waterlogged=true]: minecraft:acacia_leaves[distance=7,persistent=true,waterlogged=true] +#minecraft:acacia_leaves[distance=7,persistent=true,waterlogged=true]: minecraft:acacia_leaves[distance=7,persistent=true,waterlogged=true]# + +minecraft:jungle_leaves[distance=1,persistent=false,waterlogged=false]: minecraft:jungle_leaves[distance=7,persistent=true,waterlogged=false] +minecraft:jungle_leaves[distance=2,persistent=false,waterlogged=false]: minecraft:jungle_leaves[distance=7,persistent=true,waterlogged=false] +minecraft:jungle_leaves[distance=3,persistent=false,waterlogged=false]: minecraft:jungle_leaves[distance=7,persistent=true,waterlogged=false] +minecraft:jungle_leaves[distance=4,persistent=false,waterlogged=false]: minecraft:jungle_leaves[distance=7,persistent=true,waterlogged=false] +minecraft:jungle_leaves[distance=5,persistent=false,waterlogged=false]: minecraft:jungle_leaves[distance=7,persistent=true,waterlogged=false] +minecraft:jungle_leaves[distance=6,persistent=false,waterlogged=false]: minecraft:jungle_leaves[distance=7,persistent=true,waterlogged=false] +minecraft:jungle_leaves[distance=7,persistent=false,waterlogged=false]: minecraft:jungle_leaves[distance=7,persistent=true,waterlogged=false] +minecraft:jungle_leaves[distance=1,persistent=true,waterlogged=false]: minecraft:jungle_leaves[distance=7,persistent=true,waterlogged=false] +minecraft:jungle_leaves[distance=2,persistent=true,waterlogged=false]: minecraft:jungle_leaves[distance=7,persistent=true,waterlogged=false] +minecraft:jungle_leaves[distance=3,persistent=true,waterlogged=false]: minecraft:jungle_leaves[distance=7,persistent=true,waterlogged=false] +minecraft:jungle_leaves[distance=4,persistent=true,waterlogged=false]: minecraft:jungle_leaves[distance=7,persistent=true,waterlogged=false] +minecraft:jungle_leaves[distance=5,persistent=true,waterlogged=false]: minecraft:jungle_leaves[distance=7,persistent=true,waterlogged=false] +minecraft:jungle_leaves[distance=6,persistent=true,waterlogged=false]: minecraft:jungle_leaves[distance=7,persistent=true,waterlogged=false] +#minecraft:jungle_leaves[distance=7,persistent=true,waterlogged=false]: minecraft:jungle_leaves[distance=7,persistent=true,waterlogged=false]# +minecraft:jungle_leaves[distance=1,persistent=false,waterlogged=true]: minecraft:jungle_leaves[distance=7,persistent=true,waterlogged=true] +minecraft:jungle_leaves[distance=2,persistent=false,waterlogged=true]: minecraft:jungle_leaves[distance=7,persistent=true,waterlogged=true] +minecraft:jungle_leaves[distance=3,persistent=false,waterlogged=true]: minecraft:jungle_leaves[distance=7,persistent=true,waterlogged=true] +minecraft:jungle_leaves[distance=4,persistent=false,waterlogged=true]: minecraft:jungle_leaves[distance=7,persistent=true,waterlogged=true] +minecraft:jungle_leaves[distance=5,persistent=false,waterlogged=true]: minecraft:jungle_leaves[distance=7,persistent=true,waterlogged=true] +minecraft:jungle_leaves[distance=6,persistent=false,waterlogged=true]: minecraft:jungle_leaves[distance=7,persistent=true,waterlogged=true] +minecraft:jungle_leaves[distance=7,persistent=false,waterlogged=true]: minecraft:jungle_leaves[distance=7,persistent=true,waterlogged=true] +minecraft:jungle_leaves[distance=1,persistent=true,waterlogged=true]: minecraft:jungle_leaves[distance=7,persistent=true,waterlogged=true] +minecraft:jungle_leaves[distance=2,persistent=true,waterlogged=true]: minecraft:jungle_leaves[distance=7,persistent=true,waterlogged=true] +minecraft:jungle_leaves[distance=3,persistent=true,waterlogged=true]: minecraft:jungle_leaves[distance=7,persistent=true,waterlogged=true] +minecraft:jungle_leaves[distance=4,persistent=true,waterlogged=true]: minecraft:jungle_leaves[distance=7,persistent=true,waterlogged=true] +minecraft:jungle_leaves[distance=5,persistent=true,waterlogged=true]: minecraft:jungle_leaves[distance=7,persistent=true,waterlogged=true] +minecraft:jungle_leaves[distance=6,persistent=true,waterlogged=true]: minecraft:jungle_leaves[distance=7,persistent=true,waterlogged=true] +#minecraft:jungle_leaves[distance=7,persistent=true,waterlogged=true]: minecraft:jungle_leaves[distance=7,persistent=true,waterlogged=true]# + +minecraft:birch_leaves[distance=1,persistent=false,waterlogged=false]: minecraft:birch_leaves[distance=7,persistent=true,waterlogged=false] +minecraft:birch_leaves[distance=2,persistent=false,waterlogged=false]: minecraft:birch_leaves[distance=7,persistent=true,waterlogged=false] +minecraft:birch_leaves[distance=3,persistent=false,waterlogged=false]: minecraft:birch_leaves[distance=7,persistent=true,waterlogged=false] +minecraft:birch_leaves[distance=4,persistent=false,waterlogged=false]: minecraft:birch_leaves[distance=7,persistent=true,waterlogged=false] +minecraft:birch_leaves[distance=5,persistent=false,waterlogged=false]: minecraft:birch_leaves[distance=7,persistent=true,waterlogged=false] +minecraft:birch_leaves[distance=6,persistent=false,waterlogged=false]: minecraft:birch_leaves[distance=7,persistent=true,waterlogged=false] +minecraft:birch_leaves[distance=7,persistent=false,waterlogged=false]: minecraft:birch_leaves[distance=7,persistent=true,waterlogged=false] +minecraft:birch_leaves[distance=1,persistent=true,waterlogged=false]: minecraft:birch_leaves[distance=7,persistent=true,waterlogged=false] +minecraft:birch_leaves[distance=2,persistent=true,waterlogged=false]: minecraft:birch_leaves[distance=7,persistent=true,waterlogged=false] +minecraft:birch_leaves[distance=3,persistent=true,waterlogged=false]: minecraft:birch_leaves[distance=7,persistent=true,waterlogged=false] +minecraft:birch_leaves[distance=4,persistent=true,waterlogged=false]: minecraft:birch_leaves[distance=7,persistent=true,waterlogged=false] +minecraft:birch_leaves[distance=5,persistent=true,waterlogged=false]: minecraft:birch_leaves[distance=7,persistent=true,waterlogged=false] +minecraft:birch_leaves[distance=6,persistent=true,waterlogged=false]: minecraft:birch_leaves[distance=7,persistent=true,waterlogged=false] +#minecraft:birch_leaves[distance=7,persistent=true,waterlogged=false]: minecraft:birch_leaves[distance=7,persistent=true,waterlogged=false]# +minecraft:birch_leaves[distance=1,persistent=false,waterlogged=true]: minecraft:birch_leaves[distance=7,persistent=true,waterlogged=true] +minecraft:birch_leaves[distance=2,persistent=false,waterlogged=true]: minecraft:birch_leaves[distance=7,persistent=true,waterlogged=true] +minecraft:birch_leaves[distance=3,persistent=false,waterlogged=true]: minecraft:birch_leaves[distance=7,persistent=true,waterlogged=true] +minecraft:birch_leaves[distance=4,persistent=false,waterlogged=true]: minecraft:birch_leaves[distance=7,persistent=true,waterlogged=true] +minecraft:birch_leaves[distance=5,persistent=false,waterlogged=true]: minecraft:birch_leaves[distance=7,persistent=true,waterlogged=true] +minecraft:birch_leaves[distance=6,persistent=false,waterlogged=true]: minecraft:birch_leaves[distance=7,persistent=true,waterlogged=true] +minecraft:birch_leaves[distance=7,persistent=false,waterlogged=true]: minecraft:birch_leaves[distance=7,persistent=true,waterlogged=true] +minecraft:birch_leaves[distance=1,persistent=true,waterlogged=true]: minecraft:birch_leaves[distance=7,persistent=true,waterlogged=true] +minecraft:birch_leaves[distance=2,persistent=true,waterlogged=true]: minecraft:birch_leaves[distance=7,persistent=true,waterlogged=true] +minecraft:birch_leaves[distance=3,persistent=true,waterlogged=true]: minecraft:birch_leaves[distance=7,persistent=true,waterlogged=true] +minecraft:birch_leaves[distance=4,persistent=true,waterlogged=true]: minecraft:birch_leaves[distance=7,persistent=true,waterlogged=true] +minecraft:birch_leaves[distance=5,persistent=true,waterlogged=true]: minecraft:birch_leaves[distance=7,persistent=true,waterlogged=true] +minecraft:birch_leaves[distance=6,persistent=true,waterlogged=true]: minecraft:birch_leaves[distance=7,persistent=true,waterlogged=true] +#minecraft:birch_leaves[distance=7,persistent=true,waterlogged=true]: minecraft:birch_leaves[distance=7,persistent=true,waterlogged=true]# + +minecraft:mangrove_leaves[distance=1,persistent=false,waterlogged=false]: minecraft:mangrove_leaves[distance=7,persistent=true,waterlogged=false] +minecraft:mangrove_leaves[distance=2,persistent=false,waterlogged=false]: minecraft:mangrove_leaves[distance=7,persistent=true,waterlogged=false] +minecraft:mangrove_leaves[distance=3,persistent=false,waterlogged=false]: minecraft:mangrove_leaves[distance=7,persistent=true,waterlogged=false] +minecraft:mangrove_leaves[distance=4,persistent=false,waterlogged=false]: minecraft:mangrove_leaves[distance=7,persistent=true,waterlogged=false] +minecraft:mangrove_leaves[distance=5,persistent=false,waterlogged=false]: minecraft:mangrove_leaves[distance=7,persistent=true,waterlogged=false] +minecraft:mangrove_leaves[distance=6,persistent=false,waterlogged=false]: minecraft:mangrove_leaves[distance=7,persistent=true,waterlogged=false] +minecraft:mangrove_leaves[distance=7,persistent=false,waterlogged=false]: minecraft:mangrove_leaves[distance=7,persistent=true,waterlogged=false] +minecraft:mangrove_leaves[distance=1,persistent=true,waterlogged=false]: minecraft:mangrove_leaves[distance=7,persistent=true,waterlogged=false] +minecraft:mangrove_leaves[distance=2,persistent=true,waterlogged=false]: minecraft:mangrove_leaves[distance=7,persistent=true,waterlogged=false] +minecraft:mangrove_leaves[distance=3,persistent=true,waterlogged=false]: minecraft:mangrove_leaves[distance=7,persistent=true,waterlogged=false] +minecraft:mangrove_leaves[distance=4,persistent=true,waterlogged=false]: minecraft:mangrove_leaves[distance=7,persistent=true,waterlogged=false] +minecraft:mangrove_leaves[distance=5,persistent=true,waterlogged=false]: minecraft:mangrove_leaves[distance=7,persistent=true,waterlogged=false] +minecraft:mangrove_leaves[distance=6,persistent=true,waterlogged=false]: minecraft:mangrove_leaves[distance=7,persistent=true,waterlogged=false] +#minecraft:mangrove_leaves[distance=7,persistent=true,waterlogged=false]: minecraft:mangrove_leaves[distance=7,persistent=true,waterlogged=false]# +minecraft:mangrove_leaves[distance=1,persistent=false,waterlogged=true]: minecraft:mangrove_leaves[distance=7,persistent=true,waterlogged=true] +minecraft:mangrove_leaves[distance=2,persistent=false,waterlogged=true]: minecraft:mangrove_leaves[distance=7,persistent=true,waterlogged=true] +minecraft:mangrove_leaves[distance=3,persistent=false,waterlogged=true]: minecraft:mangrove_leaves[distance=7,persistent=true,waterlogged=true] +minecraft:mangrove_leaves[distance=4,persistent=false,waterlogged=true]: minecraft:mangrove_leaves[distance=7,persistent=true,waterlogged=true] +minecraft:mangrove_leaves[distance=5,persistent=false,waterlogged=true]: minecraft:mangrove_leaves[distance=7,persistent=true,waterlogged=true] +minecraft:mangrove_leaves[distance=6,persistent=false,waterlogged=true]: minecraft:mangrove_leaves[distance=7,persistent=true,waterlogged=true] +minecraft:mangrove_leaves[distance=7,persistent=false,waterlogged=true]: minecraft:mangrove_leaves[distance=7,persistent=true,waterlogged=true] +minecraft:mangrove_leaves[distance=1,persistent=true,waterlogged=true]: minecraft:mangrove_leaves[distance=7,persistent=true,waterlogged=true] +minecraft:mangrove_leaves[distance=2,persistent=true,waterlogged=true]: minecraft:mangrove_leaves[distance=7,persistent=true,waterlogged=true] +minecraft:mangrove_leaves[distance=3,persistent=true,waterlogged=true]: minecraft:mangrove_leaves[distance=7,persistent=true,waterlogged=true] +minecraft:mangrove_leaves[distance=4,persistent=true,waterlogged=true]: minecraft:mangrove_leaves[distance=7,persistent=true,waterlogged=true] +minecraft:mangrove_leaves[distance=5,persistent=true,waterlogged=true]: minecraft:mangrove_leaves[distance=7,persistent=true,waterlogged=true] +minecraft:mangrove_leaves[distance=6,persistent=true,waterlogged=true]: minecraft:mangrove_leaves[distance=7,persistent=true,waterlogged=true] +#minecraft:mangrove_leaves[distance=7,persistent=true,waterlogged=true]: minecraft:mangrove_leaves[distance=7,persistent=true,waterlogged=true]# + +minecraft:cherry_leaves[distance=1,persistent=false,waterlogged=false]: minecraft:cherry_leaves[distance=7,persistent=true,waterlogged=false] +minecraft:cherry_leaves[distance=2,persistent=false,waterlogged=false]: minecraft:cherry_leaves[distance=7,persistent=true,waterlogged=false] +minecraft:cherry_leaves[distance=3,persistent=false,waterlogged=false]: minecraft:cherry_leaves[distance=7,persistent=true,waterlogged=false] +minecraft:cherry_leaves[distance=4,persistent=false,waterlogged=false]: minecraft:cherry_leaves[distance=7,persistent=true,waterlogged=false] +minecraft:cherry_leaves[distance=5,persistent=false,waterlogged=false]: minecraft:cherry_leaves[distance=7,persistent=true,waterlogged=false] +minecraft:cherry_leaves[distance=6,persistent=false,waterlogged=false]: minecraft:cherry_leaves[distance=7,persistent=true,waterlogged=false] +minecraft:cherry_leaves[distance=7,persistent=false,waterlogged=false]: minecraft:cherry_leaves[distance=7,persistent=true,waterlogged=false] +minecraft:cherry_leaves[distance=1,persistent=true,waterlogged=false]: minecraft:cherry_leaves[distance=7,persistent=true,waterlogged=false] +minecraft:cherry_leaves[distance=2,persistent=true,waterlogged=false]: minecraft:cherry_leaves[distance=7,persistent=true,waterlogged=false] +minecraft:cherry_leaves[distance=3,persistent=true,waterlogged=false]: minecraft:cherry_leaves[distance=7,persistent=true,waterlogged=false] +minecraft:cherry_leaves[distance=4,persistent=true,waterlogged=false]: minecraft:cherry_leaves[distance=7,persistent=true,waterlogged=false] +minecraft:cherry_leaves[distance=5,persistent=true,waterlogged=false]: minecraft:cherry_leaves[distance=7,persistent=true,waterlogged=false] +minecraft:cherry_leaves[distance=6,persistent=true,waterlogged=false]: minecraft:cherry_leaves[distance=7,persistent=true,waterlogged=false] +#minecraft:cherry_leaves[distance=7,persistent=true,waterlogged=false]: minecraft:cherry_leaves[distance=7,persistent=true,waterlogged=false]# +minecraft:cherry_leaves[distance=1,persistent=false,waterlogged=true]: minecraft:cherry_leaves[distance=7,persistent=true,waterlogged=true] +minecraft:cherry_leaves[distance=2,persistent=false,waterlogged=true]: minecraft:cherry_leaves[distance=7,persistent=true,waterlogged=true] +minecraft:cherry_leaves[distance=3,persistent=false,waterlogged=true]: minecraft:cherry_leaves[distance=7,persistent=true,waterlogged=true] +minecraft:cherry_leaves[distance=4,persistent=false,waterlogged=true]: minecraft:cherry_leaves[distance=7,persistent=true,waterlogged=true] +minecraft:cherry_leaves[distance=5,persistent=false,waterlogged=true]: minecraft:cherry_leaves[distance=7,persistent=true,waterlogged=true] +minecraft:cherry_leaves[distance=6,persistent=false,waterlogged=true]: minecraft:cherry_leaves[distance=7,persistent=true,waterlogged=true] +minecraft:cherry_leaves[distance=7,persistent=false,waterlogged=true]: minecraft:cherry_leaves[distance=7,persistent=true,waterlogged=true] +minecraft:cherry_leaves[distance=1,persistent=true,waterlogged=true]: minecraft:cherry_leaves[distance=7,persistent=true,waterlogged=true] +minecraft:cherry_leaves[distance=2,persistent=true,waterlogged=true]: minecraft:cherry_leaves[distance=7,persistent=true,waterlogged=true] +minecraft:cherry_leaves[distance=3,persistent=true,waterlogged=true]: minecraft:cherry_leaves[distance=7,persistent=true,waterlogged=true] +minecraft:cherry_leaves[distance=4,persistent=true,waterlogged=true]: minecraft:cherry_leaves[distance=7,persistent=true,waterlogged=true] +minecraft:cherry_leaves[distance=5,persistent=true,waterlogged=true]: minecraft:cherry_leaves[distance=7,persistent=true,waterlogged=true] +minecraft:cherry_leaves[distance=6,persistent=true,waterlogged=true]: minecraft:cherry_leaves[distance=7,persistent=true,waterlogged=true] +#minecraft:cherry_leaves[distance=7,persistent=true,waterlogged=true]: minecraft:cherry_leaves[distance=7,persistent=true,waterlogged=true]# + +minecraft:dark_oak_leaves[distance=1,persistent=false,waterlogged=false]: minecraft:dark_oak_leaves[distance=7,persistent=true,waterlogged=false] +minecraft:dark_oak_leaves[distance=2,persistent=false,waterlogged=false]: minecraft:dark_oak_leaves[distance=7,persistent=true,waterlogged=false] +minecraft:dark_oak_leaves[distance=3,persistent=false,waterlogged=false]: minecraft:dark_oak_leaves[distance=7,persistent=true,waterlogged=false] +minecraft:dark_oak_leaves[distance=4,persistent=false,waterlogged=false]: minecraft:dark_oak_leaves[distance=7,persistent=true,waterlogged=false] +minecraft:dark_oak_leaves[distance=5,persistent=false,waterlogged=false]: minecraft:dark_oak_leaves[distance=7,persistent=true,waterlogged=false] +minecraft:dark_oak_leaves[distance=6,persistent=false,waterlogged=false]: minecraft:dark_oak_leaves[distance=7,persistent=true,waterlogged=false] +minecraft:dark_oak_leaves[distance=7,persistent=false,waterlogged=false]: minecraft:dark_oak_leaves[distance=7,persistent=true,waterlogged=false] +minecraft:dark_oak_leaves[distance=1,persistent=true,waterlogged=false]: minecraft:dark_oak_leaves[distance=7,persistent=true,waterlogged=false] +minecraft:dark_oak_leaves[distance=2,persistent=true,waterlogged=false]: minecraft:dark_oak_leaves[distance=7,persistent=true,waterlogged=false] +minecraft:dark_oak_leaves[distance=3,persistent=true,waterlogged=false]: minecraft:dark_oak_leaves[distance=7,persistent=true,waterlogged=false] +minecraft:dark_oak_leaves[distance=4,persistent=true,waterlogged=false]: minecraft:dark_oak_leaves[distance=7,persistent=true,waterlogged=false] +minecraft:dark_oak_leaves[distance=5,persistent=true,waterlogged=false]: minecraft:dark_oak_leaves[distance=7,persistent=true,waterlogged=false] +minecraft:dark_oak_leaves[distance=6,persistent=true,waterlogged=false]: minecraft:dark_oak_leaves[distance=7,persistent=true,waterlogged=false] +#minecraft:dark_oak_leaves[distance=7,persistent=true,waterlogged=false]: minecraft:dark_oak_leaves[distance=7,persistent=true,waterlogged=false]# +minecraft:dark_oak_leaves[distance=1,persistent=false,waterlogged=true]: minecraft:dark_oak_leaves[distance=7,persistent=true,waterlogged=true] +minecraft:dark_oak_leaves[distance=2,persistent=false,waterlogged=true]: minecraft:dark_oak_leaves[distance=7,persistent=true,waterlogged=true] +minecraft:dark_oak_leaves[distance=3,persistent=false,waterlogged=true]: minecraft:dark_oak_leaves[distance=7,persistent=true,waterlogged=true] +minecraft:dark_oak_leaves[distance=4,persistent=false,waterlogged=true]: minecraft:dark_oak_leaves[distance=7,persistent=true,waterlogged=true] +minecraft:dark_oak_leaves[distance=5,persistent=false,waterlogged=true]: minecraft:dark_oak_leaves[distance=7,persistent=true,waterlogged=true] +minecraft:dark_oak_leaves[distance=6,persistent=false,waterlogged=true]: minecraft:dark_oak_leaves[distance=7,persistent=true,waterlogged=true] +minecraft:dark_oak_leaves[distance=7,persistent=false,waterlogged=true]: minecraft:dark_oak_leaves[distance=7,persistent=true,waterlogged=true] +minecraft:dark_oak_leaves[distance=1,persistent=true,waterlogged=true]: minecraft:dark_oak_leaves[distance=7,persistent=true,waterlogged=true] +minecraft:dark_oak_leaves[distance=2,persistent=true,waterlogged=true]: minecraft:dark_oak_leaves[distance=7,persistent=true,waterlogged=true] +minecraft:dark_oak_leaves[distance=3,persistent=true,waterlogged=true]: minecraft:dark_oak_leaves[distance=7,persistent=true,waterlogged=true] +minecraft:dark_oak_leaves[distance=4,persistent=true,waterlogged=true]: minecraft:dark_oak_leaves[distance=7,persistent=true,waterlogged=true] +minecraft:dark_oak_leaves[distance=5,persistent=true,waterlogged=true]: minecraft:dark_oak_leaves[distance=7,persistent=true,waterlogged=true] +minecraft:dark_oak_leaves[distance=6,persistent=true,waterlogged=true]: minecraft:dark_oak_leaves[distance=7,persistent=true,waterlogged=true] +#minecraft:dark_oak_leaves[distance=7,persistent=true,waterlogged=true]: minecraft:dark_oak_leaves[distance=7,persistent=true,waterlogged=true]# + +minecraft:azalea_leaves[distance=1,persistent=false,waterlogged=false]: minecraft:azalea_leaves[distance=7,persistent=true,waterlogged=false] +minecraft:azalea_leaves[distance=2,persistent=false,waterlogged=false]: minecraft:azalea_leaves[distance=7,persistent=true,waterlogged=false] +minecraft:azalea_leaves[distance=3,persistent=false,waterlogged=false]: minecraft:azalea_leaves[distance=7,persistent=true,waterlogged=false] +minecraft:azalea_leaves[distance=4,persistent=false,waterlogged=false]: minecraft:azalea_leaves[distance=7,persistent=true,waterlogged=false] +minecraft:azalea_leaves[distance=5,persistent=false,waterlogged=false]: minecraft:azalea_leaves[distance=7,persistent=true,waterlogged=false] +minecraft:azalea_leaves[distance=6,persistent=false,waterlogged=false]: minecraft:azalea_leaves[distance=7,persistent=true,waterlogged=false] +minecraft:azalea_leaves[distance=7,persistent=false,waterlogged=false]: minecraft:azalea_leaves[distance=7,persistent=true,waterlogged=false] +minecraft:azalea_leaves[distance=1,persistent=true,waterlogged=false]: minecraft:azalea_leaves[distance=7,persistent=true,waterlogged=false] +minecraft:azalea_leaves[distance=2,persistent=true,waterlogged=false]: minecraft:azalea_leaves[distance=7,persistent=true,waterlogged=false] +minecraft:azalea_leaves[distance=3,persistent=true,waterlogged=false]: minecraft:azalea_leaves[distance=7,persistent=true,waterlogged=false] +minecraft:azalea_leaves[distance=4,persistent=true,waterlogged=false]: minecraft:azalea_leaves[distance=7,persistent=true,waterlogged=false] +minecraft:azalea_leaves[distance=5,persistent=true,waterlogged=false]: minecraft:azalea_leaves[distance=7,persistent=true,waterlogged=false] +minecraft:azalea_leaves[distance=6,persistent=true,waterlogged=false]: minecraft:azalea_leaves[distance=7,persistent=true,waterlogged=false] +#minecraft:azalea_leaves[distance=7,persistent=true,waterlogged=false]: minecraft:azalea_leaves[distance=7,persistent=true,waterlogged=false]# +minecraft:azalea_leaves[distance=1,persistent=false,waterlogged=true]: minecraft:azalea_leaves[distance=7,persistent=true,waterlogged=true] +minecraft:azalea_leaves[distance=2,persistent=false,waterlogged=true]: minecraft:azalea_leaves[distance=7,persistent=true,waterlogged=true] +minecraft:azalea_leaves[distance=3,persistent=false,waterlogged=true]: minecraft:azalea_leaves[distance=7,persistent=true,waterlogged=true] +minecraft:azalea_leaves[distance=4,persistent=false,waterlogged=true]: minecraft:azalea_leaves[distance=7,persistent=true,waterlogged=true] +minecraft:azalea_leaves[distance=5,persistent=false,waterlogged=true]: minecraft:azalea_leaves[distance=7,persistent=true,waterlogged=true] +minecraft:azalea_leaves[distance=6,persistent=false,waterlogged=true]: minecraft:azalea_leaves[distance=7,persistent=true,waterlogged=true] +minecraft:azalea_leaves[distance=7,persistent=false,waterlogged=true]: minecraft:azalea_leaves[distance=7,persistent=true,waterlogged=true] +minecraft:azalea_leaves[distance=1,persistent=true,waterlogged=true]: minecraft:azalea_leaves[distance=7,persistent=true,waterlogged=true] +minecraft:azalea_leaves[distance=2,persistent=true,waterlogged=true]: minecraft:azalea_leaves[distance=7,persistent=true,waterlogged=true] +minecraft:azalea_leaves[distance=3,persistent=true,waterlogged=true]: minecraft:azalea_leaves[distance=7,persistent=true,waterlogged=true] +minecraft:azalea_leaves[distance=4,persistent=true,waterlogged=true]: minecraft:azalea_leaves[distance=7,persistent=true,waterlogged=true] +minecraft:azalea_leaves[distance=5,persistent=true,waterlogged=true]: minecraft:azalea_leaves[distance=7,persistent=true,waterlogged=true] +minecraft:azalea_leaves[distance=6,persistent=true,waterlogged=true]: minecraft:azalea_leaves[distance=7,persistent=true,waterlogged=true] +#minecraft:azalea_leaves[distance=7,persistent=true,waterlogged=true]: minecraft:azalea_leaves[distance=7,persistent=true,waterlogged=true]# + +minecraft:flowering_azalea_leaves[distance=1,persistent=false,waterlogged=false]: minecraft:flowering_azalea_leaves[distance=7,persistent=true,waterlogged=false] +minecraft:flowering_azalea_leaves[distance=2,persistent=false,waterlogged=false]: minecraft:flowering_azalea_leaves[distance=7,persistent=true,waterlogged=false] +minecraft:flowering_azalea_leaves[distance=3,persistent=false,waterlogged=false]: minecraft:flowering_azalea_leaves[distance=7,persistent=true,waterlogged=false] +minecraft:flowering_azalea_leaves[distance=4,persistent=false,waterlogged=false]: minecraft:flowering_azalea_leaves[distance=7,persistent=true,waterlogged=false] +minecraft:flowering_azalea_leaves[distance=5,persistent=false,waterlogged=false]: minecraft:flowering_azalea_leaves[distance=7,persistent=true,waterlogged=false] +minecraft:flowering_azalea_leaves[distance=6,persistent=false,waterlogged=false]: minecraft:flowering_azalea_leaves[distance=7,persistent=true,waterlogged=false] +minecraft:flowering_azalea_leaves[distance=7,persistent=false,waterlogged=false]: minecraft:flowering_azalea_leaves[distance=7,persistent=true,waterlogged=false] +minecraft:flowering_azalea_leaves[distance=1,persistent=true,waterlogged=false]: minecraft:flowering_azalea_leaves[distance=7,persistent=true,waterlogged=false] +minecraft:flowering_azalea_leaves[distance=2,persistent=true,waterlogged=false]: minecraft:flowering_azalea_leaves[distance=7,persistent=true,waterlogged=false] +minecraft:flowering_azalea_leaves[distance=3,persistent=true,waterlogged=false]: minecraft:flowering_azalea_leaves[distance=7,persistent=true,waterlogged=false] +minecraft:flowering_azalea_leaves[distance=4,persistent=true,waterlogged=false]: minecraft:flowering_azalea_leaves[distance=7,persistent=true,waterlogged=false] +minecraft:flowering_azalea_leaves[distance=5,persistent=true,waterlogged=false]: minecraft:flowering_azalea_leaves[distance=7,persistent=true,waterlogged=false] +minecraft:flowering_azalea_leaves[distance=6,persistent=true,waterlogged=false]: minecraft:flowering_azalea_leaves[distance=7,persistent=true,waterlogged=false] +#minecraft:flowering_azalea_leaves[distance=7,persistent=true,waterlogged=false]: minecraft:flowering_azalea_leaves[distance=7,persistent=true,waterlogged=false]# +minecraft:flowering_azalea_leaves[distance=1,persistent=false,waterlogged=true]: minecraft:flowering_azalea_leaves[distance=7,persistent=true,waterlogged=true] +minecraft:flowering_azalea_leaves[distance=2,persistent=false,waterlogged=true]: minecraft:flowering_azalea_leaves[distance=7,persistent=true,waterlogged=true] +minecraft:flowering_azalea_leaves[distance=3,persistent=false,waterlogged=true]: minecraft:flowering_azalea_leaves[distance=7,persistent=true,waterlogged=true] +minecraft:flowering_azalea_leaves[distance=4,persistent=false,waterlogged=true]: minecraft:flowering_azalea_leaves[distance=7,persistent=true,waterlogged=true] +minecraft:flowering_azalea_leaves[distance=5,persistent=false,waterlogged=true]: minecraft:flowering_azalea_leaves[distance=7,persistent=true,waterlogged=true] +minecraft:flowering_azalea_leaves[distance=6,persistent=false,waterlogged=true]: minecraft:flowering_azalea_leaves[distance=7,persistent=true,waterlogged=true] +minecraft:flowering_azalea_leaves[distance=7,persistent=false,waterlogged=true]: minecraft:flowering_azalea_leaves[distance=7,persistent=true,waterlogged=true] +minecraft:flowering_azalea_leaves[distance=1,persistent=true,waterlogged=true]: minecraft:flowering_azalea_leaves[distance=7,persistent=true,waterlogged=true] +minecraft:flowering_azalea_leaves[distance=2,persistent=true,waterlogged=true]: minecraft:flowering_azalea_leaves[distance=7,persistent=true,waterlogged=true] +minecraft:flowering_azalea_leaves[distance=3,persistent=true,waterlogged=true]: minecraft:flowering_azalea_leaves[distance=7,persistent=true,waterlogged=true] +minecraft:flowering_azalea_leaves[distance=4,persistent=true,waterlogged=true]: minecraft:flowering_azalea_leaves[distance=7,persistent=true,waterlogged=true] +minecraft:flowering_azalea_leaves[distance=5,persistent=true,waterlogged=true]: minecraft:flowering_azalea_leaves[distance=7,persistent=true,waterlogged=true] +minecraft:flowering_azalea_leaves[distance=6,persistent=true,waterlogged=true]: minecraft:flowering_azalea_leaves[distance=7,persistent=true,waterlogged=true] +#minecraft:flowering_azalea_leaves[distance=7,persistent=true,waterlogged=true]: minecraft:flowering_azalea_leaves[distance=7,persistent=true,waterlogged=true]# + +minecraft:spruce_leaves[distance=1,persistent=false,waterlogged=false]: minecraft:spruce_leaves[distance=7,persistent=true,waterlogged=false] +minecraft:spruce_leaves[distance=2,persistent=false,waterlogged=false]: minecraft:spruce_leaves[distance=7,persistent=true,waterlogged=false] +minecraft:spruce_leaves[distance=3,persistent=false,waterlogged=false]: minecraft:spruce_leaves[distance=7,persistent=true,waterlogged=false] +minecraft:spruce_leaves[distance=4,persistent=false,waterlogged=false]: minecraft:spruce_leaves[distance=7,persistent=true,waterlogged=false] +minecraft:spruce_leaves[distance=5,persistent=false,waterlogged=false]: minecraft:spruce_leaves[distance=7,persistent=true,waterlogged=false] +minecraft:spruce_leaves[distance=6,persistent=false,waterlogged=false]: minecraft:spruce_leaves[distance=7,persistent=true,waterlogged=false] +minecraft:spruce_leaves[distance=7,persistent=false,waterlogged=false]: minecraft:spruce_leaves[distance=7,persistent=true,waterlogged=false] +minecraft:spruce_leaves[distance=1,persistent=true,waterlogged=false]: minecraft:spruce_leaves[distance=7,persistent=true,waterlogged=false] +minecraft:spruce_leaves[distance=2,persistent=true,waterlogged=false]: minecraft:spruce_leaves[distance=7,persistent=true,waterlogged=false] +minecraft:spruce_leaves[distance=3,persistent=true,waterlogged=false]: minecraft:spruce_leaves[distance=7,persistent=true,waterlogged=false] +minecraft:spruce_leaves[distance=4,persistent=true,waterlogged=false]: minecraft:spruce_leaves[distance=7,persistent=true,waterlogged=false] +minecraft:spruce_leaves[distance=5,persistent=true,waterlogged=false]: minecraft:spruce_leaves[distance=7,persistent=true,waterlogged=false] +minecraft:spruce_leaves[distance=6,persistent=true,waterlogged=false]: minecraft:spruce_leaves[distance=7,persistent=true,waterlogged=false] +#minecraft:spruce_leaves[distance=7,persistent=true,waterlogged=false]: minecraft:spruce_leaves[distance=7,persistent=true,waterlogged=false]# +minecraft:spruce_leaves[distance=1,persistent=false,waterlogged=true]: minecraft:spruce_leaves[distance=7,persistent=true,waterlogged=true] +minecraft:spruce_leaves[distance=2,persistent=false,waterlogged=true]: minecraft:spruce_leaves[distance=7,persistent=true,waterlogged=true] +minecraft:spruce_leaves[distance=3,persistent=false,waterlogged=true]: minecraft:spruce_leaves[distance=7,persistent=true,waterlogged=true] +minecraft:spruce_leaves[distance=4,persistent=false,waterlogged=true]: minecraft:spruce_leaves[distance=7,persistent=true,waterlogged=true] +minecraft:spruce_leaves[distance=5,persistent=false,waterlogged=true]: minecraft:spruce_leaves[distance=7,persistent=true,waterlogged=true] +minecraft:spruce_leaves[distance=6,persistent=false,waterlogged=true]: minecraft:spruce_leaves[distance=7,persistent=true,waterlogged=true] +minecraft:spruce_leaves[distance=7,persistent=false,waterlogged=true]: minecraft:spruce_leaves[distance=7,persistent=true,waterlogged=true] +minecraft:spruce_leaves[distance=1,persistent=true,waterlogged=true]: minecraft:spruce_leaves[distance=7,persistent=true,waterlogged=true] +minecraft:spruce_leaves[distance=2,persistent=true,waterlogged=true]: minecraft:spruce_leaves[distance=7,persistent=true,waterlogged=true] +minecraft:spruce_leaves[distance=3,persistent=true,waterlogged=true]: minecraft:spruce_leaves[distance=7,persistent=true,waterlogged=true] +minecraft:spruce_leaves[distance=4,persistent=true,waterlogged=true]: minecraft:spruce_leaves[distance=7,persistent=true,waterlogged=true] +minecraft:spruce_leaves[distance=5,persistent=true,waterlogged=true]: minecraft:spruce_leaves[distance=7,persistent=true,waterlogged=true] +minecraft:spruce_leaves[distance=6,persistent=true,waterlogged=true]: minecraft:spruce_leaves[distance=7,persistent=true,waterlogged=true] +#minecraft:spruce_leaves[distance=7,persistent=true,waterlogged=true]: minecraft:spruce_leaves[distance=7,persistent=true,waterlogged=true]# + +# You can enable this if you are running 1.21.4+ +#minecraft:pale_oak_leaves[distance=1,persistent=false,waterlogged=false]: minecraft:pale_oak_leaves[distance=7,persistent=true,waterlogged=false] +#minecraft:pale_oak_leaves[distance=2,persistent=false,waterlogged=false]: minecraft:pale_oak_leaves[distance=7,persistent=true,waterlogged=false] +#minecraft:pale_oak_leaves[distance=3,persistent=false,waterlogged=false]: minecraft:pale_oak_leaves[distance=7,persistent=true,waterlogged=false] +#minecraft:pale_oak_leaves[distance=4,persistent=false,waterlogged=false]: minecraft:pale_oak_leaves[distance=7,persistent=true,waterlogged=false] +#minecraft:pale_oak_leaves[distance=5,persistent=false,waterlogged=false]: minecraft:pale_oak_leaves[distance=7,persistent=true,waterlogged=false] +#minecraft:pale_oak_leaves[distance=6,persistent=false,waterlogged=false]: minecraft:pale_oak_leaves[distance=7,persistent=true,waterlogged=false] +#minecraft:pale_oak_leaves[distance=7,persistent=false,waterlogged=false]: minecraft:pale_oak_leaves[distance=7,persistent=true,waterlogged=false] +#minecraft:pale_oak_leaves[distance=1,persistent=true,waterlogged=false]: minecraft:pale_oak_leaves[distance=7,persistent=true,waterlogged=false] +#minecraft:pale_oak_leaves[distance=2,persistent=true,waterlogged=false]: minecraft:pale_oak_leaves[distance=7,persistent=true,waterlogged=false] +#minecraft:pale_oak_leaves[distance=3,persistent=true,waterlogged=false]: minecraft:pale_oak_leaves[distance=7,persistent=true,waterlogged=false] +#minecraft:pale_oak_leaves[distance=4,persistent=true,waterlogged=false]: minecraft:pale_oak_leaves[distance=7,persistent=true,waterlogged=false] +#minecraft:pale_oak_leaves[distance=5,persistent=true,waterlogged=false]: minecraft:pale_oak_leaves[distance=7,persistent=true,waterlogged=false] +#minecraft:pale_oak_leaves[distance=6,persistent=true,waterlogged=false]: minecraft:pale_oak_leaves[distance=7,persistent=true,waterlogged=false] +##minecraft:pale_oak_leaves[distance=7,persistent=true,waterlogged=false]: minecraft:pale_oak_leaves[distance=7,persistent=true,waterlogged=false]# +#minecraft:pale_oak_leaves[distance=1,persistent=false,waterlogged=true]: minecraft:pale_oak_leaves[distance=7,persistent=true,waterlogged=true] +#minecraft:pale_oak_leaves[distance=2,persistent=false,waterlogged=true]: minecraft:pale_oak_leaves[distance=7,persistent=true,waterlogged=true] +#minecraft:pale_oak_leaves[distance=3,persistent=false,waterlogged=true]: minecraft:pale_oak_leaves[distance=7,persistent=true,waterlogged=true] +#minecraft:pale_oak_leaves[distance=4,persistent=false,waterlogged=true]: minecraft:pale_oak_leaves[distance=7,persistent=true,waterlogged=true] +#minecraft:pale_oak_leaves[distance=5,persistent=false,waterlogged=true]: minecraft:pale_oak_leaves[distance=7,persistent=true,waterlogged=true] +#minecraft:pale_oak_leaves[distance=6,persistent=false,waterlogged=true]: minecraft:pale_oak_leaves[distance=7,persistent=true,waterlogged=true] +#minecraft:pale_oak_leaves[distance=7,persistent=false,waterlogged=true]: minecraft:pale_oak_leaves[distance=7,persistent=true,waterlogged=true] +#minecraft:pale_oak_leaves[distance=1,persistent=true,waterlogged=true]: minecraft:pale_oak_leaves[distance=7,persistent=true,waterlogged=true] +#minecraft:pale_oak_leaves[distance=2,persistent=true,waterlogged=true]: minecraft:pale_oak_leaves[distance=7,persistent=true,waterlogged=true] +#minecraft:pale_oak_leaves[distance=3,persistent=true,waterlogged=true]: minecraft:pale_oak_leaves[distance=7,persistent=true,waterlogged=true] +#minecraft:pale_oak_leaves[distance=4,persistent=true,waterlogged=true]: minecraft:pale_oak_leaves[distance=7,persistent=true,waterlogged=true] +#minecraft:pale_oak_leaves[distance=5,persistent=true,waterlogged=true]: minecraft:pale_oak_leaves[distance=7,persistent=true,waterlogged=true] +#minecraft:pale_oak_leaves[distance=6,persistent=true,waterlogged=true]: minecraft:pale_oak_leaves[distance=7,persistent=true,waterlogged=true] +##minecraft:pale_oak_leaves[distance=7,persistent=true,waterlogged=true]: minecraft:pale_oak_leaves[distance=7,persistent=true,waterlogged=true]# + +######################################################################################################################################################################################################################## +# Tripwire +#minecraft:tripwire[attached=true,disarmed=true,east=true,north=true,south=true,west=true,powered=true]: minecraft:tripwire[attached=true,disarmed=true,east=true,north=true,south=true,west=true,powered=true]# +minecraft:tripwire[attached=false,disarmed=false,east=false,north=false,south=false,west=false,powered=false]: minecraft:tripwire[attached=true,disarmed=true,east=true,north=true,south=true,west=true,powered=true] +minecraft:tripwire[attached=true,disarmed=false,east=false,north=false,south=false,west=false,powered=false]: minecraft:tripwire[attached=true,disarmed=true,east=true,north=true,south=true,west=true,powered=true] +minecraft:tripwire[attached=false,disarmed=true,east=false,north=false,south=false,west=false,powered=false]: minecraft:tripwire[attached=true,disarmed=true,east=true,north=true,south=true,west=true,powered=true] +minecraft:tripwire[attached=true,disarmed=true,east=false,north=false,south=false,west=false,powered=false]: minecraft:tripwire[attached=true,disarmed=true,east=true,north=true,south=true,west=true,powered=true] +minecraft:tripwire[attached=false,disarmed=false,east=true,north=false,south=false,west=false,powered=false]: minecraft:tripwire[attached=true,disarmed=true,east=true,north=true,south=true,west=true,powered=true] +minecraft:tripwire[attached=true,disarmed=false,east=true,north=false,south=false,west=false,powered=false]: minecraft:tripwire[attached=true,disarmed=true,east=true,north=true,south=true,west=true,powered=true] +minecraft:tripwire[attached=false,disarmed=true,east=true,north=false,south=false,west=false,powered=false]: minecraft:tripwire[attached=true,disarmed=true,east=true,north=true,south=true,west=true,powered=true] +minecraft:tripwire[attached=true,disarmed=true,east=true,north=false,south=false,west=false,powered=false]: minecraft:tripwire[attached=true,disarmed=true,east=true,north=true,south=true,west=true,powered=true] +minecraft:tripwire[attached=false,disarmed=false,east=false,north=true,south=false,west=false,powered=false]: minecraft:tripwire[attached=true,disarmed=true,east=true,north=true,south=true,west=true,powered=true] +minecraft:tripwire[attached=true,disarmed=false,east=false,north=true,south=false,west=false,powered=false]: minecraft:tripwire[attached=true,disarmed=true,east=true,north=true,south=true,west=true,powered=true] +minecraft:tripwire[attached=false,disarmed=true,east=false,north=true,south=false,west=false,powered=false]: minecraft:tripwire[attached=true,disarmed=true,east=true,north=true,south=true,west=true,powered=true] +minecraft:tripwire[attached=true,disarmed=true,east=false,north=true,south=false,west=false,powered=false]: minecraft:tripwire[attached=true,disarmed=true,east=true,north=true,south=true,west=true,powered=true] +minecraft:tripwire[attached=false,disarmed=false,east=true,north=true,south=false,west=false,powered=false]: minecraft:tripwire[attached=true,disarmed=true,east=true,north=true,south=true,west=true,powered=true] +minecraft:tripwire[attached=true,disarmed=false,east=true,north=true,south=false,west=false,powered=false]: minecraft:tripwire[attached=true,disarmed=true,east=true,north=true,south=true,west=true,powered=true] +minecraft:tripwire[attached=false,disarmed=true,east=true,north=true,south=false,west=false,powered=false]: minecraft:tripwire[attached=true,disarmed=true,east=true,north=true,south=true,west=true,powered=true] +minecraft:tripwire[attached=true,disarmed=true,east=true,north=true,south=false,west=false,powered=false]: minecraft:tripwire[attached=true,disarmed=true,east=true,north=true,south=true,west=true,powered=true] +minecraft:tripwire[attached=false,disarmed=false,east=false,north=false,south=true,west=false,powered=false]: minecraft:tripwire[attached=true,disarmed=true,east=true,north=true,south=true,west=true,powered=true] +minecraft:tripwire[attached=true,disarmed=false,east=false,north=false,south=true,west=false,powered=false]: minecraft:tripwire[attached=true,disarmed=true,east=true,north=true,south=true,west=true,powered=true] +minecraft:tripwire[attached=false,disarmed=true,east=false,north=false,south=true,west=false,powered=false]: minecraft:tripwire[attached=true,disarmed=true,east=true,north=true,south=true,west=true,powered=true] +minecraft:tripwire[attached=true,disarmed=true,east=false,north=false,south=true,west=false,powered=false]: minecraft:tripwire[attached=true,disarmed=true,east=true,north=true,south=true,west=true,powered=true] +minecraft:tripwire[attached=false,disarmed=false,east=true,north=false,south=true,west=false,powered=false]: minecraft:tripwire[attached=true,disarmed=true,east=true,north=true,south=true,west=true,powered=true] +minecraft:tripwire[attached=true,disarmed=false,east=true,north=false,south=true,west=false,powered=false]: minecraft:tripwire[attached=true,disarmed=true,east=true,north=true,south=true,west=true,powered=true] +minecraft:tripwire[attached=false,disarmed=true,east=true,north=false,south=true,west=false,powered=false]: minecraft:tripwire[attached=true,disarmed=true,east=true,north=true,south=true,west=true,powered=true] +minecraft:tripwire[attached=true,disarmed=true,east=true,north=false,south=true,west=false,powered=false]: minecraft:tripwire[attached=true,disarmed=true,east=true,north=true,south=true,west=true,powered=true] +minecraft:tripwire[attached=false,disarmed=false,east=false,north=true,south=true,west=false,powered=false]: minecraft:tripwire[attached=true,disarmed=true,east=true,north=true,south=true,west=true,powered=true] +minecraft:tripwire[attached=true,disarmed=false,east=false,north=true,south=true,west=false,powered=false]: minecraft:tripwire[attached=true,disarmed=true,east=true,north=true,south=true,west=true,powered=true] +minecraft:tripwire[attached=false,disarmed=true,east=false,north=true,south=true,west=false,powered=false]: minecraft:tripwire[attached=true,disarmed=true,east=true,north=true,south=true,west=true,powered=true] +minecraft:tripwire[attached=true,disarmed=true,east=false,north=true,south=true,west=false,powered=false]: minecraft:tripwire[attached=true,disarmed=true,east=true,north=true,south=true,west=true,powered=true] +minecraft:tripwire[attached=false,disarmed=false,east=true,north=true,south=true,west=false,powered=false]: minecraft:tripwire[attached=true,disarmed=true,east=true,north=true,south=true,west=true,powered=true] +minecraft:tripwire[attached=true,disarmed=false,east=true,north=true,south=true,west=false,powered=false]: minecraft:tripwire[attached=true,disarmed=true,east=true,north=true,south=true,west=true,powered=true] +minecraft:tripwire[attached=false,disarmed=true,east=true,north=true,south=true,west=false,powered=false]: minecraft:tripwire[attached=true,disarmed=true,east=true,north=true,south=true,west=true,powered=true] +minecraft:tripwire[attached=true,disarmed=true,east=true,north=true,south=true,west=false,powered=false]: minecraft:tripwire[attached=true,disarmed=true,east=true,north=true,south=true,west=true,powered=true] +minecraft:tripwire[attached=false,disarmed=false,east=false,north=false,south=false,west=true,powered=false]: minecraft:tripwire[attached=true,disarmed=true,east=true,north=true,south=true,west=true,powered=true] +minecraft:tripwire[attached=true,disarmed=false,east=false,north=false,south=false,west=true,powered=false]: minecraft:tripwire[attached=true,disarmed=true,east=true,north=true,south=true,west=true,powered=true] +minecraft:tripwire[attached=false,disarmed=true,east=false,north=false,south=false,west=true,powered=false]: minecraft:tripwire[attached=true,disarmed=true,east=true,north=true,south=true,west=true,powered=true] +minecraft:tripwire[attached=true,disarmed=true,east=false,north=false,south=false,west=true,powered=false]: minecraft:tripwire[attached=true,disarmed=true,east=true,north=true,south=true,west=true,powered=true] +minecraft:tripwire[attached=false,disarmed=false,east=true,north=false,south=false,west=true,powered=false]: minecraft:tripwire[attached=true,disarmed=true,east=true,north=true,south=true,west=true,powered=true] +minecraft:tripwire[attached=true,disarmed=false,east=true,north=false,south=false,west=true,powered=false]: minecraft:tripwire[attached=true,disarmed=true,east=true,north=true,south=true,west=true,powered=true] +minecraft:tripwire[attached=false,disarmed=true,east=true,north=false,south=false,west=true,powered=false]: minecraft:tripwire[attached=true,disarmed=true,east=true,north=true,south=true,west=true,powered=true] +minecraft:tripwire[attached=true,disarmed=true,east=true,north=false,south=false,west=true,powered=false]: minecraft:tripwire[attached=true,disarmed=true,east=true,north=true,south=true,west=true,powered=true] +minecraft:tripwire[attached=false,disarmed=false,east=false,north=true,south=false,west=true,powered=false]: minecraft:tripwire[attached=true,disarmed=true,east=true,north=true,south=true,west=true,powered=true] +minecraft:tripwire[attached=true,disarmed=false,east=false,north=true,south=false,west=true,powered=false]: minecraft:tripwire[attached=true,disarmed=true,east=true,north=true,south=true,west=true,powered=true] +minecraft:tripwire[attached=false,disarmed=true,east=false,north=true,south=false,west=true,powered=false]: minecraft:tripwire[attached=true,disarmed=true,east=true,north=true,south=true,west=true,powered=true] +minecraft:tripwire[attached=true,disarmed=true,east=false,north=true,south=false,west=true,powered=false]: minecraft:tripwire[attached=true,disarmed=true,east=true,north=true,south=true,west=true,powered=true] +minecraft:tripwire[attached=false,disarmed=false,east=true,north=true,south=false,west=true,powered=false]: minecraft:tripwire[attached=true,disarmed=true,east=true,north=true,south=true,west=true,powered=true] +minecraft:tripwire[attached=true,disarmed=false,east=true,north=true,south=false,west=true,powered=false]: minecraft:tripwire[attached=true,disarmed=true,east=true,north=true,south=true,west=true,powered=true] +minecraft:tripwire[attached=false,disarmed=true,east=true,north=true,south=false,west=true,powered=false]: minecraft:tripwire[attached=true,disarmed=true,east=true,north=true,south=true,west=true,powered=true] +minecraft:tripwire[attached=true,disarmed=true,east=true,north=true,south=false,west=true,powered=false]: minecraft:tripwire[attached=true,disarmed=true,east=true,north=true,south=true,west=true,powered=true] +minecraft:tripwire[attached=false,disarmed=false,east=false,north=false,south=true,west=true,powered=false]: minecraft:tripwire[attached=true,disarmed=true,east=true,north=true,south=true,west=true,powered=true] +minecraft:tripwire[attached=true,disarmed=false,east=false,north=false,south=true,west=true,powered=false]: minecraft:tripwire[attached=true,disarmed=true,east=true,north=true,south=true,west=true,powered=true] +minecraft:tripwire[attached=false,disarmed=true,east=false,north=false,south=true,west=true,powered=false]: minecraft:tripwire[attached=true,disarmed=true,east=true,north=true,south=true,west=true,powered=true] +minecraft:tripwire[attached=true,disarmed=true,east=false,north=false,south=true,west=true,powered=false]: minecraft:tripwire[attached=true,disarmed=true,east=true,north=true,south=true,west=true,powered=true] +minecraft:tripwire[attached=false,disarmed=false,east=true,north=false,south=true,west=true,powered=false]: minecraft:tripwire[attached=true,disarmed=true,east=true,north=true,south=true,west=true,powered=true] +minecraft:tripwire[attached=true,disarmed=false,east=true,north=false,south=true,west=true,powered=false]: minecraft:tripwire[attached=true,disarmed=true,east=true,north=true,south=true,west=true,powered=true] +minecraft:tripwire[attached=false,disarmed=true,east=true,north=false,south=true,west=true,powered=false]: minecraft:tripwire[attached=true,disarmed=true,east=true,north=true,south=true,west=true,powered=true] +minecraft:tripwire[attached=true,disarmed=true,east=true,north=false,south=true,west=true,powered=false]: minecraft:tripwire[attached=true,disarmed=true,east=true,north=true,south=true,west=true,powered=true] +minecraft:tripwire[attached=false,disarmed=false,east=false,north=true,south=true,west=true,powered=false]: minecraft:tripwire[attached=true,disarmed=true,east=true,north=true,south=true,west=true,powered=true] +minecraft:tripwire[attached=true,disarmed=false,east=false,north=true,south=true,west=true,powered=false]: minecraft:tripwire[attached=true,disarmed=true,east=true,north=true,south=true,west=true,powered=true] +minecraft:tripwire[attached=false,disarmed=true,east=false,north=true,south=true,west=true,powered=false]: minecraft:tripwire[attached=true,disarmed=true,east=true,north=true,south=true,west=true,powered=true] +minecraft:tripwire[attached=true,disarmed=true,east=false,north=true,south=true,west=true,powered=false]: minecraft:tripwire[attached=true,disarmed=true,east=true,north=true,south=true,west=true,powered=true] +minecraft:tripwire[attached=false,disarmed=false,east=true,north=true,south=true,west=true,powered=false]: minecraft:tripwire[attached=true,disarmed=true,east=true,north=true,south=true,west=true,powered=true] +minecraft:tripwire[attached=true,disarmed=false,east=true,north=true,south=true,west=true,powered=false]: minecraft:tripwire[attached=true,disarmed=true,east=true,north=true,south=true,west=true,powered=true] +minecraft:tripwire[attached=false,disarmed=true,east=true,north=true,south=true,west=true,powered=false]: minecraft:tripwire[attached=true,disarmed=true,east=true,north=true,south=true,west=true,powered=true] +minecraft:tripwire[attached=true,disarmed=true,east=true,north=true,south=true,west=true,powered=false]: minecraft:tripwire[attached=true,disarmed=true,east=true,north=true,south=true,west=true,powered=true] +minecraft:tripwire[attached=false,disarmed=false,east=false,north=false,south=false,west=false,powered=true]: minecraft:tripwire[attached=true,disarmed=true,east=true,north=true,south=true,west=true,powered=true] +minecraft:tripwire[attached=true,disarmed=false,east=false,north=false,south=false,west=false,powered=true]: minecraft:tripwire[attached=true,disarmed=true,east=true,north=true,south=true,west=true,powered=true] +minecraft:tripwire[attached=false,disarmed=true,east=false,north=false,south=false,west=false,powered=true]: minecraft:tripwire[attached=true,disarmed=true,east=true,north=true,south=true,west=true,powered=true] +minecraft:tripwire[attached=true,disarmed=true,east=false,north=false,south=false,west=false,powered=true]: minecraft:tripwire[attached=true,disarmed=true,east=true,north=true,south=true,west=true,powered=true] +minecraft:tripwire[attached=false,disarmed=false,east=true,north=false,south=false,west=false,powered=true]: minecraft:tripwire[attached=true,disarmed=true,east=true,north=true,south=true,west=true,powered=true] +minecraft:tripwire[attached=true,disarmed=false,east=true,north=false,south=false,west=false,powered=true]: minecraft:tripwire[attached=true,disarmed=true,east=true,north=true,south=true,west=true,powered=true] +minecraft:tripwire[attached=false,disarmed=true,east=true,north=false,south=false,west=false,powered=true]: minecraft:tripwire[attached=true,disarmed=true,east=true,north=true,south=true,west=true,powered=true] +minecraft:tripwire[attached=true,disarmed=true,east=true,north=false,south=false,west=false,powered=true]: minecraft:tripwire[attached=true,disarmed=true,east=true,north=true,south=true,west=true,powered=true] +minecraft:tripwire[attached=false,disarmed=false,east=false,north=true,south=false,west=false,powered=true]: minecraft:tripwire[attached=true,disarmed=true,east=true,north=true,south=true,west=true,powered=true] +minecraft:tripwire[attached=true,disarmed=false,east=false,north=true,south=false,west=false,powered=true]: minecraft:tripwire[attached=true,disarmed=true,east=true,north=true,south=true,west=true,powered=true] +minecraft:tripwire[attached=false,disarmed=true,east=false,north=true,south=false,west=false,powered=true]: minecraft:tripwire[attached=true,disarmed=true,east=true,north=true,south=true,west=true,powered=true] +minecraft:tripwire[attached=true,disarmed=true,east=false,north=true,south=false,west=false,powered=true]: minecraft:tripwire[attached=true,disarmed=true,east=true,north=true,south=true,west=true,powered=true] +minecraft:tripwire[attached=false,disarmed=false,east=true,north=true,south=false,west=false,powered=true]: minecraft:tripwire[attached=true,disarmed=true,east=true,north=true,south=true,west=true,powered=true] +minecraft:tripwire[attached=true,disarmed=false,east=true,north=true,south=false,west=false,powered=true]: minecraft:tripwire[attached=true,disarmed=true,east=true,north=true,south=true,west=true,powered=true] +minecraft:tripwire[attached=false,disarmed=true,east=true,north=true,south=false,west=false,powered=true]: minecraft:tripwire[attached=true,disarmed=true,east=true,north=true,south=true,west=true,powered=true] +minecraft:tripwire[attached=true,disarmed=true,east=true,north=true,south=false,west=false,powered=true]: minecraft:tripwire[attached=true,disarmed=true,east=true,north=true,south=true,west=true,powered=true] +minecraft:tripwire[attached=false,disarmed=false,east=false,north=false,south=true,west=false,powered=true]: minecraft:tripwire[attached=true,disarmed=true,east=true,north=true,south=true,west=true,powered=true] +minecraft:tripwire[attached=true,disarmed=false,east=false,north=false,south=true,west=false,powered=true]: minecraft:tripwire[attached=true,disarmed=true,east=true,north=true,south=true,west=true,powered=true] +minecraft:tripwire[attached=false,disarmed=true,east=false,north=false,south=true,west=false,powered=true]: minecraft:tripwire[attached=true,disarmed=true,east=true,north=true,south=true,west=true,powered=true] +minecraft:tripwire[attached=true,disarmed=true,east=false,north=false,south=true,west=false,powered=true]: minecraft:tripwire[attached=true,disarmed=true,east=true,north=true,south=true,west=true,powered=true] +minecraft:tripwire[attached=false,disarmed=false,east=true,north=false,south=true,west=false,powered=true]: minecraft:tripwire[attached=true,disarmed=true,east=true,north=true,south=true,west=true,powered=true] +minecraft:tripwire[attached=true,disarmed=false,east=true,north=false,south=true,west=false,powered=true]: minecraft:tripwire[attached=true,disarmed=true,east=true,north=true,south=true,west=true,powered=true] +minecraft:tripwire[attached=false,disarmed=true,east=true,north=false,south=true,west=false,powered=true]: minecraft:tripwire[attached=true,disarmed=true,east=true,north=true,south=true,west=true,powered=true] +minecraft:tripwire[attached=true,disarmed=true,east=true,north=false,south=true,west=false,powered=true]: minecraft:tripwire[attached=true,disarmed=true,east=true,north=true,south=true,west=true,powered=true] +minecraft:tripwire[attached=false,disarmed=false,east=false,north=true,south=true,west=false,powered=true]: minecraft:tripwire[attached=true,disarmed=true,east=true,north=true,south=true,west=true,powered=true] +minecraft:tripwire[attached=true,disarmed=false,east=false,north=true,south=true,west=false,powered=true]: minecraft:tripwire[attached=true,disarmed=true,east=true,north=true,south=true,west=true,powered=true] +minecraft:tripwire[attached=false,disarmed=true,east=false,north=true,south=true,west=false,powered=true]: minecraft:tripwire[attached=true,disarmed=true,east=true,north=true,south=true,west=true,powered=true] +minecraft:tripwire[attached=true,disarmed=true,east=false,north=true,south=true,west=false,powered=true]: minecraft:tripwire[attached=true,disarmed=true,east=true,north=true,south=true,west=true,powered=true] +minecraft:tripwire[attached=false,disarmed=false,east=true,north=true,south=true,west=false,powered=true]: minecraft:tripwire[attached=true,disarmed=true,east=true,north=true,south=true,west=true,powered=true] +minecraft:tripwire[attached=true,disarmed=false,east=true,north=true,south=true,west=false,powered=true]: minecraft:tripwire[attached=true,disarmed=true,east=true,north=true,south=true,west=true,powered=true] +minecraft:tripwire[attached=false,disarmed=true,east=true,north=true,south=true,west=false,powered=true]: minecraft:tripwire[attached=true,disarmed=true,east=true,north=true,south=true,west=true,powered=true] +minecraft:tripwire[attached=true,disarmed=true,east=true,north=true,south=true,west=false,powered=true]: minecraft:tripwire[attached=true,disarmed=true,east=true,north=true,south=true,west=true,powered=true] +minecraft:tripwire[attached=false,disarmed=false,east=false,north=false,south=false,west=true,powered=true]: minecraft:tripwire[attached=true,disarmed=true,east=true,north=true,south=true,west=true,powered=true] +minecraft:tripwire[attached=true,disarmed=false,east=false,north=false,south=false,west=true,powered=true]: minecraft:tripwire[attached=true,disarmed=true,east=true,north=true,south=true,west=true,powered=true] +minecraft:tripwire[attached=false,disarmed=true,east=false,north=false,south=false,west=true,powered=true]: minecraft:tripwire[attached=true,disarmed=true,east=true,north=true,south=true,west=true,powered=true] +minecraft:tripwire[attached=true,disarmed=true,east=false,north=false,south=false,west=true,powered=true]: minecraft:tripwire[attached=true,disarmed=true,east=true,north=true,south=true,west=true,powered=true] +minecraft:tripwire[attached=false,disarmed=false,east=true,north=false,south=false,west=true,powered=true]: minecraft:tripwire[attached=true,disarmed=true,east=true,north=true,south=true,west=true,powered=true] +minecraft:tripwire[attached=true,disarmed=false,east=true,north=false,south=false,west=true,powered=true]: minecraft:tripwire[attached=true,disarmed=true,east=true,north=true,south=true,west=true,powered=true] +minecraft:tripwire[attached=false,disarmed=true,east=true,north=false,south=false,west=true,powered=true]: minecraft:tripwire[attached=true,disarmed=true,east=true,north=true,south=true,west=true,powered=true] +minecraft:tripwire[attached=true,disarmed=true,east=true,north=false,south=false,west=true,powered=true]: minecraft:tripwire[attached=true,disarmed=true,east=true,north=true,south=true,west=true,powered=true] +minecraft:tripwire[attached=false,disarmed=false,east=false,north=true,south=false,west=true,powered=true]: minecraft:tripwire[attached=true,disarmed=true,east=true,north=true,south=true,west=true,powered=true] +minecraft:tripwire[attached=true,disarmed=false,east=false,north=true,south=false,west=true,powered=true]: minecraft:tripwire[attached=true,disarmed=true,east=true,north=true,south=true,west=true,powered=true] +minecraft:tripwire[attached=false,disarmed=true,east=false,north=true,south=false,west=true,powered=true]: minecraft:tripwire[attached=true,disarmed=true,east=true,north=true,south=true,west=true,powered=true] +minecraft:tripwire[attached=true,disarmed=true,east=false,north=true,south=false,west=true,powered=true]: minecraft:tripwire[attached=true,disarmed=true,east=true,north=true,south=true,west=true,powered=true] +minecraft:tripwire[attached=false,disarmed=false,east=true,north=true,south=false,west=true,powered=true]: minecraft:tripwire[attached=true,disarmed=true,east=true,north=true,south=true,west=true,powered=true] +minecraft:tripwire[attached=true,disarmed=false,east=true,north=true,south=false,west=true,powered=true]: minecraft:tripwire[attached=true,disarmed=true,east=true,north=true,south=true,west=true,powered=true] +minecraft:tripwire[attached=false,disarmed=true,east=true,north=true,south=false,west=true,powered=true]: minecraft:tripwire[attached=true,disarmed=true,east=true,north=true,south=true,west=true,powered=true] +minecraft:tripwire[attached=true,disarmed=true,east=true,north=true,south=false,west=true,powered=true]: minecraft:tripwire[attached=true,disarmed=true,east=true,north=true,south=true,west=true,powered=true] +minecraft:tripwire[attached=false,disarmed=false,east=false,north=false,south=true,west=true,powered=true]: minecraft:tripwire[attached=true,disarmed=true,east=true,north=true,south=true,west=true,powered=true] +minecraft:tripwire[attached=true,disarmed=false,east=false,north=false,south=true,west=true,powered=true]: minecraft:tripwire[attached=true,disarmed=true,east=true,north=true,south=true,west=true,powered=true] +minecraft:tripwire[attached=false,disarmed=true,east=false,north=false,south=true,west=true,powered=true]: minecraft:tripwire[attached=true,disarmed=true,east=true,north=true,south=true,west=true,powered=true] +minecraft:tripwire[attached=true,disarmed=true,east=false,north=false,south=true,west=true,powered=true]: minecraft:tripwire[attached=true,disarmed=true,east=true,north=true,south=true,west=true,powered=true] +minecraft:tripwire[attached=false,disarmed=false,east=true,north=false,south=true,west=true,powered=true]: minecraft:tripwire[attached=true,disarmed=true,east=true,north=true,south=true,west=true,powered=true] +minecraft:tripwire[attached=true,disarmed=false,east=true,north=false,south=true,west=true,powered=true]: minecraft:tripwire[attached=true,disarmed=true,east=true,north=true,south=true,west=true,powered=true] +minecraft:tripwire[attached=false,disarmed=true,east=true,north=false,south=true,west=true,powered=true]: minecraft:tripwire[attached=true,disarmed=true,east=true,north=true,south=true,west=true,powered=true] +minecraft:tripwire[attached=true,disarmed=true,east=true,north=false,south=true,west=true,powered=true]: minecraft:tripwire[attached=true,disarmed=true,east=true,north=true,south=true,west=true,powered=true] +minecraft:tripwire[attached=false,disarmed=false,east=false,north=true,south=true,west=true,powered=true]: minecraft:tripwire[attached=true,disarmed=true,east=true,north=true,south=true,west=true,powered=true] +minecraft:tripwire[attached=true,disarmed=false,east=false,north=true,south=true,west=true,powered=true]: minecraft:tripwire[attached=true,disarmed=true,east=true,north=true,south=true,west=true,powered=true] +minecraft:tripwire[attached=false,disarmed=true,east=false,north=true,south=true,west=true,powered=true]: minecraft:tripwire[attached=true,disarmed=true,east=true,north=true,south=true,west=true,powered=true] +minecraft:tripwire[attached=true,disarmed=true,east=false,north=true,south=true,west=true,powered=true]: minecraft:tripwire[attached=true,disarmed=true,east=true,north=true,south=true,west=true,powered=true] +minecraft:tripwire[attached=false,disarmed=false,east=true,north=true,south=true,west=true,powered=true]: minecraft:tripwire[attached=true,disarmed=true,east=true,north=true,south=true,west=true,powered=true] +minecraft:tripwire[attached=true,disarmed=false,east=true,north=true,south=true,west=true,powered=true]: minecraft:tripwire[attached=true,disarmed=true,east=true,north=true,south=true,west=true,powered=true] +minecraft:tripwire[attached=false,disarmed=true,east=true,north=true,south=true,west=true,powered=true]: minecraft:tripwire[attached=true,disarmed=true,east=true,north=true,south=true,west=true,powered=true] +######################################################################################################################################################################################################################## +# Chorus Plant +#minecraft:chorus_plant[down=true,east=true,north=true,south=true,up=true,west=true]: minecraft:chorus_plant[down=true,east=true,north=true,south=true,up=true,west=true]# +minecraft:chorus_plant[down=false,east=false,north=false,south=false,up=false,west=false]: minecraft:chorus_plant[down=true,east=true,north=true,south=true,up=true,west=true] +minecraft:chorus_plant[down=true,east=false,north=false,south=false,up=false,west=false]: minecraft:chorus_plant[down=true,east=true,north=true,south=true,up=true,west=true] +minecraft:chorus_plant[down=false,east=true,north=false,south=false,up=false,west=false]: minecraft:chorus_plant[down=true,east=true,north=true,south=true,up=true,west=true] +minecraft:chorus_plant[down=true,east=true,north=false,south=false,up=false,west=false]: minecraft:chorus_plant[down=true,east=true,north=true,south=true,up=true,west=true] +minecraft:chorus_plant[down=false,east=false,north=true,south=false,up=false,west=false]: minecraft:chorus_plant[down=true,east=true,north=true,south=true,up=true,west=true] +minecraft:chorus_plant[down=true,east=false,north=true,south=false,up=false,west=false]: minecraft:chorus_plant[down=true,east=true,north=true,south=true,up=true,west=true] +minecraft:chorus_plant[down=false,east=true,north=true,south=false,up=false,west=false]: minecraft:chorus_plant[down=true,east=true,north=true,south=true,up=true,west=true] +minecraft:chorus_plant[down=true,east=true,north=true,south=false,up=false,west=false]: minecraft:chorus_plant[down=true,east=true,north=true,south=true,up=true,west=true] +minecraft:chorus_plant[down=false,east=false,north=false,south=true,up=false,west=false]: minecraft:chorus_plant[down=true,east=true,north=true,south=true,up=true,west=true] +minecraft:chorus_plant[down=true,east=false,north=false,south=true,up=false,west=false]: minecraft:chorus_plant[down=true,east=true,north=true,south=true,up=true,west=true] +minecraft:chorus_plant[down=false,east=true,north=false,south=true,up=false,west=false]: minecraft:chorus_plant[down=true,east=true,north=true,south=true,up=true,west=true] +minecraft:chorus_plant[down=true,east=true,north=false,south=true,up=false,west=false]: minecraft:chorus_plant[down=true,east=true,north=true,south=true,up=true,west=true] +minecraft:chorus_plant[down=false,east=false,north=true,south=true,up=false,west=false]: minecraft:chorus_plant[down=true,east=true,north=true,south=true,up=true,west=true] +minecraft:chorus_plant[down=true,east=false,north=true,south=true,up=false,west=false]: minecraft:chorus_plant[down=true,east=true,north=true,south=true,up=true,west=true] +minecraft:chorus_plant[down=false,east=true,north=true,south=true,up=false,west=false]: minecraft:chorus_plant[down=true,east=true,north=true,south=true,up=true,west=true] +minecraft:chorus_plant[down=true,east=true,north=true,south=true,up=false,west=false]: minecraft:chorus_plant[down=true,east=true,north=true,south=true,up=true,west=true] +minecraft:chorus_plant[down=false,east=false,north=false,south=false,up=true,west=false]: minecraft:chorus_plant[down=true,east=true,north=true,south=true,up=true,west=true] +minecraft:chorus_plant[down=true,east=false,north=false,south=false,up=true,west=false]: minecraft:chorus_plant[down=true,east=true,north=true,south=true,up=true,west=true] +minecraft:chorus_plant[down=false,east=true,north=false,south=false,up=true,west=false]: minecraft:chorus_plant[down=true,east=true,north=true,south=true,up=true,west=true] +minecraft:chorus_plant[down=true,east=true,north=false,south=false,up=true,west=false]: minecraft:chorus_plant[down=true,east=true,north=true,south=true,up=true,west=true] +minecraft:chorus_plant[down=false,east=false,north=true,south=false,up=true,west=false]: minecraft:chorus_plant[down=true,east=true,north=true,south=true,up=true,west=true] +minecraft:chorus_plant[down=true,east=false,north=true,south=false,up=true,west=false]: minecraft:chorus_plant[down=true,east=true,north=true,south=true,up=true,west=true] +minecraft:chorus_plant[down=false,east=true,north=true,south=false,up=true,west=false]: minecraft:chorus_plant[down=true,east=true,north=true,south=true,up=true,west=true] +minecraft:chorus_plant[down=true,east=true,north=true,south=false,up=true,west=false]: minecraft:chorus_plant[down=true,east=true,north=true,south=true,up=true,west=true] +minecraft:chorus_plant[down=false,east=false,north=false,south=true,up=true,west=false]: minecraft:chorus_plant[down=true,east=true,north=true,south=true,up=true,west=true] +minecraft:chorus_plant[down=true,east=false,north=false,south=true,up=true,west=false]: minecraft:chorus_plant[down=true,east=true,north=true,south=true,up=true,west=true] +minecraft:chorus_plant[down=false,east=true,north=false,south=true,up=true,west=false]: minecraft:chorus_plant[down=true,east=true,north=true,south=true,up=true,west=true] +minecraft:chorus_plant[down=true,east=true,north=false,south=true,up=true,west=false]: minecraft:chorus_plant[down=true,east=true,north=true,south=true,up=true,west=true] +minecraft:chorus_plant[down=false,east=false,north=true,south=true,up=true,west=false]: minecraft:chorus_plant[down=true,east=true,north=true,south=true,up=true,west=true] +minecraft:chorus_plant[down=true,east=false,north=true,south=true,up=true,west=false]: minecraft:chorus_plant[down=true,east=true,north=true,south=true,up=true,west=true] +minecraft:chorus_plant[down=false,east=true,north=true,south=true,up=true,west=false]: minecraft:chorus_plant[down=true,east=true,north=true,south=true,up=true,west=true] +minecraft:chorus_plant[down=true,east=true,north=true,south=true,up=true,west=false]: minecraft:chorus_plant[down=true,east=true,north=true,south=true,up=true,west=true] +minecraft:chorus_plant[down=false,east=false,north=false,south=false,up=false,west=true]: minecraft:chorus_plant[down=true,east=true,north=true,south=true,up=true,west=true] +minecraft:chorus_plant[down=true,east=false,north=false,south=false,up=false,west=true]: minecraft:chorus_plant[down=true,east=true,north=true,south=true,up=true,west=true] +minecraft:chorus_plant[down=false,east=true,north=false,south=false,up=false,west=true]: minecraft:chorus_plant[down=true,east=true,north=true,south=true,up=true,west=true] +minecraft:chorus_plant[down=true,east=true,north=false,south=false,up=false,west=true]: minecraft:chorus_plant[down=true,east=true,north=true,south=true,up=true,west=true] +minecraft:chorus_plant[down=false,east=false,north=true,south=false,up=false,west=true]: minecraft:chorus_plant[down=true,east=true,north=true,south=true,up=true,west=true] +minecraft:chorus_plant[down=true,east=false,north=true,south=false,up=false,west=true]: minecraft:chorus_plant[down=true,east=true,north=true,south=true,up=true,west=true] +minecraft:chorus_plant[down=false,east=true,north=true,south=false,up=false,west=true]: minecraft:chorus_plant[down=true,east=true,north=true,south=true,up=true,west=true] +minecraft:chorus_plant[down=true,east=true,north=true,south=false,up=false,west=true]: minecraft:chorus_plant[down=true,east=true,north=true,south=true,up=true,west=true] +minecraft:chorus_plant[down=false,east=false,north=false,south=true,up=false,west=true]: minecraft:chorus_plant[down=true,east=true,north=true,south=true,up=true,west=true] +minecraft:chorus_plant[down=true,east=false,north=false,south=true,up=false,west=true]: minecraft:chorus_plant[down=true,east=true,north=true,south=true,up=true,west=true] +minecraft:chorus_plant[down=false,east=true,north=false,south=true,up=false,west=true]: minecraft:chorus_plant[down=true,east=true,north=true,south=true,up=true,west=true] +minecraft:chorus_plant[down=true,east=true,north=false,south=true,up=false,west=true]: minecraft:chorus_plant[down=true,east=true,north=true,south=true,up=true,west=true] +minecraft:chorus_plant[down=false,east=false,north=true,south=true,up=false,west=true]: minecraft:chorus_plant[down=true,east=true,north=true,south=true,up=true,west=true] +minecraft:chorus_plant[down=true,east=false,north=true,south=true,up=false,west=true]: minecraft:chorus_plant[down=true,east=true,north=true,south=true,up=true,west=true] +minecraft:chorus_plant[down=false,east=true,north=true,south=true,up=false,west=true]: minecraft:chorus_plant[down=true,east=true,north=true,south=true,up=true,west=true] +minecraft:chorus_plant[down=true,east=true,north=true,south=true,up=false,west=true]: minecraft:chorus_plant[down=true,east=true,north=true,south=true,up=true,west=true] +minecraft:chorus_plant[down=false,east=false,north=false,south=false,up=true,west=true]: minecraft:chorus_plant[down=true,east=true,north=true,south=true,up=true,west=true] +minecraft:chorus_plant[down=true,east=false,north=false,south=false,up=true,west=true]: minecraft:chorus_plant[down=true,east=true,north=true,south=true,up=true,west=true] +minecraft:chorus_plant[down=false,east=true,north=false,south=false,up=true,west=true]: minecraft:chorus_plant[down=true,east=true,north=true,south=true,up=true,west=true] +minecraft:chorus_plant[down=true,east=true,north=false,south=false,up=true,west=true]: minecraft:chorus_plant[down=true,east=true,north=true,south=true,up=true,west=true] +minecraft:chorus_plant[down=false,east=false,north=true,south=false,up=true,west=true]: minecraft:chorus_plant[down=true,east=true,north=true,south=true,up=true,west=true] +minecraft:chorus_plant[down=true,east=false,north=true,south=false,up=true,west=true]: minecraft:chorus_plant[down=true,east=true,north=true,south=true,up=true,west=true] +minecraft:chorus_plant[down=false,east=true,north=true,south=false,up=true,west=true]: minecraft:chorus_plant[down=true,east=true,north=true,south=true,up=true,west=true] +minecraft:chorus_plant[down=true,east=true,north=true,south=false,up=true,west=true]: minecraft:chorus_plant[down=true,east=true,north=true,south=true,up=true,west=true] +minecraft:chorus_plant[down=false,east=false,north=false,south=true,up=true,west=true]: minecraft:chorus_plant[down=true,east=true,north=true,south=true,up=true,west=true] +minecraft:chorus_plant[down=true,east=false,north=false,south=true,up=true,west=true]: minecraft:chorus_plant[down=true,east=true,north=true,south=true,up=true,west=true] +minecraft:chorus_plant[down=false,east=true,north=false,south=true,up=true,west=true]: minecraft:chorus_plant[down=true,east=true,north=true,south=true,up=true,west=true] +minecraft:chorus_plant[down=true,east=true,north=false,south=true,up=true,west=true]: minecraft:chorus_plant[down=true,east=true,north=true,south=true,up=true,west=true] +minecraft:chorus_plant[down=false,east=false,north=true,south=true,up=true,west=true]: minecraft:chorus_plant[down=true,east=true,north=true,south=true,up=true,west=true] +minecraft:chorus_plant[down=true,east=false,north=true,south=true,up=true,west=true]: minecraft:chorus_plant[down=true,east=true,north=true,south=true,up=true,west=true] +minecraft:chorus_plant[down=false,east=true,north=true,south=true,up=true,west=true]: minecraft:chorus_plant[down=true,east=true,north=true,south=true,up=true,west=true] +######################################################################################################################################################################################################################## +# Note Block +#minecraft:note_block[instrument=harp,note=0,powered=false]: minecraft:note_block[instrument=harp,note=0,powered=false]# +#minecraft:note_block[instrument=harp,note=1,powered=false]: minecraft:note_block[instrument=harp,note=1,powered=false]# +#minecraft:note_block[instrument=harp,note=2,powered=false]: minecraft:note_block[instrument=harp,note=2,powered=false]# +#minecraft:note_block[instrument=harp,note=3,powered=false]: minecraft:note_block[instrument=harp,note=3,powered=false]# +#minecraft:note_block[instrument=harp,note=4,powered=false]: minecraft:note_block[instrument=harp,note=4,powered=false]# +#minecraft:note_block[instrument=harp,note=5,powered=false]: minecraft:note_block[instrument=harp,note=5,powered=false]# +#minecraft:note_block[instrument=harp,note=6,powered=false]: minecraft:note_block[instrument=harp,note=6,powered=false]# +#minecraft:note_block[instrument=harp,note=7,powered=false]: minecraft:note_block[instrument=harp,note=7,powered=false]# +#minecraft:note_block[instrument=harp,note=8,powered=false]: minecraft:note_block[instrument=harp,note=8,powered=false]# +#minecraft:note_block[instrument=harp,note=9,powered=false]: minecraft:note_block[instrument=harp,note=9,powered=false]# +#minecraft:note_block[instrument=harp,note=10,powered=false]: minecraft:note_block[instrument=harp,note=10,powered=false]# +#minecraft:note_block[instrument=harp,note=11,powered=false]: minecraft:note_block[instrument=harp,note=11,powered=false]# +#minecraft:note_block[instrument=harp,note=12,powered=false]: minecraft:note_block[instrument=harp,note=12,powered=false]# +#minecraft:note_block[instrument=harp,note=13,powered=false]: minecraft:note_block[instrument=harp,note=13,powered=false]# +#minecraft:note_block[instrument=harp,note=14,powered=false]: minecraft:note_block[instrument=harp,note=14,powered=false]# +#minecraft:note_block[instrument=harp,note=15,powered=false]: minecraft:note_block[instrument=harp,note=15,powered=false]# +#minecraft:note_block[instrument=harp,note=16,powered=false]: minecraft:note_block[instrument=harp,note=16,powered=false]# +#minecraft:note_block[instrument=harp,note=17,powered=false]: minecraft:note_block[instrument=harp,note=17,powered=false]# +#minecraft:note_block[instrument=harp,note=18,powered=false]: minecraft:note_block[instrument=harp,note=18,powered=false]# +#minecraft:note_block[instrument=harp,note=19,powered=false]: minecraft:note_block[instrument=harp,note=19,powered=false]# +#minecraft:note_block[instrument=harp,note=20,powered=false]: minecraft:note_block[instrument=harp,note=20,powered=false]# +#minecraft:note_block[instrument=harp,note=21,powered=false]: minecraft:note_block[instrument=harp,note=21,powered=false]# +#minecraft:note_block[instrument=harp,note=22,powered=false]: minecraft:note_block[instrument=harp,note=22,powered=false]# +#minecraft:note_block[instrument=harp,note=23,powered=false]: minecraft:note_block[instrument=harp,note=23,powered=false]# +#minecraft:note_block[instrument=harp,note=24,powered=false]: minecraft:note_block[instrument=harp,note=24,powered=false]# +#minecraft:note_block[instrument=harp,note=0,powered=true]: minecraft:note_block[instrument=harp,note=0,powered=true]# +#minecraft:note_block[instrument=harp,note=1,powered=true]: minecraft:note_block[instrument=harp,note=1,powered=true]# +#minecraft:note_block[instrument=harp,note=2,powered=true]: minecraft:note_block[instrument=harp,note=2,powered=true]# +#minecraft:note_block[instrument=harp,note=3,powered=true]: minecraft:note_block[instrument=harp,note=3,powered=true]# +#minecraft:note_block[instrument=harp,note=4,powered=true]: minecraft:note_block[instrument=harp,note=4,powered=true]# +#minecraft:note_block[instrument=harp,note=5,powered=true]: minecraft:note_block[instrument=harp,note=5,powered=true]# +#minecraft:note_block[instrument=harp,note=6,powered=true]: minecraft:note_block[instrument=harp,note=6,powered=true]# +#minecraft:note_block[instrument=harp,note=7,powered=true]: minecraft:note_block[instrument=harp,note=7,powered=true]# +#minecraft:note_block[instrument=harp,note=8,powered=true]: minecraft:note_block[instrument=harp,note=8,powered=true]# +#minecraft:note_block[instrument=harp,note=9,powered=true]: minecraft:note_block[instrument=harp,note=9,powered=true]# +#minecraft:note_block[instrument=harp,note=10,powered=true]: minecraft:note_block[instrument=harp,note=10,powered=true]# +#minecraft:note_block[instrument=harp,note=11,powered=true]: minecraft:note_block[instrument=harp,note=11,powered=true]# +#minecraft:note_block[instrument=harp,note=12,powered=true]: minecraft:note_block[instrument=harp,note=12,powered=true]# +#minecraft:note_block[instrument=harp,note=13,powered=true]: minecraft:note_block[instrument=harp,note=13,powered=true]3 +#minecraft:note_block[instrument=harp,note=14,powered=true]: minecraft:note_block[instrument=harp,note=14,powered=true]# +#minecraft:note_block[instrument=harp,note=15,powered=true]: minecraft:note_block[instrument=harp,note=15,powered=true]# +#minecraft:note_block[instrument=harp,note=16,powered=true]: minecraft:note_block[instrument=harp,note=16,powered=true]# +#minecraft:note_block[instrument=harp,note=17,powered=true]: minecraft:note_block[instrument=harp,note=17,powered=true]# +#minecraft:note_block[instrument=harp,note=18,powered=true]: minecraft:note_block[instrument=harp,note=18,powered=true]# +#minecraft:note_block[instrument=harp,note=19,powered=true]: minecraft:note_block[instrument=harp,note=19,powered=true]# +#minecraft:note_block[instrument=harp,note=20,powered=true]: minecraft:note_block[instrument=harp,note=20,powered=true]# +#minecraft:note_block[instrument=harp,note=21,powered=true]: minecraft:note_block[instrument=harp,note=21,powered=true]# +#minecraft:note_block[instrument=harp,note=22,powered=true]: minecraft:note_block[instrument=harp,note=22,powered=true]# +#minecraft:note_block[instrument=harp,note=23,powered=true]: minecraft:note_block[instrument=harp,note=23,powered=true]# +#minecraft:note_block[instrument=harp,note=24,powered=true]: minecraft:note_block[instrument=harp,note=24,powered=true]# +minecraft:note_block[instrument=hat,note=0,powered=false]: minecraft:note_block[instrument=harp,note=0,powered=false] +minecraft:note_block[instrument=hat,note=1,powered=false]: minecraft:note_block[instrument=harp,note=1,powered=false] +minecraft:note_block[instrument=hat,note=2,powered=false]: minecraft:note_block[instrument=harp,note=2,powered=false] +minecraft:note_block[instrument=hat,note=3,powered=false]: minecraft:note_block[instrument=harp,note=3,powered=false] +minecraft:note_block[instrument=hat,note=4,powered=false]: minecraft:note_block[instrument=harp,note=4,powered=false] +minecraft:note_block[instrument=hat,note=5,powered=false]: minecraft:note_block[instrument=harp,note=5,powered=false] +minecraft:note_block[instrument=hat,note=6,powered=false]: minecraft:note_block[instrument=harp,note=6,powered=false] +minecraft:note_block[instrument=hat,note=7,powered=false]: minecraft:note_block[instrument=harp,note=7,powered=false] +minecraft:note_block[instrument=hat,note=8,powered=false]: minecraft:note_block[instrument=harp,note=8,powered=false] +minecraft:note_block[instrument=hat,note=9,powered=false]: minecraft:note_block[instrument=harp,note=9,powered=false] +minecraft:note_block[instrument=hat,note=10,powered=false]: minecraft:note_block[instrument=harp,note=10,powered=false] +minecraft:note_block[instrument=hat,note=11,powered=false]: minecraft:note_block[instrument=harp,note=11,powered=false] +minecraft:note_block[instrument=hat,note=12,powered=false]: minecraft:note_block[instrument=harp,note=12,powered=false] +minecraft:note_block[instrument=hat,note=13,powered=false]: minecraft:note_block[instrument=harp,note=13,powered=false] +minecraft:note_block[instrument=hat,note=14,powered=false]: minecraft:note_block[instrument=harp,note=14,powered=false] +minecraft:note_block[instrument=hat,note=15,powered=false]: minecraft:note_block[instrument=harp,note=15,powered=false] +minecraft:note_block[instrument=hat,note=16,powered=false]: minecraft:note_block[instrument=harp,note=16,powered=false] +minecraft:note_block[instrument=hat,note=17,powered=false]: minecraft:note_block[instrument=harp,note=17,powered=false] +minecraft:note_block[instrument=hat,note=18,powered=false]: minecraft:note_block[instrument=harp,note=18,powered=false] +minecraft:note_block[instrument=hat,note=19,powered=false]: minecraft:note_block[instrument=harp,note=19,powered=false] +minecraft:note_block[instrument=hat,note=20,powered=false]: minecraft:note_block[instrument=harp,note=20,powered=false] +minecraft:note_block[instrument=hat,note=21,powered=false]: minecraft:note_block[instrument=harp,note=21,powered=false] +minecraft:note_block[instrument=hat,note=22,powered=false]: minecraft:note_block[instrument=harp,note=22,powered=false] +minecraft:note_block[instrument=hat,note=23,powered=false]: minecraft:note_block[instrument=harp,note=23,powered=false] +minecraft:note_block[instrument=hat,note=24,powered=false]: minecraft:note_block[instrument=harp,note=24,powered=false] +minecraft:note_block[instrument=hat,note=0,powered=true]: minecraft:note_block[instrument=harp,note=0,powered=true] +minecraft:note_block[instrument=hat,note=1,powered=true]: minecraft:note_block[instrument=harp,note=1,powered=true] +minecraft:note_block[instrument=hat,note=2,powered=true]: minecraft:note_block[instrument=harp,note=2,powered=true] +minecraft:note_block[instrument=hat,note=3,powered=true]: minecraft:note_block[instrument=harp,note=3,powered=true] +minecraft:note_block[instrument=hat,note=4,powered=true]: minecraft:note_block[instrument=harp,note=4,powered=true] +minecraft:note_block[instrument=hat,note=5,powered=true]: minecraft:note_block[instrument=harp,note=5,powered=true] +minecraft:note_block[instrument=hat,note=6,powered=true]: minecraft:note_block[instrument=harp,note=6,powered=true] +minecraft:note_block[instrument=hat,note=7,powered=true]: minecraft:note_block[instrument=harp,note=7,powered=true] +minecraft:note_block[instrument=hat,note=8,powered=true]: minecraft:note_block[instrument=harp,note=8,powered=true] +minecraft:note_block[instrument=hat,note=9,powered=true]: minecraft:note_block[instrument=harp,note=9,powered=true] +minecraft:note_block[instrument=hat,note=10,powered=true]: minecraft:note_block[instrument=harp,note=10,powered=true] +minecraft:note_block[instrument=hat,note=11,powered=true]: minecraft:note_block[instrument=harp,note=11,powered=true] +minecraft:note_block[instrument=hat,note=12,powered=true]: minecraft:note_block[instrument=harp,note=12,powered=true] +minecraft:note_block[instrument=hat,note=13,powered=true]: minecraft:note_block[instrument=harp,note=13,powered=true] +minecraft:note_block[instrument=hat,note=14,powered=true]: minecraft:note_block[instrument=harp,note=14,powered=true] +minecraft:note_block[instrument=hat,note=15,powered=true]: minecraft:note_block[instrument=harp,note=15,powered=true] +minecraft:note_block[instrument=hat,note=16,powered=true]: minecraft:note_block[instrument=harp,note=16,powered=true] +minecraft:note_block[instrument=hat,note=17,powered=true]: minecraft:note_block[instrument=harp,note=17,powered=true] +minecraft:note_block[instrument=hat,note=18,powered=true]: minecraft:note_block[instrument=harp,note=18,powered=true] +minecraft:note_block[instrument=hat,note=19,powered=true]: minecraft:note_block[instrument=harp,note=19,powered=true] +minecraft:note_block[instrument=hat,note=20,powered=true]: minecraft:note_block[instrument=harp,note=20,powered=true] +minecraft:note_block[instrument=hat,note=21,powered=true]: minecraft:note_block[instrument=harp,note=21,powered=true] +minecraft:note_block[instrument=hat,note=22,powered=true]: minecraft:note_block[instrument=harp,note=22,powered=true] +minecraft:note_block[instrument=hat,note=23,powered=true]: minecraft:note_block[instrument=harp,note=23,powered=true] +minecraft:note_block[instrument=hat,note=24,powered=true]: minecraft:note_block[instrument=harp,note=24,powered=true] +minecraft:note_block[instrument=basedrum,note=0,powered=false]: minecraft:note_block[instrument=harp,note=0,powered=false] +minecraft:note_block[instrument=basedrum,note=1,powered=false]: minecraft:note_block[instrument=harp,note=1,powered=false] +minecraft:note_block[instrument=basedrum,note=2,powered=false]: minecraft:note_block[instrument=harp,note=2,powered=false] +minecraft:note_block[instrument=basedrum,note=3,powered=false]: minecraft:note_block[instrument=harp,note=3,powered=false] +minecraft:note_block[instrument=basedrum,note=4,powered=false]: minecraft:note_block[instrument=harp,note=4,powered=false] +minecraft:note_block[instrument=basedrum,note=5,powered=false]: minecraft:note_block[instrument=harp,note=5,powered=false] +minecraft:note_block[instrument=basedrum,note=6,powered=false]: minecraft:note_block[instrument=harp,note=6,powered=false] +minecraft:note_block[instrument=basedrum,note=7,powered=false]: minecraft:note_block[instrument=harp,note=7,powered=false] +minecraft:note_block[instrument=basedrum,note=8,powered=false]: minecraft:note_block[instrument=harp,note=8,powered=false] +minecraft:note_block[instrument=basedrum,note=9,powered=false]: minecraft:note_block[instrument=harp,note=9,powered=false] +minecraft:note_block[instrument=basedrum,note=10,powered=false]: minecraft:note_block[instrument=harp,note=10,powered=false] +minecraft:note_block[instrument=basedrum,note=11,powered=false]: minecraft:note_block[instrument=harp,note=11,powered=false] +minecraft:note_block[instrument=basedrum,note=12,powered=false]: minecraft:note_block[instrument=harp,note=12,powered=false] +minecraft:note_block[instrument=basedrum,note=13,powered=false]: minecraft:note_block[instrument=harp,note=13,powered=false] +minecraft:note_block[instrument=basedrum,note=14,powered=false]: minecraft:note_block[instrument=harp,note=14,powered=false] +minecraft:note_block[instrument=basedrum,note=15,powered=false]: minecraft:note_block[instrument=harp,note=15,powered=false] +minecraft:note_block[instrument=basedrum,note=16,powered=false]: minecraft:note_block[instrument=harp,note=16,powered=false] +minecraft:note_block[instrument=basedrum,note=17,powered=false]: minecraft:note_block[instrument=harp,note=17,powered=false] +minecraft:note_block[instrument=basedrum,note=18,powered=false]: minecraft:note_block[instrument=harp,note=18,powered=false] +minecraft:note_block[instrument=basedrum,note=19,powered=false]: minecraft:note_block[instrument=harp,note=19,powered=false] +minecraft:note_block[instrument=basedrum,note=20,powered=false]: minecraft:note_block[instrument=harp,note=20,powered=false] +minecraft:note_block[instrument=basedrum,note=21,powered=false]: minecraft:note_block[instrument=harp,note=21,powered=false] +minecraft:note_block[instrument=basedrum,note=22,powered=false]: minecraft:note_block[instrument=harp,note=22,powered=false] +minecraft:note_block[instrument=basedrum,note=23,powered=false]: minecraft:note_block[instrument=harp,note=23,powered=false] +minecraft:note_block[instrument=basedrum,note=24,powered=false]: minecraft:note_block[instrument=harp,note=24,powered=false] +minecraft:note_block[instrument=basedrum,note=0,powered=true]: minecraft:note_block[instrument=harp,note=0,powered=true] +minecraft:note_block[instrument=basedrum,note=1,powered=true]: minecraft:note_block[instrument=harp,note=1,powered=true] +minecraft:note_block[instrument=basedrum,note=2,powered=true]: minecraft:note_block[instrument=harp,note=2,powered=true] +minecraft:note_block[instrument=basedrum,note=3,powered=true]: minecraft:note_block[instrument=harp,note=3,powered=true] +minecraft:note_block[instrument=basedrum,note=4,powered=true]: minecraft:note_block[instrument=harp,note=4,powered=true] +minecraft:note_block[instrument=basedrum,note=5,powered=true]: minecraft:note_block[instrument=harp,note=5,powered=true] +minecraft:note_block[instrument=basedrum,note=6,powered=true]: minecraft:note_block[instrument=harp,note=6,powered=true] +minecraft:note_block[instrument=basedrum,note=7,powered=true]: minecraft:note_block[instrument=harp,note=7,powered=true] +minecraft:note_block[instrument=basedrum,note=8,powered=true]: minecraft:note_block[instrument=harp,note=8,powered=true] +minecraft:note_block[instrument=basedrum,note=9,powered=true]: minecraft:note_block[instrument=harp,note=9,powered=true] +minecraft:note_block[instrument=basedrum,note=10,powered=true]: minecraft:note_block[instrument=harp,note=10,powered=true] +minecraft:note_block[instrument=basedrum,note=11,powered=true]: minecraft:note_block[instrument=harp,note=11,powered=true] +minecraft:note_block[instrument=basedrum,note=12,powered=true]: minecraft:note_block[instrument=harp,note=12,powered=true] +minecraft:note_block[instrument=basedrum,note=13,powered=true]: minecraft:note_block[instrument=harp,note=13,powered=true] +minecraft:note_block[instrument=basedrum,note=14,powered=true]: minecraft:note_block[instrument=harp,note=14,powered=true] +minecraft:note_block[instrument=basedrum,note=15,powered=true]: minecraft:note_block[instrument=harp,note=15,powered=true] +minecraft:note_block[instrument=basedrum,note=16,powered=true]: minecraft:note_block[instrument=harp,note=16,powered=true] +minecraft:note_block[instrument=basedrum,note=17,powered=true]: minecraft:note_block[instrument=harp,note=17,powered=true] +minecraft:note_block[instrument=basedrum,note=18,powered=true]: minecraft:note_block[instrument=harp,note=18,powered=true] +minecraft:note_block[instrument=basedrum,note=19,powered=true]: minecraft:note_block[instrument=harp,note=19,powered=true] +minecraft:note_block[instrument=basedrum,note=20,powered=true]: minecraft:note_block[instrument=harp,note=20,powered=true] +minecraft:note_block[instrument=basedrum,note=21,powered=true]: minecraft:note_block[instrument=harp,note=21,powered=true] +minecraft:note_block[instrument=basedrum,note=22,powered=true]: minecraft:note_block[instrument=harp,note=22,powered=true] +minecraft:note_block[instrument=basedrum,note=23,powered=true]: minecraft:note_block[instrument=harp,note=23,powered=true] +minecraft:note_block[instrument=basedrum,note=24,powered=true]: minecraft:note_block[instrument=harp,note=24,powered=true] +minecraft:note_block[instrument=snare,note=0,powered=false]: minecraft:note_block[instrument=harp,note=0,powered=false] +minecraft:note_block[instrument=snare,note=1,powered=false]: minecraft:note_block[instrument=harp,note=1,powered=false] +minecraft:note_block[instrument=snare,note=2,powered=false]: minecraft:note_block[instrument=harp,note=2,powered=false] +minecraft:note_block[instrument=snare,note=3,powered=false]: minecraft:note_block[instrument=harp,note=3,powered=false] +minecraft:note_block[instrument=snare,note=4,powered=false]: minecraft:note_block[instrument=harp,note=4,powered=false] +minecraft:note_block[instrument=snare,note=5,powered=false]: minecraft:note_block[instrument=harp,note=5,powered=false] +minecraft:note_block[instrument=snare,note=6,powered=false]: minecraft:note_block[instrument=harp,note=6,powered=false] +minecraft:note_block[instrument=snare,note=7,powered=false]: minecraft:note_block[instrument=harp,note=7,powered=false] +minecraft:note_block[instrument=snare,note=8,powered=false]: minecraft:note_block[instrument=harp,note=8,powered=false] +minecraft:note_block[instrument=snare,note=9,powered=false]: minecraft:note_block[instrument=harp,note=9,powered=false] +minecraft:note_block[instrument=snare,note=10,powered=false]: minecraft:note_block[instrument=harp,note=10,powered=false] +minecraft:note_block[instrument=snare,note=11,powered=false]: minecraft:note_block[instrument=harp,note=11,powered=false] +minecraft:note_block[instrument=snare,note=12,powered=false]: minecraft:note_block[instrument=harp,note=12,powered=false] +minecraft:note_block[instrument=snare,note=13,powered=false]: minecraft:note_block[instrument=harp,note=13,powered=false] +minecraft:note_block[instrument=snare,note=14,powered=false]: minecraft:note_block[instrument=harp,note=14,powered=false] +minecraft:note_block[instrument=snare,note=15,powered=false]: minecraft:note_block[instrument=harp,note=15,powered=false] +minecraft:note_block[instrument=snare,note=16,powered=false]: minecraft:note_block[instrument=harp,note=16,powered=false] +minecraft:note_block[instrument=snare,note=17,powered=false]: minecraft:note_block[instrument=harp,note=17,powered=false] +minecraft:note_block[instrument=snare,note=18,powered=false]: minecraft:note_block[instrument=harp,note=18,powered=false] +minecraft:note_block[instrument=snare,note=19,powered=false]: minecraft:note_block[instrument=harp,note=19,powered=false] +minecraft:note_block[instrument=snare,note=20,powered=false]: minecraft:note_block[instrument=harp,note=20,powered=false] +minecraft:note_block[instrument=snare,note=21,powered=false]: minecraft:note_block[instrument=harp,note=21,powered=false] +minecraft:note_block[instrument=snare,note=22,powered=false]: minecraft:note_block[instrument=harp,note=22,powered=false] +minecraft:note_block[instrument=snare,note=23,powered=false]: minecraft:note_block[instrument=harp,note=23,powered=false] +minecraft:note_block[instrument=snare,note=24,powered=false]: minecraft:note_block[instrument=harp,note=24,powered=false] +minecraft:note_block[instrument=snare,note=0,powered=true]: minecraft:note_block[instrument=harp,note=0,powered=true] +minecraft:note_block[instrument=snare,note=1,powered=true]: minecraft:note_block[instrument=harp,note=1,powered=true] +minecraft:note_block[instrument=snare,note=2,powered=true]: minecraft:note_block[instrument=harp,note=2,powered=true] +minecraft:note_block[instrument=snare,note=3,powered=true]: minecraft:note_block[instrument=harp,note=3,powered=true] +minecraft:note_block[instrument=snare,note=4,powered=true]: minecraft:note_block[instrument=harp,note=4,powered=true] +minecraft:note_block[instrument=snare,note=5,powered=true]: minecraft:note_block[instrument=harp,note=5,powered=true] +minecraft:note_block[instrument=snare,note=6,powered=true]: minecraft:note_block[instrument=harp,note=6,powered=true] +minecraft:note_block[instrument=snare,note=7,powered=true]: minecraft:note_block[instrument=harp,note=7,powered=true] +minecraft:note_block[instrument=snare,note=8,powered=true]: minecraft:note_block[instrument=harp,note=8,powered=true] +minecraft:note_block[instrument=snare,note=9,powered=true]: minecraft:note_block[instrument=harp,note=9,powered=true] +minecraft:note_block[instrument=snare,note=10,powered=true]: minecraft:note_block[instrument=harp,note=10,powered=true] +minecraft:note_block[instrument=snare,note=11,powered=true]: minecraft:note_block[instrument=harp,note=11,powered=true] +minecraft:note_block[instrument=snare,note=12,powered=true]: minecraft:note_block[instrument=harp,note=12,powered=true] +minecraft:note_block[instrument=snare,note=13,powered=true]: minecraft:note_block[instrument=harp,note=13,powered=true] +minecraft:note_block[instrument=snare,note=14,powered=true]: minecraft:note_block[instrument=harp,note=14,powered=true] +minecraft:note_block[instrument=snare,note=15,powered=true]: minecraft:note_block[instrument=harp,note=15,powered=true] +minecraft:note_block[instrument=snare,note=16,powered=true]: minecraft:note_block[instrument=harp,note=16,powered=true] +minecraft:note_block[instrument=snare,note=17,powered=true]: minecraft:note_block[instrument=harp,note=17,powered=true] +minecraft:note_block[instrument=snare,note=18,powered=true]: minecraft:note_block[instrument=harp,note=18,powered=true] +minecraft:note_block[instrument=snare,note=19,powered=true]: minecraft:note_block[instrument=harp,note=19,powered=true] +minecraft:note_block[instrument=snare,note=20,powered=true]: minecraft:note_block[instrument=harp,note=20,powered=true] +minecraft:note_block[instrument=snare,note=21,powered=true]: minecraft:note_block[instrument=harp,note=21,powered=true] +minecraft:note_block[instrument=snare,note=22,powered=true]: minecraft:note_block[instrument=harp,note=22,powered=true] +minecraft:note_block[instrument=snare,note=23,powered=true]: minecraft:note_block[instrument=harp,note=23,powered=true] +minecraft:note_block[instrument=snare,note=24,powered=true]: minecraft:note_block[instrument=harp,note=24,powered=true] +minecraft:note_block[instrument=bass,note=0,powered=false]: minecraft:note_block[instrument=harp,note=0,powered=false] +minecraft:note_block[instrument=bass,note=1,powered=false]: minecraft:note_block[instrument=harp,note=1,powered=false] +minecraft:note_block[instrument=bass,note=2,powered=false]: minecraft:note_block[instrument=harp,note=2,powered=false] +minecraft:note_block[instrument=bass,note=3,powered=false]: minecraft:note_block[instrument=harp,note=3,powered=false] +minecraft:note_block[instrument=bass,note=4,powered=false]: minecraft:note_block[instrument=harp,note=4,powered=false] +minecraft:note_block[instrument=bass,note=5,powered=false]: minecraft:note_block[instrument=harp,note=5,powered=false] +minecraft:note_block[instrument=bass,note=6,powered=false]: minecraft:note_block[instrument=harp,note=6,powered=false] +minecraft:note_block[instrument=bass,note=7,powered=false]: minecraft:note_block[instrument=harp,note=7,powered=false] +minecraft:note_block[instrument=bass,note=8,powered=false]: minecraft:note_block[instrument=harp,note=8,powered=false] +minecraft:note_block[instrument=bass,note=9,powered=false]: minecraft:note_block[instrument=harp,note=9,powered=false] +minecraft:note_block[instrument=bass,note=10,powered=false]: minecraft:note_block[instrument=harp,note=10,powered=false] +minecraft:note_block[instrument=bass,note=11,powered=false]: minecraft:note_block[instrument=harp,note=11,powered=false] +minecraft:note_block[instrument=bass,note=12,powered=false]: minecraft:note_block[instrument=harp,note=12,powered=false] +minecraft:note_block[instrument=bass,note=13,powered=false]: minecraft:note_block[instrument=harp,note=13,powered=false] +minecraft:note_block[instrument=bass,note=14,powered=false]: minecraft:note_block[instrument=harp,note=14,powered=false] +minecraft:note_block[instrument=bass,note=15,powered=false]: minecraft:note_block[instrument=harp,note=15,powered=false] +minecraft:note_block[instrument=bass,note=16,powered=false]: minecraft:note_block[instrument=harp,note=16,powered=false] +minecraft:note_block[instrument=bass,note=17,powered=false]: minecraft:note_block[instrument=harp,note=17,powered=false] +minecraft:note_block[instrument=bass,note=18,powered=false]: minecraft:note_block[instrument=harp,note=18,powered=false] +minecraft:note_block[instrument=bass,note=19,powered=false]: minecraft:note_block[instrument=harp,note=19,powered=false] +minecraft:note_block[instrument=bass,note=20,powered=false]: minecraft:note_block[instrument=harp,note=20,powered=false] +minecraft:note_block[instrument=bass,note=21,powered=false]: minecraft:note_block[instrument=harp,note=21,powered=false] +minecraft:note_block[instrument=bass,note=22,powered=false]: minecraft:note_block[instrument=harp,note=22,powered=false] +minecraft:note_block[instrument=bass,note=23,powered=false]: minecraft:note_block[instrument=harp,note=23,powered=false] +minecraft:note_block[instrument=bass,note=24,powered=false]: minecraft:note_block[instrument=harp,note=24,powered=false] +minecraft:note_block[instrument=bass,note=0,powered=true]: minecraft:note_block[instrument=harp,note=0,powered=true] +minecraft:note_block[instrument=bass,note=1,powered=true]: minecraft:note_block[instrument=harp,note=1,powered=true] +minecraft:note_block[instrument=bass,note=2,powered=true]: minecraft:note_block[instrument=harp,note=2,powered=true] +minecraft:note_block[instrument=bass,note=3,powered=true]: minecraft:note_block[instrument=harp,note=3,powered=true] +minecraft:note_block[instrument=bass,note=4,powered=true]: minecraft:note_block[instrument=harp,note=4,powered=true] +minecraft:note_block[instrument=bass,note=5,powered=true]: minecraft:note_block[instrument=harp,note=5,powered=true] +minecraft:note_block[instrument=bass,note=6,powered=true]: minecraft:note_block[instrument=harp,note=6,powered=true] +minecraft:note_block[instrument=bass,note=7,powered=true]: minecraft:note_block[instrument=harp,note=7,powered=true] +minecraft:note_block[instrument=bass,note=8,powered=true]: minecraft:note_block[instrument=harp,note=8,powered=true] +minecraft:note_block[instrument=bass,note=9,powered=true]: minecraft:note_block[instrument=harp,note=9,powered=true] +minecraft:note_block[instrument=bass,note=10,powered=true]: minecraft:note_block[instrument=harp,note=10,powered=true] +minecraft:note_block[instrument=bass,note=11,powered=true]: minecraft:note_block[instrument=harp,note=11,powered=true] +minecraft:note_block[instrument=bass,note=12,powered=true]: minecraft:note_block[instrument=harp,note=12,powered=true] +minecraft:note_block[instrument=bass,note=13,powered=true]: minecraft:note_block[instrument=harp,note=13,powered=true] +minecraft:note_block[instrument=bass,note=14,powered=true]: minecraft:note_block[instrument=harp,note=14,powered=true] +minecraft:note_block[instrument=bass,note=15,powered=true]: minecraft:note_block[instrument=harp,note=15,powered=true] +minecraft:note_block[instrument=bass,note=16,powered=true]: minecraft:note_block[instrument=harp,note=16,powered=true] +minecraft:note_block[instrument=bass,note=17,powered=true]: minecraft:note_block[instrument=harp,note=17,powered=true] +minecraft:note_block[instrument=bass,note=18,powered=true]: minecraft:note_block[instrument=harp,note=18,powered=true] +minecraft:note_block[instrument=bass,note=19,powered=true]: minecraft:note_block[instrument=harp,note=19,powered=true] +minecraft:note_block[instrument=bass,note=20,powered=true]: minecraft:note_block[instrument=harp,note=20,powered=true] +minecraft:note_block[instrument=bass,note=21,powered=true]: minecraft:note_block[instrument=harp,note=21,powered=true] +minecraft:note_block[instrument=bass,note=22,powered=true]: minecraft:note_block[instrument=harp,note=22,powered=true] +minecraft:note_block[instrument=bass,note=23,powered=true]: minecraft:note_block[instrument=harp,note=23,powered=true] +minecraft:note_block[instrument=bass,note=24,powered=true]: minecraft:note_block[instrument=harp,note=24,powered=true] +minecraft:note_block[instrument=flute,note=0,powered=false]: minecraft:note_block[instrument=harp,note=0,powered=false] +minecraft:note_block[instrument=flute,note=1,powered=false]: minecraft:note_block[instrument=harp,note=1,powered=false] +minecraft:note_block[instrument=flute,note=2,powered=false]: minecraft:note_block[instrument=harp,note=2,powered=false] +minecraft:note_block[instrument=flute,note=3,powered=false]: minecraft:note_block[instrument=harp,note=3,powered=false] +minecraft:note_block[instrument=flute,note=4,powered=false]: minecraft:note_block[instrument=harp,note=4,powered=false] +minecraft:note_block[instrument=flute,note=5,powered=false]: minecraft:note_block[instrument=harp,note=5,powered=false] +minecraft:note_block[instrument=flute,note=6,powered=false]: minecraft:note_block[instrument=harp,note=6,powered=false] +minecraft:note_block[instrument=flute,note=7,powered=false]: minecraft:note_block[instrument=harp,note=7,powered=false] +minecraft:note_block[instrument=flute,note=8,powered=false]: minecraft:note_block[instrument=harp,note=8,powered=false] +minecraft:note_block[instrument=flute,note=9,powered=false]: minecraft:note_block[instrument=harp,note=9,powered=false] +minecraft:note_block[instrument=flute,note=10,powered=false]: minecraft:note_block[instrument=harp,note=10,powered=false] +minecraft:note_block[instrument=flute,note=11,powered=false]: minecraft:note_block[instrument=harp,note=11,powered=false] +minecraft:note_block[instrument=flute,note=12,powered=false]: minecraft:note_block[instrument=harp,note=12,powered=false] +minecraft:note_block[instrument=flute,note=13,powered=false]: minecraft:note_block[instrument=harp,note=13,powered=false] +minecraft:note_block[instrument=flute,note=14,powered=false]: minecraft:note_block[instrument=harp,note=14,powered=false] +minecraft:note_block[instrument=flute,note=15,powered=false]: minecraft:note_block[instrument=harp,note=15,powered=false] +minecraft:note_block[instrument=flute,note=16,powered=false]: minecraft:note_block[instrument=harp,note=16,powered=false] +minecraft:note_block[instrument=flute,note=17,powered=false]: minecraft:note_block[instrument=harp,note=17,powered=false] +minecraft:note_block[instrument=flute,note=18,powered=false]: minecraft:note_block[instrument=harp,note=18,powered=false] +minecraft:note_block[instrument=flute,note=19,powered=false]: minecraft:note_block[instrument=harp,note=19,powered=false] +minecraft:note_block[instrument=flute,note=20,powered=false]: minecraft:note_block[instrument=harp,note=20,powered=false] +minecraft:note_block[instrument=flute,note=21,powered=false]: minecraft:note_block[instrument=harp,note=21,powered=false] +minecraft:note_block[instrument=flute,note=22,powered=false]: minecraft:note_block[instrument=harp,note=22,powered=false] +minecraft:note_block[instrument=flute,note=23,powered=false]: minecraft:note_block[instrument=harp,note=23,powered=false] +minecraft:note_block[instrument=flute,note=24,powered=false]: minecraft:note_block[instrument=harp,note=24,powered=false] +minecraft:note_block[instrument=flute,note=0,powered=true]: minecraft:note_block[instrument=harp,note=0,powered=true] +minecraft:note_block[instrument=flute,note=1,powered=true]: minecraft:note_block[instrument=harp,note=1,powered=true] +minecraft:note_block[instrument=flute,note=2,powered=true]: minecraft:note_block[instrument=harp,note=2,powered=true] +minecraft:note_block[instrument=flute,note=3,powered=true]: minecraft:note_block[instrument=harp,note=3,powered=true] +minecraft:note_block[instrument=flute,note=4,powered=true]: minecraft:note_block[instrument=harp,note=4,powered=true] +minecraft:note_block[instrument=flute,note=5,powered=true]: minecraft:note_block[instrument=harp,note=5,powered=true] +minecraft:note_block[instrument=flute,note=6,powered=true]: minecraft:note_block[instrument=harp,note=6,powered=true] +minecraft:note_block[instrument=flute,note=7,powered=true]: minecraft:note_block[instrument=harp,note=7,powered=true] +minecraft:note_block[instrument=flute,note=8,powered=true]: minecraft:note_block[instrument=harp,note=8,powered=true] +minecraft:note_block[instrument=flute,note=9,powered=true]: minecraft:note_block[instrument=harp,note=9,powered=true] +minecraft:note_block[instrument=flute,note=10,powered=true]: minecraft:note_block[instrument=harp,note=10,powered=true] +minecraft:note_block[instrument=flute,note=11,powered=true]: minecraft:note_block[instrument=harp,note=11,powered=true] +minecraft:note_block[instrument=flute,note=12,powered=true]: minecraft:note_block[instrument=harp,note=12,powered=true] +minecraft:note_block[instrument=flute,note=13,powered=true]: minecraft:note_block[instrument=harp,note=13,powered=true] +minecraft:note_block[instrument=flute,note=14,powered=true]: minecraft:note_block[instrument=harp,note=14,powered=true] +minecraft:note_block[instrument=flute,note=15,powered=true]: minecraft:note_block[instrument=harp,note=15,powered=true] +minecraft:note_block[instrument=flute,note=16,powered=true]: minecraft:note_block[instrument=harp,note=16,powered=true] +minecraft:note_block[instrument=flute,note=17,powered=true]: minecraft:note_block[instrument=harp,note=17,powered=true] +minecraft:note_block[instrument=flute,note=18,powered=true]: minecraft:note_block[instrument=harp,note=18,powered=true] +minecraft:note_block[instrument=flute,note=19,powered=true]: minecraft:note_block[instrument=harp,note=19,powered=true] +minecraft:note_block[instrument=flute,note=20,powered=true]: minecraft:note_block[instrument=harp,note=20,powered=true] +minecraft:note_block[instrument=flute,note=21,powered=true]: minecraft:note_block[instrument=harp,note=21,powered=true] +minecraft:note_block[instrument=flute,note=22,powered=true]: minecraft:note_block[instrument=harp,note=22,powered=true] +minecraft:note_block[instrument=flute,note=23,powered=true]: minecraft:note_block[instrument=harp,note=23,powered=true] +minecraft:note_block[instrument=flute,note=24,powered=true]: minecraft:note_block[instrument=harp,note=24,powered=true] +minecraft:note_block[instrument=bell,note=0,powered=false]: minecraft:note_block[instrument=harp,note=0,powered=false] +minecraft:note_block[instrument=bell,note=1,powered=false]: minecraft:note_block[instrument=harp,note=1,powered=false] +minecraft:note_block[instrument=bell,note=2,powered=false]: minecraft:note_block[instrument=harp,note=2,powered=false] +minecraft:note_block[instrument=bell,note=3,powered=false]: minecraft:note_block[instrument=harp,note=3,powered=false] +minecraft:note_block[instrument=bell,note=4,powered=false]: minecraft:note_block[instrument=harp,note=4,powered=false] +minecraft:note_block[instrument=bell,note=5,powered=false]: minecraft:note_block[instrument=harp,note=5,powered=false] +minecraft:note_block[instrument=bell,note=6,powered=false]: minecraft:note_block[instrument=harp,note=6,powered=false] +minecraft:note_block[instrument=bell,note=7,powered=false]: minecraft:note_block[instrument=harp,note=7,powered=false] +minecraft:note_block[instrument=bell,note=8,powered=false]: minecraft:note_block[instrument=harp,note=8,powered=false] +minecraft:note_block[instrument=bell,note=9,powered=false]: minecraft:note_block[instrument=harp,note=9,powered=false] +minecraft:note_block[instrument=bell,note=10,powered=false]: minecraft:note_block[instrument=harp,note=10,powered=false] +minecraft:note_block[instrument=bell,note=11,powered=false]: minecraft:note_block[instrument=harp,note=11,powered=false] +minecraft:note_block[instrument=bell,note=12,powered=false]: minecraft:note_block[instrument=harp,note=12,powered=false] +minecraft:note_block[instrument=bell,note=13,powered=false]: minecraft:note_block[instrument=harp,note=13,powered=false] +minecraft:note_block[instrument=bell,note=14,powered=false]: minecraft:note_block[instrument=harp,note=14,powered=false] +minecraft:note_block[instrument=bell,note=15,powered=false]: minecraft:note_block[instrument=harp,note=15,powered=false] +minecraft:note_block[instrument=bell,note=16,powered=false]: minecraft:note_block[instrument=harp,note=16,powered=false] +minecraft:note_block[instrument=bell,note=17,powered=false]: minecraft:note_block[instrument=harp,note=17,powered=false] +minecraft:note_block[instrument=bell,note=18,powered=false]: minecraft:note_block[instrument=harp,note=18,powered=false] +minecraft:note_block[instrument=bell,note=19,powered=false]: minecraft:note_block[instrument=harp,note=19,powered=false] +minecraft:note_block[instrument=bell,note=20,powered=false]: minecraft:note_block[instrument=harp,note=20,powered=false] +minecraft:note_block[instrument=bell,note=21,powered=false]: minecraft:note_block[instrument=harp,note=21,powered=false] +minecraft:note_block[instrument=bell,note=22,powered=false]: minecraft:note_block[instrument=harp,note=22,powered=false] +minecraft:note_block[instrument=bell,note=23,powered=false]: minecraft:note_block[instrument=harp,note=23,powered=false] +minecraft:note_block[instrument=bell,note=24,powered=false]: minecraft:note_block[instrument=harp,note=24,powered=false] +minecraft:note_block[instrument=bell,note=0,powered=true]: minecraft:note_block[instrument=harp,note=0,powered=true] +minecraft:note_block[instrument=bell,note=1,powered=true]: minecraft:note_block[instrument=harp,note=1,powered=true] +minecraft:note_block[instrument=bell,note=2,powered=true]: minecraft:note_block[instrument=harp,note=2,powered=true] +minecraft:note_block[instrument=bell,note=3,powered=true]: minecraft:note_block[instrument=harp,note=3,powered=true] +minecraft:note_block[instrument=bell,note=4,powered=true]: minecraft:note_block[instrument=harp,note=4,powered=true] +minecraft:note_block[instrument=bell,note=5,powered=true]: minecraft:note_block[instrument=harp,note=5,powered=true] +minecraft:note_block[instrument=bell,note=6,powered=true]: minecraft:note_block[instrument=harp,note=6,powered=true] +minecraft:note_block[instrument=bell,note=7,powered=true]: minecraft:note_block[instrument=harp,note=7,powered=true] +minecraft:note_block[instrument=bell,note=8,powered=true]: minecraft:note_block[instrument=harp,note=8,powered=true] +minecraft:note_block[instrument=bell,note=9,powered=true]: minecraft:note_block[instrument=harp,note=9,powered=true] +minecraft:note_block[instrument=bell,note=10,powered=true]: minecraft:note_block[instrument=harp,note=10,powered=true] +minecraft:note_block[instrument=bell,note=11,powered=true]: minecraft:note_block[instrument=harp,note=11,powered=true] +minecraft:note_block[instrument=bell,note=12,powered=true]: minecraft:note_block[instrument=harp,note=12,powered=true] +minecraft:note_block[instrument=bell,note=13,powered=true]: minecraft:note_block[instrument=harp,note=13,powered=true] +minecraft:note_block[instrument=bell,note=14,powered=true]: minecraft:note_block[instrument=harp,note=14,powered=true] +minecraft:note_block[instrument=bell,note=15,powered=true]: minecraft:note_block[instrument=harp,note=15,powered=true] +minecraft:note_block[instrument=bell,note=16,powered=true]: minecraft:note_block[instrument=harp,note=16,powered=true] +minecraft:note_block[instrument=bell,note=17,powered=true]: minecraft:note_block[instrument=harp,note=17,powered=true] +minecraft:note_block[instrument=bell,note=18,powered=true]: minecraft:note_block[instrument=harp,note=18,powered=true] +minecraft:note_block[instrument=bell,note=19,powered=true]: minecraft:note_block[instrument=harp,note=19,powered=true] +minecraft:note_block[instrument=bell,note=20,powered=true]: minecraft:note_block[instrument=harp,note=20,powered=true] +minecraft:note_block[instrument=bell,note=21,powered=true]: minecraft:note_block[instrument=harp,note=21,powered=true] +minecraft:note_block[instrument=bell,note=22,powered=true]: minecraft:note_block[instrument=harp,note=22,powered=true] +minecraft:note_block[instrument=bell,note=23,powered=true]: minecraft:note_block[instrument=harp,note=23,powered=true] +minecraft:note_block[instrument=bell,note=24,powered=true]: minecraft:note_block[instrument=harp,note=24,powered=true] +minecraft:note_block[instrument=guitar,note=0,powered=false]: minecraft:note_block[instrument=harp,note=0,powered=false] +minecraft:note_block[instrument=guitar,note=1,powered=false]: minecraft:note_block[instrument=harp,note=1,powered=false] +minecraft:note_block[instrument=guitar,note=2,powered=false]: minecraft:note_block[instrument=harp,note=2,powered=false] +minecraft:note_block[instrument=guitar,note=3,powered=false]: minecraft:note_block[instrument=harp,note=3,powered=false] +minecraft:note_block[instrument=guitar,note=4,powered=false]: minecraft:note_block[instrument=harp,note=4,powered=false] +minecraft:note_block[instrument=guitar,note=5,powered=false]: minecraft:note_block[instrument=harp,note=5,powered=false] +minecraft:note_block[instrument=guitar,note=6,powered=false]: minecraft:note_block[instrument=harp,note=6,powered=false] +minecraft:note_block[instrument=guitar,note=7,powered=false]: minecraft:note_block[instrument=harp,note=7,powered=false] +minecraft:note_block[instrument=guitar,note=8,powered=false]: minecraft:note_block[instrument=harp,note=8,powered=false] +minecraft:note_block[instrument=guitar,note=9,powered=false]: minecraft:note_block[instrument=harp,note=9,powered=false] +minecraft:note_block[instrument=guitar,note=10,powered=false]: minecraft:note_block[instrument=harp,note=10,powered=false] +minecraft:note_block[instrument=guitar,note=11,powered=false]: minecraft:note_block[instrument=harp,note=11,powered=false] +minecraft:note_block[instrument=guitar,note=12,powered=false]: minecraft:note_block[instrument=harp,note=12,powered=false] +minecraft:note_block[instrument=guitar,note=13,powered=false]: minecraft:note_block[instrument=harp,note=13,powered=false] +minecraft:note_block[instrument=guitar,note=14,powered=false]: minecraft:note_block[instrument=harp,note=14,powered=false] +minecraft:note_block[instrument=guitar,note=15,powered=false]: minecraft:note_block[instrument=harp,note=15,powered=false] +minecraft:note_block[instrument=guitar,note=16,powered=false]: minecraft:note_block[instrument=harp,note=16,powered=false] +minecraft:note_block[instrument=guitar,note=17,powered=false]: minecraft:note_block[instrument=harp,note=17,powered=false] +minecraft:note_block[instrument=guitar,note=18,powered=false]: minecraft:note_block[instrument=harp,note=18,powered=false] +minecraft:note_block[instrument=guitar,note=19,powered=false]: minecraft:note_block[instrument=harp,note=19,powered=false] +minecraft:note_block[instrument=guitar,note=20,powered=false]: minecraft:note_block[instrument=harp,note=20,powered=false] +minecraft:note_block[instrument=guitar,note=21,powered=false]: minecraft:note_block[instrument=harp,note=21,powered=false] +minecraft:note_block[instrument=guitar,note=22,powered=false]: minecraft:note_block[instrument=harp,note=22,powered=false] +minecraft:note_block[instrument=guitar,note=23,powered=false]: minecraft:note_block[instrument=harp,note=23,powered=false] +minecraft:note_block[instrument=guitar,note=24,powered=false]: minecraft:note_block[instrument=harp,note=24,powered=false] +minecraft:note_block[instrument=guitar,note=0,powered=true]: minecraft:note_block[instrument=harp,note=0,powered=true] +minecraft:note_block[instrument=guitar,note=1,powered=true]: minecraft:note_block[instrument=harp,note=1,powered=true] +minecraft:note_block[instrument=guitar,note=2,powered=true]: minecraft:note_block[instrument=harp,note=2,powered=true] +minecraft:note_block[instrument=guitar,note=3,powered=true]: minecraft:note_block[instrument=harp,note=3,powered=true] +minecraft:note_block[instrument=guitar,note=4,powered=true]: minecraft:note_block[instrument=harp,note=4,powered=true] +minecraft:note_block[instrument=guitar,note=5,powered=true]: minecraft:note_block[instrument=harp,note=5,powered=true] +minecraft:note_block[instrument=guitar,note=6,powered=true]: minecraft:note_block[instrument=harp,note=6,powered=true] +minecraft:note_block[instrument=guitar,note=7,powered=true]: minecraft:note_block[instrument=harp,note=7,powered=true] +minecraft:note_block[instrument=guitar,note=8,powered=true]: minecraft:note_block[instrument=harp,note=8,powered=true] +minecraft:note_block[instrument=guitar,note=9,powered=true]: minecraft:note_block[instrument=harp,note=9,powered=true] +minecraft:note_block[instrument=guitar,note=10,powered=true]: minecraft:note_block[instrument=harp,note=10,powered=true] +minecraft:note_block[instrument=guitar,note=11,powered=true]: minecraft:note_block[instrument=harp,note=11,powered=true] +minecraft:note_block[instrument=guitar,note=12,powered=true]: minecraft:note_block[instrument=harp,note=12,powered=true] +minecraft:note_block[instrument=guitar,note=13,powered=true]: minecraft:note_block[instrument=harp,note=13,powered=true] +minecraft:note_block[instrument=guitar,note=14,powered=true]: minecraft:note_block[instrument=harp,note=14,powered=true] +minecraft:note_block[instrument=guitar,note=15,powered=true]: minecraft:note_block[instrument=harp,note=15,powered=true] +minecraft:note_block[instrument=guitar,note=16,powered=true]: minecraft:note_block[instrument=harp,note=16,powered=true] +minecraft:note_block[instrument=guitar,note=17,powered=true]: minecraft:note_block[instrument=harp,note=17,powered=true] +minecraft:note_block[instrument=guitar,note=18,powered=true]: minecraft:note_block[instrument=harp,note=18,powered=true] +minecraft:note_block[instrument=guitar,note=19,powered=true]: minecraft:note_block[instrument=harp,note=19,powered=true] +minecraft:note_block[instrument=guitar,note=20,powered=true]: minecraft:note_block[instrument=harp,note=20,powered=true] +minecraft:note_block[instrument=guitar,note=21,powered=true]: minecraft:note_block[instrument=harp,note=21,powered=true] +minecraft:note_block[instrument=guitar,note=22,powered=true]: minecraft:note_block[instrument=harp,note=22,powered=true] +minecraft:note_block[instrument=guitar,note=23,powered=true]: minecraft:note_block[instrument=harp,note=23,powered=true] +minecraft:note_block[instrument=guitar,note=24,powered=true]: minecraft:note_block[instrument=harp,note=24,powered=true] +minecraft:note_block[instrument=chime,note=0,powered=false]: minecraft:note_block[instrument=harp,note=0,powered=false] +minecraft:note_block[instrument=chime,note=1,powered=false]: minecraft:note_block[instrument=harp,note=1,powered=false] +minecraft:note_block[instrument=chime,note=2,powered=false]: minecraft:note_block[instrument=harp,note=2,powered=false] +minecraft:note_block[instrument=chime,note=3,powered=false]: minecraft:note_block[instrument=harp,note=3,powered=false] +minecraft:note_block[instrument=chime,note=4,powered=false]: minecraft:note_block[instrument=harp,note=4,powered=false] +minecraft:note_block[instrument=chime,note=5,powered=false]: minecraft:note_block[instrument=harp,note=5,powered=false] +minecraft:note_block[instrument=chime,note=6,powered=false]: minecraft:note_block[instrument=harp,note=6,powered=false] +minecraft:note_block[instrument=chime,note=7,powered=false]: minecraft:note_block[instrument=harp,note=7,powered=false] +minecraft:note_block[instrument=chime,note=8,powered=false]: minecraft:note_block[instrument=harp,note=8,powered=false] +minecraft:note_block[instrument=chime,note=9,powered=false]: minecraft:note_block[instrument=harp,note=9,powered=false] +minecraft:note_block[instrument=chime,note=10,powered=false]: minecraft:note_block[instrument=harp,note=10,powered=false] +minecraft:note_block[instrument=chime,note=11,powered=false]: minecraft:note_block[instrument=harp,note=11,powered=false] +minecraft:note_block[instrument=chime,note=12,powered=false]: minecraft:note_block[instrument=harp,note=12,powered=false] +minecraft:note_block[instrument=chime,note=13,powered=false]: minecraft:note_block[instrument=harp,note=13,powered=false] +minecraft:note_block[instrument=chime,note=14,powered=false]: minecraft:note_block[instrument=harp,note=14,powered=false] +minecraft:note_block[instrument=chime,note=15,powered=false]: minecraft:note_block[instrument=harp,note=15,powered=false] +minecraft:note_block[instrument=chime,note=16,powered=false]: minecraft:note_block[instrument=harp,note=16,powered=false] +minecraft:note_block[instrument=chime,note=17,powered=false]: minecraft:note_block[instrument=harp,note=17,powered=false] +minecraft:note_block[instrument=chime,note=18,powered=false]: minecraft:note_block[instrument=harp,note=18,powered=false] +minecraft:note_block[instrument=chime,note=19,powered=false]: minecraft:note_block[instrument=harp,note=19,powered=false] +minecraft:note_block[instrument=chime,note=20,powered=false]: minecraft:note_block[instrument=harp,note=20,powered=false] +minecraft:note_block[instrument=chime,note=21,powered=false]: minecraft:note_block[instrument=harp,note=21,powered=false] +minecraft:note_block[instrument=chime,note=22,powered=false]: minecraft:note_block[instrument=harp,note=22,powered=false] +minecraft:note_block[instrument=chime,note=23,powered=false]: minecraft:note_block[instrument=harp,note=23,powered=false] +minecraft:note_block[instrument=chime,note=24,powered=false]: minecraft:note_block[instrument=harp,note=24,powered=false] +minecraft:note_block[instrument=chime,note=0,powered=true]: minecraft:note_block[instrument=harp,note=0,powered=true] +minecraft:note_block[instrument=chime,note=1,powered=true]: minecraft:note_block[instrument=harp,note=1,powered=true] +minecraft:note_block[instrument=chime,note=2,powered=true]: minecraft:note_block[instrument=harp,note=2,powered=true] +minecraft:note_block[instrument=chime,note=3,powered=true]: minecraft:note_block[instrument=harp,note=3,powered=true] +minecraft:note_block[instrument=chime,note=4,powered=true]: minecraft:note_block[instrument=harp,note=4,powered=true] +minecraft:note_block[instrument=chime,note=5,powered=true]: minecraft:note_block[instrument=harp,note=5,powered=true] +minecraft:note_block[instrument=chime,note=6,powered=true]: minecraft:note_block[instrument=harp,note=6,powered=true] +minecraft:note_block[instrument=chime,note=7,powered=true]: minecraft:note_block[instrument=harp,note=7,powered=true] +minecraft:note_block[instrument=chime,note=8,powered=true]: minecraft:note_block[instrument=harp,note=8,powered=true] +minecraft:note_block[instrument=chime,note=9,powered=true]: minecraft:note_block[instrument=harp,note=9,powered=true] +minecraft:note_block[instrument=chime,note=10,powered=true]: minecraft:note_block[instrument=harp,note=10,powered=true] +minecraft:note_block[instrument=chime,note=11,powered=true]: minecraft:note_block[instrument=harp,note=11,powered=true] +minecraft:note_block[instrument=chime,note=12,powered=true]: minecraft:note_block[instrument=harp,note=12,powered=true] +minecraft:note_block[instrument=chime,note=13,powered=true]: minecraft:note_block[instrument=harp,note=13,powered=true] +minecraft:note_block[instrument=chime,note=14,powered=true]: minecraft:note_block[instrument=harp,note=14,powered=true] +minecraft:note_block[instrument=chime,note=15,powered=true]: minecraft:note_block[instrument=harp,note=15,powered=true] +minecraft:note_block[instrument=chime,note=16,powered=true]: minecraft:note_block[instrument=harp,note=16,powered=true] +minecraft:note_block[instrument=chime,note=17,powered=true]: minecraft:note_block[instrument=harp,note=17,powered=true] +minecraft:note_block[instrument=chime,note=18,powered=true]: minecraft:note_block[instrument=harp,note=18,powered=true] +minecraft:note_block[instrument=chime,note=19,powered=true]: minecraft:note_block[instrument=harp,note=19,powered=true] +minecraft:note_block[instrument=chime,note=20,powered=true]: minecraft:note_block[instrument=harp,note=20,powered=true] +minecraft:note_block[instrument=chime,note=21,powered=true]: minecraft:note_block[instrument=harp,note=21,powered=true] +minecraft:note_block[instrument=chime,note=22,powered=true]: minecraft:note_block[instrument=harp,note=22,powered=true] +minecraft:note_block[instrument=chime,note=23,powered=true]: minecraft:note_block[instrument=harp,note=23,powered=true] +minecraft:note_block[instrument=chime,note=24,powered=true]: minecraft:note_block[instrument=harp,note=24,powered=true] +minecraft:note_block[instrument=xylophone,note=0,powered=false]: minecraft:note_block[instrument=harp,note=0,powered=false] +minecraft:note_block[instrument=xylophone,note=1,powered=false]: minecraft:note_block[instrument=harp,note=1,powered=false] +minecraft:note_block[instrument=xylophone,note=2,powered=false]: minecraft:note_block[instrument=harp,note=2,powered=false] +minecraft:note_block[instrument=xylophone,note=3,powered=false]: minecraft:note_block[instrument=harp,note=3,powered=false] +minecraft:note_block[instrument=xylophone,note=4,powered=false]: minecraft:note_block[instrument=harp,note=4,powered=false] +minecraft:note_block[instrument=xylophone,note=5,powered=false]: minecraft:note_block[instrument=harp,note=5,powered=false] +minecraft:note_block[instrument=xylophone,note=6,powered=false]: minecraft:note_block[instrument=harp,note=6,powered=false] +minecraft:note_block[instrument=xylophone,note=7,powered=false]: minecraft:note_block[instrument=harp,note=7,powered=false] +minecraft:note_block[instrument=xylophone,note=8,powered=false]: minecraft:note_block[instrument=harp,note=8,powered=false] +minecraft:note_block[instrument=xylophone,note=9,powered=false]: minecraft:note_block[instrument=harp,note=9,powered=false] +minecraft:note_block[instrument=xylophone,note=10,powered=false]: minecraft:note_block[instrument=harp,note=10,powered=false] +minecraft:note_block[instrument=xylophone,note=11,powered=false]: minecraft:note_block[instrument=harp,note=11,powered=false] +minecraft:note_block[instrument=xylophone,note=12,powered=false]: minecraft:note_block[instrument=harp,note=12,powered=false] +minecraft:note_block[instrument=xylophone,note=13,powered=false]: minecraft:note_block[instrument=harp,note=13,powered=false] +minecraft:note_block[instrument=xylophone,note=14,powered=false]: minecraft:note_block[instrument=harp,note=14,powered=false] +minecraft:note_block[instrument=xylophone,note=15,powered=false]: minecraft:note_block[instrument=harp,note=15,powered=false] +minecraft:note_block[instrument=xylophone,note=16,powered=false]: minecraft:note_block[instrument=harp,note=16,powered=false] +minecraft:note_block[instrument=xylophone,note=17,powered=false]: minecraft:note_block[instrument=harp,note=17,powered=false] +minecraft:note_block[instrument=xylophone,note=18,powered=false]: minecraft:note_block[instrument=harp,note=18,powered=false] +minecraft:note_block[instrument=xylophone,note=19,powered=false]: minecraft:note_block[instrument=harp,note=19,powered=false] +minecraft:note_block[instrument=xylophone,note=20,powered=false]: minecraft:note_block[instrument=harp,note=20,powered=false] +minecraft:note_block[instrument=xylophone,note=21,powered=false]: minecraft:note_block[instrument=harp,note=21,powered=false] +minecraft:note_block[instrument=xylophone,note=22,powered=false]: minecraft:note_block[instrument=harp,note=22,powered=false] +minecraft:note_block[instrument=xylophone,note=23,powered=false]: minecraft:note_block[instrument=harp,note=23,powered=false] +minecraft:note_block[instrument=xylophone,note=24,powered=false]: minecraft:note_block[instrument=harp,note=24,powered=false] +minecraft:note_block[instrument=xylophone,note=0,powered=true]: minecraft:note_block[instrument=harp,note=0,powered=true] +minecraft:note_block[instrument=xylophone,note=1,powered=true]: minecraft:note_block[instrument=harp,note=1,powered=true] +minecraft:note_block[instrument=xylophone,note=2,powered=true]: minecraft:note_block[instrument=harp,note=2,powered=true] +minecraft:note_block[instrument=xylophone,note=3,powered=true]: minecraft:note_block[instrument=harp,note=3,powered=true] +minecraft:note_block[instrument=xylophone,note=4,powered=true]: minecraft:note_block[instrument=harp,note=4,powered=true] +minecraft:note_block[instrument=xylophone,note=5,powered=true]: minecraft:note_block[instrument=harp,note=5,powered=true] +minecraft:note_block[instrument=xylophone,note=6,powered=true]: minecraft:note_block[instrument=harp,note=6,powered=true] +minecraft:note_block[instrument=xylophone,note=7,powered=true]: minecraft:note_block[instrument=harp,note=7,powered=true] +minecraft:note_block[instrument=xylophone,note=8,powered=true]: minecraft:note_block[instrument=harp,note=8,powered=true] +minecraft:note_block[instrument=xylophone,note=9,powered=true]: minecraft:note_block[instrument=harp,note=9,powered=true] +minecraft:note_block[instrument=xylophone,note=10,powered=true]: minecraft:note_block[instrument=harp,note=10,powered=true] +minecraft:note_block[instrument=xylophone,note=11,powered=true]: minecraft:note_block[instrument=harp,note=11,powered=true] +minecraft:note_block[instrument=xylophone,note=12,powered=true]: minecraft:note_block[instrument=harp,note=12,powered=true] +minecraft:note_block[instrument=xylophone,note=13,powered=true]: minecraft:note_block[instrument=harp,note=13,powered=true] +minecraft:note_block[instrument=xylophone,note=14,powered=true]: minecraft:note_block[instrument=harp,note=14,powered=true] +minecraft:note_block[instrument=xylophone,note=15,powered=true]: minecraft:note_block[instrument=harp,note=15,powered=true] +minecraft:note_block[instrument=xylophone,note=16,powered=true]: minecraft:note_block[instrument=harp,note=16,powered=true] +minecraft:note_block[instrument=xylophone,note=17,powered=true]: minecraft:note_block[instrument=harp,note=17,powered=true] +minecraft:note_block[instrument=xylophone,note=18,powered=true]: minecraft:note_block[instrument=harp,note=18,powered=true] +minecraft:note_block[instrument=xylophone,note=19,powered=true]: minecraft:note_block[instrument=harp,note=19,powered=true] +minecraft:note_block[instrument=xylophone,note=20,powered=true]: minecraft:note_block[instrument=harp,note=20,powered=true] +minecraft:note_block[instrument=xylophone,note=21,powered=true]: minecraft:note_block[instrument=harp,note=21,powered=true] +minecraft:note_block[instrument=xylophone,note=22,powered=true]: minecraft:note_block[instrument=harp,note=22,powered=true] +minecraft:note_block[instrument=xylophone,note=23,powered=true]: minecraft:note_block[instrument=harp,note=23,powered=true] +minecraft:note_block[instrument=xylophone,note=24,powered=true]: minecraft:note_block[instrument=harp,note=24,powered=true] +minecraft:note_block[instrument=iron_xylophone,note=0,powered=false]: minecraft:note_block[instrument=harp,note=0,powered=false] +minecraft:note_block[instrument=iron_xylophone,note=1,powered=false]: minecraft:note_block[instrument=harp,note=1,powered=false] +minecraft:note_block[instrument=iron_xylophone,note=2,powered=false]: minecraft:note_block[instrument=harp,note=2,powered=false] +minecraft:note_block[instrument=iron_xylophone,note=3,powered=false]: minecraft:note_block[instrument=harp,note=3,powered=false] +minecraft:note_block[instrument=iron_xylophone,note=4,powered=false]: minecraft:note_block[instrument=harp,note=4,powered=false] +minecraft:note_block[instrument=iron_xylophone,note=5,powered=false]: minecraft:note_block[instrument=harp,note=5,powered=false] +minecraft:note_block[instrument=iron_xylophone,note=6,powered=false]: minecraft:note_block[instrument=harp,note=6,powered=false] +minecraft:note_block[instrument=iron_xylophone,note=7,powered=false]: minecraft:note_block[instrument=harp,note=7,powered=false] +minecraft:note_block[instrument=iron_xylophone,note=8,powered=false]: minecraft:note_block[instrument=harp,note=8,powered=false] +minecraft:note_block[instrument=iron_xylophone,note=9,powered=false]: minecraft:note_block[instrument=harp,note=9,powered=false] +minecraft:note_block[instrument=iron_xylophone,note=10,powered=false]: minecraft:note_block[instrument=harp,note=10,powered=false] +minecraft:note_block[instrument=iron_xylophone,note=11,powered=false]: minecraft:note_block[instrument=harp,note=11,powered=false] +minecraft:note_block[instrument=iron_xylophone,note=12,powered=false]: minecraft:note_block[instrument=harp,note=12,powered=false] +minecraft:note_block[instrument=iron_xylophone,note=13,powered=false]: minecraft:note_block[instrument=harp,note=13,powered=false] +minecraft:note_block[instrument=iron_xylophone,note=14,powered=false]: minecraft:note_block[instrument=harp,note=14,powered=false] +minecraft:note_block[instrument=iron_xylophone,note=15,powered=false]: minecraft:note_block[instrument=harp,note=15,powered=false] +minecraft:note_block[instrument=iron_xylophone,note=16,powered=false]: minecraft:note_block[instrument=harp,note=16,powered=false] +minecraft:note_block[instrument=iron_xylophone,note=17,powered=false]: minecraft:note_block[instrument=harp,note=17,powered=false] +minecraft:note_block[instrument=iron_xylophone,note=18,powered=false]: minecraft:note_block[instrument=harp,note=18,powered=false] +minecraft:note_block[instrument=iron_xylophone,note=19,powered=false]: minecraft:note_block[instrument=harp,note=19,powered=false] +minecraft:note_block[instrument=iron_xylophone,note=20,powered=false]: minecraft:note_block[instrument=harp,note=20,powered=false] +minecraft:note_block[instrument=iron_xylophone,note=21,powered=false]: minecraft:note_block[instrument=harp,note=21,powered=false] +minecraft:note_block[instrument=iron_xylophone,note=22,powered=false]: minecraft:note_block[instrument=harp,note=22,powered=false] +minecraft:note_block[instrument=iron_xylophone,note=23,powered=false]: minecraft:note_block[instrument=harp,note=23,powered=false] +minecraft:note_block[instrument=iron_xylophone,note=24,powered=false]: minecraft:note_block[instrument=harp,note=24,powered=false] +minecraft:note_block[instrument=iron_xylophone,note=0,powered=true]: minecraft:note_block[instrument=harp,note=0,powered=true] +minecraft:note_block[instrument=iron_xylophone,note=1,powered=true]: minecraft:note_block[instrument=harp,note=1,powered=true] +minecraft:note_block[instrument=iron_xylophone,note=2,powered=true]: minecraft:note_block[instrument=harp,note=2,powered=true] +minecraft:note_block[instrument=iron_xylophone,note=3,powered=true]: minecraft:note_block[instrument=harp,note=3,powered=true] +minecraft:note_block[instrument=iron_xylophone,note=4,powered=true]: minecraft:note_block[instrument=harp,note=4,powered=true] +minecraft:note_block[instrument=iron_xylophone,note=5,powered=true]: minecraft:note_block[instrument=harp,note=5,powered=true] +minecraft:note_block[instrument=iron_xylophone,note=6,powered=true]: minecraft:note_block[instrument=harp,note=6,powered=true] +minecraft:note_block[instrument=iron_xylophone,note=7,powered=true]: minecraft:note_block[instrument=harp,note=7,powered=true] +minecraft:note_block[instrument=iron_xylophone,note=8,powered=true]: minecraft:note_block[instrument=harp,note=8,powered=true] +minecraft:note_block[instrument=iron_xylophone,note=9,powered=true]: minecraft:note_block[instrument=harp,note=9,powered=true] +minecraft:note_block[instrument=iron_xylophone,note=10,powered=true]: minecraft:note_block[instrument=harp,note=10,powered=true] +minecraft:note_block[instrument=iron_xylophone,note=11,powered=true]: minecraft:note_block[instrument=harp,note=11,powered=true] +minecraft:note_block[instrument=iron_xylophone,note=12,powered=true]: minecraft:note_block[instrument=harp,note=12,powered=true] +minecraft:note_block[instrument=iron_xylophone,note=13,powered=true]: minecraft:note_block[instrument=harp,note=13,powered=true] +minecraft:note_block[instrument=iron_xylophone,note=14,powered=true]: minecraft:note_block[instrument=harp,note=14,powered=true] +minecraft:note_block[instrument=iron_xylophone,note=15,powered=true]: minecraft:note_block[instrument=harp,note=15,powered=true] +minecraft:note_block[instrument=iron_xylophone,note=16,powered=true]: minecraft:note_block[instrument=harp,note=16,powered=true] +minecraft:note_block[instrument=iron_xylophone,note=17,powered=true]: minecraft:note_block[instrument=harp,note=17,powered=true] +minecraft:note_block[instrument=iron_xylophone,note=18,powered=true]: minecraft:note_block[instrument=harp,note=18,powered=true] +minecraft:note_block[instrument=iron_xylophone,note=19,powered=true]: minecraft:note_block[instrument=harp,note=19,powered=true] +minecraft:note_block[instrument=iron_xylophone,note=20,powered=true]: minecraft:note_block[instrument=harp,note=20,powered=true] +minecraft:note_block[instrument=iron_xylophone,note=21,powered=true]: minecraft:note_block[instrument=harp,note=21,powered=true] +minecraft:note_block[instrument=iron_xylophone,note=22,powered=true]: minecraft:note_block[instrument=harp,note=22,powered=true] +minecraft:note_block[instrument=iron_xylophone,note=23,powered=true]: minecraft:note_block[instrument=harp,note=23,powered=true] +minecraft:note_block[instrument=iron_xylophone,note=24,powered=true]: minecraft:note_block[instrument=harp,note=24,powered=true] +minecraft:note_block[instrument=cow_bell,note=0,powered=false]: minecraft:note_block[instrument=harp,note=0,powered=false] +minecraft:note_block[instrument=cow_bell,note=1,powered=false]: minecraft:note_block[instrument=harp,note=1,powered=false] +minecraft:note_block[instrument=cow_bell,note=2,powered=false]: minecraft:note_block[instrument=harp,note=2,powered=false] +minecraft:note_block[instrument=cow_bell,note=3,powered=false]: minecraft:note_block[instrument=harp,note=3,powered=false] +minecraft:note_block[instrument=cow_bell,note=4,powered=false]: minecraft:note_block[instrument=harp,note=4,powered=false] +minecraft:note_block[instrument=cow_bell,note=5,powered=false]: minecraft:note_block[instrument=harp,note=5,powered=false] +minecraft:note_block[instrument=cow_bell,note=6,powered=false]: minecraft:note_block[instrument=harp,note=6,powered=false] +minecraft:note_block[instrument=cow_bell,note=7,powered=false]: minecraft:note_block[instrument=harp,note=7,powered=false] +minecraft:note_block[instrument=cow_bell,note=8,powered=false]: minecraft:note_block[instrument=harp,note=8,powered=false] +minecraft:note_block[instrument=cow_bell,note=9,powered=false]: minecraft:note_block[instrument=harp,note=9,powered=false] +minecraft:note_block[instrument=cow_bell,note=10,powered=false]: minecraft:note_block[instrument=harp,note=10,powered=false] +minecraft:note_block[instrument=cow_bell,note=11,powered=false]: minecraft:note_block[instrument=harp,note=11,powered=false] +minecraft:note_block[instrument=cow_bell,note=12,powered=false]: minecraft:note_block[instrument=harp,note=12,powered=false] +minecraft:note_block[instrument=cow_bell,note=13,powered=false]: minecraft:note_block[instrument=harp,note=13,powered=false] +minecraft:note_block[instrument=cow_bell,note=14,powered=false]: minecraft:note_block[instrument=harp,note=14,powered=false] +minecraft:note_block[instrument=cow_bell,note=15,powered=false]: minecraft:note_block[instrument=harp,note=15,powered=false] +minecraft:note_block[instrument=cow_bell,note=16,powered=false]: minecraft:note_block[instrument=harp,note=16,powered=false] +minecraft:note_block[instrument=cow_bell,note=17,powered=false]: minecraft:note_block[instrument=harp,note=17,powered=false] +minecraft:note_block[instrument=cow_bell,note=18,powered=false]: minecraft:note_block[instrument=harp,note=18,powered=false] +minecraft:note_block[instrument=cow_bell,note=19,powered=false]: minecraft:note_block[instrument=harp,note=19,powered=false] +minecraft:note_block[instrument=cow_bell,note=20,powered=false]: minecraft:note_block[instrument=harp,note=20,powered=false] +minecraft:note_block[instrument=cow_bell,note=21,powered=false]: minecraft:note_block[instrument=harp,note=21,powered=false] +minecraft:note_block[instrument=cow_bell,note=22,powered=false]: minecraft:note_block[instrument=harp,note=22,powered=false] +minecraft:note_block[instrument=cow_bell,note=23,powered=false]: minecraft:note_block[instrument=harp,note=23,powered=false] +minecraft:note_block[instrument=cow_bell,note=24,powered=false]: minecraft:note_block[instrument=harp,note=24,powered=false] +minecraft:note_block[instrument=cow_bell,note=0,powered=true]: minecraft:note_block[instrument=harp,note=0,powered=true] +minecraft:note_block[instrument=cow_bell,note=1,powered=true]: minecraft:note_block[instrument=harp,note=1,powered=true] +minecraft:note_block[instrument=cow_bell,note=2,powered=true]: minecraft:note_block[instrument=harp,note=2,powered=true] +minecraft:note_block[instrument=cow_bell,note=3,powered=true]: minecraft:note_block[instrument=harp,note=3,powered=true] +minecraft:note_block[instrument=cow_bell,note=4,powered=true]: minecraft:note_block[instrument=harp,note=4,powered=true] +minecraft:note_block[instrument=cow_bell,note=5,powered=true]: minecraft:note_block[instrument=harp,note=5,powered=true] +minecraft:note_block[instrument=cow_bell,note=6,powered=true]: minecraft:note_block[instrument=harp,note=6,powered=true] +minecraft:note_block[instrument=cow_bell,note=7,powered=true]: minecraft:note_block[instrument=harp,note=7,powered=true] +minecraft:note_block[instrument=cow_bell,note=8,powered=true]: minecraft:note_block[instrument=harp,note=8,powered=true] +minecraft:note_block[instrument=cow_bell,note=9,powered=true]: minecraft:note_block[instrument=harp,note=9,powered=true] +minecraft:note_block[instrument=cow_bell,note=10,powered=true]: minecraft:note_block[instrument=harp,note=10,powered=true] +minecraft:note_block[instrument=cow_bell,note=11,powered=true]: minecraft:note_block[instrument=harp,note=11,powered=true] +minecraft:note_block[instrument=cow_bell,note=12,powered=true]: minecraft:note_block[instrument=harp,note=12,powered=true] +minecraft:note_block[instrument=cow_bell,note=13,powered=true]: minecraft:note_block[instrument=harp,note=13,powered=true] +minecraft:note_block[instrument=cow_bell,note=14,powered=true]: minecraft:note_block[instrument=harp,note=14,powered=true] +minecraft:note_block[instrument=cow_bell,note=15,powered=true]: minecraft:note_block[instrument=harp,note=15,powered=true] +minecraft:note_block[instrument=cow_bell,note=16,powered=true]: minecraft:note_block[instrument=harp,note=16,powered=true] +minecraft:note_block[instrument=cow_bell,note=17,powered=true]: minecraft:note_block[instrument=harp,note=17,powered=true] +minecraft:note_block[instrument=cow_bell,note=18,powered=true]: minecraft:note_block[instrument=harp,note=18,powered=true] +minecraft:note_block[instrument=cow_bell,note=19,powered=true]: minecraft:note_block[instrument=harp,note=19,powered=true] +minecraft:note_block[instrument=cow_bell,note=20,powered=true]: minecraft:note_block[instrument=harp,note=20,powered=true] +minecraft:note_block[instrument=cow_bell,note=21,powered=true]: minecraft:note_block[instrument=harp,note=21,powered=true] +minecraft:note_block[instrument=cow_bell,note=22,powered=true]: minecraft:note_block[instrument=harp,note=22,powered=true] +minecraft:note_block[instrument=cow_bell,note=23,powered=true]: minecraft:note_block[instrument=harp,note=23,powered=true] +minecraft:note_block[instrument=cow_bell,note=24,powered=true]: minecraft:note_block[instrument=harp,note=24,powered=true] +minecraft:note_block[instrument=didgeridoo,note=0,powered=false]: minecraft:note_block[instrument=harp,note=0,powered=false] +minecraft:note_block[instrument=didgeridoo,note=1,powered=false]: minecraft:note_block[instrument=harp,note=1,powered=false] +minecraft:note_block[instrument=didgeridoo,note=2,powered=false]: minecraft:note_block[instrument=harp,note=2,powered=false] +minecraft:note_block[instrument=didgeridoo,note=3,powered=false]: minecraft:note_block[instrument=harp,note=3,powered=false] +minecraft:note_block[instrument=didgeridoo,note=4,powered=false]: minecraft:note_block[instrument=harp,note=4,powered=false] +minecraft:note_block[instrument=didgeridoo,note=5,powered=false]: minecraft:note_block[instrument=harp,note=5,powered=false] +minecraft:note_block[instrument=didgeridoo,note=6,powered=false]: minecraft:note_block[instrument=harp,note=6,powered=false] +minecraft:note_block[instrument=didgeridoo,note=7,powered=false]: minecraft:note_block[instrument=harp,note=7,powered=false] +minecraft:note_block[instrument=didgeridoo,note=8,powered=false]: minecraft:note_block[instrument=harp,note=8,powered=false] +minecraft:note_block[instrument=didgeridoo,note=9,powered=false]: minecraft:note_block[instrument=harp,note=9,powered=false] +minecraft:note_block[instrument=didgeridoo,note=10,powered=false]: minecraft:note_block[instrument=harp,note=10,powered=false] +minecraft:note_block[instrument=didgeridoo,note=11,powered=false]: minecraft:note_block[instrument=harp,note=11,powered=false] +minecraft:note_block[instrument=didgeridoo,note=12,powered=false]: minecraft:note_block[instrument=harp,note=12,powered=false] +minecraft:note_block[instrument=didgeridoo,note=13,powered=false]: minecraft:note_block[instrument=harp,note=13,powered=false] +minecraft:note_block[instrument=didgeridoo,note=14,powered=false]: minecraft:note_block[instrument=harp,note=14,powered=false] +minecraft:note_block[instrument=didgeridoo,note=15,powered=false]: minecraft:note_block[instrument=harp,note=15,powered=false] +minecraft:note_block[instrument=didgeridoo,note=16,powered=false]: minecraft:note_block[instrument=harp,note=16,powered=false] +minecraft:note_block[instrument=didgeridoo,note=17,powered=false]: minecraft:note_block[instrument=harp,note=17,powered=false] +minecraft:note_block[instrument=didgeridoo,note=18,powered=false]: minecraft:note_block[instrument=harp,note=18,powered=false] +minecraft:note_block[instrument=didgeridoo,note=19,powered=false]: minecraft:note_block[instrument=harp,note=19,powered=false] +minecraft:note_block[instrument=didgeridoo,note=20,powered=false]: minecraft:note_block[instrument=harp,note=20,powered=false] +minecraft:note_block[instrument=didgeridoo,note=21,powered=false]: minecraft:note_block[instrument=harp,note=21,powered=false] +minecraft:note_block[instrument=didgeridoo,note=22,powered=false]: minecraft:note_block[instrument=harp,note=22,powered=false] +minecraft:note_block[instrument=didgeridoo,note=23,powered=false]: minecraft:note_block[instrument=harp,note=23,powered=false] +minecraft:note_block[instrument=didgeridoo,note=24,powered=false]: minecraft:note_block[instrument=harp,note=24,powered=false] +minecraft:note_block[instrument=didgeridoo,note=0,powered=true]: minecraft:note_block[instrument=harp,note=0,powered=true] +minecraft:note_block[instrument=didgeridoo,note=1,powered=true]: minecraft:note_block[instrument=harp,note=1,powered=true] +minecraft:note_block[instrument=didgeridoo,note=2,powered=true]: minecraft:note_block[instrument=harp,note=2,powered=true] +minecraft:note_block[instrument=didgeridoo,note=3,powered=true]: minecraft:note_block[instrument=harp,note=3,powered=true] +minecraft:note_block[instrument=didgeridoo,note=4,powered=true]: minecraft:note_block[instrument=harp,note=4,powered=true] +minecraft:note_block[instrument=didgeridoo,note=5,powered=true]: minecraft:note_block[instrument=harp,note=5,powered=true] +minecraft:note_block[instrument=didgeridoo,note=6,powered=true]: minecraft:note_block[instrument=harp,note=6,powered=true] +minecraft:note_block[instrument=didgeridoo,note=7,powered=true]: minecraft:note_block[instrument=harp,note=7,powered=true] +minecraft:note_block[instrument=didgeridoo,note=8,powered=true]: minecraft:note_block[instrument=harp,note=8,powered=true] +minecraft:note_block[instrument=didgeridoo,note=9,powered=true]: minecraft:note_block[instrument=harp,note=9,powered=true] +minecraft:note_block[instrument=didgeridoo,note=10,powered=true]: minecraft:note_block[instrument=harp,note=10,powered=true] +minecraft:note_block[instrument=didgeridoo,note=11,powered=true]: minecraft:note_block[instrument=harp,note=11,powered=true] +minecraft:note_block[instrument=didgeridoo,note=12,powered=true]: minecraft:note_block[instrument=harp,note=12,powered=true] +minecraft:note_block[instrument=didgeridoo,note=13,powered=true]: minecraft:note_block[instrument=harp,note=13,powered=true] +minecraft:note_block[instrument=didgeridoo,note=14,powered=true]: minecraft:note_block[instrument=harp,note=14,powered=true] +minecraft:note_block[instrument=didgeridoo,note=15,powered=true]: minecraft:note_block[instrument=harp,note=15,powered=true] +minecraft:note_block[instrument=didgeridoo,note=16,powered=true]: minecraft:note_block[instrument=harp,note=16,powered=true] +minecraft:note_block[instrument=didgeridoo,note=17,powered=true]: minecraft:note_block[instrument=harp,note=17,powered=true] +minecraft:note_block[instrument=didgeridoo,note=18,powered=true]: minecraft:note_block[instrument=harp,note=18,powered=true] +minecraft:note_block[instrument=didgeridoo,note=19,powered=true]: minecraft:note_block[instrument=harp,note=19,powered=true] +minecraft:note_block[instrument=didgeridoo,note=20,powered=true]: minecraft:note_block[instrument=harp,note=20,powered=true] +minecraft:note_block[instrument=didgeridoo,note=21,powered=true]: minecraft:note_block[instrument=harp,note=21,powered=true] +minecraft:note_block[instrument=didgeridoo,note=22,powered=true]: minecraft:note_block[instrument=harp,note=22,powered=true] +minecraft:note_block[instrument=didgeridoo,note=23,powered=true]: minecraft:note_block[instrument=harp,note=23,powered=true] +minecraft:note_block[instrument=didgeridoo,note=24,powered=true]: minecraft:note_block[instrument=harp,note=24,powered=true] +minecraft:note_block[instrument=bit,note=0,powered=false]: minecraft:note_block[instrument=harp,note=0,powered=false] +minecraft:note_block[instrument=bit,note=1,powered=false]: minecraft:note_block[instrument=harp,note=1,powered=false] +minecraft:note_block[instrument=bit,note=2,powered=false]: minecraft:note_block[instrument=harp,note=2,powered=false] +minecraft:note_block[instrument=bit,note=3,powered=false]: minecraft:note_block[instrument=harp,note=3,powered=false] +minecraft:note_block[instrument=bit,note=4,powered=false]: minecraft:note_block[instrument=harp,note=4,powered=false] +minecraft:note_block[instrument=bit,note=5,powered=false]: minecraft:note_block[instrument=harp,note=5,powered=false] +minecraft:note_block[instrument=bit,note=6,powered=false]: minecraft:note_block[instrument=harp,note=6,powered=false] +minecraft:note_block[instrument=bit,note=7,powered=false]: minecraft:note_block[instrument=harp,note=7,powered=false] +minecraft:note_block[instrument=bit,note=8,powered=false]: minecraft:note_block[instrument=harp,note=8,powered=false] +minecraft:note_block[instrument=bit,note=9,powered=false]: minecraft:note_block[instrument=harp,note=9,powered=false] +minecraft:note_block[instrument=bit,note=10,powered=false]: minecraft:note_block[instrument=harp,note=10,powered=false] +minecraft:note_block[instrument=bit,note=11,powered=false]: minecraft:note_block[instrument=harp,note=11,powered=false] +minecraft:note_block[instrument=bit,note=12,powered=false]: minecraft:note_block[instrument=harp,note=12,powered=false] +minecraft:note_block[instrument=bit,note=13,powered=false]: minecraft:note_block[instrument=harp,note=13,powered=false] +minecraft:note_block[instrument=bit,note=14,powered=false]: minecraft:note_block[instrument=harp,note=14,powered=false] +minecraft:note_block[instrument=bit,note=15,powered=false]: minecraft:note_block[instrument=harp,note=15,powered=false] +minecraft:note_block[instrument=bit,note=16,powered=false]: minecraft:note_block[instrument=harp,note=16,powered=false] +minecraft:note_block[instrument=bit,note=17,powered=false]: minecraft:note_block[instrument=harp,note=17,powered=false] +minecraft:note_block[instrument=bit,note=18,powered=false]: minecraft:note_block[instrument=harp,note=18,powered=false] +minecraft:note_block[instrument=bit,note=19,powered=false]: minecraft:note_block[instrument=harp,note=19,powered=false] +minecraft:note_block[instrument=bit,note=20,powered=false]: minecraft:note_block[instrument=harp,note=20,powered=false] +minecraft:note_block[instrument=bit,note=21,powered=false]: minecraft:note_block[instrument=harp,note=21,powered=false] +minecraft:note_block[instrument=bit,note=22,powered=false]: minecraft:note_block[instrument=harp,note=22,powered=false] +minecraft:note_block[instrument=bit,note=23,powered=false]: minecraft:note_block[instrument=harp,note=23,powered=false] +minecraft:note_block[instrument=bit,note=24,powered=false]: minecraft:note_block[instrument=harp,note=24,powered=false] +minecraft:note_block[instrument=bit,note=0,powered=true]: minecraft:note_block[instrument=harp,note=0,powered=true] +minecraft:note_block[instrument=bit,note=1,powered=true]: minecraft:note_block[instrument=harp,note=1,powered=true] +minecraft:note_block[instrument=bit,note=2,powered=true]: minecraft:note_block[instrument=harp,note=2,powered=true] +minecraft:note_block[instrument=bit,note=3,powered=true]: minecraft:note_block[instrument=harp,note=3,powered=true] +minecraft:note_block[instrument=bit,note=4,powered=true]: minecraft:note_block[instrument=harp,note=4,powered=true] +minecraft:note_block[instrument=bit,note=5,powered=true]: minecraft:note_block[instrument=harp,note=5,powered=true] +minecraft:note_block[instrument=bit,note=6,powered=true]: minecraft:note_block[instrument=harp,note=6,powered=true] +minecraft:note_block[instrument=bit,note=7,powered=true]: minecraft:note_block[instrument=harp,note=7,powered=true] +minecraft:note_block[instrument=bit,note=8,powered=true]: minecraft:note_block[instrument=harp,note=8,powered=true] +minecraft:note_block[instrument=bit,note=9,powered=true]: minecraft:note_block[instrument=harp,note=9,powered=true] +minecraft:note_block[instrument=bit,note=10,powered=true]: minecraft:note_block[instrument=harp,note=10,powered=true] +minecraft:note_block[instrument=bit,note=11,powered=true]: minecraft:note_block[instrument=harp,note=11,powered=true] +minecraft:note_block[instrument=bit,note=12,powered=true]: minecraft:note_block[instrument=harp,note=12,powered=true] +minecraft:note_block[instrument=bit,note=13,powered=true]: minecraft:note_block[instrument=harp,note=13,powered=true] +minecraft:note_block[instrument=bit,note=14,powered=true]: minecraft:note_block[instrument=harp,note=14,powered=true] +minecraft:note_block[instrument=bit,note=15,powered=true]: minecraft:note_block[instrument=harp,note=15,powered=true] +minecraft:note_block[instrument=bit,note=16,powered=true]: minecraft:note_block[instrument=harp,note=16,powered=true] +minecraft:note_block[instrument=bit,note=17,powered=true]: minecraft:note_block[instrument=harp,note=17,powered=true] +minecraft:note_block[instrument=bit,note=18,powered=true]: minecraft:note_block[instrument=harp,note=18,powered=true] +minecraft:note_block[instrument=bit,note=19,powered=true]: minecraft:note_block[instrument=harp,note=19,powered=true] +minecraft:note_block[instrument=bit,note=20,powered=true]: minecraft:note_block[instrument=harp,note=20,powered=true] +minecraft:note_block[instrument=bit,note=21,powered=true]: minecraft:note_block[instrument=harp,note=21,powered=true] +minecraft:note_block[instrument=bit,note=22,powered=true]: minecraft:note_block[instrument=harp,note=22,powered=true] +minecraft:note_block[instrument=bit,note=23,powered=true]: minecraft:note_block[instrument=harp,note=23,powered=true] +minecraft:note_block[instrument=bit,note=24,powered=true]: minecraft:note_block[instrument=harp,note=24,powered=true] +minecraft:note_block[instrument=banjo,note=0,powered=false]: minecraft:note_block[instrument=harp,note=0,powered=false] +minecraft:note_block[instrument=banjo,note=1,powered=false]: minecraft:note_block[instrument=harp,note=1,powered=false] +minecraft:note_block[instrument=banjo,note=2,powered=false]: minecraft:note_block[instrument=harp,note=2,powered=false] +minecraft:note_block[instrument=banjo,note=3,powered=false]: minecraft:note_block[instrument=harp,note=3,powered=false] +minecraft:note_block[instrument=banjo,note=4,powered=false]: minecraft:note_block[instrument=harp,note=4,powered=false] +minecraft:note_block[instrument=banjo,note=5,powered=false]: minecraft:note_block[instrument=harp,note=5,powered=false] +minecraft:note_block[instrument=banjo,note=6,powered=false]: minecraft:note_block[instrument=harp,note=6,powered=false] +minecraft:note_block[instrument=banjo,note=7,powered=false]: minecraft:note_block[instrument=harp,note=7,powered=false] +minecraft:note_block[instrument=banjo,note=8,powered=false]: minecraft:note_block[instrument=harp,note=8,powered=false] +minecraft:note_block[instrument=banjo,note=9,powered=false]: minecraft:note_block[instrument=harp,note=9,powered=false] +minecraft:note_block[instrument=banjo,note=10,powered=false]: minecraft:note_block[instrument=harp,note=10,powered=false] +minecraft:note_block[instrument=banjo,note=11,powered=false]: minecraft:note_block[instrument=harp,note=11,powered=false] +minecraft:note_block[instrument=banjo,note=12,powered=false]: minecraft:note_block[instrument=harp,note=12,powered=false] +minecraft:note_block[instrument=banjo,note=13,powered=false]: minecraft:note_block[instrument=harp,note=13,powered=false] +minecraft:note_block[instrument=banjo,note=14,powered=false]: minecraft:note_block[instrument=harp,note=14,powered=false] +minecraft:note_block[instrument=banjo,note=15,powered=false]: minecraft:note_block[instrument=harp,note=15,powered=false] +minecraft:note_block[instrument=banjo,note=16,powered=false]: minecraft:note_block[instrument=harp,note=16,powered=false] +minecraft:note_block[instrument=banjo,note=17,powered=false]: minecraft:note_block[instrument=harp,note=17,powered=false] +minecraft:note_block[instrument=banjo,note=18,powered=false]: minecraft:note_block[instrument=harp,note=18,powered=false] +minecraft:note_block[instrument=banjo,note=19,powered=false]: minecraft:note_block[instrument=harp,note=19,powered=false] +minecraft:note_block[instrument=banjo,note=20,powered=false]: minecraft:note_block[instrument=harp,note=20,powered=false] +minecraft:note_block[instrument=banjo,note=21,powered=false]: minecraft:note_block[instrument=harp,note=21,powered=false] +minecraft:note_block[instrument=banjo,note=22,powered=false]: minecraft:note_block[instrument=harp,note=22,powered=false] +minecraft:note_block[instrument=banjo,note=23,powered=false]: minecraft:note_block[instrument=harp,note=23,powered=false] +minecraft:note_block[instrument=banjo,note=24,powered=false]: minecraft:note_block[instrument=harp,note=24,powered=false] +minecraft:note_block[instrument=banjo,note=0,powered=true]: minecraft:note_block[instrument=harp,note=0,powered=true] +minecraft:note_block[instrument=banjo,note=1,powered=true]: minecraft:note_block[instrument=harp,note=1,powered=true] +minecraft:note_block[instrument=banjo,note=2,powered=true]: minecraft:note_block[instrument=harp,note=2,powered=true] +minecraft:note_block[instrument=banjo,note=3,powered=true]: minecraft:note_block[instrument=harp,note=3,powered=true] +minecraft:note_block[instrument=banjo,note=4,powered=true]: minecraft:note_block[instrument=harp,note=4,powered=true] +minecraft:note_block[instrument=banjo,note=5,powered=true]: minecraft:note_block[instrument=harp,note=5,powered=true] +minecraft:note_block[instrument=banjo,note=6,powered=true]: minecraft:note_block[instrument=harp,note=6,powered=true] +minecraft:note_block[instrument=banjo,note=7,powered=true]: minecraft:note_block[instrument=harp,note=7,powered=true] +minecraft:note_block[instrument=banjo,note=8,powered=true]: minecraft:note_block[instrument=harp,note=8,powered=true] +minecraft:note_block[instrument=banjo,note=9,powered=true]: minecraft:note_block[instrument=harp,note=9,powered=true] +minecraft:note_block[instrument=banjo,note=10,powered=true]: minecraft:note_block[instrument=harp,note=10,powered=true] +minecraft:note_block[instrument=banjo,note=11,powered=true]: minecraft:note_block[instrument=harp,note=11,powered=true] +minecraft:note_block[instrument=banjo,note=12,powered=true]: minecraft:note_block[instrument=harp,note=12,powered=true] +minecraft:note_block[instrument=banjo,note=13,powered=true]: minecraft:note_block[instrument=harp,note=13,powered=true] +minecraft:note_block[instrument=banjo,note=14,powered=true]: minecraft:note_block[instrument=harp,note=14,powered=true] +minecraft:note_block[instrument=banjo,note=15,powered=true]: minecraft:note_block[instrument=harp,note=15,powered=true] +minecraft:note_block[instrument=banjo,note=16,powered=true]: minecraft:note_block[instrument=harp,note=16,powered=true] +minecraft:note_block[instrument=banjo,note=17,powered=true]: minecraft:note_block[instrument=harp,note=17,powered=true] +minecraft:note_block[instrument=banjo,note=18,powered=true]: minecraft:note_block[instrument=harp,note=18,powered=true] +minecraft:note_block[instrument=banjo,note=19,powered=true]: minecraft:note_block[instrument=harp,note=19,powered=true] +minecraft:note_block[instrument=banjo,note=20,powered=true]: minecraft:note_block[instrument=harp,note=20,powered=true] +minecraft:note_block[instrument=banjo,note=21,powered=true]: minecraft:note_block[instrument=harp,note=21,powered=true] +minecraft:note_block[instrument=banjo,note=22,powered=true]: minecraft:note_block[instrument=harp,note=22,powered=true] +minecraft:note_block[instrument=banjo,note=23,powered=true]: minecraft:note_block[instrument=harp,note=23,powered=true] +minecraft:note_block[instrument=banjo,note=24,powered=true]: minecraft:note_block[instrument=harp,note=24,powered=true] +minecraft:note_block[instrument=pling,note=0,powered=false]: minecraft:note_block[instrument=harp,note=0,powered=false] +minecraft:note_block[instrument=pling,note=1,powered=false]: minecraft:note_block[instrument=harp,note=1,powered=false] +minecraft:note_block[instrument=pling,note=2,powered=false]: minecraft:note_block[instrument=harp,note=2,powered=false] +minecraft:note_block[instrument=pling,note=3,powered=false]: minecraft:note_block[instrument=harp,note=3,powered=false] +minecraft:note_block[instrument=pling,note=4,powered=false]: minecraft:note_block[instrument=harp,note=4,powered=false] +minecraft:note_block[instrument=pling,note=5,powered=false]: minecraft:note_block[instrument=harp,note=5,powered=false] +minecraft:note_block[instrument=pling,note=6,powered=false]: minecraft:note_block[instrument=harp,note=6,powered=false] +minecraft:note_block[instrument=pling,note=7,powered=false]: minecraft:note_block[instrument=harp,note=7,powered=false] +minecraft:note_block[instrument=pling,note=8,powered=false]: minecraft:note_block[instrument=harp,note=8,powered=false] +minecraft:note_block[instrument=pling,note=9,powered=false]: minecraft:note_block[instrument=harp,note=9,powered=false] +minecraft:note_block[instrument=pling,note=10,powered=false]: minecraft:note_block[instrument=harp,note=10,powered=false] +minecraft:note_block[instrument=pling,note=11,powered=false]: minecraft:note_block[instrument=harp,note=11,powered=false] +minecraft:note_block[instrument=pling,note=12,powered=false]: minecraft:note_block[instrument=harp,note=12,powered=false] +minecraft:note_block[instrument=pling,note=13,powered=false]: minecraft:note_block[instrument=harp,note=13,powered=false] +minecraft:note_block[instrument=pling,note=14,powered=false]: minecraft:note_block[instrument=harp,note=14,powered=false] +minecraft:note_block[instrument=pling,note=15,powered=false]: minecraft:note_block[instrument=harp,note=15,powered=false] +minecraft:note_block[instrument=pling,note=16,powered=false]: minecraft:note_block[instrument=harp,note=16,powered=false] +minecraft:note_block[instrument=pling,note=17,powered=false]: minecraft:note_block[instrument=harp,note=17,powered=false] +minecraft:note_block[instrument=pling,note=18,powered=false]: minecraft:note_block[instrument=harp,note=18,powered=false] +minecraft:note_block[instrument=pling,note=19,powered=false]: minecraft:note_block[instrument=harp,note=19,powered=false] +minecraft:note_block[instrument=pling,note=20,powered=false]: minecraft:note_block[instrument=harp,note=20,powered=false] +minecraft:note_block[instrument=pling,note=21,powered=false]: minecraft:note_block[instrument=harp,note=21,powered=false] +minecraft:note_block[instrument=pling,note=22,powered=false]: minecraft:note_block[instrument=harp,note=22,powered=false] +minecraft:note_block[instrument=pling,note=23,powered=false]: minecraft:note_block[instrument=harp,note=23,powered=false] +minecraft:note_block[instrument=pling,note=24,powered=false]: minecraft:note_block[instrument=harp,note=24,powered=false] +minecraft:note_block[instrument=pling,note=0,powered=true]: minecraft:note_block[instrument=harp,note=0,powered=true] +minecraft:note_block[instrument=pling,note=1,powered=true]: minecraft:note_block[instrument=harp,note=1,powered=true] +minecraft:note_block[instrument=pling,note=2,powered=true]: minecraft:note_block[instrument=harp,note=2,powered=true] +minecraft:note_block[instrument=pling,note=3,powered=true]: minecraft:note_block[instrument=harp,note=3,powered=true] +minecraft:note_block[instrument=pling,note=4,powered=true]: minecraft:note_block[instrument=harp,note=4,powered=true] +minecraft:note_block[instrument=pling,note=5,powered=true]: minecraft:note_block[instrument=harp,note=5,powered=true] +minecraft:note_block[instrument=pling,note=6,powered=true]: minecraft:note_block[instrument=harp,note=6,powered=true] +minecraft:note_block[instrument=pling,note=7,powered=true]: minecraft:note_block[instrument=harp,note=7,powered=true] +minecraft:note_block[instrument=pling,note=8,powered=true]: minecraft:note_block[instrument=harp,note=8,powered=true] +minecraft:note_block[instrument=pling,note=9,powered=true]: minecraft:note_block[instrument=harp,note=9,powered=true] +minecraft:note_block[instrument=pling,note=10,powered=true]: minecraft:note_block[instrument=harp,note=10,powered=true] +minecraft:note_block[instrument=pling,note=11,powered=true]: minecraft:note_block[instrument=harp,note=11,powered=true] +minecraft:note_block[instrument=pling,note=12,powered=true]: minecraft:note_block[instrument=harp,note=12,powered=true] +minecraft:note_block[instrument=pling,note=13,powered=true]: minecraft:note_block[instrument=harp,note=13,powered=true] +minecraft:note_block[instrument=pling,note=14,powered=true]: minecraft:note_block[instrument=harp,note=14,powered=true] +minecraft:note_block[instrument=pling,note=15,powered=true]: minecraft:note_block[instrument=harp,note=15,powered=true] +minecraft:note_block[instrument=pling,note=16,powered=true]: minecraft:note_block[instrument=harp,note=16,powered=true] +minecraft:note_block[instrument=pling,note=17,powered=true]: minecraft:note_block[instrument=harp,note=17,powered=true] +minecraft:note_block[instrument=pling,note=18,powered=true]: minecraft:note_block[instrument=harp,note=18,powered=true] +minecraft:note_block[instrument=pling,note=19,powered=true]: minecraft:note_block[instrument=harp,note=19,powered=true] +minecraft:note_block[instrument=pling,note=20,powered=true]: minecraft:note_block[instrument=harp,note=20,powered=true] +minecraft:note_block[instrument=pling,note=21,powered=true]: minecraft:note_block[instrument=harp,note=21,powered=true] +minecraft:note_block[instrument=pling,note=22,powered=true]: minecraft:note_block[instrument=harp,note=22,powered=true] +minecraft:note_block[instrument=pling,note=23,powered=true]: minecraft:note_block[instrument=harp,note=23,powered=true] +minecraft:note_block[instrument=pling,note=24,powered=true]: minecraft:note_block[instrument=harp,note=24,powered=true] +minecraft:note_block[instrument=zombie,note=0,powered=false]: minecraft:note_block[instrument=harp,note=0,powered=false] +minecraft:note_block[instrument=zombie,note=1,powered=false]: minecraft:note_block[instrument=harp,note=1,powered=false] +minecraft:note_block[instrument=zombie,note=2,powered=false]: minecraft:note_block[instrument=harp,note=2,powered=false] +minecraft:note_block[instrument=zombie,note=3,powered=false]: minecraft:note_block[instrument=harp,note=3,powered=false] +minecraft:note_block[instrument=zombie,note=4,powered=false]: minecraft:note_block[instrument=harp,note=4,powered=false] +minecraft:note_block[instrument=zombie,note=5,powered=false]: minecraft:note_block[instrument=harp,note=5,powered=false] +minecraft:note_block[instrument=zombie,note=6,powered=false]: minecraft:note_block[instrument=harp,note=6,powered=false] +minecraft:note_block[instrument=zombie,note=7,powered=false]: minecraft:note_block[instrument=harp,note=7,powered=false] +minecraft:note_block[instrument=zombie,note=8,powered=false]: minecraft:note_block[instrument=harp,note=8,powered=false] +minecraft:note_block[instrument=zombie,note=9,powered=false]: minecraft:note_block[instrument=harp,note=9,powered=false] +minecraft:note_block[instrument=zombie,note=10,powered=false]: minecraft:note_block[instrument=harp,note=10,powered=false] +minecraft:note_block[instrument=zombie,note=11,powered=false]: minecraft:note_block[instrument=harp,note=11,powered=false] +minecraft:note_block[instrument=zombie,note=12,powered=false]: minecraft:note_block[instrument=harp,note=12,powered=false] +minecraft:note_block[instrument=zombie,note=13,powered=false]: minecraft:note_block[instrument=harp,note=13,powered=false] +minecraft:note_block[instrument=zombie,note=14,powered=false]: minecraft:note_block[instrument=harp,note=14,powered=false] +minecraft:note_block[instrument=zombie,note=15,powered=false]: minecraft:note_block[instrument=harp,note=15,powered=false] +minecraft:note_block[instrument=zombie,note=16,powered=false]: minecraft:note_block[instrument=harp,note=16,powered=false] +minecraft:note_block[instrument=zombie,note=17,powered=false]: minecraft:note_block[instrument=harp,note=17,powered=false] +minecraft:note_block[instrument=zombie,note=18,powered=false]: minecraft:note_block[instrument=harp,note=18,powered=false] +minecraft:note_block[instrument=zombie,note=19,powered=false]: minecraft:note_block[instrument=harp,note=19,powered=false] +minecraft:note_block[instrument=zombie,note=20,powered=false]: minecraft:note_block[instrument=harp,note=20,powered=false] +minecraft:note_block[instrument=zombie,note=21,powered=false]: minecraft:note_block[instrument=harp,note=21,powered=false] +minecraft:note_block[instrument=zombie,note=22,powered=false]: minecraft:note_block[instrument=harp,note=22,powered=false] +minecraft:note_block[instrument=zombie,note=23,powered=false]: minecraft:note_block[instrument=harp,note=23,powered=false] +minecraft:note_block[instrument=zombie,note=24,powered=false]: minecraft:note_block[instrument=harp,note=24,powered=false] +minecraft:note_block[instrument=zombie,note=0,powered=true]: minecraft:note_block[instrument=harp,note=0,powered=true] +minecraft:note_block[instrument=zombie,note=1,powered=true]: minecraft:note_block[instrument=harp,note=1,powered=true] +minecraft:note_block[instrument=zombie,note=2,powered=true]: minecraft:note_block[instrument=harp,note=2,powered=true] +minecraft:note_block[instrument=zombie,note=3,powered=true]: minecraft:note_block[instrument=harp,note=3,powered=true] +minecraft:note_block[instrument=zombie,note=4,powered=true]: minecraft:note_block[instrument=harp,note=4,powered=true] +minecraft:note_block[instrument=zombie,note=5,powered=true]: minecraft:note_block[instrument=harp,note=5,powered=true] +minecraft:note_block[instrument=zombie,note=6,powered=true]: minecraft:note_block[instrument=harp,note=6,powered=true] +minecraft:note_block[instrument=zombie,note=7,powered=true]: minecraft:note_block[instrument=harp,note=7,powered=true] +minecraft:note_block[instrument=zombie,note=8,powered=true]: minecraft:note_block[instrument=harp,note=8,powered=true] +minecraft:note_block[instrument=zombie,note=9,powered=true]: minecraft:note_block[instrument=harp,note=9,powered=true] +minecraft:note_block[instrument=zombie,note=10,powered=true]: minecraft:note_block[instrument=harp,note=10,powered=true] +minecraft:note_block[instrument=zombie,note=11,powered=true]: minecraft:note_block[instrument=harp,note=11,powered=true] +minecraft:note_block[instrument=zombie,note=12,powered=true]: minecraft:note_block[instrument=harp,note=12,powered=true] +minecraft:note_block[instrument=zombie,note=13,powered=true]: minecraft:note_block[instrument=harp,note=13,powered=true] +minecraft:note_block[instrument=zombie,note=14,powered=true]: minecraft:note_block[instrument=harp,note=14,powered=true] +minecraft:note_block[instrument=zombie,note=15,powered=true]: minecraft:note_block[instrument=harp,note=15,powered=true] +minecraft:note_block[instrument=zombie,note=16,powered=true]: minecraft:note_block[instrument=harp,note=16,powered=true] +minecraft:note_block[instrument=zombie,note=17,powered=true]: minecraft:note_block[instrument=harp,note=17,powered=true] +minecraft:note_block[instrument=zombie,note=18,powered=true]: minecraft:note_block[instrument=harp,note=18,powered=true] +minecraft:note_block[instrument=zombie,note=19,powered=true]: minecraft:note_block[instrument=harp,note=19,powered=true] +minecraft:note_block[instrument=zombie,note=20,powered=true]: minecraft:note_block[instrument=harp,note=20,powered=true] +minecraft:note_block[instrument=zombie,note=21,powered=true]: minecraft:note_block[instrument=harp,note=21,powered=true] +minecraft:note_block[instrument=zombie,note=22,powered=true]: minecraft:note_block[instrument=harp,note=22,powered=true] +minecraft:note_block[instrument=zombie,note=23,powered=true]: minecraft:note_block[instrument=harp,note=23,powered=true] +minecraft:note_block[instrument=zombie,note=24,powered=true]: minecraft:note_block[instrument=harp,note=24,powered=true] +minecraft:note_block[instrument=skeleton,note=0,powered=false]: minecraft:note_block[instrument=harp,note=0,powered=false] +minecraft:note_block[instrument=skeleton,note=1,powered=false]: minecraft:note_block[instrument=harp,note=1,powered=false] +minecraft:note_block[instrument=skeleton,note=2,powered=false]: minecraft:note_block[instrument=harp,note=2,powered=false] +minecraft:note_block[instrument=skeleton,note=3,powered=false]: minecraft:note_block[instrument=harp,note=3,powered=false] +minecraft:note_block[instrument=skeleton,note=4,powered=false]: minecraft:note_block[instrument=harp,note=4,powered=false] +minecraft:note_block[instrument=skeleton,note=5,powered=false]: minecraft:note_block[instrument=harp,note=5,powered=false] +minecraft:note_block[instrument=skeleton,note=6,powered=false]: minecraft:note_block[instrument=harp,note=6,powered=false] +minecraft:note_block[instrument=skeleton,note=7,powered=false]: minecraft:note_block[instrument=harp,note=7,powered=false] +minecraft:note_block[instrument=skeleton,note=8,powered=false]: minecraft:note_block[instrument=harp,note=8,powered=false] +minecraft:note_block[instrument=skeleton,note=9,powered=false]: minecraft:note_block[instrument=harp,note=9,powered=false] +minecraft:note_block[instrument=skeleton,note=10,powered=false]: minecraft:note_block[instrument=harp,note=10,powered=false] +minecraft:note_block[instrument=skeleton,note=11,powered=false]: minecraft:note_block[instrument=harp,note=11,powered=false] +minecraft:note_block[instrument=skeleton,note=12,powered=false]: minecraft:note_block[instrument=harp,note=12,powered=false] +minecraft:note_block[instrument=skeleton,note=13,powered=false]: minecraft:note_block[instrument=harp,note=13,powered=false] +minecraft:note_block[instrument=skeleton,note=14,powered=false]: minecraft:note_block[instrument=harp,note=14,powered=false] +minecraft:note_block[instrument=skeleton,note=15,powered=false]: minecraft:note_block[instrument=harp,note=15,powered=false] +minecraft:note_block[instrument=skeleton,note=16,powered=false]: minecraft:note_block[instrument=harp,note=16,powered=false] +minecraft:note_block[instrument=skeleton,note=17,powered=false]: minecraft:note_block[instrument=harp,note=17,powered=false] +minecraft:note_block[instrument=skeleton,note=18,powered=false]: minecraft:note_block[instrument=harp,note=18,powered=false] +minecraft:note_block[instrument=skeleton,note=19,powered=false]: minecraft:note_block[instrument=harp,note=19,powered=false] +minecraft:note_block[instrument=skeleton,note=20,powered=false]: minecraft:note_block[instrument=harp,note=20,powered=false] +minecraft:note_block[instrument=skeleton,note=21,powered=false]: minecraft:note_block[instrument=harp,note=21,powered=false] +minecraft:note_block[instrument=skeleton,note=22,powered=false]: minecraft:note_block[instrument=harp,note=22,powered=false] +minecraft:note_block[instrument=skeleton,note=23,powered=false]: minecraft:note_block[instrument=harp,note=23,powered=false] +minecraft:note_block[instrument=skeleton,note=24,powered=false]: minecraft:note_block[instrument=harp,note=24,powered=false] +minecraft:note_block[instrument=skeleton,note=0,powered=true]: minecraft:note_block[instrument=harp,note=0,powered=true] +minecraft:note_block[instrument=skeleton,note=1,powered=true]: minecraft:note_block[instrument=harp,note=1,powered=true] +minecraft:note_block[instrument=skeleton,note=2,powered=true]: minecraft:note_block[instrument=harp,note=2,powered=true] +minecraft:note_block[instrument=skeleton,note=3,powered=true]: minecraft:note_block[instrument=harp,note=3,powered=true] +minecraft:note_block[instrument=skeleton,note=4,powered=true]: minecraft:note_block[instrument=harp,note=4,powered=true] +minecraft:note_block[instrument=skeleton,note=5,powered=true]: minecraft:note_block[instrument=harp,note=5,powered=true] +minecraft:note_block[instrument=skeleton,note=6,powered=true]: minecraft:note_block[instrument=harp,note=6,powered=true] +minecraft:note_block[instrument=skeleton,note=7,powered=true]: minecraft:note_block[instrument=harp,note=7,powered=true] +minecraft:note_block[instrument=skeleton,note=8,powered=true]: minecraft:note_block[instrument=harp,note=8,powered=true] +minecraft:note_block[instrument=skeleton,note=9,powered=true]: minecraft:note_block[instrument=harp,note=9,powered=true] +minecraft:note_block[instrument=skeleton,note=10,powered=true]: minecraft:note_block[instrument=harp,note=10,powered=true] +minecraft:note_block[instrument=skeleton,note=11,powered=true]: minecraft:note_block[instrument=harp,note=11,powered=true] +minecraft:note_block[instrument=skeleton,note=12,powered=true]: minecraft:note_block[instrument=harp,note=12,powered=true] +minecraft:note_block[instrument=skeleton,note=13,powered=true]: minecraft:note_block[instrument=harp,note=13,powered=true] +minecraft:note_block[instrument=skeleton,note=14,powered=true]: minecraft:note_block[instrument=harp,note=14,powered=true] +minecraft:note_block[instrument=skeleton,note=15,powered=true]: minecraft:note_block[instrument=harp,note=15,powered=true] +minecraft:note_block[instrument=skeleton,note=16,powered=true]: minecraft:note_block[instrument=harp,note=16,powered=true] +minecraft:note_block[instrument=skeleton,note=17,powered=true]: minecraft:note_block[instrument=harp,note=17,powered=true] +minecraft:note_block[instrument=skeleton,note=18,powered=true]: minecraft:note_block[instrument=harp,note=18,powered=true] +minecraft:note_block[instrument=skeleton,note=19,powered=true]: minecraft:note_block[instrument=harp,note=19,powered=true] +minecraft:note_block[instrument=skeleton,note=20,powered=true]: minecraft:note_block[instrument=harp,note=20,powered=true] +minecraft:note_block[instrument=skeleton,note=21,powered=true]: minecraft:note_block[instrument=harp,note=21,powered=true] +minecraft:note_block[instrument=skeleton,note=22,powered=true]: minecraft:note_block[instrument=harp,note=22,powered=true] +minecraft:note_block[instrument=skeleton,note=23,powered=true]: minecraft:note_block[instrument=harp,note=23,powered=true] +minecraft:note_block[instrument=skeleton,note=24,powered=true]: minecraft:note_block[instrument=harp,note=24,powered=true] +minecraft:note_block[instrument=creeper,note=0,powered=false]: minecraft:note_block[instrument=harp,note=0,powered=false] +minecraft:note_block[instrument=creeper,note=1,powered=false]: minecraft:note_block[instrument=harp,note=1,powered=false] +minecraft:note_block[instrument=creeper,note=2,powered=false]: minecraft:note_block[instrument=harp,note=2,powered=false] +minecraft:note_block[instrument=creeper,note=3,powered=false]: minecraft:note_block[instrument=harp,note=3,powered=false] +minecraft:note_block[instrument=creeper,note=4,powered=false]: minecraft:note_block[instrument=harp,note=4,powered=false] +minecraft:note_block[instrument=creeper,note=5,powered=false]: minecraft:note_block[instrument=harp,note=5,powered=false] +minecraft:note_block[instrument=creeper,note=6,powered=false]: minecraft:note_block[instrument=harp,note=6,powered=false] +minecraft:note_block[instrument=creeper,note=7,powered=false]: minecraft:note_block[instrument=harp,note=7,powered=false] +minecraft:note_block[instrument=creeper,note=8,powered=false]: minecraft:note_block[instrument=harp,note=8,powered=false] +minecraft:note_block[instrument=creeper,note=9,powered=false]: minecraft:note_block[instrument=harp,note=9,powered=false] +minecraft:note_block[instrument=creeper,note=10,powered=false]: minecraft:note_block[instrument=harp,note=10,powered=false] +minecraft:note_block[instrument=creeper,note=11,powered=false]: minecraft:note_block[instrument=harp,note=11,powered=false] +minecraft:note_block[instrument=creeper,note=12,powered=false]: minecraft:note_block[instrument=harp,note=12,powered=false] +minecraft:note_block[instrument=creeper,note=13,powered=false]: minecraft:note_block[instrument=harp,note=13,powered=false] +minecraft:note_block[instrument=creeper,note=14,powered=false]: minecraft:note_block[instrument=harp,note=14,powered=false] +minecraft:note_block[instrument=creeper,note=15,powered=false]: minecraft:note_block[instrument=harp,note=15,powered=false] +minecraft:note_block[instrument=creeper,note=16,powered=false]: minecraft:note_block[instrument=harp,note=16,powered=false] +minecraft:note_block[instrument=creeper,note=17,powered=false]: minecraft:note_block[instrument=harp,note=17,powered=false] +minecraft:note_block[instrument=creeper,note=18,powered=false]: minecraft:note_block[instrument=harp,note=18,powered=false] +minecraft:note_block[instrument=creeper,note=19,powered=false]: minecraft:note_block[instrument=harp,note=19,powered=false] +minecraft:note_block[instrument=creeper,note=20,powered=false]: minecraft:note_block[instrument=harp,note=20,powered=false] +minecraft:note_block[instrument=creeper,note=21,powered=false]: minecraft:note_block[instrument=harp,note=21,powered=false] +minecraft:note_block[instrument=creeper,note=22,powered=false]: minecraft:note_block[instrument=harp,note=22,powered=false] +minecraft:note_block[instrument=creeper,note=23,powered=false]: minecraft:note_block[instrument=harp,note=23,powered=false] +minecraft:note_block[instrument=creeper,note=24,powered=false]: minecraft:note_block[instrument=harp,note=24,powered=false] +minecraft:note_block[instrument=creeper,note=0,powered=true]: minecraft:note_block[instrument=harp,note=0,powered=true] +minecraft:note_block[instrument=creeper,note=1,powered=true]: minecraft:note_block[instrument=harp,note=1,powered=true] +minecraft:note_block[instrument=creeper,note=2,powered=true]: minecraft:note_block[instrument=harp,note=2,powered=true] +minecraft:note_block[instrument=creeper,note=3,powered=true]: minecraft:note_block[instrument=harp,note=3,powered=true] +minecraft:note_block[instrument=creeper,note=4,powered=true]: minecraft:note_block[instrument=harp,note=4,powered=true] +minecraft:note_block[instrument=creeper,note=5,powered=true]: minecraft:note_block[instrument=harp,note=5,powered=true] +minecraft:note_block[instrument=creeper,note=6,powered=true]: minecraft:note_block[instrument=harp,note=6,powered=true] +minecraft:note_block[instrument=creeper,note=7,powered=true]: minecraft:note_block[instrument=harp,note=7,powered=true] +minecraft:note_block[instrument=creeper,note=8,powered=true]: minecraft:note_block[instrument=harp,note=8,powered=true] +minecraft:note_block[instrument=creeper,note=9,powered=true]: minecraft:note_block[instrument=harp,note=9,powered=true] +minecraft:note_block[instrument=creeper,note=10,powered=true]: minecraft:note_block[instrument=harp,note=10,powered=true] +minecraft:note_block[instrument=creeper,note=11,powered=true]: minecraft:note_block[instrument=harp,note=11,powered=true] +minecraft:note_block[instrument=creeper,note=12,powered=true]: minecraft:note_block[instrument=harp,note=12,powered=true] +minecraft:note_block[instrument=creeper,note=13,powered=true]: minecraft:note_block[instrument=harp,note=13,powered=true] +minecraft:note_block[instrument=creeper,note=14,powered=true]: minecraft:note_block[instrument=harp,note=14,powered=true] +minecraft:note_block[instrument=creeper,note=15,powered=true]: minecraft:note_block[instrument=harp,note=15,powered=true] +minecraft:note_block[instrument=creeper,note=16,powered=true]: minecraft:note_block[instrument=harp,note=16,powered=true] +minecraft:note_block[instrument=creeper,note=17,powered=true]: minecraft:note_block[instrument=harp,note=17,powered=true] +minecraft:note_block[instrument=creeper,note=18,powered=true]: minecraft:note_block[instrument=harp,note=18,powered=true] +minecraft:note_block[instrument=creeper,note=19,powered=true]: minecraft:note_block[instrument=harp,note=19,powered=true] +minecraft:note_block[instrument=creeper,note=20,powered=true]: minecraft:note_block[instrument=harp,note=20,powered=true] +minecraft:note_block[instrument=creeper,note=21,powered=true]: minecraft:note_block[instrument=harp,note=21,powered=true] +minecraft:note_block[instrument=creeper,note=22,powered=true]: minecraft:note_block[instrument=harp,note=22,powered=true] +minecraft:note_block[instrument=creeper,note=23,powered=true]: minecraft:note_block[instrument=harp,note=23,powered=true] +minecraft:note_block[instrument=creeper,note=24,powered=true]: minecraft:note_block[instrument=harp,note=24,powered=true] +minecraft:note_block[instrument=dragon,note=0,powered=false]: minecraft:note_block[instrument=harp,note=0,powered=false] +minecraft:note_block[instrument=dragon,note=1,powered=false]: minecraft:note_block[instrument=harp,note=1,powered=false] +minecraft:note_block[instrument=dragon,note=2,powered=false]: minecraft:note_block[instrument=harp,note=2,powered=false] +minecraft:note_block[instrument=dragon,note=3,powered=false]: minecraft:note_block[instrument=harp,note=3,powered=false] +minecraft:note_block[instrument=dragon,note=4,powered=false]: minecraft:note_block[instrument=harp,note=4,powered=false] +minecraft:note_block[instrument=dragon,note=5,powered=false]: minecraft:note_block[instrument=harp,note=5,powered=false] +minecraft:note_block[instrument=dragon,note=6,powered=false]: minecraft:note_block[instrument=harp,note=6,powered=false] +minecraft:note_block[instrument=dragon,note=7,powered=false]: minecraft:note_block[instrument=harp,note=7,powered=false] +minecraft:note_block[instrument=dragon,note=8,powered=false]: minecraft:note_block[instrument=harp,note=8,powered=false] +minecraft:note_block[instrument=dragon,note=9,powered=false]: minecraft:note_block[instrument=harp,note=9,powered=false] +minecraft:note_block[instrument=dragon,note=10,powered=false]: minecraft:note_block[instrument=harp,note=10,powered=false] +minecraft:note_block[instrument=dragon,note=11,powered=false]: minecraft:note_block[instrument=harp,note=11,powered=false] +minecraft:note_block[instrument=dragon,note=12,powered=false]: minecraft:note_block[instrument=harp,note=12,powered=false] +minecraft:note_block[instrument=dragon,note=13,powered=false]: minecraft:note_block[instrument=harp,note=13,powered=false] +minecraft:note_block[instrument=dragon,note=14,powered=false]: minecraft:note_block[instrument=harp,note=14,powered=false] +minecraft:note_block[instrument=dragon,note=15,powered=false]: minecraft:note_block[instrument=harp,note=15,powered=false] +minecraft:note_block[instrument=dragon,note=16,powered=false]: minecraft:note_block[instrument=harp,note=16,powered=false] +minecraft:note_block[instrument=dragon,note=17,powered=false]: minecraft:note_block[instrument=harp,note=17,powered=false] +minecraft:note_block[instrument=dragon,note=18,powered=false]: minecraft:note_block[instrument=harp,note=18,powered=false] +minecraft:note_block[instrument=dragon,note=19,powered=false]: minecraft:note_block[instrument=harp,note=19,powered=false] +minecraft:note_block[instrument=dragon,note=20,powered=false]: minecraft:note_block[instrument=harp,note=20,powered=false] +minecraft:note_block[instrument=dragon,note=21,powered=false]: minecraft:note_block[instrument=harp,note=21,powered=false] +minecraft:note_block[instrument=dragon,note=22,powered=false]: minecraft:note_block[instrument=harp,note=22,powered=false] +minecraft:note_block[instrument=dragon,note=23,powered=false]: minecraft:note_block[instrument=harp,note=23,powered=false] +minecraft:note_block[instrument=dragon,note=24,powered=false]: minecraft:note_block[instrument=harp,note=24,powered=false] +minecraft:note_block[instrument=dragon,note=0,powered=true]: minecraft:note_block[instrument=harp,note=0,powered=true] +minecraft:note_block[instrument=dragon,note=1,powered=true]: minecraft:note_block[instrument=harp,note=1,powered=true] +minecraft:note_block[instrument=dragon,note=2,powered=true]: minecraft:note_block[instrument=harp,note=2,powered=true] +minecraft:note_block[instrument=dragon,note=3,powered=true]: minecraft:note_block[instrument=harp,note=3,powered=true] +minecraft:note_block[instrument=dragon,note=4,powered=true]: minecraft:note_block[instrument=harp,note=4,powered=true] +minecraft:note_block[instrument=dragon,note=5,powered=true]: minecraft:note_block[instrument=harp,note=5,powered=true] +minecraft:note_block[instrument=dragon,note=6,powered=true]: minecraft:note_block[instrument=harp,note=6,powered=true] +minecraft:note_block[instrument=dragon,note=7,powered=true]: minecraft:note_block[instrument=harp,note=7,powered=true] +minecraft:note_block[instrument=dragon,note=8,powered=true]: minecraft:note_block[instrument=harp,note=8,powered=true] +minecraft:note_block[instrument=dragon,note=9,powered=true]: minecraft:note_block[instrument=harp,note=9,powered=true] +minecraft:note_block[instrument=dragon,note=10,powered=true]: minecraft:note_block[instrument=harp,note=10,powered=true] +minecraft:note_block[instrument=dragon,note=11,powered=true]: minecraft:note_block[instrument=harp,note=11,powered=true] +minecraft:note_block[instrument=dragon,note=12,powered=true]: minecraft:note_block[instrument=harp,note=12,powered=true] +minecraft:note_block[instrument=dragon,note=13,powered=true]: minecraft:note_block[instrument=harp,note=13,powered=true] +minecraft:note_block[instrument=dragon,note=14,powered=true]: minecraft:note_block[instrument=harp,note=14,powered=true] +minecraft:note_block[instrument=dragon,note=15,powered=true]: minecraft:note_block[instrument=harp,note=15,powered=true] +minecraft:note_block[instrument=dragon,note=16,powered=true]: minecraft:note_block[instrument=harp,note=16,powered=true] +minecraft:note_block[instrument=dragon,note=17,powered=true]: minecraft:note_block[instrument=harp,note=17,powered=true] +minecraft:note_block[instrument=dragon,note=18,powered=true]: minecraft:note_block[instrument=harp,note=18,powered=true] +minecraft:note_block[instrument=dragon,note=19,powered=true]: minecraft:note_block[instrument=harp,note=19,powered=true] +minecraft:note_block[instrument=dragon,note=20,powered=true]: minecraft:note_block[instrument=harp,note=20,powered=true] +minecraft:note_block[instrument=dragon,note=21,powered=true]: minecraft:note_block[instrument=harp,note=21,powered=true] +minecraft:note_block[instrument=dragon,note=22,powered=true]: minecraft:note_block[instrument=harp,note=22,powered=true] +minecraft:note_block[instrument=dragon,note=23,powered=true]: minecraft:note_block[instrument=harp,note=23,powered=true] +minecraft:note_block[instrument=dragon,note=24,powered=true]: minecraft:note_block[instrument=harp,note=24,powered=true] +minecraft:note_block[instrument=wither_skeleton,note=0,powered=false]: minecraft:note_block[instrument=harp,note=0,powered=false] +minecraft:note_block[instrument=wither_skeleton,note=1,powered=false]: minecraft:note_block[instrument=harp,note=1,powered=false] +minecraft:note_block[instrument=wither_skeleton,note=2,powered=false]: minecraft:note_block[instrument=harp,note=2,powered=false] +minecraft:note_block[instrument=wither_skeleton,note=3,powered=false]: minecraft:note_block[instrument=harp,note=3,powered=false] +minecraft:note_block[instrument=wither_skeleton,note=4,powered=false]: minecraft:note_block[instrument=harp,note=4,powered=false] +minecraft:note_block[instrument=wither_skeleton,note=5,powered=false]: minecraft:note_block[instrument=harp,note=5,powered=false] +minecraft:note_block[instrument=wither_skeleton,note=6,powered=false]: minecraft:note_block[instrument=harp,note=6,powered=false] +minecraft:note_block[instrument=wither_skeleton,note=7,powered=false]: minecraft:note_block[instrument=harp,note=7,powered=false] +minecraft:note_block[instrument=wither_skeleton,note=8,powered=false]: minecraft:note_block[instrument=harp,note=8,powered=false] +minecraft:note_block[instrument=wither_skeleton,note=9,powered=false]: minecraft:note_block[instrument=harp,note=9,powered=false] +minecraft:note_block[instrument=wither_skeleton,note=10,powered=false]: minecraft:note_block[instrument=harp,note=10,powered=false] +minecraft:note_block[instrument=wither_skeleton,note=11,powered=false]: minecraft:note_block[instrument=harp,note=11,powered=false] +minecraft:note_block[instrument=wither_skeleton,note=12,powered=false]: minecraft:note_block[instrument=harp,note=12,powered=false] +minecraft:note_block[instrument=wither_skeleton,note=13,powered=false]: minecraft:note_block[instrument=harp,note=13,powered=false] +minecraft:note_block[instrument=wither_skeleton,note=14,powered=false]: minecraft:note_block[instrument=harp,note=14,powered=false] +minecraft:note_block[instrument=wither_skeleton,note=15,powered=false]: minecraft:note_block[instrument=harp,note=15,powered=false] +minecraft:note_block[instrument=wither_skeleton,note=16,powered=false]: minecraft:note_block[instrument=harp,note=16,powered=false] +minecraft:note_block[instrument=wither_skeleton,note=17,powered=false]: minecraft:note_block[instrument=harp,note=17,powered=false] +minecraft:note_block[instrument=wither_skeleton,note=18,powered=false]: minecraft:note_block[instrument=harp,note=18,powered=false] +minecraft:note_block[instrument=wither_skeleton,note=19,powered=false]: minecraft:note_block[instrument=harp,note=19,powered=false] +minecraft:note_block[instrument=wither_skeleton,note=20,powered=false]: minecraft:note_block[instrument=harp,note=20,powered=false] +minecraft:note_block[instrument=wither_skeleton,note=21,powered=false]: minecraft:note_block[instrument=harp,note=21,powered=false] +minecraft:note_block[instrument=wither_skeleton,note=22,powered=false]: minecraft:note_block[instrument=harp,note=22,powered=false] +minecraft:note_block[instrument=wither_skeleton,note=23,powered=false]: minecraft:note_block[instrument=harp,note=23,powered=false] +minecraft:note_block[instrument=wither_skeleton,note=24,powered=false]: minecraft:note_block[instrument=harp,note=24,powered=false] +minecraft:note_block[instrument=wither_skeleton,note=0,powered=true]: minecraft:note_block[instrument=harp,note=0,powered=true] +minecraft:note_block[instrument=wither_skeleton,note=1,powered=true]: minecraft:note_block[instrument=harp,note=1,powered=true] +minecraft:note_block[instrument=wither_skeleton,note=2,powered=true]: minecraft:note_block[instrument=harp,note=2,powered=true] +minecraft:note_block[instrument=wither_skeleton,note=3,powered=true]: minecraft:note_block[instrument=harp,note=3,powered=true] +minecraft:note_block[instrument=wither_skeleton,note=4,powered=true]: minecraft:note_block[instrument=harp,note=4,powered=true] +minecraft:note_block[instrument=wither_skeleton,note=5,powered=true]: minecraft:note_block[instrument=harp,note=5,powered=true] +minecraft:note_block[instrument=wither_skeleton,note=6,powered=true]: minecraft:note_block[instrument=harp,note=6,powered=true] +minecraft:note_block[instrument=wither_skeleton,note=7,powered=true]: minecraft:note_block[instrument=harp,note=7,powered=true] +minecraft:note_block[instrument=wither_skeleton,note=8,powered=true]: minecraft:note_block[instrument=harp,note=8,powered=true] +minecraft:note_block[instrument=wither_skeleton,note=9,powered=true]: minecraft:note_block[instrument=harp,note=9,powered=true] +minecraft:note_block[instrument=wither_skeleton,note=10,powered=true]: minecraft:note_block[instrument=harp,note=10,powered=true] +minecraft:note_block[instrument=wither_skeleton,note=11,powered=true]: minecraft:note_block[instrument=harp,note=11,powered=true] +minecraft:note_block[instrument=wither_skeleton,note=12,powered=true]: minecraft:note_block[instrument=harp,note=12,powered=true] +minecraft:note_block[instrument=wither_skeleton,note=13,powered=true]: minecraft:note_block[instrument=harp,note=13,powered=true] +minecraft:note_block[instrument=wither_skeleton,note=14,powered=true]: minecraft:note_block[instrument=harp,note=14,powered=true] +minecraft:note_block[instrument=wither_skeleton,note=15,powered=true]: minecraft:note_block[instrument=harp,note=15,powered=true] +minecraft:note_block[instrument=wither_skeleton,note=16,powered=true]: minecraft:note_block[instrument=harp,note=16,powered=true] +minecraft:note_block[instrument=wither_skeleton,note=17,powered=true]: minecraft:note_block[instrument=harp,note=17,powered=true] +minecraft:note_block[instrument=wither_skeleton,note=18,powered=true]: minecraft:note_block[instrument=harp,note=18,powered=true] +minecraft:note_block[instrument=wither_skeleton,note=19,powered=true]: minecraft:note_block[instrument=harp,note=19,powered=true] +minecraft:note_block[instrument=wither_skeleton,note=20,powered=true]: minecraft:note_block[instrument=harp,note=20,powered=true] +minecraft:note_block[instrument=wither_skeleton,note=21,powered=true]: minecraft:note_block[instrument=harp,note=21,powered=true] +minecraft:note_block[instrument=wither_skeleton,note=22,powered=true]: minecraft:note_block[instrument=harp,note=22,powered=true] +minecraft:note_block[instrument=wither_skeleton,note=23,powered=true]: minecraft:note_block[instrument=harp,note=23,powered=true] +minecraft:note_block[instrument=wither_skeleton,note=24,powered=true]: minecraft:note_block[instrument=harp,note=24,powered=true] +minecraft:note_block[instrument=piglin,note=0,powered=false]: minecraft:note_block[instrument=harp,note=0,powered=false] +minecraft:note_block[instrument=piglin,note=1,powered=false]: minecraft:note_block[instrument=harp,note=1,powered=false] +minecraft:note_block[instrument=piglin,note=2,powered=false]: minecraft:note_block[instrument=harp,note=2,powered=false] +minecraft:note_block[instrument=piglin,note=3,powered=false]: minecraft:note_block[instrument=harp,note=3,powered=false] +minecraft:note_block[instrument=piglin,note=4,powered=false]: minecraft:note_block[instrument=harp,note=4,powered=false] +minecraft:note_block[instrument=piglin,note=5,powered=false]: minecraft:note_block[instrument=harp,note=5,powered=false] +minecraft:note_block[instrument=piglin,note=6,powered=false]: minecraft:note_block[instrument=harp,note=6,powered=false] +minecraft:note_block[instrument=piglin,note=7,powered=false]: minecraft:note_block[instrument=harp,note=7,powered=false] +minecraft:note_block[instrument=piglin,note=8,powered=false]: minecraft:note_block[instrument=harp,note=8,powered=false] +minecraft:note_block[instrument=piglin,note=9,powered=false]: minecraft:note_block[instrument=harp,note=9,powered=false] +minecraft:note_block[instrument=piglin,note=10,powered=false]: minecraft:note_block[instrument=harp,note=10,powered=false] +minecraft:note_block[instrument=piglin,note=11,powered=false]: minecraft:note_block[instrument=harp,note=11,powered=false] +minecraft:note_block[instrument=piglin,note=12,powered=false]: minecraft:note_block[instrument=harp,note=12,powered=false] +minecraft:note_block[instrument=piglin,note=13,powered=false]: minecraft:note_block[instrument=harp,note=13,powered=false] +minecraft:note_block[instrument=piglin,note=14,powered=false]: minecraft:note_block[instrument=harp,note=14,powered=false] +minecraft:note_block[instrument=piglin,note=15,powered=false]: minecraft:note_block[instrument=harp,note=15,powered=false] +minecraft:note_block[instrument=piglin,note=16,powered=false]: minecraft:note_block[instrument=harp,note=16,powered=false] +minecraft:note_block[instrument=piglin,note=17,powered=false]: minecraft:note_block[instrument=harp,note=17,powered=false] +minecraft:note_block[instrument=piglin,note=18,powered=false]: minecraft:note_block[instrument=harp,note=18,powered=false] +minecraft:note_block[instrument=piglin,note=19,powered=false]: minecraft:note_block[instrument=harp,note=19,powered=false] +minecraft:note_block[instrument=piglin,note=20,powered=false]: minecraft:note_block[instrument=harp,note=20,powered=false] +minecraft:note_block[instrument=piglin,note=21,powered=false]: minecraft:note_block[instrument=harp,note=21,powered=false] +minecraft:note_block[instrument=piglin,note=22,powered=false]: minecraft:note_block[instrument=harp,note=22,powered=false] +minecraft:note_block[instrument=piglin,note=23,powered=false]: minecraft:note_block[instrument=harp,note=23,powered=false] +minecraft:note_block[instrument=piglin,note=24,powered=false]: minecraft:note_block[instrument=harp,note=24,powered=false] +minecraft:note_block[instrument=piglin,note=0,powered=true]: minecraft:note_block[instrument=harp,note=0,powered=true] +minecraft:note_block[instrument=piglin,note=1,powered=true]: minecraft:note_block[instrument=harp,note=1,powered=true] +minecraft:note_block[instrument=piglin,note=2,powered=true]: minecraft:note_block[instrument=harp,note=2,powered=true] +minecraft:note_block[instrument=piglin,note=3,powered=true]: minecraft:note_block[instrument=harp,note=3,powered=true] +minecraft:note_block[instrument=piglin,note=4,powered=true]: minecraft:note_block[instrument=harp,note=4,powered=true] +minecraft:note_block[instrument=piglin,note=5,powered=true]: minecraft:note_block[instrument=harp,note=5,powered=true] +minecraft:note_block[instrument=piglin,note=6,powered=true]: minecraft:note_block[instrument=harp,note=6,powered=true] +minecraft:note_block[instrument=piglin,note=7,powered=true]: minecraft:note_block[instrument=harp,note=7,powered=true] +minecraft:note_block[instrument=piglin,note=8,powered=true]: minecraft:note_block[instrument=harp,note=8,powered=true] +minecraft:note_block[instrument=piglin,note=9,powered=true]: minecraft:note_block[instrument=harp,note=9,powered=true] +minecraft:note_block[instrument=piglin,note=10,powered=true]: minecraft:note_block[instrument=harp,note=10,powered=true] +minecraft:note_block[instrument=piglin,note=11,powered=true]: minecraft:note_block[instrument=harp,note=11,powered=true] +minecraft:note_block[instrument=piglin,note=12,powered=true]: minecraft:note_block[instrument=harp,note=12,powered=true] +minecraft:note_block[instrument=piglin,note=13,powered=true]: minecraft:note_block[instrument=harp,note=13,powered=true] +minecraft:note_block[instrument=piglin,note=14,powered=true]: minecraft:note_block[instrument=harp,note=14,powered=true] +minecraft:note_block[instrument=piglin,note=15,powered=true]: minecraft:note_block[instrument=harp,note=15,powered=true] +minecraft:note_block[instrument=piglin,note=16,powered=true]: minecraft:note_block[instrument=harp,note=16,powered=true] +minecraft:note_block[instrument=piglin,note=17,powered=true]: minecraft:note_block[instrument=harp,note=17,powered=true] +minecraft:note_block[instrument=piglin,note=18,powered=true]: minecraft:note_block[instrument=harp,note=18,powered=true] +minecraft:note_block[instrument=piglin,note=19,powered=true]: minecraft:note_block[instrument=harp,note=19,powered=true] +minecraft:note_block[instrument=piglin,note=20,powered=true]: minecraft:note_block[instrument=harp,note=20,powered=true] +minecraft:note_block[instrument=piglin,note=21,powered=true]: minecraft:note_block[instrument=harp,note=21,powered=true] +minecraft:note_block[instrument=piglin,note=22,powered=true]: minecraft:note_block[instrument=harp,note=22,powered=true] +minecraft:note_block[instrument=piglin,note=23,powered=true]: minecraft:note_block[instrument=harp,note=23,powered=true] +minecraft:note_block[instrument=piglin,note=24,powered=true]: minecraft:note_block[instrument=harp,note=24,powered=true] +minecraft:note_block[instrument=custom_head,note=0,powered=false]: minecraft:note_block[instrument=harp,note=0,powered=false] +minecraft:note_block[instrument=custom_head,note=1,powered=false]: minecraft:note_block[instrument=harp,note=1,powered=false] +minecraft:note_block[instrument=custom_head,note=2,powered=false]: minecraft:note_block[instrument=harp,note=2,powered=false] +minecraft:note_block[instrument=custom_head,note=3,powered=false]: minecraft:note_block[instrument=harp,note=3,powered=false] +minecraft:note_block[instrument=custom_head,note=4,powered=false]: minecraft:note_block[instrument=harp,note=4,powered=false] +minecraft:note_block[instrument=custom_head,note=5,powered=false]: minecraft:note_block[instrument=harp,note=5,powered=false] +minecraft:note_block[instrument=custom_head,note=6,powered=false]: minecraft:note_block[instrument=harp,note=6,powered=false] +minecraft:note_block[instrument=custom_head,note=7,powered=false]: minecraft:note_block[instrument=harp,note=7,powered=false] +minecraft:note_block[instrument=custom_head,note=8,powered=false]: minecraft:note_block[instrument=harp,note=8,powered=false] +minecraft:note_block[instrument=custom_head,note=9,powered=false]: minecraft:note_block[instrument=harp,note=9,powered=false] +minecraft:note_block[instrument=custom_head,note=10,powered=false]: minecraft:note_block[instrument=harp,note=10,powered=false] +minecraft:note_block[instrument=custom_head,note=11,powered=false]: minecraft:note_block[instrument=harp,note=11,powered=false] +minecraft:note_block[instrument=custom_head,note=12,powered=false]: minecraft:note_block[instrument=harp,note=12,powered=false] +minecraft:note_block[instrument=custom_head,note=13,powered=false]: minecraft:note_block[instrument=harp,note=13,powered=false] +minecraft:note_block[instrument=custom_head,note=14,powered=false]: minecraft:note_block[instrument=harp,note=14,powered=false] +minecraft:note_block[instrument=custom_head,note=15,powered=false]: minecraft:note_block[instrument=harp,note=15,powered=false] +minecraft:note_block[instrument=custom_head,note=16,powered=false]: minecraft:note_block[instrument=harp,note=16,powered=false] +minecraft:note_block[instrument=custom_head,note=17,powered=false]: minecraft:note_block[instrument=harp,note=17,powered=false] +minecraft:note_block[instrument=custom_head,note=18,powered=false]: minecraft:note_block[instrument=harp,note=18,powered=false] +minecraft:note_block[instrument=custom_head,note=19,powered=false]: minecraft:note_block[instrument=harp,note=19,powered=false] +minecraft:note_block[instrument=custom_head,note=20,powered=false]: minecraft:note_block[instrument=harp,note=20,powered=false] +minecraft:note_block[instrument=custom_head,note=21,powered=false]: minecraft:note_block[instrument=harp,note=21,powered=false] +minecraft:note_block[instrument=custom_head,note=22,powered=false]: minecraft:note_block[instrument=harp,note=22,powered=false] +minecraft:note_block[instrument=custom_head,note=23,powered=false]: minecraft:note_block[instrument=harp,note=23,powered=false] +minecraft:note_block[instrument=custom_head,note=24,powered=false]: minecraft:note_block[instrument=harp,note=24,powered=false] +minecraft:note_block[instrument=custom_head,note=0,powered=true]: minecraft:note_block[instrument=harp,note=0,powered=true] +minecraft:note_block[instrument=custom_head,note=1,powered=true]: minecraft:note_block[instrument=harp,note=1,powered=true] +minecraft:note_block[instrument=custom_head,note=2,powered=true]: minecraft:note_block[instrument=harp,note=2,powered=true] +minecraft:note_block[instrument=custom_head,note=3,powered=true]: minecraft:note_block[instrument=harp,note=3,powered=true] +minecraft:note_block[instrument=custom_head,note=4,powered=true]: minecraft:note_block[instrument=harp,note=4,powered=true] +minecraft:note_block[instrument=custom_head,note=5,powered=true]: minecraft:note_block[instrument=harp,note=5,powered=true] +minecraft:note_block[instrument=custom_head,note=6,powered=true]: minecraft:note_block[instrument=harp,note=6,powered=true] +minecraft:note_block[instrument=custom_head,note=7,powered=true]: minecraft:note_block[instrument=harp,note=7,powered=true] +minecraft:note_block[instrument=custom_head,note=8,powered=true]: minecraft:note_block[instrument=harp,note=8,powered=true] +minecraft:note_block[instrument=custom_head,note=9,powered=true]: minecraft:note_block[instrument=harp,note=9,powered=true] +minecraft:note_block[instrument=custom_head,note=10,powered=true]: minecraft:note_block[instrument=harp,note=10,powered=true] +minecraft:note_block[instrument=custom_head,note=11,powered=true]: minecraft:note_block[instrument=harp,note=11,powered=true] +minecraft:note_block[instrument=custom_head,note=12,powered=true]: minecraft:note_block[instrument=harp,note=12,powered=true] +minecraft:note_block[instrument=custom_head,note=13,powered=true]: minecraft:note_block[instrument=harp,note=13,powered=true] +minecraft:note_block[instrument=custom_head,note=14,powered=true]: minecraft:note_block[instrument=harp,note=14,powered=true] +minecraft:note_block[instrument=custom_head,note=15,powered=true]: minecraft:note_block[instrument=harp,note=15,powered=true] +minecraft:note_block[instrument=custom_head,note=16,powered=true]: minecraft:note_block[instrument=harp,note=16,powered=true] +minecraft:note_block[instrument=custom_head,note=17,powered=true]: minecraft:note_block[instrument=harp,note=17,powered=true] +minecraft:note_block[instrument=custom_head,note=18,powered=true]: minecraft:note_block[instrument=harp,note=18,powered=true] +minecraft:note_block[instrument=custom_head,note=19,powered=true]: minecraft:note_block[instrument=harp,note=19,powered=true] +minecraft:note_block[instrument=custom_head,note=20,powered=true]: minecraft:note_block[instrument=harp,note=20,powered=true] +minecraft:note_block[instrument=custom_head,note=21,powered=true]: minecraft:note_block[instrument=harp,note=21,powered=true] +minecraft:note_block[instrument=custom_head,note=22,powered=true]: minecraft:note_block[instrument=harp,note=22,powered=true] +minecraft:note_block[instrument=custom_head,note=23,powered=true]: minecraft:note_block[instrument=harp,note=23,powered=true] +minecraft:note_block[instrument=custom_head,note=24,powered=true]: minecraft:note_block[instrument=harp,note=24,powered=true] \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/resources/default/configuration/blocks.yml b/bukkit-loader/src/main/resources/resources/default/configuration/blocks.yml new file mode 100644 index 000000000..c807b25e2 --- /dev/null +++ b/bukkit-loader/src/main/resources/resources/default/configuration/blocks.yml @@ -0,0 +1,63 @@ +items: + default:chinese_lantern: + material: paper + custom-model-data: 3001 + data: + display-name: "" + model: + type: "minecraft:model" + path: "minecraft:item/custom/chinese_lantern" + generation: + parent: "minecraft:block/custom/chinese_lantern" + behavior: + type: block_item + block: + loot: + template: loot_table:normal + arguments: + item: default:chinese_lantern + settings: + hardness: 0.5 + resistance: 0.5 + push-reaction: NORMAL + replaceable: false + burnable: true + burn-chance: 30 + fire-spread-chance: 100 + is-redstone-conductor: true + is-suffocating: false + instrument: HARP + luminance: 15 + map-color: 36 + item: default:chinese_lantern + sounds: + break: minecraft:block.wood.break + step: minecraft:block.wood.step + place: minecraft:block.wood.place + hit: minecraft:block.wood.hit + fall: minecraft:block.wood.fall + state: + id: 15 + state: note_block:15 + model: + path: "minecraft:block/custom/chinese_lantern" + generation: + parent: "minecraft:block/cube_column" + textures: + "end": "minecraft:block/custom/chinese_lantern_top" + "side": "minecraft:block/custom/chinese_lantern" + +recipes: + default:chinese_lantern: + type: shaped + pattern: + - "ABA" + - "BCB" + - "ABA" + ingredients: + A: "#minecraft:planks" + B: "minecraft:stick" + C: "minecraft:torch" + result: + id: default:chinese_lantern + count: 1 \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/resources/default/configuration/categories.yml b/bukkit-loader/src/main/resources/resources/default/configuration/categories.yml new file mode 100644 index 000000000..0ccfc8731 --- /dev/null +++ b/bukkit-loader/src/main/resources/resources/default/configuration/categories.yml @@ -0,0 +1,55 @@ +categories: + default:default: + priority: 1 + name: "" + lore: + - "" + icon: default:topaz + list: + - "#default:palm_tree" + - "#default:topaz" + - "#default:furniture" + - "#default:misc" + default:palm_tree: + name: "" + hidden: true + icon: default:palm_log + list: + - default:palm_sapling + - default:palm_leaves + - default:palm_log + - default:stripped_palm_log + - default:palm_wood + - default:stripped_palm_wood + - default:palm_planks + default:topaz: + name: "<#FF8C00>" + hidden: true + icon: default:topaz + list: + - default:topaz + - default:topaz_ore + - default:deepslate_topaz_ore + - default:topaz_axe + - default:topaz_pickaxe + - default:topaz_hoe + - default:topaz_shovel + - default:topaz_sword + - default:topaz_bow + - default:topaz_crossbow + - default:topaz_rod + default:furniture: + name: "<#FFD700>" + hidden: true + icon: default:table_lamp + list: + - default:bench + - default:table_lamp + - default:wooden_chair + default:misc: + name: "" + hidden: true + icon: default:chinese_lantern + list: + - default:chinese_lantern + - default:fairy_flower \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/resources/default/configuration/fairy_flower.yml b/bukkit-loader/src/main/resources/resources/default/configuration/fairy_flower.yml new file mode 100644 index 000000000..c1484240c --- /dev/null +++ b/bukkit-loader/src/main/resources/resources/default/configuration/fairy_flower.yml @@ -0,0 +1,64 @@ +items: + default:fairy_flower: + material: paper + custom-model-data: 3000 + data: + display-name: "" + model: + type: "minecraft:model" + path: "minecraft:item/custom/fairy_flower" + generation: + parent: "minecraft:item/generated" + textures: + "layer0": "minecraft:item/custom/fairy_flower" + behavior: + type: block_item + block: default:fairy_flower +blocks: + default:fairy_flower: + settings: + template: block_settings:surface_decoration + overrides: + item: default:fairy_flower + sounds: + break: minecraft:block.grass.break + step: minecraft:block.grass.step + place: minecraft:block.grass.place + hit: minecraft:block.grass.hit + fall: minecraft:block.grass.fall + behavior: + type: bush_block + loot: + template: loot_table:normal + arguments: + item: default:fairy_flower + state: + id: 0 + state: tripwire:0 + models: + - path: "minecraft:block/custom/fairy_flower_1" + weight: 100 + - path: "minecraft:block/custom/fairy_flower_2" + weight: 5 + generation: + parent: "minecraft:block/custom/fairy_flower_1" + textures: + "0": "minecraft:block/custom/fairy_flower_2" + - path: "minecraft:block/custom/fairy_flower_3" + weight: 5 + generation: + parent: "minecraft:block/custom/fairy_flower_1" + textures: + "0": "minecraft:block/custom/fairy_flower_3" + - path: "minecraft:block/custom/fairy_flower_4" + weight: 5 + generation: + parent: "minecraft:block/custom/fairy_flower_1" + textures: + "0": "minecraft:block/custom/fairy_flower_4" + - path: "minecraft:block/custom/fairy_flower_5" + weight: 1 + generation: + parent: "minecraft:block/custom/fairy_flower_1" + textures: + "0": "minecraft:block/custom/fairy_flower_5" \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/resources/default/configuration/furniture.yml b/bukkit-loader/src/main/resources/resources/default/configuration/furniture.yml new file mode 100644 index 000000000..f34ff47b4 --- /dev/null +++ b/bukkit-loader/src/main/resources/resources/default/configuration/furniture.yml @@ -0,0 +1,128 @@ +items: + default:bench: + material: paper + custom-model-data: 2000 + data: + display-name: "" + model: + type: "minecraft:model" + path: "minecraft:item/custom/bench" + behavior: + type: furniture_item + furniture: + settings: + item: default:bench + sounds: + break: minecraft:block.bamboo_wood.break + place: minecraft:block.bamboo_wood.place + placement: + ground: + rules: + # ANY / FOUR / EIGHT / SIXTEEN / NORTH / EAST / WEST / SOUTH + rotation: EIGHT + # ANY / CENTER / HALF / QUARTER / CORNER + alignment: CENTER + elements: + - item: default:bench + display-transform: NONE + billboard: FIXED + position: 0.5,0,0 + translation: 0,0.5,0 + hitboxes: + - position: 0,0,0 + width: 1 + height: 1 + interactive: true + seats: + - 0,0,-0.1 0 + - position: 1,0,0 + width: 1 + height: 1 + interactive: true + seats: + - 1,0,-0.1 0 + loot: + template: loot_table:normal + arguments: + item: default:bench + default:table_lamp: + material: paper + custom-model-data: 2001 + data: + display-name: "" + model: + type: "minecraft:model" + path: "minecraft:item/custom/table_lamp" + behavior: + type: furniture_item + furniture: + settings: + item: default:table_lamp + sounds: + break: minecraft:block.lantern.break + place: minecraft:block.lantern.place + placement: + ground: + rules: + rotation: ANY + alignment: QUARTER + elements: + - item: default:table_lamp + display-transform: NONE + billboard: FIXED + translation: 0,0.5,0 + rotation: -90 + hitboxes: + - position: 0,0,0 + width: 0.7 + height: 0.1 + interactive: true + - position: 0,0.1,-0.1 + width: 0.1 + height: 0.6 + interactive: true + - position: 0,0.6,0.15 + width: 0.4 + height: 0.4 + interactive: true + loot: + template: loot_table:normal + arguments: + item: default:table_lamp + default:wooden_chair: + material: paper + custom-model-data: 2002 + data: + display-name: "" + model: + type: "minecraft:model" + path: "minecraft:item/custom/wooden_chair" + behavior: + type: furniture_item + furniture: + settings: + item: default:wooden_chair + sounds: + break: minecraft:block.bamboo_wood.break + place: minecraft:block.bamboo_wood.place + placement: + ground: + rules: + rotation: ANY + alignment: ANY + elements: + - item: default:wooden_chair + display-transform: NONE + billboard: FIXED + translation: 0,0.5,0 + hitboxes: + - position: 0,0,0 + width: 0.7 + height: 1.2 + interactive: true + seats: + - 0,0,-0.1 0 + loot: + template: loot_table:normal + arguments: + item: default:wooden_chair \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/resources/default/configuration/i18n.yml b/bukkit-loader/src/main/resources/resources/default/configuration/i18n.yml new file mode 100644 index 000000000..c5ccd2f01 --- /dev/null +++ b/bukkit-loader/src/main/resources/resources/default/configuration/i18n.yml @@ -0,0 +1,61 @@ +i18n: + en: + item.chinese_lantern: "Chinese Lantern" + item.fairy_flower: "Fairy Flower" + item.bench: "Bench" + item.table_lamp: "Table Lamp" + item.wooden_chair: "Wooden Chair" + item.topaz_rod: "Topaz Rod" + item.topaz_bow: "Topaz Bow" + item.topaz_crossbow: "Topaz Crossbow" + item.topaz_pickaxe: "Topaz Pickaxe" + item.topaz_axe: "Topaz Axe" + item.topaz_hoe: "Topaz Hoe" + item.topaz_shovel: "Topaz Shovel" + item.topaz_sword: "Topaz Sword" + item.topaz_ore: "Topaz Ore" + item.deepslate_topaz_ore: "Deepslate Topaz Ore" + item.topaz: "Topaz" + item.palm_log: "Palm Log" + item.stripped_palm_log: "Stripped Palm Log" + item.palm_wood: "Palm Wood" + item.stripped_palm_wood: "Stripped Palm Wood" + item.palm_planks: "Palm Planks" + item.palm_sapling: "Palm Sapling" + item.palm_leaves: "Palm Leaves" + category.default.name: "Default Assets" + category.default.lore: "Contains the default configuration of CraftEngine" + category.palm_tree: "Palm Tree" + category.topaz: "Topaz" + category.furniture: "Furniture" + category.misc: "Misc" + zh_cn: + item.chinese_lantern: "灯笼" + item.fairy_flower: "仙灵花" + item.bench: "长椅" + item.table_lamp: "台灯" + item.wooden_chair: "木椅" + item.topaz_rod: "黄玉钓竿" + item.topaz_bow: "黄玉弓" + item.topaz_crossbow: "黄玉弩" + item.topaz_pickaxe: "黄玉镐" + item.topaz_axe: "黄玉斧" + item.topaz_hoe: "黄玉锄" + item.topaz_shovel: "黄玉锹" + item.topaz_sword: "黄玉剑" + item.topaz_ore: "黄玉矿石" + item.deepslate_topaz_ore: "深层黄玉矿石" + item.topaz: "黄玉" + item.palm_log: "棕榈原木" + item.stripped_palm_log: "去皮棕榈原木" + item.palm_wood: "棕榈木" + item.stripped_palm_wood: "去皮棕榈木" + item.palm_planks: "棕榈木板" + item.palm_sapling: "棕榈树苗" + item.palm_leaves: "棕榈树叶" + category.default.name: "默认资产" + category.default.lore: "包含了CraftEngine的默认配置" + category.palm_tree: "棕榈树" + category.topaz: "黄玉" + category.furniture: "家具" + category.misc: "杂项" \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/resources/default/configuration/icons.yml b/bukkit-loader/src/main/resources/resources/default/configuration/icons.yml new file mode 100644 index 000000000..d54812865 --- /dev/null +++ b/bukkit-loader/src/main/resources/resources/default/configuration/icons.yml @@ -0,0 +1,9 @@ +images: + default:icons: + height: 10 + ascent: 9 + font: minecraft:icons + file: minecraft:font/image/icons.png + chars: + - '\ub000\ub001' + - '\ub002\ub003' \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/resources/default/configuration/items.yml b/bukkit-loader/src/main/resources/resources/default/configuration/items.yml new file mode 100644 index 000000000..5e9ded893 --- /dev/null +++ b/bukkit-loader/src/main/resources/resources/default/configuration/items.yml @@ -0,0 +1,189 @@ +items: + default:topaz_rod: + material: fishing_rod + custom-model-data: 1000 + data: + display-name: "<#FF8C00>" + tooltip-style: minecraft:topaz + model: + template: models:fishing_rod_2d + arguments: + rod_model: minecraft:item/custom/topaz_rod + rod_texture: minecraft:item/custom/topaz_rod + rod_cast_model: minecraft:item/custom/topaz_rod_cast + rod_cast_texture: minecraft:item/custom/topaz_rod_cast + default:topaz_bow: + material: bow + custom-model-data: 1000 + data: + display-name: "<#FF8C00>" + tooltip-style: minecraft:topaz + model: + template: models:bow_2d + arguments: + bow_model: minecraft:item/custom/topaz_bow + bow_texture: minecraft:item/custom/topaz_bow + bow_pulling_0_model: minecraft:item/custom/topaz_bow_pulling_0 + bow_pulling_0_texture: minecraft:item/custom/topaz_bow_pulling_0 + bow_pulling_1_model: minecraft:item/custom/topaz_bow_pulling_1 + bow_pulling_1_texture: minecraft:item/custom/topaz_bow_pulling_1 + bow_pulling_2_model: minecraft:item/custom/topaz_bow_pulling_2 + bow_pulling_2_texture: minecraft:item/custom/topaz_bow_pulling_2 + default:topaz_crossbow: + material: crossbow + custom-model-data: 1000 + data: + display-name: "<#FF8C00>" + tooltip-style: minecraft:topaz + model: + template: models:crossbow_2d + arguments: + crossbow_model: minecraft:item/custom/topaz_crossbow + crossbow_texture: minecraft:item/custom/topaz_crossbow + crossbow_pulling_0_model: minecraft:item/custom/topaz_crossbow_pulling_0 + crossbow_pulling_0_texture: minecraft:item/custom/topaz_crossbow_pulling_0 + crossbow_pulling_1_model: minecraft:item/custom/topaz_crossbow_pulling_1 + crossbow_pulling_1_texture: minecraft:item/custom/topaz_crossbow_pulling_1 + crossbow_pulling_2_model: minecraft:item/custom/topaz_crossbow_pulling_2 + crossbow_pulling_2_texture: minecraft:item/custom/topaz_crossbow_pulling_2 + crossbow_arrow_texture: minecraft:item/custom/topaz_crossbow_arrow + crossbow_arrow_model: minecraft:item/custom/topaz_crossbow_arrow + crossbow_firework_texture: minecraft:item/custom/topaz_crossbow_firework + crossbow_firework_model: minecraft:item/custom/topaz_crossbow_firework + default:topaz_pickaxe: + material: golden_pickaxe + custom-model-data: 1000 + data: + display-name: "<#FF8C00>" + tooltip-style: minecraft:topaz + components: + minecraft:max_damage: 64 + model: + type: minecraft:model + path: minecraft:item/custom/topaz_pickaxe + generation: + parent: "minecraft:item/handheld" + textures: + "layer0": "minecraft:item/custom/topaz_pickaxe" + default:topaz_axe: + material: golden_axe + custom-model-data: 1000 + data: + display-name: "<#FF8C00>" + tooltip-style: minecraft:topaz + components: + minecraft:max_damage: 64 + model: + type: minecraft:model + path: minecraft:item/custom/topaz_axe + generation: + parent: "minecraft:item/handheld" + textures: + "layer0": "minecraft:item/custom/topaz_axe" + default:topaz_hoe: + material: golden_hoe + custom-model-data: 1000 + data: + display-name: "<#FF8C00>" + tooltip-style: minecraft:topaz + components: + minecraft:max_damage: 64 + model: + type: minecraft:model + path: minecraft:item/custom/topaz_hoe + generation: + parent: "minecraft:item/handheld" + textures: + "layer0": "minecraft:item/custom/topaz_hoe" + default:topaz_shovel: + material: golden_shovel + custom-model-data: 1000 + data: + display-name: "<#FF8C00>" + tooltip-style: minecraft:topaz + components: + minecraft:max_damage: 64 + model: + type: minecraft:model + path: minecraft:item/custom/topaz_shovel + generation: + parent: "minecraft:item/handheld" + textures: + "layer0": "minecraft:item/custom/topaz_shovel" + default:topaz_sword: + material: golden_sword + custom-model-data: 1000 + data: + display-name: "<#FF8C00>" + tooltip-style: minecraft:topaz + components: + minecraft:max_damage: 64 + model: + type: minecraft:model + path: minecraft:item/custom/topaz_sword + generation: + parent: "minecraft:item/handheld" + textures: + "layer0": "minecraft:item/custom/topaz_sword" + +recipes: + default:topaz_shovel: + type: shaped + pattern: + - "A" + - "B" + - "B" + ingredients: + A: "default:topaz" + B: "minecraft:stick" + result: + id: default:topaz_shovel + count: 1 + default:topaz_axe: + type: shaped + pattern: + - "AA" + - "AB" + - " B" + ingredients: + A: "default:topaz" + B: "minecraft:stick" + result: + id: default:topaz_axe + count: 1 + default:topaz_sword: + type: shaped + pattern: + - "A" + - "A" + - "B" + ingredients: + A: "default:topaz" + B: "minecraft:stick" + result: + id: default:topaz_sword + count: 1 + default:topaz_hoe: + type: shaped + pattern: + - "AA" + - " B" + - " B" + ingredients: + A: "default:topaz" + B: "minecraft:stick" + result: + id: default:topaz_hoe + count: 1 + default:topaz_pickaxe: + type: shaped + pattern: + - "AAA" + - " B " + - " B " + ingredients: + A: "default:topaz" + B: "minecraft:stick" + result: + id: default:topaz_pickaxe + count: 1 \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/resources/default/configuration/ores.yml b/bukkit-loader/src/main/resources/resources/default/configuration/ores.yml new file mode 100644 index 000000000..19fd10f4c --- /dev/null +++ b/bukkit-loader/src/main/resources/resources/default/configuration/ores.yml @@ -0,0 +1,127 @@ +items: + default:topaz_ore: + material: paper + custom-model-data: 1010 + data: + display-name: "" + model: + type: "minecraft:model" + path: "minecraft:item/custom/topaz_ore" + generation: + parent: "minecraft:block/custom/topaz_ore" + behavior: + type: block_item + block: default:topaz_ore + default:deepslate_topaz_ore: + material: paper + custom-model-data: 1011 + data: + display-name: "" + model: + type: "minecraft:model" + path: "minecraft:item/custom/deepslate_topaz_ore" + generation: + parent: "minecraft:block/custom/deepslate_topaz_ore" + behavior: + type: block_item + block: default:deepslate_topaz_ore + default:topaz: + material: paper + custom-model-data: 1012 + data: + display-name: "<#FF8C00>" + model: + template: models:generated + arguments: + model_path: "minecraft:item/custom/topaz" + texture_path: "minecraft:item/custom/topaz" + +blocks: + default:topaz_ore: + loot: + template: loot_table:ore + arguments: + ore_drop: default:topaz + ore_block: default:topaz_ore + min_exp: 3 + max_exp: 7 + settings: + template: + - block_settings:ore + - block_settings:pickaxe_level_2 + overrides: + item: default:topaz_ore + state: + id: 13 + state: note_block:13 + model: + path: "minecraft:block/custom/topaz_ore" + generation: + parent: "minecraft:block/cube_all" + textures: + "all": "minecraft:block/custom/topaz_ore" + default:deepslate_topaz_ore: + loot: + template: loot_table:ore + arguments: + ore_drop: default:topaz + ore_block: default:deepslate_topaz_ore + min_exp: 3 + max_exp: 7 + settings: + template: + - block_settings:deepslate_ore + - block_settings:pickaxe_level_2 + overrides: + item: default:deepslate_topaz_ore + state: + id: 14 + state: note_block:14 + model: + path: "minecraft:block/custom/deepslate_topaz_ore" + generation: + parent: "minecraft:block/cube_all" + textures: + "all": "minecraft:block/custom/deepslate_topaz_ore" + +recipes: + default:topaz_from_smelting_topaz_ore: + type: smelting + experience: 1.0 + category: misc + group: topaz + time: 200 + ingredient: "default:topaz_ore" + result: + id: default:topaz + count: 1 + default:topaz_from_smelting_deepslate_topaz_ore: + type: smelting + experience: 1.0 + category: misc + group: topaz + time: 200 + ingredient: "default:deepslate_topaz_ore" + result: + id: default:topaz + count: 1 + default:topaz_from_blasting_topaz_ore: + type: blasting + experience: 1.0 + category: misc + group: topaz + time: 100 + ingredient: "default:topaz_ore" + result: + id: default:topaz + count: 1 + default:topaz_from_blasting_deepslate_topaz_ore: + type: blasting + experience: 1.0 + category: misc + group: topaz + time: 100 + ingredient: "default:deepslate_topaz_ore" + result: + id: default:topaz + count: 1 \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/resources/default/configuration/palm_tree.yml b/bukkit-loader/src/main/resources/resources/default/configuration/palm_tree.yml new file mode 100644 index 000000000..a17becf3a --- /dev/null +++ b/bukkit-loader/src/main/resources/resources/default/configuration/palm_tree.yml @@ -0,0 +1,347 @@ +items: + default:palm_log: + material: paper + custom-model-data: 1000 + settings: + fuel-time: 300 + tags: + - "default:palm_logs" + - "minecraft:logs" + - "minecraft:logs_that_burn" + data: + display-name: "" + model: + type: "minecraft:model" + path: "minecraft:item/custom/palm_log" + generation: + parent: "minecraft:block/custom/palm_log" + behavior: + type: block_item + block: + behavior: + type: strippable_block + stripped: default:stripped_palm_log + loot: + template: loot_table:normal + arguments: + item: default:palm_log + settings: + template: block_settings:log + overrides: + item: default:palm_log + states: + template: states:log + arguments: + base_block: note_block + texture_top_path: minecraft:block/custom/palm_log_top + texture_side_path: minecraft:block/custom/palm_log + model_vertical_path: minecraft:block/custom/palm_log + model_horizontal_path: minecraft:block/custom/palm_log_horizontal + vanilla_id: + type: self_increase_int + from: 0 + to: 2 + internal_id: + type: self_increase_int + from: 0 + to: 2 + default:stripped_palm_log: + material: paper + custom-model-data: 1001 + settings: + fuel-time: 300 + tags: + - "default:palm_logs" + - "minecraft:logs" + - "minecraft:logs_that_burn" + data: + display-name: "" + model: + type: "minecraft:model" + path: "minecraft:item/custom/stripped_palm_log" + generation: + parent: "minecraft:block/custom/stripped_palm_log" + behavior: + type: block_item + block: + loot: + template: loot_table:normal + arguments: + item: default:stripped_palm_log + settings: + template: block_settings:log + overrides: + item: default:stripped_palm_log + states: + template: states:log + arguments: + base_block: note_block + texture_top_path: minecraft:block/custom/stripped_palm_log_top + texture_side_path: minecraft:block/custom/stripped_palm_log + model_vertical_path: minecraft:block/custom/stripped_palm_log + model_horizontal_path: minecraft:block/custom/stripped_palm_log_horizontal + vanilla_id: + type: self_increase_int + from: 3 + to: 5 + internal_id: + type: self_increase_int + from: 3 + to: 5 + default:palm_wood: + material: paper + custom-model-data: 1002 + settings: + fuel-time: 300 + tags: + - "default:palm_logs" + - "minecraft:logs" + - "minecraft:logs_that_burn" + data: + display-name: "" + model: + type: "minecraft:model" + path: "minecraft:item/custom/palm_wood" + generation: + parent: "minecraft:block/custom/palm_wood" + behavior: + type: block_item + block: + behavior: + type: strippable_block + stripped: default:stripped_palm_wood + loot: + template: loot_table:normal + arguments: + item: default:palm_wood + settings: + template: block_settings:log + overrides: + item: default:palm_wood + states: + template: states:log + arguments: + base_block: note_block + texture_top_path: minecraft:block/custom/palm_log + texture_side_path: minecraft:block/custom/palm_log + model_vertical_path: minecraft:block/custom/palm_wood + model_horizontal_path: minecraft:block/custom/palm_wood_horizontal + vanilla_id: + type: self_increase_int + from: 6 + to: 8 + internal_id: + type: self_increase_int + from: 6 + to: 8 + default:stripped_palm_wood: + material: paper + custom-model-data: 1003 + settings: + fuel-time: 300 + tags: + - "default:palm_logs" + - "minecraft:logs" + - "minecraft:logs_that_burn" + data: + display-name: "" + model: + type: "minecraft:model" + path: "minecraft:item/custom/stripped_palm_wood" + generation: + parent: "minecraft:block/custom/stripped_palm_wood" + behavior: + type: block_item + block: + loot: + template: loot_table:normal + arguments: + item: default:stripped_palm_wood + settings: + template: block_settings:log + overrides: + item: default:stripped_palm_wood + states: + template: states:log + arguments: + base_block: note_block + texture_top_path: minecraft:block/custom/stripped_palm_log + texture_side_path: minecraft:block/custom/stripped_palm_log + model_vertical_path: minecraft:block/custom/stripped_palm_wood + model_horizontal_path: minecraft:block/custom/stripped_palm_wood_horizontal + vanilla_id: + type: self_increase_int + from: 9 + to: 11 + internal_id: + type: self_increase_int + from: 9 + to: 11 + default:palm_planks: + material: paper + custom-model-data: 1004 + settings: + fuel-time: 300 + tags: + - "minecraft:planks" + - "minecraft:wooden_tool_materials" + data: + display-name: "" + model: + type: "minecraft:model" + path: "minecraft:item/custom/palm_planks" + generation: + parent: "minecraft:block/custom/palm_planks" + behavior: + type: block_item + block: + settings: + template: block_settings:planks + overrides: + item: default:palm_planks + loot: + template: loot_table:normal + arguments: + item: default:palm_planks + state: + id: 12 + state: note_block:12 + model: + path: "minecraft:block/custom/palm_planks" + generation: + parent: "minecraft:block/cube_all" + textures: + "all": "minecraft:block/custom/palm_planks" + default:palm_sapling: + material: paper + custom-model-data: 1005 + settings: + fuel-time: 100 + data: + display-name: "" + model: + template: models:generated + arguments: + model_path: "minecraft:item/custom/palm_sapling" + texture_path: "minecraft:block/custom/palm_sapling" + behavior: + type: block_item + block: + settings: + template: block_settings:sapling + overrides: + item: default:palm_sapling + behavior: + type: sapling_block + # This requires you to register a custom tree configuration with data pack + # To prevent errors, we use tree feature from vanilla here + feature: minecraft:fancy_oak + bone-meal-success-chance: 0.45 + tags: + - minecraft:dirt + - minecraft:farmland + - minecraft:sand + loot: + template: loot_table:normal + arguments: + item: default:palm_sapling + states: + properties: + stage: + type: int + default-value: 0 + range: 0~1 + appearances: + default: + state: oak_sapling:0 + model: + path: "minecraft:block/custom/palm_sapling" + generation: + parent: "minecraft:block/cross" + textures: + "cross": "minecraft:block/custom/palm_sapling" + variants: + stage=0: + appearance: "default" + id: 0 + stage=1: + appearance: "default" + id: 1 + default:palm_leaves: + material: oak_leaves + custom-model-data: 1000 + data: + display-name: "" + components: + minecraft:block_state: + distance: "1" + persistent: "false" + waterlogged: "false" + model: + type: "minecraft:model" + path: "minecraft:item/custom/palm_leaves" + generation: + parent: "minecraft:block/custom/palm_leaves" + tints: + - type: "minecraft:constant" + value: -12012264 + behavior: + type: block_item + block: + behavior: + type: leaves_block + loot: + template: loot_table:leaves + arguments: + leaves: default:palm_leaves + sapling: default:palm_sapling + settings: + template: block_settings:leaves + overrides: + item: default:palm_leaves + states: + template: states:leaves + arguments: + default_state: oak_leaves[distance=1,persistent=false,waterlogged=false] + waterlogged_state: oak_leaves[distance=1,persistent=false,waterlogged=true] + model_path: "minecraft:block/custom/palm_leaves" + texture_path: "minecraft:block/custom/palm_leaves" + internal_id: + type: self_increase_int + from: 0 + to: 27 + +recipes: + default:palm_planks: + type: shapeless + category: building + group: planks + ingredients: + A: "#default:palm_logs" + result: + id: default:palm_planks + count: 4 + default:palm_wood: + type: shaped + category: building + group: bark + pattern: + - "AA" + - "AA" + ingredients: + A: "default:palm_log" + result: + id: default:palm_wood + count: 3 + default:stripped_palm_wood: + type: shaped + category: building + group: bark + pattern: + - "AA" + - "AA" + ingredients: + A: "default:stripped_palm_log" + result: + id: default:stripped_palm_wood + count: 3 \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/resources/default/configuration/templates.yml b/bukkit-loader/src/main/resources/resources/default/configuration/templates.yml new file mode 100644 index 000000000..bad3f1bf9 --- /dev/null +++ b/bukkit-loader/src/main/resources/resources/default/configuration/templates.yml @@ -0,0 +1,563 @@ +# map-color: https://minecraft.wiki/w/Map_item_format +templates: + # Models + models:generated: + type: "minecraft:model" + path: "{model_path}" + generation: + parent: "minecraft:item/generated" + textures: + "layer0": "{texture_path}" + models:fishing_rod_2d: + type: "minecraft:condition" + property: "minecraft:fishing_rod/cast" + on-false: + type: "minecraft:model" + path: "{rod_model}" + generation: + parent: "minecraft:item/fishing_rod" + textures: + "layer0": "{rod_texture}" + on-true: + type: "minecraft:model" + path: "{rod_cast_model}" + generation: + parent: "minecraft:item/fishing_rod" + textures: + "layer0": "{rod_cast_texture}" + models:bow_2d: + type: "minecraft:condition" + property: "minecraft:using_item" + on-false: + type: "minecraft:model" + path: "{bow_model}" + generation: + parent: "minecraft:item/bow" + textures: + "layer0": "{bow_texture}" + on-true: + type: "minecraft:range_dispatch" + property: "minecraft:use_duration" + scale: 0.05 + entries: + - model: + type: minecraft:model + path: "{bow_pulling_1_model}" + generation: + parent: "minecraft:item/bow_pulling_1" + textures: + "layer0": "{bow_pulling_1_texture}" + threshold: 0.65 + - model: + type: minecraft:model + path: "{bow_pulling_2_model}" + generation: + parent: "minecraft:item/bow_pulling_2" + textures: + "layer0": "{bow_pulling_2_texture}" + threshold: 0.9 + fallback: + type: minecraft:model + path: "{bow_pulling_0_model}" + generation: + parent: "minecraft:item/bow_pulling_0" + textures: + "layer0": "{bow_pulling_0_texture}" + models:crossbow_2d: + type: "minecraft:condition" + property: "minecraft:using_item" + on-false: + type: "minecraft:select" + property: "minecraft:charge_type" + cases: + - when: arrow + model: + type: minecraft:model + path: "{crossbow_arrow_model}" + generation: + parent: "minecraft:item/crossbow_arrow" + textures: + "layer0": "{crossbow_arrow_texture}" + - when: rocket + model: + type: minecraft:model + path: "{crossbow_firework_model}" + generation: + parent: "minecraft:item/crossbow_firework" + textures: + "layer0": "{crossbow_firework_texture}" + fallback: + type: minecraft:model + path: "{crossbow_model}" + generation: + parent: "minecraft:item/crossbow" + textures: + "layer0": "{crossbow_texture}" + on-true: + type: "minecraft:range_dispatch" + property: "minecraft:crossbow/pull" + entries: + - model: + type: minecraft:model + path: "{crossbow_pulling_1_model}" + generation: + parent: "minecraft:item/crossbow_pulling_1" + textures: + "layer0": "{crossbow_pulling_1_texture}" + threshold: 0.58 + - model: + type: minecraft:model + path: "{crossbow_pulling_2_model}" + generation: + parent: "minecraft:item/crossbow_pulling_2" + textures: + "layer0": "{crossbow_pulling_2_texture}" + threshold: 1.0 + fallback: + type: minecraft:model + path: "{crossbow_pulling_0_model}" + generation: + parent: "minecraft:item/crossbow_pulling_0" + textures: + "layer0": "{crossbow_pulling_0_texture}" + + # Block Settings + block_settings:surface_decoration: + hardness: 0 + resistance: 0 + block_settings:sapling: + template: block_settings:surface_decoration + overrides: + push-reaction: DESTROY + is-randomly-ticking: true + map-color: 7 + sounds: + break: minecraft:block.grass.break + step: minecraft:block.grass.step + place: minecraft:block.grass.place + hit: minecraft:block.grass.hit + fall: minecraft:block.grass.fall + tags: + - minecraft:mineable/axe + - minecraft:saplings + - minecraft:sword_efficient + block_settings:leaves: + hardness: 0.2 + resistance: 0.2 + push-reaction: DESTROY # NORMAL,DESTROY,BLOCK,IGNORE,PUSH_ONLY + replaceable: false + burnable: true + burn-chance: 30 + fire-spread-chance: 100 + is-redstone-conductor: false + is-suffocating: false + instrument: HARP + tags: + - minecraft:mineable/hoe + - minecraft:sword_efficient + - minecraft:leaves + - minecraft:replaceable_by_trees + sounds: + break: minecraft:block.grass.break + step: minecraft:block.grass.step + place: minecraft:block.grass.place + hit: minecraft:block.grass.hit + fall: minecraft:block.grass.fall + + block_settings:pickaxe_level_1: + correct-tools: + - minecraft:wooden_pickaxe + - minecraft:stone_pickaxe + - minecraft:iron_pickaxe + - minecraft:golden_pickaxe + - minecraft:diamond_pickaxe + - minecraft:netherite_pickaxe + - default:topaz_pickaxe + block_settings:pickaxe_level_2: + correct-tools: + - minecraft:stone_pickaxe + - minecraft:iron_pickaxe + - minecraft:golden_pickaxe + - minecraft:diamond_pickaxe + - minecraft:netherite_pickaxe + - default:topaz_pickaxe + block_settings:pickaxe_level_3: + correct-tools: + - minecraft:iron_pickaxe + - minecraft:golden_pickaxe + - minecraft:diamond_pickaxe + - minecraft:netherite_pickaxe + - default:topaz_pickaxe + block_settings:pickaxe_level_4: + correct-tools: + - minecraft:diamond_pickaxe + - minecraft:netherite_pickaxe + block_settings:log: + hardness: 2.0 + resistance: 2.0 + push-reaction: NORMAL + replaceable: false + burnable: true + burn-chance: 5 + fire-spread-chance: 5 + is-redstone-conductor: true + is-suffocating: true + instrument: BASS + can-occlude: true + tags: + - minecraft:mineable/axe + - minecraft:logs_that_burn + - minecraft:logs + - minecraft:completes_find_tree_tutorial + sounds: + break: minecraft:block.wood.break + step: minecraft:block.wood.step + place: minecraft:block.wood.place + hit: minecraft:block.wood.hit + fall: minecraft:block.wood.fall + block_settings:planks: + hardness: 2.0 + resistance: 2.0 + push-reaction: NORMAL + replaceable: false + burnable: true + burn-chance: 5 + fire-spread-chance: 5 + is-redstone-conductor: true + is-suffocating: true + instrument: BASS + can-occlude: true + tags: + - minecraft:mineable/axe + sounds: + break: minecraft:block.wood.break + step: minecraft:block.wood.step + place: minecraft:block.wood.place + hit: minecraft:block.wood.hit + fall: minecraft:block.wood.fall + block_settings:ore: + hardness: 4.5 + resistance: 3.0 + push-reaction: NORMAL + is-redstone-conductor: true + is-suffocating: true + instrument: BASEDRUM + can-occlude: true + map-color: 11 + tags: + - minecraft:mineable/pickaxe + sounds: + break: minecraft:block.stone.break + step: minecraft:block.stone.step + place: minecraft:block.stone.place + hit: minecraft:block.stone.hit + fall: minecraft:block.stone.fall + block_settings:deepslate_ore: + hardness: 6 + resistance: 3.0 + push-reaction: NORMAL + is-redstone-conductor: true + is-suffocating: true + instrument: BASEDRUM + can-occlude: true + map-color: 59 + tags: + - minecraft:mineable/pickaxe + sounds: + break: minecraft:block.deepslate.break + step: minecraft:block.deepslate.step + place: minecraft:block.deepslate.place + hit: minecraft:block.deepslate.hit + fall: minecraft:block.deepslate.fall + + # Block States + states:log: + properties: + axis: + type: axis + default: y + appearances: + axisY: + state: "{base_block}:{vanilla_id}" + model: + path: "{model_vertical_path}" + generation: + parent: "minecraft:block/cube_column" + textures: + "end": "{texture_top_path}" + "side": "{texture_side_path}" + axisX: + state: "{base_block}:{vanilla_id}" + model: + x: 90 + y: 90 + path: "{model_horizontal_path}" + generation: + parent: "minecraft:block/cube_column_horizontal" + textures: + "end": "{texture_top_path}" + "side": "{texture_side_path}" + axisZ: + state: "{base_block}:{vanilla_id}" + model: + x: 90 + path: "{model_horizontal_path}" + generation: + parent: "minecraft:block/cube_column_horizontal" + textures: + "end": "{texture_top_path}" + "side": "{texture_side_path}" + variants: + axis=x: + appearance: axisX + id: "{internal_id}" + axis=y: + appearance: axisY + id: "{internal_id}" + axis=z: + appearance: axisZ + id: "{internal_id}" + states:leaves: + properties: + waterlogged: + type: boolean + default: false + persistent: + type: boolean + default: true + distance: + type: int + default: 7 + range: 1~7 + appearances: + default: + state: "{default_state}" + model: + path: "{model_path}" + generation: + parent: "minecraft:block/leaves" + textures: + "all": "{texture_path}" + waterlogged: + state: "{waterlogged_state}" + model: + path: "{model_path}" + variants: + distance=1,persistent=false,waterlogged=false: + appearance: "default" + id: "{internal_id}" + distance=2,persistent=false,waterlogged=false: + appearance: "default" + id: "{internal_id}" + distance=3,persistent=false,waterlogged=false: + appearance: "default" + id: "{internal_id}" + distance=4,persistent=false,waterlogged=false: + appearance: "default" + id: "{internal_id}" + distance=5,persistent=false,waterlogged=false: + appearance: "default" + id: "{internal_id}" + distance=6,persistent=false,waterlogged=false: + appearance: "default" + id: "{internal_id}" + distance=7,persistent=false,waterlogged=false: + appearance: "default" + id: "{internal_id}" + settings: + is-randomly-ticking: true + distance=1,persistent=true,waterlogged=false: + appearance: "default" + id: "{internal_id}" + distance=2,persistent=true,waterlogged=false: + appearance: "default" + id: "{internal_id}" + distance=3,persistent=true,waterlogged=false: + appearance: "default" + id: "{internal_id}" + distance=4,persistent=true,waterlogged=false: + appearance: "default" + id: "{internal_id}" + distance=5,persistent=true,waterlogged=false: + appearance: "default" + id: "{internal_id}" + distance=6,persistent=true,waterlogged=false: + appearance: "default" + id: "{internal_id}" + distance=7,persistent=true,waterlogged=false: + appearance: "default" + id: "{internal_id}" + distance=1,persistent=false,waterlogged=true: + appearance: "waterlogged" + id: "{internal_id}" + settings: + resistance: 1200.0 + burnable: false + distance=2,persistent=false,waterlogged=true: + appearance: "waterlogged" + id: "{internal_id}" + settings: + resistance: 1200.0 + burnable: false + distance=3,persistent=false,waterlogged=true: + appearance: "waterlogged" + id: "{internal_id}" + settings: + resistance: 1200.0 + burnable: false + distance=4,persistent=false,waterlogged=true: + appearance: "waterlogged" + id: "{internal_id}" + settings: + resistance: 1200.0 + burnable: false + distance=5,persistent=false,waterlogged=true: + appearance: "waterlogged" + id: "{internal_id}" + settings: + resistance: 1200.0 + burnable: false + distance=6,persistent=false,waterlogged=true: + appearance: "waterlogged" + id: "{internal_id}" + settings: + resistance: 1200.0 + burnable: false + distance=7,persistent=false,waterlogged=true: + appearance: "waterlogged" + id: "{internal_id}" + settings: + resistance: 1200.0 + burnable: false + is-randomly-ticking: true + distance=1,persistent=true,waterlogged=true: + appearance: "waterlogged" + id: "{internal_id}" + settings: + resistance: 1200.0 + burnable: false + distance=2,persistent=true,waterlogged=true: + appearance: "waterlogged" + id: "{internal_id}" + settings: + resistance: 1200.0 + burnable: false + distance=3,persistent=true,waterlogged=true: + appearance: "waterlogged" + id: "{internal_id}" + settings: + resistance: 1200.0 + burnable: false + distance=4,persistent=true,waterlogged=true: + appearance: "waterlogged" + id: "{internal_id}" + settings: + resistance: 1200.0 + burnable: false + distance=5,persistent=true,waterlogged=true: + appearance: "waterlogged" + id: "{internal_id}" + settings: + resistance: 1200.0 + burnable: false + distance=6,persistent=true,waterlogged=true: + appearance: "waterlogged" + id: "{internal_id}" + settings: + resistance: 1200.0 + burnable: false + distance=7,persistent=true,waterlogged=true: + appearance: "waterlogged" + id: "{internal_id}" + settings: + resistance: 1200.0 + burnable: false + + # Loot Tables + loot_table:normal: + pools: + - rolls: 1 + conditions: + - type: survives_explosion + entries: + - type: item + item: "{item}" + loot_table:ore: + pools: + - rolls: 1 + entries: + - type: alternatives + children: + - type: item + item: "{ore_block}" + conditions: + - type: enchantment + predicate: minecraft:silk_touch>=1 + - type: item + item: "{ore_drop}" + functions: + - type: apply_bonus + enchantment: minecraft:fortune + formula: + type: ore_drops + - type: explosion_decay + - type: drop_exp + count: + type: uniform + min: "{min_exp}" + max: "{max_exp}" + loot_table:leaves: + pools: + - rolls: 1 + entries: + - type: alternatives + children: + - type: item + item: "{leaves}" + conditions: + - type: any_of + terms: + - type: match_item + id: minecraft:shears + - type: enchantment + predicate: minecraft:silk_touch>=1 + - type: item + item: "{sapling}" + conditions: + - type: survives_explosion + - type: table_bonus + enchantment: minecraft:fortune + chances: + - 0.05 + - 0.0625 + - 0.083333333 + - 0.1 + - rolls: 1 + conditions: + - type: inverted + term: + type: any_of + terms: + - type: match_item + id: minecraft:shears + - type: enchantment + predicate: minecraft:silk_touch>=1 + entries: + - type: item + item: minecraft:stick + conditions: + - type: table_bonus + enchantment: minecraft:fortune + chances: + - 0.02 + - 0.022222222 + - 0.025 + - 0.033333333 + - 0.1 + functions: + - type: set_count + count: + type: uniform + min: 1 + max: 2 + - type: explosion_decay \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/resources/default/pack.yml b/bukkit-loader/src/main/resources/resources/default/pack.yml new file mode 100644 index 000000000..76b8a33b2 --- /dev/null +++ b/bukkit-loader/src/main/resources/resources/default/pack.yml @@ -0,0 +1,4 @@ +author: XiaoMoMi +version: 0.0.1 +description: Default Assets for CraftEngine +namespace: default \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/resources/default/resourcepack/assets/minecraft/models/block/custom/fairy_flower_1.json b/bukkit-loader/src/main/resources/resources/default/resourcepack/assets/minecraft/models/block/custom/fairy_flower_1.json new file mode 100644 index 000000000..fd7176e69 --- /dev/null +++ b/bukkit-loader/src/main/resources/resources/default/resourcepack/assets/minecraft/models/block/custom/fairy_flower_1.json @@ -0,0 +1,58 @@ +{ + "credit": "XiaoMoMi", + "textures": { + "0": "block/custom/fairy_flower_1", + "particle": "block/custom/fairy_flower_1" + }, + "elements": [ + { + "from": [3.75, 0, 12.25], + "to": [15.75, 29, 12.25], + "rotation": {"angle": 45, "axis": "y", "origin": [3.75, 0, 12.25]}, + "faces": { + "north": {"uv": [0, 0, 6, 14.5], "texture": "#0"}, + "east": {"uv": [0, 0, 2, 2], "texture": "#0"}, + "south": {"uv": [0, 0, 6, 14.5], "texture": "#0"}, + "west": {"uv": [0, 0, 2, 2], "texture": "#0"}, + "up": {"uv": [0, 0, 2, 2], "texture": "#0"}, + "down": {"uv": [0, 0, 2, 2], "texture": "#0"} + } + }, + { + "from": [3.75, 0, 3.75], + "to": [3.75, 29, 15.75], + "rotation": {"angle": 45, "axis": "y", "origin": [3.75, 0, 3.75]}, + "faces": { + "north": {"uv": [0, 0, 2, 2], "texture": "#0"}, + "east": {"uv": [0, 0, 6, 14.5], "texture": "#0"}, + "south": {"uv": [0, 0, 2, 2], "texture": "#0"}, + "west": {"uv": [0, 0, 6, 14.5], "texture": "#0"}, + "up": {"uv": [0, 0, 2, 2], "rotation": 270, "texture": "#0"}, + "down": {"uv": [0, 0, 2, 2], "rotation": 90, "texture": "#0"} + } + }, + { + "from": [7, 28, 7], + "to": [9, 30, 9], + "rotation": {"angle": 0, "axis": "y", "origin": [7, 28, 7]}, + "faces": { + "north": {"uv": [15, 0, 16, 1], "texture": "#0"}, + "east": {"uv": [15, 0, 16, 1], "texture": "#0"}, + "south": {"uv": [15, 0, 16, 1], "texture": "#0"}, + "west": {"uv": [15, 0, 16, 1], "texture": "#0"}, + "up": {"uv": [15, 0, 16, 1], "texture": "#0"}, + "down": {"uv": [15, 0, 16, 1], "texture": "#0"} + } + } + ], + "display": { + "head": { + "translation": [0, 18.5, 0] + }, + "fixed": { + "rotation": [-90, 0, 0], + "translation": [0, 0, -15], + "scale": [2, 2, 2] + } + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/resources/default/resourcepack/assets/minecraft/models/item/custom/bench.json b/bukkit-loader/src/main/resources/resources/default/resourcepack/assets/minecraft/models/item/custom/bench.json new file mode 100644 index 000000000..7d88139de --- /dev/null +++ b/bukkit-loader/src/main/resources/resources/default/resourcepack/assets/minecraft/models/item/custom/bench.json @@ -0,0 +1,255 @@ +{ + "credit": "MadewithBlockbench", + "texture_size": [64, 64], + "textures": { + "0": "item/custom/bench", + "particle": "item/custom/bench" + }, + "elements": [ + { + "from": [-8, 0, 1], + "to": [-6, 7, 3], + "faces": { + "north": {"uv": [7, 10.25, 7.5, 12], "texture": "#0"}, + "east": {"uv": [7.5, 10.25, 8, 12], "texture": "#0"}, + "south": {"uv": [8, 10.25, 8.5, 12], "texture": "#0"}, + "west": {"uv": [8.5, 10.25, 9, 12], "texture": "#0"}, + "up": {"uv": [10.5, 6.75, 10, 6.25], "texture": "#0"}, + "down": {"uv": [10.5, 6.75, 10, 7.25], "texture": "#0"} + } + }, + { + "from": [22, 0, 1], + "to": [24, 7, 3], + "rotation": {"angle": 0, "axis": "y", "origin": [16, 0, 0]}, + "faces": { + "north": {"uv": [7.5, 10.25, 7, 12], "texture": "#0"}, + "east": {"uv": [9, 10.25, 8.5, 12], "texture": "#0"}, + "south": {"uv": [8.5, 10.25, 8, 12], "texture": "#0"}, + "west": {"uv": [8, 10.25, 7.5, 12], "texture": "#0"}, + "up": {"uv": [10, 6.75, 10.5, 6.25], "texture": "#0"}, + "down": {"uv": [10, 6.75, 10.5, 7.25], "texture": "#0"} + } + }, + { + "from": [22, 0, 13], + "to": [24, 7, 15], + "rotation": {"angle": 0, "axis": "y", "origin": [16, 0, 16]}, + "faces": { + "north": {"uv": [8, 10.25, 8.5, 12], "texture": "#0"}, + "east": {"uv": [8.5, 10.25, 9, 12], "texture": "#0"}, + "south": {"uv": [7, 10.25, 7.5, 12], "texture": "#0"}, + "west": {"uv": [7.5, 10.25, 8, 12], "texture": "#0"}, + "up": {"uv": [10, 6.25, 10.5, 6.75], "texture": "#0"}, + "down": {"uv": [10, 7.25, 10.5, 6.75], "texture": "#0"} + } + }, + { + "from": [-8, 0, 13], + "to": [-6, 7, 15], + "rotation": {"angle": 0, "axis": "y", "origin": [0, 0, 16]}, + "faces": { + "north": {"uv": [8.5, 10.25, 8, 12], "texture": "#0"}, + "east": {"uv": [8, 10.25, 7.5, 12], "texture": "#0"}, + "south": {"uv": [7.5, 10.25, 7, 12], "texture": "#0"}, + "west": {"uv": [9, 10.25, 8.5, 12], "texture": "#0"}, + "up": {"uv": [10.5, 6.25, 10, 6.75], "texture": "#0"}, + "down": {"uv": [10.5, 7.25, 10, 6.75], "texture": "#0"} + } + }, + { + "from": [-8, 13, 1], + "to": [-6, 15, 13], + "faces": { + "north": {"uv": [12.25, 9.25, 12.75, 9.75], "texture": "#0"}, + "east": {"uv": [13, 5.75, 10, 6.25], "texture": "#0"}, + "south": {"uv": [12.25, 9.75, 12.75, 10.25], "texture": "#0"}, + "west": {"uv": [10, 5.75, 13, 6.25], "texture": "#0"}, + "up": {"uv": [2.5, 13.25, 2, 10.25], "texture": "#0"}, + "down": {"uv": [3, 10.25, 2.5, 13.25], "texture": "#0"} + } + }, + { + "from": [-7, 9, 1], + "to": [-7, 13, 13], + "faces": { + "north": {"uv": [0, 0, 0, 1], "texture": "#0"}, + "east": {"uv": [7, 4.25, 10, 5.25], "texture": "#0"}, + "south": {"uv": [0, 0, 0, 1], "texture": "#0"}, + "west": {"uv": [7, 4.25, 10, 5.25], "texture": "#0"}, + "up": {"uv": [0, 3, 0, 0], "texture": "#0"}, + "down": {"uv": [0, 0, 0, 3], "texture": "#0"} + } + }, + { + "from": [-8, 9, 13], + "to": [-6, 21, 15], + "faces": { + "north": {"uv": [5, 10.25, 5.5, 13.25], "texture": "#0"}, + "east": {"uv": [5.5, 10.25, 6, 13.25], "texture": "#0"}, + "south": {"uv": [6, 10.25, 6.5, 13.25], "texture": "#0"}, + "west": {"uv": [6.5, 10.25, 7, 13.25], "texture": "#0"}, + "up": {"uv": [12.75, 11.75, 12.25, 11.25], "texture": "#0"}, + "down": {"uv": [12.75, 11.75, 12.25, 12.25], "texture": "#0"} + } + }, + { + "from": [-6, 8, 14], + "to": [22, 22, 14], + "faces": { + "north": {"uv": [0, 0, 7, 3.5], "texture": "#0"}, + "east": {"uv": [0, 0, 0, 3.5], "texture": "#0"}, + "south": {"uv": [0, 3.5, 7, 7], "texture": "#0"}, + "west": {"uv": [0, 0, 0, 3.5], "texture": "#0"}, + "up": {"uv": [7, 0, 0, 0], "texture": "#0"}, + "down": {"uv": [7, 0, 0, 0], "texture": "#0"} + } + }, + { + "from": [-8, 7, 0], + "to": [-6, 9, 15], + "faces": { + "north": {"uv": [12.25, 12.25, 12.75, 12.75], "texture": "#0"}, + "east": {"uv": [10, 3.25, 13.75, 3.75], "texture": "#0"}, + "south": {"uv": [12.5, 6.25, 13, 6.75], "texture": "#0"}, + "west": {"uv": [10, 3.75, 13.75, 4.25], "texture": "#0"}, + "up": {"uv": [0.5, 14, 0, 10.25], "texture": "#0"}, + "down": {"uv": [1, 10.25, 0.5, 14], "texture": "#0"} + } + }, + { + "from": [22, 7, 0], + "to": [24, 9, 15], + "rotation": {"angle": 0, "axis": "y", "origin": [16, 0, 0]}, + "faces": { + "north": {"uv": [12.75, 12.25, 12.25, 12.75], "texture": "#0"}, + "east": {"uv": [13.75, 3.75, 10, 4.25], "texture": "#0"}, + "south": {"uv": [13, 6.25, 12.5, 6.75], "texture": "#0"}, + "west": {"uv": [13.75, 3.25, 10, 3.75], "texture": "#0"}, + "up": {"uv": [0, 14, 0.5, 10.25], "texture": "#0"}, + "down": {"uv": [0.5, 10.25, 1, 14], "texture": "#0"} + } + }, + { + "from": [22, 13, 1], + "to": [24, 15, 13], + "rotation": {"angle": 0, "axis": "y", "origin": [16, 0, 0]}, + "faces": { + "north": {"uv": [12.75, 9.25, 12.25, 9.75], "texture": "#0"}, + "east": {"uv": [13, 5.75, 10, 6.25], "texture": "#0"}, + "south": {"uv": [12.75, 9.75, 12.25, 10.25], "texture": "#0"}, + "west": {"uv": [10, 5.75, 13, 6.25], "texture": "#0"}, + "up": {"uv": [2, 13.25, 2.5, 10.25], "texture": "#0"}, + "down": {"uv": [2.5, 10.25, 3, 13.25], "texture": "#0"} + } + }, + { + "from": [23, 9, 1], + "to": [23, 13, 13], + "rotation": {"angle": 0, "axis": "y", "origin": [16, 0, 0]}, + "faces": { + "north": {"uv": [0, 0, 0, 1], "texture": "#0"}, + "east": {"uv": [10, 4.25, 7, 5.25], "texture": "#0"}, + "south": {"uv": [0, 0, 0, 1], "texture": "#0"}, + "west": {"uv": [10, 4.25, 7, 5.25], "texture": "#0"}, + "up": {"uv": [0, 3, 0, 0], "texture": "#0"}, + "down": {"uv": [0, 0, 0, 3], "texture": "#0"} + } + }, + { + "from": [22, 9, 13], + "to": [24, 21, 15], + "rotation": {"angle": 0, "axis": "y", "origin": [16, 0, 0]}, + "faces": { + "north": {"uv": [5.5, 10.25, 5, 13.25], "texture": "#0"}, + "east": {"uv": [7, 10.25, 6.5, 13.25], "texture": "#0"}, + "south": {"uv": [6.5, 10.25, 6, 13.25], "texture": "#0"}, + "west": {"uv": [6, 10.25, 5.5, 13.25], "texture": "#0"}, + "up": {"uv": [12.25, 11.75, 12.75, 11.25], "texture": "#0"}, + "down": {"uv": [12.25, 11.75, 12.75, 12.25], "texture": "#0"} + } + }, + { + "from": [-7, 3, 3], + "to": [-7, 7, 12], + "faces": { + "north": {"uv": [0, 0, 0, 1], "texture": "#0"}, + "east": {"uv": [7, 8.25, 9.25, 9.25], "texture": "#0"}, + "south": {"uv": [0, 0, 0, 1], "texture": "#0"}, + "west": {"uv": [7, 8.25, 9.25, 9.25], "texture": "#0"}, + "up": {"uv": [0, 2.25, 0, 0], "texture": "#0"}, + "down": {"uv": [0, 0, 0, 2.25], "texture": "#0"} + } + }, + { + "from": [23, 3, 3], + "to": [23, 7, 12], + "rotation": {"angle": 0, "axis": "y", "origin": [16, 0, 0]}, + "faces": { + "north": {"uv": [0, 0, 0, 1], "texture": "#0"}, + "east": {"uv": [9.25, 8.25, 7, 9.25], "texture": "#0"}, + "south": {"uv": [0, 0, 0, 1], "texture": "#0"}, + "west": {"uv": [9.25, 8.25, 7, 9.25], "texture": "#0"}, + "up": {"uv": [0, 2.25, 0, 0], "texture": "#0"}, + "down": {"uv": [0, 0, 0, 2.25], "texture": "#0"} + } + }, + { + "from": [-6, 8, 1], + "to": [22, 8, 14], + "faces": { + "north": {"uv": [0, 0, 7, 0], "texture": "#0"}, + "east": {"uv": [0, 0, 3.25, 0], "texture": "#0"}, + "south": {"uv": [0, 0, 7, 0], "texture": "#0"}, + "west": {"uv": [0, 0, 3.25, 0], "texture": "#0"}, + "up": {"uv": [7, 10.25, 0, 7], "texture": "#0"}, + "down": {"uv": [7, 7, 0, 10.25], "texture": "#0"} + } + } + ], + "gui_light": "front", + "display": { + "thirdperson_righthand": { + "rotation": [60, 145, 0], + "translation": [0, 1.25, 0], + "scale": [0.5, 0.5, 0.5] + }, + "thirdperson_lefthand": { + "rotation": [60, 145, 0], + "translation": [0, 1.25, 0], + "scale": [0.5, 0.5, 0.5] + }, + "firstperson_righthand": { + "rotation": [0, 111, 0], + "translation": [0.5, 3, 0], + "scale": [0.5, 0.5, 0.5] + }, + "firstperson_lefthand": { + "rotation": [0, 111, 0], + "translation": [0.5, 3, 0], + "scale": [0.5, 0.5, 0.5] + }, + "ground": { + "translation": [0, 3.25, 0], + "scale": [0.3, 0.3, 0.3] + }, + "gui": { + "rotation": [25, 138, 0], + "translation": [0, -1, 0], + "scale": [0.4, 0.4, 0.4] + }, + "fixed": { + "rotation": [0, 90, 0], + "translation": [0, 0, 6], + "scale": [0.5, 0.5, 0.5] + } + }, + "groups": [ + { + "name": "group", + "origin": [0, 0, 0], + "color": 0, + "children": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15] + } + ] +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/resources/default/resourcepack/assets/minecraft/models/item/custom/table_lamp.json b/bukkit-loader/src/main/resources/resources/default/resourcepack/assets/minecraft/models/item/custom/table_lamp.json new file mode 100644 index 000000000..31bb35cfa --- /dev/null +++ b/bukkit-loader/src/main/resources/resources/default/resourcepack/assets/minecraft/models/item/custom/table_lamp.json @@ -0,0 +1,123 @@ +{ + "credit": "Made with Blockbench", + "texture_size": [32, 32], + "textures": { + "0": "item/custom/table_lamp", + "particle": "item/custom/table_lamp" + }, + "elements": [ + { + "from": [3, 0, 3], + "to": [13, 1, 13], + "rotation": {"angle": 0, "axis": "y", "origin": [3, 0, 3]}, + "faces": { + "north": {"uv": [0, 10, 5, 10.5], "texture": "#0"}, + "east": {"uv": [0, 10, 5, 10.5], "texture": "#0"}, + "south": {"uv": [0, 10, 5, 10.5], "texture": "#0"}, + "west": {"uv": [0, 10, 5, 10.5], "texture": "#0"}, + "up": {"uv": [5, 5, 0, 0], "texture": "#0"}, + "down": {"uv": [5, 5, 0, 10], "texture": "#0"} + } + }, + { + "from": [9, 1, 6], + "to": [9, 10, 10], + "rotation": {"angle": -22.5, "axis": "z", "origin": [9, 1, 10]}, + "faces": { + "north": {"uv": [0, 0, 0, 4.5], "texture": "#0"}, + "east": {"uv": [5, 0, 7, 4.5], "texture": "#0"}, + "south": {"uv": [0, 0, 0, 4.5], "texture": "#0"}, + "west": {"uv": [7, 0, 5, 4.5], "texture": "#0"}, + "up": {"uv": [0, 2, 0, 0], "texture": "#0"}, + "down": {"uv": [0, 0, 0, 2], "texture": "#0"} + } + }, + { + "from": [12, 6, 6], + "to": [12, 15, 10], + "rotation": {"angle": 45, "axis": "z", "origin": [12, 8, 10]}, + "faces": { + "north": {"uv": [0, 0, 0, 4.5], "texture": "#0"}, + "east": {"uv": [5, 4.5, 7, 9], "texture": "#0"}, + "south": {"uv": [0, 0, 0, 4.5], "texture": "#0"}, + "west": {"uv": [5, 4.5, 7, 9], "texture": "#0"}, + "up": {"uv": [0, 2, 0, 0], "texture": "#0"}, + "down": {"uv": [0, 0, 0, 2], "texture": "#0"} + } + }, + { + "from": [5.05096, 10.77888, 6], + "to": [9.05096, 14.77888, 10], + "rotation": {"angle": 22.5, "axis": "z", "origin": [5.80096, 12.77888, 8]}, + "faces": { + "north": {"uv": [14, 0, 16, 2], "texture": "#0"}, + "east": {"uv": [12, 0, 14, 2], "texture": "#0"}, + "south": {"uv": [16, 0, 14, 2], "texture": "#0"}, + "west": {"uv": [14, 2, 16, 4], "texture": "#0"}, + "up": {"uv": [14, 4, 12, 2], "texture": "#0"}, + "down": {"uv": [14, 4, 12, 6], "texture": "#0"} + } + }, + { + "from": [4.05096, 9.77888, 5], + "to": [5.05096, 15.77888, 11], + "rotation": {"angle": 22.5, "axis": "z", "origin": [5.80096, 12.77888, 8]}, + "faces": { + "north": {"uv": [11, 0, 11.5, 3], "texture": "#0"}, + "east": {"uv": [7, 0, 10, 3], "texture": "#0"}, + "south": {"uv": [11, 0, 11.5, 3], "texture": "#0"}, + "west": {"uv": [7, 3, 10, 6], "texture": "#0"}, + "up": {"uv": [11, 3, 10.5, 0], "texture": "#0"}, + "down": {"uv": [10.5, 0, 10, 3], "texture": "#0"} + } + }, + { + "from": [4.97484, 10.16157, 5], + "to": [3.97484, 16.16157, 11], + "rotation": {"angle": 22.5, "axis": "z", "origin": [6.72484, 13.16157, 8]}, + "faces": { + "north": {"uv": [11, 0, 11.5, 3], "texture": "#0"}, + "east": {"uv": [7, 3, 10, 6], "texture": "#0"}, + "south": {"uv": [11, 0, 11.5, 3], "texture": "#0"}, + "west": {"uv": [7, 0, 10, 3], "texture": "#0"}, + "up": {"uv": [11, 3, 10.5, 0], "texture": "#0"}, + "down": {"uv": [10.5, 0, 10, 3], "texture": "#0"} + } + } + ], + "gui_light": "front", + "display": { + "thirdperson_righthand": { + "rotation": [60, 45, 0], + "translation": [0, 1.25, 0], + "scale": [0.5, 0.5, 0.5] + }, + "thirdperson_lefthand": { + "rotation": [60, 45, 0], + "translation": [0, 1.25, 0], + "scale": [0.5, 0.5, 0.5] + }, + "firstperson_righthand": { + "rotation": [0, 22, 0], + "translation": [0.5, 3, 0], + "scale": [0.5, 0.5, 0.5] + }, + "firstperson_lefthand": { + "rotation": [0, -161, 0], + "translation": [0.5, 3, 0], + "scale": [0.5, 0.5, 0.5] + }, + "ground": { + "translation": [0, 3.25, 0], + "scale": [0.5, 0.5, 0.5] + }, + "gui": { + "rotation": [25, 51, 0], + "translation": [0, 0.25, 0], + "scale": [0.65, 0.65, 0.65] + }, + "fixed": { + "scale": [0.8, 0.8, 0.8] + } + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/resources/default/resourcepack/assets/minecraft/models/item/custom/wooden_chair.json b/bukkit-loader/src/main/resources/resources/default/resourcepack/assets/minecraft/models/item/custom/wooden_chair.json new file mode 100644 index 000000000..dd4fac5a3 --- /dev/null +++ b/bukkit-loader/src/main/resources/resources/default/resourcepack/assets/minecraft/models/item/custom/wooden_chair.json @@ -0,0 +1,163 @@ +{ + "credit": "Made with Blockbench", + "texture_size": [32, 32], + "textures": { + "1": "item/custom/wooden_chair" + }, + "elements": [ + { + "from": [3.75, -0.25, 3.75], + "to": [5.25, 7.25, 5.25], + "rotation": {"angle": 0, "axis": "y", "origin": [4.5, 4, 4.5]}, + "faces": { + "north": {"uv": [15.5, 0.5, 16, 4], "texture": "#1"}, + "east": {"uv": [15, 0.5, 15.5, 4], "texture": "#1"}, + "south": {"uv": [15, 0.5, 15.5, 4], "texture": "#1"}, + "west": {"uv": [15.5, 0.5, 16, 4], "texture": "#1"}, + "up": {"uv": [16, 0.5, 15.5, 0], "texture": "#1"}, + "down": {"uv": [15.5, 0, 15, 0.5], "texture": "#1"} + } + }, + { + "from": [10.75, -0.25, 3.75], + "to": [12.25, 7.25, 5.25], + "rotation": {"angle": 0, "axis": "y", "origin": [11.5, 3.5, 4.5]}, + "faces": { + "north": {"uv": [16, 0.5, 15.5, 4], "texture": "#1"}, + "east": {"uv": [16, 0.5, 15.5, 4], "texture": "#1"}, + "south": {"uv": [15.5, 0.5, 15, 4], "texture": "#1"}, + "west": {"uv": [15.5, 0.5, 15, 4], "texture": "#1"}, + "up": {"uv": [15.5, 0.5, 16, 0], "texture": "#1"}, + "down": {"uv": [15, 0, 15.5, 0.5], "texture": "#1"} + } + }, + { + "from": [10.75, -0.25, 10.75], + "to": [12.25, 7.25, 12.25], + "rotation": {"angle": 0, "axis": "y", "origin": [11.5, 4, 11.5]}, + "faces": { + "north": {"uv": [15, 0.5, 15.5, 4], "texture": "#1"}, + "east": {"uv": [15.5, 0.5, 16, 4], "texture": "#1"}, + "south": {"uv": [15.5, 0.5, 16, 4], "texture": "#1"}, + "west": {"uv": [15, 0.5, 15.5, 4], "texture": "#1"}, + "up": {"uv": [15.5, 0, 16, 0.5], "texture": "#1"}, + "down": {"uv": [15, 0.5, 15.5, 0], "texture": "#1"} + } + }, + { + "from": [3.75, -0.25, 10.75], + "to": [5.25, 7.25, 12.25], + "rotation": {"angle": 0, "axis": "y", "origin": [4.5, 4, 11.5]}, + "faces": { + "north": {"uv": [15.5, 0.5, 15, 4], "texture": "#1"}, + "east": {"uv": [15.5, 0.5, 15, 4], "texture": "#1"}, + "south": {"uv": [16, 0.5, 15.5, 4], "texture": "#1"}, + "west": {"uv": [16, 0.5, 15.5, 4], "texture": "#1"}, + "up": {"uv": [16, 0, 15.5, 0.5], "texture": "#1"}, + "down": {"uv": [15.5, 0.5, 15, 0], "texture": "#1"} + } + }, + { + "from": [4, 9, 12], + "to": [12, 17, 12], + "rotation": {"angle": 0, "axis": "y", "origin": [4, 9, 14]}, + "faces": { + "north": {"uv": [4, 5, 0, 9], "texture": "#1"}, + "east": {"uv": [0, 0, 0, 4], "texture": "#1"}, + "south": {"uv": [0, 5, 4, 9], "texture": "#1"}, + "west": {"uv": [0, 0, 0, 4], "texture": "#1"}, + "up": {"uv": [4, 0, 0, 0], "texture": "#1"}, + "down": {"uv": [4, 0, 0, 0], "texture": "#1"} + } + }, + { + "from": [4, 16.5, 11.5], + "to": [12, 18.5, 12.5], + "rotation": {"angle": 0, "axis": "y", "origin": [4, 17, 14]}, + "faces": { + "north": {"uv": [8, 5, 4, 6], "texture": "#1"}, + "east": {"uv": [8, 5, 8.5, 6], "texture": "#1"}, + "south": {"uv": [4, 5, 8, 6], "texture": "#1"}, + "west": {"uv": [8, 5, 8.5, 6], "texture": "#1"}, + "up": {"uv": [8, 7, 4, 6.5], "texture": "#1"}, + "down": {"uv": [8, 6, 4, 6.5], "texture": "#1"} + } + }, + { + "from": [3, 9, 11], + "to": [4, 19, 13], + "rotation": {"angle": 0, "axis": "y", "origin": [3, 9, 13]}, + "faces": { + "north": {"uv": [0.5, 11, 1, 16], "texture": "#1"}, + "east": {"uv": [2, 11, 3, 16], "texture": "#1"}, + "south": {"uv": [0, 11, 0.5, 16], "texture": "#1"}, + "west": {"uv": [1, 11, 2, 16], "texture": "#1"}, + "up": {"uv": [2, 11, 1, 10.5], "rotation": 90, "texture": "#1"}, + "down": {"uv": [2, 11, 3, 10.5], "rotation": 90, "texture": "#1"} + } + }, + { + "from": [12, 9, 11], + "to": [13, 19, 13], + "rotation": {"angle": 0, "axis": "y", "origin": [13, 9, 13]}, + "faces": { + "north": {"uv": [1, 11, 0.5, 16], "texture": "#1"}, + "east": {"uv": [2, 11, 1, 16], "texture": "#1"}, + "south": {"uv": [0.5, 11, 0, 16], "texture": "#1"}, + "west": {"uv": [3, 11, 2, 16], "texture": "#1"}, + "up": {"uv": [2, 10.5, 1, 11], "rotation": 90, "texture": "#1"}, + "down": {"uv": [2, 10.5, 3, 11], "rotation": 90, "texture": "#1"} + } + }, + { + "from": [3, 7, 3], + "to": [13, 9, 13], + "rotation": {"angle": 0, "axis": "y", "origin": [3, 7, 5]}, + "faces": { + "north": {"uv": [10, 2, 15, 3], "texture": "#1"}, + "east": {"uv": [10, 0, 15, 1], "texture": "#1"}, + "south": {"uv": [10, 1, 15, 2], "texture": "#1"}, + "west": {"uv": [15, 0, 10, 1], "texture": "#1"}, + "up": {"uv": [5, 5, 0, 0], "texture": "#1"}, + "down": {"uv": [10, 0, 5, 5], "texture": "#1"} + } + } + ], + "gui_light": "front", + "display": { + "thirdperson_righthand": { + "rotation": [60, 145, 0], + "translation": [0, 1.25, 0], + "scale": [0.5, 0.5, 0.5] + }, + "thirdperson_lefthand": { + "rotation": [60, 145, 0], + "translation": [0, 1.25, 0], + "scale": [0.5, 0.5, 0.5] + }, + "firstperson_righthand": { + "rotation": [0, 111, 0], + "translation": [0.5, 3, 0], + "scale": [0.5, 0.5, 0.5] + }, + "firstperson_lefthand": { + "rotation": [0, 111, 0], + "translation": [0.5, 3, 0], + "scale": [0.5, 0.5, 0.5] + }, + "ground": { + "translation": [0, 3.25, 0], + "scale": [0.5, 0.5, 0.5] + }, + "gui": { + "rotation": [25, 138, 0], + "translation": [0, -1, 0], + "scale": [0.65, 0.65, 0.65] + }, + "fixed": { + "rotation": [0, 90, 0], + "translation": [0, 0, 1.5], + "scale": [0.8, 0.8, 0.8] + } + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/resources/default/resourcepack/assets/minecraft/textures/block/custom/chinese_lantern.png b/bukkit-loader/src/main/resources/resources/default/resourcepack/assets/minecraft/textures/block/custom/chinese_lantern.png new file mode 100644 index 000000000..b8f5402c6 Binary files /dev/null and b/bukkit-loader/src/main/resources/resources/default/resourcepack/assets/minecraft/textures/block/custom/chinese_lantern.png differ diff --git a/bukkit-loader/src/main/resources/resources/default/resourcepack/assets/minecraft/textures/block/custom/chinese_lantern.png.mcmeta b/bukkit-loader/src/main/resources/resources/default/resourcepack/assets/minecraft/textures/block/custom/chinese_lantern.png.mcmeta new file mode 100644 index 000000000..4894b537c --- /dev/null +++ b/bukkit-loader/src/main/resources/resources/default/resourcepack/assets/minecraft/textures/block/custom/chinese_lantern.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": true, + "frametime": 10 + } +} diff --git a/bukkit-loader/src/main/resources/resources/default/resourcepack/assets/minecraft/textures/block/custom/chinese_lantern_top.png b/bukkit-loader/src/main/resources/resources/default/resourcepack/assets/minecraft/textures/block/custom/chinese_lantern_top.png new file mode 100644 index 000000000..610d8d7ee Binary files /dev/null and b/bukkit-loader/src/main/resources/resources/default/resourcepack/assets/minecraft/textures/block/custom/chinese_lantern_top.png differ diff --git a/bukkit-loader/src/main/resources/resources/default/resourcepack/assets/minecraft/textures/block/custom/chinese_lantern_top.png.mcmeta b/bukkit-loader/src/main/resources/resources/default/resourcepack/assets/minecraft/textures/block/custom/chinese_lantern_top.png.mcmeta new file mode 100644 index 000000000..4894b537c --- /dev/null +++ b/bukkit-loader/src/main/resources/resources/default/resourcepack/assets/minecraft/textures/block/custom/chinese_lantern_top.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": true, + "frametime": 10 + } +} diff --git a/bukkit-loader/src/main/resources/resources/default/resourcepack/assets/minecraft/textures/block/custom/deepslate_topaz_ore.png b/bukkit-loader/src/main/resources/resources/default/resourcepack/assets/minecraft/textures/block/custom/deepslate_topaz_ore.png new file mode 100644 index 000000000..b270e5ebd Binary files /dev/null and b/bukkit-loader/src/main/resources/resources/default/resourcepack/assets/minecraft/textures/block/custom/deepslate_topaz_ore.png differ diff --git a/bukkit-loader/src/main/resources/resources/default/resourcepack/assets/minecraft/textures/block/custom/deepslate_topaz_ore.png.mcmeta b/bukkit-loader/src/main/resources/resources/default/resourcepack/assets/minecraft/textures/block/custom/deepslate_topaz_ore.png.mcmeta new file mode 100644 index 000000000..4894b537c --- /dev/null +++ b/bukkit-loader/src/main/resources/resources/default/resourcepack/assets/minecraft/textures/block/custom/deepslate_topaz_ore.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": true, + "frametime": 10 + } +} diff --git a/bukkit-loader/src/main/resources/resources/default/resourcepack/assets/minecraft/textures/block/custom/fairy_flower_1.png b/bukkit-loader/src/main/resources/resources/default/resourcepack/assets/minecraft/textures/block/custom/fairy_flower_1.png new file mode 100644 index 000000000..10bfa945e Binary files /dev/null and b/bukkit-loader/src/main/resources/resources/default/resourcepack/assets/minecraft/textures/block/custom/fairy_flower_1.png differ diff --git a/bukkit-loader/src/main/resources/resources/default/resourcepack/assets/minecraft/textures/block/custom/fairy_flower_2.png b/bukkit-loader/src/main/resources/resources/default/resourcepack/assets/minecraft/textures/block/custom/fairy_flower_2.png new file mode 100644 index 000000000..db7bae179 Binary files /dev/null and b/bukkit-loader/src/main/resources/resources/default/resourcepack/assets/minecraft/textures/block/custom/fairy_flower_2.png differ diff --git a/bukkit-loader/src/main/resources/resources/default/resourcepack/assets/minecraft/textures/block/custom/fairy_flower_3.png b/bukkit-loader/src/main/resources/resources/default/resourcepack/assets/minecraft/textures/block/custom/fairy_flower_3.png new file mode 100644 index 000000000..d6d9c4559 Binary files /dev/null and b/bukkit-loader/src/main/resources/resources/default/resourcepack/assets/minecraft/textures/block/custom/fairy_flower_3.png differ diff --git a/bukkit-loader/src/main/resources/resources/default/resourcepack/assets/minecraft/textures/block/custom/fairy_flower_4.png b/bukkit-loader/src/main/resources/resources/default/resourcepack/assets/minecraft/textures/block/custom/fairy_flower_4.png new file mode 100644 index 000000000..1f5fccf5f Binary files /dev/null and b/bukkit-loader/src/main/resources/resources/default/resourcepack/assets/minecraft/textures/block/custom/fairy_flower_4.png differ diff --git a/bukkit-loader/src/main/resources/resources/default/resourcepack/assets/minecraft/textures/block/custom/fairy_flower_5.png b/bukkit-loader/src/main/resources/resources/default/resourcepack/assets/minecraft/textures/block/custom/fairy_flower_5.png new file mode 100644 index 000000000..18543c0b3 Binary files /dev/null and b/bukkit-loader/src/main/resources/resources/default/resourcepack/assets/minecraft/textures/block/custom/fairy_flower_5.png differ diff --git a/bukkit-loader/src/main/resources/resources/default/resourcepack/assets/minecraft/textures/block/custom/palm_leaves.png b/bukkit-loader/src/main/resources/resources/default/resourcepack/assets/minecraft/textures/block/custom/palm_leaves.png new file mode 100644 index 000000000..d6430f45b Binary files /dev/null and b/bukkit-loader/src/main/resources/resources/default/resourcepack/assets/minecraft/textures/block/custom/palm_leaves.png differ diff --git a/bukkit-loader/src/main/resources/resources/default/resourcepack/assets/minecraft/textures/block/custom/palm_log.png b/bukkit-loader/src/main/resources/resources/default/resourcepack/assets/minecraft/textures/block/custom/palm_log.png new file mode 100644 index 000000000..9538a07bc Binary files /dev/null and b/bukkit-loader/src/main/resources/resources/default/resourcepack/assets/minecraft/textures/block/custom/palm_log.png differ diff --git a/bukkit-loader/src/main/resources/resources/default/resourcepack/assets/minecraft/textures/block/custom/palm_log_top.png b/bukkit-loader/src/main/resources/resources/default/resourcepack/assets/minecraft/textures/block/custom/palm_log_top.png new file mode 100644 index 000000000..384b66d19 Binary files /dev/null and b/bukkit-loader/src/main/resources/resources/default/resourcepack/assets/minecraft/textures/block/custom/palm_log_top.png differ diff --git a/bukkit-loader/src/main/resources/resources/default/resourcepack/assets/minecraft/textures/block/custom/palm_planks.png b/bukkit-loader/src/main/resources/resources/default/resourcepack/assets/minecraft/textures/block/custom/palm_planks.png new file mode 100644 index 000000000..4c7776334 Binary files /dev/null and b/bukkit-loader/src/main/resources/resources/default/resourcepack/assets/minecraft/textures/block/custom/palm_planks.png differ diff --git a/bukkit-loader/src/main/resources/resources/default/resourcepack/assets/minecraft/textures/block/custom/palm_sapling.png b/bukkit-loader/src/main/resources/resources/default/resourcepack/assets/minecraft/textures/block/custom/palm_sapling.png new file mode 100644 index 000000000..26b82c82e Binary files /dev/null and b/bukkit-loader/src/main/resources/resources/default/resourcepack/assets/minecraft/textures/block/custom/palm_sapling.png differ diff --git a/bukkit-loader/src/main/resources/resources/default/resourcepack/assets/minecraft/textures/block/custom/stripped_palm_log.png b/bukkit-loader/src/main/resources/resources/default/resourcepack/assets/minecraft/textures/block/custom/stripped_palm_log.png new file mode 100644 index 000000000..fcb124fbb Binary files /dev/null and b/bukkit-loader/src/main/resources/resources/default/resourcepack/assets/minecraft/textures/block/custom/stripped_palm_log.png differ diff --git a/bukkit-loader/src/main/resources/resources/default/resourcepack/assets/minecraft/textures/block/custom/stripped_palm_log_top.png b/bukkit-loader/src/main/resources/resources/default/resourcepack/assets/minecraft/textures/block/custom/stripped_palm_log_top.png new file mode 100644 index 000000000..384b66d19 Binary files /dev/null and b/bukkit-loader/src/main/resources/resources/default/resourcepack/assets/minecraft/textures/block/custom/stripped_palm_log_top.png differ diff --git a/bukkit-loader/src/main/resources/resources/default/resourcepack/assets/minecraft/textures/block/custom/topaz_ore.png b/bukkit-loader/src/main/resources/resources/default/resourcepack/assets/minecraft/textures/block/custom/topaz_ore.png new file mode 100644 index 000000000..3eb2113a9 Binary files /dev/null and b/bukkit-loader/src/main/resources/resources/default/resourcepack/assets/minecraft/textures/block/custom/topaz_ore.png differ diff --git a/bukkit-loader/src/main/resources/resources/default/resourcepack/assets/minecraft/textures/block/custom/topaz_ore.png.mcmeta b/bukkit-loader/src/main/resources/resources/default/resourcepack/assets/minecraft/textures/block/custom/topaz_ore.png.mcmeta new file mode 100644 index 000000000..4894b537c --- /dev/null +++ b/bukkit-loader/src/main/resources/resources/default/resourcepack/assets/minecraft/textures/block/custom/topaz_ore.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": true, + "frametime": 10 + } +} diff --git a/bukkit-loader/src/main/resources/resources/default/resourcepack/assets/minecraft/textures/font/image/icons.png b/bukkit-loader/src/main/resources/resources/default/resourcepack/assets/minecraft/textures/font/image/icons.png new file mode 100644 index 000000000..c65accf81 Binary files /dev/null and b/bukkit-loader/src/main/resources/resources/default/resourcepack/assets/minecraft/textures/font/image/icons.png differ diff --git a/bukkit-loader/src/main/resources/resources/default/resourcepack/assets/minecraft/textures/gui/sprites/tooltip/topaz_background.png b/bukkit-loader/src/main/resources/resources/default/resourcepack/assets/minecraft/textures/gui/sprites/tooltip/topaz_background.png new file mode 100644 index 000000000..5a375d093 Binary files /dev/null and b/bukkit-loader/src/main/resources/resources/default/resourcepack/assets/minecraft/textures/gui/sprites/tooltip/topaz_background.png differ diff --git a/bukkit-loader/src/main/resources/resources/default/resourcepack/assets/minecraft/textures/gui/sprites/tooltip/topaz_background.png.mcmeta b/bukkit-loader/src/main/resources/resources/default/resourcepack/assets/minecraft/textures/gui/sprites/tooltip/topaz_background.png.mcmeta new file mode 100644 index 000000000..33045fe33 --- /dev/null +++ b/bukkit-loader/src/main/resources/resources/default/resourcepack/assets/minecraft/textures/gui/sprites/tooltip/topaz_background.png.mcmeta @@ -0,0 +1 @@ +{"gui":{"scaling":{"type":"nine_slice","width":100,"height":100,"border":8}}} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/resources/default/resourcepack/assets/minecraft/textures/gui/sprites/tooltip/topaz_frame.png b/bukkit-loader/src/main/resources/resources/default/resourcepack/assets/minecraft/textures/gui/sprites/tooltip/topaz_frame.png new file mode 100644 index 000000000..ee847de06 Binary files /dev/null and b/bukkit-loader/src/main/resources/resources/default/resourcepack/assets/minecraft/textures/gui/sprites/tooltip/topaz_frame.png differ diff --git a/bukkit-loader/src/main/resources/resources/default/resourcepack/assets/minecraft/textures/gui/sprites/tooltip/topaz_frame.png.mcmeta b/bukkit-loader/src/main/resources/resources/default/resourcepack/assets/minecraft/textures/gui/sprites/tooltip/topaz_frame.png.mcmeta new file mode 100644 index 000000000..d8d661522 --- /dev/null +++ b/bukkit-loader/src/main/resources/resources/default/resourcepack/assets/minecraft/textures/gui/sprites/tooltip/topaz_frame.png.mcmeta @@ -0,0 +1 @@ +{"gui":{"scaling":{"type":"nine_slice","width":100,"height":100,"border":8,"stretch_inner":true}}} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/resources/default/resourcepack/assets/minecraft/textures/item/custom/bench.png b/bukkit-loader/src/main/resources/resources/default/resourcepack/assets/minecraft/textures/item/custom/bench.png new file mode 100644 index 000000000..e2c3b257b Binary files /dev/null and b/bukkit-loader/src/main/resources/resources/default/resourcepack/assets/minecraft/textures/item/custom/bench.png differ diff --git a/bukkit-loader/src/main/resources/resources/default/resourcepack/assets/minecraft/textures/item/custom/fairy_flower.png b/bukkit-loader/src/main/resources/resources/default/resourcepack/assets/minecraft/textures/item/custom/fairy_flower.png new file mode 100644 index 000000000..5255ccd63 Binary files /dev/null and b/bukkit-loader/src/main/resources/resources/default/resourcepack/assets/minecraft/textures/item/custom/fairy_flower.png differ diff --git a/bukkit-loader/src/main/resources/resources/default/resourcepack/assets/minecraft/textures/item/custom/table_lamp.png b/bukkit-loader/src/main/resources/resources/default/resourcepack/assets/minecraft/textures/item/custom/table_lamp.png new file mode 100644 index 000000000..fd7fa26cb Binary files /dev/null and b/bukkit-loader/src/main/resources/resources/default/resourcepack/assets/minecraft/textures/item/custom/table_lamp.png differ diff --git a/bukkit-loader/src/main/resources/resources/default/resourcepack/assets/minecraft/textures/item/custom/topaz.png b/bukkit-loader/src/main/resources/resources/default/resourcepack/assets/minecraft/textures/item/custom/topaz.png new file mode 100644 index 000000000..aa0bf3636 Binary files /dev/null and b/bukkit-loader/src/main/resources/resources/default/resourcepack/assets/minecraft/textures/item/custom/topaz.png differ diff --git a/bukkit-loader/src/main/resources/resources/default/resourcepack/assets/minecraft/textures/item/custom/topaz.png.mcmeta b/bukkit-loader/src/main/resources/resources/default/resourcepack/assets/minecraft/textures/item/custom/topaz.png.mcmeta new file mode 100644 index 000000000..4894b537c --- /dev/null +++ b/bukkit-loader/src/main/resources/resources/default/resourcepack/assets/minecraft/textures/item/custom/topaz.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": true, + "frametime": 10 + } +} diff --git a/bukkit-loader/src/main/resources/resources/default/resourcepack/assets/minecraft/textures/item/custom/topaz_axe.png b/bukkit-loader/src/main/resources/resources/default/resourcepack/assets/minecraft/textures/item/custom/topaz_axe.png new file mode 100644 index 000000000..dc7ae2869 Binary files /dev/null and b/bukkit-loader/src/main/resources/resources/default/resourcepack/assets/minecraft/textures/item/custom/topaz_axe.png differ diff --git a/bukkit-loader/src/main/resources/resources/default/resourcepack/assets/minecraft/textures/item/custom/topaz_axe.png.mcmeta b/bukkit-loader/src/main/resources/resources/default/resourcepack/assets/minecraft/textures/item/custom/topaz_axe.png.mcmeta new file mode 100644 index 000000000..4894b537c --- /dev/null +++ b/bukkit-loader/src/main/resources/resources/default/resourcepack/assets/minecraft/textures/item/custom/topaz_axe.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": true, + "frametime": 10 + } +} diff --git a/bukkit-loader/src/main/resources/resources/default/resourcepack/assets/minecraft/textures/item/custom/topaz_boots.png b/bukkit-loader/src/main/resources/resources/default/resourcepack/assets/minecraft/textures/item/custom/topaz_boots.png new file mode 100644 index 000000000..498eef990 Binary files /dev/null and b/bukkit-loader/src/main/resources/resources/default/resourcepack/assets/minecraft/textures/item/custom/topaz_boots.png differ diff --git a/bukkit-loader/src/main/resources/resources/default/resourcepack/assets/minecraft/textures/item/custom/topaz_boots.png.mcmeta b/bukkit-loader/src/main/resources/resources/default/resourcepack/assets/minecraft/textures/item/custom/topaz_boots.png.mcmeta new file mode 100644 index 000000000..4894b537c --- /dev/null +++ b/bukkit-loader/src/main/resources/resources/default/resourcepack/assets/minecraft/textures/item/custom/topaz_boots.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": true, + "frametime": 10 + } +} diff --git a/bukkit-loader/src/main/resources/resources/default/resourcepack/assets/minecraft/textures/item/custom/topaz_bow.png b/bukkit-loader/src/main/resources/resources/default/resourcepack/assets/minecraft/textures/item/custom/topaz_bow.png new file mode 100644 index 000000000..afbaf13a1 Binary files /dev/null and b/bukkit-loader/src/main/resources/resources/default/resourcepack/assets/minecraft/textures/item/custom/topaz_bow.png differ diff --git a/bukkit-loader/src/main/resources/resources/default/resourcepack/assets/minecraft/textures/item/custom/topaz_bow_pulling_0.png b/bukkit-loader/src/main/resources/resources/default/resourcepack/assets/minecraft/textures/item/custom/topaz_bow_pulling_0.png new file mode 100644 index 000000000..6f2cb5b93 Binary files /dev/null and b/bukkit-loader/src/main/resources/resources/default/resourcepack/assets/minecraft/textures/item/custom/topaz_bow_pulling_0.png differ diff --git a/bukkit-loader/src/main/resources/resources/default/resourcepack/assets/minecraft/textures/item/custom/topaz_bow_pulling_1.png b/bukkit-loader/src/main/resources/resources/default/resourcepack/assets/minecraft/textures/item/custom/topaz_bow_pulling_1.png new file mode 100644 index 000000000..99c78b5fe Binary files /dev/null and b/bukkit-loader/src/main/resources/resources/default/resourcepack/assets/minecraft/textures/item/custom/topaz_bow_pulling_1.png differ diff --git a/bukkit-loader/src/main/resources/resources/default/resourcepack/assets/minecraft/textures/item/custom/topaz_bow_pulling_2.png b/bukkit-loader/src/main/resources/resources/default/resourcepack/assets/minecraft/textures/item/custom/topaz_bow_pulling_2.png new file mode 100644 index 000000000..ca228d215 Binary files /dev/null and b/bukkit-loader/src/main/resources/resources/default/resourcepack/assets/minecraft/textures/item/custom/topaz_bow_pulling_2.png differ diff --git a/bukkit-loader/src/main/resources/resources/default/resourcepack/assets/minecraft/textures/item/custom/topaz_chestplate.png b/bukkit-loader/src/main/resources/resources/default/resourcepack/assets/minecraft/textures/item/custom/topaz_chestplate.png new file mode 100644 index 000000000..53601b282 Binary files /dev/null and b/bukkit-loader/src/main/resources/resources/default/resourcepack/assets/minecraft/textures/item/custom/topaz_chestplate.png differ diff --git a/bukkit-loader/src/main/resources/resources/default/resourcepack/assets/minecraft/textures/item/custom/topaz_chestplate.png.mcmeta b/bukkit-loader/src/main/resources/resources/default/resourcepack/assets/minecraft/textures/item/custom/topaz_chestplate.png.mcmeta new file mode 100644 index 000000000..4894b537c --- /dev/null +++ b/bukkit-loader/src/main/resources/resources/default/resourcepack/assets/minecraft/textures/item/custom/topaz_chestplate.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": true, + "frametime": 10 + } +} diff --git a/bukkit-loader/src/main/resources/resources/default/resourcepack/assets/minecraft/textures/item/custom/topaz_crossbow.png b/bukkit-loader/src/main/resources/resources/default/resourcepack/assets/minecraft/textures/item/custom/topaz_crossbow.png new file mode 100644 index 000000000..2337f1d11 Binary files /dev/null and b/bukkit-loader/src/main/resources/resources/default/resourcepack/assets/minecraft/textures/item/custom/topaz_crossbow.png differ diff --git a/bukkit-loader/src/main/resources/resources/default/resourcepack/assets/minecraft/textures/item/custom/topaz_crossbow_arrow.png b/bukkit-loader/src/main/resources/resources/default/resourcepack/assets/minecraft/textures/item/custom/topaz_crossbow_arrow.png new file mode 100644 index 000000000..4998fce17 Binary files /dev/null and b/bukkit-loader/src/main/resources/resources/default/resourcepack/assets/minecraft/textures/item/custom/topaz_crossbow_arrow.png differ diff --git a/bukkit-loader/src/main/resources/resources/default/resourcepack/assets/minecraft/textures/item/custom/topaz_crossbow_firework.png b/bukkit-loader/src/main/resources/resources/default/resourcepack/assets/minecraft/textures/item/custom/topaz_crossbow_firework.png new file mode 100644 index 000000000..6a047932f Binary files /dev/null and b/bukkit-loader/src/main/resources/resources/default/resourcepack/assets/minecraft/textures/item/custom/topaz_crossbow_firework.png differ diff --git a/bukkit-loader/src/main/resources/resources/default/resourcepack/assets/minecraft/textures/item/custom/topaz_crossbow_pulling_0.png b/bukkit-loader/src/main/resources/resources/default/resourcepack/assets/minecraft/textures/item/custom/topaz_crossbow_pulling_0.png new file mode 100644 index 000000000..48441b490 Binary files /dev/null and b/bukkit-loader/src/main/resources/resources/default/resourcepack/assets/minecraft/textures/item/custom/topaz_crossbow_pulling_0.png differ diff --git a/bukkit-loader/src/main/resources/resources/default/resourcepack/assets/minecraft/textures/item/custom/topaz_crossbow_pulling_1.png b/bukkit-loader/src/main/resources/resources/default/resourcepack/assets/minecraft/textures/item/custom/topaz_crossbow_pulling_1.png new file mode 100644 index 000000000..f3c452c83 Binary files /dev/null and b/bukkit-loader/src/main/resources/resources/default/resourcepack/assets/minecraft/textures/item/custom/topaz_crossbow_pulling_1.png differ diff --git a/bukkit-loader/src/main/resources/resources/default/resourcepack/assets/minecraft/textures/item/custom/topaz_crossbow_pulling_2.png b/bukkit-loader/src/main/resources/resources/default/resourcepack/assets/minecraft/textures/item/custom/topaz_crossbow_pulling_2.png new file mode 100644 index 000000000..f5326edf3 Binary files /dev/null and b/bukkit-loader/src/main/resources/resources/default/resourcepack/assets/minecraft/textures/item/custom/topaz_crossbow_pulling_2.png differ diff --git a/bukkit-loader/src/main/resources/resources/default/resourcepack/assets/minecraft/textures/item/custom/topaz_helmet.png b/bukkit-loader/src/main/resources/resources/default/resourcepack/assets/minecraft/textures/item/custom/topaz_helmet.png new file mode 100644 index 000000000..8272cf147 Binary files /dev/null and b/bukkit-loader/src/main/resources/resources/default/resourcepack/assets/minecraft/textures/item/custom/topaz_helmet.png differ diff --git a/bukkit-loader/src/main/resources/resources/default/resourcepack/assets/minecraft/textures/item/custom/topaz_helmet.png.mcmeta b/bukkit-loader/src/main/resources/resources/default/resourcepack/assets/minecraft/textures/item/custom/topaz_helmet.png.mcmeta new file mode 100644 index 000000000..4894b537c --- /dev/null +++ b/bukkit-loader/src/main/resources/resources/default/resourcepack/assets/minecraft/textures/item/custom/topaz_helmet.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": true, + "frametime": 10 + } +} diff --git a/bukkit-loader/src/main/resources/resources/default/resourcepack/assets/minecraft/textures/item/custom/topaz_hoe.png b/bukkit-loader/src/main/resources/resources/default/resourcepack/assets/minecraft/textures/item/custom/topaz_hoe.png new file mode 100644 index 000000000..e95a312b3 Binary files /dev/null and b/bukkit-loader/src/main/resources/resources/default/resourcepack/assets/minecraft/textures/item/custom/topaz_hoe.png differ diff --git a/bukkit-loader/src/main/resources/resources/default/resourcepack/assets/minecraft/textures/item/custom/topaz_hoe.png.mcmeta b/bukkit-loader/src/main/resources/resources/default/resourcepack/assets/minecraft/textures/item/custom/topaz_hoe.png.mcmeta new file mode 100644 index 000000000..4894b537c --- /dev/null +++ b/bukkit-loader/src/main/resources/resources/default/resourcepack/assets/minecraft/textures/item/custom/topaz_hoe.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": true, + "frametime": 10 + } +} diff --git a/bukkit-loader/src/main/resources/resources/default/resourcepack/assets/minecraft/textures/item/custom/topaz_leggings.png b/bukkit-loader/src/main/resources/resources/default/resourcepack/assets/minecraft/textures/item/custom/topaz_leggings.png new file mode 100644 index 000000000..6b536ac19 Binary files /dev/null and b/bukkit-loader/src/main/resources/resources/default/resourcepack/assets/minecraft/textures/item/custom/topaz_leggings.png differ diff --git a/bukkit-loader/src/main/resources/resources/default/resourcepack/assets/minecraft/textures/item/custom/topaz_leggings.png.mcmeta b/bukkit-loader/src/main/resources/resources/default/resourcepack/assets/minecraft/textures/item/custom/topaz_leggings.png.mcmeta new file mode 100644 index 000000000..4894b537c --- /dev/null +++ b/bukkit-loader/src/main/resources/resources/default/resourcepack/assets/minecraft/textures/item/custom/topaz_leggings.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": true, + "frametime": 10 + } +} diff --git a/bukkit-loader/src/main/resources/resources/default/resourcepack/assets/minecraft/textures/item/custom/topaz_pickaxe.png b/bukkit-loader/src/main/resources/resources/default/resourcepack/assets/minecraft/textures/item/custom/topaz_pickaxe.png new file mode 100644 index 000000000..f01891b9d Binary files /dev/null and b/bukkit-loader/src/main/resources/resources/default/resourcepack/assets/minecraft/textures/item/custom/topaz_pickaxe.png differ diff --git a/bukkit-loader/src/main/resources/resources/default/resourcepack/assets/minecraft/textures/item/custom/topaz_pickaxe.png.mcmeta b/bukkit-loader/src/main/resources/resources/default/resourcepack/assets/minecraft/textures/item/custom/topaz_pickaxe.png.mcmeta new file mode 100644 index 000000000..4894b537c --- /dev/null +++ b/bukkit-loader/src/main/resources/resources/default/resourcepack/assets/minecraft/textures/item/custom/topaz_pickaxe.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": true, + "frametime": 10 + } +} diff --git a/bukkit-loader/src/main/resources/resources/default/resourcepack/assets/minecraft/textures/item/custom/topaz_rod.png b/bukkit-loader/src/main/resources/resources/default/resourcepack/assets/minecraft/textures/item/custom/topaz_rod.png new file mode 100644 index 000000000..629092f8b Binary files /dev/null and b/bukkit-loader/src/main/resources/resources/default/resourcepack/assets/minecraft/textures/item/custom/topaz_rod.png differ diff --git a/bukkit-loader/src/main/resources/resources/default/resourcepack/assets/minecraft/textures/item/custom/topaz_rod_cast.png b/bukkit-loader/src/main/resources/resources/default/resourcepack/assets/minecraft/textures/item/custom/topaz_rod_cast.png new file mode 100644 index 000000000..ce042dcdd Binary files /dev/null and b/bukkit-loader/src/main/resources/resources/default/resourcepack/assets/minecraft/textures/item/custom/topaz_rod_cast.png differ diff --git a/bukkit-loader/src/main/resources/resources/default/resourcepack/assets/minecraft/textures/item/custom/topaz_shovel.png b/bukkit-loader/src/main/resources/resources/default/resourcepack/assets/minecraft/textures/item/custom/topaz_shovel.png new file mode 100644 index 000000000..f5bd090ca Binary files /dev/null and b/bukkit-loader/src/main/resources/resources/default/resourcepack/assets/minecraft/textures/item/custom/topaz_shovel.png differ diff --git a/bukkit-loader/src/main/resources/resources/default/resourcepack/assets/minecraft/textures/item/custom/topaz_shovel.png.mcmeta b/bukkit-loader/src/main/resources/resources/default/resourcepack/assets/minecraft/textures/item/custom/topaz_shovel.png.mcmeta new file mode 100644 index 000000000..4894b537c --- /dev/null +++ b/bukkit-loader/src/main/resources/resources/default/resourcepack/assets/minecraft/textures/item/custom/topaz_shovel.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": true, + "frametime": 10 + } +} diff --git a/bukkit-loader/src/main/resources/resources/default/resourcepack/assets/minecraft/textures/item/custom/topaz_sword.png b/bukkit-loader/src/main/resources/resources/default/resourcepack/assets/minecraft/textures/item/custom/topaz_sword.png new file mode 100644 index 000000000..25dac861c Binary files /dev/null and b/bukkit-loader/src/main/resources/resources/default/resourcepack/assets/minecraft/textures/item/custom/topaz_sword.png differ diff --git a/bukkit-loader/src/main/resources/resources/default/resourcepack/assets/minecraft/textures/item/custom/topaz_sword.png.mcmeta b/bukkit-loader/src/main/resources/resources/default/resourcepack/assets/minecraft/textures/item/custom/topaz_sword.png.mcmeta new file mode 100644 index 000000000..4894b537c --- /dev/null +++ b/bukkit-loader/src/main/resources/resources/default/resourcepack/assets/minecraft/textures/item/custom/topaz_sword.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": true, + "frametime": 10 + } +} diff --git a/bukkit-loader/src/main/resources/resources/default/resourcepack/assets/minecraft/textures/item/custom/wooden_chair.png b/bukkit-loader/src/main/resources/resources/default/resourcepack/assets/minecraft/textures/item/custom/wooden_chair.png new file mode 100644 index 000000000..28fcde829 Binary files /dev/null and b/bukkit-loader/src/main/resources/resources/default/resourcepack/assets/minecraft/textures/item/custom/wooden_chair.png differ diff --git a/bukkit-loader/src/main/resources/resources/default/resourcepack/pack.mcmeta b/bukkit-loader/src/main/resources/resources/default/resourcepack/pack.mcmeta new file mode 100644 index 000000000..c8662fc21 --- /dev/null +++ b/bukkit-loader/src/main/resources/resources/default/resourcepack/pack.mcmeta @@ -0,0 +1,10 @@ +{ + "pack":{ + "pack_format": 15, + "description":"CraftEngine", + "supported_formats": { + "min_inclusive": 15, + "max_inclusive": 46 + } + } +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/resources/default/resourcepack/pack.png b/bukkit-loader/src/main/resources/resources/default/resourcepack/pack.png new file mode 100644 index 000000000..d72a566d1 Binary files /dev/null and b/bukkit-loader/src/main/resources/resources/default/resourcepack/pack.png differ diff --git a/bukkit-loader/src/main/resources/resources/internal/configuration/gui.yml b/bukkit-loader/src/main/resources/resources/internal/configuration/gui.yml new file mode 100644 index 000000000..f2627ecd0 --- /dev/null +++ b/bukkit-loader/src/main/resources/resources/internal/configuration/gui.yml @@ -0,0 +1,161 @@ +images: + internal:item_browser: + height: 140 + ascent: 18 + font: minecraft:internal + file: minecraft:font/gui/custom/item_browser.png + char: '\ub000' + internal:category: + height: 140 + ascent: 18 + font: minecraft:internal + file: minecraft:font/gui/custom/category.png + char: '\ub001' + internal:crafting_recipe: + height: 142 + ascent: 20 + font: minecraft:internal + file: minecraft:font/gui/custom/crafting_recipe.png + char: '\ub002' + internal:cooking_recipe: + height: 138 + ascent: 16 + font: minecraft:internal + file: minecraft:font/gui/custom/cooking_recipe.png + char: '\ub003' + internal:smelting: + height: 23 + ascent: 20 + font: minecraft:internal + file: minecraft:font/gui/custom/smelting.png + char: '\ub004' + internal:smoking: + height: 23 + ascent: 20 + font: minecraft:internal + file: minecraft:font/gui/custom/smoking.png + char: '\ub005' + internal:blasting: + height: 23 + ascent: 20 + font: minecraft:internal + file: minecraft:font/gui/custom/blasting.png + char: '\ub006' + internal:campfire: + height: 23 + ascent: 20 + font: minecraft:internal + file: minecraft:font/gui/custom/campfire.png + char: '\ub007' + internal:stonecutting_recipe: + height: 142 + ascent: 20 + font: minecraft:internal + file: minecraft:font/gui/custom/stonecutting_recipe.png + char: '\ub008' + internal:no_recipe: + height: 140 + ascent: 18 + font: minecraft:internal + file: minecraft:font/gui/custom/no_recipe.png + char: '\ub009' + +templates: + internal:2d_icon: + material: arrow + custom-model-data: "{model_data}" + data: + display-name: "{name}" + lore: "{lore}" + model: + template: models:generated + arguments: + model_path: "minecraft:item/custom/gui/{texture}" + texture_path: "minecraft:item/custom/gui/{texture}" + +items: + internal:next_page_0: + template: "internal:2d_icon" + arguments: + model_data: 1000 + texture: next_page_0 + name: "<#FAFAD2>" + lore: + - "<#F5F5F5>/" + internal:next_page_1: + template: "internal:2d_icon" + arguments: + model_data: 1001 + texture: next_page_1 + name: "<#808080>" + lore: + - "<#696969>/" + internal:previous_page_0: + template: "internal:2d_icon" + arguments: + model_data: 1002 + texture: previous_page_0 + name: "<#FAFAD2>" + lore: + - "<#F5F5F5>/" + internal:previous_page_1: + template: "internal:2d_icon" + arguments: + model_data: 1003 + texture: previous_page_1 + name: "<#808080>" + lore: + - "<#696969>/" + internal:return: + template: "internal:2d_icon" + arguments: + model_data: 1004 + texture: return + name: "<#DAA520>" + lore: null + internal:next_recipe_0: + material: arrow + custom-model-data: 1000 + data: + display-name: "<#FAFAD2>" + lore: + - "<#F5F5F5>/" + internal:next_recipe_1: + material: arrow + custom-model-data: 1001 + data: + display-name: "<#808080>" + lore: + - "<#696969>/" + internal:previous_recipe_0: + material: arrow + custom-model-data: 1002 + data: + display-name: "<#FAFAD2>" + lore: + - "<#F5F5F5>/" + internal:previous_recipe_1: + material: arrow + custom-model-data: 1003 + data: + display-name: "<#808080>" + lore: + - "<#696969>/" + internal:get_item: + template: "internal:2d_icon" + arguments: + model_data: 1005 + texture: get_item + name: "<#DAA520>" + lore: + - "" + - "" + internal:cooking_info: + template: "internal:2d_icon" + arguments: + model_data: 1006 + texture: cooking_info + name: "<#FF8C00>" + lore: + - "" + - "" \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/resources/internal/configuration/i18n.yml b/bukkit-loader/src/main/resources/resources/internal/configuration/i18n.yml new file mode 100644 index 000000000..9fb579d89 --- /dev/null +++ b/bukkit-loader/src/main/resources/resources/internal/configuration/i18n.yml @@ -0,0 +1,25 @@ +i18n: + en: + internal.next_page: "Next Page" + internal.previous_page: "Previous Page" + internal.return: "Return to Parent Page" + internal.next_recipe: "Next Recipe" + internal.previous_recipe: "Previous Recipe" + internal.get_item: "Get Item" + internal.get_item.0: "Left Click to take one" + internal.get_item.1: "Right Click to take a stack" + internal.cooking_info: "Recipe Information" + internal.cooking_info.0: "Time: ticks" + internal.cooking_info.1: "Experience: " + zh_cn: + internal.next_page: "下一页" + internal.previous_page: "上一页" + internal.return: "返回上一级" + internal.next_recipe: "下一个配方" + internal.previous_recipe: "上一个配方" + internal.get_item: "获取物品" + internal.get_item.0: "左键单击取一个" + internal.get_item.1: "右键单击取一组" + internal.cooking_info: "配方信息" + internal.cooking_info.0: "时间: 刻" + internal.cooking_info.1: "经验: " \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/resources/internal/configuration/offset_chars.yml b/bukkit-loader/src/main/resources/resources/internal/configuration/offset_chars.yml new file mode 100644 index 000000000..45b1c925a --- /dev/null +++ b/bukkit-loader/src/main/resources/resources/internal/configuration/offset_chars.yml @@ -0,0 +1,265 @@ +images: + internal:neg_1: + height: -3 + ascent: -5000 + font: minecraft:offset_chars + file: minecraft:font/offset/space_split.png + char: '\uf800' + internal:neg_2: + height: -4 + ascent: -5000 + font: minecraft:offset_chars + file: minecraft:font/offset/space_split.png + char: '\uf801' + internal:neg_3: + height: -5 + ascent: -5000 + font: minecraft:offset_chars + file: minecraft:font/offset/space_split.png + char: '\uf802' + internal:neg_4: + height: -6 + ascent: -5000 + font: minecraft:offset_chars + file: minecraft:font/offset/space_split.png + char: '\uf803' + internal:neg_5: + height: -7 + ascent: -5000 + font: minecraft:offset_chars + file: minecraft:font/offset/space_split.png + char: '\uf804' + internal:neg_6: + height: -8 + ascent: -5000 + font: minecraft:offset_chars + file: minecraft:font/offset/space_split.png + char: '\uf805' + internal:neg_7: + height: -9 + ascent: -5000 + font: minecraft:offset_chars + file: minecraft:font/offset/space_split.png + char: '\uf806' + internal:neg_8: + height: -10 + ascent: -5000 + font: minecraft:offset_chars + file: minecraft:font/offset/space_split.png + char: '\uf807' + internal:neg_9: + height: -11 + ascent: -5000 + font: minecraft:offset_chars + file: minecraft:font/offset/space_split.png + char: '\uf808' + internal:neg_10: + height: -12 + ascent: -5000 + font: minecraft:offset_chars + file: minecraft:font/offset/space_split.png + char: '\uf809' + internal:neg_11: + height: -13 + ascent: -5000 + font: minecraft:offset_chars + file: minecraft:font/offset/space_split.png + char: '\uf80a' + internal:neg_12: + height: -14 + ascent: -5000 + font: minecraft:offset_chars + file: minecraft:font/offset/space_split.png + char: '\uf80b' + internal:neg_13: + height: -15 + ascent: -5000 + font: minecraft:offset_chars + file: minecraft:font/offset/space_split.png + char: '\uf80c' + internal:neg_14: + height: -16 + ascent: -5000 + font: minecraft:offset_chars + file: minecraft:font/offset/space_split.png + char: '\uf80d' + internal:neg_15: + height: -17 + ascent: -5000 + font: minecraft:offset_chars + file: minecraft:font/offset/space_split.png + char: '\uf80e' + internal:neg_16: + height: -18 + ascent: -5000 + font: minecraft:offset_chars + file: minecraft:font/offset/space_split.png + char: '\uf80f' + internal:neg_24: + height: -26 + ascent: -5000 + font: minecraft:offset_chars + file: minecraft:font/offset/space_split.png + char: '\uf810' + internal:neg_32: + height: -34 + ascent: -5000 + font: minecraft:offset_chars + file: minecraft:font/offset/space_split.png + char: '\uf811' + internal:neg_48: + height: -50 + ascent: -5000 + font: minecraft:offset_chars + file: minecraft:font/offset/space_split.png + char: '\uf812' + internal:neg_64: + height: -66 + ascent: -5000 + font: minecraft:offset_chars + file: minecraft:font/offset/space_split.png + char: '\uf813' + internal:neg_128: + height: -130 + ascent: -5000 + font: minecraft:offset_chars + file: minecraft:font/offset/space_split.png + char: '\uf814' + internal:neg_256: + height: -258 + ascent: -5000 + font: minecraft:offset_chars + file: minecraft:font/offset/space_split.png + char: '\uf815' + internal:pos_1: + height: -1 + ascent: -5000 + font: minecraft:offset_chars + file: minecraft:font/offset/space_split.png + char: '\uf830' + internal:pos_2: + height: 1 + ascent: -5000 + font: minecraft:offset_chars + file: minecraft:font/offset/space_split.png + char: '\uf831' + internal:pos_3: + height: 2 + ascent: -5000 + font: minecraft:offset_chars + file: minecraft:font/offset/space_split.png + char: '\uf832' + internal:pos_4: + height: 3 + ascent: -5000 + font: minecraft:offset_chars + file: minecraft:font/offset/space_split.png + char: '\uf833' + internal:pos_5: + height: 4 + ascent: -5000 + font: minecraft:offset_chars + file: minecraft:font/offset/space_split.png + char: '\uf834' + internal:pos_6: + height: 5 + ascent: -5000 + font: minecraft:offset_chars + file: minecraft:font/offset/space_split.png + char: '\uf835' + internal:pos_7: + height: 6 + ascent: -5000 + font: minecraft:offset_chars + file: minecraft:font/offset/space_split.png + char: '\uf836' + internal:pos_8: + height: 7 + ascent: -5000 + font: minecraft:offset_chars + file: minecraft:font/offset/space_split.png + char: '\uf837' + internal:pos_9: + height: 8 + ascent: -5000 + font: minecraft:offset_chars + file: minecraft:font/offset/space_split.png + char: '\uf838' + internal:pos_10: + height: 9 + ascent: -5000 + font: minecraft:offset_chars + file: minecraft:font/offset/space_split.png + char: '\uf839' + internal:pos_11: + height: 10 + ascent: -5000 + font: minecraft:offset_chars + file: minecraft:font/offset/space_split.png + char: '\uf83a' + internal:pos_12: + height: 11 + ascent: -5000 + font: minecraft:offset_chars + file: minecraft:font/offset/space_split.png + char: '\uf83b' + internal:pos_13: + height: 12 + ascent: -5000 + font: minecraft:offset_chars + file: minecraft:font/offset/space_split.png + char: '\uf83c' + internal:pos_14: + height: 13 + ascent: -5000 + font: minecraft:offset_chars + file: minecraft:font/offset/space_split.png + char: '\uf83d' + internal:pos_15: + height: 14 + ascent: -5000 + font: minecraft:offset_chars + file: minecraft:font/offset/space_split.png + char: '\uf83e' + internal:pos_16: + height: 15 + ascent: -5000 + font: minecraft:offset_chars + file: minecraft:font/offset/space_split.png + char: '\uf83f' + internal:pos_24: + height: 23 + ascent: -5000 + font: minecraft:offset_chars + file: minecraft:font/offset/space_split.png + char: '\uf840' + internal:pos_32: + height: 31 + ascent: -5000 + font: minecraft:offset_chars + file: minecraft:font/offset/space_split.png + char: '\uf841' + internal:pos_48: + height: 47 + ascent: -5000 + font: minecraft:offset_chars + file: minecraft:font/offset/space_split.png + char: '\uf842' + internal:pos_64: + height: 63 + ascent: -5000 + font: minecraft:offset_chars + file: minecraft:font/offset/space_split.png + char: '\uf843' + internal:pos_128: + height: 127 + ascent: -5000 + font: minecraft:offset_chars + file: minecraft:font/offset/space_split.png + char: '\uf844' + internal:pos_256: + height: 255 + ascent: -5000 + font: minecraft:offset_chars + file: minecraft:font/offset/space_split.png + char: '\uf845' \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/resources/internal/pack.yml b/bukkit-loader/src/main/resources/resources/internal/pack.yml new file mode 100644 index 000000000..659badb43 --- /dev/null +++ b/bukkit-loader/src/main/resources/resources/internal/pack.yml @@ -0,0 +1,4 @@ +author: XiaoMoMi +version: 0.0.1 +description: Internal Assets +namespace: internal \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/resources/internal/resourcepack/assets/minecraft/models/block/default_chorus_plant.json b/bukkit-loader/src/main/resources/resources/internal/resourcepack/assets/minecraft/models/block/default_chorus_plant.json new file mode 100644 index 000000000..e2571f1ec --- /dev/null +++ b/bukkit-loader/src/main/resources/resources/internal/resourcepack/assets/minecraft/models/block/default_chorus_plant.json @@ -0,0 +1,90 @@ +{ + "credit": "Made with Blockbench", + "parent": "block/block", + "textures": { + "particle": "block/chorus_plant", + "inside": "block/chorus_plant" + }, + "elements": [ + { + "from": [3, 14, 3], + "to": [13, 16, 13], + "faces": { + "north": {"uv": [3, 1, 13, 3], "texture": "#inside", "cullface": "up"}, + "east": {"uv": [3, 1, 13, 3], "texture": "#inside", "cullface": "up"}, + "south": {"uv": [3, 1, 13, 3], "texture": "#inside", "cullface": "up"}, + "west": {"uv": [3, 1, 13, 3], "texture": "#inside", "cullface": "up"}, + "up": {"uv": [3, 3, 13, 13], "texture": "#inside", "cullface": "up"}, + "down": {"uv": [0, 0, 0, 0], "texture": "#inside"} + } + }, + { + "from": [0, 3, 3], + "to": [2, 13, 12], + "faces": { + "north": {"uv": [13, 3, 15, 13], "texture": "#inside", "cullface": "west"}, + "south": {"uv": [1, 3, 3, 13], "texture": "#inside", "cullface": "west"}, + "west": {"uv": [3, 3, 13, 13], "texture": "#inside", "cullface": "west"}, + "up": {"uv": [1, 3, 3, 13], "texture": "#inside", "cullface": "west"}, + "down": {"uv": [15, 13, 13, 3], "texture": "#inside", "cullface": "west"} + } + }, + { + "from": [3, 3, 0], + "to": [13, 13, 2], + "faces": { + "north": {"uv": [3, 3, 13, 13], "texture": "#inside", "cullface": "north"}, + "east": {"uv": [13, 3, 15, 13], "texture": "#inside", "cullface": "north"}, + "south": {"uv": [0, 0, 0, 0], "texture": "#inside"}, + "west": {"uv": [1, 3, 3, 13], "texture": "#inside", "cullface": "north"}, + "up": {"uv": [3, 1, 13, 3], "texture": "#inside", "cullface": "north"}, + "down": {"uv": [13, 3, 3, 1], "texture": "#inside", "cullface": "north"} + } + }, + { + "from": [3, 3, 14], + "to": [13, 13, 16], + "faces": { + "east": {"uv": [1, 3, 3, 13], "texture": "#inside", "cullface": "south"}, + "south": {"uv": [3, 3, 13, 13], "texture": "#inside", "cullface": "south"}, + "west": {"uv": [13, 3, 15, 13], "texture": "#inside", "cullface": "south"}, + "up": {"uv": [3, 13, 13, 15], "texture": "#inside", "cullface": "south"}, + "down": {"uv": [13, 15, 3, 13], "texture": "#inside", "cullface": "south"} + } + }, + { + "from": [14, 3, 3], + "to": [16, 13, 13], + "faces": { + "north": {"uv": [1, 3, 3, 13], "texture": "#inside", "cullface": "east"}, + "east": {"uv": [3, 3, 13, 13], "texture": "#inside", "cullface": "east"}, + "south": {"uv": [13, 3, 15, 13], "texture": "#inside", "cullface": "east"}, + "up": {"uv": [13, 3, 15, 13], "texture": "#inside", "cullface": "east"}, + "down": {"uv": [3, 13, 1, 3], "texture": "#inside", "cullface": "east"} + } + }, + { + "from": [3, 0, 3], + "to": [13, 2, 13], + "faces": { + "north": {"uv": [3, 13, 13, 15], "texture": "#inside", "cullface": "down"}, + "east": {"uv": [3, 13, 13, 15], "texture": "#inside", "cullface": "down"}, + "south": {"uv": [3, 13, 13, 15], "texture": "#inside", "cullface": "down"}, + "west": {"uv": [3, 13, 13, 15], "texture": "#inside", "cullface": "down"}, + "down": {"uv": [13, 13, 3, 3], "texture": "#inside", "cullface": "down"} + } + }, + { + "from": [2, 2, 2], + "to": [14, 14, 14], + "faces": { + "north": {"uv": [2, 2, 14, 14], "texture": "#inside"}, + "east": {"uv": [2, 2, 14, 14], "texture": "#inside"}, + "south": {"uv": [2, 2, 14, 14], "texture": "#inside"}, + "west": {"uv": [2, 2, 14, 14], "texture": "#inside"}, + "up": {"uv": [2, 2, 14, 14], "texture": "#inside"}, + "down": {"uv": [14, 14, 2, 2], "texture": "#inside"} + } + } + ] +} \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/resources/internal/resourcepack/assets/minecraft/textures/font/gui/custom/blasting.png b/bukkit-loader/src/main/resources/resources/internal/resourcepack/assets/minecraft/textures/font/gui/custom/blasting.png new file mode 100644 index 000000000..de9284244 Binary files /dev/null and b/bukkit-loader/src/main/resources/resources/internal/resourcepack/assets/minecraft/textures/font/gui/custom/blasting.png differ diff --git a/bukkit-loader/src/main/resources/resources/internal/resourcepack/assets/minecraft/textures/font/gui/custom/campfire.png b/bukkit-loader/src/main/resources/resources/internal/resourcepack/assets/minecraft/textures/font/gui/custom/campfire.png new file mode 100644 index 000000000..d5ab49192 Binary files /dev/null and b/bukkit-loader/src/main/resources/resources/internal/resourcepack/assets/minecraft/textures/font/gui/custom/campfire.png differ diff --git a/bukkit-loader/src/main/resources/resources/internal/resourcepack/assets/minecraft/textures/font/gui/custom/category.png b/bukkit-loader/src/main/resources/resources/internal/resourcepack/assets/minecraft/textures/font/gui/custom/category.png new file mode 100644 index 000000000..39f8c1260 Binary files /dev/null and b/bukkit-loader/src/main/resources/resources/internal/resourcepack/assets/minecraft/textures/font/gui/custom/category.png differ diff --git a/bukkit-loader/src/main/resources/resources/internal/resourcepack/assets/minecraft/textures/font/gui/custom/cooking_recipe.png b/bukkit-loader/src/main/resources/resources/internal/resourcepack/assets/minecraft/textures/font/gui/custom/cooking_recipe.png new file mode 100644 index 000000000..f762e055e Binary files /dev/null and b/bukkit-loader/src/main/resources/resources/internal/resourcepack/assets/minecraft/textures/font/gui/custom/cooking_recipe.png differ diff --git a/bukkit-loader/src/main/resources/resources/internal/resourcepack/assets/minecraft/textures/font/gui/custom/crafting_recipe.png b/bukkit-loader/src/main/resources/resources/internal/resourcepack/assets/minecraft/textures/font/gui/custom/crafting_recipe.png new file mode 100644 index 000000000..1c2641cfa Binary files /dev/null and b/bukkit-loader/src/main/resources/resources/internal/resourcepack/assets/minecraft/textures/font/gui/custom/crafting_recipe.png differ diff --git a/bukkit-loader/src/main/resources/resources/internal/resourcepack/assets/minecraft/textures/font/gui/custom/item_browser.png b/bukkit-loader/src/main/resources/resources/internal/resourcepack/assets/minecraft/textures/font/gui/custom/item_browser.png new file mode 100644 index 000000000..421545181 Binary files /dev/null and b/bukkit-loader/src/main/resources/resources/internal/resourcepack/assets/minecraft/textures/font/gui/custom/item_browser.png differ diff --git a/bukkit-loader/src/main/resources/resources/internal/resourcepack/assets/minecraft/textures/font/gui/custom/no_recipe.png b/bukkit-loader/src/main/resources/resources/internal/resourcepack/assets/minecraft/textures/font/gui/custom/no_recipe.png new file mode 100644 index 000000000..63febd3d8 Binary files /dev/null and b/bukkit-loader/src/main/resources/resources/internal/resourcepack/assets/minecraft/textures/font/gui/custom/no_recipe.png differ diff --git a/bukkit-loader/src/main/resources/resources/internal/resourcepack/assets/minecraft/textures/font/gui/custom/smelting.png b/bukkit-loader/src/main/resources/resources/internal/resourcepack/assets/minecraft/textures/font/gui/custom/smelting.png new file mode 100644 index 000000000..8015e9a3e Binary files /dev/null and b/bukkit-loader/src/main/resources/resources/internal/resourcepack/assets/minecraft/textures/font/gui/custom/smelting.png differ diff --git a/bukkit-loader/src/main/resources/resources/internal/resourcepack/assets/minecraft/textures/font/gui/custom/smoking.png b/bukkit-loader/src/main/resources/resources/internal/resourcepack/assets/minecraft/textures/font/gui/custom/smoking.png new file mode 100644 index 000000000..cfb5c5cc6 Binary files /dev/null and b/bukkit-loader/src/main/resources/resources/internal/resourcepack/assets/minecraft/textures/font/gui/custom/smoking.png differ diff --git a/bukkit-loader/src/main/resources/resources/internal/resourcepack/assets/minecraft/textures/font/gui/custom/stonecutting_recipe.png b/bukkit-loader/src/main/resources/resources/internal/resourcepack/assets/minecraft/textures/font/gui/custom/stonecutting_recipe.png new file mode 100644 index 000000000..3fe5819f0 Binary files /dev/null and b/bukkit-loader/src/main/resources/resources/internal/resourcepack/assets/minecraft/textures/font/gui/custom/stonecutting_recipe.png differ diff --git a/bukkit-loader/src/main/resources/resources/internal/resourcepack/assets/minecraft/textures/font/offset/space_split.png b/bukkit-loader/src/main/resources/resources/internal/resourcepack/assets/minecraft/textures/font/offset/space_split.png new file mode 100644 index 000000000..3ca3f1d84 Binary files /dev/null and b/bukkit-loader/src/main/resources/resources/internal/resourcepack/assets/minecraft/textures/font/offset/space_split.png differ diff --git a/bukkit-loader/src/main/resources/resources/internal/resourcepack/assets/minecraft/textures/item/custom/gui/cooking_info.png b/bukkit-loader/src/main/resources/resources/internal/resourcepack/assets/minecraft/textures/item/custom/gui/cooking_info.png new file mode 100644 index 000000000..f6344e8e8 Binary files /dev/null and b/bukkit-loader/src/main/resources/resources/internal/resourcepack/assets/minecraft/textures/item/custom/gui/cooking_info.png differ diff --git a/bukkit-loader/src/main/resources/resources/internal/resourcepack/assets/minecraft/textures/item/custom/gui/cooking_info.png.mcmeta b/bukkit-loader/src/main/resources/resources/internal/resourcepack/assets/minecraft/textures/item/custom/gui/cooking_info.png.mcmeta new file mode 100644 index 000000000..0a7194257 --- /dev/null +++ b/bukkit-loader/src/main/resources/resources/internal/resourcepack/assets/minecraft/textures/item/custom/gui/cooking_info.png.mcmeta @@ -0,0 +1,6 @@ +{ + "animation": { + "interpolate": false, + "frametime": 5 + } +} diff --git a/bukkit-loader/src/main/resources/resources/internal/resourcepack/assets/minecraft/textures/item/custom/gui/get_item.png b/bukkit-loader/src/main/resources/resources/internal/resourcepack/assets/minecraft/textures/item/custom/gui/get_item.png new file mode 100644 index 000000000..eb25e613e Binary files /dev/null and b/bukkit-loader/src/main/resources/resources/internal/resourcepack/assets/minecraft/textures/item/custom/gui/get_item.png differ diff --git a/bukkit-loader/src/main/resources/resources/internal/resourcepack/assets/minecraft/textures/item/custom/gui/next_page_0.png b/bukkit-loader/src/main/resources/resources/internal/resourcepack/assets/minecraft/textures/item/custom/gui/next_page_0.png new file mode 100644 index 000000000..793e3a742 Binary files /dev/null and b/bukkit-loader/src/main/resources/resources/internal/resourcepack/assets/minecraft/textures/item/custom/gui/next_page_0.png differ diff --git a/bukkit-loader/src/main/resources/resources/internal/resourcepack/assets/minecraft/textures/item/custom/gui/next_page_1.png b/bukkit-loader/src/main/resources/resources/internal/resourcepack/assets/minecraft/textures/item/custom/gui/next_page_1.png new file mode 100644 index 000000000..79dd272a7 Binary files /dev/null and b/bukkit-loader/src/main/resources/resources/internal/resourcepack/assets/minecraft/textures/item/custom/gui/next_page_1.png differ diff --git a/bukkit-loader/src/main/resources/resources/internal/resourcepack/assets/minecraft/textures/item/custom/gui/previous_page_0.png b/bukkit-loader/src/main/resources/resources/internal/resourcepack/assets/minecraft/textures/item/custom/gui/previous_page_0.png new file mode 100644 index 000000000..9f4b14745 Binary files /dev/null and b/bukkit-loader/src/main/resources/resources/internal/resourcepack/assets/minecraft/textures/item/custom/gui/previous_page_0.png differ diff --git a/bukkit-loader/src/main/resources/resources/internal/resourcepack/assets/minecraft/textures/item/custom/gui/previous_page_1.png b/bukkit-loader/src/main/resources/resources/internal/resourcepack/assets/minecraft/textures/item/custom/gui/previous_page_1.png new file mode 100644 index 000000000..dfe5aca29 Binary files /dev/null and b/bukkit-loader/src/main/resources/resources/internal/resourcepack/assets/minecraft/textures/item/custom/gui/previous_page_1.png differ diff --git a/bukkit-loader/src/main/resources/resources/internal/resourcepack/assets/minecraft/textures/item/custom/gui/return.png b/bukkit-loader/src/main/resources/resources/internal/resourcepack/assets/minecraft/textures/item/custom/gui/return.png new file mode 100644 index 000000000..8ab378e91 Binary files /dev/null and b/bukkit-loader/src/main/resources/resources/internal/resourcepack/assets/minecraft/textures/item/custom/gui/return.png differ diff --git a/bukkit-loader/src/main/resources/translations/en.yml b/bukkit-loader/src/main/resources/translations/en.yml new file mode 100644 index 000000000..a0e77f1fa --- /dev/null +++ b/bukkit-loader/src/main/resources/translations/en.yml @@ -0,0 +1,51 @@ +# Don't change this +lang-version: "${lang_version}" + +exception.invalid_syntax: "Invalid syntax. Correct syntax: " +exception.invalid_argument: "Invalid argument. Reason: " +exception.invalid_sender: " is not allowed to execute that command. Must be of type " +exception.unexpected: "An internal error occurred while attempting to perform this command" +exception.no_permission: "I'm sorry, but you do not have permission to perform this command" +exception.no_such_command: "Unknown command." +argument.entity.notfound.player: "" +argument.entity.notfound.entity: "" +argument.parse.failure.time: "'' is not a valid time format" +argument.parse.failure.material: "'' is not a valid material name" +argument.parse.failure.enchantment: "'' is not a valid enchantment" +argument.parse.failure.offlineplayer: "No player found for input ''" +argument.parse.failure.player: "No player found for input ''" +argument.parse.failure.world: "'' is not a valid Minecraft world" +argument.parse.failure.location.invalid_format: "'' is not a valid location. Required format is ' " +argument.parse.failure.location.mixed_local_absolute: "Cannot mix local and absolute coordinates. (either all coordinates use '^' or none do)" +argument.parse.failure.namespacedkey.namespace: "Invalid namespace ''. Must be [a-z0-9._-]" +argument.parse.failure.namespacedkey.key: "Invalid key ''. Must be [a-z0-9/._-]" +argument.parse.failure.namespacedkey.need_namespace: "Invalid input '', requires an explicit namespace" +argument.parse.failure.boolean: "Could not parse boolean from ''" +argument.parse.failure.number: "'' is not a valid number in the range to " +argument.parse.failure.char: "'' is not a valid character" +argument.parse.failure.string: "'' is not a valid string of type " +argument.parse.failure.uuid: "'' is not a valid UUID" +argument.parse.failure.enum: "'' is not one of the following: " +argument.parse.failure.regex: "'' does not match ''" +argument.parse.failure.flag.unknown: "Unknown flag ''" +argument.parse.failure.flag.duplicate_flag: "Duplicate flag ''" +argument.parse.failure.flag.no_flag_started: "No flag started. Don't know what to do with ''" +argument.parse.failure.flag.missing_argument: "Missing argument for ''" +argument.parse.failure.flag.no_permission: "You don't have permission to use ''" +argument.parse.failure.color: "'' is not a valid color" +argument.parse.failure.duration: "'' is not a duration format" +argument.parse.failure.aggregate.missing: "Missing component ''" +argument.parse.failure.aggregate.failure: "Invalid component '': " +argument.parse.failure.either: "Could not resolve or from ''" +argument.parse.failure.namedtextcolor: "'' is not a named text color" +command.reload.config.success: "Configs reloaded in ms." +command.reload.config.failure: "Config reload failed. Check console logs." +command.reload.pack.success: "Resource pack reloaded in ms." +command.reload.pack.failure: "Resource pack reload failed. Check console logs." +command.reload.all.success: "Reload completed in ms." +command.reload.all.failure: "Reload failed. Check console logs." +command.item.get.success: "Got " +command.item.get.failure.not_exist: "'>" +command.item.give.success.single: "':'':''>" +command.item.give.success.multiple: "':'':''>" +command.item.give.failure.not_exist: "'>" \ No newline at end of file diff --git a/bukkit-loader/src/main/resources/translations/es.yml b/bukkit-loader/src/main/resources/translations/es.yml new file mode 100644 index 000000000..4517db462 --- /dev/null +++ b/bukkit-loader/src/main/resources/translations/es.yml @@ -0,0 +1,51 @@ +# Don't change this +lang-version: "${lang_version}" + +exception.invalid_syntax: "Sintaxis inválida. Sintaxis correcta: " +exception.invalid_argument: "Argumento no válido. Razón: " +exception.invalid_sender: " no puede ejecutar ese comando. Debe ser del tipo " +exception.unexpected: "Se ha producido un error interno al intentar ejecutar este comando" +exception.no_permission: "Lo siento, pero usted no tiene permiso para realizar este comando" +exception.no_such_command: "Comando desconocido." +argument.entity.notfound.player: "" +argument.entity.notfound.entity: "" +argument.parse.failure.time: "'' no es un formato de hora válido" +argument.parse.failure.material: "'' no es un nombre de material válido" +argument.parse.failure.enchantment: "'' no es un encantamiento válido" +argument.parse.failure.offlineplayer: "No se ha encontrado ningún reproductor para la entrada ''" +argument.parse.failure.player: "No se ha encontrado ningún reproductor para la entrada ''" +argument.parse.failure.world: "'' no es un mundo Minecraft válido" +argument.parse.failure.location.invalid_format: "'' no es una ubicación válida. El formato requerido es ' " +argument.parse.failure.location.mixed_local_absolute: "No se pueden mezclar coordenadas locales y absolutas. (o todas las coordenadas utilizan '^' o ninguna lo hace)" +argument.parse.failure.namespacedkey.namespace: "Namespace Invalido''. Debe ser [a-z0-9._-]" +argument.parse.failure.namespacedkey.key: "Llave invalida ''. Debe ser [a-z0-9/._-]" +argument.parse.failure.namespacedkey.need_namespace: "Input Invalido '', requires an explicit namespace" +argument.parse.failure.boolean: "No se puede parsear boolean de ''" +argument.parse.failure.number: "'' no es un número válido en el rango a " +argument.parse.failure.char: "'' no es un carácter válido" +argument.parse.failure.string: "'' no es una string de tipo " +argument.parse.failure.uuid: "'' no es un UUID válido" +argument.parse.failure.enum: "'' no es uno de los siguientes: " +argument.parse.failure.regex: "'' no coincide ''" +argument.parse.failure.flag.unknown: "Flag Desconocida ''" +argument.parse.failure.flag.duplicate_flag: "Flag Duplicada ''" +argument.parse.failure.flag.no_flag_started: "No hay una Flag empezada. No sé qué hacer con ''" +argument.parse.failure.flag.missing_argument: "Falta argumento para ''" +argument.parse.failure.flag.no_permission: "No tiene permiso para utilizar ''" +argument.parse.failure.color: "'' no es un color válido" +argument.parse.failure.duration: "'' no es un formato de duración" +argument.parse.failure.aggregate.missing: "Componente Faltante ''" +argument.parse.failure.aggregate.failure: "Componente Invalido '': " +argument.parse.failure.either: "No se ha podido resolver o de ''" +argument.parse.failure.namedtextcolor: "'' no es un color de texto con nombre" +command.reload.config.success: "Recargado. Tomó ms." +command.reload.config.failure: "Error al recargar la configuración. Por favor, revisa el registro de la consola." +command.reload.pack.success: "Paquete de recursos recargado. Tomó ms." +command.reload.pack.failure: "Error al recargar el paquete de recursos. Por favor, revisa el registro de la consola." +command.reload.all.success: "Todo recargado. Tomó ms." +command.reload.all.failure: "Error al recargar. Por favor, revisa el registro de la consola." +command.item.get.success: "Obtener " +command.item.get.failure.not_exist: "'>" +command.item.give.success.single: "':'':''>" +command.item.give.success.multiple: "':'':''>" +command.item.give.failure.not_exist: "'>" diff --git a/bukkit-loader/src/main/resources/translations/zh_cn.yml b/bukkit-loader/src/main/resources/translations/zh_cn.yml new file mode 100644 index 000000000..1375301c7 --- /dev/null +++ b/bukkit-loader/src/main/resources/translations/zh_cn.yml @@ -0,0 +1,51 @@ +# 别动这个 +lang-version: "${lang_version}" + +exception.invalid_syntax: "无效语法. 正确语法: " +exception.invalid_argument: "无效参数. 原因: " +exception.invalid_sender: " 不允许执行该命令. 执行者必须是 " +exception.unexpected: "执行该命令时发生内部错误" +exception.no_permission: "抱歉, 您没有权限执行该命令" +exception.no_such_command: "未知命令" +argument.entity.notfound.player: "找不到玩家 ''" +argument.entity.notfound.entity: "找不到实体 ''" +argument.parse.failure.time: "'' 不是有效的时间格式" +argument.parse.failure.material: "'' 不是有效的材料" +argument.parse.failure.enchantment: "'' 不是有效的魔咒" +argument.parse.failure.offlineplayer: "输入的玩家 '' 已离线" +argument.parse.failure.player: "找不到输入的玩家 ''" +argument.parse.failure.world: "'' 不是有效的 Minecraft 世界名称" +argument.parse.failure.location.invalid_format: "'' 不是有效的位置格式.必须格式为 ' '" +argument.parse.failure.location.mixed_local_absolute: "不能混用相对和绝对坐标.坐标要么全部使用 '^',要么全部不用" +argument.parse.failure.namespacedkey.namespace: "无效的命名空间 ''.必须为 [a-z0-9._-]" +argument.parse.failure.namespacedkey.key: "无效的键 ''.必须为 [a-z0-9/._-]" +argument.parse.failure.namespacedkey.need_namespace: "无效的输入 '', 需要显式指定命名空间" +argument.parse.failure.boolean: "无法解析布尔值 ''" +argument.parse.failure.number: "'' 不是从 范围内的有效数字" +argument.parse.failure.char: "'' 不是有效的字符" +argument.parse.failure.string: "'' 不是类型为 的有效字符串" +argument.parse.failure.uuid: "'' 不是有效的 UUID" +argument.parse.failure.enum: "'' 不是以下任何一种情况之一: " +argument.parse.failure.regex: "'' 不匹配 ''" +argument.parse.failure.flag.unknown: "未知标志 ''" +argument.parse.failure.flag.duplicate_flag: "重复的标志 ''" +argument.parse.failure.flag.no_flag_started: "没有开始标志. 不知道如何处理 ''" +argument.parse.failure.flag.missing_argument: "缺少 '' 参数" +argument.parse.failure.flag.no_permission: "您没有权限使用 ''" +argument.parse.failure.color: "'' 不是有效的颜色" +argument.parse.failure.duration: "'' 不是有效的持续时间格式" +argument.parse.failure.aggregate.missing: "缺少组件 ''" +argument.parse.failure.aggregate.failure: "无效的组件 '': " +argument.parse.failure.either: "无法从 '' 解析 " +argument.parse.failure.namedtextcolor: "'' 不是颜色代码" +command.reload.config.success: "重新加载配置完成. 耗时 毫秒" +command.reload.config.failure: "重新加载配置失败,请检查控制台日志。" +command.reload.pack.success: "资源包重新加载完成. 耗时 毫秒" +command.reload.pack.failure: "重新加载资源包失败,请检查控制台日志。" +command.reload.all.success: "全部重新加载完成. 耗时 毫秒" +command.reload.all.failure: "重新加载失败,请检查控制台日志。" +command.item.get.success: "获得" +command.item.get.failure.not_exist: "'>" +command.item.give.success.single: "':'':''>" +command.item.give.success.multiple: "':'':''>" +command.item.give.failure.not_exist: "'>" diff --git a/bukkit-loader/src/main/resources/translations/zh_tw.yml b/bukkit-loader/src/main/resources/translations/zh_tw.yml new file mode 100644 index 000000000..d38e5b80c --- /dev/null +++ b/bukkit-loader/src/main/resources/translations/zh_tw.yml @@ -0,0 +1,51 @@ +# 别动这个 +lang-version: "${lang_version}" + +exception.invalid_syntax: "無效的語法.正確的語法: " +exception.invalid_argument: "無效的參數.原因: " +exception.invalid_sender: " 不允許執行該命令.執行者必須是 " +exception.unexpected: "執行該命令時發生內部錯誤" +exception.no_permission: "抱歉, 您沒有權限執行該命令" +exception.no_such_command: "未知命令" +argument.entity.notfound.player: "找不到玩家 ''" +argument.entity.notfound.entity: "找不到實體 ''" +argument.parse.failure.time: "'' 不是有效的時間格式" +argument.parse.failure.material: "'' 不是有效的材料" +argument.parse.failure.enchantment: "'' 不是有效的魔咒" +argument.parse.failure.offlineplayer: "未找到符合輸入的玩家: '' 已离线" +argument.parse.failure.player: "未找到符合輸入的玩家 ''" +argument.parse.failure.world: "'' 不是有效的 Minecraft 世界名稱" +argument.parse.failure.location.invalid_format: "'' 不是有效的位置格式.格式必須為 ' '" +argument.parse.failure.location.mixed_local_absolute: "不能混用相對和絕對座標.座標要麼全部使用 '^',要麼全部不用" +argument.parse.failure.namespacedkey.namespace: "無效的命名空間 ''.必須為 [a-z0-9._-]" +argument.parse.failure.namespacedkey.key: "無效的鍵 ''.必須為 [a-z0-9/._-]" +argument.parse.failure.namespacedkey.need_namespace: "輸入無效 '', 需要顯式指定命名空間" +argument.parse.failure.boolean: "無法解析布爾值 ''" +argument.parse.failure.number: "'' 不是從 範圍內的有效數字" +argument.parse.failure.char: "'' 不是有效的字元" +argument.parse.failure.string: "'' 不是類型為 的有效的字元串" +argument.parse.failure.uuid: "'' 不是有效的 UUID" +argument.parse.failure.enum: "'' 不是以下任何一種情況之一: " +argument.parse.failure.regex: "'' 不匹配 ''" +argument.parse.failure.flag.unknown: "未知標誌 ''" +argument.parse.failure.flag.duplicate_flag: "重複的標誌 ''" +argument.parse.failure.flag.no_flag_started: "沒有開始標誌.不知道如何處理 ''" +argument.parse.failure.flag.missing_argument: "缺少 '' 參數" +argument.parse.failure.flag.no_permission: "您沒有權限使用 ''" +argument.parse.failure.color: "'' 不是有效的顏色" +argument.parse.failure.duration: "'' 不是有效的持續時間格式" +argument.parse.failure.aggregate.missing: "缺少元件 ''" +argument.parse.failure.aggregate.failure: "無效的元件 '': " +argument.parse.failure.either: "無法從 '' 解析 " +argument.parse.failure.namedtextcolor: "'' 不是顏色代碼" +command.reload.config.success: "重新加載配置完成. 耗時 毫秒" +command.reload.config.failure: "重新加載配置失敗,請檢查控制台日誌。" +command.reload.pack.success: "資源包重新加載完成. 耗時 毫秒" +command.reload.pack.failure: "重新加載資源包失敗,請檢查控制台日誌。" +command.reload.all.success: "全部重新加載完成. 耗時 毫秒" +command.reload.all.failure: "重新加載失敗,請檢查控制台日誌。" +command.item.get.success: "獲得" +command.item.get.failure.not_exist: "'>" +command.item.give.success.single: "':'':''>" +command.item.give.success.multiple: "':'':''>" +command.item.give.failure.not_exist: "'>" diff --git a/bukkit/build.gradle.kts b/bukkit/build.gradle.kts new file mode 100644 index 000000000..4d23ac5f6 --- /dev/null +++ b/bukkit/build.gradle.kts @@ -0,0 +1,130 @@ +plugins { + id("com.gradleup.shadow") version "9.0.0-beta6" + id("maven-publish") +} + +repositories { + maven("https://jitpack.io/") + maven("https://repo.extendedclip.com/content/repositories/placeholderapi/") // papi + maven("https://repo.papermc.io/repository/maven-public/") + maven("https://maven.enginehub.org/repo/") // worldguard worldedit + maven("https://repo.momirealms.net/releases/") + mavenCentral() +} + +dependencies { + compileOnly(project(":core")) + compileOnly(project(":shared")) + compileOnly(project(":bukkit:legacy")) + // Anti Grief + compileOnly("com.github.Xiao-MoMi:AntiGriefLib:${rootProject.properties["anti_grief_version"]}") + // NBT + compileOnly("net.momirealms:sparrow-nbt:${rootProject.properties["sparrow_nbt_version"]}") + compileOnly("net.momirealms:sparrow-util:${rootProject.properties["sparrow_util_version"]}") + // Placeholder + compileOnly("me.clip:placeholderapi:${rootProject.properties["placeholder_api_version"]}") + // Platform + compileOnly("dev.folia:folia-api:${rootProject.properties["paper_version"]}-R0.1-SNAPSHOT") + // OpenGL Math + compileOnly("org.joml:joml:${rootProject.properties["joml_version"]}") + // Gson + compileOnly("com.google.code.gson:gson:${rootProject.properties["gson_version"]}") + // Guava + compileOnly("com.google.guava:guava:${rootProject.properties["guava_version"]}") + // FastUtil + compileOnly("it.unimi.dsi:fastutil:${rootProject.properties["fastutil_version"]}") + // Netty + compileOnly("io.netty:netty-all:${rootProject.properties["netty_version"]}") + // ByteBuddy + compileOnly("net.bytebuddy:byte-buddy:${rootProject.properties["byte_buddy_version"]}") + // Command + compileOnly("org.incendo:cloud-core:${rootProject.properties["cloud_core_version"]}") + compileOnly("org.incendo:cloud-minecraft-extras:${rootProject.properties["cloud_minecraft_extras_version"]}") + compileOnly("org.incendo:cloud-paper:${rootProject.properties["cloud_paper_version"]}") + // YAML + compileOnly(files("${rootProject.rootDir}/libs/boosted-yaml-${rootProject.properties["boosted_yaml_version"]}.jar")) + // Item Tag + compileOnly("com.saicone.rtag:rtag:${rootProject.properties["rtag_version"]}") + compileOnly("com.saicone.rtag:rtag-item:${rootProject.properties["rtag_version"]}") + // Adventure + compileOnly("net.kyori:adventure-api:${rootProject.properties["adventure_bundle_version"]}") + compileOnly("net.kyori:adventure-platform-bukkit:${rootProject.properties["adventure_platform_version"]}") + compileOnly("net.kyori:adventure-text-minimessage:${rootProject.properties["adventure_bundle_version"]}") + compileOnly("net.kyori:adventure-text-serializer-gson:${rootProject.properties["adventure_bundle_version"]}") { + exclude("com.google.code.gson", "gson") + } + compileOnly("com.sk89q.worldedit:worldedit-core:7.2.19") + compileOnly("com.sk89q.worldedit:worldedit-bukkit:7.2.19") + // Data Fixer Upper + compileOnly("com.mojang:datafixerupper:${rootProject.properties["datafixerupper_version"]}") +} + +java { + sourceCompatibility = JavaVersion.VERSION_21 + targetCompatibility = JavaVersion.VERSION_21 + toolchain { + languageVersion = JavaLanguageVersion.of(21) + } + withSourcesJar() +} + +tasks.withType { + options.encoding = "UTF-8" + options.release.set(21) + dependsOn(tasks.clean) +} + +artifacts { + archives(tasks.shadowJar) +} + +tasks { + shadowJar { + archiveClassifier = "" + archiveFileName = "craft-engine-bukkit-${rootProject.properties["project_version"]}.jar" + relocate("net.kyori", "net.momirealms.craftengine.libraries") + relocate("net.momirealms.sparrow.nbt", "net.momirealms.craftengine.libraries.nbt") + relocate("net.momirealms.antigrieflib", "net.momirealms.craftengine.libraries.antigrieflib") + relocate("com.saicone.rtag", "net.momirealms.craftengine.libraries.tag") + relocate("org.incendo", "net.momirealms.craftengine.libraries") + relocate("dev.dejvokep", "net.momirealms.craftengine.libraries") + relocate("org.apache.commons.io", "net.momirealms.craftengine.libraries.commons.io") + relocate("org.bstats", "net.momirealms.craftengine.libraries.bstats") + relocate("com.github.benmanes.caffeine", "net.momirealms.craftengine.libraries.caffeine") + relocate("net.objecthunter.exp4j", "net.momirealms.craftengine.libraries.exp4j") + relocate("net.bytebuddy", "net.momirealms.craftengine.libraries.bytebuddy") + relocate("org.yaml.snakeyaml", "net.momirealms.craftengine.libraries.snakeyaml") + } +} + +publishing { + repositories { + maven { + url = uri("https://repo.momirealms.net/releases") + credentials(PasswordCredentials::class) { + username = System.getenv("REPO_USERNAME") + password = System.getenv("REPO_PASSWORD") + } + } + } + publications { + create("mavenJava") { + groupId = "net.momirealms" + artifactId = "craft-engine-bukkit" + version = rootProject.properties["project_version"].toString() + artifact(tasks["sourcesJar"]) + from(components["shadow"]) + pom { + name = "CraftEngine API" + url = "https://github.com/Xiao-MoMi/craft-engine" + licenses { + license { + name = "GNU General Public License v3.0" + url = "https://www.gnu.org/licenses/gpl-3.0.html" + distribution = "repo" + } + } + } + } + } +} diff --git a/bukkit/legacy/build.gradle.kts b/bukkit/legacy/build.gradle.kts new file mode 100644 index 000000000..40e26ed6f --- /dev/null +++ b/bukkit/legacy/build.gradle.kts @@ -0,0 +1,31 @@ +plugins { + id("io.github.goooler.shadow") version "8.1.8" +} + +repositories { + maven("https://repo.papermc.io/repository/maven-public/") + mavenCentral() +} + +dependencies { + // Platform + compileOnly("dev.folia:folia-api:1.20.1-R0.1-SNAPSHOT") +} + +java { + sourceCompatibility = JavaVersion.VERSION_21 + targetCompatibility = JavaVersion.VERSION_21 + toolchain { + languageVersion = JavaLanguageVersion.of(21) + } +} + +tasks.withType { + options.encoding = "UTF-8" + options.release.set(21) + dependsOn(tasks.clean) +} + +artifacts { + archives(tasks.shadowJar) +} \ No newline at end of file diff --git a/bukkit/legacy/src/main/java/net/momirealms/craftengine/bukkit/entity/furniture/DismountListener1_20.java b/bukkit/legacy/src/main/java/net/momirealms/craftengine/bukkit/entity/furniture/DismountListener1_20.java new file mode 100644 index 000000000..98fd4deea --- /dev/null +++ b/bukkit/legacy/src/main/java/net/momirealms/craftengine/bukkit/entity/furniture/DismountListener1_20.java @@ -0,0 +1,23 @@ +package net.momirealms.craftengine.bukkit.entity.furniture; + +import org.bukkit.entity.Entity; +import org.bukkit.entity.Player; +import org.bukkit.event.EventHandler; +import org.bukkit.event.Listener; + +import java.util.function.BiConsumer; + +public class DismountListener1_20 implements Listener { + private final BiConsumer consumer; + + public DismountListener1_20(BiConsumer consumer) { + this.consumer = consumer; + } + + @EventHandler(ignoreCancelled = true) + public void onDismount(org.spigotmc.event.entity.EntityDismountEvent event) { + if (event.getEntity() instanceof Player player) { + this.consumer.accept(player, event.getDismounted()); + } + } +} diff --git a/bukkit/legacy/src/main/java/net/momirealms/craftengine/bukkit/util/LegacyAttributeUtils.java b/bukkit/legacy/src/main/java/net/momirealms/craftengine/bukkit/util/LegacyAttributeUtils.java new file mode 100644 index 000000000..46552b43f --- /dev/null +++ b/bukkit/legacy/src/main/java/net/momirealms/craftengine/bukkit/util/LegacyAttributeUtils.java @@ -0,0 +1,13 @@ +package net.momirealms.craftengine.bukkit.util; + +import org.bukkit.attribute.Attribute; +import org.bukkit.entity.ArmorStand; + +import java.util.Objects; + +public class LegacyAttributeUtils { + + public static void setMaxHealth(ArmorStand entity) { + Objects.requireNonNull(entity.getAttribute(Attribute.GENERIC_MAX_HEALTH)).setBaseValue(0.01); + } +} diff --git a/bukkit/legacy/src/main/java/net/momirealms/craftengine/bukkit/util/LegacyInventoryUtils.java b/bukkit/legacy/src/main/java/net/momirealms/craftengine/bukkit/util/LegacyInventoryUtils.java new file mode 100644 index 000000000..7abee98f0 --- /dev/null +++ b/bukkit/legacy/src/main/java/net/momirealms/craftengine/bukkit/util/LegacyInventoryUtils.java @@ -0,0 +1,11 @@ +package net.momirealms.craftengine.bukkit.util; + +import org.bukkit.entity.Player; +import org.bukkit.inventory.Inventory; + +public class LegacyInventoryUtils { + + public static Inventory getTopInventory(Player player) { + return player.getOpenInventory().getTopInventory(); + } +} diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/api/CraftEngineBlocks.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/api/CraftEngineBlocks.java new file mode 100644 index 000000000..b92732599 --- /dev/null +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/api/CraftEngineBlocks.java @@ -0,0 +1,245 @@ +package net.momirealms.craftengine.bukkit.api; + +import net.momirealms.craftengine.bukkit.block.BukkitBlockManager; +import net.momirealms.craftengine.bukkit.plugin.BukkitCraftEngine; +import net.momirealms.craftengine.bukkit.plugin.user.BukkitServerPlayer; +import net.momirealms.craftengine.bukkit.util.BlockStateUtils; +import net.momirealms.craftengine.bukkit.util.Reflections; +import net.momirealms.craftengine.bukkit.world.BukkitWorld; +import net.momirealms.craftengine.core.block.CustomBlock; +import net.momirealms.craftengine.core.block.ImmutableBlockState; +import net.momirealms.craftengine.core.block.UpdateOption; +import net.momirealms.craftengine.core.entity.player.InteractionHand; +import net.momirealms.craftengine.core.item.Item; +import net.momirealms.craftengine.core.loot.parameter.LootParameters; +import net.momirealms.craftengine.core.plugin.CraftEngine; +import net.momirealms.craftengine.core.util.Key; +import net.momirealms.craftengine.core.util.context.ContextHolder; +import net.momirealms.craftengine.core.world.Vec3d; +import net.momirealms.craftengine.core.world.World; +import net.momirealms.sparrow.nbt.CompoundTag; +import org.bukkit.Location; +import org.bukkit.Material; +import org.bukkit.SoundCategory; +import org.bukkit.block.Block; +import org.bukkit.block.data.BlockData; +import org.bukkit.entity.Player; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +public final class CraftEngineBlocks { + + /** + * Gets a custom block by ID + * + * @param id id + * @return the custom block + */ + @Nullable + public static CustomBlock byId(@NotNull Key id) { + return BukkitBlockManager.instance().getBlock(id).orElse(null); + } + + /** + * Places a custom block state at a certain location + * + * @param location location + * @param block block state to place + * @param playSound whether to play place sounds + * @return success or not + */ + public static boolean place(@NotNull Location location, + @NotNull ImmutableBlockState block, + boolean playSound) { + return place(location, block, UpdateOption.UPDATE_ALL, playSound); + } + + /** + * Place a custom block with given properties + * + * @param location location + * @param blockId block owner id + * @param properties properties + * @param playSound whether to play place sounds + * @return success or not + */ + public static boolean place(@NotNull Location location, + @NotNull Key blockId, + @NotNull CompoundTag properties, + boolean playSound) { + CustomBlock block = byId(blockId); + if (block == null) return false; + return place(location, block.getBlockState(properties), UpdateOption.UPDATE_ALL, playSound); + } + + /** + * Place a custom block with given properties + * + * @param location location + * @param blockId block owner id + * @param properties properties + * @param option update options + * @param playSound whether to play place sounds + * @return success or not + */ + public static boolean place(@NotNull Location location, + @NotNull Key blockId, + @NotNull CompoundTag properties, + @NotNull UpdateOption option, + boolean playSound) { + CustomBlock block = byId(blockId); + if (block == null) return false; + return place(location, block.getBlockState(properties), option, playSound); + } + + /** + * Places a custom block state at a certain location + * + * @param location location + * @param block block state to place + * @param option update options + * @param playSound whether to play place sounds + * @return success or not + */ + public static boolean place(@NotNull Location location, + @NotNull ImmutableBlockState block, + @NotNull UpdateOption option, + boolean playSound) { + boolean success; + try { + Object worldServer = Reflections.field$CraftWorld$ServerLevel.get(location.getWorld()); + Object blockPos = Reflections.constructor$BlockPos.newInstance(location.getBlockX(), location.getBlockY(), location.getBlockZ()); + Object blockState = block.customBlockState().handle(); + Object oldBlockState = Reflections.method$BlockGetter$getBlockState.invoke(worldServer, blockPos); + success = (boolean) Reflections.method$LevelWriter$setBlock.invoke(worldServer, blockPos, blockState, option.flags()); + if (success) { + Reflections.method$BlockStateBase$onPlace.invoke(blockState, worldServer, blockPos, oldBlockState, true); + if (playSound) { + location.getWorld().playSound(location, block.sounds().placeSound().toString(), SoundCategory.BLOCKS, 1, 0.8f); + } + } + } catch (ReflectiveOperationException e) { + CraftEngine.instance().logger().warn("Failed to set nms block", e); + return false; + } + return success; + } + + /** + * Removes a block from the world if it's a custom one + * + * @param block block to remove + * @return success or not + */ + public static boolean remove(@NotNull Block block) { + if (!isCustomBlock(block)) return false; + block.setType(Material.AIR, true); + return true; + } + + /** + * Removes a block from the world if it's a custom one + * + * @param block block to remove + * @param applyPhysics whether to apply physics + * @return success or not + */ + public static boolean remove(@NotNull Block block, + boolean applyPhysics) { + if (!isCustomBlock(block)) return false; + block.setType(Material.AIR, applyPhysics); + return true; + } + + /** + * Removes a block from the world if it's a custom one + * + * @param block block to remove + * @param player player who breaks the block + * @param applyPhysics whether to apply physics + * @param dropLoot whether to drop block loots + * @param playSound whether to play break sounds + * @param sendParticles whether to send break particles + * @return success or not + */ + public static boolean remove(@NotNull Block block, + @Nullable Player player, + boolean applyPhysics, + boolean dropLoot, + boolean playSound, + boolean sendParticles) { + ImmutableBlockState state = getCustomBlockState(block); + if (state == null || state.isEmpty()) return false; + World world = new BukkitWorld(block.getWorld()); + Location location = block.getLocation(); + Vec3d vec3d = new Vec3d(location.getBlockX() + 0.5, location.getBlockY() + 0.5, location.getBlockZ() + 0.5); + if (dropLoot) { + ContextHolder.Builder builder = new ContextHolder.Builder().withParameter(LootParameters.WORLD, world).withParameter(LootParameters.LOCATION, vec3d); + BukkitServerPlayer serverPlayer = BukkitCraftEngine.instance().adapt(player); + if (player != null) { + builder.withParameter(LootParameters.PLAYER, serverPlayer); + builder.withParameter(LootParameters.TOOL, serverPlayer.getItemInHand(InteractionHand.MAIN_HAND)); + } + for (Item item : state.getDrops(builder, world)) { + world.dropItemNaturally(vec3d, item); + } + } + if (playSound) { + world.playBlockSound(vec3d, state.sounds().breakSound(), 1, 0.8f); + } + if (sendParticles) { + // TODO Particles + //ParticleUtils.addBlockBreakParticles(block.getWorld(), LocationUtils.toBlockPos(location), state.customBlockState().handle()); + } + block.setType(Material.AIR, applyPhysics); + return true; + } + + /** + * Checks if a block is a custom one + * + * @param block block + * @return is custom block or not + */ + public static boolean isCustomBlock(@NotNull Block block) { + BlockData blockData = block.getBlockData(); + int stateId = BlockStateUtils.blockDataToId(blockData); + return !BlockStateUtils.isVanillaBlock(stateId); + } + + /** + * Gets custom block state from a bukkit block + * + * @param block block + * @return custom block state + */ + @Nullable + public static ImmutableBlockState getCustomBlockState(@NotNull Block block) { + BlockData blockData = block.getBlockData(); + int stateId = BlockStateUtils.blockDataToId(blockData); + return BukkitBlockManager.instance().getImmutableBlockState(stateId); + } + + /** + * Gets custom block state from bukkit block data + * + * @param blockData block data + * @return custom block state + */ + @Nullable + public static ImmutableBlockState getCustomBlockState(@NotNull BlockData blockData) { + int stateId = BlockStateUtils.blockDataToId(blockData); + return BukkitBlockManager.instance().getImmutableBlockState(stateId); + } + + /** + * Creates bukkit block data from a custom block state + * + * @param blockState custom block state + * @return bukkit block data + */ + @NotNull + public static BlockData createBukkitBlockData(@NotNull ImmutableBlockState blockState) { + return BlockStateUtils.createBlockData(blockState.customBlockState().handle()); + } +} diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/api/CraftEngineFurniture.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/api/CraftEngineFurniture.java new file mode 100644 index 000000000..4a4ac826d --- /dev/null +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/api/CraftEngineFurniture.java @@ -0,0 +1,260 @@ +package net.momirealms.craftengine.bukkit.api; + +import net.momirealms.craftengine.bukkit.entity.furniture.BukkitFurnitureManager; +import net.momirealms.craftengine.bukkit.entity.furniture.LoadedFurniture; +import net.momirealms.craftengine.bukkit.plugin.BukkitCraftEngine; +import net.momirealms.craftengine.bukkit.util.LocationUtils; +import net.momirealms.craftengine.bukkit.world.BukkitWorld; +import net.momirealms.craftengine.core.entity.furniture.AnchorType; +import net.momirealms.craftengine.core.entity.furniture.CustomFurniture; +import net.momirealms.craftengine.core.entity.player.InteractionHand; +import net.momirealms.craftengine.core.item.Item; +import net.momirealms.craftengine.core.loot.LootTable; +import net.momirealms.craftengine.core.loot.parameter.LootParameters; +import net.momirealms.craftengine.core.util.Key; +import net.momirealms.craftengine.core.util.context.ContextHolder; +import net.momirealms.craftengine.core.world.Vec3d; +import net.momirealms.craftengine.core.world.World; +import org.bukkit.Location; +import org.bukkit.entity.Entity; +import org.bukkit.entity.Player; +import org.bukkit.inventory.ItemStack; +import org.bukkit.persistence.PersistentDataType; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +import java.util.List; + +public class CraftEngineFurniture { + + /** + * Gets custom furniture by ID + * + * @param id id + * @return the custom furniture + */ + public static CustomFurniture byId(@NotNull Key id) { + return BukkitFurnitureManager.instance().getFurniture(id).orElse(null); + } + + /** + * Places furniture at the certain location + * + * @param location location + * @param furnitureId furniture to place + * @param anchorType anchor type + * @return the loaded furniture + */ + @Nullable + public static LoadedFurniture place(Location location, Key furnitureId, AnchorType anchorType) { + CustomFurniture furniture = byId(furnitureId); + if (furniture == null) return null; + return BukkitFurnitureManager.instance().place(furniture, location, anchorType, true); + } + + /** + * Places furniture at the certain location + * + * @param location location + * @param furniture furniture to place + * @param anchorType anchor type + * @return the loaded furniture + */ + @NotNull + public static LoadedFurniture place(Location location, CustomFurniture furniture, AnchorType anchorType) { + return BukkitFurnitureManager.instance().place(furniture, location, anchorType, true); + } + + /** + * Places furniture at the certain location + * + * @param location location + * @param furnitureId furniture to place + * @param anchorType anchor type + * @param playSound whether to play place sounds + * @return the loaded furniture + */ + @Nullable + public static LoadedFurniture place(Location location, Key furnitureId, AnchorType anchorType, boolean playSound) { + CustomFurniture furniture = byId(furnitureId); + if (furniture == null) return null; + return BukkitFurnitureManager.instance().place(furniture, location, anchorType, playSound); + } + + /** + * Places furniture at the certain location + * + * @param location location + * @param furniture furniture to place + * @param anchorType anchor type + * @param playSound whether to play place sounds + * @return the loaded furniture + */ + @NotNull + public static LoadedFurniture place(Location location, CustomFurniture furniture, AnchorType anchorType, boolean playSound) { + return BukkitFurnitureManager.instance().place(furniture, location, anchorType, playSound); + } + + /** + * Check if an entity is a piece of furniture + * + * @param entity entity to check + * @return is furniture or not + */ + public static boolean isFurniture(@NotNull Entity entity) { + String furnitureId = entity.getPersistentDataContainer().get(BukkitFurnitureManager.FURNITURE_KEY, PersistentDataType.STRING); + return furnitureId != null; + } + + /** + * Check if an entity is a seat + * + * @param entity entity to check + * @return is seat or not + */ + public static boolean isSeat(@NotNull Entity entity) { + Integer baseEntityId = entity.getPersistentDataContainer().get(BukkitFurnitureManager.FURNITURE_SEAT_BASE_ENTITY_KEY, PersistentDataType.INTEGER); + return baseEntityId != null; + } + + /** + * Gets the base furniture by the base entity + * + * @param baseEntity base entity + * @return the loaded furniture + */ + @Nullable + public static LoadedFurniture getLoadedFurnitureByBaseEntity(@NotNull Entity baseEntity) { + return BukkitFurnitureManager.instance().getLoadedFurnitureByBaseEntityId(baseEntity.getEntityId()); + } + + /** + * Gets the base furniture by the seat entity + * + * @param seat seat entity + * @return the loaded furniture + */ + @Nullable + public static LoadedFurniture getLoadedFurnitureBySeat(@NotNull Entity seat) { + Integer baseEntityId = seat.getPersistentDataContainer().get(BukkitFurnitureManager.FURNITURE_SEAT_BASE_ENTITY_KEY, PersistentDataType.INTEGER); + if (baseEntityId == null) return null; + return BukkitFurnitureManager.instance().getLoadedFurnitureByBaseEntityId(baseEntityId); + } + + /** + * Removes furniture + * + * @param furniture furniture base entity + * @return success or not + */ + public static boolean remove(@NotNull Entity furniture) { + if (!isFurniture(furniture)) return false; + LoadedFurniture loadedFurniture = BukkitFurnitureManager.instance().getLoadedFurnitureByBaseEntityId(furniture.getEntityId()); + if (loadedFurniture == null) return false; + loadedFurniture.destroy(); + return true; + } + + /** + * Removes furniture, with more options + * + * @param furniture furniture base entity + * @param dropLoot whether to drop loots + * @param playSound whether to play break sound + * @return success or not + */ + public static boolean remove(@NotNull Entity furniture, + boolean dropLoot, + boolean playSound) { + if (!isFurniture(furniture)) return false; + LoadedFurniture loadedFurniture = BukkitFurnitureManager.instance().getLoadedFurnitureByBaseEntityId(furniture.getEntityId()); + if (loadedFurniture == null) return false; + remove(loadedFurniture, (net.momirealms.craftengine.core.entity.player.Player) null, dropLoot, playSound); + return true; + } + + /** + * Removes furniture, with more options + * + * @param furniture furniture base entity + * @param player the player who removes the furniture + * @param dropLoot whether to drop loots + * @param playSound whether to play break sound + * @return success or not + */ + public static boolean remove(@NotNull Entity furniture, + @Nullable Player player, + boolean dropLoot, + boolean playSound) { + if (!isFurniture(furniture)) return false; + LoadedFurniture loadedFurniture = BukkitFurnitureManager.instance().getLoadedFurnitureByBaseEntityId(furniture.getEntityId()); + if (loadedFurniture == null) return false; + remove(loadedFurniture, player, dropLoot, playSound); + return true; + } + + /** + * Removes furniture by providing a plugin furniture instance + * + * @param loadedFurniture loaded furniture + * @param dropLoot whether to drop loots + * @param playSound whether to play break sound + */ + public static void remove(@NotNull LoadedFurniture loadedFurniture, + boolean dropLoot, + boolean playSound) { + remove(loadedFurniture, (net.momirealms.craftengine.core.entity.player.Player) null, dropLoot, playSound); + } + + /** + * Removes furniture by providing a plugin furniture instance + * + * @param loadedFurniture loaded furniture + * @param player the player who removes the furniture + * @param dropLoot whether to drop loots + * @param playSound whether to play break sound + */ + + public static void remove(@NotNull LoadedFurniture loadedFurniture, + @Nullable Player player, + boolean dropLoot, + boolean playSound) { + remove(loadedFurniture, player == null ? null : BukkitCraftEngine.instance().adapt(player), dropLoot, playSound); + } + + /** + * Removes furniture by providing a plugin furniture instance + * + * @param loadedFurniture loaded furniture + * @param player the player who removes the furniture + * @param dropLoot whether to drop loots + * @param playSound whether to play break sound + */ + @SuppressWarnings("unchecked") + public static void remove(@NotNull LoadedFurniture loadedFurniture, + @Nullable net.momirealms.craftengine.core.entity.player.Player player, + boolean dropLoot, + boolean playSound) { + Location location = loadedFurniture.location(); + loadedFurniture.destroy(); + LootTable lootTable = (LootTable) loadedFurniture.furniture().lootTable(); + Vec3d vec3d = LocationUtils.toVec3d(location); + World world = new BukkitWorld(location.getWorld()); + if (dropLoot && lootTable != null) { + ContextHolder.Builder builder = ContextHolder.builder(); + builder.withParameter(LootParameters.LOCATION, vec3d); + builder.withParameter(LootParameters.WORLD, world); + if (player != null) { + builder.withParameter(LootParameters.PLAYER, player); + builder.withParameter(LootParameters.TOOL, player.getItemInHand(InteractionHand.MAIN_HAND)); + } + List> items = lootTable.getRandomItems(builder.build(), world); + for (Item item : items) { + world.dropItemNaturally(vec3d, item); + } + } + if (playSound) { + world.playBlockSound(vec3d, loadedFurniture.furniture().settings().sounds().breakSound(), 1f, 0.8f); + } + } +} diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/api/CraftEngineItems.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/api/CraftEngineItems.java new file mode 100644 index 000000000..1049ffafc --- /dev/null +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/api/CraftEngineItems.java @@ -0,0 +1,58 @@ +package net.momirealms.craftengine.bukkit.api; + +import net.momirealms.craftengine.bukkit.item.BukkitItemManager; +import net.momirealms.craftengine.bukkit.util.ItemUtils; +import net.momirealms.craftengine.core.item.CustomItem; +import net.momirealms.craftengine.core.util.Key; +import org.bukkit.inventory.ItemStack; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +public class CraftEngineItems { + + /** + * Gets a custom item by ID + * + * @param id id + * @return the custom item + */ + @Nullable + public static CustomItem byId(@NotNull Key id) { + return BukkitItemManager.instance().getCustomItem(id).orElse(null); + } + + /** + * Gets a custom item by existing item stack + * + * @param itemStack item stack + * @return the custom item + */ + @Nullable + public static CustomItem byItemStack(@NotNull ItemStack itemStack) { + if (ItemUtils.isEmpty(itemStack)) return null; + return BukkitItemManager.instance().wrap(itemStack).getCustomItem().orElse(null); + } + + /** + * Checks if an item is a custom one + * + * @param itemStack item stack + * @return true if it's a custom item + */ + public static boolean isCustomItem(@NotNull ItemStack itemStack) { + if (ItemUtils.isEmpty(itemStack)) return false; + return BukkitItemManager.instance().wrap(itemStack).isCustomItem(); + } + + /** + * Gets custom item id from item stack + * + * @param itemStack item stack + * @return the custom id, null if it's not a custom one + */ + @Nullable + public static Key getCustomItemId(@NotNull ItemStack itemStack) { + if (ItemUtils.isEmpty(itemStack)) return null; + return BukkitItemManager.instance().wrap(itemStack).customId().orElse(null); + } +} diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/api/event/AsyncResourcePackGenerateEvent.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/api/event/AsyncResourcePackGenerateEvent.java new file mode 100644 index 000000000..efca827ba --- /dev/null +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/api/event/AsyncResourcePackGenerateEvent.java @@ -0,0 +1,40 @@ +package net.momirealms.craftengine.bukkit.api.event; + +import org.bukkit.event.Event; +import org.bukkit.event.HandlerList; +import org.jetbrains.annotations.NotNull; + +import java.nio.file.Path; + +public class AsyncResourcePackGenerateEvent extends Event { + private static final HandlerList HANDLER_LIST = new HandlerList(); + private final Path generatedPackPath; + private final Path zipFilePath; + + public AsyncResourcePackGenerateEvent(@NotNull Path generatedPackPath, + @NotNull Path zipFilePath) { + super(true); + this.generatedPackPath = generatedPackPath; + this.zipFilePath = zipFilePath; + } + + @NotNull + public Path resourcePackFolder() { + return generatedPackPath; + } + + @NotNull + public Path zipFilePath() { + return zipFilePath; + } + + @NotNull + public static HandlerList getHandlerList() { + return HANDLER_LIST; + } + + @NotNull + public HandlerList getHandlers() { + return getHandlerList(); + } +} diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/api/event/CraftEngineReloadEvent.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/api/event/CraftEngineReloadEvent.java new file mode 100644 index 000000000..58d5dea02 --- /dev/null +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/api/event/CraftEngineReloadEvent.java @@ -0,0 +1,29 @@ +package net.momirealms.craftengine.bukkit.api.event; + +import net.momirealms.craftengine.bukkit.plugin.BukkitCraftEngine; +import org.bukkit.event.Event; +import org.bukkit.event.HandlerList; +import org.jetbrains.annotations.NotNull; + +public class CraftEngineReloadEvent extends Event { + private static final HandlerList HANDLER_LIST = new HandlerList(); + private final BukkitCraftEngine plugin; + + public CraftEngineReloadEvent(BukkitCraftEngine plugin) { + this.plugin = plugin; + } + + public BukkitCraftEngine plugin() { + return plugin; + } + + @NotNull + public static HandlerList getHandlerList() { + return HANDLER_LIST; + } + + @Override + public @NotNull HandlerList getHandlers() { + return HANDLER_LIST; + } +} diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/api/event/CustomBlockAttemptPlaceEvent.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/api/event/CustomBlockAttemptPlaceEvent.java new file mode 100644 index 000000000..3a15366d0 --- /dev/null +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/api/event/CustomBlockAttemptPlaceEvent.java @@ -0,0 +1,94 @@ +package net.momirealms.craftengine.bukkit.api.event; + +import net.momirealms.craftengine.core.block.CustomBlock; +import net.momirealms.craftengine.core.block.ImmutableBlockState; +import net.momirealms.craftengine.core.entity.player.InteractionHand; +import org.bukkit.Location; +import org.bukkit.block.Block; +import org.bukkit.block.BlockFace; +import org.bukkit.entity.Player; +import org.bukkit.event.Cancellable; +import org.bukkit.event.HandlerList; +import org.bukkit.event.player.PlayerEvent; +import org.jetbrains.annotations.NotNull; + +public class CustomBlockAttemptPlaceEvent extends PlayerEvent implements Cancellable { + private static final HandlerList HANDLER_LIST = new HandlerList(); + private boolean cancelled; + private final CustomBlock customBlock; + private final ImmutableBlockState state; + private final Location location; + private final BlockFace clickedFace; + private final Block clickedBlock; + private final InteractionHand hand; + + public CustomBlockAttemptPlaceEvent(@NotNull Player player, + @NotNull Location location, + @NotNull ImmutableBlockState state, + @NotNull BlockFace clickedFace, + @NotNull Block clickedBlock, + @NotNull InteractionHand hand) { + super(player); + this.customBlock = state.owner().value(); + this.state = state; + this.location = location; + this.clickedFace = clickedFace; + this.clickedBlock = clickedBlock; + this.hand = hand; + } + + @NotNull + public Player player() { + return getPlayer(); + } + + @NotNull + public InteractionHand hand() { + return hand; + } + + @NotNull + public Block clickedBlock() { + return clickedBlock; + } + + @NotNull + public BlockFace clickedFace() { + return clickedFace; + } + + @NotNull + public CustomBlock customBlock() { + return this.customBlock; + } + + @NotNull + public Location location() { + return this.location; + } + + @NotNull + public ImmutableBlockState blockState() { + return this.state; + } + + @NotNull + public static HandlerList getHandlerList() { + return HANDLER_LIST; + } + + @NotNull + public HandlerList getHandlers() { + return getHandlerList(); + } + + @Override + public boolean isCancelled() { + return this.cancelled; + } + + @Override + public void setCancelled(boolean cancel) { + this.cancelled = cancel; + } +} diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/api/event/CustomBlockBreakEvent.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/api/event/CustomBlockBreakEvent.java new file mode 100644 index 000000000..041a8fc0b --- /dev/null +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/api/event/CustomBlockBreakEvent.java @@ -0,0 +1,86 @@ +package net.momirealms.craftengine.bukkit.api.event; + +import net.momirealms.craftengine.core.block.CustomBlock; +import net.momirealms.craftengine.core.block.ImmutableBlockState; +import org.bukkit.Location; +import org.bukkit.block.Block; +import org.bukkit.entity.Player; +import org.bukkit.event.Cancellable; +import org.bukkit.event.HandlerList; +import org.bukkit.event.player.PlayerEvent; +import org.jetbrains.annotations.NotNull; + +public class CustomBlockBreakEvent extends PlayerEvent implements Cancellable { + private static final HandlerList HANDLER_LIST = new HandlerList(); + private boolean cancelled; + private final CustomBlock customBlock; + private final ImmutableBlockState state; + private final Location location; + private final Block bukkitBlock; + private boolean dropItems; + + public CustomBlockBreakEvent(@NotNull Player player, + @NotNull Location location, + @NotNull Block bukkitBlock, + @NotNull ImmutableBlockState state) { + super(player); + this.customBlock = state.owner().value(); + this.state = state; + this.bukkitBlock = bukkitBlock; + this.location = location; + this.dropItems = true; + } + + public boolean dropItems() { + return dropItems; + } + + public void setDropItems(boolean dropItems) { + this.dropItems = dropItems; + } + + @NotNull + public Block bukkitBlock() { + return bukkitBlock; + } + + @NotNull + public Player player() { + return getPlayer(); + } + + @NotNull + public CustomBlock customBlock() { + return this.customBlock; + } + + @NotNull + public Location location() { + return this.location; + } + + @NotNull + public ImmutableBlockState blockState() { + return this.state; + } + + @NotNull + public static HandlerList getHandlerList() { + return HANDLER_LIST; + } + + @NotNull + public HandlerList getHandlers() { + return getHandlerList(); + } + + @Override + public boolean isCancelled() { + return this.cancelled; + } + + @Override + public void setCancelled(boolean cancel) { + this.cancelled = cancel; + } +} diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/api/event/CustomBlockInteractEvent.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/api/event/CustomBlockInteractEvent.java new file mode 100644 index 000000000..6c7407690 --- /dev/null +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/api/event/CustomBlockInteractEvent.java @@ -0,0 +1,116 @@ +package net.momirealms.craftengine.bukkit.api.event; + +import net.momirealms.craftengine.core.block.CustomBlock; +import net.momirealms.craftengine.core.block.ImmutableBlockState; +import net.momirealms.craftengine.core.entity.player.InteractionHand; +import org.bukkit.Location; +import org.bukkit.block.Block; +import org.bukkit.block.BlockFace; +import org.bukkit.entity.Player; +import org.bukkit.event.Cancellable; +import org.bukkit.event.HandlerList; +import org.bukkit.event.player.PlayerEvent; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +public class CustomBlockInteractEvent extends PlayerEvent implements Cancellable { + private static final HandlerList HANDLER_LIST = new HandlerList(); + private boolean cancelled; + private final CustomBlock customBlock; + private final Block bukkitBlock; + private final ImmutableBlockState state; + private final Location location; + private final Location interactionPoint; + private final InteractionHand hand; + private final Action action; + private final BlockFace clickedFace; + + public CustomBlockInteractEvent(@NotNull Player player, + @NotNull Location location, + @Nullable Location interactionPoint, + @NotNull ImmutableBlockState state, + @NotNull Block bukkitBlock, + @NotNull BlockFace clickedFace, + @NotNull InteractionHand hand, + @NotNull Action action) { + super(player); + this.customBlock = state.owner().value(); + this.bukkitBlock = bukkitBlock; + this.state = state; + this.location = location; + this.interactionPoint = interactionPoint; + this.hand = hand; + this.action = action; + this.clickedFace = clickedFace; + } + + @NotNull + public BlockFace clickedFace() { + return clickedFace; + } + + @Nullable + public Location interactionPoint() { + return interactionPoint; + } + + @NotNull + public Action action() { + return action; + } + + @NotNull + public InteractionHand hand() { + return hand; + } + + @NotNull + public Block bukkitBlock() { + return bukkitBlock; + } + + @NotNull + public CustomBlock customBlock() { + return this.customBlock; + } + + @NotNull + public Player player() { + return getPlayer(); + } + + @NotNull + public Location location() { + return this.location; + } + + @NotNull + public ImmutableBlockState blockState() { + return this.state; + } + + @NotNull + public static HandlerList getHandlerList() { + return HANDLER_LIST; + } + + @NotNull + public HandlerList getHandlers() { + return getHandlerList(); + } + + @Override + public boolean isCancelled() { + return this.cancelled; + } + + @Override + public void setCancelled(boolean cancel) { + this.cancelled = cancel; + } + + public enum Action { + LEFT_CLICK, + RIGHT_CLICK + } +} diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/api/event/CustomBlockPlaceEvent.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/api/event/CustomBlockPlaceEvent.java new file mode 100644 index 000000000..1ebafc030 --- /dev/null +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/api/event/CustomBlockPlaceEvent.java @@ -0,0 +1,85 @@ +package net.momirealms.craftengine.bukkit.api.event; + +import net.momirealms.craftengine.core.block.CustomBlock; +import net.momirealms.craftengine.core.block.ImmutableBlockState; +import net.momirealms.craftengine.core.entity.player.InteractionHand; +import org.bukkit.Location; +import org.bukkit.block.Block; +import org.bukkit.entity.Player; +import org.bukkit.event.Cancellable; +import org.bukkit.event.HandlerList; +import org.bukkit.event.player.PlayerEvent; +import org.jetbrains.annotations.NotNull; + +public class CustomBlockPlaceEvent extends PlayerEvent implements Cancellable { + private static final HandlerList HANDLER_LIST = new HandlerList(); + private final CustomBlock customBlock; + private final ImmutableBlockState state; + private final Location location; + private final InteractionHand hand; + private final Block bukkitBlock; + private boolean cancelled; + + public CustomBlockPlaceEvent(@NotNull Player player, + @NotNull Location location, + @NotNull ImmutableBlockState state, + @NotNull Block bukkitBlock, + @NotNull InteractionHand hand) { + super(player); + this.customBlock = state.owner().value(); + this.state = state; + this.location = location; + this.hand = hand; + this.bukkitBlock = bukkitBlock; + } + + @NotNull + public Block bukkitBlock() { + return bukkitBlock; + } + + @NotNull + public InteractionHand hand() { + return hand; + } + + @NotNull + public CustomBlock customBlock() { + return this.customBlock; + } + + @NotNull + public Location location() { + return this.location; + } + + @NotNull + public ImmutableBlockState blockState() { + return this.state; + } + + @NotNull + public Player player() { + return getPlayer(); + } + + @NotNull + public static HandlerList getHandlerList() { + return HANDLER_LIST; + } + + @NotNull + public HandlerList getHandlers() { + return getHandlerList(); + } + + @Override + public boolean isCancelled() { + return this.cancelled; + } + + @Override + public void setCancelled(boolean cancel) { + this.cancelled = cancel; + } +} diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/api/event/FurnitureAttemptPlaceEvent.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/api/event/FurnitureAttemptPlaceEvent.java new file mode 100644 index 000000000..dffa1872c --- /dev/null +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/api/event/FurnitureAttemptPlaceEvent.java @@ -0,0 +1,95 @@ +package net.momirealms.craftengine.bukkit.api.event; + +import net.momirealms.craftengine.core.entity.furniture.AnchorType; +import net.momirealms.craftengine.core.entity.furniture.CustomFurniture; +import net.momirealms.craftengine.core.entity.player.InteractionHand; +import org.bukkit.Location; +import org.bukkit.block.Block; +import org.bukkit.block.BlockFace; +import org.bukkit.entity.Player; +import org.bukkit.event.Cancellable; +import org.bukkit.event.HandlerList; +import org.bukkit.event.player.PlayerEvent; +import org.jetbrains.annotations.NotNull; + +public class FurnitureAttemptPlaceEvent extends PlayerEvent implements Cancellable { + private static final HandlerList HANDLER_LIST = new HandlerList(); + private boolean cancelled; + private final CustomFurniture furniture; + private final Location location; + private final AnchorType anchorType; + private final BlockFace clickedFace; + private final Block clickedBlock; + private final InteractionHand hand; + + public FurnitureAttemptPlaceEvent(@NotNull Player player, + @NotNull CustomFurniture furniture, + @NotNull AnchorType anchorType, + @NotNull Location location, + @NotNull BlockFace clickedFace, + @NotNull InteractionHand hand, + @NotNull Block clickedBlock) { + super(player); + this.furniture = furniture; + this.location = location; + this.anchorType = anchorType; + this.clickedFace = clickedFace; + this.clickedBlock = clickedBlock; + this.hand = hand; + } + + @NotNull + public Block clickedBlock() { + return clickedBlock; + } + + @NotNull + public InteractionHand hand() { + return hand; + } + + @NotNull + public BlockFace clickedFace() { + return clickedFace; + } + + @NotNull + public Player player() { + return getPlayer(); + } + + @NotNull + public AnchorType anchorType() { + return anchorType; + } + + @NotNull + public Location location() { + return location; + } + + @NotNull + public CustomFurniture furniture() { + return furniture; + } + + @NotNull + public static HandlerList getHandlerList() { + return HANDLER_LIST; + } + + @NotNull + public HandlerList getHandlers() { + return getHandlerList(); + } + + @Override + public boolean isCancelled() { + return this.cancelled; + } + + @Override + public void setCancelled(boolean cancel) { + this.cancelled = cancel; + } +} diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/api/event/FurnitureBreakEvent.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/api/event/FurnitureBreakEvent.java new file mode 100644 index 000000000..824167492 --- /dev/null +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/api/event/FurnitureBreakEvent.java @@ -0,0 +1,50 @@ +package net.momirealms.craftengine.bukkit.api.event; + +import net.momirealms.craftengine.bukkit.entity.furniture.LoadedFurniture; +import org.bukkit.entity.Player; +import org.bukkit.event.Cancellable; +import org.bukkit.event.HandlerList; +import org.bukkit.event.player.PlayerEvent; +import org.jetbrains.annotations.NotNull; + +public class FurnitureBreakEvent extends PlayerEvent implements Cancellable { + private static final HandlerList HANDLER_LIST = new HandlerList(); + private boolean cancelled; + private final LoadedFurniture furniture; + + public FurnitureBreakEvent(@NotNull Player player, + @NotNull LoadedFurniture furniture) { + super(player); + this.furniture = furniture; + } + + @NotNull + public Player player() { + return getPlayer(); + } + + @NotNull + public LoadedFurniture furniture() { + return this.furniture; + } + + @NotNull + public static HandlerList getHandlerList() { + return HANDLER_LIST; + } + + @NotNull + public HandlerList getHandlers() { + return getHandlerList(); + } + + @Override + public boolean isCancelled() { + return this.cancelled; + } + + @Override + public void setCancelled(boolean cancel) { + this.cancelled = cancel; + } +} diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/api/event/FurnitureInteractEvent.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/api/event/FurnitureInteractEvent.java new file mode 100644 index 000000000..10b553242 --- /dev/null +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/api/event/FurnitureInteractEvent.java @@ -0,0 +1,68 @@ +package net.momirealms.craftengine.bukkit.api.event; + +import net.momirealms.craftengine.bukkit.entity.furniture.LoadedFurniture; +import net.momirealms.craftengine.core.entity.player.InteractionHand; +import org.bukkit.Location; +import org.bukkit.entity.Player; +import org.bukkit.event.Cancellable; +import org.bukkit.event.HandlerList; +import org.bukkit.event.player.PlayerEvent; +import org.jetbrains.annotations.NotNull; + +public class FurnitureInteractEvent extends PlayerEvent implements Cancellable { + private static final HandlerList HANDLER_LIST = new HandlerList(); + private boolean cancelled; + private final LoadedFurniture furniture; + private final InteractionHand hand; + private final Location interactionPoint; + + public FurnitureInteractEvent(@NotNull Player player, + @NotNull LoadedFurniture furniture, + @NotNull InteractionHand hand, + @NotNull Location interactionPoint) { + super(player); + this.furniture = furniture; + this.hand = hand; + this.interactionPoint = interactionPoint; + } + + @NotNull + public Location interactionPoint() { + return interactionPoint; + } + + @NotNull + public Player player() { + return getPlayer(); + } + + @NotNull + public InteractionHand hand() { + return hand; + } + + @NotNull + public LoadedFurniture furniture() { + return this.furniture; + } + + @NotNull + public static HandlerList getHandlerList() { + return HANDLER_LIST; + } + + @NotNull + public HandlerList getHandlers() { + return getHandlerList(); + } + + @Override + public boolean isCancelled() { + return this.cancelled; + } + + @Override + public void setCancelled(boolean cancel) { + this.cancelled = cancel; + } +} diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/api/event/FurniturePlaceEvent.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/api/event/FurniturePlaceEvent.java new file mode 100644 index 000000000..be33468a6 --- /dev/null +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/api/event/FurniturePlaceEvent.java @@ -0,0 +1,68 @@ +package net.momirealms.craftengine.bukkit.api.event; + +import net.momirealms.craftengine.bukkit.entity.furniture.LoadedFurniture; +import net.momirealms.craftengine.core.entity.player.InteractionHand; +import org.bukkit.Location; +import org.bukkit.entity.Player; +import org.bukkit.event.Cancellable; +import org.bukkit.event.HandlerList; +import org.bukkit.event.player.PlayerEvent; +import org.jetbrains.annotations.NotNull; + +public class FurniturePlaceEvent extends PlayerEvent implements Cancellable { + private static final HandlerList HANDLER_LIST = new HandlerList(); + private final Location location; + private final LoadedFurniture furniture; + private final InteractionHand hand; + private boolean cancelled; + + public FurniturePlaceEvent(@NotNull Player player, + @NotNull LoadedFurniture furniture, + @NotNull Location location, + @NotNull InteractionHand hand) { + super(player); + this.location = location; + this.furniture = furniture; + this.hand = hand; + } + + @NotNull + public InteractionHand hand() { + return hand; + } + + @NotNull + public LoadedFurniture furniture() { + return furniture; + } + + @NotNull + public Location location() { + return location; + } + + @NotNull + public Player player() { + return getPlayer(); + } + + @NotNull + public static HandlerList getHandlerList() { + return HANDLER_LIST; + } + + @NotNull + public HandlerList getHandlers() { + return getHandlerList(); + } + + @Override + public boolean isCancelled() { + return this.cancelled; + } + + @Override + public void setCancelled(boolean cancel) { + this.cancelled = cancel; + } +} diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/block/BlockEventListener.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/block/BlockEventListener.java new file mode 100644 index 000000000..79e8e70de --- /dev/null +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/block/BlockEventListener.java @@ -0,0 +1,314 @@ +package net.momirealms.craftengine.bukkit.block; + +import net.momirealms.craftengine.bukkit.api.event.CustomBlockBreakEvent; +import net.momirealms.craftengine.bukkit.plugin.BukkitCraftEngine; +import net.momirealms.craftengine.bukkit.plugin.user.BukkitServerPlayer; +import net.momirealms.craftengine.bukkit.util.*; +import net.momirealms.craftengine.bukkit.world.BukkitWorld; +import net.momirealms.craftengine.core.block.ImmutableBlockState; +import net.momirealms.craftengine.core.block.PushReaction; +import net.momirealms.craftengine.core.block.properties.Property; +import net.momirealms.craftengine.core.entity.player.InteractionHand; +import net.momirealms.craftengine.core.item.Item; +import net.momirealms.craftengine.core.item.ItemKeys; +import net.momirealms.craftengine.core.loot.parameter.LootParameters; +import net.momirealms.craftengine.core.plugin.config.ConfigManager; +import net.momirealms.craftengine.core.util.Key; +import net.momirealms.craftengine.core.util.context.ContextHolder; +import net.momirealms.craftengine.core.world.BlockPos; +import net.momirealms.craftengine.core.world.Vec3d; +import org.bukkit.*; +import org.bukkit.block.Block; +import org.bukkit.block.BlockFace; +import org.bukkit.block.data.BlockData; +import org.bukkit.block.data.type.NoteBlock; +import org.bukkit.entity.Entity; +import org.bukkit.entity.Player; +import org.bukkit.event.EventHandler; +import org.bukkit.event.EventPriority; +import org.bukkit.event.Listener; +import org.bukkit.event.block.*; +import org.bukkit.event.entity.EntityExplodeEvent; +import org.bukkit.event.world.GenericGameEvent; +import org.bukkit.inventory.ItemStack; + +import java.util.List; +import java.util.Optional; + +public class BlockEventListener implements Listener { + private final BukkitCraftEngine plugin; + private final boolean enableNoteBlockCheck; + private final BukkitBlockManager manager; +// private static final Set WATER_BUCKETS = Arrays.stream(ItemKeys.WATER_BUCKETS).map(it -> Registry.MATERIAL.get(new NamespacedKey(it.namespace(), it.value()))).collect(Collectors.toSet()); + + public BlockEventListener(BukkitCraftEngine plugin, BukkitBlockManager manager, boolean enableNoteBlockCheck) { + this.plugin = plugin; + this.manager = manager; + this.enableNoteBlockCheck = enableNoteBlockCheck; + } + + @EventHandler(ignoreCancelled = true) + public void onPlaceBlock(BlockPlaceEvent event) { + Player player = event.getPlayer(); + BukkitServerPlayer serverPlayer = plugin.adapt(player); + // send swing if player is clicking a replaceable block + if (serverPlayer.shouldResendSwing()) { + player.swingHand(event.getHand()); + } + // send sound if the placed block's sounds are removed + if (ConfigManager.enableSoundSystem()) { + Block block = event.getBlock(); + Object blockState = BlockStateUtils.blockDataToBlockState(block.getBlockData()); + Object ownerBlock = BlockStateUtils.getBlockOwner(blockState); + if (this.manager.isBlockSoundRemoved(ownerBlock)) { + if (player.getInventory().getItemInMainHand().getType() != Material.DEBUG_STICK) { + try { + Object soundType = Reflections.field$BlockBehaviour$soundType.get(ownerBlock); + Object placeSound = Reflections.field$SoundType$placeSound.get(soundType); + player.playSound(block.getLocation(), Reflections.field$SoundEvent$location.get(placeSound).toString(), SoundCategory.BLOCKS, 1f, 0.8f); + } catch (ReflectiveOperationException e) { + this.plugin.logger().warn("Failed to get sound type", e); + } + } + return; + } + } + // resend sound if the clicked block is interactable on client side + if (serverPlayer.shouldResendSound()) { + try { + Block block = event.getBlock(); + Object blockState = BlockStateUtils.blockDataToBlockState(block.getBlockData()); + Object ownerBlock = BlockStateUtils.getBlockOwner(blockState); + Object soundType = Reflections.field$BlockBehaviour$soundType.get(ownerBlock); + Object placeSound = Reflections.field$SoundType$placeSound.get(soundType); + player.playSound(block.getLocation(), Reflections.field$SoundEvent$location.get(placeSound).toString(), SoundCategory.BLOCKS, 1f, 0.8f); + } catch (ReflectiveOperationException e) { + this.plugin.logger().warn("Failed to get sound type", e); + } + } + } + + @EventHandler(ignoreCancelled = true, priority = EventPriority.LOW) + public void onPlayerBreak(BlockBreakEvent event) { + org.bukkit.block.Block block = event.getBlock(); + Object blockState = BlockStateUtils.blockDataToBlockState(block.getBlockData()); + int stateId = BlockStateUtils.blockStateToId(blockState); + if (!BlockStateUtils.isVanillaBlock(stateId)) { + ImmutableBlockState state = manager.getImmutableBlockStateUnsafe(stateId); + if (!state.isEmpty()) { + Location location = block.getLocation(); + + // trigger event + CustomBlockBreakEvent customBreakEvent = new CustomBlockBreakEvent(event.getPlayer(), location, block, state); + boolean isCancelled = EventUtils.fireAndCheckCancel(customBreakEvent); + if (isCancelled) { + event.setCancelled(true); + return; + } + + net.momirealms.craftengine.core.world.World world = new BukkitWorld(location.getWorld()); + // handle waterlogged blocks + @SuppressWarnings("unchecked") + Property waterloggedProperty = (Property) state.owner().value().getProperty("waterlogged"); + if (waterloggedProperty != null) { + boolean waterlogged = state.get(waterloggedProperty); + if (waterlogged) { + location.getWorld().setBlockData(location, Material.WATER.createBlockData()); + } + } + // play sound + Vec3d vec3d = new Vec3d(location.getBlockX() + 0.5, location.getBlockY() + 0.5, location.getBlockZ() + 0.5); + world.playBlockSound(vec3d, state.sounds().breakSound(), 1f, 0.8f); + + Player player = event.getPlayer(); + if (player.getGameMode() == GameMode.CREATIVE) { + return; + } + + BukkitServerPlayer serverPlayer = plugin.adapt(player); + Item itemInHand = serverPlayer.getItemInHand(InteractionHand.MAIN_HAND); + Key itemId = Optional.ofNullable(itemInHand).map(Item::id).orElse(ItemKeys.AIR); + // do not drop if it's not the correct tool + if (!state.settings().isCorrectTool(itemId) || !customBreakEvent.dropItems()) { + return; + } + // drop items + ContextHolder.Builder builder = ContextHolder.builder(); + builder.withParameter(LootParameters.WORLD, world); + builder.withParameter(LootParameters.LOCATION, vec3d); + builder.withParameter(LootParameters.PLAYER, plugin.adapt(player)); + builder.withParameter(LootParameters.TOOL, itemInHand); + for (Item item : state.getDrops(builder, world)) { + world.dropItemNaturally(vec3d, item); + } + } + } else if (ConfigManager.enableSoundSystem()) { + Object ownerBlock = BlockStateUtils.getBlockOwner(blockState); + if (manager.isBlockSoundRemoved(ownerBlock)) { + try { + Object soundType = Reflections.field$BlockBehaviour$soundType.get(ownerBlock); + Object breakSound = Reflections.field$SoundType$breakSound.get(soundType); + block.getWorld().playSound(block.getLocation(), Reflections.field$SoundEvent$location.get(breakSound).toString(), SoundCategory.BLOCKS, 1f, 0.8f); + } catch (ReflectiveOperationException e) { + plugin.logger().warn("Failed to get sound type", e); + } + } + } + } + + @EventHandler(ignoreCancelled = true) + public void onStep(GenericGameEvent event) { + if (event.getEvent() != GameEvent.STEP) return; + Entity entity = event.getEntity(); + if (!(entity instanceof Player player)) return; + BlockPos pos = EntityUtils.getOnPos(player); + Location playerLocation = player.getLocation(); + BlockData blockData = player.getWorld().getBlockData(pos.x(), pos.y(), pos.z()); + Object blockState = BlockStateUtils.blockDataToBlockState(blockData); + int stateId = BlockStateUtils.blockStateToId(blockState); + if (!BlockStateUtils.isVanillaBlock(stateId)) { + ImmutableBlockState state = manager.getImmutableBlockStateUnsafe(stateId); + player.playSound(playerLocation, state.sounds().stepSound().toString(), SoundCategory.BLOCKS, 0.15f, 1f); + } else if (ConfigManager.enableSoundSystem()) { + Object ownerBlock = BlockStateUtils.getBlockOwner(blockState); + if (manager.isBlockSoundRemoved(ownerBlock)) { + try { + Object soundType = Reflections.field$BlockBehaviour$soundType.get(ownerBlock); + Object stepSound = Reflections.field$SoundType$stepSound.get(soundType); + player.playSound(playerLocation, Reflections.field$SoundEvent$location.get(stepSound).toString(), SoundCategory.BLOCKS, 0.15f, 1f); + } catch (ReflectiveOperationException e) { + plugin.logger().warn("Failed to get sound type", e); + } + } + } + } + + @EventHandler(ignoreCancelled = true, priority = EventPriority.MONITOR) + public void onPistonRetract(BlockPistonRetractEvent event) { + handlePistonEvent(event.getDirection(), event.getBlocks(), event.getBlock()); + } + + @EventHandler(ignoreCancelled = true, priority = EventPriority.MONITOR) + public void onPistonExtend(BlockPistonExtendEvent event) { + handlePistonEvent(event.getDirection(), event.getBlocks(), event.getBlock()); + } + + private void handlePistonEvent(BlockFace face, List blocksList, Block piston) { + int blocks = blocksList.size(); + net.momirealms.craftengine.core.world.World world = new BukkitWorld(piston.getWorld()); + for (int i = blocks - 1; i >= 0; --i) { + Location oldLocation = blocksList.get(i).getLocation(); + BlockPos oldPos = new BlockPos(oldLocation.getBlockX(), oldLocation.getBlockY(), oldLocation.getBlockZ()); + Block block = blocksList.get(i); + ImmutableBlockState blockState = manager.getImmutableBlockState(BlockStateUtils.blockDataToId(block.getBlockData())); + if (blockState != null && blockState.pushReaction() == PushReaction.DESTROY) { + // break actions + ContextHolder.Builder builder = ContextHolder.builder(); + Vec3d vec3d = Vec3d.atCenterOf(oldPos); + builder.withParameter(LootParameters.LOCATION, vec3d); + builder.withParameter(LootParameters.WORLD, world); + for (Item item : blockState.getDrops(builder, world)) { + world.dropItemNaturally(vec3d, item); + } + world.playBlockSound(vec3d, blockState.sounds().breakSound(),1f, 0.8f); + } + } + } + + @EventHandler(ignoreCancelled = true, priority = EventPriority.MONITOR) + public void onEntityExplode(EntityExplodeEvent event) { + handleExplodeEvent(event.blockList(), new BukkitWorld(event.getEntity().getWorld()), event.getYield()); + } + + @EventHandler(ignoreCancelled = true, priority = EventPriority.MONITOR) + public void onBlockExplode(BlockExplodeEvent event) { + handleExplodeEvent(event.blockList(), new BukkitWorld(event.getBlock().getWorld()), event.getYield()); + } + + private void handleExplodeEvent(List blocks, net.momirealms.craftengine.core.world.World world, float yield) { + for (int i = blocks.size() - 1; i >= 0; i--) { + Block block = blocks.get(i); + Location location = block.getLocation(); + BlockPos blockPos = new BlockPos(location.getBlockX(), location.getBlockY(), location.getBlockZ()); + ImmutableBlockState state = manager.getImmutableBlockState(BlockStateUtils.blockDataToId(block.getBlockData())); + if (state != null && !state.isEmpty()) { + ContextHolder.Builder builder = ContextHolder.builder(); + Vec3d vec3d = Vec3d.atCenterOf(blockPos); + builder.withParameter(LootParameters.LOCATION, vec3d); + builder.withParameter(LootParameters.WORLD, world); + if (yield < 1f) { + builder.withParameter(LootParameters.EXPLOSION_RADIUS, 1.0f / yield); + } + for (Item item : state.getDrops(builder, world)) { + world.dropItemNaturally(vec3d, item); + } + world.playBlockSound(vec3d, state.sounds().breakSound(), 1f, 0.8f); + } + } + } + + @EventHandler(ignoreCancelled = true, priority = EventPriority.MONITOR) + public void onBlockPhysics(BlockPhysicsEvent event) { + if (!this.enableNoteBlockCheck) return; + Block block = event.getBlock(); + // for vanilla blocks + if (block.getBlockData() instanceof NoteBlock) { + try { + World world = block.getWorld(); + Location location = block.getLocation(); + Block sourceBlock = event.getSourceBlock(); + BlockFace direction = sourceBlock.getFace(block); + if (direction == BlockFace.UP || direction == BlockFace.DOWN) { + Object serverLevel = Reflections.field$CraftWorld$ServerLevel.get(world); + Object chunkSource = Reflections.field$ServerLevel$chunkSource.get(serverLevel); + Object blockPos = Reflections.constructor$BlockPos.newInstance(location.getBlockX(), location.getBlockY(), location.getBlockZ()); + Reflections.method$ServerChunkCache$blockChanged.invoke(chunkSource, blockPos); + if (direction == BlockFace.UP) { + NoteBlockChainUpdateUtils.noteBlockChainUpdate(serverLevel, chunkSource, Reflections.instance$Direction$UP, blockPos, 0); + } else { + NoteBlockChainUpdateUtils.noteBlockChainUpdate(serverLevel, chunkSource, Reflections.instance$Direction$DOWN, blockPos, 0); + } + } + } catch (ReflectiveOperationException e) { + plugin.logger().warn("Failed to sync note block states", e); + } + } + } + + // TODO Is there a way to deceive the server? +// @SuppressWarnings("unchecked") +// @EventHandler(ignoreCancelled = true) +// public void onDispenserWork(BlockDispenseEvent event) { +// ItemStack itemStack = event.getItem(); +// Material type = itemStack.getType(); +// Block block = event.getBlock(); +// if (type == Material.BUCKET) { +// if (block.getBlockData() instanceof Dispenser dispenser) { +// Block against = block.getRelative(dispenser.getFacing()); +// ImmutableBlockState state = this.manager.getImmutableBlockState(BlockStateUtils.blockDataToId(against.getBlockData())); +// if (state != null && !state.isEmpty()) { +// Location location = against.getLocation(); +// CustomBlock customBlock = state.owner().value(); +// Property waterlogged = (Property) customBlock.getProperty("waterlogged"); +// if (waterlogged == null) return; +// if (!state.get(waterlogged)) return; +// ImmutableBlockState nextState = state.with(waterlogged, false); +// CraftEngineBlocks.place(location, nextState, UpdateOption.UPDATE_ALL); +// } +// } +// } else if (WATER_BUCKETS.contains(type)) { +// if (block.getBlockData() instanceof Dispenser dispenser) { +// Block against = block.getRelative(dispenser.getFacing()); +// ImmutableBlockState state = this.manager.getImmutableBlockState(BlockStateUtils.blockDataToId(against.getBlockData())); +// if (state != null && !state.isEmpty()) { +// Location location = against.getLocation(); +// CustomBlock customBlock = state.owner().value(); +// Property waterlogged = (Property) customBlock.getProperty("waterlogged"); +// if (waterlogged == null) return; +// ImmutableBlockState nextState = state.with(waterlogged, true); +// CraftEngineBlocks.place(location, nextState, UpdateOption.UPDATE_ALL); +// } +// } +// } +// } +} diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/block/BukkitBlockManager.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/block/BukkitBlockManager.java new file mode 100644 index 000000000..e89bd077f --- /dev/null +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/block/BukkitBlockManager.java @@ -0,0 +1,775 @@ +package net.momirealms.craftengine.bukkit.block; + +import com.google.common.collect.ImmutableList; +import com.google.common.collect.ImmutableMap; +import com.google.common.collect.ImmutableSet; +import com.google.gson.JsonArray; +import com.google.gson.JsonElement; +import com.google.gson.JsonObject; +import dev.dejvokep.boostedyaml.YamlDocument; +import net.momirealms.craftengine.bukkit.plugin.BukkitCraftEngine; +import net.momirealms.craftengine.bukkit.plugin.injector.BukkitInjector; +import net.momirealms.craftengine.bukkit.plugin.network.PacketConsumers; +import net.momirealms.craftengine.bukkit.util.BlockStateUtils; +import net.momirealms.craftengine.bukkit.util.KeyUtils; +import net.momirealms.craftengine.bukkit.util.Reflections; +import net.momirealms.craftengine.bukkit.util.RegistryUtils; +import net.momirealms.craftengine.core.block.*; +import net.momirealms.craftengine.core.block.properties.Properties; +import net.momirealms.craftengine.core.block.properties.Property; +import net.momirealms.craftengine.core.loot.LootTable; +import net.momirealms.craftengine.core.pack.Pack; +import net.momirealms.craftengine.core.pack.model.generator.ModelGeneration; +import net.momirealms.craftengine.core.plugin.CraftEngine; +import net.momirealms.craftengine.core.plugin.config.ConfigManager; +import net.momirealms.craftengine.core.registry.BuiltInRegistries; +import net.momirealms.craftengine.core.registry.Holder; +import net.momirealms.craftengine.core.registry.WritableRegistry; +import net.momirealms.craftengine.core.util.*; +import org.bukkit.Bukkit; +import org.bukkit.Material; +import org.bukkit.NamespacedKey; +import org.bukkit.block.data.BlockData; +import org.bukkit.event.HandlerList; +import org.bukkit.inventory.ItemStack; +import org.incendo.cloud.suggestion.Suggestion; +import org.jetbrains.annotations.NotNull; + +import javax.annotation.Nullable; +import java.io.File; +import java.lang.reflect.Field; +import java.nio.file.Path; +import java.util.*; + +public class BukkitBlockManager extends AbstractBlockManager { + private static BukkitBlockManager instance; + private final BukkitCraftEngine plugin; + + // Used to store override information of json files + private final Map> blockStateOverrides = new HashMap<>(); + + // A temporary map used to detect whether the same block state corresponds to multiple models. + private final Map tempRegistryIdConflictMap = new HashMap<>(); + // A temporary map that converts the custom block registered on the server to the vanilla block ID. + private final Map tempBlockAppearanceConvertor = new HashMap<>(); + + // The total amount of blocks registered + private int customBlockCount; + + // CraftEngine objects + private final Map id2CraftEngineBlocks = new HashMap<>(); + private final ImmutableBlockState[] stateId2ImmutableBlockStates; + + // Minecraft objects + // Cached new blocks $ holders + private ImmutableMap internalId2StateId; + private ImmutableMap stateId2BlockHolder; + // This map is used to change the block states that are not necessarily needed into a certain block state + private ImmutableMap blockAppearanceMapper; + // Used to automatically arrange block states for strings such as minecraft:note_block:0 + private ImmutableMap> blockAppearanceArranger; + private ImmutableMap> realBlockArranger; + // Record the amount of real blocks by block type + private LinkedHashMap registeredRealBlockSlots; + // A set of blocks that sounds have been removed + private ImmutableSet affectedSoundBlocks; + private ImmutableMap soundMapper; + // A list to record the order of registration + private List blockRegisterOrder = new ArrayList<>(); + + // a reverted mapper + private final Map> appearanceToRealState = new HashMap<>(); + // Cached command suggestions + private final List cachedSuggestions = new ArrayList<>(); + // Event listeners + private final BlockEventListener blockEventListener; + private final FallingBlockRemoveListener fallingBlockRemoveListener; + + public BukkitBlockManager(BukkitCraftEngine plugin) { + super(plugin); + this.plugin = plugin; + this.initVanillaRegistry(); + this.loadMappingsAndAdditionalBlocks(); + if (plugin.hasMod() && plugin.requiresRestart()) { + blockEventListener = null; + fallingBlockRemoveListener = null; + stateId2ImmutableBlockStates = null; + return; + } + this.registerBlocks(); + this.registerEmptyBlock(); + this.initMirrorRegistry(); + boolean enableNoteBlocks = this.blockAppearanceArranger.containsKey(BlockKeys.NOTE_BLOCK); + this.blockEventListener = new BlockEventListener(plugin, this, enableNoteBlocks); + if (enableNoteBlocks) { + this.recordVanillaNoteBlocks(); + } + if (VersionHelper.isVersionNewerThan1_20_3()) { + this.fallingBlockRemoveListener = new FallingBlockRemoveListener(); + } else this.fallingBlockRemoveListener = null; + this.stateId2ImmutableBlockStates = new ImmutableBlockState[customBlockCount]; + Arrays.fill(this.stateId2ImmutableBlockStates, EmptyBlock.INSTANCE.getDefaultState()); + instance = this; + } + + public static BukkitBlockManager instance() { + return instance; + } + + @Override + public void delayedInit() { + Bukkit.getPluginManager().registerEvents(this.blockEventListener, plugin.bootstrap()); + if (this.fallingBlockRemoveListener != null) { + Bukkit.getPluginManager().registerEvents(this.fallingBlockRemoveListener, plugin.bootstrap()); + } + } + + @Override + public void unload() { + super.clearModelsToGenerate(); + this.clearCache(); + this.appearanceToRealState.clear(); + this.id2CraftEngineBlocks.clear(); + this.cachedSuggestions.clear(); + this.blockStateOverrides.clear(); + if (EmptyBlock.INSTANCE != null) + Arrays.fill(this.stateId2ImmutableBlockStates, EmptyBlock.INSTANCE.getDefaultState()); + } + + @Override + public void disable() { + this.unload(); + HandlerList.unregisterAll(this.blockEventListener); + if (this.fallingBlockRemoveListener != null) HandlerList.unregisterAll(this.fallingBlockRemoveListener); + } + + @Override + public Map soundMapper() { + return this.soundMapper; + } + + @Override + public void delayedLoad() { + initSuggestions(); + resetPacketConsumers(); + clearCache(); + } + + private void clearCache() { + this.tempRegistryIdConflictMap.clear(); + this.tempBlockAppearanceConvertor.clear(); + } + + public void initFastAsyncWorldEditHook() { + // do nothing + } + + public void initWorldEditHook() { + for (Key newBlockId : this.blockRegisterOrder) { + WorldEditHook.register(newBlockId); + } + } + + @Nullable + public Object getMinecraftBlockHolder(int stateId) { + return stateId2BlockHolder.get(stateId); + } + + @NotNull + public ImmutableBlockState getImmutableBlockStateUnsafe(int stateId) { + return stateId2ImmutableBlockStates[stateId - BlockStateUtils.vanillaStateSize()]; + } + + @Nullable + public ImmutableBlockState getImmutableBlockState(int stateId) { + if (!BlockStateUtils.isVanillaBlock(stateId)) { + return stateId2ImmutableBlockStates[stateId - BlockStateUtils.vanillaStateSize()]; + } + return null; + } + + @Override + public Map> blockOverrides() { + return blockStateOverrides; + } + + @Override + public Map blocks() { + return this.id2CraftEngineBlocks; + } + + @Override + public Optional getBlock(Key key) { + return Optional.ofNullable(this.id2CraftEngineBlocks.get(key)); + } + + @Override + public Collection cachedSuggestions() { + return this.cachedSuggestions; + } + + @Override + public void initSuggestions() { + this.cachedSuggestions.clear(); + Set states = new HashSet<>(); + for (CustomBlock block : this.id2CraftEngineBlocks.values()) { + states.add(block.id().toString()); + for (ImmutableBlockState state : block.variantProvider().states()) { + states.add(state.toString()); + } + } + for (String state : states) { + this.cachedSuggestions.add(Suggestion.suggestion(state)); + } + } + + public ImmutableMap> blockAppearanceArranger() { + return blockAppearanceArranger; + } + + public ImmutableMap> realBlockArranger() { + return realBlockArranger; + } + + @Nullable + public List appearanceToRealStates(int appearanceStateId) { + return this.appearanceToRealState.get(appearanceStateId); + } + + private void initMirrorRegistry() { + int size = RegistryUtils.currentBlockRegistrySize(); + PackedBlockState[] states = new PackedBlockState[size]; + for (int i = 0; i < size; i++) { + states[i] = new PackedBlockState(BlockStateUtils.idToBlockState(i), i); + } + BlockRegistryMirror.init(states); + } + + private void registerEmptyBlock() { + Holder.Reference holder = ((WritableRegistry) BuiltInRegistries.BLOCK).registerForHolder(new ResourceKey<>(BuiltInRegistries.BLOCK.key().location(), Key.withDefaultNamespace("empty"))); + EmptyBlock emptyBlock = new EmptyBlock(Key.withDefaultNamespace("empty"), holder); + holder.bindValue(emptyBlock); + } + + private void resetPacketConsumers() { + Map finalMapping = new HashMap<>(this.blockAppearanceMapper); + int stoneId = BlockStateUtils.blockStateToId(Reflections.instance$Blocks$STONE$defaultState); + for (int custom : this.internalId2StateId.values()) { + finalMapping.put(custom, stoneId); + } + finalMapping.putAll(this.tempBlockAppearanceConvertor); + PacketConsumers.init(finalMapping, RegistryUtils.currentBlockRegistrySize()); + } + + private void initVanillaRegistry() { + int vanillaStateCount; + if (plugin.hasMod()) { + try { + Class modClass = ReflectionUtils.getClazz(CraftEngine.MOD_CLASS); + Field amountField = ReflectionUtils.getDeclaredField(modClass, "vanillaRegistrySize"); + vanillaStateCount = (int) amountField.get(null); + } catch (Exception e) { + vanillaStateCount = RegistryUtils.currentBlockRegistrySize(); + plugin.logger().severe("Fatal error", e); + } + } else { + vanillaStateCount = RegistryUtils.currentBlockRegistrySize(); + } + plugin.logger().info("Vanilla block count: " + vanillaStateCount); + BlockStateUtils.init(vanillaStateCount); + } + + @SuppressWarnings("unchecked") + private void registerBlocks() { + plugin.logger().info("Registering blocks. Please wait..."); + try { + ImmutableMap.Builder builder1 = ImmutableMap.builder(); + ImmutableMap.Builder builder2 = ImmutableMap.builder(); + ImmutableMap.Builder> builder3 = ImmutableMap.builder(); + Set affectedSounds = new HashSet<>(); + Set affectedBlocks = new HashSet<>(); + List order = new ArrayList<>(); + + unfreezeRegistry(); + + int counter = 0; + for (Map.Entry baseBlockAndItsCount : this.registeredRealBlockSlots.entrySet()) { + counter = registerBlockVariants(baseBlockAndItsCount, counter, builder1, builder2, builder3, affectedSounds, order); + } + + freezeRegistry(); + this.plugin.logger().info("Registered block count: " + counter); + this.customBlockCount = counter; + this.internalId2StateId = builder1.build(); + this.stateId2BlockHolder = builder2.build(); + this.realBlockArranger = builder3.build(); + this.blockRegisterOrder = ImmutableList.copyOf(order); + + for (Object block : (Iterable) Reflections.instance$BuiltInRegistries$BLOCK) { + Object soundType = Reflections.field$BlockBehaviour$soundType.get(block); + if (affectedSounds.contains(soundType)) { + affectedBlocks.add(block); + } + } + + this.affectedSoundBlocks = ImmutableSet.copyOf(affectedBlocks); + + ImmutableMap.Builder soundMapperBuilder = ImmutableMap.builder(); + for (Object soundType : affectedSounds) { + for (Field field : List.of(Reflections.field$SoundType$placeSound, Reflections.field$SoundType$fallSound, Reflections.field$SoundType$hitSound, Reflections.field$SoundType$stepSound, Reflections.field$SoundType$breakSound)) { + Object soundEvent = field.get(soundType); + Key previousId = Key.of(Reflections.field$SoundEvent$location.get(soundEvent).toString()); + soundMapperBuilder.put(previousId, Key.of(previousId.namespace(), "replaced." + previousId.value())); + } + } + + this.soundMapper = soundMapperBuilder.build(); + } catch (Throwable e) { + plugin.logger().warn("Failed to inject blocks.", e); + } + } + + @Override + public void parseSection(Pack pack, Path path, Key id, Map section) { + // read block settings + BlockSettings settings = BlockSettings.fromMap(MiscUtils.castToMap(section.getOrDefault("settings", Map.of()), false)); + // read loot table + LootTable lootTable = LootTable.fromMap(MiscUtils.castToMap(section.getOrDefault("loot", Map.of()), false)); + // read states + Map> properties; + Map appearances; + Map variants; + Map stateSection = MiscUtils.castToMap(section.get("state"), true); + if (stateSection != null) { + properties = Map.of(); + int internalId = MiscUtils.getAsInt(stateSection.getOrDefault("id", -1)); + if (PreConditions.runIfTrue(internalId < 0, () -> plugin.logger().warn(path, "No state id configured for block " + id))) return; + Pair pair = parseAppearanceSection(path, stateSection, id); + if (pair == null) return; + appearances = Map.of("default", pair.right()); + Key internalBlockId = Key.of(CraftEngine.NAMESPACE, pair.left().value() + "_" + internalId); + int internalBlockRegistryId = MiscUtils.getAsInt(this.internalId2StateId.getOrDefault(internalBlockId, -1)); + if (internalBlockRegistryId == -1) { + plugin.logger().warn(path, "Failed to register " + id + " because id " + internalId + " is not a value between 0~" + (MiscUtils.getAsInt(this.registeredRealBlockSlots.get(pair.left()))-1) + + ". Consider editing additional-real-blocks.yml if the number of real block IDs is insufficient while there are still available appearances"); + return; + } + variants = Map.of("", new VariantState("default", settings, internalBlockRegistryId)); + } else { + Map statesSection = MiscUtils.castToMap(section.get("states"), true); + if (statesSection == null) { + plugin.logger().warn(path, "No states configured for block " + id); + return; + } + Map propertySection = MiscUtils.castToMap(statesSection.get("properties"), true); + if (PreConditions.isNull(propertySection, () -> plugin.logger().warn(path, "No properties configured for block " + id))) return; + properties = parseProperties(path, propertySection); + Map appearancesSection = MiscUtils.castToMap(statesSection.get("appearances"), true); + if (PreConditions.isNull(appearancesSection, () -> plugin.logger().warn(path, "No appearances configured for block " + id))) return; + appearances = new HashMap<>(); + Map tempTypeMap = new HashMap<>(); + for (Map.Entry appearanceEntry : appearancesSection.entrySet()) { + if (appearanceEntry.getValue() instanceof Map appearanceSection) { + Pair pair = parseAppearanceSection(path, MiscUtils.castToMap(appearanceSection, false), id); + if (pair == null) return; + appearances.put(appearanceEntry.getKey(), pair.right()); + tempTypeMap.put(appearanceEntry.getKey(), pair.left()); + } + } + Map variantsSection = MiscUtils.castToMap(statesSection.get("variants"), true); + if (PreConditions.isNull(variantsSection, () -> plugin.logger().warn(path, "No variants configured for block " + id))) return; + variants = new HashMap<>(); + for (Map.Entry variantEntry : variantsSection.entrySet()) { + if (variantEntry.getValue() instanceof Map variantSection0) { + Map variantSection = MiscUtils.castToMap(variantSection0, false); + String variantName = variantEntry.getKey(); + String appearance = (String) variantSection.get("appearance"); + if (appearance == null) { + plugin.logger().warn(path, "No appearance configured for variant " + variantName); + return; + } + if (!appearances.containsKey(appearance)) { + plugin.logger().warn(path, appearance + " is not a valid appearance for block " + id); + return; + } + int internalId = MiscUtils.getAsInt(variantSection.getOrDefault("id", -1)); + Key baseBlock = tempTypeMap.get(appearance); + Key internalBlockId = Key.of(CraftEngine.NAMESPACE, baseBlock.value() + "_" + internalId); + int internalBlockRegistryId = MiscUtils.getAsInt(this.internalId2StateId.getOrDefault(internalBlockId, -1)); + if (internalBlockRegistryId == -1) { + plugin.logger().warn(path, "Failed to register " + id + " because id " + internalId + " is not a value between 0~" + (MiscUtils.getAsInt(this.registeredRealBlockSlots.getOrDefault(baseBlock, 1))-1) + + ". Consider editing additional-real-blocks.yml if the number of real block IDs is insufficient while there are still available appearances"); + return; + } + Map anotherSetting = MiscUtils.castToMap(variantSection.get("settings"), true); + variants.put(variantName, new VariantState(appearance, anotherSetting == null ? settings : BlockSettings.ofFullCopy(settings, anotherSetting), internalBlockRegistryId)); + } + } + } + // create or get block holder + Holder.Reference holder = BuiltInRegistries.BLOCK.get(id).orElseGet(() -> + ((WritableRegistry) BuiltInRegistries.BLOCK).registerForHolder(new ResourceKey<>(BuiltInRegistries.BLOCK.key().location(), id))); + // create block + Map behaviorSection = MiscUtils.castToMap(section.getOrDefault("behavior", Map.of()), false); + + CustomBlock block = new BukkitCustomBlock(id, holder, properties, appearances, variants, settings, behaviorSection, lootTable); + + // bind appearance + bindAppearance(block); + this.id2CraftEngineBlocks.put(id, block); + } + + private void bindAppearance(CustomBlock block) { + for (ImmutableBlockState state : block.variantProvider().states()) { + ImmutableBlockState previous = this.stateId2ImmutableBlockStates[state.customBlockState().registryId() - BlockStateUtils.vanillaStateSize()]; + if (previous != null && !previous.isEmpty()) { + this.plugin.logger().severe("[Fatal] Failed to bind real block state for " + state + ": the state is already occupied by " + previous); + continue; + } + this.stateId2ImmutableBlockStates[state.customBlockState().registryId() - BlockStateUtils.vanillaStateSize()] = state; + this.tempBlockAppearanceConvertor.put(state.customBlockState().registryId(), state.vanillaBlockState().registryId()); + this.appearanceToRealState.computeIfAbsent(state.vanillaBlockState().registryId(), k -> new ArrayList<>()).add(state.customBlockState().registryId()); + } + } + + private Map> parseProperties(Path path, Map propertiesSection) { + Map> properties = new HashMap<>(); + for (Map.Entry entry : propertiesSection.entrySet()) { + if (entry.getValue() instanceof Map params) { + Property property = Properties.fromMap(entry.getKey(), MiscUtils.castToMap(params, false)); + properties.put(entry.getKey(), property); + } else { + this.plugin.logger().warn(path, "Invalid property format: " + entry.getKey()); + } + } + return properties; + } + + @Nullable + private Pair parseAppearanceSection(Path path, Map section, Key id) { + String vanillaStateString = (String) section.get("state"); + if (PreConditions.isNull(vanillaStateString, + () -> this.plugin.logger().warn(path, "No block state found for: " + id))) return null; + int vanillaStateRegistryId; + try { + vanillaStateRegistryId = parseVanillaStateRegistryId(vanillaStateString); + } catch (BlockStateArrangeException e) { + this.plugin.logger().warn(path, "Failed to load " + id + " - " + e.getMessage(), e); + return null; + } + Key ifAny = this.tempRegistryIdConflictMap.get(vanillaStateRegistryId); + if (ifAny != null && !ifAny.equals(id)) { + this.plugin.logger().warn(path, "Can't use " + BlockStateUtils.idToBlockState(vanillaStateRegistryId) + " as the base block for " + id + " because the state has already been used by " + ifAny); + return null; + } + Object models = section.getOrDefault("models", section.get("model")); + List variants = new ArrayList<>(); + if (models instanceof Map singleModelSection) { + loadVariantModel(variants, MiscUtils.castToMap(singleModelSection, false)); + } else if (models instanceof List modelList) { + for (Object model : modelList) { + if (model instanceof Map singleModelMap) { + loadVariantModel(variants, MiscUtils.castToMap(singleModelMap, false)); + } + } + } else { + this.plugin.logger().warn(path, "No model set for " + id); + return null; + } + if (variants.isEmpty()) return null; + this.tempRegistryIdConflictMap.put(vanillaStateRegistryId, id); + String blockState = BlockStateUtils.idToBlockState(vanillaStateRegistryId).toString(); + Key block = Key.of(blockState.substring(blockState.indexOf('{') + 1, blockState.lastIndexOf('}'))); + String propertyData = blockState.substring(blockState.indexOf('[') + 1, blockState.lastIndexOf(']')); + Map paths = this.blockStateOverrides.computeIfAbsent(block, k -> new HashMap<>()); + if (variants.size() == 1) { + paths.put(propertyData, variants.get(0)); + } else { + JsonArray array = new JsonArray(); + for (JsonObject object : variants) { + array.add(object); + } + paths.put(propertyData, array); + } + return Pair.of(block, vanillaStateRegistryId); + } + + private void loadVariantModel(List variants, Map singleModelMap) { + JsonObject json = new JsonObject(); + String modelPath = (String) singleModelMap.get("path"); + json.addProperty("model", modelPath); + if (singleModelMap.containsKey("x")) json.addProperty("x", MiscUtils.getAsInt(singleModelMap.get("x"))); + if (singleModelMap.containsKey("y")) json.addProperty("y", MiscUtils.getAsInt(singleModelMap.get("y"))); + if (singleModelMap.containsKey("uvlock")) json.addProperty("uvlock", (boolean) singleModelMap.get("uvlock")); + if (singleModelMap.containsKey("weight")) json.addProperty("weight", MiscUtils.getAsInt(singleModelMap.get("weight"))); + Map generationMap = MiscUtils.castToMap(singleModelMap.get("generation"), true); + if (generationMap != null) { + prepareModelGeneration(new ModelGeneration(Key.of(modelPath), generationMap)); + } + variants.add(json); + } + + private int parseVanillaStateRegistryId(String blockState) throws BlockStateArrangeException { + String[] split = blockState.split(":", 3); + PreConditions.runIfTrue(split.length >= 4, () -> { + throw new BlockStateArrangeException("Invalid vanilla block state: " + blockState); + }); + int registryId; + // minecraft:xxx:0 + // xxx:0 + String stateOrId = split[split.length - 1]; + boolean isId = !stateOrId.contains("[") && !stateOrId.contains("]"); + if (isId) { + if (split.length == 1) { + throw new BlockStateArrangeException("Invalid vanilla block state: " + blockState); + } + Key block = split.length == 2 ? Key.of(split[0]) : Key.of(split[0], split[1]); + try { + int id = split.length == 2 ? Integer.parseInt(split[1]) : Integer.parseInt(split[2]); + PreConditions.runIfTrue(id < 0, () -> { + throw new BlockStateArrangeException("Invalid block state: " + blockState); + }); + List arranger = this.blockAppearanceArranger.get(block); + if (arranger == null) { + throw new BlockStateArrangeException("No freed block state is available for block " + block); + } + if (id >= arranger.size()) { + throw new BlockStateArrangeException(blockState + " is not a valid block state because " + id + " is outside of the range (0~" + (arranger.size() - 1) + ")"); + } + registryId = arranger.get(id); + } catch (NumberFormatException e) { + throw new BlockStateArrangeException("Invalid block state: " + blockState); + } + } else { + try { + BlockData blockData = Bukkit.createBlockData(blockState); + registryId = BlockStateUtils.blockDataToId(blockData); + } catch (IllegalArgumentException e) { + throw new BlockStateArrangeException("Invalid block state: " + blockState); + } + } + return registryId; + } + + private void loadMappingsAndAdditionalBlocks() { + this.plugin.logger().info("Loading mappings.yml."); + File mappingFile = new File(plugin.dataFolderFile(), "mappings.yml"); + YamlDocument mappings = ConfigManager.instance().loadOrCreateYamlData("mappings.yml"); + Map blockStateMappings = loadBlockStateMappings(mappings); + this.validateBlockStateMappings(mappingFile, blockStateMappings); + Map stateMap = new HashMap<>(); + Map blockTypeCounter = new LinkedHashMap<>(); + Map appearanceMapper = new HashMap<>(); + Map> appearanceArranger = new HashMap<>(); + for (Map.Entry entry : blockStateMappings.entrySet()) { + this.processBlockStateMapping(mappingFile, entry, stateMap, blockTypeCounter, appearanceMapper, appearanceArranger); + } + this.blockAppearanceMapper = ImmutableMap.copyOf(appearanceMapper); + this.blockAppearanceArranger = ImmutableMap.copyOf(appearanceArranger); + this.plugin.logger().info("Freed " + this.blockAppearanceMapper.size() + " block state appearances."); + YamlDocument additionalYaml = ConfigManager.instance().loadOrCreateYamlData("additional-real-blocks.yml"); + this.registeredRealBlockSlots = this.buildRegisteredRealBlockSlots(blockTypeCounter, additionalYaml); + } + + private void recordVanillaNoteBlocks() { + try { + Object resourceLocation = Reflections.method$ResourceLocation$fromNamespaceAndPath.invoke(null, BlockKeys.NOTE_BLOCK.namespace(), BlockKeys.NOTE_BLOCK.value()); + Object block = Reflections.method$Registry$get.invoke(Reflections.instance$BuiltInRegistries$BLOCK, resourceLocation); + Object stateDefinition = Reflections.field$Block$StateDefinition.get(block); + @SuppressWarnings("unchecked") + ImmutableList states = (ImmutableList) Reflections.field$StateDefinition$states.get(stateDefinition); + for (Object state : states) { + BlockStateUtils.CLIENT_SIDE_NOTE_BLOCKS.put(state, new Object()); + } + } catch (ReflectiveOperationException e) { + plugin.logger().warn("Failed to init vanilla note block", e); + } + } + + @Nullable + public Key replaceSoundIfExist(Key id) { + return this.soundMapper.get(id); + } + + public boolean isBlockSoundRemoved(Object block) { + return this.affectedSoundBlocks.contains(block); + } + + private Map loadBlockStateMappings(YamlDocument mappings) { + Map blockStateMappings = new LinkedHashMap<>(); + for (Map.Entry entry : mappings.getStringRouteMappedValues(false).entrySet()) { + if (entry.getValue() instanceof String afterValue) { + blockStateMappings.put(entry.getKey(), afterValue); + } + } + return blockStateMappings; + } + + private void validateBlockStateMappings(File mappingFile, Map blockStateMappings) { + Map temp = new HashMap<>(blockStateMappings); + for (Map.Entry entry : temp.entrySet()) { + String state = entry.getValue(); + if (blockStateMappings.containsKey(state)) { + String after = blockStateMappings.remove(state); + plugin.logger().warn(mappingFile, "'" + state + ": " + after + "' is invalid because '" + state + "' has already been used as a base block."); + } + } + } + + private void processBlockStateMapping(File mappingFile, + Map.Entry entry, + Map stateMap, + Map counter, + Map mapper, + Map> arranger) { + BlockData before = createBlockData(mappingFile, entry.getKey()); + BlockData after = createBlockData(mappingFile, entry.getValue()); + if (before == null || after == null) return; + + int beforeId = BlockStateUtils.blockDataToId(before); + int afterId = BlockStateUtils.blockDataToId(after); + + Integer previous = mapper.put(beforeId, afterId); + if (previous == null) { + Key key = KeyUtils.namespacedKey2Key(before.getMaterial().getKey()); + counter.compute(key, (k, count) -> count == null ? 1 : count + 1); + stateMap.put(beforeId, entry.getKey()); + stateMap.put(afterId, entry.getValue()); + arranger.computeIfAbsent(key, (k) -> new ArrayList<>()).add(beforeId); + } else { + String previousState = stateMap.get(previous); + plugin.logger().warn(mappingFile, "Duplicate entry: '" + previousState + "' equals '" + entry.getKey() + "'"); + } + } + + private BlockData createBlockData(File mappingFile, String blockState) { + try { + return Bukkit.createBlockData(blockState); + } catch (IllegalArgumentException e) { + plugin.logger().warn(mappingFile, "'" + blockState + "' is not a valid block state."); + return null; + } + } + + private LinkedHashMap buildRegisteredRealBlockSlots(Map counter, YamlDocument additionalYaml) { + LinkedHashMap map = new LinkedHashMap<>(); + for (Map.Entry entry : counter.entrySet()) { + String id = entry.getKey().toString(); + int additionalStates = additionalYaml.getInt(id, 0); + int internalIds = entry.getValue() + additionalStates; + plugin.logger().info("Loaded " + id + " with " + entry.getValue() + " appearances and " + internalIds + " real block states"); + map.put(entry.getKey(), internalIds); + } + return map; + } + + private void unfreezeRegistry() throws IllegalAccessException { + Reflections.field$MappedRegistry$frozen.set(Reflections.instance$BuiltInRegistries$BLOCK, false); + Reflections.field$MappedRegistry$unregisteredIntrusiveHolders.set(Reflections.instance$BuiltInRegistries$BLOCK, new IdentityHashMap<>()); + } + + private void freezeRegistry() throws IllegalAccessException { + Reflections.field$MappedRegistry$frozen.set(Reflections.instance$BuiltInRegistries$BLOCK, true); + } + + private int registerBlockVariants(Map.Entry blockWithCount, + int counter, + ImmutableMap.Builder builder1, + ImmutableMap.Builder builder2, + ImmutableMap.Builder> builder3, + Set affectSoundTypes, + List order) throws Exception { + Key clientSideBlockType = blockWithCount.getKey(); + boolean isNoteBlock = clientSideBlockType.equals(BlockKeys.NOTE_BLOCK); + Object clientSideBlock = getBlockFromRegistry(createResourceLocation(clientSideBlockType)); + int amount = blockWithCount.getValue(); + + List stateIds = new ArrayList<>(); + + for (int i = 0; i < amount; i++) { + Key realBlockKey = createRealBlockKey(clientSideBlockType, i); + Object blockProperties = createBlockProperties(realBlockKey); + + Object newRealBlock; + Object newBlockState; + Object blockHolder; + Object resourceLocation = createResourceLocation(realBlockKey); + + if (plugin.hasMod()) { + newRealBlock = Reflections.method$Registry$get.invoke(Reflections.instance$BuiltInRegistries$BLOCK, resourceLocation); + newBlockState = getOnlyBlockState(newRealBlock); + @SuppressWarnings("unchecked") + Optional optionalHolder = (Optional) Reflections.method$Registry$getHolder0.invoke(Reflections.instance$BuiltInRegistries$BLOCK, resourceLocation); + blockHolder = optionalHolder.get(); + } else { + try { + newRealBlock = BukkitInjector.generateBlock(clientSideBlockType, clientSideBlock, blockProperties); + } catch (Throwable throwable) { + plugin.logger().warn("Failed to generate dynamic block class", throwable); + continue; + } + + blockHolder = Reflections.method$Registry$registerForHolder.invoke(null, Reflections.instance$BuiltInRegistries$BLOCK, resourceLocation, newRealBlock); + Reflections.method$Holder$Reference$bindValue.invoke(blockHolder, newRealBlock); + Reflections.field$Holder$Reference$tags.set(blockHolder, Set.of()); + + newBlockState = getOnlyBlockState(newRealBlock); + Reflections.method$IdMapper$add.invoke(Reflections.instance$BLOCK_STATE_REGISTRY, newBlockState); + } + + if (isNoteBlock) { + BlockStateUtils.CLIENT_SIDE_NOTE_BLOCKS.put(newBlockState, new Object()); + } + + int stateId = BlockStateUtils.vanillaStateSize() + counter; + + builder1.put(realBlockKey, stateId); + builder2.put(stateId, blockHolder); + stateIds.add(stateId); + + deceiveBukkit(newRealBlock, clientSideBlockType); + order.add(realBlockKey); + counter++; + } + + builder3.put(clientSideBlockType, stateIds); + Object soundType = Reflections.field$BlockBehaviour$soundType.get(clientSideBlock); + affectSoundTypes.add(soundType); + return counter; + } + + private Object createResourceLocation(Key key) throws Exception { + return Reflections.method$ResourceLocation$fromNamespaceAndPath.invoke(null, key.namespace(), key.value()); + } + + private Object getBlockFromRegistry(Object resourceLocation) throws Exception { + return Reflections.method$Registry$get.invoke(Reflections.instance$BuiltInRegistries$BLOCK, resourceLocation); + } + + private Key createRealBlockKey(Key replacedBlock, int index) { + return Key.of(CraftEngine.NAMESPACE, replacedBlock.value() + "_" + index); + } + + private Object createBlockProperties(Key realBlockKey) throws Exception { + Object blockProperties = Reflections.method$BlockBehaviour$Properties$of.invoke(null); + Object realBlockResourceLocation = createResourceLocation(realBlockKey); + Object realBlockResourceKey = Reflections.method$ResourceKey$create.invoke(null, Reflections.instance$Registries$BLOCK, realBlockResourceLocation); + if (Reflections.field$BlockBehaviour$Properties$id != null) { + Reflections.field$BlockBehaviour$Properties$id.set(blockProperties, realBlockResourceKey); + } + return blockProperties; + } + + private Object getOnlyBlockState(Object newBlock) throws IllegalAccessException { + Object stateDefinition = Reflections.field$Block$StateDefinition.get(newBlock); + @SuppressWarnings("unchecked") + ImmutableList states = (ImmutableList) Reflections.field$StateDefinition$states.get(stateDefinition); + return states.get(0); + } + + private void deceiveBukkit(Object newBlock, Key replacedBlock) throws IllegalAccessException { + @SuppressWarnings("unchecked") + Map magicMap = (Map) Reflections.field$CraftMagicNumbers$BLOCK_MATERIAL.get(null); + magicMap.put(newBlock, org.bukkit.Registry.MATERIAL.get(Objects.requireNonNull(NamespacedKey.fromString(replacedBlock.toString())))); + } +} diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/block/BukkitBlockShape.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/block/BukkitBlockShape.java new file mode 100644 index 000000000..a349d33a9 --- /dev/null +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/block/BukkitBlockShape.java @@ -0,0 +1,17 @@ +package net.momirealms.craftengine.bukkit.block; + +import net.momirealms.craftengine.bukkit.util.Reflections; +import net.momirealms.craftengine.shared.block.BlockShape; + +public class BukkitBlockShape implements BlockShape { + private final Object rawBlockState; + + public BukkitBlockShape(Object rawBlockState) { + this.rawBlockState = rawBlockState; + } + + @Override + public Object getShape(Object thisObj, Object[] args) throws Exception { + return Reflections.method$BlockBehaviour$getShape.invoke(Reflections.field$StateHolder$owner.get(this.rawBlockState), this.rawBlockState, args[1], args[2], args[3]); + } +} diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/block/BukkitCustomBlock.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/block/BukkitCustomBlock.java new file mode 100644 index 000000000..6cd231677 --- /dev/null +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/block/BukkitCustomBlock.java @@ -0,0 +1,124 @@ +package net.momirealms.craftengine.bukkit.block; + +import net.momirealms.craftengine.bukkit.plugin.BukkitCraftEngine; +import net.momirealms.craftengine.bukkit.util.BlockStateUtils; +import net.momirealms.craftengine.bukkit.util.Reflections; +import net.momirealms.craftengine.bukkit.util.SoundUtils; +import net.momirealms.craftengine.core.block.*; +import net.momirealms.craftengine.core.block.properties.Property; +import net.momirealms.craftengine.core.loot.LootTable; +import net.momirealms.craftengine.core.plugin.CraftEngine; +import net.momirealms.craftengine.core.registry.Holder; +import net.momirealms.craftengine.core.util.Key; +import net.momirealms.craftengine.core.util.Tristate; +import net.momirealms.craftengine.shared.ObjectHolder; +import net.momirealms.craftengine.shared.block.BlockBehavior; +import org.bukkit.inventory.ItemStack; +import org.jetbrains.annotations.Nullable; + +import java.lang.reflect.Field; +import java.util.HashSet; +import java.util.Map; +import java.util.Set; + +public class BukkitCustomBlock extends CustomBlock { + + public BukkitCustomBlock( + Key id, + Holder.Reference holder, + Map> properties, + Map appearances, + Map variantMapper, + BlockSettings settings, + Map behaviorSettings, + @Nullable LootTable lootTable + ) { + super(id, holder, properties, appearances, variantMapper, settings, behaviorSettings, lootTable); + } + + @SuppressWarnings("unchecked") + @Nullable + @Override + public LootTable lootTable() { + return (LootTable) super.lootTable(); + } + + @Override + protected void applyPlatformSettings() { + try { + for (ImmutableBlockState state : variantProvider().states()) { + if (state.vanillaBlockState() == null) { + CraftEngine.instance().logger().warn("Could not find vanilla block state for " + state + ". This might cause errors!"); + continue; + } else if (state.customBlockState() == null) { + CraftEngine.instance().logger().warn("Could not find custom block state for " + state + ". This might cause errors!"); + continue; + } + Object mcBlockState = state.customBlockState().handle(); + BlockSettings settings = state.settings(); + // set block state properties + BlockStateUtils.setInstrument(mcBlockState, settings.instrument()); + BlockStateUtils.setMapColor(mcBlockState, settings.mapColor()); + BlockStateUtils.setLightEmission(mcBlockState, settings.luminance()); + BlockStateUtils.setBurnable(mcBlockState, settings.burnable()); + BlockStateUtils.setHardness(mcBlockState, settings.hardness()); + BlockStateUtils.setPushReaction(mcBlockState, settings.pushReaction()); + BlockStateUtils.setReplaceable(mcBlockState, settings.replaceable()); + BlockStateUtils.setCanOcclude(mcBlockState, settings.canOcclude()); + if (settings.isRedstoneConductor() == Tristate.TRUE) { + BlockStateUtils.setIsRedstoneConductor(mcBlockState, StatePredicate.alwaysTrue()); + } else if (settings.isRedstoneConductor() == Tristate.FALSE) { + BlockStateUtils.setIsRedstoneConductor(mcBlockState, StatePredicate.alwaysFalse()); + } + if (settings.isSuffocating() == Tristate.TRUE) { + BlockStateUtils.setIsSuffocating(mcBlockState, StatePredicate.alwaysTrue()); + } else if (settings.isSuffocating() == Tristate.FALSE) { + BlockStateUtils.setIsSuffocating(mcBlockState, StatePredicate.alwaysFalse()); + } + if (settings.isViewBlocking() == Tristate.TRUE) { + BlockStateUtils.setIsViewBlocking(mcBlockState, StatePredicate.alwaysTrue()); + } else if (settings.isViewBlocking() == Tristate.FALSE) { + BlockStateUtils.setIsViewBlocking(mcBlockState, StatePredicate.alwaysFalse()); + } else { + if (settings.isSuffocating() == Tristate.TRUE) { + BlockStateUtils.setIsViewBlocking(mcBlockState, StatePredicate.alwaysTrue()); + } else if (settings.isSuffocating() == Tristate.FALSE) { + BlockStateUtils.setIsViewBlocking(mcBlockState, StatePredicate.alwaysFalse()); + } + } + // set parent block properties + Object mcBlock = BlockStateUtils.getBlockOwner(mcBlockState); + // bind shape + Field shapeField = mcBlock.getClass().getField("shapeHolder"); + @SuppressWarnings("unchecked") + ObjectHolder shapeHolder = (ObjectHolder) shapeField.get(mcBlock); + shapeHolder.bindValue(new BukkitBlockShape(state.vanillaBlockState().handle())); + // bind behavior + Field behaviorField = mcBlock.getClass().getField("behaviorHolder"); + @SuppressWarnings("unchecked") + ObjectHolder behaviorHolder = (ObjectHolder) behaviorField.get(mcBlock); + behaviorHolder.bindValue(super.behavior); + // set block side properties + Reflections.field$BlockBehaviour$explosionResistance.set(mcBlock, settings.resistance()); + Reflections.field$BlockBehaviour$soundType.set(mcBlock, SoundUtils.toSoundType(settings.sounds())); + // init cache + Reflections.method$BlockStateBase$initCache.invoke(mcBlockState); + // set random tick later + BlockStateUtils.setIsRandomlyTicking(mcBlockState, settings.isRandomlyTicking()); + // bind tags + Object holder = BukkitCraftEngine.instance().blockManager().getMinecraftBlockHolder(state.customBlockState().registryId()); + Set tags = new HashSet<>(); + for (Key tag : settings.tags()) { + tags.add(Reflections.method$TagKey$create.invoke(null, Reflections.instance$Registries$BLOCK, Reflections.method$ResourceLocation$fromNamespaceAndPath.invoke(null, tag.namespace(), tag.value()))); + } + Reflections.field$Holder$Reference$tags.set(holder, tags); + // set burning properties + if (settings.burnable()) { + Reflections.method$FireBlock$setFlammable.invoke(Reflections.instance$Blocks$FIRE, mcBlock, settings.burnChance(), settings.fireSpreadChance()); + } + } + } catch (Exception e) { + CraftEngine.instance().logger().warn("Failed to init block settings", e); + } + } +} diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/block/FallingBlockRemoveListener.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/block/FallingBlockRemoveListener.java new file mode 100644 index 000000000..7faf6d4c1 --- /dev/null +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/block/FallingBlockRemoveListener.java @@ -0,0 +1,51 @@ +package net.momirealms.craftengine.bukkit.block; + +import net.momirealms.craftengine.bukkit.util.BlockStateUtils; +import net.momirealms.craftengine.bukkit.util.Reflections; +import net.momirealms.craftengine.bukkit.world.BukkitWorld; +import net.momirealms.craftengine.core.block.ImmutableBlockState; +import net.momirealms.craftengine.core.item.Item; +import net.momirealms.craftengine.core.loot.parameter.LootParameters; +import net.momirealms.craftengine.core.plugin.CraftEngine; +import net.momirealms.craftengine.core.util.context.ContextHolder; +import net.momirealms.craftengine.core.world.Vec3d; +import org.bukkit.entity.FallingBlock; +import org.bukkit.event.EventHandler; +import org.bukkit.event.Listener; + +public class FallingBlockRemoveListener implements Listener { + + /* + * This is not an event that would be removed + * Paper mistakenly marked it as deprecated in 1.20.4 + */ + @SuppressWarnings("removal") + @EventHandler + public void onFallingBlockBreak(org.bukkit.event.entity.EntityRemoveEvent event) { + if (event.getCause() == org.bukkit.event.entity.EntityRemoveEvent.Cause.DROP && event.getEntity() instanceof FallingBlock fallingBlock) { + try { + Object fallingBlockEntity = Reflections.field$CraftEntity$entity.get(fallingBlock); + boolean cancelDrop = (boolean) Reflections.field$FallingBlockEntity$cancelDrop.get(fallingBlockEntity); + if (cancelDrop) return; + Object blockState = Reflections.field$FallingBlockEntity$blockState.get(fallingBlockEntity); + int stateId = BlockStateUtils.blockStateToId(blockState); + ImmutableBlockState immutableBlockState = BukkitBlockManager.instance().getImmutableBlockState(stateId); + if (immutableBlockState == null || immutableBlockState.isEmpty()) return; + ContextHolder.Builder builder = ContextHolder.builder(); + builder.withParameter(LootParameters.FALLING_BLOCK, true); + double x = Reflections.field$Entity$xo.getDouble(fallingBlockEntity); + double y = Reflections.field$Entity$yo.getDouble(fallingBlockEntity); + double z = Reflections.field$Entity$zo.getDouble(fallingBlockEntity); + Vec3d vec3d = new Vec3d(x, y, z); + net.momirealms.craftengine.core.world.World world = new BukkitWorld(fallingBlock.getWorld()); + builder.withParameter(LootParameters.LOCATION, vec3d); + builder.withParameter(LootParameters.WORLD, world); + for (Item item : immutableBlockState.getDrops(builder, world)) { + world.dropItemNaturally(vec3d, item); + } + } catch (ReflectiveOperationException e) { + CraftEngine.instance().logger().warn("Failed to handle EntityRemoveEvent", e); + } + } + } +} diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/block/WorldEditHook.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/block/WorldEditHook.java new file mode 100644 index 000000000..5110083dd --- /dev/null +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/block/WorldEditHook.java @@ -0,0 +1,11 @@ +package net.momirealms.craftengine.bukkit.block; + +import com.sk89q.worldedit.world.block.BlockType; +import net.momirealms.craftengine.core.util.Key; + +public class WorldEditHook { + + public static void register(Key id) { + BlockType.REGISTRY.register(id.toString(), new BlockType(id.toString(), blockState -> blockState)); + } +} diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/block/behavior/BukkitBlockBehaviors.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/block/behavior/BukkitBlockBehaviors.java new file mode 100644 index 000000000..00605750f --- /dev/null +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/block/behavior/BukkitBlockBehaviors.java @@ -0,0 +1,23 @@ +package net.momirealms.craftengine.bukkit.block.behavior; + +import net.momirealms.craftengine.core.block.behavior.BlockBehaviors; +import net.momirealms.craftengine.core.util.Key; +import net.momirealms.craftengine.shared.block.EmptyBlockBehavior; + +public class BukkitBlockBehaviors extends BlockBehaviors { + public static final Key EMPTY = Key.from("craftengine:empty"); + public static final Key BUSH_BLOCK = Key.from("craftengine:bush_block"); + public static final Key FALLING_BLOCK = Key.from("craftengine:falling_block"); + public static final Key LEAVES_BLOCK = Key.from("craftengine:leaves_block"); + public static final Key STRIPPABLE_BLOCK = Key.from("craftengine:strippable_block"); + public static final Key SAPLING_BLOCK = Key.from("craftengine:sapling_block"); + + public static void init() { + register(EMPTY, (block, args) -> EmptyBlockBehavior.INSTANCE); + register(FALLING_BLOCK, FallingBlockBehavior.FACTORY); + register(BUSH_BLOCK, BushBlockBehavior.FACTORY); + register(LEAVES_BLOCK, LeavesBlockBehavior.FACTORY); + register(STRIPPABLE_BLOCK, StrippableBlockBehavior.FACTORY); + register(SAPLING_BLOCK, SaplingBlockBehavior.FACTORY); + } +} diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/block/behavior/BushBlockBehavior.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/block/behavior/BushBlockBehavior.java new file mode 100644 index 000000000..52dca81e1 --- /dev/null +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/block/behavior/BushBlockBehavior.java @@ -0,0 +1,111 @@ +package net.momirealms.craftengine.bukkit.block.behavior; + +import net.momirealms.craftengine.bukkit.block.BukkitBlockManager; +import net.momirealms.craftengine.bukkit.util.BlockStateUtils; +import net.momirealms.craftengine.bukkit.util.BlockTags; +import net.momirealms.craftengine.bukkit.util.LocationUtils; +import net.momirealms.craftengine.bukkit.util.Reflections; +import net.momirealms.craftengine.bukkit.world.BukkitWorld; +import net.momirealms.craftengine.core.block.CustomBlock; +import net.momirealms.craftengine.core.block.ImmutableBlockState; +import net.momirealms.craftengine.core.block.behavior.BlockBehaviorFactory; +import net.momirealms.craftengine.core.item.Item; +import net.momirealms.craftengine.core.loot.parameter.LootParameters; +import net.momirealms.craftengine.core.util.Key; +import net.momirealms.craftengine.core.util.MiscUtils; +import net.momirealms.craftengine.core.util.VersionHelper; +import net.momirealms.craftengine.core.util.context.ContextHolder; +import net.momirealms.craftengine.core.world.BlockPos; +import net.momirealms.craftengine.core.world.Vec3d; +import net.momirealms.craftengine.shared.block.BlockBehavior; +import org.bukkit.World; + +import java.util.List; +import java.util.Map; +import java.util.concurrent.Callable; + +public class BushBlockBehavior extends BlockBehavior { + public static final Factory FACTORY = new Factory(); + protected static final Object DIRT_TAG = BlockTags.getOrCreate(Key.of("minecraft", "dirt")); + protected static final Object FARMLAND = BlockTags.getOrCreate(Key.of("minecraft", "farmland")); + public static final BushBlockBehavior INSTANCE = new BushBlockBehavior(List.of(DIRT_TAG, FARMLAND)); + protected final List tagsCanSurviveOn; + + public BushBlockBehavior(List tagsCanSurviveOn) { + this.tagsCanSurviveOn = tagsCanSurviveOn; + } + + @Override + public void onPlace(Object thisBlock, Object[] args, Callable superMethod) throws Exception { + Object world = args[1]; + Object blockPos = args[2]; + Reflections.method$LevelAccessor$scheduleTick.invoke(world, blockPos, thisBlock, 2); + } + + @Override + public Object updateShape(Object thisBlock, Object[] args, Callable superMethod) throws Exception { + Object level; + Object blockPos; + Object state = args[0]; + if (VersionHelper.isVersionNewerThan1_21_2()) { + level = args[1]; + blockPos = args[3]; + } else { + level = args[3]; + blockPos = args[4]; + } + if (!canSurvive(thisBlock, state, level, blockPos)) { + ImmutableBlockState previousState = BukkitBlockManager.instance().getImmutableBlockState(BlockStateUtils.blockStateToId(state)); + if (previousState != null && !previousState.isEmpty()) { + ContextHolder.Builder builder = ContextHolder.builder(); + BlockPos pos = LocationUtils.fromBlockPos(blockPos); + Vec3d vec3d = Vec3d.atCenterOf(pos); + net.momirealms.craftengine.core.world.World world = new BukkitWorld((World) Reflections.method$Level$getCraftWorld.invoke(level)); + builder.withParameter(LootParameters.LOCATION, vec3d); + builder.withParameter(LootParameters.WORLD, world); + for (Item item : previousState.getDrops(builder, world)) { + world.dropItemNaturally(vec3d, item); + } + } + return Reflections.method$Block$defaultBlockState.invoke(Reflections.instance$Blocks$AIR); + } + return super.updateShape(thisBlock, args, superMethod); + } + + @Override + public boolean canSurvive(Object thisBlock, Object[] args, Callable superMethod) throws Exception { + Object state = args[0]; + Object world = args[1]; + Object pos = args[2]; + return canSurvive(thisBlock, state, world, pos); + } + + public static class Factory implements BlockBehaviorFactory { + @Override + public BlockBehavior create(CustomBlock block, Map arguments) { + if (arguments.containsKey("tags")) { + return new BushBlockBehavior(MiscUtils.getAsStringList(arguments.get("tags")).stream().map(it -> BlockTags.getOrCreate(Key.of(it))).toList()); + } else { + return INSTANCE; + } + } + } + + private boolean canSurvive(Object thisBlock, Object state, Object world, Object blockPos) throws ReflectiveOperationException { + int y = Reflections.field$Vec3i$y.getInt(blockPos); + int x = Reflections.field$Vec3i$x.getInt(blockPos); + int z = Reflections.field$Vec3i$z.getInt(blockPos); + Object belowPos = Reflections.constructor$BlockPos.newInstance(x, y - 1, z); + Object belowState = Reflections.method$BlockGetter$getBlockState.invoke(world, belowPos); + return mayPlaceOn(belowState, world, belowPos); + } + + private boolean mayPlaceOn(Object belowState, Object world, Object blockPos) throws ReflectiveOperationException { + for (Object tag : this.tagsCanSurviveOn) { + if ((boolean) Reflections.method$BlockStateBase$hasTag.invoke(belowState, tag)) { + return true; + } + } + return false; + } +} diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/block/behavior/FallingBlockBehavior.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/block/behavior/FallingBlockBehavior.java new file mode 100644 index 000000000..484726bfa --- /dev/null +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/block/behavior/FallingBlockBehavior.java @@ -0,0 +1,113 @@ +package net.momirealms.craftengine.bukkit.block.behavior; + +import net.momirealms.craftengine.bukkit.block.BukkitBlockManager; +import net.momirealms.craftengine.bukkit.util.BlockStateUtils; +import net.momirealms.craftengine.bukkit.util.Reflections; +import net.momirealms.craftengine.bukkit.world.BukkitWorld; +import net.momirealms.craftengine.core.block.CustomBlock; +import net.momirealms.craftengine.core.block.ImmutableBlockState; +import net.momirealms.craftengine.core.block.behavior.BlockBehaviorFactory; +import net.momirealms.craftengine.core.item.Item; +import net.momirealms.craftengine.core.loot.parameter.LootParameters; +import net.momirealms.craftengine.core.util.MiscUtils; +import net.momirealms.craftengine.core.util.VersionHelper; +import net.momirealms.craftengine.core.util.context.ContextHolder; +import net.momirealms.craftengine.core.world.Vec3d; +import net.momirealms.craftengine.shared.block.BlockBehavior; +import org.bukkit.World; + +import java.util.Map; +import java.util.concurrent.Callable; + +public class FallingBlockBehavior extends BlockBehavior { + public static final Factory FACTORY = new Factory(); + private final float hurtAmount; + private final int maxHurt; + + public FallingBlockBehavior(float hurtAmount, int maxHurt) { + this.hurtAmount = hurtAmount; + this.maxHurt = maxHurt; + } + + @Override + public void onPlace(Object thisBlock, Object[] args, Callable superMethod) throws Exception { + Object world = args[1]; + Object blockPos = args[2]; + Reflections.method$LevelAccessor$scheduleTick.invoke(world, blockPos, thisBlock, 2); + } + + @Override + public Object updateShape(Object thisBlock, Object[] args, Callable superMethod) throws Exception { + Object world; + Object blockPos; + if (VersionHelper.isVersionNewerThan1_21_2()) { + world = args[1]; + blockPos = args[3]; + } else { + world = args[3]; + blockPos = args[4]; + } + Reflections.method$LevelAccessor$scheduleTick.invoke(world, blockPos, thisBlock, 2); + return super.updateShape(thisBlock, args, superMethod); + } + + @Override + public void tick(Object thisBlock, Object[] args, Callable superMethod) throws Exception { + Object blockPos = args[2]; + int y = Reflections.field$Vec3i$y.getInt(blockPos); + Object world = args[1]; + Object dimension = Reflections.method$$LevelReader$dimensionType.invoke(world); + int minY = Reflections.field$DimensionType$minY.getInt(dimension); + if (y < minY) { + return; + } + int x = Reflections.field$Vec3i$x.getInt(blockPos); + int z = Reflections.field$Vec3i$z.getInt(blockPos); + Object belowPos = Reflections.constructor$BlockPos.newInstance(x, y - 1, z); + Object belowState = Reflections.method$BlockGetter$getBlockState.invoke(world, belowPos); + boolean isFree = (boolean) Reflections.method$FallingBlock$isFree.invoke(null, belowState); + if (!isFree) { + return; + } + Object blockState = args[0]; + Object fallingBlockEntity = Reflections.method$FallingBlockEntity$fall.invoke(null, world, blockPos, blockState); + if (this.hurtAmount > 0 && this.maxHurt > 0) { + Reflections.method$FallingBlockEntity$setHurtsEntities.invoke(fallingBlockEntity, this.hurtAmount, this.maxHurt); + } + } + + @Override + public void onBrokenAfterFall(Object thisBlock, Object[] args, Callable superMethod) throws Exception { + // Use EntityRemoveEvent for 1.20.3+ + if (VersionHelper.isVersionNewerThan1_20_3()) return; + Object level = args[0]; + Object fallingBlockEntity = args[2]; + boolean cancelDrop = (boolean) Reflections.field$FallingBlockEntity$cancelDrop.get(fallingBlockEntity); + if (cancelDrop) return; + Object blockState = Reflections.field$FallingBlockEntity$blockState.get(fallingBlockEntity); + int stateId = BlockStateUtils.blockStateToId(blockState); + ImmutableBlockState immutableBlockState = BukkitBlockManager.instance().getImmutableBlockState(stateId); + if (immutableBlockState == null || immutableBlockState.isEmpty()) return; + ContextHolder.Builder builder = ContextHolder.builder(); + builder.withParameter(LootParameters.FALLING_BLOCK, true); + double x = Reflections.field$Entity$xo.getDouble(fallingBlockEntity); + double y = Reflections.field$Entity$yo.getDouble(fallingBlockEntity); + double z = Reflections.field$Entity$zo.getDouble(fallingBlockEntity); + Vec3d vec3d = new Vec3d(x, y, z); + net.momirealms.craftengine.core.world.World world = new BukkitWorld((World) Reflections.method$Level$getCraftWorld.invoke(level)); + builder.withParameter(LootParameters.LOCATION, vec3d); + builder.withParameter(LootParameters.WORLD, world); + for (Item item : immutableBlockState.getDrops(builder, world)) { + world.dropItemNaturally(vec3d, item); + } + } + + public static class Factory implements BlockBehaviorFactory { + @Override + public BlockBehavior create(CustomBlock block, Map arguments) { + float hurtAmount = MiscUtils.getAsFloat(arguments.getOrDefault("hurt-amount", -1f)); + int hurtMax = MiscUtils.getAsInt(arguments.getOrDefault("max-hurt", -1)); + return new FallingBlockBehavior(hurtAmount, hurtMax); + } + } +} diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/block/behavior/LeavesBlockBehavior.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/block/behavior/LeavesBlockBehavior.java new file mode 100644 index 000000000..7fc3f83ba --- /dev/null +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/block/behavior/LeavesBlockBehavior.java @@ -0,0 +1,195 @@ +package net.momirealms.craftengine.bukkit.block.behavior; + +import net.momirealms.craftengine.bukkit.block.BukkitBlockManager; +import net.momirealms.craftengine.bukkit.util.BlockStateUtils; +import net.momirealms.craftengine.bukkit.util.BlockTags; +import net.momirealms.craftengine.bukkit.util.LocationUtils; +import net.momirealms.craftengine.bukkit.util.Reflections; +import net.momirealms.craftengine.bukkit.world.BukkitWorld; +import net.momirealms.craftengine.core.block.CustomBlock; +import net.momirealms.craftengine.core.block.ImmutableBlockState; +import net.momirealms.craftengine.core.block.UpdateOption; +import net.momirealms.craftengine.core.block.behavior.BlockBehaviorFactory; +import net.momirealms.craftengine.core.block.properties.Property; +import net.momirealms.craftengine.core.item.Item; +import net.momirealms.craftengine.core.loot.parameter.LootParameters; +import net.momirealms.craftengine.core.util.Direction; +import net.momirealms.craftengine.core.util.Key; +import net.momirealms.craftengine.core.util.VersionHelper; +import net.momirealms.craftengine.core.util.context.ContextHolder; +import net.momirealms.craftengine.core.world.BlockPos; +import net.momirealms.craftengine.core.world.Vec3d; +import net.momirealms.craftengine.shared.block.BlockBehavior; +import org.bukkit.Bukkit; +import org.bukkit.Material; +import org.bukkit.World; +import org.bukkit.event.block.LeavesDecayEvent; +import org.jetbrains.annotations.Nullable; + +import java.util.Map; +import java.util.concurrent.Callable; + +public class LeavesBlockBehavior extends BlockBehavior { + public static final Factory FACTORY = new Factory(); + private static final Object LOG_TAG = BlockTags.getOrCreate(Key.of("minecraft", "logs")); + private final int maxDistance; + private final Property distanceProperty; + private final Property persistentProperty; + @Nullable + private final Property waterloggedProperty; + + public LeavesBlockBehavior(int maxDistance, Property distanceProperty, Property persistentProperty, @Nullable Property waterloggedProperty) { + this.maxDistance = maxDistance; + this.distanceProperty = distanceProperty; + this.persistentProperty = persistentProperty; + this.waterloggedProperty = waterloggedProperty; + } + + public int getDistance(ImmutableBlockState state) { + return state.get(this.distanceProperty); + } + + public boolean isPersistent(ImmutableBlockState state) { + return state.get(this.persistentProperty); + } + + public boolean isWaterLogged(ImmutableBlockState state) { + if (this.waterloggedProperty == null) return false; + return state.get(this.waterloggedProperty); + } + + @Override + public Object updateShape(Object thisBlock, Object[] args, Callable superMethod) throws Exception { + Object world; + Object blockPos; + Object neighborState; + Object blockState = args[0]; + if (VersionHelper.isVersionNewerThan1_21_2()) { + world = args[1]; + neighborState = args[6]; + blockPos = args[3]; + } else { + world = args[3]; + blockPos = args[4]; + neighborState = args[2]; + } + ImmutableBlockState thisState = BukkitBlockManager.instance().getImmutableBlockState(BlockStateUtils.blockStateToId(blockState)); + if (thisState != null && thisState.behavior() instanceof LeavesBlockBehavior behavior) { + int distance = behavior.getDistanceAt(neighborState) + 1; + if (distance != 1 || behavior.getDistance(thisState) != distance) { + Reflections.method$LevelAccessor$scheduleTick.invoke(world, blockPos, thisBlock, 1); + } + } + return blockState; + } + + @Override + public void tick(Object thisBlock, Object[] args, Callable superMethod) throws Exception { + Object blockState = args[0]; + Object level = args[1]; + Object blockPos = args[2]; + ImmutableBlockState currentState = BukkitBlockManager.instance().getImmutableBlockState(BlockStateUtils.blockStateToId(blockState)); + if (currentState != null && !currentState.isEmpty() && currentState.behavior() instanceof LeavesBlockBehavior behavior) { + ImmutableBlockState newState = behavior.updateDistance(currentState, level, blockPos); + if (newState != currentState) { + if (blockState == newState.customBlockState().handle()) { + Reflections.method$BlockStateBase$updateNeighbourShapes.invoke(blockState, level, blockPos, UpdateOption.UPDATE_ALL.flags(), 512); + } else { + Reflections.method$Level$setBlock.invoke(level, blockPos, newState.customBlockState().handle(), UpdateOption.UPDATE_ALL.flags()); + } + } + } + } + + @Override + public void randomTick(Object thisBlock, Object[] args, Callable superMethod) throws Exception { + Object level = args[1]; + Object blockPos = args[2]; + ImmutableBlockState immutableBlockState = BukkitBlockManager.instance().getImmutableBlockState(BlockStateUtils.blockStateToId(args[0])); + if (immutableBlockState != null && immutableBlockState.behavior() instanceof LeavesBlockBehavior behavior && behavior.isDecaying(immutableBlockState)) { + World bukkitWorld = (World) Reflections.method$Level$getCraftWorld.invoke(level); + BlockPos pos = LocationUtils.fromBlockPos(blockPos); + // call bukkit event + LeavesDecayEvent event = new LeavesDecayEvent(bukkitWorld.getBlockAt(pos.x(), pos.y(), pos.z())); + Bukkit.getPluginManager().callEvent(event); + if (event.isCancelled()) { + return; + } + Reflections.method$Level$removeBlock.invoke(level, blockPos, false); + if (isWaterLogged(immutableBlockState)) { + bukkitWorld.setBlockData(pos.x(), pos.y(), pos.z(), Material.WATER.createBlockData()); + } + Vec3d vec3d = Vec3d.atCenterOf(pos); + net.momirealms.craftengine.core.world.World world = new BukkitWorld(bukkitWorld); + ContextHolder.Builder builder = ContextHolder.builder() + .withParameter(LootParameters.LOCATION, vec3d) + .withParameter(LootParameters.WORLD, world); + for (Item item : immutableBlockState.getDrops(builder, world)) { + world.dropItemNaturally(vec3d, item); + } + } + } + + private boolean isDecaying(ImmutableBlockState blockState) { + return !isPersistent(blockState) && getDistance(blockState) == this.maxDistance; + } + + private ImmutableBlockState updateDistance(ImmutableBlockState state, Object world, Object blockPos) throws ReflectiveOperationException { + int i = this.maxDistance; + Object mutablePos = Reflections.constructor$MutableBlockPos.newInstance(); + int j = Direction.values().length; + for (int k = 0; k < j; ++k) { + Object direction = Reflections.instance$Directions[k]; + Reflections.method$MutableBlockPos$setWithOffset.invoke(mutablePos, blockPos, direction); + Object blockState = Reflections.method$BlockGetter$getBlockState.invoke(world, mutablePos); + i = Math.min(i, getDistanceAt(blockState) + 1); + if (i == 1) { + break; + } + } + return state.with(this.distanceProperty, i); + } + + private int getDistanceAt(Object blockState) throws ReflectiveOperationException { + boolean isLog = (boolean) Reflections.method$BlockStateBase$hasTag.invoke(blockState, LOG_TAG); + if (isLog) return 0; + int id = BlockStateUtils.blockStateToId(blockState); + if (BlockStateUtils.isVanillaBlock(id)) { + Object distanceProperty = Reflections.field$LeavesBlock$DISTANCE.get(null); + boolean hasDistanceProperty = (boolean) Reflections.method$StateHolder$hasProperty.invoke(blockState, distanceProperty); + if (!hasDistanceProperty) return this.maxDistance; + return (int) Reflections.method$StateHolder$getValue.invoke(blockState, distanceProperty); + } else { + ImmutableBlockState anotherBlockState = BukkitBlockManager.instance().getImmutableBlockStateUnsafe(id); + if (!(anotherBlockState.behavior() instanceof LeavesBlockBehavior otherBehavior)) return this.maxDistance; + return otherBehavior.getDistance(anotherBlockState); + } + } + + @SuppressWarnings("unchecked") + public static class Factory implements BlockBehaviorFactory { + @Override + public BlockBehavior create(CustomBlock block, Map arguments) { + Property persistent = (Property) block.getProperty("persistent"); + if (persistent == null) { + throw new NullPointerException("persistent property not set for block " + block.id()); + } + Property distance = (Property) block.getProperty("distance"); + if (distance == null) { + throw new NullPointerException("distance not set for block " + block.id()); + } + Property waterlogged = (Property) block.getProperty("waterlogged"); + int actual = distance.possibleValues().get(distance.possibleValues().size() - 1); + return new LeavesBlockBehavior(actual, distance, persistent, waterlogged); + } + } + + @Override + public Object getFluidState(Object thisBlock, Object[] args, Callable superMethod) throws Exception { + Object blockState = args[0]; + ImmutableBlockState state = BukkitBlockManager.instance().getImmutableBlockState(BlockStateUtils.blockStateToId(blockState)); + if (state == null || state.isEmpty() || waterloggedProperty == null) return super.getFluidState(thisBlock, args, superMethod); + boolean waterlogged = state.get(waterloggedProperty); + return waterlogged ? Reflections.method$FlowingFluid$getSource.invoke(Reflections.instance$Fluids$WATER, false) : super.getFluidState(thisBlock, args, superMethod); + } +} diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/block/behavior/SaplingBlockBehavior.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/block/behavior/SaplingBlockBehavior.java new file mode 100644 index 000000000..d9bd89399 --- /dev/null +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/block/behavior/SaplingBlockBehavior.java @@ -0,0 +1,131 @@ +package net.momirealms.craftengine.bukkit.block.behavior; + +import net.momirealms.craftengine.bukkit.api.CraftEngineBlocks; +import net.momirealms.craftengine.bukkit.block.BukkitBlockManager; +import net.momirealms.craftengine.bukkit.util.*; +import net.momirealms.craftengine.core.block.CustomBlock; +import net.momirealms.craftengine.core.block.ImmutableBlockState; +import net.momirealms.craftengine.core.block.UpdateOption; +import net.momirealms.craftengine.core.block.behavior.BlockBehaviorFactory; +import net.momirealms.craftengine.core.block.properties.Property; +import net.momirealms.craftengine.core.plugin.CraftEngine; +import net.momirealms.craftengine.core.util.Key; +import net.momirealms.craftengine.core.util.MiscUtils; +import net.momirealms.craftengine.core.util.RandomUtils; +import net.momirealms.craftengine.shared.block.BlockBehavior; +import org.bukkit.Location; +import org.bukkit.World; + +import java.util.List; +import java.util.Map; +import java.util.Optional; +import java.util.concurrent.Callable; + +public class SaplingBlockBehavior extends BushBlockBehavior { + public static final Factory FACTORY = new Factory(); + private final Key feature; + private final Property stageProperty; + private final double boneMealSuccessChance; + + public SaplingBlockBehavior(Key feature, Property stageProperty, List tagsCanSurviveOn, double boneMealSuccessChance) { + super(tagsCanSurviveOn); + this.feature = feature; + this.stageProperty = stageProperty; + this.boneMealSuccessChance = boneMealSuccessChance; + } + + public Key treeFeature() { + return feature; + } + + @Override + public void randomTick(Object thisBlock, Object[] args, Callable superMethod) throws Exception { + Object world = args[1]; + Object blockPos = args[2]; + Object blockState = args[0]; + int x = (int) Reflections.field$Vec3i$x.get(blockPos); + int y = (int) Reflections.field$Vec3i$y.get(blockPos); + int z = (int) Reflections.field$Vec3i$z.get(blockPos); + Object aboveBlockPos = LocationUtils.toBlockPos(x, y + 1, z); + if ((int) Reflections.method$LevelReader$getMaxLocalRawBrightness.invoke(world, aboveBlockPos) >= 9 && (float) Reflections.method$RandomSource$nextFloat.invoke(args[3]) < (1.0f / 7.0f)) { + increaseStage(world, blockPos, blockState, args[3]); + } + } + + private void increaseStage(Object world, Object blockPos, Object blockState, Object randomSource) throws Exception { + ImmutableBlockState immutableBlockState = BukkitBlockManager.instance().getImmutableBlockState(BlockStateUtils.blockStateToId(blockState)); + if (immutableBlockState == null || immutableBlockState.isEmpty()) return; + int currentStage = immutableBlockState.get(this.stageProperty); + if (currentStage != this.stageProperty.possibleValues().get(this.stageProperty.possibleValues().size() - 1)) { + ImmutableBlockState nextStage = immutableBlockState.cycle(this.stageProperty); + World bukkitWorld = (World) Reflections.method$Level$getCraftWorld.invoke(world); + int x = (int) Reflections.field$Vec3i$x.get(blockPos); + int y = (int) Reflections.field$Vec3i$y.get(blockPos); + int z = (int) Reflections.field$Vec3i$z.get(blockPos); + CraftEngineBlocks.place(new Location(bukkitWorld, x, y, z), nextStage, UpdateOption.UPDATE_NONE, false); + } else { + generateTree(world, blockPos, blockState, randomSource); + } + } + + private void generateTree(Object world, Object blockPos, Object blockState, Object randomSource) throws Exception { + Object registry = Reflections.method$RegistryAccess$registryOrThrow.invoke(Reflections.instance$registryAccess, Reflections.instance$Registries$CONFIGURED_FEATURE); + if (registry == null) return; + @SuppressWarnings("unchecked") + Optional holder = (Optional) Reflections.method$Registry$getHolder1.invoke(registry, FeatureUtils.createFeatureKey(treeFeature())); + if (holder.isEmpty()) { + CraftEngine.instance().logger().warn("Configured feature not found: " + treeFeature()); + return; + } + Object chunkGenerator = Reflections.method$ServerChunkCache$getGenerator.invoke(Reflections.field$ServerLevel$chunkSource.get(world)); + Object configuredFeature = Reflections.method$Holder$value.invoke(holder.get()); + Object fluidState = Reflections.method$Level$getFluidState.invoke(world, blockPos); + Object legacyState = Reflections.method$FluidState$createLegacyBlock.invoke(fluidState); + Reflections.method$Level$setBlock.invoke(world, blockPos, legacyState, UpdateOption.UPDATE_NONE.flags()); + if ((boolean) Reflections.method$ConfiguredFeature$place.invoke(configuredFeature, world, chunkGenerator, randomSource, blockPos)) { + if (Reflections.method$BlockGetter$getBlockState.invoke(world, blockPos) == legacyState) { + Reflections.method$ServerLevel$sendBlockUpdated.invoke(world, blockPos, blockState, legacyState, 2); + } + } else { + // failed to place, rollback changes + Reflections.method$Level$setBlock.invoke(world, blockPos, blockState, UpdateOption.UPDATE_NONE.flags()); + } + } + + @Override + public boolean isBoneMealSuccess(Object thisBlock, Object[] args) { + return RandomUtils.generateRandomDouble(0d, 1d) < this.boneMealSuccessChance; + } + + @Override + public boolean isValidBoneMealTarget(Object thisBlock, Object[] args) { + return true; + } + + @Override + public void performBoneMeal(Object thisBlock, Object[] args) throws Exception { + this.increaseStage(args[0], args[2], args[3], args[1]); + } + + public static class Factory implements BlockBehaviorFactory { + + @SuppressWarnings("unchecked") + @Override + public BlockBehavior create(CustomBlock block, Map arguments) { + String feature = (String) arguments.get("feature"); + if (feature == null) { + throw new IllegalArgumentException("feature is null"); + } + Property stageProperty = (Property) block.getProperty("stage"); + if (stageProperty == null) { + throw new IllegalArgumentException("stage property not set for sapling"); + } + double boneMealSuccessChance = MiscUtils.getAsDouble(arguments.getOrDefault("bone-meal-success-chance", 0.45)); + if (arguments.containsKey("tags")) { + return new SaplingBlockBehavior(Key.of(feature), stageProperty, MiscUtils.getAsStringList(arguments.get("tags")).stream().map(it -> BlockTags.getOrCreate(Key.of(it))).toList(), boneMealSuccessChance); + } else { + return new SaplingBlockBehavior(Key.of(feature), stageProperty, List.of(DIRT_TAG, FARMLAND), boneMealSuccessChance); + } + } + } +} diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/block/behavior/StrippableBlockBehavior.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/block/behavior/StrippableBlockBehavior.java new file mode 100644 index 000000000..fae1a2f5f --- /dev/null +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/block/behavior/StrippableBlockBehavior.java @@ -0,0 +1,33 @@ +package net.momirealms.craftengine.bukkit.block.behavior; + +import net.momirealms.craftengine.core.block.CustomBlock; +import net.momirealms.craftengine.core.block.behavior.BlockBehaviorFactory; +import net.momirealms.craftengine.core.util.Key; +import net.momirealms.craftengine.shared.block.BlockBehavior; + +import java.util.Map; + +public class StrippableBlockBehavior extends BlockBehavior { + public static final Factory FACTORY = new Factory(); + private final Key stripped; + + public StrippableBlockBehavior(Key stripped) { + this.stripped = stripped; + } + + public Key stripped() { + return stripped; + } + + public static class Factory implements BlockBehaviorFactory { + + @Override + public BlockBehavior create(CustomBlock block, Map arguments) { + String stripped = (String) arguments.get("stripped"); + if (stripped == null) { + throw new IllegalArgumentException("stripped is null"); + } + return new StrippableBlockBehavior(Key.of(stripped)); + } + } +} diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/entity/DisplayEntityData.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/entity/DisplayEntityData.java new file mode 100644 index 000000000..28889589e --- /dev/null +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/entity/DisplayEntityData.java @@ -0,0 +1,112 @@ +package net.momirealms.craftengine.bukkit.entity; + +import net.momirealms.craftengine.bukkit.util.Reflections; +import net.momirealms.craftengine.core.util.VersionHelper; + +import java.util.List; + +public class DisplayEntityData { + + private final int id; + private final Object serializer; + private final T defaultValue; + + // Entity + public static final DisplayEntityData EntityMasks = of(0, EntityDataValue.Serializers$BYTE, (byte) 0); + + // Display only + public static final DisplayEntityData InterpolationDelay = of(8, EntityDataValue.Serializers$INT, 0); + + // 1.19.4-1.20.1 + public static final DisplayEntityData InterpolationDuration = of(9, EntityDataValue.Serializers$INT, 0); + + // 1.20.2+ + public static final DisplayEntityData TransformationInterpolationDuration = of(9, EntityDataValue.Serializers$INT, 0); + public static final DisplayEntityData PositionRotationInterpolationDuration = of(10, EntityDataValue.Serializers$INT, 0); + + public static final DisplayEntityData Translation = of(11, EntityDataValue.Serializers$VECTOR3, Reflections.instance$Vector3f$None); + public static final DisplayEntityData Scale = of(12, EntityDataValue.Serializers$VECTOR3, Reflections.instance$Vector3f$Normal); + public static final DisplayEntityData RotationLeft = of(13, EntityDataValue.Serializers$QUATERNION, Reflections.instance$Quaternionf$None); + public static final DisplayEntityData RotationRight = of(14, EntityDataValue.Serializers$QUATERNION, Reflections.instance$Quaternionf$None); + /** + * Billboard Constraints (0 = FIXED, 1 = VERTICAL, 2 = HORIZONTAL, 3 = CENTER) + */ + public static final DisplayEntityData BillboardConstraints = of(15, EntityDataValue.Serializers$BYTE, (byte) 0); + /** + * Brightness override (blockLight << 4 | skyLight << 20) + */ + public static final DisplayEntityData BrightnessOverride = of(16, EntityDataValue.Serializers$INT, -1); + public static final DisplayEntityData ViewRange = of(17, EntityDataValue.Serializers$FLOAT, 1f); + public static final DisplayEntityData ShadowRadius = of(18, EntityDataValue.Serializers$FLOAT, 0f); + public static final DisplayEntityData ShadowStrength = of(19, EntityDataValue.Serializers$FLOAT, 0f); + public static final DisplayEntityData Width = of(20, EntityDataValue.Serializers$FLOAT, 0f); + public static final DisplayEntityData Height = of(21, EntityDataValue.Serializers$FLOAT, 0f); + public static final DisplayEntityData GlowColorOverride = of(22, EntityDataValue.Serializers$INT, -1); + + // Text display only + public static final DisplayEntityData Text = of(23, EntityDataValue.Serializers$COMPONENT, Reflections.instance$Component$empty); + public static final DisplayEntityData LineWidth = of(24, EntityDataValue.Serializers$INT, 200); + public static final DisplayEntityData BackgroundColor = of(25, EntityDataValue.Serializers$INT, 0x40000000); + public static final DisplayEntityData TextOpacity = of(26, EntityDataValue.Serializers$BYTE, (byte) -1); + public static final DisplayEntityData TextDisplayMasks = of(27, EntityDataValue.Serializers$BYTE, (byte) 0); + + // Item display only + public static final DisplayEntityData DisplayedItem = of(23, EntityDataValue.Serializers$ITEM_STACK, Reflections.instance$ItemStack$Air); + /** + * Display type: + * 0 = NONE + * 1 = THIRD_PERSON_LEFT_HAND + * 2 = THIRD_PERSON_RIGHT_HAND + * 3 = FIRST_PERSON_LEFT_HAND + * 4 = FIRST_PERSON_RIGHT_HAND + * 5 = HEAD + * 6 = GUI + * 7 = GROUND + * 8 = FIXED + */ + public static final DisplayEntityData DisplayType = of(24, EntityDataValue.Serializers$BYTE, (byte) 0); + + // Block display only + public static final DisplayEntityData DisplayedBlock = of(23, EntityDataValue.Serializers$BLOCK_STATE, Reflections.instance$Blocks$AIR$defaultState); + + public static DisplayEntityData of(final int id, final Object serializer, T defaultValue) { + return new DisplayEntityData<>(id, serializer, defaultValue); + } + + public DisplayEntityData(int id, Object serializer, T defaultValue) { + if (!VersionHelper.isVersionNewerThan1_20_2()) { + if (id >= 11) { + id--; + } + } + this.id = id; + this.serializer = serializer; + this.defaultValue = defaultValue; + } + + public Object serializer() { + return serializer; + } + + public int id() { + return id; + } + + public T defaultValue() { + return defaultValue; + } + + public Object createEntityDataIfNotDefaultValue(T value) { + if (defaultValue().equals(value)) return null; + return EntityDataValue.create(id, serializer, value); + } + + public void addEntityDataIfNotDefaultValue(T value, List list) { + if (defaultValue().equals(value)) return; + list.add(EntityDataValue.create(id, serializer, value)); + } + + public void addEntityData(T value, List list) { + list.add(EntityDataValue.create(id, serializer, value)); + } +} diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/entity/EntityDataValue.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/entity/EntityDataValue.java new file mode 100644 index 000000000..288e7dbc1 --- /dev/null +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/entity/EntityDataValue.java @@ -0,0 +1,104 @@ +package net.momirealms.craftengine.bukkit.entity; + +import net.momirealms.craftengine.bukkit.util.Reflections; +import net.momirealms.craftengine.core.util.ReflectionUtils; +import net.momirealms.craftengine.core.util.VersionHelper; + +public class EntityDataValue { + private static int internalID = 0; + + private static final String[] fieldsObf = { + "a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m", "n", "o", "p", "q", "r", "s", "t", "u", "v", "w", "x", "y", "z", + "A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", "N", "O", "P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z" + }; + + public static final Object Serializers$BYTE; + public static final Object Serializers$INT; + public static final Object Serializers$LONG; + public static final Object Serializers$FLOAT; + public static final Object Serializers$STRING; + public static final Object Serializers$COMPONENT; + public static final Object Serializers$OPTIONAL_COMPONENT; + public static final Object Serializers$ITEM_STACK; + public static final Object Serializers$BLOCK_STATE; + public static final Object Serializers$OPTIONAL_BLOCK_STATE; + public static final Object Serializers$BOOLEAN; + public static final Object Serializers$PARTICLE; + public static final Object Serializers$PARTICLES; + public static final Object Serializers$ROTATIONS; + public static final Object Serializers$BLOCK_POS; + public static final Object Serializers$OPTIONAL_BLOCK_POS; + public static final Object Serializers$DIRECTION; + public static final Object Serializers$OPTIONAL_UUID; + public static final Object Serializers$OPTIONAL_GLOBAL_POS; + public static final Object Serializers$COMPOUND_TAG; + public static final Object Serializers$VILLAGER_DATA; + public static final Object Serializers$OPTIONAL_UNSIGNED_INT; + public static final Object Serializers$POSE; + public static final Object Serializers$CAT_VARIANT; + public static final Object Serializers$WOLF_VARIANT; + public static final Object Serializers$FROG_VARIANT; + public static final Object Serializers$PAINTING_VARIANT; + public static final Object Serializers$ARMADILLO_STATE; + public static final Object Serializers$SNIFFER_STATE; + public static final Object Serializers$VECTOR3; + public static final Object Serializers$QUATERNION; + + static { + try { + Serializers$BYTE = initSerializersByName("BYTE"); + Serializers$INT = initSerializersByName("INT"); + Serializers$LONG = initSerializersByName("LONG"); + Serializers$FLOAT = initSerializersByName("FLOAT"); + Serializers$STRING = initSerializersByName("STRING"); + Serializers$COMPONENT = initSerializersByName("COMPONENT"); + Serializers$OPTIONAL_COMPONENT = initSerializersByName("OPTIONAL_COMPONENT"); + Serializers$ITEM_STACK = initSerializersByName("ITEM_STACK"); + Serializers$BLOCK_STATE = initSerializersByName("BLOCK_STATE"); + Serializers$OPTIONAL_BLOCK_STATE = initSerializersByName("OPTIONAL_BLOCK_STATE"); + Serializers$BOOLEAN = initSerializersByName("BOOLEAN"); + Serializers$PARTICLE = initSerializersByName("PARTICLE"); + if (VersionHelper.isVersionNewerThan1_20_5()) Serializers$PARTICLES = initSerializersByName("PARTICLES"); + else Serializers$PARTICLES = null; + Serializers$ROTATIONS = initSerializersByName("ROTATIONS"); + Serializers$BLOCK_POS = initSerializersByName("BLOCK_POS"); + Serializers$OPTIONAL_BLOCK_POS = initSerializersByName("OPTIONAL_BLOCK_POS"); + Serializers$DIRECTION = initSerializersByName("DIRECTION"); + Serializers$OPTIONAL_UUID = initSerializersByName("OPTIONAL_UUID"); + Serializers$OPTIONAL_GLOBAL_POS = initSerializersByName("OPTIONAL_GLOBAL_POS"); + Serializers$COMPOUND_TAG = initSerializersByName("COMPOUND_TAG"); + Serializers$VILLAGER_DATA = initSerializersByName("VILLAGER_DATA"); + Serializers$OPTIONAL_UNSIGNED_INT = initSerializersByName("OPTIONAL_UNSIGNED_INT"); + Serializers$POSE = initSerializersByName("POSE"); + Serializers$CAT_VARIANT = initSerializersByName("CAT_VARIANT"); + if (VersionHelper.isVersionNewerThan1_20_5()) Serializers$WOLF_VARIANT = initSerializersByName("WOLF_VARIANT"); + else Serializers$WOLF_VARIANT = null; + Serializers$FROG_VARIANT = initSerializersByName("FROG_VARIANT"); + Serializers$PAINTING_VARIANT = initSerializersByName("PAINTING_VARIANT"); + if (VersionHelper.isVersionNewerThan1_20_5()) Serializers$ARMADILLO_STATE = initSerializersByName("ARMADILLO_STATE"); + else Serializers$ARMADILLO_STATE = null; + Serializers$SNIFFER_STATE = initSerializersByName("SNIFFER_STATE"); + Serializers$VECTOR3 = initSerializersByName("VECTOR3"); + Serializers$QUATERNION = initSerializersByName("QUATERNION"); + } catch (ReflectiveOperationException e) { + throw new ExceptionInInitializerError(e); + } + } + + private static Object initSerializersByName(String name) throws ReflectiveOperationException { + return ReflectionUtils.getDeclaredField(Reflections.clazz$EntityDataSerializers, new String[]{fieldsObf[internalID++], name}).get(null); + } + + private EntityDataValue() { + throw new IllegalAccessError("Utility class"); + } + + public static Object create(int id, Object serializer, Object value) { + try { + Object entityDataAccessor = Reflections.constructor$EntityDataAccessor.newInstance(id, serializer); + return Reflections.method$SynchedEntityData$DataValue$create.invoke(null, entityDataAccessor, value); + } catch (ReflectiveOperationException e) { + throw new RuntimeException(e); + } + } +} diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/entity/InteractionEntityData.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/entity/InteractionEntityData.java new file mode 100644 index 000000000..3193c0d13 --- /dev/null +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/entity/InteractionEntityData.java @@ -0,0 +1,60 @@ +package net.momirealms.craftengine.bukkit.entity; + +import net.momirealms.craftengine.core.util.VersionHelper; + +import java.util.List; + +public class InteractionEntityData { + + private final int id; + private final Object serializer; + private final T defaultValue; + + // Entity + public static final InteractionEntityData EntityMasks = of(0, EntityDataValue.Serializers$BYTE, (byte) 0); + // Interaction only + public static final InteractionEntityData Width = of(8, EntityDataValue.Serializers$FLOAT, 1F); + public static final InteractionEntityData Height = of(9, EntityDataValue.Serializers$FLOAT, 1F); + public static final InteractionEntityData Responsive = of(10, EntityDataValue.Serializers$BOOLEAN, false); + + public static InteractionEntityData of(final int id, final Object serializer, T defaultValue) { + return new InteractionEntityData<>(id, serializer, defaultValue); + } + + public InteractionEntityData(int id, Object serializer, T defaultValue) { + if (!VersionHelper.isVersionNewerThan1_20_2()) { + if (id >= 11) { + id--; + } + } + this.id = id; + this.serializer = serializer; + this.defaultValue = defaultValue; + } + + public Object serializer() { + return serializer; + } + + public int id() { + return id; + } + + public T defaultValue() { + return defaultValue; + } + + public Object createEntityDataIfNotDefaultValue(T value) { + if (defaultValue().equals(value)) return null; + return EntityDataValue.create(id, serializer, value); + } + + public void addEntityDataIfNotDefaultValue(T value, List list) { + if (defaultValue().equals(value)) return; + list.add(EntityDataValue.create(id, serializer, value)); + } + + public void addEntityData(T value, List list) { + list.add(EntityDataValue.create(id, serializer, value)); + } +} diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/entity/furniture/BukkitFurnitureManager.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/entity/furniture/BukkitFurnitureManager.java new file mode 100644 index 000000000..7967d8078 --- /dev/null +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/entity/furniture/BukkitFurnitureManager.java @@ -0,0 +1,354 @@ +package net.momirealms.craftengine.bukkit.entity.furniture; + +import it.unimi.dsi.fastutil.ints.IntOpenHashSet; +import it.unimi.dsi.fastutil.ints.IntSet; +import net.momirealms.craftengine.bukkit.plugin.BukkitCraftEngine; +import net.momirealms.craftengine.bukkit.util.EntityUtils; +import net.momirealms.craftengine.core.entity.furniture.*; +import net.momirealms.craftengine.core.loot.LootTable; +import net.momirealms.craftengine.core.pack.Pack; +import net.momirealms.craftengine.core.plugin.config.ConfigManager; +import net.momirealms.craftengine.core.plugin.scheduler.SchedulerTask; +import net.momirealms.craftengine.core.util.Key; +import net.momirealms.craftengine.core.util.MiscUtils; +import net.momirealms.craftengine.core.util.VersionHelper; +import org.bukkit.*; +import org.bukkit.entity.*; +import org.bukkit.event.HandlerList; +import org.bukkit.event.Listener; +import org.bukkit.persistence.PersistentDataType; +import org.jetbrains.annotations.NotNull; +import org.joml.Vector3f; + +import javax.annotation.Nullable; +import java.nio.file.Path; +import java.util.*; +import java.util.concurrent.ConcurrentHashMap; + +public class BukkitFurnitureManager implements FurnitureManager { + public static final NamespacedKey FURNITURE_KEY = Objects.requireNonNull(NamespacedKey.fromString("craftengine:furniture_id")); + public static final NamespacedKey FURNITURE_ANCHOR_KEY = Objects.requireNonNull(NamespacedKey.fromString("craftengine:anchor_type")); + public static final NamespacedKey FURNITURE_SEAT_BASE_ENTITY_KEY = Objects.requireNonNull(NamespacedKey.fromString("craftengine:seat_to_base_entity")); + public static final NamespacedKey FURNITURE_SEAT_VECTOR_3F_KEY = Objects.requireNonNull(NamespacedKey.fromString("craftengine:seat_vector")); + private static BukkitFurnitureManager instance; + private final BukkitCraftEngine plugin; + + private final Map byId = new HashMap<>(); + + private final Map furnitureByBaseEntityId = new ConcurrentHashMap<>(256, 0.5f); + private final Map furnitureByInteractionEntityId = new ConcurrentHashMap<>(512, 0.5f); + private final Map baseEntity2SubEntities = new ConcurrentHashMap<>(256, 0.5f); + + // Delay furniture cache remove for about 4-5 ticks + private static final int DELAYED_TICK = 5; + private final IntSet[] delayedRemove = new IntSet[DELAYED_TICK]; + // Event listeners + private final Listener dismountListener; + private final FurnitureEventListener furnitureEventListener; + // tick task + private SchedulerTask tickTask; + + public static BukkitFurnitureManager instance() { + return instance; + } + + public BukkitFurnitureManager(BukkitCraftEngine plugin) { + this.plugin = plugin; + this.furnitureEventListener = new FurnitureEventListener(this); + this.dismountListener = VersionHelper.isVersionNewerThan1_20_3() ? new DismountListener1_20_3(this) : new DismountListener1_20(this::handleDismount); + for (int i = 0; i < DELAYED_TICK; i++) { + this.delayedRemove[i] = new IntOpenHashSet(); + } + instance = this; + } + + public LoadedFurniture place(CustomFurniture furniture, Location location, AnchorType anchorType, boolean playSound) { + Entity furnitureEntity = EntityUtils.spawnEntity(location.getWorld(), location, EntityType.ITEM_DISPLAY, entity -> { + ItemDisplay display = (ItemDisplay) entity; + display.getPersistentDataContainer().set(BukkitFurnitureManager.FURNITURE_KEY, PersistentDataType.STRING, furniture.id().toString()); + display.getPersistentDataContainer().set(BukkitFurnitureManager.FURNITURE_ANCHOR_KEY, PersistentDataType.STRING, anchorType.name()); + handleEntityLoadEarly(display); + }); + if (playSound) { + location.getWorld().playSound(location, furniture.settings().sounds().placeSound().toString(), SoundCategory.BLOCKS,1f, 1f); + } + return getLoadedFurnitureByBaseEntityId(furnitureEntity.getEntityId()); + } + + @SuppressWarnings("unchecked") + @Override + public void parseSection(Pack pack, Path path, Key id, Map section) { + Map lootMap = MiscUtils.castToMap(section.get("loot"), true); + Map settingsMap = MiscUtils.castToMap(section.get("settings"), true); + Map placementMap = MiscUtils.castToMap(section.get("placement"), true); + EnumMap placements = new EnumMap<>(AnchorType.class); + if (placementMap == null) { + throw new IllegalArgumentException("Missing required parameter 'placement' for furniture " + id); + } + for (Map.Entry entry : placementMap.entrySet()) { + AnchorType anchorType = AnchorType.valueOf(entry.getKey().toUpperCase(Locale.ENGLISH)); + Map placementArguments = MiscUtils.castToMap(entry.getValue(), true); + + List elements = new ArrayList<>(); + List> elementConfigs = (List>) placementArguments.getOrDefault("elements", List.of()); + for (Map element : elementConfigs) { + String key = (String) element.get("item"); + if (key == null) { + throw new IllegalArgumentException("Missing required parameter 'item' for furniture " + id); + } + ItemDisplayContext transform = ItemDisplayContext.valueOf(element.getOrDefault("transform", "NONE").toString().toUpperCase(Locale.ENGLISH)); + Billboard billboard = Billboard.valueOf(element.getOrDefault("billboard", "FIXED").toString().toUpperCase(Locale.ENGLISH)); + FurnitureElement furnitureElement = new FurnitureElement(Key.of(key), billboard, transform, + MiscUtils.getVector3f(element.getOrDefault("scale", "1")), + MiscUtils.getVector3f(element.getOrDefault("translation", "0")), + MiscUtils.getVector3f(element.getOrDefault("position", "0")), + MiscUtils.getQuaternionf(element.getOrDefault("rotation", "0")) + ); + elements.add(furnitureElement); + } + List> hitboxConfigs = (List>) placementArguments.getOrDefault("hitboxes", List.of()); + List hitboxes = new ArrayList<>(); + for (Map config : hitboxConfigs) { + List seats = (List) config.getOrDefault("seats", List.of()); + Seat[] seatArray = seats.stream() + .map(arg -> { + String[] split = arg.split(" "); + if (split.length == 1) return new Seat(MiscUtils.getVector3f(split[0]), 0, false); + return new Seat(MiscUtils.getVector3f(split[0]), Float.parseFloat(split[1]), true); + }) + .toArray(Seat[]::new); + Vector3f position = MiscUtils.getVector3f(config.getOrDefault("position", "0")); + float width = MiscUtils.getAsFloat(config.getOrDefault("width", "1")); + float height = MiscUtils.getAsFloat(config.getOrDefault("height", "1")); + HitBox hitBox = new HitBox( + position, + new Vector3f(width, height, width), + seatArray, + (boolean) config.getOrDefault("interactive", true) + ); + hitboxes.add(hitBox); + } + if (hitboxes.isEmpty()) { + hitboxes.add(new HitBox( + new Vector3f(), + new Vector3f(1,1,1), + new Seat[0], + true + )); + } + Map ruleSection = MiscUtils.castToMap(placementArguments.get("rules"), true); + if (ruleSection != null) { + RotationRule rotationRule = Optional.ofNullable((String) ruleSection.get("rotation")) + .map(it -> RotationRule.valueOf(it.toUpperCase(Locale.ENGLISH))) + .orElse(RotationRule.ANY); + AlignmentRule alignmentRule = Optional.ofNullable((String) ruleSection.get("alignment")) + .map(it -> AlignmentRule.valueOf(it.toUpperCase(Locale.ENGLISH))) + .orElse(AlignmentRule.CENTER); + placements.put(anchorType, new CustomFurniture.Placement( + elements.toArray(new FurnitureElement[0]), + hitboxes.toArray(new HitBox[0]), + rotationRule, + alignmentRule + )); + } else { + placements.put(anchorType, new CustomFurniture.Placement( + elements.toArray(new FurnitureElement[0]), + hitboxes.toArray(new HitBox[0]), + RotationRule.ANY, + AlignmentRule.CENTER + )); + } + } + + CustomFurniture furniture = new CustomFurniture( + id, + FurnitureSettings.fromMap(settingsMap), + placements, + lootMap == null ? null : LootTable.fromMap(lootMap) + ); + + this.byId.put(id, furniture); + } + + public void tick() { + IntSet first = this.delayedRemove[0]; + for (int i : first) { + // unloaded furniture might be loaded again + LoadedFurniture furniture = getLoadedFurnitureByBaseEntityId(i); + if (furniture == null) + this.baseEntity2SubEntities.remove(i); + } + first.clear(); + for (int i = 1; i < DELAYED_TICK; i++) { + this.delayedRemove[i - 1] = this.delayedRemove[i]; + } + this.delayedRemove[DELAYED_TICK-1] = first; + } + + @Override + public void delayedInit() { + Bukkit.getPluginManager().registerEvents(this.dismountListener, this.plugin.bootstrap()); + Bukkit.getPluginManager().registerEvents(this.furnitureEventListener, this.plugin.bootstrap()); + this.tickTask = plugin.scheduler().sync().runRepeating(this::tick, 1, 1); + for (World world : Bukkit.getWorlds()) { + List entities = world.getEntities(); + for (Entity entity : entities) { + handleEntityLoadEarly(entity); + } + } + } + + @Override + public void unload() { + this.byId.clear(); + } + + @Override + public void disable() { + HandlerList.unregisterAll(this.dismountListener); + HandlerList.unregisterAll(this.furnitureEventListener); + if (tickTask != null && !tickTask.cancelled()) { + tickTask.cancel(); + } + unload(); + for (Player player : Bukkit.getOnlinePlayers()) { + Entity vehicle = player.getVehicle(); + if (vehicle != null) { + tryLeavingSeat(player, vehicle); + } + } + } + + @Override + public Optional getFurniture(Key id) { + return Optional.ofNullable(this.byId.get(id)); + } + + @Nullable + @Override + public int[] getSubEntityIdsByBaseEntityId(int entityId) { + return this.baseEntity2SubEntities.get(entityId); + } + + @Override + public boolean isFurnitureBaseEntity(int entityId) { + return this.furnitureByBaseEntityId.containsKey(entityId); + } + + @Nullable + public LoadedFurniture getLoadedFurnitureByBaseEntityId(int entityId) { + return this.furnitureByBaseEntityId.get(entityId); + } + + @Nullable + public LoadedFurniture getLoadedFurnitureByInteractionEntityId(int entityId) { + return this.furnitureByInteractionEntityId.get(entityId); + } + + protected void handleEntityUnload(Entity entity) { + int id = entity.getEntityId(); + LoadedFurniture furniture = this.furnitureByBaseEntityId.remove(id); + if (furniture != null) { + furniture.destroySeats(); + for (int sub : furniture.interactionEntityIds()) { + this.furnitureByInteractionEntityId.remove(sub); + } + this.delayedRemove[DELAYED_TICK-1].add(id); + } + } + + @SuppressWarnings("deprecation") // just a misleading name `getTrackedPlayers` + protected void handleEntityLoadLate(Entity entity) { + if (entity instanceof ItemDisplay display) { + String id = entity.getPersistentDataContainer().get(FURNITURE_KEY, PersistentDataType.STRING); + if (id == null) return; + Key key = Key.of(id); + Optional optionalFurniture = getFurniture(key); + if (optionalFurniture.isEmpty()) return; + CustomFurniture customFurniture = optionalFurniture.get(); + LoadedFurniture previous = this.furnitureByBaseEntityId.get(display.getEntityId()); + if (previous != null) return; + LoadedFurniture furniture = addNewFurniture(display, customFurniture, getAnchorType(entity, customFurniture)); + for (Player player : display.getTrackedPlayers()) { + this.plugin.networkManager().sendPacket(player, furniture.spawnPacket()); + } + } + } + + public void handleEntityLoadEarly(Entity entity) { + if (entity instanceof ItemDisplay display) { + String id = entity.getPersistentDataContainer().get(FURNITURE_KEY, PersistentDataType.STRING); + if (id == null) return; + Key key = Key.of(id); + Optional optionalFurniture = getFurniture(key); + if (optionalFurniture.isPresent()) { + CustomFurniture customFurniture = optionalFurniture.get(); + LoadedFurniture previous = this.furnitureByBaseEntityId.get(display.getEntityId()); + if (previous != null) return; + addNewFurniture(display, customFurniture, getAnchorType(entity, customFurniture)); + return; + } + // Remove the entity if it's not a valid furniture + if (ConfigManager.removeInvalidFurniture()) { + if (ConfigManager.furnitureToRemove().isEmpty() || ConfigManager.furnitureToRemove().contains(id)) { + entity.remove(); + } + } + } + } + + private AnchorType getAnchorType(Entity baseEntity, CustomFurniture furniture) { + String anchorType = baseEntity.getPersistentDataContainer().get(FURNITURE_ANCHOR_KEY, PersistentDataType.STRING); + if (anchorType != null) { + try { + AnchorType unverified = AnchorType.valueOf(anchorType); + if (furniture.isAllowedPlacement(unverified)) { + return unverified; + } + } catch (IllegalArgumentException ignored) { + } + } + AnchorType anchorTypeEnum = furniture.getAnyPlacement(); + baseEntity.getPersistentDataContainer().set(FURNITURE_ANCHOR_KEY, PersistentDataType.STRING, anchorTypeEnum.name()); + return anchorTypeEnum; + } + + private synchronized LoadedFurniture addNewFurniture(ItemDisplay display, CustomFurniture furniture, AnchorType anchorType) { + LoadedFurniture loadedFurniture = new LoadedFurniture(display, furniture, anchorType); + this.furnitureByBaseEntityId.put(loadedFurniture.baseEntityId(), loadedFurniture); + this.baseEntity2SubEntities.put(loadedFurniture.baseEntityId(), loadedFurniture.subEntityIds()); + for (int entityId : loadedFurniture.interactionEntityIds()) { + this.furnitureByInteractionEntityId.put(entityId, loadedFurniture); + } + return loadedFurniture; + } + + protected void handleDismount(Player player, Entity entity) { + if (!isSeatCarrierType(entity)) return; + Location location = entity.getLocation(); + plugin.scheduler().sync().runDelayed(() -> tryLeavingSeat(player, entity), player.getWorld(), location.getBlockX() >> 4, location.getBlockZ() >> 4); + } + + protected void tryLeavingSeat(@NotNull Player player, @NotNull Entity vehicle) { + Integer baseFurniture = vehicle.getPersistentDataContainer().get(FURNITURE_SEAT_BASE_ENTITY_KEY, PersistentDataType.INTEGER); + if (baseFurniture == null) return; + vehicle.remove(); + LoadedFurniture furniture = getLoadedFurnitureByBaseEntityId(baseFurniture); + if (furniture == null) { + return; + } + String vector3f = vehicle.getPersistentDataContainer().get(BukkitFurnitureManager.FURNITURE_SEAT_VECTOR_3F_KEY, PersistentDataType.STRING); + if (vector3f == null) { + plugin.logger().warn("Failed to get vector3f for player " + player.getName() + "'s seat"); + return; + } + Vector3f seatPos = MiscUtils.getVector3f(vector3f); + if (!furniture.releaseSeat(seatPos)) { + plugin.logger().warn("Failed to release seat " + seatPos + " for player " + player.getName()); + } + } + + protected boolean isSeatCarrierType(Entity entity) { + return (entity instanceof ArmorStand || entity instanceof ItemDisplay); + } +} diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/entity/furniture/DismountListener1_20_3.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/entity/furniture/DismountListener1_20_3.java new file mode 100644 index 000000000..a35b48ff7 --- /dev/null +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/entity/furniture/DismountListener1_20_3.java @@ -0,0 +1,21 @@ +package net.momirealms.craftengine.bukkit.entity.furniture; + +import org.bukkit.entity.Player; +import org.bukkit.event.EventHandler; +import org.bukkit.event.Listener; +import org.bukkit.event.entity.EntityDismountEvent; + +public class DismountListener1_20_3 implements Listener { + private final BukkitFurnitureManager manager; + + public DismountListener1_20_3(final BukkitFurnitureManager manager) { + this.manager = manager; + } + + @EventHandler(ignoreCancelled = true) + public void onDismount(EntityDismountEvent event) { + if (event.getEntity() instanceof Player player) { + this.manager.handleDismount(player, event.getDismounted()); + } + } +} diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/entity/furniture/FurnitureEventListener.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/entity/furniture/FurnitureEventListener.java new file mode 100644 index 000000000..79de897cc --- /dev/null +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/entity/furniture/FurnitureEventListener.java @@ -0,0 +1,108 @@ +package net.momirealms.craftengine.bukkit.entity.furniture; + +import com.destroystokyo.paper.event.entity.EntityAddToWorldEvent; +import com.destroystokyo.paper.event.entity.EntityRemoveFromWorldEvent; +import org.bukkit.entity.ArmorStand; +import org.bukkit.entity.Entity; +import org.bukkit.entity.Player; +import org.bukkit.event.EventHandler; +import org.bukkit.event.EventPriority; +import org.bukkit.event.Listener; +import org.bukkit.event.entity.PlayerDeathEvent; +import org.bukkit.event.player.PlayerInteractAtEntityEvent; +import org.bukkit.event.player.PlayerQuitEvent; +import org.bukkit.event.world.ChunkUnloadEvent; +import org.bukkit.event.world.EntitiesLoadEvent; +import org.bukkit.event.world.WorldLoadEvent; +import org.bukkit.event.world.WorldUnloadEvent; +import org.bukkit.persistence.PersistentDataType; + +import java.util.List; + +public class FurnitureEventListener implements Listener { + private final BukkitFurnitureManager manager; + + public FurnitureEventListener(final BukkitFurnitureManager manager) { + this.manager = manager; + } + + /* + * Load Entities + */ + @EventHandler(ignoreCancelled = true, priority = EventPriority.LOWEST) + public void onEntitiesLoadEarly(EntitiesLoadEvent event) { + List entities = event.getEntities(); + for (Entity entity : entities) { + this.manager.handleEntityLoadEarly(entity); + } + } + + @EventHandler(ignoreCancelled = true, priority = EventPriority.LOWEST) + public void onWorldLoad(WorldLoadEvent event) { + List entities = event.getWorld().getEntities(); + for (Entity entity : entities) { + this.manager.handleEntityLoadEarly(entity); + } + } + + @EventHandler(ignoreCancelled = true, priority = EventPriority.LOWEST) + public void onEntityLoad(EntityAddToWorldEvent event) { + this.manager.handleEntityLoadLate(event.getEntity()); + } + + /* + * Unload Entities + */ + @EventHandler(ignoreCancelled = true, priority = EventPriority.HIGHEST) + public void onChunkUnload(ChunkUnloadEvent event) { + Entity[] entities = event.getChunk().getEntities(); + for (Entity entity : entities) { + this.manager.handleEntityUnload(entity); + } + } + + @EventHandler(ignoreCancelled = true, priority = EventPriority.HIGHEST) + public void onWorldUnload(WorldUnloadEvent event) { + List entities = event.getWorld().getEntities(); + for (Entity entity : entities) { + this.manager.handleEntityUnload(entity); + } + } + + @EventHandler(ignoreCancelled = true, priority = EventPriority.HIGHEST) + public void onEntityUnload(EntityRemoveFromWorldEvent event) { + this.manager.handleEntityUnload(event.getEntity()); + } + + + @EventHandler(ignoreCancelled = true) + public void onPlayerQuit(PlayerQuitEvent event) { + Player player = event.getPlayer(); + Entity entity = player.getVehicle(); + if (entity == null) return; + if (this.manager.isSeatCarrierType(entity)) { + this.manager.tryLeavingSeat(player, entity); + } + } + + @EventHandler(ignoreCancelled = true) + public void onPlayerDeath(PlayerDeathEvent event) { + Player player = event.getPlayer(); + Entity entity = player.getVehicle(); + if (entity == null) return; + if (this.manager.isSeatCarrierType(entity)) { + this.manager.tryLeavingSeat(player, entity); + } + } + + // do not allow players to put item on seats + @EventHandler(ignoreCancelled = true, priority = EventPriority.LOWEST) + public void onInteractArmorStand(PlayerInteractAtEntityEvent event) { + Entity clicked = event.getRightClicked(); + if (clicked instanceof ArmorStand armorStand) { + Integer baseFurniture = armorStand.getPersistentDataContainer().get(BukkitFurnitureManager.FURNITURE_SEAT_BASE_ENTITY_KEY, PersistentDataType.INTEGER); + if (baseFurniture == null) return; + event.setCancelled(true); + } + } +} diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/entity/furniture/LoadedFurniture.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/entity/furniture/LoadedFurniture.java new file mode 100644 index 000000000..a39858e62 --- /dev/null +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/entity/furniture/LoadedFurniture.java @@ -0,0 +1,289 @@ +package net.momirealms.craftengine.bukkit.entity.furniture; + +import net.momirealms.craftengine.bukkit.entity.DisplayEntityData; +import net.momirealms.craftengine.bukkit.entity.InteractionEntityData; +import net.momirealms.craftengine.bukkit.item.BukkitItemManager; +import net.momirealms.craftengine.bukkit.util.EntityUtils; +import net.momirealms.craftengine.bukkit.util.LegacyAttributeUtils; +import net.momirealms.craftengine.bukkit.util.Reflections; +import net.momirealms.craftengine.core.entity.furniture.*; +import net.momirealms.craftengine.core.item.Item; +import net.momirealms.craftengine.core.plugin.CraftEngine; +import net.momirealms.craftengine.core.util.ArrayUtils; +import net.momirealms.craftengine.core.util.Key; +import net.momirealms.craftengine.core.util.QuaternionUtils; +import net.momirealms.craftengine.core.util.VersionHelper; +import org.bukkit.Location; +import org.bukkit.attribute.Attribute; +import org.bukkit.entity.ArmorStand; +import org.bukkit.entity.Entity; +import org.bukkit.entity.EntityType; +import org.bukkit.entity.ItemDisplay; +import org.bukkit.inventory.ItemStack; +import org.bukkit.persistence.PersistentDataType; +import org.jetbrains.annotations.NotNull; +import org.joml.Vector3f; + +import java.lang.ref.WeakReference; +import java.util.*; + +public class LoadedFurniture { + private final Key id; + private final CustomFurniture furniture; + private final AnchorType anchorType; + private final Map elements; + private final Map hitBoxes; + // location + private Location location; + // cached spawn packet + private Object cachedSpawnPacket; + // base entity + private final WeakReference baseEntity; + private final int baseEntityId; + // includes elements + interactions + private final int[] subEntityIds; + // interactions + private final int[] interactionEntityIds; + // seats + private final Set occupiedSeats = Collections.synchronizedSet(new HashSet<>()); + private final Vector seats = new Vector<>(); + + public LoadedFurniture(Entity baseEntity, + CustomFurniture furniture, + AnchorType anchorType) { + this.id = furniture.id(); + this.baseEntityId = baseEntity.getEntityId(); + this.anchorType = anchorType; + this.location = baseEntity.getLocation(); + this.baseEntity = new WeakReference<>(baseEntity); + this.furniture = furniture; + this.hitBoxes = new HashMap<>(); + this.elements = new HashMap<>(); + List entityIds = new ArrayList<>(); + List interactionEntityIds = new ArrayList<>(); + CustomFurniture.Placement placement = furniture.getPlacement(anchorType); + for (FurnitureElement element : placement.elements()) { + int entityId = Reflections.instance$Entity$ENTITY_COUNTER.incrementAndGet(); + entityIds.add(entityId); + this.elements.put(entityId, element); + } + for (HitBox hitBox : placement.hitbox()) { + int entityId = Reflections.instance$Entity$ENTITY_COUNTER.incrementAndGet(); + entityIds.add(entityId); + interactionEntityIds.add(entityId); + this.hitBoxes.put(entityId, hitBox); + } + this.subEntityIds = new int[entityIds.size()]; + for (int i = 0; i < entityIds.size(); ++i) { + this.subEntityIds[i] = entityIds.get(i); + } + this.interactionEntityIds = new int[interactionEntityIds.size()]; + for (int i = 0; i < interactionEntityIds.size(); ++i) { + this.interactionEntityIds[i] = interactionEntityIds.get(i); + } + } + + private void resetSpawnPackets() { + try { + List packets = new ArrayList<>(); + for (Map.Entry entry : elements.entrySet()) { + int entityId = entry.getKey(); + FurnitureElement element = entry.getValue(); + Item item = BukkitItemManager.instance().createWrappedItem(element.item(), null); + if (item == null) { + CraftEngine.instance().logger().warn("Failed to create furniture element for " + id + " because item " + element.item() + " not found"); + continue; + } + item.load(); + + Vector3f offset = QuaternionUtils.toQuaternionf(0, Math.toRadians(180 - this.location.getYaw()), 0).conjugate().transform(new Vector3f(element.offset())); + Object addEntityPacket = Reflections.constructor$ClientboundAddEntityPacket.newInstance( + entityId, UUID.randomUUID(), this.location.getX() + offset.x, this.location.getY() + offset.y, this.location.getZ() - offset.z, 0, this.location.getYaw(), + Reflections.instance$EntityType$ITEM_DISPLAY, 0, Reflections.instance$Vec3$Zero, 0 + ); + + ArrayList values = new ArrayList<>(); + DisplayEntityData.DisplayedItem.addEntityDataIfNotDefaultValue(item.getLiteralObject(), values); + DisplayEntityData.Scale.addEntityDataIfNotDefaultValue(element.scale(), values); + DisplayEntityData.RotationLeft.addEntityDataIfNotDefaultValue(element.rotation(), values); + DisplayEntityData.BillboardConstraints.addEntityDataIfNotDefaultValue(element.billboard().id(), values); + DisplayEntityData.Translation.addEntityDataIfNotDefaultValue(element.translation(), values); + DisplayEntityData.DisplayType.addEntityDataIfNotDefaultValue(element.transform().id(), values); + Object setDataPacket = Reflections.constructor$ClientboundSetEntityDataPacket.newInstance(entityId, values); + + packets.add(addEntityPacket); + packets.add(setDataPacket); + } + for (Map.Entry entry : hitBoxes.entrySet()) { + int entityId = entry.getKey(); + HitBox hitBox = entry.getValue(); + Vector3f offset = QuaternionUtils.toQuaternionf(0, Math.toRadians(180 - this.location.getYaw()), 0).conjugate().transform(new Vector3f(hitBox.offset())); + Object addEntityPacket = Reflections.constructor$ClientboundAddEntityPacket.newInstance( + entityId, UUID.randomUUID(), this.location.getX() + offset.x, this.location.getY() + offset.y, this.location.getZ() - offset.z, 0, this.location.getYaw(), + Reflections.instance$EntityType$INTERACTION, 0, Reflections.instance$Vec3$Zero, 0 + ); + + ArrayList values = new ArrayList<>(); + InteractionEntityData.Height.addEntityDataIfNotDefaultValue(hitBox.size().y, values); + InteractionEntityData.Width.addEntityDataIfNotDefaultValue(hitBox.size().x, values); + InteractionEntityData.Responsive.addEntityDataIfNotDefaultValue(hitBox.responsive(), values); + Object setDataPacket = Reflections.constructor$ClientboundSetEntityDataPacket.newInstance(entityId, values); + + packets.add(addEntityPacket); + packets.add(setDataPacket); + } + this.cachedSpawnPacket = Reflections.constructor$ClientboundBundlePacket.newInstance(packets); + } catch (Exception e) { + CraftEngine.instance().logger().warn("Failed to init spawn packets for furniture " + id, e); + } + } + + @NotNull + public Location location() { + return this.location; + } + + public void teleport(@NotNull Location location) { + if (location.equals(this.location)) return; + this.location = location; + } + + public Object spawnPacket() { + if (this.cachedSpawnPacket == null) { + this.resetSpawnPackets(); + } + return this.cachedSpawnPacket; + } + + @NotNull + public Entity baseEntity() { + Entity entity = baseEntity.get(); + if (entity == null) { + throw new RuntimeException("Base entity not found"); + } + return entity; + } + + public boolean isValid() { + return baseEntity().isValid(); + } + + public void destroy() { + if (!isValid()) { + return; + } + this.baseEntity().remove(); + for (Entity entity : this.seats) { + for (Entity passenger : entity.getPassengers()) { + entity.removePassenger(passenger); + } + entity.remove(); + } + this.seats.clear(); + } + + public void destroySeats() { + for (Entity entity : this.seats) { + entity.remove(); + } + this.seats.clear(); + } + + public void addSeatEntity(Entity entity) { + this.seats.add(entity); + } + + public Optional getAvailableSeat(int clickedEntityId) { + HitBox hitbox = this.hitBoxes.get(clickedEntityId); + if (hitbox == null) + return Optional.empty(); + Seat[] seats = hitbox.seats(); + if (ArrayUtils.isEmpty(seats)) { + return Optional.empty(); + } + for (Seat seat : seats) { + if (!this.occupiedSeats.contains(seat.offset())) { + return Optional.of(seat); + } + } + return Optional.empty(); + } + + public Location getSeatLocation(Seat seat) { + Vector3f offset = QuaternionUtils.toQuaternionf(0, Math.toRadians(180 - this.location.getYaw()), 0).conjugate().transform(new Vector3f(seat.offset())); + double yaw = seat.yaw() + this.location.getYaw(); + if (yaw < -180) yaw += 360; + Location newLocation = this.location.clone(); + newLocation.setYaw((float) yaw); + newLocation.add(offset.x, offset.y + 0.6, -offset.z); + return newLocation; + } + + public boolean releaseSeat(Vector3f seat) { + return this.occupiedSeats.remove(seat); + } + + public boolean occupySeat(Seat seat) { + if (this.occupiedSeats.contains(seat.offset())) { + return false; + } + this.occupiedSeats.add(seat.offset()); + return true; + } + + public int baseEntityId() { + return baseEntityId; + } + + public int[] interactionEntityIds() { + return interactionEntityIds; + } + + public int[] subEntityIds() { + return this.subEntityIds; + } + + public AnchorType anchorType() { + return anchorType; + } + + public Key furnitureId() { + return id; + } + + public CustomFurniture furniture() { + return furniture; + } + + public void mountSeat(org.bukkit.entity.Player player, Seat seat) { + Location location = this.getSeatLocation(seat); + Entity seatEntity = seat.limitPlayerRotation() ? + EntityUtils.spawnEntity(player.getWorld(), VersionHelper.isVersionNewerThan1_20_2() ? location.subtract(0,0.9875,0) : location.subtract(0,0.990625,0), EntityType.ARMOR_STAND, entity -> { + ArmorStand armorStand = (ArmorStand) entity; + if (VersionHelper.isVersionNewerThan1_21_3()) { + Objects.requireNonNull(armorStand.getAttribute(Attribute.MAX_HEALTH)).setBaseValue(0.01); + } else { + LegacyAttributeUtils.setMaxHealth(armorStand); + } + armorStand.setSmall(true); + armorStand.setInvisible(true); + armorStand.setSilent(true); + armorStand.setInvulnerable(true); + armorStand.setArms(false); + armorStand.setCanTick(false); + armorStand.setAI(false); + armorStand.setGravity(false); + armorStand.setPersistent(false); + armorStand.getPersistentDataContainer().set(BukkitFurnitureManager.FURNITURE_SEAT_BASE_ENTITY_KEY, PersistentDataType.INTEGER, this.baseEntityId()); + armorStand.getPersistentDataContainer().set(BukkitFurnitureManager.FURNITURE_SEAT_VECTOR_3F_KEY, PersistentDataType.STRING, seat.offset().x + ", " + seat.offset().y + ", " + seat.offset().z); + }) : + EntityUtils.spawnEntity(player.getWorld(), VersionHelper.isVersionNewerThan1_20_2() ? location : location.subtract(0,0.25,0), EntityType.ITEM_DISPLAY, entity -> { + ItemDisplay itemDisplay = (ItemDisplay) entity; + itemDisplay.setPersistent(false); + itemDisplay.getPersistentDataContainer().set(BukkitFurnitureManager.FURNITURE_SEAT_BASE_ENTITY_KEY, PersistentDataType.INTEGER, this.baseEntityId()); + itemDisplay.getPersistentDataContainer().set(BukkitFurnitureManager.FURNITURE_SEAT_VECTOR_3F_KEY, PersistentDataType.STRING, seat.offset().x + ", " + seat.offset().y + ", " + seat.offset().z); + }); + this.addSeatEntity(seatEntity); + seatEntity.addPassenger(player); + } +} diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/item/BukkitCustomItem.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/item/BukkitCustomItem.java new file mode 100644 index 000000000..6d32b362d --- /dev/null +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/item/BukkitCustomItem.java @@ -0,0 +1,148 @@ +package net.momirealms.craftengine.bukkit.item; + +import net.momirealms.craftengine.bukkit.plugin.BukkitCraftEngine; +import net.momirealms.craftengine.bukkit.util.MaterialUtils; +import net.momirealms.craftengine.core.item.CustomItem; +import net.momirealms.craftengine.core.item.Item; +import net.momirealms.craftengine.core.item.ItemBuildContext; +import net.momirealms.craftengine.core.item.ItemSettings; +import net.momirealms.craftengine.core.item.behavior.ItemBehavior; +import net.momirealms.craftengine.core.item.modifier.ItemModifier; +import net.momirealms.craftengine.core.util.Key; +import org.bukkit.Material; +import org.bukkit.inventory.ItemStack; +import org.jetbrains.annotations.NotNull; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; + +public class BukkitCustomItem implements CustomItem { + private final Key id; + private final Key materialKey; + private final Material material; + private final List> modifiers; + private final List behavior; + private final ItemSettings settings; + + public BukkitCustomItem(Key id, Key materialKey, Material material, List> modifiers, List behavior, ItemSettings settings) { + this.id = id; + this.material = material; + this.modifiers = modifiers; + this.behavior = behavior; + this.materialKey = materialKey; + this.settings = settings; + } + + @Override + public Key id() { + return id; + } + + @Override + public Key material() { + return materialKey; + } + + @Override + public List> modifiers() { + return modifiers; + } + + @Override + public ItemStack buildItemStack(ItemBuildContext context, int count) { + ItemStack item = new ItemStack(material); + if (this.modifiers.isEmpty()) { + return item; + } + Item wrapped = BukkitCraftEngine.instance().itemManager().wrap(item); + wrapped.count(count); + for (ItemModifier modifier : this.modifiers) { + modifier.apply(wrapped, context); + } + return wrapped.load(); + } + + @Override + public ItemSettings settings() { + return settings; + } + + @Override + public Item buildItem(ItemBuildContext context) { + ItemStack item = new ItemStack(material); + Item wrapped = BukkitCraftEngine.instance().itemManager().wrap(item); + for (ItemModifier modifier : modifiers()) { + modifier.apply(wrapped, context); + } + wrapped.load(); + return wrapped; + } + + @Override + public @NotNull List behaviors() { + return this.behavior; + } + + public static Builder builder() { + return new BuilderImpl(); + } + + public static class BuilderImpl implements Builder { + private Key id; + private Material material; + private Key materialKey; + private List behavior = List.of(); + private ItemSettings settings = ItemSettings.of(); + private final List> modifiers = new ArrayList<>(); + + @Override + public Builder id(Key id) { + this.id = id; + return this; + } + + @Override + public Builder material(Key material) { + this.materialKey = material; + this.material = MaterialUtils.getMaterial(material.value()); + return this; + } + + @Override + public Builder modifier(ItemModifier modifier) { + this.modifiers.add(modifier); + return this; + } + + @Override + public Builder modifiers(List> list) { + this.modifiers.addAll(list); + return this; + } + + @Override + public Builder behavior(ItemBehavior behavior) { + this.behavior= List.of(behavior); + return this; + } + + @Override + public Builder behavior(List behaviors) { + this.behavior = behaviors; + return this; + } + + @Override + public Builder settings(ItemSettings settings) { + this.settings = settings; + return this; + } + + @Override + public CustomItem build() { + this.modifiers.addAll(this.settings.modifiers()); + return new BukkitCustomItem(id, materialKey, material, Collections.unmodifiableList(modifiers), behavior, settings); + } + } +} diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/item/BukkitItemManager.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/item/BukkitItemManager.java new file mode 100644 index 000000000..27691b776 --- /dev/null +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/item/BukkitItemManager.java @@ -0,0 +1,615 @@ +package net.momirealms.craftengine.bukkit.item; + +import net.momirealms.craftengine.bukkit.item.behavior.AxeItemBehavior; +import net.momirealms.craftengine.bukkit.item.behavior.BoneMealBehavior; +import net.momirealms.craftengine.bukkit.item.behavior.BucketItemBehavior; +import net.momirealms.craftengine.bukkit.item.behavior.WaterBucketItemBehavior; +import net.momirealms.craftengine.bukkit.item.factory.BukkitItemFactory; +import net.momirealms.craftengine.bukkit.plugin.BukkitCraftEngine; +import net.momirealms.craftengine.bukkit.util.ItemUtils; +import net.momirealms.craftengine.bukkit.util.MaterialUtils; +import net.momirealms.craftengine.bukkit.util.Reflections; +import net.momirealms.craftengine.core.entity.player.Player; +import net.momirealms.craftengine.core.item.*; +import net.momirealms.craftengine.core.item.behavior.ItemBehavior; +import net.momirealms.craftengine.core.item.behavior.ItemBehaviors; +import net.momirealms.craftengine.core.item.modifier.CustomModelDataModifier; +import net.momirealms.craftengine.core.item.modifier.IdModifier; +import net.momirealms.craftengine.core.item.modifier.ItemModelModifier; +import net.momirealms.craftengine.core.pack.LegacyOverridesModel; +import net.momirealms.craftengine.core.pack.Pack; +import net.momirealms.craftengine.core.pack.model.*; +import net.momirealms.craftengine.core.pack.model.generator.ModelGeneration; +import net.momirealms.craftengine.core.plugin.config.ConfigManager; +import net.momirealms.craftengine.core.registry.BuiltInRegistries; +import net.momirealms.craftengine.core.registry.Holder; +import net.momirealms.craftengine.core.registry.WritableRegistry; +import net.momirealms.craftengine.core.util.Key; +import net.momirealms.craftengine.core.util.MiscUtils; +import net.momirealms.craftengine.core.util.ResourceKey; +import net.momirealms.craftengine.core.util.VersionHelper; +import net.momirealms.craftengine.core.util.context.ContextHolder; +import org.bukkit.Bukkit; +import org.bukkit.Material; +import org.bukkit.NamespacedKey; +import org.bukkit.Registry; +import org.bukkit.event.HandlerList; +import org.bukkit.inventory.ItemStack; +import org.incendo.cloud.suggestion.Suggestion; +import org.incendo.cloud.type.Either; +import org.jetbrains.annotations.Nullable; + +import java.nio.file.Path; +import java.util.*; +import java.util.stream.Stream; + +public class BukkitItemManager extends AbstractItemManager { + private static final Map> VANILLA_ITEM_EXTRA_BEHAVIORS = new HashMap<>(); + private static final List VANILLA_ITEMS = new ArrayList<>(); + + static { + registerVanillaItemExtraBehavior(AxeItemBehavior.INSTANCE, ItemKeys.AXES); + registerVanillaItemExtraBehavior(WaterBucketItemBehavior.INSTANCE, ItemKeys.WATER_BUCKETS); + registerVanillaItemExtraBehavior(BucketItemBehavior.INSTANCE, ItemKeys.BUCKET); + registerVanillaItemExtraBehavior(BoneMealBehavior.INSTANCE, ItemKeys.BONE_MEAL); + } + + private static void registerVanillaItemExtraBehavior(ItemBehavior behavior, Key... items) { + for (Key key : items) { + VANILLA_ITEM_EXTRA_BEHAVIORS.computeIfAbsent(key, k -> new ArrayList<>()).add(behavior); + } + } + + private static BukkitItemManager instance; + private final BukkitItemFactory factory; + private final Map> legacyOverrides; + private final Map> modernOverrides; + private final BukkitCraftEngine plugin; + private final ItemEventListener itemEventListener; + private final DebugStickListener debugStickListener; + private final Map>> vanillaItemTags; + private final Map>> customItemTags; + private final Map> cmdConflictChecker; + private final Map modernItemModels1_21_4; + private final Map> modernItemModels1_21_2; + // Cached command suggestions + private final List cachedSuggestions = new ArrayList<>(); + + public BukkitItemManager(BukkitCraftEngine plugin) { + super(plugin); + this.plugin = plugin; + this.factory = BukkitItemFactory.create(plugin); + this.legacyOverrides = new HashMap<>(); + this.modernOverrides = new HashMap<>(); + this.vanillaItemTags = new HashMap<>(); + this.customItemTags = new HashMap<>(); + this.cmdConflictChecker = new HashMap<>(); + this.modernItemModels1_21_4 = new HashMap<>(); + this.modernItemModels1_21_2 = new HashMap<>(); + this.itemEventListener = new ItemEventListener(plugin); + this.debugStickListener = new DebugStickListener(plugin); + this.registerAllVanillaItems(); + instance = this; + } + + @Override + public void delayedInit() { + Bukkit.getPluginManager().registerEvents(this.itemEventListener, plugin.bootstrap()); + Bukkit.getPluginManager().registerEvents(this.debugStickListener, plugin.bootstrap()); + } + + public static BukkitItemManager instance() { + return instance; + } + + @Override + public Optional> getVanillaItem(Key key) { + Material material = Registry.MATERIAL.get(Objects.requireNonNull(NamespacedKey.fromString(key.toString()))); + if (material == null) { + return Optional.empty(); + } + return Optional.of(new CloneableConstantItem(key, new ItemStack(material))); + } + + @Override + public List> tagToItems(Key tag) { + List> items = new ArrayList<>(); + List> holders = vanillaItemTags.get(tag); + if (holders != null) { + items.addAll(holders); + } + List> customItems = customItemTags.get(tag); + if (customItems != null) { + items.addAll(customItems); + } + return items; + } + + @Override + public List> tagToVanillaItems(Key tag) { + return this.vanillaItemTags.getOrDefault(tag, List.of()); + } + + @Override + public List> tagToCustomItems(Key tag) { + return this.customItemTags.getOrDefault(tag, List.of()); + } + + @Override + public int fuelTime(ItemStack itemStack) { + if (ItemUtils.isEmpty(itemStack)) return 0; + Optional> customItem = wrap(itemStack).getCustomItem(); + return customItem.map(it -> it.settings().fuelTime()).orElse(0); + } + + @Override + public int fuelTime(Key id) { + return getCustomItem(id).map(it -> it.settings().fuelTime()).orElse(0); + } + + @Override + public Collection cachedSuggestions() { + return this.cachedSuggestions; + } + + @Override + public void load() { + super.load(); + } + + @Override + public void unload() { + super.unload(); + this.cachedSuggestions.clear(); + this.legacyOverrides.clear(); + this.modernOverrides.clear(); + this.customItemTags.clear(); + this.cmdConflictChecker.clear(); + } + + @Override + public void disable() { + unload(); + HandlerList.unregisterAll(this.itemEventListener); + HandlerList.unregisterAll(this.debugStickListener); + } + + @Override + public ItemStack buildCustomItemStack(Key id, Player player) { + return Optional.ofNullable(customItems.get(id)).map(it -> it.buildItemStack(new ItemBuildContext(player, ContextHolder.EMPTY), 1)).orElse(null); + } + + @Override + public ItemStack buildItemStack(Key id, @Nullable Player player) { + return Optional.ofNullable(buildCustomItemStack(id, player)).orElseGet(() -> createVanillaItemStack(id)); + } + + @Override + public Item createCustomWrappedItem(Key id, Player player) { + return Optional.ofNullable(customItems.get(id)).map(it -> it.buildItem(player)).orElse(null); + } + + private ItemStack createVanillaItemStack(Key id) { + NamespacedKey key = NamespacedKey.fromString(id.toString()); + if (key == null) { + this.plugin.logger().warn(id + " is not a valid namespaced key"); + return new ItemStack(Material.AIR); + } + Material material = Registry.MATERIAL.get(key); + if (material == null) { + this.plugin.logger().warn(id + " is not a valid material"); + return new ItemStack(Material.AIR); + } + return new ItemStack(material); + } + + @Override + public Item createWrappedItem(Key id, @Nullable Player player) { + return Optional.ofNullable(customItems.get(id)).map(it -> it.buildItem(player)).orElseGet(() -> { + ItemStack itemStack = createVanillaItemStack(id); + return wrap(itemStack); + }); + } + + @Override + public Item wrap(ItemStack itemStack) { + if (ItemUtils.isEmpty(itemStack)) return null; + return this.factory.wrap(itemStack); + } + + @Override + public Key itemId(ItemStack itemStack) { + Item wrapped = wrap(itemStack); + return wrapped.id(); + } + + @Override + public Key customItemId(ItemStack itemStack) { + Item wrapped = wrap(itemStack); + if (!wrapped.hasTag(IdModifier.CRAFT_ENGINE_ID)) return null; + return wrapped.id(); + } + + @Override + public Optional> getItemBehavior(Key key) { + Optional> customItemOptional = getCustomItem(key); + if (customItemOptional.isPresent()) { + CustomItem customItem = customItemOptional.get(); + Key vanillaMaterial = customItem.material(); + List behavior = VANILLA_ITEM_EXTRA_BEHAVIORS.get(vanillaMaterial); + if (behavior != null) { + return Optional.of(Stream.concat(customItem.behaviors().stream(), behavior.stream()).toList()); + } else { + return Optional.of(List.copyOf(customItem.behaviors())); + } + } else { + List behavior = VANILLA_ITEM_EXTRA_BEHAVIORS.get(key); + if (behavior != null) { + return Optional.of(List.copyOf(behavior)); + } else { + return Optional.empty(); + } + } + } + + @Override + public Collection items() { + return new ArrayList<>(customItems.keySet()); + } + + @Override + public void parseSection(Pack pack, Path path, Key id, Map section) { + // just register and recipes + Holder.Reference holder = BuiltInRegistries.OPTIMIZED_ITEM_ID.get(id) + .orElseGet(() -> ((WritableRegistry) BuiltInRegistries.OPTIMIZED_ITEM_ID) + .register(new ResourceKey<>(BuiltInRegistries.OPTIMIZED_ITEM_ID.key().location(), id), id)); + + String materialStringId = (String) section.get("material"); + Material material = MaterialUtils.getMaterial(materialStringId); + if (material == null) { + plugin.logger().warn(path, "material " + Optional.ofNullable(materialStringId).map(it -> it + " ").orElse("") + "does not exist for item " + id); + return; + } + Key materialId = Key.of(material.getKey().namespace(), material.getKey().value()); + + int customModelData = MiscUtils.getAsInt(section.getOrDefault("custom-model-data", 0)); + Key itemModelKey = null; + + CustomItem.Builder itemBuilder = BukkitCustomItem.builder().id(id).material(materialId); + itemBuilder.modifier(new IdModifier<>(id)); + + // Sets some basic model info + if (customModelData != 0) { + itemBuilder.modifier(new CustomModelDataModifier<>(customModelData)); + } else if (section.containsKey("model") && VersionHelper.isVersionNewerThan1_21_2()) { + // check server version here because components require 1.21.2+ + // customize or use the id + itemModelKey = Key.from(section.getOrDefault("item-model", id.toString()).toString()); + itemBuilder.modifier(new ItemModelModifier<>(itemModelKey)); + } + + // Get item behaviors + Object behaviorConfig = section.get("behavior"); + if (behaviorConfig instanceof List) { + @SuppressWarnings("unchecked") + List> behavior = (List>) behaviorConfig; + List behaviors = new ArrayList<>(); + for (Map behaviorMap : behavior) { + behaviors.add(ItemBehaviors.fromMap(pack, path, id, behaviorMap)); + } + itemBuilder.behavior(behaviors); + } else if (behaviorConfig instanceof Map) { + Map behaviorSection = MiscUtils.castToMap(section.get("behavior"), true); + if (behaviorSection != null) { + itemBuilder.behavior(ItemBehaviors.fromMap(pack, path, id, behaviorSection)); + } + } + + // Get item data + Map dataSection = MiscUtils.castToMap(section.get("data"), true); + if (dataSection != null) { + for (Map.Entry dataEntry : dataSection.entrySet()) { + Optional.ofNullable(dataFunctions.get(dataEntry.getKey())).ifPresent(function -> { + try { + itemBuilder.modifier(function.apply(dataEntry.getValue())); + } catch (IllegalArgumentException e) { + plugin.logger().warn("Invalid data format", e); + } + }); + } + } + + if (section.containsKey("settings")) { + Map settings = MiscUtils.castToMap(section.get("settings"), false); + itemBuilder.settings(ItemSettings.fromMap(settings)); + } + + CustomItem customItem = itemBuilder.build(); + this.customItems.put(id, customItem); + this.cachedSuggestions.add(Suggestion.suggestion(id.toString())); + + // regitser tags + Set tags = customItem.settings().tags(); + for (Key tag : tags) { + this.customItemTags.computeIfAbsent(tag, k -> new ArrayList<>()).add(holder); + } + + // model part, can be null + // but if it exists, either custom model data or item model should be configured + Map modelSection = MiscUtils.castToMap(section.get("model"), true); + if (modelSection == null) { + return; + } + + if (customModelData != 0) { + // use custom model data + // check conflict + Map conflict = this.cmdConflictChecker.computeIfAbsent(materialId, k -> new HashMap<>()); + if (conflict.containsKey(customModelData)) { + plugin.logger().warn(path, "Failed to create model for " + id + " because custom-model-data " + customModelData + " already occupied by item " + conflict.get(customModelData).toString()); + return; + } + + conflict.put(customModelData, id); + + // Parse models + ItemModel model = ItemModels.fromMap(modelSection); + for (ModelGeneration generation : model.modelsToGenerate()) { + prepareModelGeneration(generation); + } + + if (ConfigManager.packMaxVersion() > 21.39f) { + TreeMap map = this.modernOverrides.computeIfAbsent(materialId, k -> new TreeMap<>()); + map.put(customModelData, model); + } + + if (ConfigManager.packMinVersion() < 21.39f) { + List legacyOverridesModels = new ArrayList<>(); + processModelRecursively(model, new LinkedHashMap<>(), legacyOverridesModels, materialId, customModelData); + TreeSet lom = this.legacyOverrides.computeIfAbsent(materialId, k -> new TreeSet<>()); + lom.addAll(legacyOverridesModels); + } + } else if (itemModelKey != null) { + // use components + ItemModel model = ItemModels.fromMap(modelSection); + for (ModelGeneration generation : model.modelsToGenerate()) { + prepareModelGeneration(generation); + } + + if (ConfigManager.packMaxVersion() > 21.39f) { + this.modernItemModels1_21_4.put(itemModelKey, model); + } + + if (ConfigManager.packMaxVersion() > 21.19f && ConfigManager.packMinVersion() < 21.39f) { + List legacyOverridesModels = new ArrayList<>(); + processModelRecursively(model, new LinkedHashMap<>(), legacyOverridesModels, materialId, 0); + if (legacyOverridesModels.isEmpty()) { + plugin.logger().warn(path, "Can't convert " + id + "'s model to legacy format."); + return; + } + legacyOverridesModels.sort(LegacyOverridesModel::compareTo); + this.modernItemModels1_21_2.put(itemModelKey, legacyOverridesModels); + } + } else { + if (!VersionHelper.isVersionNewerThan1_21_2()) { + plugin.logger().warn(path, "No custom-model-data configured for " + id); + } + } + } + + @Override + public Map modernItemModels1_21_4() { + return this.modernItemModels1_21_4; + } + + @Override + public Map> modernItemModels1_21_2() { + return this.modernItemModels1_21_2; + } + + @Override + public Collection vanillaItems() { + return VANILLA_ITEMS; + } + + @Override + public Map> legacyItemOverrides() { + return this.legacyOverrides; + } + + @Override + public Map> modernItemOverrides() { + return this.modernOverrides; + } + + private void processModelRecursively( + ItemModel currentModel, + Map accumulatedPredicates, + List resultList, + Key materialId, + int customModelData + ) { + if (currentModel instanceof ConditionItemModel conditionModel) { + handleConditionModel(conditionModel, accumulatedPredicates, resultList, materialId, customModelData); + } else if (currentModel instanceof RangeDispatchItemModel rangeModel) { + handleRangeModel(rangeModel, accumulatedPredicates, resultList, materialId, customModelData); + } else if (currentModel instanceof SelectItemModel selectModel) { + handleSelectModel(selectModel, accumulatedPredicates, resultList, materialId, customModelData); + } else if (currentModel instanceof BaseItemModel baseModel) { + resultList.add(new LegacyOverridesModel( + new LinkedHashMap<>(accumulatedPredicates), + baseModel.path(), + customModelData + )); + } + } + + @SuppressWarnings({"unchecked", "rawtypes"}) + private void handleConditionModel( + ConditionItemModel model, + Map parentPredicates, + List resultList, + Key materialId, + int customModelData + ) { + if (model.property() instanceof LegacyModelPredicate predicate) { + String predicateId = predicate.legacyPredicateId(materialId); + Map truePredicates = mergePredicates( + parentPredicates, + predicateId, + predicate.toLegacyValue(true) + ); + processModelRecursively( + model.onTrue(), + truePredicates, + resultList, + materialId, + customModelData + ); + Map falsePredicates = mergePredicates( + parentPredicates, + predicateId, + predicate.toLegacyValue(false) + ); + processModelRecursively( + model.onFalse(), + falsePredicates, + resultList, + materialId, + customModelData + ); + } + } + + @SuppressWarnings({"unchecked", "rawtypes"}) + private void handleRangeModel( + RangeDispatchItemModel model, + Map parentPredicates, + List resultList, + Key materialId, + int customModelData + ) { + if (model.property() instanceof LegacyModelPredicate predicate) { + String predicateId = predicate.legacyPredicateId(materialId); + for (Map.Entry entry : model.entries().entrySet()) { + Map merged = mergePredicates( + parentPredicates, + predicateId, + predicate.toLegacyValue(entry.getKey()) + ); + processModelRecursively( + entry.getValue(), + merged, + resultList, + materialId, + customModelData + ); + } + if (model.fallBack() != null) { + Map merged = mergePredicates( + parentPredicates, + predicateId, + predicate.toLegacyValue(0f) + ); + processModelRecursively( + model.fallBack(), + merged, + resultList, + materialId, + customModelData + ); + } + } + } + + @SuppressWarnings({"unchecked", "rawtypes"}) + private void handleSelectModel( + SelectItemModel model, + Map parentPredicates, + List resultList, + Key materialId, + int customModelData + ) { + if (model.property() instanceof LegacyModelPredicate predicate) { + String predicateId = predicate.legacyPredicateId(materialId); + for (Map.Entry>, ItemModel> entry : model.whenMap().entrySet()) { + List cases = entry.getKey().fallbackOrMapPrimary(List::of); + for (String caseValue : cases) { + Map merged = mergePredicates( + parentPredicates, + predicateId, + predicate.toLegacyValue(caseValue) + ); + // Additional check for crossbow + if (materialId.equals(ItemKeys.CROSSBOW)) { + merged = mergePredicates( + merged, + "charged", + 1 + ); + } + processModelRecursively( + entry.getValue(), + merged, + resultList, + materialId, + customModelData + ); + } + } + // Additional check for crossbow + if (model.fallBack() != null && materialId.equals(ItemKeys.CROSSBOW)) { + Map merged = mergePredicates( + parentPredicates, + "charged", + 0 + ); + processModelRecursively( + model.fallBack(), + merged, + resultList, + materialId, + customModelData + ); + } + } + } + + private Map mergePredicates( + Map existing, + String newKey, + Number newValue + ) { + Map merged = new LinkedHashMap<>(existing); + if (newKey == null) return merged; + merged.put(newKey, newValue); + return merged; + } + + @SuppressWarnings("unchecked") + private void registerAllVanillaItems() { + try { + for (Material material : Registry.MATERIAL) { + if (material.getKey().namespace().equals("minecraft")) { + if (!material.isLegacy() && material.isItem()) { + Key id = Key.from(material.getKey().asString()); + VANILLA_ITEMS.add(id); + Holder.Reference holder = BuiltInRegistries.OPTIMIZED_ITEM_ID.get(id) + .orElseGet(() -> ((WritableRegistry) BuiltInRegistries.OPTIMIZED_ITEM_ID) + .register(new ResourceKey<>(BuiltInRegistries.OPTIMIZED_ITEM_ID.key().location(), id), id)); + + Object resourceLocation = Reflections.method$ResourceLocation$fromNamespaceAndPath.invoke(null, id.namespace(), id.value()); + Object mcHolder = ((Optional) Reflections.method$Registry$getHolder1.invoke(Reflections.instance$BuiltInRegistries$ITEM, Reflections.method$ResourceKey$create.invoke(null, Reflections.instance$Registries$ITEM, resourceLocation))).get(); + Set tags = (Set) Reflections.field$Holder$Reference$tags.get(mcHolder); + for (Object tag : tags) { + Key tagId = Key.of(Reflections.field$TagKey$location.get(tag).toString()); + this.vanillaItemTags.computeIfAbsent(tagId, (key) -> new ArrayList<>()).add(holder); + } + } + } + } + } catch (ReflectiveOperationException e) { + plugin.logger().warn("Failed to init vanilla items", e); + } + } +} diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/item/CloneableConstantItem.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/item/CloneableConstantItem.java new file mode 100644 index 000000000..6eb6eb61d --- /dev/null +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/item/CloneableConstantItem.java @@ -0,0 +1,28 @@ +package net.momirealms.craftengine.bukkit.item; + +import net.momirealms.craftengine.core.item.BuildableItem; +import net.momirealms.craftengine.core.item.ItemBuildContext; +import net.momirealms.craftengine.core.util.Key; +import org.bukkit.inventory.ItemStack; + +public class CloneableConstantItem implements BuildableItem { + private final ItemStack item; + private final Key id; + + public CloneableConstantItem(Key id, ItemStack item) { + this.item = item; + this.id = id; + } + + @Override + public Key id() { + return this.id; + } + + @Override + public ItemStack buildItemStack(ItemBuildContext context, int count) { + ItemStack itemStack = this.item.clone(); + itemStack.setAmount(count); + return itemStack; + } +} diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/item/DebugStickListener.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/item/DebugStickListener.java new file mode 100644 index 000000000..af5bbd4fd --- /dev/null +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/item/DebugStickListener.java @@ -0,0 +1,127 @@ +package net.momirealms.craftengine.bukkit.item; + +import net.kyori.adventure.text.Component; +import net.momirealms.craftengine.bukkit.api.CraftEngineBlocks; +import net.momirealms.craftengine.bukkit.block.BukkitBlockManager; +import net.momirealms.craftengine.bukkit.plugin.BukkitCraftEngine; +import net.momirealms.craftengine.bukkit.plugin.user.BukkitServerPlayer; +import net.momirealms.craftengine.bukkit.util.BlockStateUtils; +import net.momirealms.craftengine.bukkit.util.ComponentUtils; +import net.momirealms.craftengine.bukkit.util.Reflections; +import net.momirealms.craftengine.core.block.CustomBlock; +import net.momirealms.craftengine.core.block.ImmutableBlockState; +import net.momirealms.craftengine.core.block.UpdateOption; +import net.momirealms.craftengine.core.block.properties.Property; +import net.momirealms.craftengine.core.item.Item; +import net.momirealms.craftengine.core.util.MCUtils; +import net.momirealms.craftengine.core.util.MiscUtils; +import org.bukkit.Material; +import org.bukkit.block.Block; +import org.bukkit.entity.Player; +import org.bukkit.event.EventHandler; +import org.bukkit.event.Listener; +import org.bukkit.event.block.Action; +import org.bukkit.event.player.PlayerInteractEvent; +import org.bukkit.inventory.EquipmentSlot; +import org.bukkit.inventory.ItemStack; + +import javax.annotation.Nullable; +import java.util.Collection; +import java.util.HashMap; +import java.util.Map; + +public class DebugStickListener implements Listener { + private final BukkitCraftEngine plugin; + + public DebugStickListener(BukkitCraftEngine plugin) { + this.plugin = plugin; + } + + @EventHandler(ignoreCancelled = true) + public void onUseDebugStick(PlayerInteractEvent event) { + Block clickedBlock = event.getClickedBlock(); + if (clickedBlock == null) return; + ItemStack itemInHand = event.getItem(); + if (itemInHand == null) return; + Material material = itemInHand.getType(); + if (material != Material.DEBUG_STICK) return; + Player bukkitPlayer = event.getPlayer(); + BukkitServerPlayer player = this.plugin.adapt(bukkitPlayer); + if (!(player.canInstabuild() && player.hasPermission("minecraft.debugstick")) && !player.hasPermission("minecraft.debugstick.always")) { + return; + } + if (event.getHand() == EquipmentSlot.OFF_HAND) { + int currentTicks = player.gameTicks(); + if (!player.updateLastSuccessfulInteractionTick(currentTicks)) { + event.setCancelled(true); + return; + } + } + Object blockState = BlockStateUtils.blockDataToBlockState(clickedBlock.getBlockData()); + int stateId = BlockStateUtils.blockStateToId(blockState); + if (!BlockStateUtils.isVanillaBlock(stateId)) { + event.setCancelled(true); + boolean update = event.getAction() == Action.RIGHT_CLICK_BLOCK; + ImmutableBlockState clickedCustomBlock = BukkitBlockManager.instance().getImmutableBlockStateUnsafe(stateId); + CustomBlock block = clickedCustomBlock.owner().value(); + Collection> properties = block.properties(); + String blockId = block.id().toString(); + try { + if (properties.isEmpty()) { + Object systemChatPacket = Reflections.constructor$ClientboundSystemChatPacket.newInstance( + ComponentUtils.adventureToMinecraft(Component.translatable("item.minecraft.debug_stick.empty").arguments(Component.text(blockId))), true); + player.sendPacket(systemChatPacket, false); + } else { + Item wrapped = BukkitItemManager.instance().wrap(itemInHand); + Object storedData = wrapped.getTag("craftengine:debug_stick_state"); + if (storedData == null) storedData = new HashMap<>(); + if (storedData instanceof Map map) { + Map data = MiscUtils.castToMap(map, false); + String currentPropertyName = (String) data.get(blockId); + Property currentProperty = block.getProperty(currentPropertyName); + if (currentProperty == null) { + currentProperty = properties.iterator().next(); + } + if (update) { + ImmutableBlockState nextState = cycleState(clickedCustomBlock, currentProperty, player.isSecondaryUseActive()); + CraftEngineBlocks.place(clickedBlock.getLocation(), nextState, new UpdateOption.Builder().updateClients().updateKnownShape().build(), false); + Object systemChatPacket = Reflections.constructor$ClientboundSystemChatPacket.newInstance( + ComponentUtils.adventureToMinecraft(Component.translatable("item.minecraft.debug_stick.update") + .arguments( + Component.text(currentProperty.name()), + Component.text(getNameHelper(nextState, currentProperty)) + )), true); + player.sendPacket(systemChatPacket, false); + } else { + currentProperty = getRelative(properties, currentProperty, player.isSecondaryUseActive()); + data.put(blockId, currentProperty.name()); + wrapped.setTag(data, "craftengine:debug_stick_state"); + wrapped.load(); + Object systemChatPacket = Reflections.constructor$ClientboundSystemChatPacket.newInstance( + ComponentUtils.adventureToMinecraft(Component.translatable("item.minecraft.debug_stick.select") + .arguments( + Component.text(currentProperty.name()), + Component.text(getNameHelper(clickedCustomBlock, currentProperty)) + )), true); + player.sendPacket(systemChatPacket, false); + } + } + } + } catch (ReflectiveOperationException e) { + plugin.logger().warn("Failed to send system chat packet", e); + } + } + } + + private static > ImmutableBlockState cycleState(ImmutableBlockState state, Property property, boolean inverse) { + return state.with(property, getRelative(property.possibleValues(), state.get(property), inverse)); + } + + private static T getRelative(Iterable elements, @Nullable T current, boolean inverse) { + return inverse ? MCUtils.findPreviousInIterable(elements, current) : MCUtils.findNextInIterable(elements, current); + } + + private static > String getNameHelper(ImmutableBlockState state, Property property) { + return property.valueName(state.get(property)); + } +} diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/item/ItemEventListener.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/item/ItemEventListener.java new file mode 100644 index 000000000..a0cdcf165 --- /dev/null +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/item/ItemEventListener.java @@ -0,0 +1,224 @@ +package net.momirealms.craftengine.bukkit.item; + +import net.kyori.adventure.text.Component; +import net.kyori.adventure.text.format.NamedTextColor; +import net.momirealms.craftengine.bukkit.api.event.CustomBlockInteractEvent; +import net.momirealms.craftengine.bukkit.block.BukkitBlockManager; +import net.momirealms.craftengine.bukkit.item.behavior.BlockItemBehavior; +import net.momirealms.craftengine.bukkit.plugin.BukkitCraftEngine; +import net.momirealms.craftengine.bukkit.plugin.user.BukkitServerPlayer; +import net.momirealms.craftengine.bukkit.util.*; +import net.momirealms.craftengine.core.block.ImmutableBlockState; +import net.momirealms.craftengine.core.entity.player.InteractionHand; +import net.momirealms.craftengine.core.entity.player.InteractionResult; +import net.momirealms.craftengine.core.item.Item; +import net.momirealms.craftengine.core.item.behavior.ItemBehavior; +import net.momirealms.craftengine.core.item.context.UseOnContext; +import net.momirealms.craftengine.core.util.Direction; +import net.momirealms.craftengine.core.util.Key; +import net.momirealms.craftengine.core.world.BlockHitResult; +import net.momirealms.craftengine.core.world.BlockPos; +import net.momirealms.craftengine.core.world.Vec3d; +import org.bukkit.GameMode; +import org.bukkit.Location; +import org.bukkit.block.Block; +import org.bukkit.block.data.BlockData; +import org.bukkit.entity.Player; +import org.bukkit.event.Event; +import org.bukkit.event.EventHandler; +import org.bukkit.event.EventPriority; +import org.bukkit.event.Listener; +import org.bukkit.event.block.Action; +import org.bukkit.event.player.PlayerInteractEvent; +import org.bukkit.inventory.EquipmentSlot; +import org.bukkit.inventory.ItemStack; + +import java.util.List; +import java.util.Objects; +import java.util.Optional; + +public class ItemEventListener implements Listener { + private final BukkitCraftEngine plugin; + + public ItemEventListener(BukkitCraftEngine plugin) { + this.plugin = plugin; + } + + @EventHandler(ignoreCancelled = true, priority = EventPriority.HIGH) + public void onInteractBlock(PlayerInteractEvent event) { + Action action = event.getAction(); + if (action != Action.LEFT_CLICK_BLOCK && action != Action.RIGHT_CLICK_BLOCK) { + return; + } + Block block = Objects.requireNonNull(event.getClickedBlock()); + Object blockState = BlockStateUtils.blockDataToBlockState(block.getBlockData()); + int stateId = BlockStateUtils.blockStateToId(blockState); + if (BlockStateUtils.isVanillaBlock(stateId)) { + return; + } + + // it's breaking the block + if (action == Action.LEFT_CLICK_BLOCK && event.getPlayer().getGameMode() == GameMode.CREATIVE) { + return; + } + + CustomBlockInteractEvent interactEvent = new CustomBlockInteractEvent( + event.getPlayer(), + block.getLocation(), + event.getInteractionPoint(), + BukkitBlockManager.instance().getImmutableBlockStateUnsafe(stateId), + block, + event.getBlockFace(), + event.getHand() == EquipmentSlot.HAND ? InteractionHand.MAIN_HAND : InteractionHand.OFF_HAND, + action == Action.RIGHT_CLICK_BLOCK ? CustomBlockInteractEvent.Action.RIGHT_CLICK : CustomBlockInteractEvent.Action.LEFT_CLICK + ); + if (EventUtils.fireAndCheckCancel(interactEvent)) { + event.setCancelled(true); + } + } + + @EventHandler + public void onInteractAir(PlayerInteractEvent event) { + if (event.getAction() != Action.RIGHT_CLICK_AIR) return; + Player bukkitPlayer = event.getPlayer(); + BukkitServerPlayer player = this.plugin.adapt(bukkitPlayer); + InteractionHand hand = event.getHand() == EquipmentSlot.HAND ? InteractionHand.MAIN_HAND : InteractionHand.OFF_HAND; + if (cancelEventIfHasInteraction(event, player, hand)) { + return; + } + + if (player.isSpectatorMode() || player.isAdventureMode()) { + return; + } + + // Gets the item in hand + Item itemInHand = player.getItemInHand(hand); + // should never be null + if (itemInHand == null) return; + Optional> optionalItemBehaviors = itemInHand.getItemBehavior(); + + if (optionalItemBehaviors.isPresent()) { + for (ItemBehavior itemBehavior : optionalItemBehaviors.get()) { + InteractionResult result = itemBehavior.use(player.level(), player, hand); + if (result == InteractionResult.SUCCESS_AND_CANCEL) { + event.setCancelled(true); + return; + } + if (result != InteractionResult.PASS) { + return; + } + } + } + } + + @EventHandler(priority = EventPriority.HIGHEST) + public void onInteractAtBlock(PlayerInteractEvent event) { + if (event.getAction() != Action.RIGHT_CLICK_BLOCK) return; + if (event.useItemInHand() == Event.Result.DENY || event.useInteractedBlock() == Event.Result.DENY) return; + Location interactionPoint = event.getInteractionPoint(); + if (interactionPoint == null) return; + Player bukkitPlayer = event.getPlayer(); + Block clickedBlock = Objects.requireNonNull(event.getClickedBlock()); + BukkitServerPlayer player = this.plugin.adapt(bukkitPlayer); + InteractionHand hand = event.getHand() == EquipmentSlot.HAND ? InteractionHand.MAIN_HAND : InteractionHand.OFF_HAND; + if (cancelEventIfHasInteraction(event, player, hand)) { + return; + } + + // Gets the item in hand + Item itemInHand = player.getItemInHand(hand); + if (itemInHand == null) return; + Optional> optionalItemBehaviors = itemInHand.getItemBehavior(); + + // has custom item behavior + if (optionalItemBehaviors.isPresent()) { + BlockPos pos = LocationUtils.toBlockPos(clickedBlock.getLocation()); + Vec3d vec3d = new Vec3d(interactionPoint.getX(), interactionPoint.getY(), interactionPoint.getZ()); + Direction direction = DirectionUtils.toDirection(event.getBlockFace()); + BlockHitResult hitResult = new BlockHitResult(vec3d, direction, pos, false); + boolean interactable = InteractUtils.isInteractable(BlockStateUtils.getBlockOwnerId(clickedBlock), bukkitPlayer, clickedBlock.getBlockData(), hitResult, itemInHand); + + // do not allow to place block if it's a vanilla block + if (itemInHand.isBlockItem() && itemInHand.isCustomItem()) { + if (!interactable || player.isSecondaryUseActive()) { + event.setCancelled(true); + } + } + + if (!player.isSecondaryUseActive() && interactable) { + // if it's interactable on server, cancel the custom behaviors + return; + } + + // TODO We need to further investigate how to handle adventure mode + // no spectator interactions + if (player.isSpectatorMode() || player.isAdventureMode()) { + return; + } + + for (ItemBehavior itemBehavior : optionalItemBehaviors.get()) { + InteractionResult result = itemBehavior.useOnBlock(new UseOnContext(player, hand, hitResult)); + if (result == InteractionResult.SUCCESS_AND_CANCEL) { + event.setCancelled(true); + return; + } + int maxY = player.level().worldHeight().getMaxBuildHeight() - 1; + if (direction == Direction.UP + && result != InteractionResult.SUCCESS + && pos.y() >= maxY + && itemBehavior instanceof BlockItemBehavior + ) { + player.sendActionBar(Component.translatable("build.tooHigh").arguments(Component.text(maxY)).color(NamedTextColor.RED)); + return; + } + if (result != InteractionResult.PASS) { + return; + } + } + return; + } + + // it's a vanilla block + if (itemInHand.isBlockItem() && !itemInHand.isCustomItem()) { + // client won't have sounds if the fake block is interactable + // so we should check and resend sounds on interact + Object blockState = BlockStateUtils.blockDataToBlockState(clickedBlock.getBlockData()); + int stateId = BlockStateUtils.blockStateToId(blockState); + ImmutableBlockState againCustomBlock = BukkitBlockManager.instance().getImmutableBlockState(stateId); + if (againCustomBlock == null || againCustomBlock.isEmpty()) { + return; + } + BlockPos pos = LocationUtils.toBlockPos(clickedBlock.getLocation()); + Vec3d vec3d = new Vec3d(interactionPoint.getX(), interactionPoint.getY(), interactionPoint.getZ()); + Direction direction = DirectionUtils.toDirection(event.getBlockFace()); + BlockHitResult hitResult = new BlockHitResult(vec3d, direction, pos, false); + try { + BlockData craftBlockData = BlockStateUtils.createBlockData(againCustomBlock.vanillaBlockState().handle()); + if (InteractUtils.isInteractable(Key.of(clickedBlock.getType().getKey().asString()), bukkitPlayer, craftBlockData, hitResult, itemInHand)) { + if (!player.isSecondaryUseActive()) { + player.setResendSound(); + } + } else { + if (BlockStateUtils.isReplaceable(againCustomBlock.customBlockState().handle()) && !BlockStateUtils.isReplaceable(againCustomBlock.vanillaBlockState().handle())) { + player.setResendSwing(); + } + } + } catch (ReflectiveOperationException e) { + plugin.logger().warn("Failed to get CraftBlockData", e); + } + } + } + + private boolean cancelEventIfHasInteraction(PlayerInteractEvent event, BukkitServerPlayer player, InteractionHand hand) { + if (hand == InteractionHand.OFF_HAND) { + int currentTicks = player.gameTicks(); + // The client will send multiple packets to the server if the client thinks it should + // However, if the main hand item interaction is successful, the off-hand item should be blocked. + if (!player.updateLastSuccessfulInteractionTick(currentTicks)) { + event.setCancelled(true); + return true; + } + } + return false; + } +} diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/item/RTagItemWrapper.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/item/RTagItemWrapper.java new file mode 100644 index 000000000..46d87ddd0 --- /dev/null +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/item/RTagItemWrapper.java @@ -0,0 +1,113 @@ +package net.momirealms.craftengine.bukkit.item; + +import com.saicone.rtag.RtagItem; +import net.momirealms.craftengine.core.item.ItemWrapper; +import org.bukkit.inventory.ItemStack; + +@SuppressWarnings("UnstableApiUsage") +public class RTagItemWrapper implements ItemWrapper { + private final RtagItem rtagItem; + private int count; + + public RTagItemWrapper(RtagItem rtagItem, int count) { + this.rtagItem = rtagItem; + this.count = count; + } + + @Override + public ItemStack getItem() { + ItemStack itemStack = this.rtagItem.getItem(); + itemStack.setAmount(this.count); + return itemStack; + } + + @Override + public boolean set(Object value, Object... path) { + return this.rtagItem.set(value, path); + } + + @Override + public boolean add(Object value, Object... path) { + return this.rtagItem.add(value, path); + } + + @Override + public V get(Object... path) { + return this.rtagItem.get(path); + } + + @Override + public void setComponent(Object path, Object value) { + this.rtagItem.setComponent(path, value); + } + + @Override + public Object getComponent(Object path) { + return this.rtagItem.getComponent(path); + } + + @Override + public int count() { + return this.count; + } + + @Override + public void count(int amount) { + if (amount < 0) amount = 0; + this.count = amount; + } + + @Override + public V getExact(Object... path) { + return this.rtagItem.get(path); + } + + @Override + public void removeComponent(Object path) { + this.rtagItem.removeComponent(path); + } + + @Override + public boolean hasComponent(Object path) { + return this.rtagItem.hasComponent(path); + } + + @Override + public void update() { + this.rtagItem.update(); + } + + @Override + public boolean remove(Object... path) { + return this.rtagItem.remove(path); + } + + @Override + public boolean hasTag(Object... path) { + return this.rtagItem.hasTag(path); + } + + @Override + public ItemStack load() { + ItemStack itemStack = this.rtagItem.load(); + itemStack.setAmount(this.count); + return itemStack; + } + + @Override + public ItemStack loadCopy() { + ItemStack itemStack = this.rtagItem.loadCopy(); + itemStack.setAmount(this.count); + return itemStack; + } + + @Override + public Object getLiteralObject() { + return this.rtagItem.getLiteralObject(); + } + + @Override + public ItemWrapper copyWithCount(int count) { + return new RTagItemWrapper(new RtagItem(this.rtagItem.loadCopy()), count); + } +} \ No newline at end of file diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/item/behavior/AxeItemBehavior.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/item/behavior/AxeItemBehavior.java new file mode 100644 index 000000000..08717093a --- /dev/null +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/item/behavior/AxeItemBehavior.java @@ -0,0 +1,118 @@ +package net.momirealms.craftengine.bukkit.item.behavior; + +import net.momirealms.craftengine.bukkit.api.CraftEngineBlocks; +import net.momirealms.craftengine.bukkit.block.BukkitBlockManager; +import net.momirealms.craftengine.bukkit.block.behavior.StrippableBlockBehavior; +import net.momirealms.craftengine.bukkit.util.*; +import net.momirealms.craftengine.bukkit.world.BukkitWorldBlock; +import net.momirealms.craftengine.core.block.CustomBlock; +import net.momirealms.craftengine.core.block.ImmutableBlockState; +import net.momirealms.craftengine.core.block.UpdateOption; +import net.momirealms.craftengine.core.entity.player.InteractionHand; +import net.momirealms.craftengine.core.entity.player.InteractionResult; +import net.momirealms.craftengine.core.entity.player.Player; +import net.momirealms.craftengine.core.item.Item; +import net.momirealms.craftengine.core.item.ItemKeys; +import net.momirealms.craftengine.core.item.behavior.ItemBehavior; +import net.momirealms.craftengine.core.item.behavior.ItemBehaviorFactory; +import net.momirealms.craftengine.core.item.context.UseOnContext; +import net.momirealms.craftengine.core.pack.Pack; +import net.momirealms.craftengine.core.plugin.CraftEngine; +import net.momirealms.craftengine.core.util.Key; +import net.momirealms.craftengine.core.util.VersionHelper; +import net.momirealms.craftengine.core.world.BlockPos; +import net.momirealms.craftengine.core.world.Vec3d; +import net.momirealms.sparrow.nbt.CompoundTag; +import org.bukkit.GameEvent; +import org.bukkit.Material; +import org.bukkit.Statistic; +import org.bukkit.block.Block; +import org.bukkit.event.entity.EntityChangeBlockEvent; +import org.bukkit.inventory.ItemStack; +import org.bukkit.util.Vector; + +import java.nio.file.Path; +import java.util.Map; +import java.util.Optional; + +public class AxeItemBehavior extends ItemBehavior { + public static final Factory FACTORY = new Factory(); + public static final AxeItemBehavior INSTANCE = new AxeItemBehavior(); + private static final Key AXE_STRIP_SOUND = Key.of("minecraft:item.axe.strip"); + + @SuppressWarnings("unchecked") + @Override + public InteractionResult useOnBlock(UseOnContext context) { + BukkitWorldBlock clicked = (BukkitWorldBlock) context.getLevel().getBlockAt(context.getClickedPos()); + Block block = clicked.block(); + ImmutableBlockState state = BukkitBlockManager.instance().getImmutableBlockState(BlockStateUtils.blockDataToId(block.getBlockData())); + if (state == null || state.isEmpty()) return InteractionResult.PASS; + + if (!(state.behavior() instanceof StrippableBlockBehavior blockBehavior)) { + return InteractionResult.PASS; + } + + Player player = context.getPlayer(); + + Item offHandItem = (Item) player.getItemInHand(InteractionHand.OFF_HAND); + // is using a shield + if (context.getHand() == InteractionHand.MAIN_HAND && offHandItem != null && offHandItem.vanillaId().equals(ItemKeys.SHIELD) && !player.isSecondaryUseActive()) { + return InteractionResult.PASS; + } + + Optional optionalNewCustomBlock = BukkitBlockManager.instance().getBlock(blockBehavior.stripped()); + if (optionalNewCustomBlock.isEmpty()) { + CraftEngine.instance().logger().warn("stripped block " + blockBehavior.stripped() + " does not exist"); + return InteractionResult.FAIL; + } + CustomBlock newCustomBlock = optionalNewCustomBlock.get(); + CompoundTag compoundTag = state.propertiesNbt(); + ImmutableBlockState newState = newCustomBlock.getBlockState(compoundTag); + + org.bukkit.entity.Player bukkitPlayer = ((org.bukkit.entity.Player) player.platformPlayer()); + // Call bukkit event + EntityChangeBlockEvent event = new EntityChangeBlockEvent(bukkitPlayer, block, BlockStateUtils.createBlockData(newState.customBlockState().handle())); + if (EventUtils.fireAndCheckCancel(event)) { + return InteractionResult.PASS; + } + + BlockPos pos = context.getClickedPos(); + context.getLevel().playBlockSound(Vec3d.atCenterOf(pos), AXE_STRIP_SOUND, 1, 1); + CraftEngineBlocks.place(block.getLocation(), newState, UpdateOption.UPDATE_ALL_IMMEDIATE, false); + block.getWorld().sendGameEvent(bukkitPlayer, GameEvent.BLOCK_CHANGE, new Vector(pos.x(), pos.y(), pos.z())); + Item item = (Item) context.getItem(); + Material material = MaterialUtils.getMaterial(item.vanillaId()); + bukkitPlayer.setStatistic(Statistic.USE_ITEM, material, bukkitPlayer.getStatistic(Statistic.USE_ITEM, material) + 1); + + // resend swing if it's not interactable on client side + if (!InteractUtils.isInteractable(BlockStateUtils.getBlockOwnerIdFromState(state.vanillaBlockState().handle()), + bukkitPlayer, BlockStateUtils.fromBlockData(state.vanillaBlockState().handle()), + context.getHitResult(), item + )) { + player.swingHand(context.getHand()); + } + // shrink item amount + if (VersionHelper.isVersionNewerThan1_20_5()) { + Object itemStack = item.getLiteralObject(); + Object serverPlayer = player.serverPlayer(); + Object equipmentSlot = context.getHand() == InteractionHand.MAIN_HAND ? Reflections.instance$EquipmentSlot$MAINHAND : Reflections.instance$EquipmentSlot$OFFHAND; + try { + Reflections.method$ItemStack$hurtAndBreak.invoke(itemStack, 1, serverPlayer, equipmentSlot); + } catch (ReflectiveOperationException e) { + CraftEngine.instance().logger().warn("Failed to hurt itemStack", e); + } + } else { + ItemStack itemStack = item.getItem(); + itemStack.damage(1, bukkitPlayer); + } + return InteractionResult.SUCCESS; + } + + public static class Factory implements ItemBehaviorFactory { + + @Override + public ItemBehavior create(Pack pack, Path path, Key id, Map arguments) { + return INSTANCE; + } + } +} diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/item/behavior/BlockItemBehavior.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/item/behavior/BlockItemBehavior.java new file mode 100644 index 000000000..8e3e38923 --- /dev/null +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/item/behavior/BlockItemBehavior.java @@ -0,0 +1,186 @@ +package net.momirealms.craftengine.bukkit.item.behavior; + +import net.momirealms.craftengine.bukkit.api.CraftEngineBlocks; +import net.momirealms.craftengine.bukkit.api.event.CustomBlockAttemptPlaceEvent; +import net.momirealms.craftengine.bukkit.api.event.CustomBlockPlaceEvent; +import net.momirealms.craftengine.bukkit.block.BukkitBlockManager; +import net.momirealms.craftengine.bukkit.util.DirectionUtils; +import net.momirealms.craftengine.bukkit.util.EventUtils; +import net.momirealms.craftengine.bukkit.util.LocationUtils; +import net.momirealms.craftengine.bukkit.util.Reflections; +import net.momirealms.craftengine.core.block.CustomBlock; +import net.momirealms.craftengine.core.block.ImmutableBlockState; +import net.momirealms.craftengine.core.block.UpdateOption; +import net.momirealms.craftengine.core.entity.player.InteractionHand; +import net.momirealms.craftengine.core.entity.player.InteractionResult; +import net.momirealms.craftengine.core.entity.player.Player; +import net.momirealms.craftengine.core.item.Item; +import net.momirealms.craftengine.core.item.behavior.ItemBehavior; +import net.momirealms.craftengine.core.item.behavior.ItemBehaviorFactory; +import net.momirealms.craftengine.core.item.context.BlockPlaceContext; +import net.momirealms.craftengine.core.item.context.UseOnContext; +import net.momirealms.craftengine.core.pack.Pack; +import net.momirealms.craftengine.core.plugin.CraftEngine; +import net.momirealms.craftengine.core.util.Key; +import net.momirealms.craftengine.core.util.MiscUtils; +import net.momirealms.craftengine.core.world.BlockPos; +import org.bukkit.*; +import org.bukkit.block.Block; +import org.bukkit.block.BlockState; +import org.bukkit.block.data.BlockData; +import org.bukkit.event.block.BlockCanBuildEvent; +import org.bukkit.event.block.BlockPlaceEvent; +import org.bukkit.inventory.EquipmentSlot; +import org.bukkit.inventory.ItemStack; +import org.bukkit.util.Vector; + +import javax.annotation.Nullable; +import java.lang.reflect.InvocationTargetException; +import java.nio.file.Path; +import java.util.Map; +import java.util.Optional; + +public class BlockItemBehavior extends ItemBehavior { + public static final Factory FACTORY = new Factory(); + private final Key blockId; + + public BlockItemBehavior(Key blockId) { + this.blockId = blockId; + } + + @Override + public InteractionResult useOnBlock(UseOnContext context) { + return this.place(new BlockPlaceContext(context)); + } + + public InteractionResult place(BlockPlaceContext context) { + if (!context.canPlace()) { + return InteractionResult.FAIL; + } + Optional optionalBlock = BukkitBlockManager.instance().getBlock(this.blockId); + if (optionalBlock.isEmpty()) { + CraftEngine.instance().logger().warn("Failed to place unknown block " + this.blockId); + return InteractionResult.FAIL; + } + CustomBlock block = optionalBlock.get(); + BlockPlaceContext placeContext = updatePlacementContext(context); + if (placeContext == null) { + return InteractionResult.FAIL; + } + ImmutableBlockState blockStateToPlace = getPlacementState(placeContext, block); + if (blockStateToPlace == null) { + return InteractionResult.FAIL; + } + Player player = placeContext.getPlayer(); + int gameTicks = player.gameTicks(); + if (!player.updateLastSuccessfulInteractionTick(gameTicks)) { + return InteractionResult.FAIL; + } + + BlockPos pos = placeContext.getClickedPos(); + BlockPos againstPos = placeContext.getAgainstPos(); + World world = (World) placeContext.getLevel().getHandle(); + Location placeLocation = new Location(world, pos.x(), pos.y(), pos.z()); + + Block bukkitBlock = world.getBlockAt(placeLocation); + Block againstBlock = world.getBlockAt(againstPos.x(), againstPos.y(), againstPos.z()); + org.bukkit.entity.Player bukkitPlayer = (org.bukkit.entity.Player) player.platformPlayer(); + + // trigger event + CustomBlockAttemptPlaceEvent attemptPlaceEvent = new CustomBlockAttemptPlaceEvent(bukkitPlayer, placeLocation.clone(), blockStateToPlace, + DirectionUtils.toBlockFace(context.getClickedFace()), bukkitBlock, context.getHand()); + if (EventUtils.fireAndCheckCancel(attemptPlaceEvent)) { + return InteractionResult.FAIL; + } + + // it's just world + pos + BlockState previousState = bukkitBlock.getState(); + // place custom block + CraftEngineBlocks.place(placeLocation, blockStateToPlace, UpdateOption.UPDATE_ALL_IMMEDIATE, false); + // call bukkit event + BlockPlaceEvent bukkitPlaceEvent = new BlockPlaceEvent(bukkitBlock, previousState, againstBlock, (ItemStack) placeContext.getItem().getItem(), bukkitPlayer, true, context.getHand() == InteractionHand.MAIN_HAND ? EquipmentSlot.HAND : EquipmentSlot.OFF_HAND); + if (EventUtils.fireAndCheckCancel(bukkitPlaceEvent)) { + // revert changes + previousState.update(true, false); + return InteractionResult.FAIL; + } + + // call custom event + CustomBlockPlaceEvent customPlaceEvent = new CustomBlockPlaceEvent(bukkitPlayer, placeLocation.clone(), blockStateToPlace, world.getBlockAt(placeLocation), context.getHand()); + if (EventUtils.fireAndCheckCancel(customPlaceEvent)) { + // revert changes + previousState.update(true, false); + return InteractionResult.FAIL; + } + + if (!player.isCreativeMode()) { + Item item = placeContext.getItem(); + item.count(item.count() - 1); + item.load(); + } + + player.swingHand(placeContext.getHand()); + world.playSound(new Location(world, pos.x(), pos.y(), pos.z()), blockStateToPlace.sounds().placeSound().toString(), SoundCategory.BLOCKS, 1f, 0.8f); + world.sendGameEvent(bukkitPlayer, GameEvent.BLOCK_PLACE, new Vector(pos.x(), pos.y(), pos.z())); + return InteractionResult.SUCCESS; + } + + @Nullable + public BlockPlaceContext updatePlacementContext(BlockPlaceContext context) { + return context; + } + + protected ImmutableBlockState getPlacementState(BlockPlaceContext context, CustomBlock block) { + ImmutableBlockState state = block.getStateForPlacement(context); + return state != null && this.canPlace(context, state) ? state : null; + } + + protected boolean checkStatePlacement() { + return true; + } + + protected boolean canPlace(BlockPlaceContext context, ImmutableBlockState state) { + try { + Object player; + try { + player = Reflections.method$CraftPlayer$getHandle.invoke(context.getPlayer().platformPlayer()); + } catch (IllegalAccessException | InvocationTargetException e) { + throw new RuntimeException("Failed to get server player", e); + } + Object blockState = state.customBlockState().handle(); + Object blockPos = LocationUtils.toBlockPos(context.getClickedPos()); + Object voxelShape = Reflections.method$CollisionContext$of.invoke(null, player); + Object world = Reflections.field$CraftWorld$ServerLevel.get(context.getLevel().getHandle()); + boolean defaultReturn = ((!this.checkStatePlacement() || (boolean) Reflections.method$BlockStateBase$canSurvive.invoke(blockState, world, blockPos)) + && (boolean) Reflections.method$ServerLevel$checkEntityCollision.invoke(world, blockState, player, voxelShape, blockPos, true)); + Block block = (Block) Reflections.method$CraftBlock$at.invoke(null, world, blockPos); + BlockData blockData = (BlockData) Reflections.method$CraftBlockData$fromData.invoke(null, blockState); + BlockCanBuildEvent canBuildEvent = new BlockCanBuildEvent(block, (org.bukkit.entity.Player) context.getPlayer().platformPlayer(), blockData, defaultReturn, context.getHand() == InteractionHand.MAIN_HAND ? EquipmentSlot.HAND : EquipmentSlot.OFF_HAND); + Bukkit.getPluginManager().callEvent(canBuildEvent); + return canBuildEvent.isBuildable(); + } catch (ReflectiveOperationException e) { + CraftEngine.instance().logger().warn("Failed to check canPlace", e); + return false; + } + } + + public Key blockId() { + return this.blockId; + } + + public static class Factory implements ItemBehaviorFactory { + @Override + public ItemBehavior create(Pack pack, Path path, Key key, Map arguments) { + Object id = arguments.get("block"); + if (id == null) { + throw new IllegalArgumentException("Missing required parameter 'block' for block_item behavior"); + } + if (id instanceof Map map) { + BukkitBlockManager.instance().parseSection(pack, path, key, MiscUtils.castToMap(map, false)); + return new BlockItemBehavior(key); + } else { + return new BlockItemBehavior(Key.of(id.toString())); + } + } + } +} diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/item/behavior/BoneMealBehavior.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/item/behavior/BoneMealBehavior.java new file mode 100644 index 000000000..f01e85f05 --- /dev/null +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/item/behavior/BoneMealBehavior.java @@ -0,0 +1,27 @@ +package net.momirealms.craftengine.bukkit.item.behavior; + +import net.momirealms.craftengine.core.entity.player.InteractionResult; +import net.momirealms.craftengine.core.item.behavior.ItemBehavior; +import net.momirealms.craftengine.core.item.behavior.ItemBehaviorFactory; +import net.momirealms.craftengine.core.item.context.UseOnContext; +import net.momirealms.craftengine.core.pack.Pack; +import net.momirealms.craftengine.core.util.Key; + +import java.nio.file.Path; +import java.util.Map; + +public class BoneMealBehavior extends ItemBehavior { + public static final BoneMealBehavior INSTANCE = new BoneMealBehavior(); + + @Override + public InteractionResult useOnBlock(UseOnContext context) { + return super.useOnBlock(context); + } + + public static class Factory implements ItemBehaviorFactory { + @Override + public ItemBehavior create(Pack pack, Path path, Key id, Map arguments) { + return INSTANCE; + } + } +} diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/item/behavior/BucketItemBehavior.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/item/behavior/BucketItemBehavior.java new file mode 100644 index 000000000..1c1e279a6 --- /dev/null +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/item/behavior/BucketItemBehavior.java @@ -0,0 +1,71 @@ +package net.momirealms.craftengine.bukkit.item.behavior; + +import net.momirealms.craftengine.bukkit.api.CraftEngineBlocks; +import net.momirealms.craftengine.bukkit.block.BukkitBlockManager; +import net.momirealms.craftengine.bukkit.plugin.BukkitCraftEngine; +import net.momirealms.craftengine.bukkit.util.BlockStateUtils; +import net.momirealms.craftengine.bukkit.world.BukkitWorldBlock; +import net.momirealms.craftengine.core.block.CustomBlock; +import net.momirealms.craftengine.core.block.ImmutableBlockState; +import net.momirealms.craftengine.core.block.UpdateOption; +import net.momirealms.craftengine.core.block.properties.Property; +import net.momirealms.craftengine.core.entity.player.InteractionHand; +import net.momirealms.craftengine.core.entity.player.InteractionResult; +import net.momirealms.craftengine.core.item.behavior.ItemBehavior; +import net.momirealms.craftengine.core.item.behavior.ItemBehaviorFactory; +import net.momirealms.craftengine.core.item.context.UseOnContext; +import net.momirealms.craftengine.core.pack.Pack; +import net.momirealms.craftengine.core.util.Key; +import net.momirealms.craftengine.core.world.BlockPos; +import org.bukkit.*; +import org.bukkit.block.Block; +import org.bukkit.entity.Player; +import org.bukkit.inventory.EquipmentSlot; +import org.bukkit.inventory.ItemStack; + +import java.nio.file.Path; +import java.util.Map; + +public class BucketItemBehavior extends ItemBehavior { + public static final BucketItemBehavior INSTANCE = new BucketItemBehavior(); + public static final Factory FACTORY = new Factory(); + private static final Key ITEM_BUCKET_FILL = Key.of("item.bucket.fill"); + + @SuppressWarnings("unchecked") + @Override + public InteractionResult useOnBlock(UseOnContext context) { + BukkitWorldBlock clicked = (BukkitWorldBlock) context.getLevel().getBlockAt(context.getClickedPos()); + Block block = clicked.block(); + ImmutableBlockState state = BukkitBlockManager.instance().getImmutableBlockState(BlockStateUtils.blockDataToId(block.getBlockData())); + if (state == null || state.isEmpty()) return InteractionResult.PASS; + CustomBlock customBlock = state.owner().value(); + Property waterlogged = (Property) customBlock.getProperty("waterlogged"); + if (waterlogged == null) return InteractionResult.PASS; + boolean waterloggedState = state.get(waterlogged); + if (!waterloggedState) return InteractionResult.PASS; + BlockPos pos = context.getClickedPos(); + Player player = (Player) context.getPlayer().platformPlayer(); + World world = player.getWorld(); + Location location = new Location(world, pos.x(), pos.y(), pos.z()); + EquipmentSlot slot = context.getHand() == InteractionHand.MAIN_HAND ? EquipmentSlot.HAND : EquipmentSlot.OFF_HAND; + + CraftEngineBlocks.place(location, state.with(waterlogged, false), UpdateOption.UPDATE_ALL, false); + if (player.getGameMode() == GameMode.SURVIVAL) { + // to prevent dupe in moment + player.getInventory().setItem(slot, new ItemStack(Material.AIR)); + BukkitCraftEngine.instance().scheduler().sync().runDelayed(() -> + player.getInventory().setItem(slot, new ItemStack(Material.WATER_BUCKET)), world, location.getBlockX() >> 4, location.getBlockZ() >> 4); + } + player.setStatistic(Statistic.USE_ITEM, Material.BUCKET, player.getStatistic(Statistic.USE_ITEM, Material.BUCKET) + 1); + // client will assume it has sounds + // context.getPlayer().level().playBlockSound(Vec3d.atCenterOf(context.getClickedPos()), ITEM_BUCKET_FILL, 1, 1); + return InteractionResult.SUCCESS_AND_CANCEL; + } + + public static class Factory implements ItemBehaviorFactory { + @Override + public ItemBehavior create(Pack pack, Path path, Key id, Map arguments) { + return INSTANCE; + } + } +} diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/item/behavior/BukkitItemBehaviors.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/item/behavior/BukkitItemBehaviors.java new file mode 100644 index 000000000..f11054634 --- /dev/null +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/item/behavior/BukkitItemBehaviors.java @@ -0,0 +1,23 @@ +package net.momirealms.craftengine.bukkit.item.behavior; + +import net.momirealms.craftengine.core.item.behavior.EmptyItemBehavior; +import net.momirealms.craftengine.core.item.behavior.ItemBehaviors; +import net.momirealms.craftengine.core.util.Key; + +public class BukkitItemBehaviors extends ItemBehaviors { + public static final Key EMPTY = Key.from("craftengine:empty"); + public static final Key BLOCK_ITEM = Key.from("craftengine:block_item"); + public static final Key FURNITURE_ITEM = Key.from("craftengine:furniture_item"); + public static final Key AXE_ITEM = Key.from("craftengine:axe_item"); + public static final Key WATER_BUCKET_ITEM = Key.from("craftengine:water_bucket_item"); + public static final Key BUCKET_ITEM = Key.from("craftengine:bucket_item"); + + public static void init() { + register(EMPTY, (pack, path, args, id) -> EmptyItemBehavior.INSTANCE); + register(BLOCK_ITEM, BlockItemBehavior.FACTORY); + register(FURNITURE_ITEM, FurnitureItemBehavior.FACTORY); + register(AXE_ITEM, AxeItemBehavior.FACTORY); + register(WATER_BUCKET_ITEM, WaterBucketItemBehavior.FACTORY); + register(BUCKET_ITEM, BucketItemBehavior.FACTORY); + } +} diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/item/behavior/FurnitureItemBehavior.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/item/behavior/FurnitureItemBehavior.java new file mode 100644 index 000000000..227cedae8 --- /dev/null +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/item/behavior/FurnitureItemBehavior.java @@ -0,0 +1,150 @@ +package net.momirealms.craftengine.bukkit.item.behavior; + +import net.momirealms.craftengine.bukkit.api.event.FurnitureAttemptPlaceEvent; +import net.momirealms.craftengine.bukkit.api.event.FurniturePlaceEvent; +import net.momirealms.craftengine.bukkit.entity.furniture.BukkitFurnitureManager; +import net.momirealms.craftengine.bukkit.entity.furniture.LoadedFurniture; +import net.momirealms.craftengine.bukkit.plugin.BukkitCraftEngine; +import net.momirealms.craftengine.bukkit.util.DirectionUtils; +import net.momirealms.craftengine.bukkit.util.EventUtils; +import net.momirealms.craftengine.core.entity.furniture.AnchorType; +import net.momirealms.craftengine.core.entity.furniture.CustomFurniture; +import net.momirealms.craftengine.core.entity.player.InteractionResult; +import net.momirealms.craftengine.core.entity.player.Player; +import net.momirealms.craftengine.core.item.Item; +import net.momirealms.craftengine.core.item.behavior.ItemBehavior; +import net.momirealms.craftengine.core.item.behavior.ItemBehaviorFactory; +import net.momirealms.craftengine.core.item.context.UseOnContext; +import net.momirealms.craftengine.core.pack.Pack; +import net.momirealms.craftengine.core.plugin.CraftEngine; +import net.momirealms.craftengine.core.util.Direction; +import net.momirealms.craftengine.core.util.Key; +import net.momirealms.craftengine.core.util.MiscUtils; +import net.momirealms.craftengine.core.util.Pair; +import net.momirealms.craftengine.core.world.Vec3d; +import org.bukkit.Location; +import org.bukkit.SoundCategory; +import org.bukkit.World; + +import java.nio.file.Path; +import java.util.Map; +import java.util.Optional; + +public class FurnitureItemBehavior extends ItemBehavior { + public static final Factory FACTORY = new Factory(); + private final Key id; + + public FurnitureItemBehavior(Key id) { + this.id = id; + } + + public Key furnitureId() { + return id; + } + + @Override + public InteractionResult useOnBlock(UseOnContext context) { + return this.place(context); + } + + public InteractionResult place(UseOnContext context) { + Optional optionalCustomFurniture = BukkitFurnitureManager.instance().getFurniture(this.id); + if (optionalCustomFurniture.isEmpty()) { + CraftEngine.instance().logger().warn("Furniture " + this.id + " not found"); + return InteractionResult.FAIL; + } + CustomFurniture customFurniture = optionalCustomFurniture.get(); + + Direction clickedFace = context.getClickedFace(); + AnchorType anchorType = switch (clickedFace) { + case EAST, WEST, NORTH, SOUTH -> AnchorType.WALL; + case UP -> AnchorType.GROUND; + case DOWN -> AnchorType.CEILING; + }; + + CustomFurniture.Placement placement = customFurniture.getPlacement(anchorType); + if (placement == null) { + return InteractionResult.FAIL; + } + + Player player = context.getPlayer(); + int gameTicks = player.gameTicks(); + if (!player.updateLastSuccessfulInteractionTick(gameTicks)) { + return InteractionResult.FAIL; + } + + Vec3d clickedPosition = context.getClickLocation(); + + // trigger event + org.bukkit.entity.Player bukkitPlayer = (org.bukkit.entity.Player) player.platformPlayer(); + World world = (World) context.getLevel().getHandle(); + + // get position and rotation for placement + Vec3d finalPlacePosition; + double furnitureYaw; + if (anchorType == AnchorType.WALL) { + furnitureYaw = Direction.getYaw(clickedFace); + if (clickedFace == Direction.EAST || clickedFace == Direction.WEST) { + Pair xz = placement.alignmentRule().apply(Pair.of(clickedPosition.y(), clickedPosition.z())); + finalPlacePosition = new Vec3d(clickedPosition.x(), xz.left(), xz.right()); + } else { + Pair xz = placement.alignmentRule().apply(Pair.of(clickedPosition.x(), clickedPosition.y())); + finalPlacePosition = new Vec3d(xz.left(), xz.right(), clickedPosition.z()); + } + } else { + furnitureYaw = placement.rotationRule().apply(180 + player.getXRot()); + Pair xz = placement.alignmentRule().apply(Pair.of(clickedPosition.x(), clickedPosition.z())); + finalPlacePosition = new Vec3d(xz.left(), clickedPosition.y(), xz.right()); + } + + Location furnitureLocation = new Location(world, finalPlacePosition.x(), finalPlacePosition.y(), finalPlacePosition.z(), (float) furnitureYaw, 0); + if (!BukkitCraftEngine.instance().antiGrief().canPlace(bukkitPlayer, furnitureLocation)) { + return InteractionResult.FAIL; + } + + if (!BukkitCraftEngine.instance().antiGrief().canPlace(bukkitPlayer, furnitureLocation)) { + return InteractionResult.FAIL; + } + + FurnitureAttemptPlaceEvent attemptPlaceEvent = new FurnitureAttemptPlaceEvent(bukkitPlayer, customFurniture, anchorType, furnitureLocation.clone(), + DirectionUtils.toBlockFace(clickedFace), context.getHand(), world.getBlockAt(context.getClickedPos().x(), context.getClickedPos().y(), context.getClickedPos().z())); + if (EventUtils.fireAndCheckCancel(attemptPlaceEvent)) { + return InteractionResult.FAIL; + } + + LoadedFurniture loadedFurniture = BukkitFurnitureManager.instance().place(customFurniture, furnitureLocation.clone(), anchorType, false); + + FurniturePlaceEvent placeEvent = new FurniturePlaceEvent(bukkitPlayer, loadedFurniture, furnitureLocation, context.getHand()); + if (EventUtils.fireAndCheckCancel(placeEvent)) { + loadedFurniture.destroy(); + return InteractionResult.FAIL; + } + + if (!player.isCreativeMode()) { + Item item = context.getItem(); + item.count(item.count() - 1); + item.load(); + } + + furnitureLocation.getWorld().playSound(furnitureLocation, customFurniture.settings().sounds().placeSound().toString(), SoundCategory.BLOCKS,1f, 1f); + player.swingHand(context.getHand()); + return InteractionResult.SUCCESS; + } + + public static class Factory implements ItemBehaviorFactory { + + @Override + public ItemBehavior create(Pack pack, Path path, Key key, Map arguments) { + Object id = arguments.get("furniture"); + if (id == null) { + throw new IllegalArgumentException("Missing required parameter 'furniture' for furniture_item behavior"); + } + if (id instanceof Map map) { + BukkitFurnitureManager.instance().parseSection(pack, path, key, MiscUtils.castToMap(map, false)); + return new FurnitureItemBehavior(key); + } else { + return new FurnitureItemBehavior(Key.of(id.toString())); + } + } + } +} diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/item/behavior/WaterBucketItemBehavior.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/item/behavior/WaterBucketItemBehavior.java new file mode 100644 index 000000000..3ba0b2fb0 --- /dev/null +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/item/behavior/WaterBucketItemBehavior.java @@ -0,0 +1,64 @@ +package net.momirealms.craftengine.bukkit.item.behavior; + +import net.momirealms.craftengine.bukkit.api.CraftEngineBlocks; +import net.momirealms.craftengine.bukkit.block.BukkitBlockManager; +import net.momirealms.craftengine.bukkit.plugin.BukkitCraftEngine; +import net.momirealms.craftengine.bukkit.util.BlockStateUtils; +import net.momirealms.craftengine.bukkit.world.BukkitWorldBlock; +import net.momirealms.craftengine.core.block.CustomBlock; +import net.momirealms.craftengine.core.block.ImmutableBlockState; +import net.momirealms.craftengine.core.block.UpdateOption; +import net.momirealms.craftengine.core.block.properties.Property; +import net.momirealms.craftengine.core.entity.player.InteractionResult; +import net.momirealms.craftengine.core.item.behavior.ItemBehavior; +import net.momirealms.craftengine.core.item.behavior.ItemBehaviorFactory; +import net.momirealms.craftengine.core.item.context.UseOnContext; +import net.momirealms.craftengine.core.pack.Pack; +import net.momirealms.craftengine.core.util.Key; +import net.momirealms.craftengine.core.world.BlockPos; +import org.bukkit.Location; +import org.bukkit.World; +import org.bukkit.block.Block; +import org.bukkit.entity.Player; + +import java.nio.file.Path; +import java.util.Map; + +public class WaterBucketItemBehavior extends ItemBehavior { + public static final WaterBucketItemBehavior INSTANCE = new WaterBucketItemBehavior(); + public static final Factory FACTORY = new Factory(); + + @SuppressWarnings("unchecked") + @Override + public InteractionResult useOnBlock(UseOnContext context) { + BlockPos pos = context.getClickedPos(); + BukkitWorldBlock clicked = (BukkitWorldBlock) context.getLevel().getBlockAt(pos); + Block block = clicked.block(); + ImmutableBlockState state = BukkitBlockManager.instance().getImmutableBlockState(BlockStateUtils.blockDataToId(block.getBlockData())); + if (state == null || state.isEmpty()) return InteractionResult.PASS; + CustomBlock customBlock = state.owner().value(); + Property waterlogged = (Property) customBlock.getProperty("waterlogged"); + if (waterlogged == null) return InteractionResult.PASS; + + Player player = (Player) context.getPlayer().platformPlayer(); + World world = player.getWorld(); + Location location = new Location(world, pos.x(), pos.y(), pos.z()); + + // TODO Refactor all of this because it's playing a trick with the server + ImmutableBlockState nextState = state.with(waterlogged, true); + block.setBlockData(BlockStateUtils.createBlockData(nextState.vanillaBlockState().handle()), false); + // actually we should broadcast this change + context.getPlayer().sendPacket(BlockStateUtils.createBlockUpdatePacket(pos, state), true); + BukkitCraftEngine.instance().scheduler().sync().runDelayed(() -> + CraftEngineBlocks.place(location, nextState, UpdateOption.UPDATE_ALL, false), world, location.getBlockX() >> 4, location.getBlockZ() >> 4); + + return InteractionResult.SUCCESS; + } + + public static class Factory implements ItemBehaviorFactory { + @Override + public ItemBehavior create(Pack pack, Path path, Key id, Map arguments) { + return INSTANCE; + } + } +} diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/item/factory/BukkitItemFactory.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/item/factory/BukkitItemFactory.java new file mode 100644 index 000000000..dcf376d74 --- /dev/null +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/item/factory/BukkitItemFactory.java @@ -0,0 +1,137 @@ +package net.momirealms.craftengine.bukkit.item.factory; + +import com.saicone.rtag.RtagItem; +import net.momirealms.craftengine.bukkit.item.RTagItemWrapper; +import net.momirealms.craftengine.bukkit.util.ItemTags; +import net.momirealms.craftengine.bukkit.util.Reflections; +import net.momirealms.craftengine.core.item.ItemFactory; +import net.momirealms.craftengine.core.item.ItemWrapper; +import net.momirealms.craftengine.core.item.modifier.IdModifier; +import net.momirealms.craftengine.core.plugin.CraftEngine; +import net.momirealms.craftengine.core.util.Key; +import org.bukkit.inventory.ItemStack; + +import java.util.Objects; +import java.util.Optional; + +public abstract class BukkitItemFactory extends ItemFactory { + + protected BukkitItemFactory(CraftEngine plugin) { + super(plugin); + } + + public static BukkitItemFactory create(CraftEngine plugin) { + Objects.requireNonNull(plugin, "plugin"); + switch (plugin.serverVersion()) { + case "1.20", "1.20.1", "1.20.2", "1.20.3", "1.20.4" -> { + return new UniversalItemFactory(plugin); + } + case "1.20.5", "1.20.6", + "1.21", "1.21.1", "1.21.2", "1.21.3", "1.21.4", "1.21.5", + "1.22", "1.22.1" -> { + return new ComponentItemFactory(plugin); + } + default -> throw new IllegalStateException("Unsupported server version: " + plugin.serverVersion()); + } + } + + @Override + protected Key id(ItemWrapper item) { + Object id = item.get(IdModifier.CRAFT_ENGINE_ID); + if (id == null) return Key.of(item.getItem().getType().getKey().asString()); + return Key.of(id.toString()); + } + + @Override + protected Optional customId(ItemWrapper item) { + Object id = item.get(IdModifier.CRAFT_ENGINE_ID); + if (id == null) return Optional.empty(); + return Optional.of(Key.of(id.toString())); + } + + @Override + protected boolean isBlockItem(ItemWrapper item) { + return item.getItem().getType().isBlock(); + } + + @Override + protected Key vanillaId(ItemWrapper item) { + return Key.of(item.getItem().getType().getKey().asString()); + } + + @Override + protected ItemWrapper wrapInternal(ItemStack item) { + return new RTagItemWrapper(new RtagItem(item), item.getAmount()); + } + + @Override + protected void setTag(ItemWrapper item, Object value, Object... path) { + item.set(value, path); + } + + @Override + protected Object getTag(ItemWrapper item, Object... path) { + return item.get(path); + } + + @Override + protected boolean hasTag(ItemWrapper item, Object... path) { + return item.hasTag(path); + } + + @Override + protected boolean removeTag(ItemWrapper item, Object... path) { + return item.remove(path); + } + + @Override + protected void setComponent(ItemWrapper item, String type, Object value) { + item.setComponent(type, value); + } + + @Override + protected Object getComponent(ItemWrapper item, String type) { + return item.getComponent(type); + } + + @Override + protected boolean hasComponent(ItemWrapper item, String type) { + return item.hasComponent(type); + } + + @Override + protected void removeComponent(ItemWrapper item, String type) { + item.removeComponent(type); + } + + @Override + protected void update(ItemWrapper item) { + item.update(); + } + + @Override + protected ItemStack load(ItemWrapper item) { + return item.load(); + } + + @Override + protected ItemStack getItem(ItemWrapper item) { + return item.getItem(); + } + + @Override + protected ItemStack loadCopy(ItemWrapper item) { + return item.loadCopy(); + } + + @Override + protected boolean is(ItemWrapper item, Key itemTag) { + Object literalObject = item.getLiteralObject(); + Object tag = ItemTags.getOrCreate(itemTag); + try { + return (boolean) Reflections.method$ItemStack$isTag.invoke(literalObject, tag); + } catch (ReflectiveOperationException e) { + return false; + } + } +} diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/item/factory/ComponentItemFactory.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/item/factory/ComponentItemFactory.java new file mode 100644 index 000000000..ed459d03a --- /dev/null +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/item/factory/ComponentItemFactory.java @@ -0,0 +1,275 @@ +package net.momirealms.craftengine.bukkit.item.factory; + +import com.saicone.rtag.data.ComponentType; +import net.momirealms.craftengine.bukkit.util.EnchantmentUtils; +import net.momirealms.craftengine.core.item.ComponentKeys; +import net.momirealms.craftengine.core.item.Enchantment; +import net.momirealms.craftengine.core.item.ItemWrapper; +import net.momirealms.craftengine.core.plugin.CraftEngine; +import net.momirealms.craftengine.core.util.Key; +import net.momirealms.craftengine.core.util.VersionHelper; +import org.bukkit.inventory.ItemStack; + +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Optional; +import java.util.function.BiConsumer; +import java.util.function.Function; + +@SuppressWarnings("UnstableApiUsage") +public class ComponentItemFactory extends BukkitItemFactory { + + private final BiConsumer, Integer> customModelDataSetter; + private final Function, Optional> customModelDataGetter; + + public ComponentItemFactory(CraftEngine plugin) { + super(plugin); + this.customModelDataSetter = VersionHelper.isVersionNewerThan1_21_4() ? + ((item, data) -> item.setComponent(ComponentKeys.CUSTOM_MODEL_DATA, + Map.of("floats", List.of(data.floatValue())))) : ((item, data) -> item.setComponent(ComponentKeys.CUSTOM_MODEL_DATA, data)); + this.customModelDataGetter = VersionHelper.isVersionNewerThan1_21_4() ? + (item) -> { + Optional optional = ComponentType.encodeJava(ComponentKeys.CUSTOM_MODEL_DATA, item.getComponent(ComponentKeys.CUSTOM_MODEL_DATA)); + if (optional.isEmpty()) return Optional.empty(); + @SuppressWarnings("unchecked") + Map data = (Map) optional.get(); + @SuppressWarnings("unchecked") + List floats = (List) data.get("floats"); + if (floats == null || floats.isEmpty()) return Optional.empty(); + return Optional.of((int) Math.floor(floats.get(0))); + } : (item) -> Optional.ofNullable( + (Integer) ComponentType.encodeJava( + ComponentKeys.CUSTOM_MODEL_DATA, + item.getComponent(ComponentKeys.CUSTOM_MODEL_DATA) + ).orElse(null) + ); + } + + @Override + protected void customModelData(ItemWrapper item, Integer data) { + if (data == null) { + item.removeComponent(ComponentKeys.CUSTOM_MODEL_DATA); + } else { + this.customModelDataSetter.accept(item, data); + } + } + + @Override + protected Optional customModelData(ItemWrapper item) { + if (!item.hasComponent(ComponentKeys.CUSTOM_MODEL_DATA)) return Optional.empty(); + return this.customModelDataGetter.apply(item); + } + + @Override + protected void displayName(ItemWrapper item, String json) { + if (json == null) { + item.removeComponent(ComponentKeys.CUSTOM_NAME); + } else { + item.setComponent(ComponentKeys.CUSTOM_NAME, json); + } + } + + @Override + protected Optional displayName(ItemWrapper item) { + if (!item.hasComponent(ComponentKeys.CUSTOM_NAME)) return Optional.empty(); + return Optional.ofNullable( + (String) ComponentType.encodeJava( + ComponentKeys.CUSTOM_NAME, + item.getComponent(ComponentKeys.CUSTOM_NAME) + ).orElse(null) + ); + } + + @Override + protected void itemName(ItemWrapper item, String json) { + if (json == null) { + item.removeComponent(ComponentKeys.ITEM_NAME); + } else { + item.setComponent(ComponentKeys.ITEM_NAME, json); + } + } + + @Override + protected Optional itemName(ItemWrapper item) { + if (!item.hasComponent(ComponentKeys.ITEM_NAME)) return Optional.empty(); + return Optional.ofNullable( + (String) ComponentType.encodeJava( + ComponentKeys.ITEM_NAME, + item.getComponent(ComponentKeys.ITEM_NAME) + ).orElse(null) + ); + } + + @Override + protected void skull(ItemWrapper item, String skullData) { + final Map profile = Map.of( + "properties", List.of( + Map.of( + "name", "textures", + "value", skullData + ) + ) + ); + item.setComponent("minecraft:profile", profile); + } + + @SuppressWarnings("unchecked") + @Override + protected Optional> lore(ItemWrapper item) { + if (!item.hasComponent(ComponentKeys.LORE)) return Optional.empty(); + return Optional.ofNullable( + (List) ComponentType.encodeJava( + ComponentKeys.LORE, + item.getComponent(ComponentKeys.LORE) + ).orElse(null) + ); + } + + @Override + protected void lore(ItemWrapper item, List lore) { + if (lore == null || lore.isEmpty()) { + item.removeComponent(ComponentKeys.LORE); + } else { + item.setComponent(ComponentKeys.LORE, lore); + } + } + + @Override + protected boolean unbreakable(ItemWrapper item) { + return item.hasComponent(ComponentKeys.UNBREAKABLE); + } + + @Override + protected void unbreakable(ItemWrapper item, boolean unbreakable) { + if (unbreakable) { + item.removeComponent(ComponentKeys.UNBREAKABLE); + } else { + item.setComponent(ComponentKeys.UNBREAKABLE, true); + } + } + + @Override + protected Optional glint(ItemWrapper item) { + return Optional.ofNullable((Boolean) item.getComponent(ComponentKeys.ENCHANTMENT_GLINT_OVERRIDE)); + } + + @Override + protected void glint(ItemWrapper item, Boolean glint) { + item.setComponent(ComponentKeys.ENCHANTMENT_GLINT_OVERRIDE, glint); + } + + @Override + protected Optional damage(ItemWrapper item) { + if (!item.hasComponent(ComponentKeys.DAMAGE)) return Optional.empty(); + return Optional.ofNullable( + (Integer) ComponentType.encodeJava( + ComponentKeys.DAMAGE, + item.getComponent(ComponentKeys.DAMAGE) + ).orElse(null) + ); + } + + @Override + protected void damage(ItemWrapper item, Integer damage) { + if (damage == null) damage = 0; + item.setComponent(ComponentKeys.DAMAGE, damage); + } + + @Override + protected Optional maxDamage(ItemWrapper item) { + if (!item.hasComponent(ComponentKeys.MAX_DAMAGE)) return Optional.of((int) item.getItem().getType().getMaxDurability()); + return Optional.ofNullable( + (Integer) ComponentType.encodeJava( + ComponentKeys.MAX_DAMAGE, + item.getComponent(ComponentKeys.MAX_DAMAGE) + ).orElse(null) + ); + } + + @Override + protected void maxDamage(ItemWrapper item, Integer damage) { + if (damage == null) { + item.removeComponent(ComponentKeys.MAX_DAMAGE); + } else { + item.setComponent(ComponentKeys.MAX_DAMAGE, damage); + } + } + + @Override + protected Optional getEnchantment(ItemWrapper item, Key key) { + Object enchant = item.getComponent(ComponentKeys.ENCHANTMENTS); + try { + Map map = EnchantmentUtils.toMap(enchant); + Integer level = map.get(key.toString()); + if (level == null) return Optional.empty(); + return Optional.of(new Enchantment(key, level)); + } catch (ReflectiveOperationException e) { + plugin.logger().warn("Failed to get enchantment " + key, e); + return Optional.empty(); + } + } + + @Override + protected void enchantments(ItemWrapper item, List enchantments) { + Map enchants = new HashMap<>(); + for (Enchantment enchantment : enchantments) { + enchants.put(enchantment.id().toString(), enchantment.level()); + } + item.setComponent(ComponentKeys.ENCHANTMENTS, enchants); + } + + @Override + protected void storedEnchantments(ItemWrapper item, List enchantments) { + Map enchants = new HashMap<>(); + for (Enchantment enchantment : enchantments) { + enchants.put(enchantment.id().toString(), enchantment.level()); + } + item.setComponent(ComponentKeys.STORED_ENCHANTMENTS, enchants); + } + + @Override + protected void addEnchantment(ItemWrapper item, Enchantment enchantment) { + Object enchant = item.getComponent(ComponentKeys.ENCHANTMENTS); + try { + Map map = EnchantmentUtils.toMap(enchant); + map.put(enchantment.toString(), enchantment.level()); + item.setComponent(ComponentKeys.ENCHANTMENTS, map); + } catch (ReflectiveOperationException e) { + plugin.logger().warn("Failed to add enchantment", e); + } + } + + @Override + protected void addStoredEnchantment(ItemWrapper item, Enchantment enchantment) { + Object enchant = item.getComponent(ComponentKeys.STORED_ENCHANTMENTS); + try { + Map map = EnchantmentUtils.toMap(enchant); + map.put(enchantment.toString(), enchantment.level()); + item.setComponent(ComponentKeys.STORED_ENCHANTMENTS, map); + } catch (ReflectiveOperationException e) { + plugin.logger().warn("Failed to add stored enchantment", e); + } + } + + @Override + protected void itemFlags(ItemWrapper item, List flags) { + throw new UnsupportedOperationException("This feature is not available on 1.20.5+"); + } + + @Override + protected int maxStackSize(ItemWrapper item) { + if (!item.hasComponent(ComponentKeys.MAX_STACK_SIZE)) return item.getItem().getType().getMaxStackSize(); + return Optional.ofNullable((Integer) ComponentType.encodeJava(ComponentKeys.MAX_STACK_SIZE, item.getComponent(ComponentKeys.MAX_STACK_SIZE)).orElse(null)) + .orElse(item.getItem().getType().getMaxStackSize()); + } + + @Override + protected void maxStackSize(ItemWrapper item, Integer maxStackSize) { + if (maxStackSize == null) { + item.removeComponent(ComponentKeys.MAX_STACK_SIZE); + } else { + item.setComponent(ComponentKeys.MAX_STACK_SIZE, maxStackSize); + } + } +} \ No newline at end of file diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/item/factory/UniversalItemFactory.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/item/factory/UniversalItemFactory.java new file mode 100644 index 000000000..a404a5bc5 --- /dev/null +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/item/factory/UniversalItemFactory.java @@ -0,0 +1,221 @@ +package net.momirealms.craftengine.bukkit.item.factory; + +import com.saicone.rtag.tag.TagBase; +import com.saicone.rtag.tag.TagCompound; +import com.saicone.rtag.tag.TagList; +import net.momirealms.craftengine.core.item.Enchantment; +import net.momirealms.craftengine.core.item.ItemWrapper; +import net.momirealms.craftengine.core.plugin.CraftEngine; +import net.momirealms.craftengine.core.util.Key; +import net.momirealms.craftengine.core.util.SkullUtils; +import org.bukkit.NamespacedKey; +import org.bukkit.Registry; +import org.bukkit.inventory.ItemFlag; +import org.bukkit.inventory.ItemStack; + +import java.nio.charset.StandardCharsets; +import java.util.*; + +public class UniversalItemFactory extends BukkitItemFactory { + + public UniversalItemFactory(CraftEngine plugin) { + super(plugin); + } + + @Override + protected void displayName(ItemWrapper item, String json) { + if (json != null) { + item.set(json, "display", "Name"); + } else { + item.remove("display", "Name"); + } + } + + @Override + protected Optional displayName(ItemWrapper item) { + if (!item.hasTag("display", "Name")) return Optional.empty(); + return Optional.of(item.get("display", "Name")); + } + + @Override + protected void itemName(ItemWrapper item, String json) { + throw new UnsupportedOperationException("This feature is only available on 1.20.5+"); + } + + @Override + protected Optional itemName(ItemWrapper item) { + throw new UnsupportedOperationException("This feature is only available on 1.20.5+"); + } + + @Override + protected void customModelData(ItemWrapper item, Integer data) { + if (data == null) { + item.remove("CustomModelData"); + } else { + item.set(data, "CustomModelData"); + } + } + + @Override + protected Optional customModelData(ItemWrapper item) { + if (!item.hasTag("CustomModelData")) return Optional.empty(); + return Optional.of(item.get("CustomModelData")); + } + + @Override + protected void skull(ItemWrapper item, String skullData) { + if (skullData == null) { + item.remove("SkullOwner"); + } else { + item.set(UUID.nameUUIDFromBytes(SkullUtils.identifierFromBase64(skullData).getBytes(StandardCharsets.UTF_8)), "SkullOwner", "Id"); + item.set( + List.of(Map.of("Value", skullData)), + "SkullOwner", "Properties", "textures" + ); + } + } + + @Override + protected Optional> lore(ItemWrapper item) { + if (!item.hasTag("display", "Lore")) return Optional.empty(); + return Optional.of(item.get("display", "Lore")); + } + + @Override + protected void lore(ItemWrapper item, List lore) { + if (lore == null || lore.isEmpty()) { + item.remove("display", "Lore"); + } else { + item.set(lore, "display", "Lore"); + } + } + + @Override + protected boolean unbreakable(ItemWrapper item) { + return Optional.ofNullable((Boolean) item.get("Unbreakable")).orElse(false); + } + + @Override + protected void unbreakable(ItemWrapper item, boolean unbreakable) { + item.set(unbreakable, "Unbreakable"); + } + + @Override + protected Optional glint(ItemWrapper item) { + return Optional.of(false); + } + + @Override + protected void glint(ItemWrapper item, Boolean glint) { + throw new UnsupportedOperationException("This feature is only available on 1.20.5+"); + } + + @Override + protected Optional damage(ItemWrapper item) { + if (!item.hasTag("Damage")) return Optional.empty(); + return Optional.of(item.get("Damage")); + } + + @Override + protected void damage(ItemWrapper item, Integer damage) { + item.set(damage, "Damage"); + } + + @Override + protected Optional maxDamage(ItemWrapper item) { +// if (!item.hasTag("CustomFishing", "max_dur")) return Optional.empty(); +// return Optional.of(item.get("CustomFishing", "max_dur")); + return Optional.of((int) item.getItem().getType().getMaxDurability()); + } + + @Override + protected void maxDamage(ItemWrapper item, Integer damage) { +// if (damage == null) { +// item.remove("CustomFishing", "max_dur"); +// } else { +// item.set(damage, "CustomFishing", "max_dur"); +// } + throw new UnsupportedOperationException("This feature is only available on 1.20.5+"); + } + + @Override + protected void enchantments(ItemWrapper item, List enchantments) { + ArrayList tags = new ArrayList<>(); + for (Enchantment enchantment : enchantments) { + tags.add((Map.of("id", enchantment.id().toString(), "lvl", (short) enchantment.level()))); + } + item.set(tags, "Enchantments"); + } + + @Override + protected void storedEnchantments(ItemWrapper item, List enchantments) { + ArrayList tags = new ArrayList<>(); + for (Enchantment enchantment : enchantments) { + tags.add((Map.of("id", enchantment.id().toString(), "lvl", (short) enchantment.level()))); + } + item.set(tags, "StoredEnchantments"); + } + + @Override + protected void addEnchantment(ItemWrapper item, Enchantment enchantment) { + Object enchantments = item.getExact("Enchantments"); + if (enchantments != null) { + for (Object enchant : TagList.getValue(enchantments)) { + if (TagBase.getValue(TagCompound.get(enchant, "id")).equals(enchant.toString())) { + TagCompound.set(enchant, "lvl", TagBase.newTag(enchantment.level())); + return; + } + } + item.add(Map.of("id", enchantment.toString(), "lvl", (short) enchantment.level()), "Enchantments"); + } else { + item.set(List.of(Map.of("id", enchantment.toString(), "lvl", (short) enchantment.level())), "Enchantments"); + } + } + + @Override + protected void addStoredEnchantment(ItemWrapper item, Enchantment enchantment) { + Object enchantments = item.getExact("StoredEnchantments"); + if (enchantments != null) { + for (Object enchant : TagList.getValue(enchantments)) { + if (TagBase.getValue(TagCompound.get(enchant, "id")).equals(enchant.toString())) { + TagCompound.set(enchant, "lvl", TagBase.newTag(enchantment.level())); + return; + } + } + item.add(Map.of("id", enchantment.toString(), "lvl", (short) enchantment.level()), "StoredEnchantments"); + } else { + item.set(List.of(Map.of("id", enchantment.toString(), "lvl", (short) enchantment.level())), "StoredEnchantments"); + } + } + + @SuppressWarnings("deprecation") + @Override + protected Optional getEnchantment(ItemWrapper item, Key key) { + int level = item.getItem().getEnchantmentLevel(Objects.requireNonNull(Registry.ENCHANTMENT.get(new NamespacedKey(key.namespace(), key.value())))); + if (level <= 0) return Optional.empty(); + return Optional.of(new Enchantment(key, level)); + } + + @Override + protected void itemFlags(ItemWrapper item, List flags) { + if (flags == null || flags.isEmpty()) { + item.remove("HideFlags"); + return; + } + int f = 0; + for (String flag : flags) { + ItemFlag itemFlag = ItemFlag.valueOf(flag); + f = f | 1 << itemFlag.ordinal(); + } + item.set(f, "HideFlags"); + } + + @Override + protected int maxStackSize(ItemWrapper item) { + return item.getItem().getType().getMaxStackSize(); + } + + @Override + protected void maxStackSize(ItemWrapper item, Integer maxStackSize) { + } +} \ No newline at end of file diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/item/recipe/BukkitRecipeManager.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/item/recipe/BukkitRecipeManager.java new file mode 100644 index 000000000..d412110b2 --- /dev/null +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/item/recipe/BukkitRecipeManager.java @@ -0,0 +1,892 @@ +package net.momirealms.craftengine.bukkit.item.recipe; + +import com.google.gson.JsonObject; +import com.google.gson.JsonParser; +import com.saicone.rtag.item.ItemObject; +import com.saicone.rtag.tag.TagCompound; +import net.momirealms.craftengine.bukkit.item.BukkitItemManager; +import net.momirealms.craftengine.bukkit.item.CloneableConstantItem; +import net.momirealms.craftengine.bukkit.plugin.BukkitCraftEngine; +import net.momirealms.craftengine.bukkit.util.MaterialUtils; +import net.momirealms.craftengine.bukkit.util.RecipeUtils; +import net.momirealms.craftengine.bukkit.util.Reflections; +import net.momirealms.craftengine.core.item.CustomItem; +import net.momirealms.craftengine.core.item.ItemBuildContext; +import net.momirealms.craftengine.core.item.recipe.Recipe; +import net.momirealms.craftengine.core.item.recipe.*; +import net.momirealms.craftengine.core.item.recipe.input.RecipeInput; +import net.momirealms.craftengine.core.item.recipe.vanilla.*; +import net.momirealms.craftengine.core.item.recipe.vanilla.reader.VanillaRecipeReader1_20; +import net.momirealms.craftengine.core.item.recipe.vanilla.reader.VanillaRecipeReader1_20_5; +import net.momirealms.craftengine.core.item.recipe.vanilla.reader.VanillaRecipeReader1_21_2; +import net.momirealms.craftengine.core.pack.Pack; +import net.momirealms.craftengine.core.plugin.CraftEngine; +import net.momirealms.craftengine.core.plugin.config.ConfigManager; +import net.momirealms.craftengine.core.registry.BuiltInRegistries; +import net.momirealms.craftengine.core.registry.Holder; +import net.momirealms.craftengine.core.util.HeptaFunction; +import net.momirealms.craftengine.core.util.Key; +import net.momirealms.craftengine.core.util.PentaFunction; +import net.momirealms.craftengine.core.util.VersionHelper; +import org.bukkit.Bukkit; +import org.bukkit.Material; +import org.bukkit.NamespacedKey; +import org.bukkit.event.HandlerList; +import org.bukkit.inventory.*; +import org.bukkit.inventory.recipe.CookingBookCategory; +import org.bukkit.inventory.recipe.CraftingBookCategory; +import org.jetbrains.annotations.Nullable; + +import java.io.Reader; +import java.lang.reflect.Array; +import java.lang.reflect.Method; +import java.nio.file.Path; +import java.util.*; +import java.util.concurrent.CompletableFuture; +import java.util.function.BiConsumer; +import java.util.function.Consumer; + +public class BukkitRecipeManager implements RecipeManager { + private static final Map>> BUKKIT_RECIPE_FACTORIES = new HashMap<>(); + private static Object minecraftRecipeManager; + private static final List injectedIngredients = new ArrayList<>(); + private static final IdentityHashMap, Object> recipeToMcRecipeHolder = new IdentityHashMap<>(); + private static BukkitRecipeManager instance; + + static { + BUKKIT_RECIPE_FACTORIES.put(RecipeTypes.SHAPED, (key, recipe) -> { + CustomShapedRecipe ceRecipe = (CustomShapedRecipe) recipe; + ShapedRecipe shapedRecipe = new ShapedRecipe(key, ceRecipe.result(ItemBuildContext.EMPTY)); + if (ceRecipe.group() != null) { + shapedRecipe.setGroup(Objects.requireNonNull(ceRecipe.group())); + } + if (ceRecipe.category() != null) { + shapedRecipe.setCategory(CraftingBookCategory.valueOf(Objects.requireNonNull(ceRecipe.category()).name())); + } + shapedRecipe.shape(ceRecipe.pattern().pattern()); + for (Map.Entry> entry : ceRecipe.pattern().ingredients().entrySet()) { + shapedRecipe.setIngredient(entry.getKey(), new RecipeChoice.MaterialChoice(ingredientToBukkitMaterials(entry.getValue()))); + } + try { + Object craftRecipe = Reflections.method$CraftShapedRecipe$fromBukkitRecipe.invoke(null, shapedRecipe); + Reflections.method$CraftRecipe$addToCraftingManager.invoke(craftRecipe); + injectShapedRecipe(new Key(key.namespace(), key.value()), ceRecipe); + } catch (Exception e) { + CraftEngine.instance().logger().warn("Failed to convert shaped recipe", e); + } + }); + BUKKIT_RECIPE_FACTORIES.put(RecipeTypes.SHAPELESS, (key, recipe) -> { + CustomShapelessRecipe ceRecipe = (CustomShapelessRecipe) recipe; + ShapelessRecipe shapelessRecipe = new ShapelessRecipe(key, ceRecipe.result(ItemBuildContext.EMPTY)); + if (ceRecipe.group() != null) { + shapelessRecipe.setGroup(Objects.requireNonNull(ceRecipe.group())); + } + if (ceRecipe.category() != null) { + shapelessRecipe.setCategory(CraftingBookCategory.valueOf(Objects.requireNonNull(ceRecipe.category()).name())); + } + for (Ingredient ingredient : ceRecipe.ingredients()) { + shapelessRecipe.addIngredient(new RecipeChoice.MaterialChoice(ingredientToBukkitMaterials(ingredient))); + } + try { + Object craftRecipe = Reflections.method$CraftShapelessRecipe$fromBukkitRecipe.invoke(null, shapelessRecipe); + Reflections.method$CraftRecipe$addToCraftingManager.invoke(craftRecipe); + injectShapelessRecipe(new Key(key.namespace(), key.value()), ceRecipe); + } catch (Exception e) { + CraftEngine.instance().logger().warn("Failed to convert shapeless recipe", e); + } + }); + BUKKIT_RECIPE_FACTORIES.put(RecipeTypes.SMELTING, (key, recipe) -> { + CustomSmeltingRecipe ceRecipe = (CustomSmeltingRecipe) recipe; + FurnaceRecipe furnaceRecipe = new FurnaceRecipe( + key, ceRecipe.result(ItemBuildContext.EMPTY), + new RecipeChoice.MaterialChoice(ingredientToBukkitMaterials(ceRecipe.ingredient())), + ceRecipe.experience(), ceRecipe.cookingTime() + ); + if (ceRecipe.group() != null) { + furnaceRecipe.setGroup(Objects.requireNonNull(ceRecipe.group())); + } + if (ceRecipe.category() != null) { + furnaceRecipe.setCategory(CookingBookCategory.valueOf(Objects.requireNonNull(ceRecipe.category()).name())); + } + try { + Object craftRecipe = Reflections.method$CraftFurnaceRecipe$fromBukkitRecipe.invoke(null, furnaceRecipe); + Reflections.method$CraftRecipe$addToCraftingManager.invoke(craftRecipe); + injectCookingRecipe(new Key(key.namespace(), key.value()), ceRecipe); + } catch (Exception e) { + CraftEngine.instance().logger().warn("Failed to convert smelting recipe", e); + } + }); + BUKKIT_RECIPE_FACTORIES.put(RecipeTypes.SMOKING, (key, recipe) -> { + CustomSmokingRecipe ceRecipe = (CustomSmokingRecipe) recipe; + SmokingRecipe smokingRecipe = new SmokingRecipe( + key, ceRecipe.result(ItemBuildContext.EMPTY), + new RecipeChoice.MaterialChoice(ingredientToBukkitMaterials(ceRecipe.ingredient())), + ceRecipe.experience(), ceRecipe.cookingTime() + ); + if (ceRecipe.group() != null) { + smokingRecipe.setGroup(Objects.requireNonNull(ceRecipe.group())); + } + if (ceRecipe.category() != null) { + smokingRecipe.setCategory(CookingBookCategory.valueOf(Objects.requireNonNull(ceRecipe.category()).name())); + } + try { + Object craftRecipe = Reflections.method$CraftSmokingRecipe$fromBukkitRecipe.invoke(null, smokingRecipe); + Reflections.method$CraftRecipe$addToCraftingManager.invoke(craftRecipe); + injectCookingRecipe(new Key(key.namespace(), key.value()), ceRecipe); + } catch (Exception e) { + CraftEngine.instance().logger().warn("Failed to convert smoking recipe", e); + } + }); + BUKKIT_RECIPE_FACTORIES.put(RecipeTypes.BLASTING, (key, recipe) -> { + CustomBlastingRecipe ceRecipe = (CustomBlastingRecipe) recipe; + BlastingRecipe blastingRecipe = new BlastingRecipe( + key, ceRecipe.result(ItemBuildContext.EMPTY), + new RecipeChoice.MaterialChoice(ingredientToBukkitMaterials(ceRecipe.ingredient())), + ceRecipe.experience(), ceRecipe.cookingTime() + ); + if (ceRecipe.group() != null) { + blastingRecipe.setGroup(Objects.requireNonNull(ceRecipe.group())); + } + if (ceRecipe.category() != null) { + blastingRecipe.setCategory(CookingBookCategory.valueOf(Objects.requireNonNull(ceRecipe.category()).name())); + } + try { + Object craftRecipe = Reflections.method$CraftBlastingRecipe$fromBukkitRecipe.invoke(null, blastingRecipe); + Reflections.method$CraftRecipe$addToCraftingManager.invoke(craftRecipe); + injectCookingRecipe(new Key(key.namespace(), key.value()), ceRecipe); + } catch (Exception e) { + CraftEngine.instance().logger().warn("Failed to convert blasting recipe", e); + } + }); + BUKKIT_RECIPE_FACTORIES.put(RecipeTypes.CAMPFIRE_COOKING, (key, recipe) -> { + CustomCampfireRecipe ceRecipe = (CustomCampfireRecipe) recipe; + CampfireRecipe campfireRecipe = new CampfireRecipe( + key, ceRecipe.result(ItemBuildContext.EMPTY), + new RecipeChoice.MaterialChoice(ingredientToBukkitMaterials(ceRecipe.ingredient())), + ceRecipe.experience(), ceRecipe.cookingTime() + ); + if (ceRecipe.group() != null) { + campfireRecipe.setGroup(Objects.requireNonNull(ceRecipe.group())); + } + if (ceRecipe.category() != null) { + campfireRecipe.setCategory(CookingBookCategory.valueOf(Objects.requireNonNull(ceRecipe.category()).name())); + } + try { + Object craftRecipe = Reflections.method$CraftCampfireRecipe$fromBukkitRecipe.invoke(null, campfireRecipe); + Reflections.method$CraftRecipe$addToCraftingManager.invoke(craftRecipe); + injectCookingRecipe(new Key(key.namespace(), key.value()), ceRecipe); + } catch (Exception e) { + CraftEngine.instance().logger().warn("Failed to convert campfire recipe", e); + } + }); + BUKKIT_RECIPE_FACTORIES.put(RecipeTypes.STONE_CUTTING, (key, recipe) -> { + CustomStoneCuttingRecipe ceRecipe = (CustomStoneCuttingRecipe) recipe; + List itemStacks = new ArrayList<>(); + for (Holder item : ceRecipe.ingredient().items()) { + itemStacks.add(BukkitItemManager.instance().buildItemStack(item.value(), null)); + } + StonecuttingRecipe stonecuttingRecipe = new StonecuttingRecipe( + key, ceRecipe.result(ItemBuildContext.EMPTY), + new RecipeChoice.ExactChoice(itemStacks) + ); + if (ceRecipe.group() != null) { + stonecuttingRecipe.setGroup(Objects.requireNonNull(ceRecipe.group())); + } + try { + Object craftRecipe = Reflections.method$CraftStonecuttingRecipe$fromBukkitRecipe.invoke(null, stonecuttingRecipe); + Reflections.method$CraftRecipe$addToCraftingManager.invoke(craftRecipe); + } catch (Exception e) { + CraftEngine.instance().logger().warn("Failed to convert stone cutting recipe", e); + } + }); + } + + private final BukkitCraftEngine plugin; + private final RecipeEventListener recipeEventListener; + private final CrafterEventListener crafterEventListener; + private final Map>> byType; + private final Map> byId; + private final Map>> byResult; + private final VanillaRecipeReader recipeReader; + private final List injectedDataPackRecipes; + private final List registeredCustomRecipes; + // data pack recipe resource locations [minecraft:xxx] + private final Set dataPackRecipes; + + private Object stolenFeatureFlagSet; + + public BukkitRecipeManager(BukkitCraftEngine plugin) { + instance = this; + this.plugin = plugin; + this.byType = new HashMap<>(); + this.byId = new HashMap<>(); + this.byResult = new HashMap<>(); + this.injectedDataPackRecipes = new ArrayList<>(); + this.registeredCustomRecipes = new ArrayList<>(); + this.dataPackRecipes = new HashSet<>(); + this.recipeEventListener = new RecipeEventListener(plugin, this, plugin.itemManager()); + if (VersionHelper.isVersionNewerThan1_21()) { + this.crafterEventListener = new CrafterEventListener(plugin, this, plugin.itemManager()); + } else { + this.crafterEventListener = null; + } + if (VersionHelper.isVersionNewerThan1_21_2()) { + this.recipeReader = new VanillaRecipeReader1_21_2(); + } else if (VersionHelper.isVersionNewerThan1_20_5()) { + this.recipeReader = new VanillaRecipeReader1_20_5(); + } else { + this.recipeReader = new VanillaRecipeReader1_20(); + } + try { + minecraftRecipeManager = Reflections.method$MinecraftServer$getRecipeManager.invoke(Reflections.method$MinecraftServer$getServer.invoke(null)); + } catch (ReflectiveOperationException e) { + plugin.logger().warn("Failed to get minecraft recipe manager", e); + } + } + + @Override + public boolean isDataPackRecipe(Key key) { + return this.dataPackRecipes.contains(key); + } + + @Override + public boolean isCustomRecipe(Key key) { + return this.byId.containsKey(key); + } + + @Override + public Optional> getRecipeById(Key key) { + return Optional.ofNullable(this.byId.get(key)); + } + + @Override + public void delayedInit() { + Bukkit.getPluginManager().registerEvents(this.recipeEventListener, this.plugin.bootstrap()); + if (this.crafterEventListener != null) { + Bukkit.getPluginManager().registerEvents(this.crafterEventListener, this.plugin.bootstrap()); + } + } + + @Override + public void load() { + if (!ConfigManager.enableRecipeSystem()) return; + if (VersionHelper.isVersionNewerThan1_21_2()) { + try { + this.stolenFeatureFlagSet = Reflections.field$RecipeManager$featureflagset.get(minecraftRecipeManager); + Reflections.field$RecipeManager$featureflagset.set(minecraftRecipeManager, null); + } catch (ReflectiveOperationException e) { + this.plugin.logger().warn("Failed to steal featureflagset", e); + } + } + } + + @Override + public void unload() { + this.byType.clear(); + this.byId.clear(); + this.byResult.clear(); + this.dataPackRecipes.clear(); + + try { + // do not unregister them +// for (NamespacedKey key : this.injectedDataPackRecipes) { +// unregisterRecipe(key); +// } + for (NamespacedKey key : this.registeredCustomRecipes) { + unregisterRecipe(key); + } + if (VersionHelper.isVersionNewerThan1_21_2()) { + Reflections.method$RecipeManager$finalizeRecipeLoading.invoke(minecraftRecipeManager); + } + } catch (ReflectiveOperationException e) { + plugin.logger().warn("Failed to unregister recipes", e); + } + + this.registeredCustomRecipes.clear(); + this.injectedDataPackRecipes.clear(); + + recipeToMcRecipeHolder.clear(); + } + + @Override + public void disable() { + HandlerList.unregisterAll(this.recipeEventListener); + if (this.crafterEventListener != null) { + HandlerList.unregisterAll(this.crafterEventListener); + } + unload(); + } + + private void unregisterRecipe(NamespacedKey key) throws ReflectiveOperationException { + if (VersionHelper.isVersionNewerThan1_21_2()) { + Object recipeMap = Reflections.field$RecipeManager$recipes.get(minecraftRecipeManager); + Reflections.method$RecipeMap$removeRecipe.invoke(recipeMap, Reflections.method$CraftRecipe$toMinecraft.invoke(null, key)); + } else { + Bukkit.removeRecipe(key); + } + } + + @Override + public void parseSection(Pack pack, Path path, Key id, Map section) { + if (!ConfigManager.enableRecipeSystem()) return; + if (this.byId.containsKey(id)) { + this.plugin.logger().warn(path, "Duplicated recipe " + id); + return; + } + Recipe recipe = RecipeTypes.fromMap(id, section); + NamespacedKey key = NamespacedKey.fromString(id.toString()); + BUKKIT_RECIPE_FACTORIES.get(recipe.type()).accept(key, recipe); + try { + this.registeredCustomRecipes.add(key); + this.byType.computeIfAbsent(recipe.type(), k -> new ArrayList<>()).add(recipe); + this.byId.put(id, recipe); + this.byResult.computeIfAbsent(recipe.result().item().id(), k -> new ArrayList<>()).add(recipe); + } catch (Exception e) { + plugin.logger().warn("Failed to add custom recipe " + id, e); + } + } + + @Override + public List> getRecipes(Key type) { + return this.byType.getOrDefault(type, List.of()); + } + + @Override + public List> getRecipeByResult(Key result) { + return this.byResult.getOrDefault(result, List.of()); + } + + // example: stone button + public void addVanillaInternalRecipe(Key id, Recipe recipe) { + this.byType.computeIfAbsent(recipe.type(), k -> new ArrayList<>()).add(recipe); + this.byId.put(id, recipe); + this.byResult.computeIfAbsent(recipe.result().item().id(), k -> new ArrayList<>()).add(recipe); + } + + @Nullable + @Override + public Recipe getRecipe(Key type, RecipeInput input) { + List> recipes = this.byType.get(type); + if (recipes == null) return null; + for (Recipe recipe : recipes) { + if (recipe.matches(input)) { + return recipe; + } + } + return null; + } + + @Nullable + @Override + public Recipe getRecipe(Key type, RecipeInput input, Key lastRecipe) { + if (lastRecipe != null) { + Recipe last = byId.get(lastRecipe); + if (last != null && last.matches(input)) { + return last; + } + } + return getRecipe(type, input); + } + + @Override + public CompletableFuture delayedLoad() { + if (!ConfigManager.enableRecipeSystem()) return CompletableFuture.completedFuture(null); + return this.processVanillaRecipes().thenRun(() -> { + try { + // give flags back on 1.21.2+ + if (VersionHelper.isVersionNewerThan1_21_2() && this.stolenFeatureFlagSet != null) { + Reflections.field$RecipeManager$featureflagset.set(minecraftRecipeManager, this.stolenFeatureFlagSet); + this.stolenFeatureFlagSet = false; + } + + // refresh recipes + if (VersionHelper.isVersionNewerThan1_21_2()) { + Reflections.method$RecipeManager$finalizeRecipeLoading.invoke(minecraftRecipeManager); + } + + // send to players + Reflections.method$DedicatedPlayerList$reloadRecipes.invoke(Reflections.field$CraftServer$playerList.get(Bukkit.getServer())); + + // now we need to remove the fake `exact` + if (VersionHelper.isVersionNewerThan1_21_4()) { + for (Object ingredient : injectedIngredients) { + Reflections.field$Ingredient$itemStacks1_21_4.set(ingredient, null); + } + } else if (VersionHelper.isVersionNewerThan1_21_2()) { + for (Object ingredient : injectedIngredients) { + Reflections.field$Ingredient$itemStacks1_21_2.set(ingredient, null); + } + } + + // clear cache + injectedIngredients.clear(); + } catch (Exception e) { + this.plugin.logger().warn("Failed to run delayed recipe tasks", e); + } + }); + } + + @SuppressWarnings("unchecked") + private CompletableFuture processVanillaRecipes() { + CompletableFuture future = new CompletableFuture<>(); + try { + List injectLogics = new ArrayList<>(); + plugin.scheduler().async().execute(() -> { + try { + Object fileToIdConverter = Reflections.method$FileToIdConverter$json.invoke(null, VersionHelper.isVersionNewerThan1_21() ? "recipe" : "recipes"); + Object minecraftServer = Reflections.method$MinecraftServer$getServer.invoke(null); + Object packRepository = Reflections.method$MinecraftServer$getPackRepository.invoke(minecraftServer); + List selected = (List) Reflections.field$PackRepository$selected.get(packRepository); + List packResources = new ArrayList<>(); + for (Object pack : selected) { + packResources.add(Reflections.method$Pack$open.invoke(pack)); + } + try (AutoCloseable resourceManager = (AutoCloseable) Reflections.constructor$MultiPackResourceManager.newInstance(Reflections.instance$PackType$SERVER_DATA, packResources)) { + Map scannedResources = (Map) Reflections.method$FileToIdConverter$listMatchingResources.invoke(fileToIdConverter, resourceManager); + for (Map.Entry entry : scannedResources.entrySet()) { + Key id = extractKeyFromResourceLocation(entry.getKey().toString()); + this.dataPackRecipes.add(id); + // Maybe it's unregistered by other plugins + if (Bukkit.getRecipe(new NamespacedKey(id.namespace(), id.value())) == null) { + continue; + } + Reader reader = (Reader) Reflections.method$Resource$openAsReader.invoke(entry.getValue()); + JsonObject jsonObject = JsonParser.parseReader(reader).getAsJsonObject(); + String type = jsonObject.get("type").getAsString(); + switch (type) { + case "minecraft:crafting_shaped" -> { + VanillaShapedRecipe recipe = this.recipeReader.readShaped(jsonObject); + handleDataPackShapedRecipe(id, recipe, (injectLogics::add)); + } + case "minecraft:crafting_shapeless" -> { + VanillaShapelessRecipe recipe = this.recipeReader.readShapeless(jsonObject); + handleDataPackShapelessRecipe(id, recipe, (injectLogics::add)); + } + case "minecraft:smelting" -> { + VanillaSmeltingRecipe recipe = this.recipeReader.readSmelting(jsonObject); + handleDataPackCookingRecipe(id, recipe, FurnaceRecipe::new, CustomSmeltingRecipe::new, Reflections.method$CraftFurnaceRecipe$fromBukkitRecipe, (injectLogics::add)); + } + case "minecraft:blasting" -> { + VanillaBlastingRecipe recipe = this.recipeReader.readBlasting(jsonObject); + handleDataPackCookingRecipe(id, recipe, BlastingRecipe::new, CustomBlastingRecipe::new, Reflections.method$CraftBlastingRecipe$fromBukkitRecipe, (injectLogics::add)); + } + case "minecraft:smoking" -> { + VanillaSmokingRecipe recipe = this.recipeReader.readSmoking(jsonObject); + handleDataPackCookingRecipe(id, recipe, SmokingRecipe::new, CustomSmokingRecipe::new, Reflections.method$CraftSmokingRecipe$fromBukkitRecipe, (injectLogics::add)); + } + case "minecraft:campfire_cooking" -> { + VanillaCampfireRecipe recipe = this.recipeReader.readCampfire(jsonObject); + handleDataPackCookingRecipe(id, recipe, CampfireRecipe::new, CustomCampfireRecipe::new, Reflections.method$CraftCampfireRecipe$fromBukkitRecipe, (injectLogics::add)); + } + case "minecraft:stonecutting" -> { + VanillaStoneCuttingRecipe recipe = this.recipeReader.readStoneCutting(jsonObject); + handleDataPackStoneCuttingRecipe(id, recipe); + } + } + } + } + } catch (Exception e) { + plugin.logger().warn("Failed to read data pack recipes", e); + } finally { + plugin.scheduler().sync().run(() -> { + try { + for (Runnable runnable : injectLogics) { + runnable.run(); + } + } catch (Exception e) { + CraftEngine.instance().logger().warn("Failed to register recipes", e); + } finally { + future.complete(null); + } + }); + } + }); + } catch (Exception e) { + this.plugin.logger().warn("Failed to inject vanilla recipes", e); + } + return future; + } + + private void handleDataPackShapelessRecipe(Key id, VanillaShapelessRecipe recipe, Consumer callback) { + NamespacedKey key = new NamespacedKey(id.namespace(), id.value()); + ItemStack result = createResultStack(recipe.result()); + ShapelessRecipe shapelessRecipe = new ShapelessRecipe(key, result); + if (recipe.group() != null) { + shapelessRecipe.setGroup(recipe.group()); + } + if (recipe.category() != null) { + shapelessRecipe.setCategory(CraftingBookCategory.valueOf(recipe.category().name())); + } + + boolean hasCustomItemInTag = false; + List> ingredientList = new ArrayList<>(); + for (List list : recipe.ingredients()) { + Set materials = new HashSet<>(); + Set> holders = new HashSet<>(); + for (String item : list) { + if (item.charAt(0) == '#') { + Key tag = Key.of(item.substring(1)); + materials.addAll(tagToMaterials(tag)); + if (!hasCustomItemInTag) { + if (!plugin.itemManager().tagToCustomItems(tag).isEmpty()) { + hasCustomItemInTag = true; + } + } + holders.addAll(plugin.itemManager().tagToItems(tag)); + } else { + materials.add(MaterialUtils.getMaterial(item)); + holders.add(BuiltInRegistries.OPTIMIZED_ITEM_ID.get(Key.from(item)).orElseThrow()); + } + } + shapelessRecipe.addIngredient(new RecipeChoice.MaterialChoice(new ArrayList<>(materials))); + ingredientList.add(Ingredient.of(holders)); + } + + CustomShapelessRecipe ceRecipe = new CustomShapelessRecipe<>( + id, + recipe.category(), + recipe.group(), + ingredientList, + new CustomRecipeResult<>(new CloneableConstantItem(recipe.result().isCustom() ? Key.of("!internal:custom") : Key.of(recipe.result().id()), result), recipe.result().count()) + ); + if (hasCustomItemInTag) { + callback.accept(() -> { + try { + unregisterRecipe(key); + Reflections.method$CraftRecipe$addToCraftingManager.invoke(Reflections.method$CraftShapelessRecipe$fromBukkitRecipe.invoke(null, shapelessRecipe)); + injectShapelessRecipe(id, ceRecipe); + } catch (Exception e) { + CraftEngine.instance().logger().warn("Failed to convert shapeless recipe", e); + } + }); + this.injectedDataPackRecipes.add(key); + } + this.addVanillaInternalRecipe(id, ceRecipe); + } + + private void handleDataPackStoneCuttingRecipe(Key id, VanillaStoneCuttingRecipe recipe) { + ItemStack result = createResultStack(recipe.result()); + Set> holders = new HashSet<>(); + + for (String item : recipe.ingredient()) { + if (item.charAt(0) == '#') { + Key tag = Key.from(item.substring(1)); + holders.addAll(plugin.itemManager().tagToItems(tag)); + } else { + holders.add(BuiltInRegistries.OPTIMIZED_ITEM_ID.get(Key.from(item)).orElseThrow()); + } + } + + CustomStoneCuttingRecipe ceRecipe = new CustomStoneCuttingRecipe<>( + id, + recipe.group(), + Ingredient.of(holders), + new CustomRecipeResult<>(new CloneableConstantItem(recipe.result().isCustom() ? Key.of("!internal:custom") : Key.of(recipe.result().id()), result), recipe.result().count()) + ); + this.addVanillaInternalRecipe(id, ceRecipe); + } + + private void handleDataPackShapedRecipe(Key id, VanillaShapedRecipe recipe, Consumer callback) { + NamespacedKey key = new NamespacedKey(id.namespace(), id.value()); + ItemStack result = createResultStack(recipe.result()); + ShapedRecipe shapedRecipe = new ShapedRecipe(key, result); + if (recipe.group() != null) { + shapedRecipe.setGroup(recipe.group()); + } + if (recipe.category() != null) { + shapedRecipe.setCategory(CraftingBookCategory.valueOf(recipe.category().name())); + } + shapedRecipe.shape(recipe.pattern()); + + boolean hasCustomItemInTag = false; + Map> ingredients = new HashMap<>(); + for (Map.Entry> entry : recipe.ingredients().entrySet()) { + Set materials = new HashSet<>(); + Set> holders = new HashSet<>(); + for (String item : entry.getValue()) { + if (item.charAt(0) == '#') { + Key tag = Key.from(item.substring(1)); + materials.addAll(tagToMaterials(tag)); + if (!hasCustomItemInTag) { + if (!plugin.itemManager().tagToCustomItems(tag).isEmpty()) { + hasCustomItemInTag = true; + } + } + holders.addAll(plugin.itemManager().tagToItems(tag)); + } else { + materials.add(MaterialUtils.getMaterial(item)); + holders.add(BuiltInRegistries.OPTIMIZED_ITEM_ID.get(Key.from(item)).orElseThrow()); + } + } + shapedRecipe.setIngredient(entry.getKey(), new RecipeChoice.MaterialChoice(new ArrayList<>(materials))); + ingredients.put(entry.getKey(), Ingredient.of(holders)); + } + + CustomShapedRecipe ceRecipe = new CustomShapedRecipe<>( + id, + recipe.category(), + recipe.group(), + new CustomShapedRecipe.Pattern<>(recipe.pattern(), ingredients), + new CustomRecipeResult<>(new CloneableConstantItem(recipe.result().isCustom() ? Key.of("!internal:custom") : Key.of(recipe.result().id()), result), recipe.result().count()) + ); + if (hasCustomItemInTag) { + callback.accept(() -> { + try { + unregisterRecipe(key); + Reflections.method$CraftRecipe$addToCraftingManager.invoke(Reflections.method$CraftShapedRecipe$fromBukkitRecipe.invoke(null, shapedRecipe)); + injectShapedRecipe(id, ceRecipe); + } catch (Exception e) { + CraftEngine.instance().logger().warn("Failed to convert shaped recipe", e); + } + }); + this.injectedDataPackRecipes.add(key); + } + this.addVanillaInternalRecipe(id, ceRecipe); + } + + private void handleDataPackCookingRecipe(Key id, + VanillaCookingRecipe recipe, + PentaFunction> constructor1, + HeptaFunction, Integer, Float, CustomRecipeResult, CustomCookingRecipe> constructor2, + Method fromBukkitRecipeMethod, + Consumer callback) { + NamespacedKey key = new NamespacedKey(id.namespace(), id.value()); + ItemStack result = createResultStack(recipe.result()); + + Set materials = new HashSet<>(); + Set> holders = new HashSet<>(); + + boolean hasCustomItemInTag = false; + for (String item : recipe.ingredient()) { + if (item.charAt(0) == '#') { + Key tag = Key.from(item.substring(1)); + materials.addAll(tagToMaterials(tag)); + if (!hasCustomItemInTag) { + if (!plugin.itemManager().tagToCustomItems(tag).isEmpty()) { + hasCustomItemInTag = true; + } + } + holders.addAll(plugin.itemManager().tagToItems(tag)); + } else { + materials.add(MaterialUtils.getMaterial(item)); + holders.add(BuiltInRegistries.OPTIMIZED_ITEM_ID.get(Key.from(item)).orElseThrow()); + } + } + org.bukkit.inventory.CookingRecipe cookingRecipe = constructor1.apply(key, result, new RecipeChoice.MaterialChoice(new ArrayList<>(materials)), recipe.experience(), recipe.cookingTime()); + if (recipe.group() != null) { + cookingRecipe.setGroup(recipe.group()); + } + if (recipe.category() != null) { + cookingRecipe.setCategory(CookingBookCategory.valueOf(recipe.category().name())); + } + + CustomCookingRecipe ceRecipe = constructor2.apply( + id, + recipe.category(), + recipe.group(), + Ingredient.of(holders), + recipe.cookingTime(), + recipe.experience(), + new CustomRecipeResult<>(new CloneableConstantItem(recipe.result().isCustom() ? Key.of("!internal:custom") : Key.of(recipe.result().id()), result), recipe.result().count()) + ); + if (hasCustomItemInTag) { + callback.accept(() -> { + try { + unregisterRecipe(key); + Reflections.method$CraftRecipe$addToCraftingManager.invoke(fromBukkitRecipeMethod.invoke(null, cookingRecipe)); + injectCookingRecipe(id, ceRecipe); + } catch (Exception e) { + CraftEngine.instance().logger().warn("Failed to convert smelting recipe", e); + } + }); + this.injectedDataPackRecipes.add(key); + } + this.addVanillaInternalRecipe(id, ceRecipe); + } + + private List tagToMaterials(Key tag) { + Set materials = new HashSet<>(); + List> holders = this.plugin.itemManager().tagToVanillaItems(tag); + if (holders != null) { + for (Holder holder : holders) { + materials.add(MaterialUtils.getMaterial(holder.value())); + } + } + List> customItems = this.plugin.itemManager().tagToCustomItems(tag); + if (customItems != null) { + for (Holder holder : customItems) { + this.plugin.itemManager().getCustomItem(holder.value()).ifPresent(it -> { + materials.add(MaterialUtils.getMaterial(it.material())); + }); + } + } + return new ArrayList<>(materials); + } + + private ItemStack createResultStack(RecipeResult result) { + ItemStack itemStack; + if (result.components() == null) { + itemStack = new ItemStack(Objects.requireNonNull(MaterialUtils.getMaterial(result.id()))); + itemStack.setAmount(result.count()); + } else { + JsonObject jsonObject = new JsonObject(); + jsonObject.addProperty("id", result.id()); + jsonObject.addProperty("count", result.count()); + jsonObject.add("components", result.components()); + Object nmsStack = ItemObject.newItem(TagCompound.newTag(jsonObject.toString())); + try { + itemStack = (ItemStack) Reflections.method$CraftItemStack$asCraftMirror.invoke(null, nmsStack); + } catch (Exception e) { + this.plugin.logger().warn("Failed to create ItemStack mirror", e); + return new ItemStack(Material.STICK); + } + } + return itemStack; + } + + private Key extractKeyFromResourceLocation(String input) { + int prefixEndIndex = input.indexOf(':'); + String prefix = input.substring(0, prefixEndIndex); + int lastSlashIndex = input.lastIndexOf('/'); + int lastDotIndex = input.lastIndexOf('.'); + String fileName = input.substring(lastSlashIndex + 1, lastDotIndex); + return Key.of(prefix, fileName); + } + + private static List ingredientToBukkitMaterials(Ingredient ingredient) { + Set materials = new HashSet<>(); + for (Holder holder : ingredient.items()) { + materials.add(getMaterialById(holder.value())); + } + return new ArrayList<>(materials); + } + + private static Material getMaterialById(Key key) { + Material material = MaterialUtils.getMaterial(key); + if (material != null) { + return material; + } + Optional> optionalItem = BukkitItemManager.instance().getCustomItem(key); + return optionalItem.map(itemStackCustomItem -> MaterialUtils.getMaterial(itemStackCustomItem.material())).orElse(null); + } + + private static List getIngredientLooks(List> holders) throws ReflectiveOperationException { + List itemStacks = new ArrayList<>(); + for (Holder holder : holders) { + ItemStack itemStack = BukkitItemManager.instance().getBuildableItem(holder.value()).get().buildItemStack(ItemBuildContext.EMPTY, 1); + Object nmsStack = Reflections.method$CraftItemStack$asNMSMirror.invoke(null, itemStack); + itemStacks.add(nmsStack); + } + return itemStacks; + } + + private static void injectShapedRecipe(Key id, CustomShapedRecipe recipe) throws ReflectiveOperationException { + List> actualIngredients = recipe.parsedPattern().ingredients() + .stream() + .filter(Optional::isPresent) + .map(Optional::get) + .toList(); + + Object shapedRecipe = getNMSRecipe(id); + recipeToMcRecipeHolder.put(recipe, shapedRecipe); + if (VersionHelper.isVersionNewerThan1_20_2()) { + shapedRecipe = Reflections.field$RecipeHolder$recipe.get(shapedRecipe); + } + + if (VersionHelper.isVersionNewerThan1_21_2()) { + Reflections.field$ShapedRecipe$placementInfo.set(shapedRecipe, null); + } + List ingredients = RecipeUtils.getIngredientsFromShapedRecipe(shapedRecipe); + injectIngredients(ingredients, actualIngredients); + } + + @SuppressWarnings("unchecked") + private static void injectShapelessRecipe(Key id, CustomShapelessRecipe recipe) throws ReflectiveOperationException { + List> actualIngredients = recipe.ingredients(); + + Object shapelessRecipe = getNMSRecipe(id); + recipeToMcRecipeHolder.put(recipe, shapelessRecipe); + if (VersionHelper.isVersionNewerThan1_20_2()) { + shapelessRecipe = Reflections.field$RecipeHolder$recipe.get(shapelessRecipe); + } + + if (VersionHelper.isVersionNewerThan1_21_2()) { + Reflections.field$ShapelessRecipe$placementInfo.set(shapelessRecipe, null); + } + List ingredients = (List) Reflections.field$ShapelessRecipe$ingredients.get(shapelessRecipe); + injectIngredients(ingredients, actualIngredients); + } + + private static void injectCookingRecipe(Key id, CustomCookingRecipe recipe) throws ReflectiveOperationException { + Ingredient actualIngredient = recipe.ingredient(); + Object smeltingRecipe = getNMSRecipe(id); + recipeToMcRecipeHolder.put(recipe, smeltingRecipe); + if (VersionHelper.isVersionNewerThan1_20_2()) { + smeltingRecipe = Reflections.field$RecipeHolder$recipe.get(smeltingRecipe); + } + + Object ingredient; + if (VersionHelper.isVersionNewerThan1_21_2()) { + ingredient = Reflections.field$SingleItemRecipe$input.get(smeltingRecipe); + } else { + ingredient = Reflections.field$AbstractCookingRecipe$input.get(smeltingRecipe); + } + injectIngredients(List.of(ingredient), List.of(actualIngredient)); + } + + // recipe on 1.20.1 and holder on 1.20.2+ + private static Object getNMSRecipe(Key id) throws ReflectiveOperationException { + if (VersionHelper.isVersionNewerThan1_21_2()) { + Object resourceKey = Reflections.method$CraftRecipe$toMinecraft.invoke(null, new NamespacedKey(id.namespace(), id.value())); + @SuppressWarnings("unchecked") + Optional optional = (Optional) Reflections.method$RecipeManager$byKey.invoke(minecraftRecipeManager, resourceKey); + if (optional.isEmpty()) { + throw new IllegalArgumentException("Recipe " + id + " not found"); + } + return optional.get(); + } else { + Object resourceLocation = Reflections.method$ResourceLocation$fromNamespaceAndPath.invoke(null, id.namespace(), id.value()); + @SuppressWarnings("unchecked") + Optional optional = (Optional) Reflections.method$RecipeManager$byKey.invoke(minecraftRecipeManager, resourceLocation); + if (optional.isEmpty()) { + throw new IllegalArgumentException("Recipe " + id + " not found"); + } + return optional.get(); + } + } + + private static void injectIngredients(List ingredients, List> actualIngredients) throws ReflectiveOperationException { + if (ingredients.size() != actualIngredients.size()) { + throw new IllegalArgumentException("Ingredient count mismatch"); + } + for (int i = 0; i < ingredients.size(); i++) { + Object ingredient = ingredients.get(i); + Ingredient actualIngredient = actualIngredients.get(i); + List items = getIngredientLooks(actualIngredient.items()); + if (VersionHelper.isVersionNewerThan1_21_4()) { + Reflections.field$Ingredient$itemStacks1_21_4.set(ingredient, new HashSet<>(items)); + } else if (VersionHelper.isVersionNewerThan1_21_2()) { + Reflections.field$Ingredient$itemStacks1_21_2.set(ingredient, items); + } else { + Object itemStackArray = Array.newInstance(Reflections.clazz$ItemStack, items.size()); + for (int j = 0; j < items.size(); j++) { + Array.set(itemStackArray, j, items.get(j)); + } + Reflections.field$Ingredient$itemStacks1_20_1.set(ingredient, itemStackArray); + } + injectedIngredients.add(ingredient); + } + } + + public Object getRecipeHolderByRecipe(Recipe recipe) { + return recipeToMcRecipeHolder.get(recipe); + } + + public static Object minecraftRecipeManager() { + return minecraftRecipeManager; + } + + public static BukkitRecipeManager instance() { + return instance; + } +} diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/item/recipe/CrafterEventListener.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/item/recipe/CrafterEventListener.java new file mode 100644 index 000000000..d24bdec79 --- /dev/null +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/item/recipe/CrafterEventListener.java @@ -0,0 +1,98 @@ +package net.momirealms.craftengine.bukkit.item.recipe; + +import net.momirealms.craftengine.bukkit.plugin.BukkitCraftEngine; +import net.momirealms.craftengine.bukkit.util.ItemUtils; +import net.momirealms.craftengine.core.item.Item; +import net.momirealms.craftengine.core.item.ItemBuildContext; +import net.momirealms.craftengine.core.item.ItemManager; +import net.momirealms.craftengine.core.item.recipe.OptimizedIDItem; +import net.momirealms.craftengine.core.item.recipe.Recipe; +import net.momirealms.craftengine.core.item.recipe.RecipeTypes; +import net.momirealms.craftengine.core.item.recipe.input.CraftingInput; +import net.momirealms.craftengine.core.plugin.config.ConfigManager; +import net.momirealms.craftengine.core.registry.BuiltInRegistries; +import net.momirealms.craftengine.core.registry.Holder; +import net.momirealms.craftengine.core.util.Key; +import org.bukkit.block.Crafter; +import org.bukkit.event.EventHandler; +import org.bukkit.event.Listener; +import org.bukkit.event.block.CrafterCraftEvent; +import org.bukkit.inventory.CraftingRecipe; +import org.bukkit.inventory.Inventory; +import org.bukkit.inventory.ItemStack; + +import java.util.ArrayList; +import java.util.List; +import java.util.Optional; + +public class CrafterEventListener implements Listener { + private static final OptimizedIDItem EMPTY = new OptimizedIDItem<>(null, null); + private final ItemManager itemManager; + private final BukkitRecipeManager recipeManager; + private final BukkitCraftEngine plugin; + + public CrafterEventListener(BukkitCraftEngine plugin, BukkitRecipeManager recipeManager, ItemManager itemManager) { + this.itemManager = itemManager; + this.recipeManager = recipeManager; + this.plugin = plugin; + } + + @EventHandler + public void onCrafting(CrafterCraftEvent event) { + if (!ConfigManager.enableRecipeSystem()) return; + CraftingRecipe recipe = event.getRecipe(); + if (!(event.getBlock().getState() instanceof Crafter crafter)) { + return; + } + + Key recipeId = Key.of(recipe.getKey().namespace(), recipe.getKey().value()); + boolean isCustom = this.recipeManager.isCustomRecipe(recipeId); + + // Maybe it's recipe from other plugins, then we ignore it + if (!isCustom) { + return; + } + + Inventory inventory = crafter.getInventory(); + ItemStack[] ingredients = inventory.getStorageContents(); + + List> optimizedIDItems = new ArrayList<>(); + for (ItemStack itemStack : ingredients) { + if (ItemUtils.isEmpty(itemStack)) { + optimizedIDItems.add(EMPTY); + } else { + Item wrappedItem = this.itemManager.wrap(itemStack); + Optional> idHolder = BuiltInRegistries.OPTIMIZED_ITEM_ID.get(wrappedItem.id()); + if (idHolder.isEmpty()) { + // an invalid item is used in recipe, we disallow it + event.setCancelled(true); + return; + } else { + optimizedIDItems.add(new OptimizedIDItem<>(idHolder.get(), itemStack)); + } + } + } + + CraftingInput input; + if (ingredients.length == 9) { + input = CraftingInput.of(3, 3, optimizedIDItems); + } else if (ingredients.length == 4) { + input = CraftingInput.of(2, 2, optimizedIDItems); + } else { + return; + } + + Recipe ceRecipe = this.recipeManager.getRecipe(RecipeTypes.SHAPELESS, input); + if (ceRecipe != null) { + event.setResult(ceRecipe.result(ItemBuildContext.EMPTY)); + return; + } + ceRecipe = this.recipeManager.getRecipe(RecipeTypes.SHAPED, input); + if (ceRecipe != null) { + event.setResult(ceRecipe.result(ItemBuildContext.EMPTY)); + return; + } + // clear result if not met + event.setCancelled(true); + } +} diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/item/recipe/RecipeEventListener.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/item/recipe/RecipeEventListener.java new file mode 100644 index 000000000..2a6175da4 --- /dev/null +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/item/recipe/RecipeEventListener.java @@ -0,0 +1,547 @@ +package net.momirealms.craftengine.bukkit.item.recipe; + +import com.destroystokyo.paper.event.inventory.PrepareResultEvent; +import net.momirealms.craftengine.bukkit.item.BukkitItemManager; +import net.momirealms.craftengine.bukkit.plugin.BukkitCraftEngine; +import net.momirealms.craftengine.bukkit.plugin.injector.BukkitInjector; +import net.momirealms.craftengine.bukkit.plugin.user.BukkitServerPlayer; +import net.momirealms.craftengine.bukkit.util.ItemUtils; +import net.momirealms.craftengine.bukkit.util.Reflections; +import net.momirealms.craftengine.core.item.Item; +import net.momirealms.craftengine.core.item.ItemBuildContext; +import net.momirealms.craftengine.core.item.ItemManager; +import net.momirealms.craftengine.core.item.recipe.CustomCampfireRecipe; +import net.momirealms.craftengine.core.item.recipe.OptimizedIDItem; +import net.momirealms.craftengine.core.item.recipe.Recipe; +import net.momirealms.craftengine.core.item.recipe.RecipeTypes; +import net.momirealms.craftengine.core.item.recipe.input.CraftingInput; +import net.momirealms.craftengine.core.item.recipe.input.SingleItemInput; +import net.momirealms.craftengine.core.plugin.config.ConfigManager; +import net.momirealms.craftengine.core.registry.BuiltInRegistries; +import net.momirealms.craftengine.core.registry.Holder; +import net.momirealms.craftengine.core.util.Key; +import net.momirealms.craftengine.core.util.VersionHelper; +import net.momirealms.craftengine.core.util.context.ContextHolder; +import org.bukkit.Material; +import org.bukkit.block.Block; +import org.bukkit.block.Campfire; +import org.bukkit.block.Furnace; +import org.bukkit.entity.Player; +import org.bukkit.event.EventHandler; +import org.bukkit.event.EventPriority; +import org.bukkit.event.Listener; +import org.bukkit.event.block.*; +import org.bukkit.event.inventory.*; +import org.bukkit.event.player.PlayerInteractEvent; +import org.bukkit.inventory.*; + +import java.util.ArrayList; +import java.util.List; +import java.util.Optional; + +public class RecipeEventListener implements Listener { + private static final OptimizedIDItem EMPTY = new OptimizedIDItem<>(null, null); + private final ItemManager itemManager; + private final BukkitRecipeManager recipeManager; + private final BukkitCraftEngine plugin; + + public RecipeEventListener(BukkitCraftEngine plugin, BukkitRecipeManager recipeManager, ItemManager itemManager) { + this.itemManager = itemManager; + this.recipeManager = recipeManager; + this.plugin = plugin; + } + + @SuppressWarnings("deprecation") + @EventHandler(ignoreCancelled = true) + public void onClickInventoryWithFuel(InventoryClickEvent event) { + Inventory inventory = event.getInventory(); + if (!(inventory instanceof FurnaceInventory furnaceInventory)) return; + ItemStack fuelStack = furnaceInventory.getFuel(); + Inventory clickedInventory = event.getClickedInventory(); + + Player player = (Player) event.getWhoClicked(); + if (clickedInventory == player.getInventory()) { + if (event.getClick() == ClickType.SHIFT_LEFT || event.getClick() == ClickType.SHIFT_RIGHT) { + ItemStack item = event.getCurrentItem(); + if (ItemUtils.isEmpty(item)) return; + if (fuelStack == null || fuelStack.getType() == Material.AIR) { + Item wrappedItem = BukkitItemManager.instance().wrap(item); + Optional> idHolder = BuiltInRegistries.OPTIMIZED_ITEM_ID.get(wrappedItem.id()); + if (idHolder.isEmpty()) return; + + SingleItemInput input = new SingleItemInput<>(new OptimizedIDItem<>(idHolder.get(), item)); + Key recipeType; + if (furnaceInventory.getType() == InventoryType.FURNACE) { + recipeType = RecipeTypes.SMELTING; + } else if (furnaceInventory.getType() == InventoryType.BLAST_FURNACE) { + recipeType = RecipeTypes.BLASTING; + } else { + recipeType = RecipeTypes.SMOKING; + } + + Recipe ceRecipe = recipeManager.getRecipe(recipeType, input); + // The item is an ingredient, we should never consider it as fuel firstly + if (ceRecipe != null) return; + + int fuelTime = this.itemManager.fuelTime(item); + if (fuelTime == 0) { + if (ItemUtils.isCustomItem(item) && item.getType().isFuel()) { + event.setCancelled(true); + ItemStack smelting = furnaceInventory.getSmelting(); + if (ItemUtils.isEmpty(smelting)) { + furnaceInventory.setSmelting(item.clone()); + item.setAmount(0); + } else if (smelting.isSimilar(item)) { + int maxStackSize = smelting.getMaxStackSize(); + int canGiveMaxCount = item.getAmount(); + if (maxStackSize > smelting.getAmount()) { + if (canGiveMaxCount + smelting.getAmount() >= maxStackSize) { + int givenCount = maxStackSize - smelting.getAmount(); + smelting.setAmount(maxStackSize); + item.setAmount(item.getAmount() - givenCount); + } else { + smelting.setAmount(smelting.getAmount() + canGiveMaxCount); + item.setAmount(0); + } + } + } + player.updateInventory(); + } + return; + } + event.setCancelled(true); + furnaceInventory.setFuel(item.clone()); + item.setAmount(0); + player.updateInventory(); + } else { + if (fuelStack.isSimilar(item)) { + event.setCancelled(true); + int maxStackSize = fuelStack.getMaxStackSize(); + int canGiveMaxCount = item.getAmount(); + if (maxStackSize > fuelStack.getAmount()) { + if (canGiveMaxCount + fuelStack.getAmount() >= maxStackSize) { + int givenCount = maxStackSize - fuelStack.getAmount(); + fuelStack.setAmount(maxStackSize); + item.setAmount(item.getAmount() - givenCount); + } else { + fuelStack.setAmount(fuelStack.getAmount() + canGiveMaxCount); + item.setAmount(0); + } + player.updateInventory(); + } + } + } + } + } else { + // click the furnace inventory + int slot = event.getSlot(); + // click the fuel slot + if (slot != 1) { + return; + } + ClickType clickType = event.getClick(); + switch (clickType) { + case SWAP_OFFHAND, NUMBER_KEY -> { + ItemStack item; + int hotBarSlot = event.getHotbarButton(); + if (clickType == ClickType.SWAP_OFFHAND) { + item = player.getInventory().getItemInOffHand(); + } else { + item = player.getInventory().getItem(hotBarSlot); + } + if (item == null) return; + int fuelTime = this.plugin.itemManager().fuelTime(item); + // only handle custom items + if (fuelTime == 0) { + if (ItemUtils.isCustomItem(item) && item.getType().isFuel()) { + event.setCancelled(true); + } + return; + } + + event.setCancelled(true); + if (fuelStack == null || fuelStack.getType() == Material.AIR) { + furnaceInventory.setFuel(item.clone()); + item.setAmount(0); + } else { + if (clickType == ClickType.SWAP_OFFHAND) { + player.getInventory().setItemInOffHand(fuelStack); + } else { + player.getInventory().setItem(hotBarSlot, fuelStack); + } + furnaceInventory.setFuel(item.clone()); + } + player.updateInventory(); + } + case LEFT, RIGHT -> { + ItemStack itemOnCursor = event.getCursor(); + // pick item + if (ItemUtils.isEmpty(itemOnCursor)) return; + int fuelTime = this.plugin.itemManager().fuelTime(itemOnCursor); + // only handle custom items + if (fuelTime == 0) { + if (ItemUtils.isCustomItem(itemOnCursor) && itemOnCursor.getType().isFuel()) { + event.setCancelled(true); + } + return; + } + + event.setCancelled(true); + // The slot is empty + if (fuelStack == null || fuelStack.getType() == Material.AIR) { + if (clickType == ClickType.LEFT) { + furnaceInventory.setFuel(itemOnCursor.clone()); + itemOnCursor.setAmount(0); + player.updateInventory(); + } else { + ItemStack cloned = itemOnCursor.clone(); + cloned.setAmount(1); + furnaceInventory.setFuel(cloned); + itemOnCursor.setAmount(itemOnCursor.getAmount() - 1); + player.updateInventory(); + } + } else { + boolean isSimilar = itemOnCursor.isSimilar(fuelStack); + if (clickType == ClickType.LEFT) { + if (isSimilar) { + int maxStackSize = fuelStack.getMaxStackSize(); + int canGiveMaxCount = itemOnCursor.getAmount(); + if (maxStackSize > fuelStack.getAmount()) { + if (canGiveMaxCount + fuelStack.getAmount() >= maxStackSize) { + int givenCount = maxStackSize - fuelStack.getAmount(); + fuelStack.setAmount(maxStackSize); + itemOnCursor.setAmount(itemOnCursor.getAmount() - givenCount); + } else { + fuelStack.setAmount(fuelStack.getAmount() + canGiveMaxCount); + itemOnCursor.setAmount(0); + } + player.updateInventory(); + } + } else { + // swap item + event.setCursor(fuelStack); + furnaceInventory.setFuel(itemOnCursor.clone()); + player.updateInventory(); + } + } else { + if (isSimilar) { + int maxStackSize = fuelStack.getMaxStackSize(); + if (maxStackSize > fuelStack.getAmount()) { + fuelStack.setAmount(fuelStack.getAmount() + 1); + itemOnCursor.setAmount(itemOnCursor.getAmount() - 1); + player.updateInventory(); + } + } else { + // swap item + event.setCursor(fuelStack); + furnaceInventory.setFuel(itemOnCursor.clone()); + player.updateInventory(); + } + } + } + } + } + } + } + + @EventHandler(ignoreCancelled = true, priority = EventPriority.HIGH) + public void onFurnaceBurn(FurnaceBurnEvent event) { + ItemStack fuel = event.getFuel(); + int fuelTime = this.itemManager.fuelTime(fuel); + if (fuelTime != 0) { + event.setBurnTime(fuelTime); + } + } + + @EventHandler(ignoreCancelled = true, priority = EventPriority.MONITOR) + public void onFurnaceInventoryOpen(InventoryOpenEvent event) { + if (!ConfigManager.enableRecipeSystem()) return; + if (!(event.getInventory() instanceof FurnaceInventory furnaceInventory)) { + return; + } + Furnace furnace = furnaceInventory.getHolder(); + try { + Object blockEntity = Reflections.field$CraftBlockEntityState$tileEntity.get(furnace); + BukkitInjector.injectCookingBlockEntity(blockEntity); + } catch (Exception e) { + this.plugin.logger().warn("Failed to inject cooking block entity", e); + } + } + + // for 1.20.1-1.21.1 + @EventHandler(ignoreCancelled = true) + public void onBlockIgnite(BlockIgniteEvent event) { + if (!ConfigManager.enableRecipeSystem()) return; + if (VersionHelper.isVersionNewerThan1_21_2()) return; + Block block = event.getBlock(); + Material material = block.getType(); + if (material == Material.CAMPFIRE) { + if (block.getState() instanceof Campfire campfire) { + try { + Object blockEntity = Reflections.field$CraftBlockEntityState$tileEntity.get(campfire); + BukkitInjector.injectCookingBlockEntity(blockEntity); + } catch (Exception e) { + this.plugin.logger().warn("Failed to inject cooking block entity", e); + } + } + } + } + + @EventHandler(ignoreCancelled = true, priority = EventPriority.MONITOR) + public void onPlaceBlock(BlockPlaceEvent event) { + if (!ConfigManager.enableRecipeSystem()) return; + Block block = event.getBlock(); + Material material = block.getType(); + if (material == Material.FURNACE || material == Material.BLAST_FURNACE || material == Material.SMOKER) { + if (block.getState() instanceof Furnace furnace) { + try { + Object blockEntity = Reflections.field$CraftBlockEntityState$tileEntity.get(furnace); + BukkitInjector.injectCookingBlockEntity(blockEntity); + } catch (Exception e) { + plugin.logger().warn("Failed to inject cooking block entity", e); + } + } + } else if (!VersionHelper.isVersionNewerThan1_21_2() && material == Material.CAMPFIRE) { + if (block.getState() instanceof Campfire campfire) { + try { + Object blockEntity = Reflections.field$CraftBlockEntityState$tileEntity.get(campfire); + BukkitInjector.injectCookingBlockEntity(blockEntity); + } catch (Exception e) { + this.plugin.logger().warn("Failed to inject cooking block entity", e); + } + } + } + } + + // for 1.21.2+ + @EventHandler(ignoreCancelled = true) + public void onPutItemOnCampfire(PlayerInteractEvent event) { + if (!ConfigManager.enableRecipeSystem()) return; + if (!VersionHelper.isVersionNewerThan1_21_2()) return; + if (event.getAction() != Action.RIGHT_CLICK_BLOCK) return; + Block clicked = event.getClickedBlock(); + if (clicked == null) return; + Material type = clicked.getType(); + if (type != Material.CAMPFIRE && type != Material.SOUL_CAMPFIRE) return; + if (!VersionHelper.isVersionNewerThan1_21_2()) { + if (clicked.getState() instanceof Campfire campfire) { + try { + Object blockEntity = Reflections.field$CraftBlockEntityState$tileEntity.get(campfire); + BukkitInjector.injectCookingBlockEntity(blockEntity); + } catch (Exception e) { + this.plugin.logger().warn("Failed to inject cooking block entity", e); + } + } + } + + ItemStack itemStack = event.getItem(); + if (ItemUtils.isEmpty(itemStack)) return; + try { + @SuppressWarnings("unchecked") + Optional optionalMCRecipe = (Optional) Reflections.method$RecipeManager$getRecipeFor1.invoke( + BukkitRecipeManager.minecraftRecipeManager(), + Reflections.instance$RecipeType$CAMPFIRE_COOKING, + Reflections.constructor$SingleRecipeInput.newInstance(Reflections.method$CraftItemStack$asNMSMirror.invoke(null, itemStack)), + Reflections.field$CraftWorld$ServerLevel.get(event.getPlayer().getWorld()), + null + ); + if (optionalMCRecipe.isEmpty()) { + return; + } + Item wrappedItem = BukkitItemManager.instance().wrap(itemStack); + Optional> idHolder = BuiltInRegistries.OPTIMIZED_ITEM_ID.get(wrappedItem.id()); + if (idHolder.isEmpty()) { + return; + } + SingleItemInput input = new SingleItemInput<>(new OptimizedIDItem<>(idHolder.get(), itemStack)); + CustomCampfireRecipe ceRecipe = (CustomCampfireRecipe) this.recipeManager.getRecipe(RecipeTypes.CAMPFIRE_COOKING, input); + if (ceRecipe == null) { + event.setCancelled(true); + } + } catch (Exception e) { + this.plugin.logger().warn("Failed to handle interact campfire", e); + } + } + + // for 1.21.2+ + @EventHandler(ignoreCancelled = true) + public void onCampfireCook(CampfireStartEvent event) { + if (!ConfigManager.enableRecipeSystem()) return; + if (!VersionHelper.isVersionNewerThan1_21_2()) return; + CampfireRecipe recipe = event.getRecipe(); + Key recipeId = new Key(recipe.getKey().namespace(), recipe.getKey().value()); + + boolean isCustom = this.recipeManager.isCustomRecipe(recipeId); + if (!isCustom) { + return; + } + + ItemStack itemStack = event.getSource(); + Item wrappedItem = BukkitItemManager.instance().wrap(itemStack); + Optional> idHolder = BuiltInRegistries.OPTIMIZED_ITEM_ID.get(wrappedItem.id()); + if (idHolder.isEmpty()) { + event.setTotalCookTime(Integer.MAX_VALUE); + return; + } + + SingleItemInput input = new SingleItemInput<>(new OptimizedIDItem<>(idHolder.get(), itemStack)); + CustomCampfireRecipe ceRecipe = (CustomCampfireRecipe) this.recipeManager.getRecipe(RecipeTypes.CAMPFIRE_COOKING, input); + if (ceRecipe == null) { + event.setTotalCookTime(Integer.MAX_VALUE); + return; + } + + event.setTotalCookTime(ceRecipe.cookingTime()); + } + + // for 1.21.2+ + @EventHandler(ignoreCancelled = true) + public void onCampfireCook(BlockCookEvent event) { + if (!ConfigManager.enableRecipeSystem()) return; + if (!VersionHelper.isVersionNewerThan1_21_2()) return; + Material type = event.getBlock().getType(); + if (type != Material.CAMPFIRE && type != Material.SOUL_CAMPFIRE) return; + CampfireRecipe recipe = (CampfireRecipe) event.getRecipe(); + Key recipeId = new Key(recipe.getKey().namespace(), recipe.getKey().value()); + + boolean isCustom = this.recipeManager.isCustomRecipe(recipeId); + if (!isCustom) { + return; + } + + ItemStack itemStack = event.getSource(); + Item wrappedItem = BukkitItemManager.instance().wrap(itemStack); + Optional> idHolder = BuiltInRegistries.OPTIMIZED_ITEM_ID.get(wrappedItem.id()); + if (idHolder.isEmpty()) { + event.setCancelled(true); + return; + } + + SingleItemInput input = new SingleItemInput<>(new OptimizedIDItem<>(idHolder.get(), itemStack)); + CustomCampfireRecipe ceRecipe = (CustomCampfireRecipe) this.recipeManager.getRecipe(RecipeTypes.CAMPFIRE_COOKING, input); + if (ceRecipe == null) { + event.setCancelled(true); + return; + } + + event.setResult(ceRecipe.result(ItemBuildContext.EMPTY)); + } + + // Paper only + @EventHandler + public void onPrepareResult(PrepareResultEvent event) { + if (!ConfigManager.enableRecipeSystem()) return; + if (event.getInventory() instanceof CartographyInventory cartographyInventory) { + if (ItemUtils.hasCustomItem(cartographyInventory.getStorageContents())) { + event.setResult(new ItemStack(Material.AIR)); + } + } + } + + @EventHandler(ignoreCancelled = true) + public void onSpecialRecipe(PrepareItemCraftEvent event) { + if (!ConfigManager.enableRecipeSystem()) return; + org.bukkit.inventory.Recipe recipe = event.getRecipe(); + if (recipe == null) + return; + if (!(recipe instanceof ComplexRecipe)) + return; + CraftingInventory inventory = event.getInventory(); + if (ItemUtils.hasCustomItem(inventory.getMatrix())) { + inventory.setResult(null); + } + } + + @EventHandler(ignoreCancelled = true) + public void onCraftingRecipe(PrepareItemCraftEvent event) { + if (!ConfigManager.enableRecipeSystem()) return; + org.bukkit.inventory.Recipe recipe = event.getRecipe(); + if (recipe == null) + return; + + // we only handle shaped and shapeless recipes + boolean shapeless = event.getRecipe() instanceof ShapelessRecipe; + boolean shaped = event.getRecipe() instanceof ShapedRecipe; + if (!shaped && !shapeless) return; + + CraftingRecipe craftingRecipe = (CraftingRecipe) recipe; + Key recipeId = Key.of(craftingRecipe.getKey().namespace(), craftingRecipe.getKey().value()); + + boolean isCustom = this.recipeManager.isCustomRecipe(recipeId); + // Maybe it's recipe from other plugins, then we ignore it + if (!isCustom) { + return; + } + + CraftingInventory inventory = event.getInventory(); + ItemStack[] ingredients = inventory.getMatrix(); + + List> optimizedIDItems = new ArrayList<>(); + for (ItemStack itemStack : ingredients) { + if (ItemUtils.isEmpty(itemStack)) { + optimizedIDItems.add(EMPTY); + } else { + Item wrappedItem = this.itemManager.wrap(itemStack); + Optional> idHolder = BuiltInRegistries.OPTIMIZED_ITEM_ID.get(wrappedItem.id()); + if (idHolder.isEmpty()) { + // an invalid item is used in recipe, we disallow it + inventory.setResult(null); + return; + } else { + optimizedIDItems.add(new OptimizedIDItem<>(idHolder.get(), itemStack)); + } + } + } + + CraftingInput input; + if (ingredients.length == 9) { + input = CraftingInput.of(3, 3, optimizedIDItems); + } else if (ingredients.length == 4) { + input = CraftingInput.of(2, 2, optimizedIDItems); + } else { + return; + } + + Player player; + try { + player = (Player) Reflections.method$InventoryView$getPlayer.invoke(event.getView()); + } catch (ReflectiveOperationException e) { + plugin.logger().warn("Failed to get inventory viewer", e); + return; + } + + BukkitServerPlayer serverPlayer = this.plugin.adapt(player); + Key lastRecipe = serverPlayer.lastUsedRecipe(); + + Recipe ceRecipe = this.recipeManager.getRecipe(RecipeTypes.SHAPELESS, input, lastRecipe); + if (ceRecipe != null) { + inventory.setResult(ceRecipe.result(new ItemBuildContext(serverPlayer, ContextHolder.EMPTY))); + serverPlayer.setLastUsedRecipe(ceRecipe.id()); + correctCraftingRecipeUsed(inventory, ceRecipe); + return; + } + ceRecipe = this.recipeManager.getRecipe(RecipeTypes.SHAPED, input, lastRecipe); + if (ceRecipe != null) { + inventory.setResult(ceRecipe.result(new ItemBuildContext(serverPlayer, ContextHolder.EMPTY))); + serverPlayer.setLastUsedRecipe(ceRecipe.id()); + correctCraftingRecipeUsed(inventory, ceRecipe); + return; + } + // clear result if not met + inventory.setResult(null); + } + + private void correctCraftingRecipeUsed(CraftingInventory inventory, Recipe recipe) { + Object holderOrRecipe = recipeManager.getRecipeHolderByRecipe(recipe); + if (holderOrRecipe == null) { + // it's a vanilla recipe but not injected + return; + } + try { + Object resultInventory = Reflections.field$CraftInventoryCrafting$resultInventory.get(inventory); + Reflections.field$ResultContainer$recipeUsed.set(resultInventory, holderOrRecipe); + } catch (ReflectiveOperationException e) { + plugin.logger().warn("Failed to correct used recipe", e); + } + } +} diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/pack/BukkitPackManager.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/pack/BukkitPackManager.java new file mode 100644 index 000000000..ae2018024 --- /dev/null +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/pack/BukkitPackManager.java @@ -0,0 +1,239 @@ +package net.momirealms.craftengine.bukkit.pack; + +import net.kyori.adventure.text.Component; +import net.momirealms.craftengine.bukkit.api.event.AsyncResourcePackGenerateEvent; +import net.momirealms.craftengine.bukkit.plugin.BukkitCraftEngine; +import net.momirealms.craftengine.bukkit.plugin.command.feature.ReloadCommand; +import net.momirealms.craftengine.bukkit.plugin.user.BukkitServerPlayer; +import net.momirealms.craftengine.bukkit.util.ComponentUtils; +import net.momirealms.craftengine.bukkit.util.EventUtils; +import net.momirealms.craftengine.bukkit.util.Reflections; +import net.momirealms.craftengine.core.pack.AbstractPackManager; +import net.momirealms.craftengine.core.pack.host.HostMode; +import net.momirealms.craftengine.core.pack.host.ResourcePackHost; +import net.momirealms.craftengine.core.plugin.config.ConfigManager; +import net.momirealms.craftengine.core.plugin.network.ConnectionState; +import net.momirealms.craftengine.core.plugin.network.NetWorkUser; +import net.momirealms.craftengine.core.util.VersionHelper; +import org.bukkit.Bukkit; +import org.bukkit.entity.Player; +import org.bukkit.event.EventHandler; +import org.bukkit.event.EventPriority; +import org.bukkit.event.HandlerList; +import org.bukkit.event.Listener; +import org.bukkit.event.player.PlayerJoinEvent; +import org.bukkit.event.player.PlayerResourcePackStatusEvent; +import org.jetbrains.annotations.Nullable; + +import java.nio.file.Files; +import java.util.List; +import java.util.Optional; +import java.util.UUID; + +public class BukkitPackManager extends AbstractPackManager implements Listener { + private final BukkitCraftEngine plugin; + private HostMode previousHostMode = HostMode.NONE; + private UUID previousHostUUID; + + public BukkitPackManager(BukkitCraftEngine plugin) { + super(plugin, (rf, zp) -> { + AsyncResourcePackGenerateEvent endEvent = new AsyncResourcePackGenerateEvent(rf, zp); + EventUtils.fireAndForget(endEvent); + }); + this.plugin = plugin; + } + + @Override + public void delayedInit() { + super.delayedInit(); + Bukkit.getPluginManager().registerEvents(this, plugin.bootstrap()); + } + + @EventHandler(priority = EventPriority.LOW) + public void onPlayerJoin(PlayerJoinEvent event) { + // for 1.20.1 servers, not recommended to use + if (ConfigManager.sendPackOnJoin() && !VersionHelper.isVersionNewerThan1_20_2()) { + this.sendResourcePack(plugin.networkManager().getUser(event.getPlayer()), null); + } + } + + @EventHandler(priority = EventPriority.LOW) + public void onResourcePackStatus(PlayerResourcePackStatusEvent event) { + // for 1.20.1 servers, not recommended to use + if (ConfigManager.sendPackOnJoin() && ConfigManager.kickOnDeclined() && !VersionHelper.isVersionNewerThan1_20_2()) { + if (event.getStatus() == PlayerResourcePackStatusEvent.Status.DECLINED || event.getStatus() == PlayerResourcePackStatusEvent.Status.FAILED_DOWNLOAD) { + event.getPlayer().kick(); + } + } + } + + @Override + public void load() { + super.load(); + + // update server properties + if (VersionHelper.isVersionNewerThan1_20_2()) { + if (ConfigManager.hostMode() == HostMode.SELF_HOST) { + if (Files.exists(resourcePackPath())) { + updateResourcePackSettings(super.packUUID, ResourcePackHost.instance().url(), super.packHash, ConfigManager.kickOnDeclined(), ConfigManager.resourcePackPrompt()); + } + } else if (ConfigManager.hostMode() == HostMode.EXTERNAL_HOST) { + updateResourcePackSettings(ConfigManager.externalPackUUID(), ConfigManager.externalPackUrl(), ConfigManager.externalPackSha1(), ConfigManager.kickOnDeclined(), ConfigManager.resourcePackPrompt()); + } + } + + if (ConfigManager.sendPackOnReload()) { + if (this.previousHostMode == HostMode.SELF_HOST) { + this.previousHostUUID = super.packUUID; + } + // unload packs if user changed to none host + if (ConfigManager.hostMode() == HostMode.NONE && this.previousHostMode != HostMode.NONE) { + unloadResourcePackForOnlinePlayers(this.previousHostUUID); + } + // load new external resource pack on reload + if (ConfigManager.hostMode() == HostMode.EXTERNAL_HOST) { + if (this.previousHostMode == HostMode.NONE) { + updateResourcePackForOnlinePlayers(null); + } else { + updateResourcePackForOnlinePlayers(this.previousHostUUID); + } + // record previous host uuid here + this.previousHostUUID = ConfigManager.externalPackUUID(); + } + if (ConfigManager.hostMode() == HostMode.SELF_HOST && this.previousHostMode != HostMode.SELF_HOST) { + if (ReloadCommand.RELOAD_PACK_FLAG) { + ReloadCommand.RELOAD_PACK_FLAG = false; + if (this.previousHostMode == HostMode.NONE) { + updateResourcePackForOnlinePlayers(null); + } else if (this.previousHostMode == HostMode.EXTERNAL_HOST) { + updateResourcePackForOnlinePlayers(this.previousHostUUID); + } + } + } + } + this.previousHostMode = ConfigManager.hostMode(); + } + + @Override + public void unload() { + super.unload(); + if (VersionHelper.isVersionNewerThan1_20_2() && this.previousHostMode != HostMode.NONE) { + resetResourcePackSettings(); + } + } + + @Override + public void disable() { + super.disable(); + HandlerList.unregisterAll(this); + } + + @Override + public void generateResourcePack() { + // generate pack + super.generateResourcePack(); + // update server properties + if (VersionHelper.isVersionNewerThan1_20_2()) { + if (ConfigManager.hostMode() == HostMode.SELF_HOST) { + updateResourcePackSettings(super.packUUID, ResourcePackHost.instance().url(), super.packHash, ConfigManager.kickOnDeclined(), ConfigManager.resourcePackPrompt()); + } + } + // resend packs + if (ConfigManager.hostMode() == HostMode.SELF_HOST && ConfigManager.sendPackOnReload()) { + updateResourcePackForOnlinePlayers(this.previousHostUUID); + } + } + + protected void updateResourcePackForOnlinePlayers(UUID previousUUID) { + for (Player player : Bukkit.getOnlinePlayers()) { + BukkitServerPlayer serverPlayer = plugin.adapt(player); + sendResourcePack(serverPlayer, previousUUID); + } + } + + private void resetResourcePackSettings() { + try { + Object settings = Reflections.field$DedicatedServer$settings.get(Reflections.method$MinecraftServer$getServer.invoke(null)); + Object properties = Reflections.field$DedicatedServerSettings$properties.get(settings); + Reflections.field$DedicatedServerProperties$serverResourcePackInfo.set(properties, Optional.empty()); + } catch (Exception e) { + this.plugin.logger().warn("Failed to update resource pack settings", e); + } + } + + private void updateResourcePackSettings(UUID uuid, String url, String sha1, boolean required, Component prompt) { + try { + Object settings = Reflections.field$DedicatedServer$settings.get(Reflections.method$MinecraftServer$getServer.invoke(null)); + Object properties = Reflections.field$DedicatedServerSettings$properties.get(settings); + Object info; + if (VersionHelper.isVersionNewerThan1_20_3()) { + info = Reflections.constructor$ServerResourcePackInfo.newInstance(uuid, url, sha1, required, ComponentUtils.adventureToMinecraft(prompt)); + } else { + info = Reflections.constructor$ServerResourcePackInfo.newInstance(url + uuid, sha1, required, ComponentUtils.adventureToMinecraft(prompt)); + } + Reflections.field$DedicatedServerProperties$serverResourcePackInfo.set(properties, Optional.of(info)); + } catch (Exception e) { + this.plugin.logger().warn("Failed to update resource pack settings", e); + } + } + + public void sendResourcePack(NetWorkUser user, @Nullable UUID previousPack) { + if (ConfigManager.hostMode() == HostMode.NONE) return; + String url; + String sha1; + UUID uuid; + if (ConfigManager.hostMode() == HostMode.SELF_HOST) { + url = ResourcePackHost.instance().url(); + sha1 = super.packHash; + uuid = super.packUUID; + if (!Files.exists(resourcePackPath())) return; + } else { + url = ConfigManager.externalPackUrl(); + sha1 = ConfigManager.externalPackSha1(); + uuid = ConfigManager.externalPackUUID(); + if (uuid.equals(previousPack)) return; + } + + Object packPrompt = ComponentUtils.adventureToMinecraft(ConfigManager.resourcePackPrompt()); + try { + Object packPacket; + if (VersionHelper.isVersionNewerThan1_20_5()) { + packPacket = Reflections.constructor$ClientboundResourcePackPushPacket.newInstance( + uuid, url, sha1, ConfigManager.kickOnDeclined(), Optional.of(packPrompt) + ); + } else if (VersionHelper.isVersionNewerThan1_20_3()) { + packPacket = Reflections.constructor$ClientboundResourcePackPushPacket.newInstance( + uuid, url, sha1, ConfigManager.kickOnDeclined(), packPrompt + ); + } else { + packPacket = Reflections.constructor$ClientboundResourcePackPushPacket.newInstance( + url + uuid, sha1, ConfigManager.kickOnDeclined(), packPrompt + ); + } + if (user.decoderState() == ConnectionState.PLAY) { + if (previousPack != null && VersionHelper.isVersionNewerThan1_20_3()) { + plugin.networkManager().sendPackets(user, List.of(Reflections.constructor$ClientboundResourcePackPopPacket.newInstance(Optional.of(previousPack)), packPacket)); + } else { + user.sendPacket(packPacket, false); + } + } else { + user.nettyChannel().writeAndFlush(packPacket); + } + } catch (Exception e) { + this.plugin.logger().warn("Failed to send resource pack", e); + } + } + + public void unloadResourcePackForOnlinePlayers(UUID uuid) { + try { + for (Player player : Bukkit.getOnlinePlayers()) { + BukkitServerPlayer serverPlayer = plugin.adapt(player); + if (serverPlayer.decoderState() == ConnectionState.PLAY) { + serverPlayer.sendPacket(Reflections.constructor$ClientboundResourcePackPopPacket.newInstance(Optional.of(uuid)), true); + } + } + } catch (Exception e) { + this.plugin.logger().warn("Failed to unload online player resource pack", e); + } + } +} diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/BukkitCraftEngine.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/BukkitCraftEngine.java new file mode 100644 index 000000000..5defaa37b --- /dev/null +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/BukkitCraftEngine.java @@ -0,0 +1,355 @@ +package net.momirealms.craftengine.bukkit.plugin; + +import net.momirealms.antigrieflib.AntiGriefLib; +import net.momirealms.craftengine.bukkit.api.event.CraftEngineReloadEvent; +import net.momirealms.craftengine.bukkit.block.BukkitBlockManager; +import net.momirealms.craftengine.bukkit.block.behavior.BukkitBlockBehaviors; +import net.momirealms.craftengine.bukkit.entity.furniture.BukkitFurnitureManager; +import net.momirealms.craftengine.bukkit.item.BukkitItemManager; +import net.momirealms.craftengine.bukkit.item.behavior.BukkitItemBehaviors; +import net.momirealms.craftengine.bukkit.item.recipe.BukkitRecipeManager; +import net.momirealms.craftengine.bukkit.pack.BukkitPackManager; +import net.momirealms.craftengine.bukkit.plugin.command.BukkitCommandManager; +import net.momirealms.craftengine.bukkit.plugin.command.BukkitSenderFactory; +import net.momirealms.craftengine.bukkit.plugin.gui.BukkitGuiManager; +import net.momirealms.craftengine.bukkit.plugin.injector.BukkitInjector; +import net.momirealms.craftengine.bukkit.plugin.network.BukkitNetworkManager; +import net.momirealms.craftengine.bukkit.plugin.papi.ImageExpansion; +import net.momirealms.craftengine.bukkit.plugin.papi.ShiftExpansion; +import net.momirealms.craftengine.bukkit.plugin.scheduler.BukkitSchedulerAdapter; +import net.momirealms.craftengine.bukkit.plugin.user.BukkitServerPlayer; +import net.momirealms.craftengine.bukkit.sound.BukkitSoundManager; +import net.momirealms.craftengine.bukkit.util.EventUtils; +import net.momirealms.craftengine.bukkit.util.PlaceholderAPIUtils; +import net.momirealms.craftengine.bukkit.util.Reflections; +import net.momirealms.craftengine.bukkit.world.BukkitWorldManager; +import net.momirealms.craftengine.core.entity.player.Player; +import net.momirealms.craftengine.core.item.ItemManager; +import net.momirealms.craftengine.core.plugin.CraftEngine; +import net.momirealms.craftengine.core.plugin.classpath.ReflectionClassPathAppender; +import net.momirealms.craftengine.core.plugin.command.sender.SenderFactory; +import net.momirealms.craftengine.core.plugin.dependency.Dependencies; +import net.momirealms.craftengine.core.plugin.dependency.Dependency; +import net.momirealms.craftengine.core.plugin.gui.category.ItemBrowserManagerImpl; +import net.momirealms.craftengine.core.plugin.logger.JavaPluginLogger; +import net.momirealms.craftengine.core.plugin.scheduler.SchedulerAdapter; +import net.momirealms.craftengine.core.plugin.scheduler.SchedulerTask; +import net.momirealms.craftengine.core.util.ReflectionUtils; +import net.momirealms.craftengine.core.util.VersionHelper; +import org.bukkit.Bukkit; +import org.bukkit.Location; +import org.bukkit.World; +import org.bukkit.command.CommandSender; +import org.bukkit.inventory.ItemStack; +import org.bukkit.plugin.java.JavaPlugin; + +import java.io.*; +import java.lang.reflect.Field; +import java.nio.file.Path; +import java.util.List; +import java.util.Optional; + +@SuppressWarnings("unchecked") +public class BukkitCraftEngine extends CraftEngine { + private static BukkitCraftEngine instance; + private final JavaPlugin bootstrap; + private SchedulerTask tickTask; + private boolean successfullyLoaded = false; + private boolean requiresRestart = false; + private boolean hasMod = false; + private AntiGriefLib antiGrief; + private boolean hasPlaceholderAPI; + + public BukkitCraftEngine(JavaPlugin bootstrap) { + VersionHelper.init(serverVersion()); + instance = this; + this.bootstrap = bootstrap; + super.classPathAppender = new ReflectionClassPathAppender(this); + super.scheduler = new BukkitSchedulerAdapter(this); + super.logger = new JavaPluginLogger(bootstrap.getLogger()); + Class modClass = ReflectionUtils.getClazz(MOD_CLASS); + if (modClass != null) { + Field isSuccessfullyRegistered = ReflectionUtils.getDeclaredField(modClass, "isSuccessfullyRegistered"); + try { + assert isSuccessfullyRegistered != null; + requiresRestart = !(boolean) isSuccessfullyRegistered.get(null); + hasMod = true; + } catch (Exception ignore) { + } + } + } + + @Override + public void load() { + super.load(); + Reflections.init(); + BukkitInjector.init(); + super.networkManager = new BukkitNetworkManager(this); + super.networkManager.init(); + // load mappings and inject blocks + super.blockManager = new BukkitBlockManager(this); + super.furnitureManager = new BukkitFurnitureManager(this); + this.successfullyLoaded = true; + } + + @Override + protected List platformDependencies() { + return List.of( + Dependencies.BSTATS_BUKKIT, + Dependencies.CLOUD_BUKKIT, Dependencies.CLOUD_PAPER, Dependencies.CLOUD_BRIGADIER, Dependencies.CLOUD_MINECRAFT_EXTRAS + ); + } + + @Override + public void enable() { + if (this.hasMod && this.requiresRestart) { + logger().warn(" "); + logger().warn(" "); + logger().warn(" "); + logger().warn("This is the first time you have installed CraftEngine. A restart is required to apply the changes."); + logger().warn(" "); + logger().warn(" "); + logger().warn(" "); + Bukkit.getServer().shutdown(); + return; + } + if (!this.successfullyLoaded) { + logger().severe(" "); + logger().severe(" "); + logger().severe(" "); + logger().severe("Failed to enable CraftEngine. Please check the log on loading stage."); + logger().severe("To reduce the loss caused by plugin not loaded, now shutting down the server"); + logger().severe(" "); + logger().severe(" "); + logger().severe(" "); + Bukkit.getServer().shutdown(); + return; + } + BukkitBlockBehaviors.init(); + BukkitItemBehaviors.init(); + super.packManager = new BukkitPackManager(this); + super.senderFactory = new BukkitSenderFactory(this); + super.itemManager = new BukkitItemManager(this); + super.recipeManager = new BukkitRecipeManager(this); + super.commandManager = new BukkitCommandManager(this); + super.itemBrowserManager = new ItemBrowserManagerImpl(this); + super.guiManager = new BukkitGuiManager(this); + super.worldManager = new BukkitWorldManager(this); + super.soundManager = new BukkitSoundManager(this); + super.enable(); + // tick task + if (VersionHelper.isFolia()) { + this.tickTask = this.scheduler().sync().runRepeating(() -> { + for (BukkitServerPlayer serverPlayer : networkManager().onlineUsers()) { + org.bukkit.entity.Player player = serverPlayer.platformPlayer(); + Location location = player.getLocation(); + scheduler().sync().run(serverPlayer::tick, player.getWorld(), location.getBlockX() >> 4, location.getBlockZ() >> 4); + } + }, 1, 1); + } else { + this.tickTask = this.scheduler().sync().runRepeating(() -> { + for (BukkitServerPlayer serverPlayer : networkManager().onlineUsers()) { + serverPlayer.tick(); + } + }, 1, 1); + } + + // compatibility + // register expansion + if (this.isPluginEnabled("PlaceholderAPI")) { + new ShiftExpansion(this).register(); + new ImageExpansion(this).register(); + this.hasPlaceholderAPI = true; + } + // WorldEdit + if (this.isPluginEnabled("FastAsyncWorldEdit")) { + this.blockManager().initFastAsyncWorldEditHook(); + } else if (this.isPluginEnabled("WorldEdit")) { + this.blockManager().initWorldEditHook(); + } + } + + @Override + public void disable() { + super.disable(); + if (this.tickTask != null) this.tickTask.cancel(); + } + + @Override + public void reload() { + super.reload(); + CraftEngineReloadEvent event = new CraftEngineReloadEvent(this); + EventUtils.fireAndForget(event); + } + + @Override + protected void registerParsers() { + // register template parser + this.packManager.registerConfigSectionParser(this.templateManager); + // register font parser + this.packManager.registerConfigSectionParser(this.imageManager); + // register item parser + this.packManager.registerConfigSectionParser(this.itemManager); + // register furniture parser + this.packManager.registerConfigSectionParser(this.furnitureManager); + // register block parser + this.packManager.registerConfigSectionParser(this.blockManager); + // register recipe parser + this.packManager.registerConfigSectionParser(this.recipeManager); + // register category parser + this.packManager.registerConfigSectionParser(this.itemBrowserManager); + // register translation parser + this.packManager.registerConfigSectionParser(this.translationManager); + this.packManager.registerConfigSectionParser(this.translationManager.clientLangManager()); + // register sound parser + this.packManager.registerConfigSectionParser(this.soundManager); + this.packManager.registerConfigSectionParser(this.soundManager.jukeboxSongManager()); + } + + @Override + public InputStream resourceStream(String filePath) { + return bootstrap.getResource(filePath.replace("\\", "/")); + } + + @Override + public File dataFolderFile() { + return bootstrap().getDataFolder(); + } + + @Override + public Path dataFolderPath() { + return bootstrap().getDataFolder().toPath().toAbsolutePath(); + } + + @SuppressWarnings("deprecation") + @Override + public String pluginVersion() { + return bootstrap().getDescription().getVersion(); + } + + @Override + public String serverVersion() { + return Bukkit.getServer().getBukkitVersion().split("-")[0]; + } + + @Override + public SchedulerAdapter scheduler() { + return (SchedulerAdapter) scheduler; + } + + @Override + public ItemManager itemManager() { + return (ItemManager) itemManager; + } + + @Override + public BukkitBlockManager blockManager() { + return (BukkitBlockManager) blockManager; + } + + @Override + public BukkitFurnitureManager furnitureManager() { + return (BukkitFurnitureManager) furnitureManager; + } + + @Override + public SenderFactory senderFactory() { + return (SenderFactory) senderFactory; + } + + public JavaPlugin bootstrap() { + return bootstrap; + } + + public static BukkitCraftEngine instance() { + return instance; + } + + @Override + public boolean hasPlaceholderAPI() { + return this.hasPlaceholderAPI; + } + + @Override + public boolean isPluginEnabled(String plugin) { + return Bukkit.getPluginManager().isPluginEnabled(plugin); + } + + @Override + public String parse(Player player, String text) { + return PlaceholderAPIUtils.parse((org.bukkit.entity.Player) player.platformPlayer(), text); + } + + @Override + public BukkitNetworkManager networkManager() { + return (BukkitNetworkManager) networkManager; + } + + @Override + public BukkitPackManager packManager() { + return (BukkitPackManager) packManager; + } + + @SuppressWarnings("ResultOfMethodCallIgnored") + @Override + public void saveResource(String resourcePath) { + if (resourcePath.isEmpty()) { + throw new IllegalArgumentException("ResourcePath cannot be null or empty"); + } + + File outFile = new File(dataFolderFile(), resourcePath); + if (outFile.exists()) + return; + + resourcePath = resourcePath.replace('\\', '/'); + InputStream in = resourceStream(resourcePath); + if (in == null) + return; + + int lastIndex = resourcePath.lastIndexOf('/'); + File outDir = new File(dataFolderFile(), resourcePath.substring(0, Math.max(lastIndex, 0))); + + if (!outDir.exists()) { + outDir.mkdirs(); + } + + try { + OutputStream out = new FileOutputStream(outFile); + byte[] buf = new byte[1024]; + int len; + while ((len = in.read(buf)) > 0) { + out.write(buf, 0, len); + } + out.close(); + in.close(); + + } catch (IOException ex) { + throw new RuntimeException(ex); + } + } + + public BukkitServerPlayer adapt(org.bukkit.entity.Player player) { + if (player == null) return null; + return Optional.ofNullable((BukkitServerPlayer) networkManager().getOnlineUser(player)).orElseGet( + () -> (BukkitServerPlayer) networkManager().getUser(player) + ); + } + + public boolean hasMod() { + return hasMod; + } + + public boolean requiresRestart() { + return requiresRestart; + } + + public AntiGriefLib antiGrief() { + if (this.antiGrief == null) { + this.antiGrief = AntiGriefLib.builder(this.bootstrap) + .ignoreOP(true) + .silentLogs(true) + .build(); + } + return this.antiGrief; + } +} diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/command/BukkitCommandFeature.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/command/BukkitCommandFeature.java new file mode 100644 index 000000000..6078fe16b --- /dev/null +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/command/BukkitCommandFeature.java @@ -0,0 +1,43 @@ +package net.momirealms.craftengine.bukkit.plugin.command; + +import net.kyori.adventure.text.Component; +import net.kyori.adventure.text.TranslatableComponent; +import net.momirealms.craftengine.bukkit.plugin.BukkitCraftEngine; +import net.momirealms.craftengine.core.plugin.CraftEngine; +import net.momirealms.craftengine.core.plugin.command.AbstractCommandFeature; +import net.momirealms.craftengine.core.plugin.command.CraftEngineCommandManager; +import net.momirealms.craftengine.core.util.Pair; +import org.bukkit.command.CommandSender; +import org.bukkit.entity.Entity; +import org.incendo.cloud.bukkit.data.Selector; + +import java.util.Collection; + +public abstract class BukkitCommandFeature extends AbstractCommandFeature { + + public BukkitCommandFeature(CraftEngineCommandManager commandManager, CraftEngine plugin) { + super(commandManager, plugin); + } + + public Pair resolveSelector(Selector selector, TranslatableComponent.Builder single, TranslatableComponent.Builder multiple) { + Collection entities = selector.values(); + if (entities.size() == 1) { + return Pair.of(single, Component.text(entities.iterator().next().getName())); + } else { + return Pair.of(multiple, Component.text(entities.size())); + } + } + + public Pair resolveSelector(Collection selector, TranslatableComponent.Builder single, TranslatableComponent.Builder multiple) { + if (selector.size() == 1) { + return Pair.of(single, Component.text(selector.iterator().next().getName())); + } else { + return Pair.of(multiple, Component.text(selector.size())); + } + } + + @Override + public BukkitCraftEngine plugin() { + return (BukkitCraftEngine) super.plugin(); + } +} diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/command/BukkitCommandManager.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/command/BukkitCommandManager.java new file mode 100644 index 000000000..9553c3c45 --- /dev/null +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/command/BukkitCommandManager.java @@ -0,0 +1,64 @@ +package net.momirealms.craftengine.bukkit.plugin.command; + +import net.kyori.adventure.util.Index; +import net.momirealms.craftengine.bukkit.plugin.BukkitCraftEngine; +import net.momirealms.craftengine.bukkit.plugin.command.feature.*; +import net.momirealms.craftengine.core.plugin.command.AbstractCommandManager; +import net.momirealms.craftengine.core.plugin.command.CommandFeature; +import net.momirealms.craftengine.core.plugin.command.parser.BlockStateParser; +import net.momirealms.craftengine.core.plugin.command.sender.Sender; +import org.bukkit.command.CommandSender; +import org.incendo.cloud.SenderMapper; +import org.incendo.cloud.bukkit.CloudBukkitCapabilities; +import org.incendo.cloud.execution.ExecutionCoordinator; +import org.incendo.cloud.paper.LegacyPaperCommandManager; +import org.incendo.cloud.setting.ManagerSetting; + +import java.util.List; + +public class BukkitCommandManager extends AbstractCommandManager { + private final BukkitCraftEngine plugin; + private final Index> INDEX; + + public BukkitCommandManager(BukkitCraftEngine plugin) { + super(plugin, new LegacyPaperCommandManager<>( + plugin.bootstrap(), + ExecutionCoordinator.simpleCoordinator(), + SenderMapper.identity() + )); + this.plugin = plugin; + this.INDEX = Index.create(CommandFeature::getFeatureID, List.of( + new ReloadCommand(this, plugin), + new GetItemCommand(this, plugin), + new GiveItemCommand(this, plugin), + new ItemBrowserCommand(this, plugin), + new TestCommand(this, plugin), + new DebugGetBlockStateRegistryIdCommand(this, plugin), + new DebugGetBlockInternalIdCommand(this, plugin), + new DebugAppearanceStateUsageCommand(this, plugin), + new DebugRealStateUsageCommand(this, plugin), + new DebugItemDataCommand(this, plugin), + new DebugSetBlockCommand(this, plugin), + new DebugTargetBlockCommand(this, plugin) + )); + final LegacyPaperCommandManager manager = (LegacyPaperCommandManager) getCommandManager(); + manager.settings().set(ManagerSetting.ALLOW_UNSAFE_REGISTRATION, true); + manager.parserRegistry().registerParser(BlockStateParser.blockStateParser()); + if (manager.hasCapability(CloudBukkitCapabilities.NATIVE_BRIGADIER)) { + manager.registerBrigadier(); + manager.brigadierManager().setNativeNumberSuggestions(true); + } else if (manager.hasCapability(CloudBukkitCapabilities.ASYNCHRONOUS_COMPLETION)) { + manager.registerAsynchronousCompletions(); + } + } + + @Override + protected Sender wrapSender(CommandSender sender) { + return plugin.senderFactory().wrap(sender); + } + + @Override + public Index> features() { + return INDEX; + } +} diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/command/BukkitSenderFactory.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/command/BukkitSenderFactory.java new file mode 100644 index 000000000..57985118a --- /dev/null +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/command/BukkitSenderFactory.java @@ -0,0 +1,87 @@ +package net.momirealms.craftengine.bukkit.plugin.command; + +import net.kyori.adventure.audience.Audience; +import net.kyori.adventure.platform.bukkit.BukkitAudiences; +import net.kyori.adventure.text.Component; +import net.momirealms.craftengine.bukkit.plugin.BukkitCraftEngine; +import net.momirealms.craftengine.core.plugin.command.sender.Sender; +import net.momirealms.craftengine.core.plugin.command.sender.SenderFactory; +import net.momirealms.craftengine.core.util.Tristate; +import org.bukkit.command.CommandSender; +import org.bukkit.command.ConsoleCommandSender; +import org.bukkit.command.RemoteConsoleCommandSender; +import org.bukkit.entity.Player; + +import java.util.UUID; + +public class BukkitSenderFactory extends SenderFactory { + private final BukkitAudiences audiences; + + public BukkitSenderFactory(BukkitCraftEngine plugin) { + super(plugin); + this.audiences = BukkitAudiences.create(plugin.bootstrap()); + } + + @Override + protected String name(CommandSender sender) { + if (sender instanceof Player) { + return sender.getName(); + } + return Sender.CONSOLE_NAME; + } + + @Override + protected UUID uniqueId(CommandSender sender) { + if (sender instanceof Player) { + return ((Player) sender).getUniqueId(); + } + return Sender.CONSOLE_UUID; + } + + @Override + public Audience audience(CommandSender sender) { + return this.audiences.sender(sender); + } + + @Override + protected void sendMessage(CommandSender sender, Component message) { + // we can safely send async for players and the console - otherwise, send it sync + if (sender instanceof Player || sender instanceof ConsoleCommandSender || sender instanceof RemoteConsoleCommandSender) { + audience(sender).sendMessage(message); + } else { + plugin().scheduler().executeSync(() -> audience(sender).sendMessage(message)); + } + } + + @Override + protected Tristate permissionState(CommandSender sender, String node) { + if (sender.hasPermission(node)) { + return Tristate.TRUE; + } else if (sender.isPermissionSet(node)) { + return Tristate.FALSE; + } else { + return Tristate.UNDEFINED; + } + } + + @Override + protected boolean hasPermission(CommandSender sender, String node) { + return sender.hasPermission(node); + } + + @Override + protected void performCommand(CommandSender sender, String command) { + plugin().bootstrap().getServer().dispatchCommand(sender, command); + } + + @Override + protected boolean isConsole(CommandSender sender) { + return sender instanceof ConsoleCommandSender || sender instanceof RemoteConsoleCommandSender; + } + + @Override + public void close() { + super.close(); + this.audiences.close(); + } +} diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/command/feature/DebugAppearanceStateUsageCommand.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/command/feature/DebugAppearanceStateUsageCommand.java new file mode 100644 index 000000000..78ba75961 --- /dev/null +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/command/feature/DebugAppearanceStateUsageCommand.java @@ -0,0 +1,79 @@ +package net.momirealms.craftengine.bukkit.plugin.command.feature; + +import net.kyori.adventure.text.Component; +import net.kyori.adventure.text.event.HoverEvent; +import net.kyori.adventure.text.format.NamedTextColor; +import net.momirealms.craftengine.bukkit.block.BukkitBlockManager; +import net.momirealms.craftengine.bukkit.plugin.command.BukkitCommandFeature; +import net.momirealms.craftengine.bukkit.util.BlockStateUtils; +import net.momirealms.craftengine.core.plugin.CraftEngine; +import net.momirealms.craftengine.core.plugin.command.CraftEngineCommandManager; +import net.momirealms.craftengine.core.util.Key; +import org.bukkit.command.CommandSender; +import org.checkerframework.checker.nullness.qual.NonNull; +import org.incendo.cloud.Command; +import org.incendo.cloud.context.CommandContext; +import org.incendo.cloud.context.CommandInput; +import org.incendo.cloud.parser.standard.StringParser; +import org.incendo.cloud.suggestion.Suggestion; +import org.incendo.cloud.suggestion.SuggestionProvider; + +import java.util.ArrayList; +import java.util.List; +import java.util.concurrent.CompletableFuture; + +public class DebugAppearanceStateUsageCommand extends BukkitCommandFeature { + + public DebugAppearanceStateUsageCommand(CraftEngineCommandManager commandManager, CraftEngine plugin) { + super(commandManager, plugin); + } + + @Override + public Command.Builder assembleCommand(org.incendo.cloud.CommandManager manager, Command.Builder builder) { + return builder + .required("id", StringParser.stringComponent(StringParser.StringMode.GREEDY_FLAG_YIELDING).suggestionProvider(new SuggestionProvider<>() { + @Override + public @NonNull CompletableFuture> suggestionsFuture(@NonNull CommandContext context, @NonNull CommandInput input) { + return CompletableFuture.completedFuture(plugin().blockManager().blockAppearanceArranger().keySet().stream().map(it -> Suggestion.suggestion(it.toString())).toList()); + } + })) + .handler(context -> { + String data = context.get("id"); + BukkitBlockManager blockManager = plugin().blockManager(); + Key baseBlockId = Key.of(data); + List appearances = blockManager.blockAppearanceArranger().get(baseBlockId); + if (appearances == null) return; + int i = 0; + Component component = Component.text(baseBlockId + ": "); + List children = new ArrayList<>(); + for (int appearance : appearances) { + Component text = Component.text("|"); + List reals = blockManager.appearanceToRealStates(appearance); + if (reals == null) { + Component hover = Component.text(baseBlockId.value() + ":" + i).color(NamedTextColor.GREEN); + hover = hover.append(Component.newline()).append(Component.text(BlockStateUtils.fromBlockData(BlockStateUtils.idToBlockState(appearance)).getAsString()).color(NamedTextColor.GREEN)); + text = text.color(NamedTextColor.GREEN).hoverEvent(HoverEvent.showText(hover)); + } else { + Component hover = Component.text(baseBlockId.value() + ":" + i).color(NamedTextColor.RED); + List hoverChildren = new ArrayList<>(); + hoverChildren.add(Component.newline()); + hoverChildren.add(Component.text(BlockStateUtils.fromBlockData(BlockStateUtils.idToBlockState(appearance)).getAsString()).color(NamedTextColor.RED)); + for (int real : reals) { + hoverChildren.add(Component.newline()); + hoverChildren.add(Component.text(blockManager.getImmutableBlockStateUnsafe(real).toString()).color(NamedTextColor.GRAY)); + } + text = text.color(NamedTextColor.RED).hoverEvent(HoverEvent.showText(hover.children(hoverChildren))); + } + children.add(text); + i++; + } + plugin().senderFactory().wrap(context.sender()) + .sendMessage(component.children(children)); + }); + } + + @Override + public String getFeatureID() { + return "debug_appearance_state_usage"; + } +} diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/command/feature/DebugGetBlockInternalIdCommand.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/command/feature/DebugGetBlockInternalIdCommand.java new file mode 100644 index 000000000..ac1e9ae7b --- /dev/null +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/command/feature/DebugGetBlockInternalIdCommand.java @@ -0,0 +1,49 @@ +package net.momirealms.craftengine.bukkit.plugin.command.feature; + +import net.momirealms.craftengine.bukkit.plugin.command.BukkitCommandFeature; +import net.momirealms.craftengine.bukkit.util.BlockStateUtils; +import net.momirealms.craftengine.core.block.BlockStateParser; +import net.momirealms.craftengine.core.block.ImmutableBlockState; +import net.momirealms.craftengine.core.plugin.CraftEngine; +import net.momirealms.craftengine.core.plugin.command.CraftEngineCommandManager; +import net.momirealms.craftengine.core.plugin.command.FlagKeys; +import org.bukkit.command.CommandSender; +import org.checkerframework.checker.nullness.qual.NonNull; +import org.incendo.cloud.Command; +import org.incendo.cloud.context.CommandContext; +import org.incendo.cloud.context.CommandInput; +import org.incendo.cloud.parser.standard.StringParser; +import org.incendo.cloud.suggestion.Suggestion; +import org.incendo.cloud.suggestion.SuggestionProvider; + +import java.util.concurrent.CompletableFuture; + +public class DebugGetBlockInternalIdCommand extends BukkitCommandFeature { + + public DebugGetBlockInternalIdCommand(CraftEngineCommandManager commandManager, CraftEngine plugin) { + super(commandManager, plugin); + } + + @Override + public Command.Builder assembleCommand(org.incendo.cloud.CommandManager manager, Command.Builder builder) { + return builder + .flag(FlagKeys.SILENT_FLAG) + .required("id", StringParser.stringComponent(StringParser.StringMode.GREEDY_FLAG_YIELDING).suggestionProvider(new SuggestionProvider<>() { + @Override + public @NonNull CompletableFuture> suggestionsFuture(@NonNull CommandContext context, @NonNull CommandInput input) { + return CompletableFuture.completedFuture(plugin().blockManager().cachedSuggestions()); + } + })) + .handler(context -> { + String data = context.get("id"); + ImmutableBlockState state = BlockStateParser.deserialize(data); + if (state == null) return; + context.sender().sendMessage(BlockStateUtils.getBlockOwnerIdFromState(state.customBlockState().handle()).toString()); + }); + } + + @Override + public String getFeatureID() { + return "debug_get_block_internal_id"; + } +} diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/command/feature/DebugGetBlockStateRegistryIdCommand.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/command/feature/DebugGetBlockStateRegistryIdCommand.java new file mode 100644 index 000000000..f26a12f6a --- /dev/null +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/command/feature/DebugGetBlockStateRegistryIdCommand.java @@ -0,0 +1,37 @@ +package net.momirealms.craftengine.bukkit.plugin.command.feature; + +import net.momirealms.craftengine.bukkit.plugin.command.BukkitCommandFeature; +import net.momirealms.craftengine.bukkit.util.BlockStateUtils; +import net.momirealms.craftengine.core.plugin.CraftEngine; +import net.momirealms.craftengine.core.plugin.command.CraftEngineCommandManager; +import org.bukkit.Bukkit; +import org.bukkit.block.data.BlockData; +import org.bukkit.command.CommandSender; +import org.bukkit.entity.Player; +import org.incendo.cloud.Command; +import org.incendo.cloud.parser.standard.StringParser; + +public class DebugGetBlockStateRegistryIdCommand extends BukkitCommandFeature { + + public DebugGetBlockStateRegistryIdCommand(CraftEngineCommandManager commandManager, CraftEngine plugin) { + super(commandManager, plugin); + } + + @Override + public Command.Builder assembleCommand(org.incendo.cloud.CommandManager manager, Command.Builder builder) { + return builder + .senderType(Player.class) + .required("state", StringParser.greedyStringParser()) + .handler(context -> { + String state = context.get("state"); + BlockData blockData = Bukkit.createBlockData(state); + int id = BlockStateUtils.blockDataToId(blockData); + context.sender().sendMessage(String.valueOf(id)); + }); + } + + @Override + public String getFeatureID() { + return "debug_get_block_state_registry_id"; + } +} diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/command/feature/DebugItemDataCommand.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/command/feature/DebugItemDataCommand.java new file mode 100644 index 000000000..e11d107d7 --- /dev/null +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/command/feature/DebugItemDataCommand.java @@ -0,0 +1,160 @@ +package net.momirealms.craftengine.bukkit.plugin.command.feature; + +import com.saicone.rtag.RtagMirror; +import com.saicone.rtag.item.ItemObject; +import com.saicone.rtag.tag.TagCompound; +import net.kyori.adventure.text.Component; +import net.kyori.adventure.text.format.NamedTextColor; +import net.momirealms.craftengine.bukkit.plugin.command.BukkitCommandFeature; +import net.momirealms.craftengine.bukkit.util.ItemUtils; +import net.momirealms.craftengine.core.plugin.CraftEngine; +import net.momirealms.craftengine.core.plugin.command.CraftEngineCommandManager; +import net.momirealms.craftengine.core.util.AdventureHelper; +import org.bukkit.command.CommandSender; +import org.bukkit.entity.Player; +import org.bukkit.inventory.ItemStack; +import org.incendo.cloud.Command; + +import java.util.*; + +public class DebugItemDataCommand extends BukkitCommandFeature { + + public DebugItemDataCommand(CraftEngineCommandManager commandManager, CraftEngine plugin) { + super(commandManager, plugin); + } + + @Override + public Command.Builder assembleCommand(org.incendo.cloud.CommandManager manager, Command.Builder builder) { + return builder + .senderType(Player.class) + .handler(context -> { + ItemStack itemInHand = context.sender().getInventory().getItemInMainHand(); + if (ItemUtils.isEmpty(itemInHand)) { + plugin().senderFactory().wrap(context.sender()).sendMessage(Component.text("Please hold an item").color(NamedTextColor.RED)); + return; + } + Map readableMap = toReadableMap(itemInHand); + readableMap.remove("rtagDataVersion"); + List readableList = mapToList(readableMap); + StringJoiner joiner = new StringJoiner(""); + for (String text : readableList) { + joiner.add(text); + } + plugin().senderFactory().wrap(context.sender()).sendMessage(AdventureHelper.miniMessage(joiner.toString())); + }); + } + + @Override + public String getFeatureID() { + return "debug_item_data"; + } + + + public static Map toReadableMap(ItemStack item) { + return toMap(item); + } + + private static Map toMap(ItemStack object) { + return TagCompound.getValue(RtagMirror.INSTANCE, toCompound(object)); + } + + private static Object toCompound(ItemStack object) { + if (object == null) { + return null; + } else { + Object compound = extract(object); + return TagCompound.isTagCompound(compound) ? compound : null; + } + } + + private static Object extract(ItemStack object) { + return ItemObject.save(ItemObject.asNMSCopy(object)); + } + + private List mapToList(Map readableDataMap) { + List list = new ArrayList<>(); + mapToList(readableDataMap, list, 0, false); + return list; + } + + @SuppressWarnings("unchecked") + private void mapToList(Map map, List readableList, int loopTimes, boolean isMapList) { + boolean first = true; + for (Map.Entry entry : map.entrySet()) { + Object nbt = entry.getValue(); + if (nbt instanceof List list) { + if (isMapList && first) { + first = false; + readableList.add(" ".repeat(loopTimes - 1) + + "<#F5F5F5>- List'>" + entry.getKey() + ":"); + } else { + readableList.add(" ".repeat(loopTimes) + + "<#F5F5F5>List'>" + entry.getKey() + ":"); + } + for (Object value : list) { + if (value instanceof Map innerDataMap) { + mapToList((Map) innerDataMap, readableList, loopTimes + 2, true); + } else { + if (value instanceof String string) { + readableList.add(" ".repeat(loopTimes + 1) + + "<#F5F5F5>- Copy'>" + value + ""); + } else { + readableList.add(" ".repeat(loopTimes + 1) + + "<#F5F5F5>- Copy'>" + value + ""); + } + } + } + } else if (nbt instanceof Map innerMap) { + if (isMapList && first) { + first = false; + readableList.add(" ".repeat(loopTimes - 1) + + "<#F5F5F5>- Map'>" + entry.getKey() + ":"); + } else { + readableList.add(" ".repeat(loopTimes) + + "<#F5F5F5>Map'>" + entry.getKey() + ":"); + } + mapToList((Map) innerMap, readableList, loopTimes + 1, false); + } else { + String value; + if (nbt.getClass().isArray()) { + if (nbt instanceof Object[]) { + value = Arrays.deepToString((Object[]) nbt); + } else if (nbt instanceof int[]) { + value = Arrays.toString((int[]) nbt); + } else if (nbt instanceof long[]) { + value = Arrays.toString((long[]) nbt); + } else if (nbt instanceof double[]) { + value = Arrays.toString((double[]) nbt); + } else if (nbt instanceof float[]) { + value = Arrays.toString((float[]) nbt); + } else if (nbt instanceof boolean[]) { + value = Arrays.toString((boolean[]) nbt); + } else if (nbt instanceof byte[]) { + value = Arrays.toString((byte[]) nbt); + } else if (nbt instanceof char[]) { + value = Arrays.toString((char[]) nbt); + } else if (nbt instanceof short[]) { + value = Arrays.toString((short[]) nbt); + } else { + value = "Unknown array type"; + } + } else { + value = nbt.toString(); + } + + if (isMapList && first) { + first = false; + readableList.add(" ".repeat(loopTimes - 1) + + "<#F5F5F5>- " + nbt.getClass().getSimpleName() + "'>" + entry.getKey() + "" + + ": " + + "<#F5F5F5>Copy'>" + value + ""); + } else { + readableList.add(" ".repeat(loopTimes) + + "<#F5F5F5>" + nbt.getClass().getSimpleName() + "'>" + entry.getKey() + "" + + ": " + + "Copy'>" + value + ""); + } + } + } + } +} diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/command/feature/DebugRealStateUsageCommand.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/command/feature/DebugRealStateUsageCommand.java new file mode 100644 index 000000000..2f02083da --- /dev/null +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/command/feature/DebugRealStateUsageCommand.java @@ -0,0 +1,70 @@ +package net.momirealms.craftengine.bukkit.plugin.command.feature; + +import net.kyori.adventure.text.Component; +import net.kyori.adventure.text.event.HoverEvent; +import net.kyori.adventure.text.format.NamedTextColor; +import net.momirealms.craftengine.bukkit.block.BukkitBlockManager; +import net.momirealms.craftengine.bukkit.plugin.command.BukkitCommandFeature; +import net.momirealms.craftengine.core.block.ImmutableBlockState; +import net.momirealms.craftengine.core.plugin.CraftEngine; +import net.momirealms.craftengine.core.plugin.command.CraftEngineCommandManager; +import net.momirealms.craftengine.core.util.Key; +import org.bukkit.command.CommandSender; +import org.checkerframework.checker.nullness.qual.NonNull; +import org.incendo.cloud.Command; +import org.incendo.cloud.context.CommandContext; +import org.incendo.cloud.context.CommandInput; +import org.incendo.cloud.parser.standard.StringParser; +import org.incendo.cloud.suggestion.Suggestion; +import org.incendo.cloud.suggestion.SuggestionProvider; + +import java.util.ArrayList; +import java.util.List; +import java.util.concurrent.CompletableFuture; + +public class DebugRealStateUsageCommand extends BukkitCommandFeature { + + public DebugRealStateUsageCommand(CraftEngineCommandManager commandManager, CraftEngine plugin) { + super(commandManager, plugin); + } + + @Override + public Command.Builder assembleCommand(org.incendo.cloud.CommandManager manager, Command.Builder builder) { + return builder + .required("id", StringParser.stringComponent(StringParser.StringMode.GREEDY_FLAG_YIELDING).suggestionProvider(new SuggestionProvider<>() { + @Override + public @NonNull CompletableFuture> suggestionsFuture(@NonNull CommandContext context, @NonNull CommandInput input) { + return CompletableFuture.completedFuture(plugin().blockManager().blockAppearanceArranger().keySet().stream().map(it -> Suggestion.suggestion(it.toString())).toList()); + } + })) + .handler(context -> { + String data = context.get("id"); + BukkitBlockManager blockManager = plugin().blockManager(); + Key baseBlockId = Key.of(data); + List reals = blockManager.realBlockArranger().get(baseBlockId); + if (reals == null) return; + int i = 0; + Component component = Component.text(baseBlockId + ": "); + List children = new ArrayList<>(); + for (int real : reals) { + ImmutableBlockState state = blockManager.getImmutableBlockStateUnsafe(real); + if (state.isEmpty()) { + Component hover = Component.text("craftengine:" + baseBlockId.value() + "_" + i).color(NamedTextColor.GREEN); + children.add(Component.text("|").color(NamedTextColor.GREEN).hoverEvent(HoverEvent.showText(hover))); + } else { + Component hover = Component.text("craftengine:" + baseBlockId.value() + "_" + i).color(NamedTextColor.RED); + hover = hover.append(Component.newline()).append(Component.text(state.toString()).color(NamedTextColor.GRAY)); + children.add(Component.text("|").color(NamedTextColor.RED).hoverEvent(HoverEvent.showText(hover))); + } + i++; + } + plugin().senderFactory().wrap(context.sender()) + .sendMessage(component.children(children)); + }); + } + + @Override + public String getFeatureID() { + return "debug_real_state_usage"; + } +} diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/command/feature/DebugSetBlockCommand.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/command/feature/DebugSetBlockCommand.java new file mode 100644 index 000000000..80cf55d91 --- /dev/null +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/command/feature/DebugSetBlockCommand.java @@ -0,0 +1,52 @@ +package net.momirealms.craftengine.bukkit.plugin.command.feature; + +import net.momirealms.craftengine.bukkit.api.CraftEngineBlocks; +import net.momirealms.craftengine.bukkit.plugin.command.BukkitCommandFeature; +import net.momirealms.craftengine.core.block.BlockStateParser; +import net.momirealms.craftengine.core.block.ImmutableBlockState; +import net.momirealms.craftengine.core.block.UpdateOption; +import net.momirealms.craftengine.core.plugin.CraftEngine; +import net.momirealms.craftengine.core.plugin.command.CraftEngineCommandManager; +import org.bukkit.Location; +import org.bukkit.command.CommandSender; +import org.checkerframework.checker.nullness.qual.NonNull; +import org.incendo.cloud.Command; +import org.incendo.cloud.bukkit.parser.location.LocationParser; +import org.incendo.cloud.context.CommandContext; +import org.incendo.cloud.context.CommandInput; +import org.incendo.cloud.parser.standard.StringParser; +import org.incendo.cloud.suggestion.Suggestion; +import org.incendo.cloud.suggestion.SuggestionProvider; + +import java.util.concurrent.CompletableFuture; + +public class DebugSetBlockCommand extends BukkitCommandFeature { + + public DebugSetBlockCommand(CraftEngineCommandManager commandManager, CraftEngine plugin) { + super(commandManager, plugin); + } + + @Override + public Command.Builder assembleCommand(org.incendo.cloud.CommandManager manager, Command.Builder builder) { + return builder + .required("location", LocationParser.locationParser()) + .required("id", StringParser.stringComponent(StringParser.StringMode.GREEDY_FLAG_YIELDING).suggestionProvider(new SuggestionProvider<>() { + @Override + public @NonNull CompletableFuture> suggestionsFuture(@NonNull CommandContext context, @NonNull CommandInput input) { + return CompletableFuture.completedFuture(plugin().blockManager().cachedSuggestions()); + } + })) + .handler(context -> { + String data = context.get("id"); + ImmutableBlockState state = BlockStateParser.deserialize(data); + if (state == null) return; + Location location = context.get("location"); + CraftEngineBlocks.place(location, state, UpdateOption.UPDATE_ALL, false); + }); + } + + @Override + public String getFeatureID() { + return "debug_set_block"; + } +} diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/command/feature/DebugTargetBlockCommand.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/command/feature/DebugTargetBlockCommand.java new file mode 100644 index 000000000..ff3722abd --- /dev/null +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/command/feature/DebugTargetBlockCommand.java @@ -0,0 +1,73 @@ +package net.momirealms.craftengine.bukkit.plugin.command.feature; + +import net.kyori.adventure.text.Component; +import net.momirealms.craftengine.bukkit.block.BukkitBlockManager; +import net.momirealms.craftengine.bukkit.plugin.command.BukkitCommandFeature; +import net.momirealms.craftengine.bukkit.util.BlockStateUtils; +import net.momirealms.craftengine.bukkit.util.Reflections; +import net.momirealms.craftengine.core.block.ImmutableBlockState; +import net.momirealms.craftengine.core.plugin.CraftEngine; +import net.momirealms.craftengine.core.plugin.command.CraftEngineCommandManager; +import net.momirealms.craftengine.core.plugin.command.sender.Sender; +import org.bukkit.Location; +import org.bukkit.block.Block; +import org.bukkit.command.CommandSender; +import org.bukkit.entity.Player; +import org.incendo.cloud.Command; + +import java.util.Set; + +public class DebugTargetBlockCommand extends BukkitCommandFeature { + + public DebugTargetBlockCommand(CraftEngineCommandManager commandManager, CraftEngine plugin) { + super(commandManager, plugin); + } + + @Override + public Command.Builder assembleCommand(org.incendo.cloud.CommandManager manager, Command.Builder builder) { + return builder + .senderType(Player.class) + .flag(manager.flagBuilder("this").build()) + .handler(context -> { + Player player = context.sender(); + Block block; + if (context.flags().hasFlag("this")) { + Location location = player.getLocation(); + block = location.getBlock(); + } else { + block = player.getTargetBlockExact(10); + if (block == null) return; + } + String bData = block.getBlockData().getAsString(); + Object blockState = BlockStateUtils.blockDataToBlockState(block.getBlockData()); + Sender sender = plugin().senderFactory().wrap(context.sender()); + sender.sendMessage(Component.text(bData)); + int id = BlockStateUtils.blockStateToId(blockState); + + Object holder = BukkitBlockManager.instance().getMinecraftBlockHolder(id); + if (holder != null) { + ImmutableBlockState immutableBlockState = BukkitBlockManager.instance().getImmutableBlockState(id); + if (immutableBlockState != null) { + sender.sendMessage(Component.text(immutableBlockState.toString())); + } + try { + @SuppressWarnings("unchecked") + Set tags = (Set) Reflections.field$Holder$Reference$tags.get(holder); + if (!tags.isEmpty()) { + sender.sendMessage(Component.text("tags: ")); + for (Object tag : tags) { + sender.sendMessage(Component.text(" - " + Reflections.field$TagKey$location.get(tag).toString())); + } + } + } catch (ReflectiveOperationException e) { + plugin().logger().warn("Could not get tags", e); + } + } + }); + } + + @Override + public String getFeatureID() { + return "debug_target_block"; + } +} diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/command/feature/GetItemCommand.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/command/feature/GetItemCommand.java new file mode 100644 index 000000000..598167971 --- /dev/null +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/command/feature/GetItemCommand.java @@ -0,0 +1,77 @@ +package net.momirealms.craftengine.bukkit.plugin.command.feature; + +import net.kyori.adventure.text.Component; +import net.momirealms.craftengine.bukkit.plugin.command.BukkitCommandFeature; +import net.momirealms.craftengine.bukkit.util.PlayerUtils; +import net.momirealms.craftengine.core.plugin.CraftEngine; +import net.momirealms.craftengine.core.plugin.command.CraftEngineCommandManager; +import net.momirealms.craftengine.core.plugin.command.FlagKeys; +import net.momirealms.craftengine.core.plugin.locale.MessageConstants; +import net.momirealms.craftengine.core.util.Key; +import org.bukkit.NamespacedKey; +import org.bukkit.command.CommandSender; +import org.bukkit.entity.Player; +import org.bukkit.inventory.ItemStack; +import org.checkerframework.checker.nullness.qual.NonNull; +import org.incendo.cloud.Command; +import org.incendo.cloud.bukkit.parser.NamespacedKeyParser; +import org.incendo.cloud.context.CommandContext; +import org.incendo.cloud.context.CommandInput; +import org.incendo.cloud.parser.standard.IntegerParser; +import org.incendo.cloud.suggestion.Suggestion; +import org.incendo.cloud.suggestion.SuggestionProvider; + +import java.util.concurrent.CompletableFuture; + +public class GetItemCommand extends BukkitCommandFeature { + + public GetItemCommand(CraftEngineCommandManager commandManager, CraftEngine plugin) { + super(commandManager, plugin); + } + + @Override + public Command.Builder assembleCommand(org.incendo.cloud.CommandManager manager, Command.Builder builder) { + return builder + .senderType(Player.class) + .flag(FlagKeys.SILENT_FLAG) + .flag(FlagKeys.TO_INVENTORY_FLAG) + .required("id", NamespacedKeyParser.namespacedKeyComponent().suggestionProvider(new SuggestionProvider<>() { + @Override + public @NonNull CompletableFuture> suggestionsFuture(@NonNull CommandContext context, @NonNull CommandInput input) { + return CompletableFuture.completedFuture(plugin().itemManager().cachedSuggestions()); + } + })) + .optional("amount", IntegerParser.integerParser(1, 6400)) + .handler(context -> { + Player player = context.sender(); + int amount = context.getOrDefault("amount", 1); + boolean toInv = context.flags().hasFlag(FlagKeys.TO_INVENTORY); + NamespacedKey namespacedKey = context.get("id"); + Key key = Key.of(namespacedKey.namespace(), namespacedKey.value()); + ItemStack builtItem = plugin().itemManager().buildCustomItemStack(key, plugin().adapt(context.sender())); + if (builtItem == null) { + handleFeedback(context, MessageConstants.COMMAND_ITEM_GET_FAILURE_NOT_EXIST, Component.text(key.toString())); + return; + } + int amountToGive = amount; + int maxStack = builtItem.getMaxStackSize(); + while (amountToGive > 0) { + int perStackSize = Math.min(maxStack, amountToGive); + amountToGive -= perStackSize; + ItemStack more = builtItem.clone(); + more.setAmount(perStackSize); + if (toInv) { + PlayerUtils.putItemsToInventory(player.getInventory(), more, more.getAmount()); + } else { + PlayerUtils.dropItem(player, more, false, true, false); + } + } + handleFeedback(context, MessageConstants.COMMAND_ITEM_GET_SUCCESS, Component.text(amount), Component.text(key.toString())); + }); + } + + @Override + public String getFeatureID() { + return "get_item"; + } +} diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/command/feature/GiveItemCommand.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/command/feature/GiveItemCommand.java new file mode 100644 index 000000000..fd056399e --- /dev/null +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/command/feature/GiveItemCommand.java @@ -0,0 +1,95 @@ +package net.momirealms.craftengine.bukkit.plugin.command.feature; + +import net.kyori.adventure.text.Component; +import net.momirealms.craftengine.bukkit.item.BukkitItemManager; +import net.momirealms.craftengine.bukkit.plugin.command.BukkitCommandFeature; +import net.momirealms.craftengine.bukkit.util.PlayerUtils; +import net.momirealms.craftengine.core.item.CustomItem; +import net.momirealms.craftengine.core.plugin.CraftEngine; +import net.momirealms.craftengine.core.plugin.command.CraftEngineCommandManager; +import net.momirealms.craftengine.core.plugin.command.FlagKeys; +import net.momirealms.craftengine.core.plugin.locale.MessageConstants; +import net.momirealms.craftengine.core.util.Key; +import org.bukkit.NamespacedKey; +import org.bukkit.command.CommandSender; +import org.bukkit.entity.Player; +import org.bukkit.inventory.ItemStack; +import org.checkerframework.checker.nullness.qual.NonNull; +import org.incendo.cloud.Command; +import org.incendo.cloud.bukkit.data.MultiplePlayerSelector; +import org.incendo.cloud.bukkit.parser.NamespacedKeyParser; +import org.incendo.cloud.bukkit.parser.selector.MultiplePlayerSelectorParser; +import org.incendo.cloud.context.CommandContext; +import org.incendo.cloud.context.CommandInput; +import org.incendo.cloud.parser.standard.IntegerParser; +import org.incendo.cloud.suggestion.Suggestion; +import org.incendo.cloud.suggestion.SuggestionProvider; + +import java.util.Collection; +import java.util.Optional; +import java.util.concurrent.CompletableFuture; + +public class GiveItemCommand extends BukkitCommandFeature { + + public GiveItemCommand(CraftEngineCommandManager commandManager, CraftEngine plugin) { + super(commandManager, plugin); + } + + @Override + public Command.Builder assembleCommand(org.incendo.cloud.CommandManager manager, Command.Builder builder) { + return builder + .flag(FlagKeys.SILENT_FLAG) + .flag(FlagKeys.TO_INVENTORY_FLAG) + .required("player", MultiplePlayerSelectorParser.multiplePlayerSelectorParser(true)) + .required("id", NamespacedKeyParser.namespacedKeyComponent().suggestionProvider(new SuggestionProvider<>() { + @Override + public @NonNull CompletableFuture> suggestionsFuture(@NonNull CommandContext context, @NonNull CommandInput input) { + return CompletableFuture.completedFuture(plugin().itemManager().cachedSuggestions()); + } + })) + .optional("amount", IntegerParser.integerParser(1, 6400)) + .handler(context -> { + MultiplePlayerSelector selector = context.get("player"); + int amount = context.getOrDefault("amount", 1); + boolean toInv = context.flags().hasFlag(FlagKeys.TO_INVENTORY); + NamespacedKey namespacedKey = context.get("id"); + Key key = Key.of(namespacedKey.namespace(), namespacedKey.value()); + Optional> optionalItem = BukkitItemManager.instance().getCustomItem(key); + if (optionalItem.isEmpty()) { + handleFeedback(context, MessageConstants.COMMAND_ITEM_GIVE_FAILURE_NOT_EXIST, Component.text(key.toString())); + return; + } + + Collection players = selector.values(); + for (Player player : players) { + ItemStack builtItem = optionalItem.get().buildItemStack(plugin().adapt(player)); + if (builtItem == null) { + return; + } + int amountToGive = amount; + int maxStack = builtItem.getMaxStackSize(); + while (amountToGive > 0) { + int perStackSize = Math.min(maxStack, amountToGive); + amountToGive -= perStackSize; + ItemStack more = builtItem.clone(); + more.setAmount(perStackSize); + if (toInv) { + PlayerUtils.putItemsToInventory(player.getInventory(), more, more.getAmount()); + } else { + PlayerUtils.dropItem(player, more, false, true, false); + } + } + } + if (players.size() == 1) { + handleFeedback(context, MessageConstants.COMMAND_ITEM_GIVE_SUCCESS_SINGLE, Component.text(amount), Component.text(key.toString()), Component.text(players.iterator().next().getName())); + } else if (players.size() > 1) { + handleFeedback(context, MessageConstants.COMMAND_ITEM_GIVE_SUCCESS_MULTIPLE, Component.text(amount), Component.text(key.toString()), Component.text(players.size())); + } + }); + } + + @Override + public String getFeatureID() { + return "give_item"; + } +} diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/command/feature/ItemBrowserCommand.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/command/feature/ItemBrowserCommand.java new file mode 100644 index 000000000..09c2e745d --- /dev/null +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/command/feature/ItemBrowserCommand.java @@ -0,0 +1,32 @@ +package net.momirealms.craftengine.bukkit.plugin.command.feature; + +import net.momirealms.craftengine.bukkit.plugin.command.BukkitCommandFeature; +import net.momirealms.craftengine.bukkit.plugin.user.BukkitServerPlayer; +import net.momirealms.craftengine.core.plugin.CraftEngine; +import net.momirealms.craftengine.core.plugin.command.CraftEngineCommandManager; +import org.bukkit.command.CommandSender; +import org.bukkit.entity.Player; +import org.incendo.cloud.Command; + +public class ItemBrowserCommand extends BukkitCommandFeature { + + public ItemBrowserCommand(CraftEngineCommandManager commandManager, CraftEngine plugin) { + super(commandManager, plugin); + } + + @Override + public Command.Builder assembleCommand(org.incendo.cloud.CommandManager manager, Command.Builder builder) { + return builder + .senderType(Player.class) + .handler(context -> { + Player player = context.sender(); + BukkitServerPlayer serverPlayer = plugin().adapt(player); + plugin().itemBrowserManager().open(serverPlayer); + }); + } + + @Override + public String getFeatureID() { + return "item_browser"; + } +} diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/command/feature/ReloadCommand.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/command/feature/ReloadCommand.java new file mode 100644 index 000000000..cab37225a --- /dev/null +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/command/feature/ReloadCommand.java @@ -0,0 +1,91 @@ +package net.momirealms.craftengine.bukkit.plugin.command.feature; + +import net.kyori.adventure.text.Component; +import net.momirealms.craftengine.bukkit.plugin.command.BukkitCommandFeature; +import net.momirealms.craftengine.core.plugin.CraftEngine; +import net.momirealms.craftengine.core.plugin.command.CraftEngineCommandManager; +import net.momirealms.craftengine.core.plugin.locale.MessageConstants; +import org.bukkit.command.CommandSender; +import org.incendo.cloud.Command; +import org.incendo.cloud.parser.standard.EnumParser; + +import java.util.Optional; + +public class ReloadCommand extends BukkitCommandFeature { + public static boolean RELOAD_PACK_FLAG = false; + + public ReloadCommand(CraftEngineCommandManager commandManager, CraftEngine plugin) { + super(commandManager, plugin); + } + + @Override + public Command.Builder assembleCommand(org.incendo.cloud.CommandManager manager, Command.Builder builder) { + return builder + .flag(manager.flagBuilder("silent").withAliases("s")) + .optional("content", EnumParser.enumParser(ReloadArgument.class)) + .handler(context -> { + if (plugin().isReloading()) { + handleFeedback(context, MessageConstants.COMMAND_RELOAD_FAILURE_IS_LOADING); + return; + } + Optional optional = context.optional("content"); + ReloadArgument argument = ReloadArgument.CONFIG; + if (optional.isPresent()) { + argument = optional.get(); + } + if (argument == ReloadArgument.CONFIG) { + try { + RELOAD_PACK_FLAG = true; + long time1 = System.currentTimeMillis(); + plugin().reload(); + long time2 = System.currentTimeMillis(); + handleFeedback(context, MessageConstants.COMMAND_RELOAD_CONFIG_SUCCESS, Component.text(time2 - time1)); + } catch (Exception e) { + handleFeedback(context, MessageConstants.COMMAND_RELOAD_CONFIG_FAILURE); + plugin().logger().warn("Failed to reload config", e); + } + } else if (argument == ReloadArgument.PACK) { + plugin().scheduler().executeAsync(() -> { + try { + long time1 = System.currentTimeMillis(); + plugin().packManager().generateResourcePack(); + long time2 = System.currentTimeMillis(); + handleFeedback(context, MessageConstants.COMMAND_RELOAD_PACK_SUCCESS, Component.text(time2 - time1)); + } catch (Exception e) { + handleFeedback(context, MessageConstants.COMMAND_RELOAD_PACK_FAILURE); + plugin().logger().warn("Failed to generate resource pack", e); + } + }); + } else if (argument == ReloadArgument.ALL) { + long time1 = System.currentTimeMillis(); + try { + plugin().reload(); + plugin().scheduler().executeAsync(() -> { + try { + plugin().packManager().generateResourcePack(); + long time2 = System.currentTimeMillis(); + handleFeedback(context, MessageConstants.COMMAND_RELOAD_ALL_SUCCESS, Component.text(time2 - time1)); + } catch (Exception e) { + handleFeedback(context, MessageConstants.COMMAND_RELOAD_ALL_FAILURE); + plugin().logger().warn("Failed to generate resource pack", e); + } + }); + } catch (Exception e) { + handleFeedback(context, MessageConstants.COMMAND_RELOAD_ALL_FAILURE); + plugin().logger().warn("Failed to reload config", e); + } + } + }); + } + + @Override + public String getFeatureID() { + return "reload"; + } + + public enum ReloadArgument { + CONFIG, + PACK, + ALL + } +} diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/command/feature/TestCommand.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/command/feature/TestCommand.java new file mode 100644 index 000000000..0aa002af8 --- /dev/null +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/command/feature/TestCommand.java @@ -0,0 +1,34 @@ +package net.momirealms.craftengine.bukkit.plugin.command.feature; + +import net.momirealms.craftengine.bukkit.plugin.command.BukkitCommandFeature; +import net.momirealms.craftengine.core.plugin.CraftEngine; +import net.momirealms.craftengine.core.plugin.command.CraftEngineCommandManager; +import net.momirealms.craftengine.core.registry.Holder; +import net.momirealms.craftengine.core.util.Key; +import org.bukkit.command.CommandSender; +import org.incendo.cloud.Command; + +import java.util.List; + +public class TestCommand extends BukkitCommandFeature { + + public TestCommand(CraftEngineCommandManager commandManager, CraftEngine plugin) { + super(commandManager, plugin); + } + + @Override + public Command.Builder assembleCommand(org.incendo.cloud.CommandManager manager, Command.Builder builder) { + return builder + .handler(context -> { + List> holders = plugin().itemManager().tagToItems(Key.of("minecraft:planks")); + for (Holder holder : holders) { + context.sender().sendMessage(holder.registeredName()); + } + }); + } + + @Override + public String getFeatureID() { + return "debug_test"; + } +} diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/gui/BukkitClick.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/gui/BukkitClick.java new file mode 100644 index 000000000..f301d2a91 --- /dev/null +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/gui/BukkitClick.java @@ -0,0 +1,81 @@ +package net.momirealms.craftengine.bukkit.plugin.gui; + +import net.momirealms.craftengine.bukkit.item.BukkitItemManager; +import net.momirealms.craftengine.bukkit.plugin.BukkitCraftEngine; +import net.momirealms.craftengine.bukkit.util.ItemUtils; +import net.momirealms.craftengine.core.entity.player.Player; +import net.momirealms.craftengine.core.item.Item; +import net.momirealms.craftengine.core.plugin.gui.Click; +import net.momirealms.craftengine.core.plugin.gui.Gui; +import net.momirealms.craftengine.core.plugin.gui.Inventory; +import org.bukkit.event.inventory.InventoryClickEvent; +import org.bukkit.inventory.ItemStack; + +public class BukkitClick implements Click { + private final InventoryClickEvent event; + private final Inventory inventory; + private final Gui gui; + + public BukkitClick(InventoryClickEvent event, Gui gui, Inventory inventory) { + this.event = event; + this.inventory = inventory; + this.gui = gui; + } + + @Override + public Gui gui() { + return this.gui; + } + + @Override + public Inventory clickedInventory() { + return this.inventory; + } + + @Override + public int slot() { + return this.event.getSlot(); + } + + @Override + public void cancel() { + this.event.setCancelled(true); + } + + @Override + public boolean isCancelled() { + return this.event.isCancelled(); + } + + @Override + public String type() { + return this.event.getClick().name(); + } + + @Override + public int hotBarKey() { + return this.event.getHotbarButton(); + } + + @Override + public Player clicker() { + return BukkitCraftEngine.instance().adapt((org.bukkit.entity.Player) event.getWhoClicked()); + } + + @SuppressWarnings("deprecation") + @Override + public void setItemOnCursor(Item item) { + this.event.setCursor((ItemStack) item.getItem()); + } + + @Override + public Item itemOnCursor() { + ItemStack itemStack = this.event.getCursor(); + if (ItemUtils.isEmpty(itemStack)) return null; + return BukkitItemManager.instance().wrap(itemStack); + } + + public InventoryClickEvent event() { + return event; + } +} diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/gui/BukkitGuiManager.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/gui/BukkitGuiManager.java new file mode 100644 index 000000000..904de8f1a --- /dev/null +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/gui/BukkitGuiManager.java @@ -0,0 +1,87 @@ +package net.momirealms.craftengine.bukkit.plugin.gui; + +import net.momirealms.craftengine.bukkit.plugin.BukkitCraftEngine; +import net.momirealms.craftengine.bukkit.util.LegacyInventoryUtils; +import net.momirealms.craftengine.core.plugin.gui.AbstractGui; +import net.momirealms.craftengine.core.plugin.gui.Gui; +import net.momirealms.craftengine.core.plugin.gui.GuiManager; +import net.momirealms.craftengine.core.plugin.gui.Inventory; +import net.momirealms.craftengine.core.plugin.scheduler.SchedulerTask; +import net.momirealms.craftengine.core.util.VersionHelper; +import org.bukkit.Bukkit; +import org.bukkit.entity.Player; +import org.bukkit.event.EventHandler; +import org.bukkit.event.EventPriority; +import org.bukkit.event.HandlerList; +import org.bukkit.event.Listener; +import org.bukkit.event.inventory.InventoryClickEvent; +import org.bukkit.event.inventory.InventoryDragEvent; + +public class BukkitGuiManager implements GuiManager, Listener { + private final BukkitCraftEngine plugin; + private SchedulerTask timerTask; + + public BukkitGuiManager(BukkitCraftEngine plugin) { + this.plugin = plugin; + } + + @Override + public void delayedInit() { + Bukkit.getPluginManager().registerEvents(this, plugin.bootstrap()); + this.timerTask = plugin.scheduler().sync().runRepeating(this::timerTask, 20, 20); + } + + @Override + public void disable() { + HandlerList.unregisterAll(this); + if (this.timerTask != null && !this.timerTask.cancelled()) { + this.timerTask.cancel(); + } + } + + public void timerTask() { + for (Player player : Bukkit.getOnlinePlayers()) { + org.bukkit.inventory.Inventory top = !VersionHelper.isVersionNewerThan1_21() ? LegacyInventoryUtils.getTopInventory(player) : player.getOpenInventory().getTopInventory(); + if (top.getHolder() instanceof CraftEngineInventoryHolder holder) { + holder.gui().onTimer(); + } + } + } + + @Override + public Inventory createInventory(Gui gui, int size) { + CraftEngineInventoryHolder holder = new CraftEngineInventoryHolder(gui); + org.bukkit.inventory.Inventory inventory = Bukkit.createInventory(holder, size); + holder.holder().bindValue(inventory); + return new BukkitInventory(inventory); + } + + @EventHandler(ignoreCancelled = true) + public void onInventoryClick(InventoryClickEvent event) { + org.bukkit.inventory.Inventory inventory = event.getInventory(); + if (!(inventory.getHolder() instanceof CraftEngineInventoryHolder craftEngineInventoryHolder)) { + return; + } + AbstractGui gui = (AbstractGui) craftEngineInventoryHolder.gui(); + Player player = (Player) event.getWhoClicked(); + if (event.getClickedInventory() == player.getInventory()) { + gui.handleInventoryClick(new BukkitClick(event, gui, new BukkitInventory(player.getInventory()))); + } else if (event.getClickedInventory() == inventory) { + gui.handleGuiClick(new BukkitClick(event, gui, new BukkitInventory(inventory))); + } + } + + @EventHandler(ignoreCancelled = true, priority = EventPriority.LOW) + public void onInventoryDrag(InventoryDragEvent event) { + org.bukkit.inventory.Inventory inventory = event.getInventory(); + if (!(inventory.getHolder() instanceof CraftEngineInventoryHolder)) { + return; + } + for (int raw : event.getRawSlots()) { + if (raw < inventory.getSize()) { + event.setCancelled(true); + return; + } + } + } +} diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/gui/BukkitInventory.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/gui/BukkitInventory.java new file mode 100644 index 000000000..d7bb0b932 --- /dev/null +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/gui/BukkitInventory.java @@ -0,0 +1,42 @@ +package net.momirealms.craftengine.bukkit.plugin.gui; + +import net.kyori.adventure.text.Component; +import net.momirealms.craftengine.bukkit.plugin.user.BukkitServerPlayer; +import net.momirealms.craftengine.bukkit.util.ComponentUtils; +import net.momirealms.craftengine.bukkit.util.Reflections; +import net.momirealms.craftengine.core.entity.player.Player; +import net.momirealms.craftengine.core.item.Item; +import net.momirealms.craftengine.core.plugin.CraftEngine; +import net.momirealms.craftengine.core.plugin.gui.Inventory; +import org.bukkit.inventory.ItemStack; + +public class BukkitInventory implements Inventory { + private final org.bukkit.inventory.Inventory inventory; + + public BukkitInventory(org.bukkit.inventory.Inventory inventory) { + this.inventory = inventory; + } + + @Override + public void open(Player player, Component title) { + BukkitServerPlayer serverPlayer = (BukkitServerPlayer) player; + Object nmsPlayer = serverPlayer.serverPlayer(); + try { + Object menuType = Reflections.method$CraftContainer$getNotchInventoryType.invoke(null, inventory); + int nextId = (int) Reflections.method$ServerPlayer$nextContainerCounter.invoke(nmsPlayer); + Object menu = Reflections.constructor$CraftContainer.newInstance(inventory, nmsPlayer, nextId); + Reflections.field$AbstractContainerMenu$checkReachable.set(menu, false); + Object packet = Reflections.constructor$ClientboundOpenScreenPacket.newInstance(nextId, menuType, ComponentUtils.adventureToMinecraft(title)); + serverPlayer.sendPacket(packet, false); + Reflections.field$Player$containerMenu.set(nmsPlayer, menu); + Reflections.method$ServerPlayer$initMenu.invoke(nmsPlayer, menu); + } catch (Exception e) { + CraftEngine.instance().logger().warn("Failed to update inventory title", e); + } + } + + @Override + public void setItem(int index, Item item) { + this.inventory.setItem(index, item == null ? null : (ItemStack) item.getItem()); + } +} diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/gui/CraftEngineInventoryHolder.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/gui/CraftEngineInventoryHolder.java new file mode 100644 index 000000000..90ec28021 --- /dev/null +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/gui/CraftEngineInventoryHolder.java @@ -0,0 +1,34 @@ +package net.momirealms.craftengine.bukkit.plugin.gui; + +import net.momirealms.craftengine.core.plugin.gui.Gui; +import net.momirealms.craftengine.shared.ObjectHolder; +import org.bukkit.inventory.Inventory; +import org.bukkit.inventory.InventoryHolder; +import org.jetbrains.annotations.NotNull; + +public class CraftEngineInventoryHolder implements InventoryHolder { + private final ObjectHolder inventory; + private final Gui gui; + + public CraftEngineInventoryHolder(Gui gui) { + this.inventory = new ObjectHolder<>(); + this.gui = gui; + } + + public ObjectHolder holder() { + return inventory; + } + + public Gui gui() { + return gui; + } + + public Inventory inventory() { + return inventory.value(); + } + + @Override + public @NotNull Inventory getInventory() { + return inventory(); + } +} diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/injector/BukkitInjector.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/injector/BukkitInjector.java new file mode 100644 index 000000000..1dba5c41c --- /dev/null +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/injector/BukkitInjector.java @@ -0,0 +1,831 @@ +package net.momirealms.craftengine.bukkit.plugin.injector; + +import com.mojang.datafixers.util.Pair; +import net.bytebuddy.ByteBuddy; +import net.bytebuddy.ClassFileVersion; +import net.bytebuddy.description.modifier.Visibility; +import net.bytebuddy.dynamic.DynamicType; +import net.bytebuddy.dynamic.scaffold.subclass.ConstructorStrategy; +import net.bytebuddy.implementation.FieldAccessor; +import net.bytebuddy.implementation.FixedValue; +import net.bytebuddy.implementation.MethodDelegation; +import net.bytebuddy.implementation.bind.annotation.*; +import net.bytebuddy.matcher.ElementMatchers; +import net.momirealms.craftengine.bukkit.block.BukkitBlockManager; +import net.momirealms.craftengine.bukkit.block.BukkitBlockShape; +import net.momirealms.craftengine.bukkit.item.BukkitItemManager; +import net.momirealms.craftengine.bukkit.item.recipe.BukkitRecipeManager; +import net.momirealms.craftengine.bukkit.util.BlockStateUtils; +import net.momirealms.craftengine.bukkit.util.NoteBlockChainUpdateUtils; +import net.momirealms.craftengine.bukkit.util.Reflections; +import net.momirealms.craftengine.core.block.BlockKeys; +import net.momirealms.craftengine.core.block.EmptyBlock; +import net.momirealms.craftengine.core.block.ImmutableBlockState; +import net.momirealms.craftengine.core.block.StatePredicate; +import net.momirealms.craftengine.core.item.Item; +import net.momirealms.craftengine.core.item.recipe.CustomCookingRecipe; +import net.momirealms.craftengine.core.item.recipe.OptimizedIDItem; +import net.momirealms.craftengine.core.item.recipe.RecipeTypes; +import net.momirealms.craftengine.core.item.recipe.input.SingleItemInput; +import net.momirealms.craftengine.core.plugin.CraftEngine; +import net.momirealms.craftengine.core.plugin.config.ConfigManager; +import net.momirealms.craftengine.core.registry.BuiltInRegistries; +import net.momirealms.craftengine.core.registry.Holder; +import net.momirealms.craftengine.core.util.Key; +import net.momirealms.craftengine.core.util.ReflectionUtils; +import net.momirealms.craftengine.core.util.SectionPosUtils; +import net.momirealms.craftengine.core.util.VersionHelper; +import net.momirealms.craftengine.core.world.CEWorld; +import net.momirealms.craftengine.core.world.SectionPos; +import net.momirealms.craftengine.core.world.chunk.CESection; +import net.momirealms.craftengine.core.world.chunk.InjectedPalettedContainerHolder; +import net.momirealms.craftengine.shared.ObjectHolder; +import net.momirealms.craftengine.shared.block.*; +import org.bukkit.inventory.ItemStack; +import org.jetbrains.annotations.Nullable; + +import java.lang.invoke.MethodHandle; +import java.lang.invoke.MethodHandles; +import java.lang.invoke.MethodType; +import java.lang.reflect.Constructor; +import java.lang.reflect.Field; +import java.lang.reflect.Method; +import java.util.List; +import java.util.Objects; +import java.util.Optional; +import java.util.Set; +import java.util.concurrent.Callable; + +public class BukkitInjector { + private static final ByteBuddy byteBuddy = new ByteBuddy(ClassFileVersion.JAVA_V17); + private static final BukkitBlockShape STONE_SHAPE = new BukkitBlockShape(Reflections.instance$Blocks$STONE$defaultState); + + private static Class clazz$InjectedPalettedContainer; + private static Field field$InjectedPalettedContainer$target; + private static Field field$InjectedPalettedContainer$section; + private static Field field$InjectedPalettedContainer$world; + private static Field field$InjectedPalettedContainer$pos; + + private static Class clazz$OptimizedItemDisplay; + private static Constructor constructor$OptimizedItemDisplay; + + private static Class clazz$OptimizedItemDisplayFatory; + private static Object instance$OptimizedItemDisplayFactory; + + private static Class clazz$CraftEngineBlock; + private static MethodHandle constructor$CraftEngineBlock; + private static Field field$CraftEngineBlock$behavior; + private static Field field$CraftEngineBlock$shape; + private static Field field$CraftEngineBlock$isNoteBlock; + + private static Class clazz$InjectedCacheChecker; + private static Field field$InjectedCacheChecker$recipeType; + private static Field field$InjectedCacheChecker$lastRecipe; + private static Field field$InjectedCacheChecker$lastCustomRecipe; + + public static void init() { + try { + MethodHandles.Lookup lookup = MethodHandles.lookup(); + + clazz$InjectedCacheChecker = byteBuddy + .subclass(Object.class, ConstructorStrategy.Default.IMITATE_SUPER_CLASS_OPENING) + .implement(Reflections.clazz$RecipeManager$CachedCheck) + .defineField("recipeType", Reflections.clazz$RecipeType, Visibility.PUBLIC) + .defineField("lastRecipe", Object.class, Visibility.PUBLIC) + .defineField("lastCustomRecipe", Key.class, Visibility.PUBLIC) + .method(ElementMatchers.named("getRecipeFor").or(ElementMatchers.named("a"))) + .intercept(MethodDelegation.to( + VersionHelper.isVersionNewerThan1_21_2() ? + GetRecipeForMethodInterceptor1_21_2.INSTANCE : + (VersionHelper.isVersionNewerThan1_21() ? + GetRecipeForMethodInterceptor1_21.INSTANCE : + VersionHelper.isVersionNewerThan1_20_5() ? + GetRecipeForMethodInterceptor1_20_5.INSTANCE : + GetRecipeForMethodInterceptor1_20.INSTANCE) + )) + .make() + .load(BukkitInjector.class.getClassLoader()) + .getLoaded(); + field$InjectedCacheChecker$recipeType = clazz$InjectedCacheChecker.getDeclaredField("recipeType"); + field$InjectedCacheChecker$lastRecipe = clazz$InjectedCacheChecker.getDeclaredField("lastRecipe"); + field$InjectedCacheChecker$lastCustomRecipe = clazz$InjectedCacheChecker.getDeclaredField("lastCustomRecipe"); + + // Paletted Container + clazz$InjectedPalettedContainer = byteBuddy + .subclass(Reflections.clazz$PalettedContainer) + .name("net.minecraft.world.level.chunk.InjectedPalettedContainer") + .implement(InjectedPalettedContainerHolder.class) + .defineField("target", Reflections.clazz$PalettedContainer, Visibility.PRIVATE) + .defineField("cesection", CESection.class, Visibility.PRIVATE) + .defineField("ceworld", CEWorld.class, Visibility.PRIVATE) + .defineField("cepos", SectionPos.class, Visibility.PRIVATE) + .method(ElementMatchers.any() + .and(ElementMatchers.not(ElementMatchers.is(Reflections.method$PalettedContainer$getAndSet))) + .and(ElementMatchers.not(ElementMatchers.isDeclaredBy(Object.class))) + ) + .intercept(MethodDelegation.toField("target")) + .method(ElementMatchers.is(Reflections.method$PalettedContainer$getAndSet)) + .intercept(MethodDelegation.to(GetAndSetInterceptor.INSTANCE)) + .method(ElementMatchers.named("target")) + .intercept(FieldAccessor.ofField("target")) + .method(ElementMatchers.named("ceSection")) + .intercept(FieldAccessor.ofField("cesection")) + .method(ElementMatchers.named("ceWorld")) + .intercept(FieldAccessor.ofField("ceworld")) + .method(ElementMatchers.named("cePos")) + .intercept(FieldAccessor.ofField("cepos")) + .make() + .load(BukkitInjector.class.getClassLoader()) + .getLoaded(); + field$InjectedPalettedContainer$target = ReflectionUtils.getDeclaredField(clazz$InjectedPalettedContainer, "target"); + field$InjectedPalettedContainer$section = ReflectionUtils.getDeclaredField(clazz$InjectedPalettedContainer, "cesection"); + field$InjectedPalettedContainer$world = ReflectionUtils.getDeclaredField(clazz$InjectedPalettedContainer, "ceworld"); + field$InjectedPalettedContainer$pos = ReflectionUtils.getDeclaredField(clazz$InjectedPalettedContainer, "cepos"); + // State Predicate + DynamicType.Unloaded alwaysTrue = byteBuddy + .subclass(Reflections.clazz$StatePredicate) + .method(ElementMatchers.named("test")) + .intercept(FixedValue.value(true)) + .make(); + Class alwaysTrueClass = alwaysTrue.load(BukkitInjector.class.getClassLoader()).getLoaded(); + DynamicType.Unloaded alwaysFalse = byteBuddy + .subclass(Reflections.clazz$StatePredicate) + .method(ElementMatchers.named("test")) + .intercept(FixedValue.value(false)) + .make(); + Class alwaysFalseClass = alwaysFalse.load(BukkitInjector.class.getClassLoader()).getLoaded(); + StatePredicate.init(alwaysTrueClass.getDeclaredConstructor().newInstance(), alwaysFalseClass.getDeclaredConstructor().newInstance()); + // Optimized Item Display + clazz$OptimizedItemDisplay = byteBuddy + .subclass(Reflections.clazz$Display$ItemDisplay, ConstructorStrategy.Default.IMITATE_SUPER_CLASS_OPENING) + .name("net.minecraft.world.entity.OptimizedItemDisplay") + .make() + .load(BukkitInjector.class.getClassLoader()) + .getLoaded(); + constructor$OptimizedItemDisplay = ReflectionUtils.getConstructor(clazz$OptimizedItemDisplay, Reflections.clazz$EntityType, Reflections.clazz$Level); + clazz$OptimizedItemDisplayFatory = byteBuddy + .subclass(Object.class, ConstructorStrategy.Default.IMITATE_SUPER_CLASS_OPENING) + .name("net.momirealms.craftengine.bukkit.entity.OptimizedItemDisplayFactory") + .implement(Reflections.clazz$EntityType$EntityFactory) + .method(ElementMatchers.named("create")) + .intercept(MethodDelegation.to(OptimizedItemDisplayMethodInterceptor.INSTANCE)) + .make() + .load(BukkitInjector.class.getClassLoader()) + .getLoaded(); + instance$OptimizedItemDisplayFactory = Objects.requireNonNull(ReflectionUtils.getConstructor(clazz$OptimizedItemDisplayFatory, 0)).newInstance(); + + String packageWithName = BukkitInjector.class.getName(); + String generatedClassName = packageWithName.substring(0, packageWithName.lastIndexOf('.')) + ".CraftEngineBlock"; + DynamicType.Builder builder = byteBuddy + .subclass(Reflections.clazz$Block, ConstructorStrategy.Default.IMITATE_SUPER_CLASS_OPENING) + .name(generatedClassName) + .defineField("behaviorHolder", ObjectHolder.class, Visibility.PUBLIC) + .defineField("shapeHolder", ObjectHolder.class, Visibility.PUBLIC) + .defineField("isClientSideNoteBlock", boolean.class, Visibility.PUBLIC) + // should always implement this interface + .implement(Reflections.clazz$Fallable) + .implement(Reflections.clazz$BonemealableBlock) + // internal interfaces + .implement(BehaviorHolder.class) + .implement(ShapeHolder.class) + .implement(NoteBlockIndicator.class) + .method(ElementMatchers.named("getBehaviorHolder")) + .intercept(FieldAccessor.ofField("behaviorHolder")) + .method(ElementMatchers.named("getShapeHolder")) + .intercept(FieldAccessor.ofField("shapeHolder")) + .method(ElementMatchers.named("isNoteBlock")) + .intercept(FieldAccessor.ofField("isClientSideNoteBlock")) + // getShape + .method(ElementMatchers.is(Reflections.method$BlockBehaviour$getShape)) + .intercept(MethodDelegation.to(GetShapeInterceptor.INSTANCE)) + // tick + .method(ElementMatchers.is(Reflections.method$BlockBehaviour$tick)) + .intercept(MethodDelegation.to(TickInterceptor.INSTANCE)) + // isValidBoneMealTarget + .method(ElementMatchers.is(Reflections.method$BonemealableBlock$isValidBonemealTarget)) + .intercept(MethodDelegation.to(IsValidBoneMealTargetInterceptor.INSTANCE)) + // isBoneMealSuccess + .method(ElementMatchers.is(Reflections.method$BonemealableBlock$isBonemealSuccess)) + .intercept(MethodDelegation.to(IsBoneMealSuccessInterceptor.INSTANCE)) + // performBoneMeal + .method(ElementMatchers.is(Reflections.method$BonemealableBlock$performBonemeal)) + .intercept(MethodDelegation.to(PerformBoneMealInterceptor.INSTANCE)) + // random tick + .method(ElementMatchers.is(Reflections.method$BlockBehaviour$randomTick)) + .intercept(MethodDelegation.to(RandomTickInterceptor.INSTANCE)) + // onPlace + .method(ElementMatchers.takesArguments(5) + .and(ElementMatchers.takesArgument(0, Reflections.clazz$BlockState)) + .and(ElementMatchers.takesArgument(1, Reflections.clazz$Level)) + .and(ElementMatchers.takesArgument(2, Reflections.clazz$BlockPos)) + .and(ElementMatchers.takesArgument(3, Reflections.clazz$BlockState)) + .and(ElementMatchers.takesArgument(4, boolean.class)) + .and(ElementMatchers.named("onPlace").or(ElementMatchers.named("a"))) + ) + .intercept(MethodDelegation.to(OnPlaceInterceptor.INSTANCE)) + // onBrokenAfterFall + .method(ElementMatchers.takesArguments(3) + .and(ElementMatchers.takesArgument(0, Reflections.clazz$Level)) + .and(ElementMatchers.takesArgument(1, Reflections.clazz$BlockPos)) + .and(ElementMatchers.takesArgument(2, Reflections.clazz$FallingBlockEntity)) + ) + .intercept(MethodDelegation.to(OnBrokenAfterFallInterceptor.INSTANCE)) + // canSurvive + .method(ElementMatchers.takesArguments(3) + .and(ElementMatchers.takesArgument(0, Reflections.clazz$BlockState)) + .and(ElementMatchers.takesArgument(1, Reflections.clazz$LevelReader)) + .and(ElementMatchers.takesArgument(2, Reflections.clazz$BlockPos)) + ) + .intercept(MethodDelegation.to(CanSurviveInterceptor.INSTANCE)) + // updateShape + .method(ElementMatchers.returns(Reflections.clazz$BlockState) + .and(ElementMatchers.takesArgument(0, Reflections.clazz$BlockState)) + // LevelReader 1.21.3+ // 1.20-1.12.2 + .and(ElementMatchers.takesArgument(1, Reflections.clazz$LevelReader).or(ElementMatchers.takesArgument(1, Reflections.clazz$Direction))) + .and(ElementMatchers.named("updateShape").or(ElementMatchers.named("a")))) + .intercept(MethodDelegation.to(UpdateShapeInterceptor.INSTANCE)) + // getFluidState + .method(ElementMatchers.returns(Reflections.clazz$FluidState) + .and(ElementMatchers.takesArgument(0, Reflections.clazz$BlockState))) + .intercept(MethodDelegation.to(FluidStateInterceptor.INSTANCE)); + clazz$CraftEngineBlock = builder.make().load(BukkitInjector.class.getClassLoader()).getLoaded(); + + constructor$CraftEngineBlock = MethodHandles.publicLookup().in(clazz$CraftEngineBlock) + .findConstructor(clazz$CraftEngineBlock, MethodType.methodType(void.class, Reflections.clazz$BlockBehaviour$Properties)) + .asType(MethodType.methodType(Reflections.clazz$Block, Reflections.clazz$BlockBehaviour$Properties)); + + field$CraftEngineBlock$behavior = clazz$CraftEngineBlock.getField("behaviorHolder"); + field$CraftEngineBlock$shape = clazz$CraftEngineBlock.getField("shapeHolder"); + field$CraftEngineBlock$isNoteBlock = clazz$CraftEngineBlock.getField("isClientSideNoteBlock"); + } catch (Throwable e) { + CraftEngine.instance().logger().severe("Failed to init injector", e); + } + } + + public static void injectCookingBlockEntity(Object entity) throws ReflectiveOperationException { + if (Reflections.clazz$AbstractFurnaceBlockEntity.isInstance(entity)) { + Object quickCheck = Reflections.field$AbstractFurnaceBlockEntity$quickCheck.get(entity); + if (clazz$InjectedCacheChecker.isInstance(quickCheck)) return; // already injected + Object recipeType = Reflections.field$AbstractFurnaceBlockEntity$recipeType.get(entity); + Object injectedChecker = Reflections.UNSAFE.allocateInstance(clazz$InjectedCacheChecker); + field$InjectedCacheChecker$recipeType.set(injectedChecker, recipeType); + Reflections.field$AbstractFurnaceBlockEntity$quickCheck.set(entity, injectedChecker); + } else if (!VersionHelper.isVersionNewerThan1_21_2() && Reflections.clazz$CampfireBlockEntity.isInstance(entity)) { + Object quickCheck = Reflections.field$CampfireBlockEntity$quickCheck.get(entity); + if (clazz$InjectedCacheChecker.isInstance(quickCheck)) return; // already injected + Object injectedChecker = Reflections.UNSAFE.allocateInstance(clazz$InjectedCacheChecker); + field$InjectedCacheChecker$recipeType.set(injectedChecker, Reflections.instance$RecipeType$CAMPFIRE_COOKING); + Reflections.field$CampfireBlockEntity$quickCheck.set(entity, injectedChecker); + } + } + + public static Object getOptimizedItemDisplayFactory() { + return instance$OptimizedItemDisplayFactory; + } + + public static class OptimizedItemDisplayMethodInterceptor { + public static final OptimizedItemDisplayMethodInterceptor INSTANCE = new OptimizedItemDisplayMethodInterceptor(); + + @RuntimeType + public Object intercept(@AllArguments Object[] args) throws Exception { + return constructor$OptimizedItemDisplay.newInstance(args[0], args[1]); + } + } + + public static void injectLevelChunkSection(Object targetSection, CESection ceSection, CEWorld ceWorld, SectionPos pos) { + try { + Object container = Reflections.field$LevelChunkSection$states.get(targetSection); + if (!clazz$InjectedPalettedContainer.isInstance(container)) { + Object injectedObject = Reflections.UNSAFE.allocateInstance(clazz$InjectedPalettedContainer); + field$InjectedPalettedContainer$target.set(injectedObject, container); + field$InjectedPalettedContainer$section.set(injectedObject, ceSection); + field$InjectedPalettedContainer$world.set(injectedObject, ceWorld); + field$InjectedPalettedContainer$pos.set(injectedObject, pos); + Reflections.field$PalettedContainer$data.set(injectedObject, Reflections.field$PalettedContainer$data.get(container)); + Reflections.field$LevelChunkSection$states.set(targetSection, injectedObject); + } + } catch (Exception e) { + CraftEngine.instance().logger().severe("Failed to inject chunk section", e); + } + } + + public static void uninjectLevelChunkSection(Object section) { + try { + Object states = Reflections.field$LevelChunkSection$states.get(section); + if (clazz$InjectedPalettedContainer.isInstance(states)) { + Reflections.field$LevelChunkSection$states.set(section, field$InjectedPalettedContainer$target.get(states)); + } + } catch (Exception e) { + CraftEngine.instance().logger().severe("Failed to inject chunk section", e); + } + } + + public static class GetRecipeForMethodInterceptor1_20 { + public static final GetRecipeForMethodInterceptor1_20 INSTANCE = new GetRecipeForMethodInterceptor1_20(); + + @SuppressWarnings("unchecked") + @RuntimeType + public Object intercept(@This Object thisObj, @AllArguments Object[] args) throws Exception { + Object mcRecipeManager = BukkitRecipeManager.minecraftRecipeManager(); + Object type = field$InjectedCacheChecker$recipeType.get(thisObj); + Object lastRecipe = field$InjectedCacheChecker$lastRecipe.get(thisObj); + Optional> optionalRecipe = (Optional>) Reflections.method$RecipeManager$getRecipeFor0.invoke(mcRecipeManager, type, args[0], args[1], lastRecipe); + if (optionalRecipe.isPresent()) { + Pair pair = optionalRecipe.get(); + Object resourceLocation = pair.getFirst(); + Key recipeId = Key.of(resourceLocation.toString()); + BukkitRecipeManager recipeManager = BukkitRecipeManager.instance(); + + ItemStack itemStack; + List items; + if (type == Reflections.instance$RecipeType$CAMPFIRE_COOKING) { + items = (List) Reflections.field$SimpleContainer$items.get(args[0]); + } else { + items = (List) Reflections.field$AbstractFurnaceBlockEntity$items.get(args[0]); + } + itemStack = (ItemStack) Reflections.method$CraftItemStack$asCraftMirror.invoke(null, items.get(0)); + + // it's a recipe from other plugins + boolean isCustom = recipeManager.isCustomRecipe(recipeId); + if (!isCustom) { + field$InjectedCacheChecker$lastRecipe.set(thisObj, resourceLocation); + return optionalRecipe; + } + + Item wrappedItem = BukkitItemManager.instance().wrap(itemStack); + Optional> idHolder = BuiltInRegistries.OPTIMIZED_ITEM_ID.get(wrappedItem.id()); + if (idHolder.isEmpty()) { + return Optional.empty(); + } + + SingleItemInput input = new SingleItemInput<>(new OptimizedIDItem<>(idHolder.get(), itemStack)); + CustomCookingRecipe ceRecipe; + Key lastCustomRecipe = (Key) field$InjectedCacheChecker$lastCustomRecipe.get(thisObj); + if (type == Reflections.instance$RecipeType$SMELTING) { + ceRecipe = (CustomCookingRecipe) recipeManager.getRecipe(RecipeTypes.SMELTING, input, lastCustomRecipe); + } else if (type == Reflections.instance$RecipeType$BLASTING) { + ceRecipe = (CustomCookingRecipe) recipeManager.getRecipe(RecipeTypes.BLASTING, input, lastCustomRecipe); + } else if (type == Reflections.instance$RecipeType$SMOKING) { + ceRecipe = (CustomCookingRecipe) recipeManager.getRecipe(RecipeTypes.SMOKING, input, lastCustomRecipe); + } else if (type == Reflections.instance$RecipeType$CAMPFIRE_COOKING) { + ceRecipe = (CustomCookingRecipe) recipeManager.getRecipe(RecipeTypes.CAMPFIRE_COOKING, input, lastCustomRecipe); + } else { + return Optional.empty(); + } + if (ceRecipe == null) { + return Optional.empty(); + } + + // Cache recipes, it might be incorrect on reloading + field$InjectedCacheChecker$lastCustomRecipe.set(thisObj, ceRecipe.id()); + // It doesn't matter at all + field$InjectedCacheChecker$lastRecipe.set(thisObj, resourceLocation); + return Optional.of(Optional.ofNullable(recipeManager.getRecipeHolderByRecipe(ceRecipe)).orElse(pair.getSecond())); + } else { + return Optional.empty(); + } + } + } + + public static class GetRecipeForMethodInterceptor1_20_5 { + public static final GetRecipeForMethodInterceptor1_20_5 INSTANCE = new GetRecipeForMethodInterceptor1_20_5(); + + @SuppressWarnings("unchecked") + @RuntimeType + public Object intercept(@This Object thisObj, @AllArguments Object[] args) throws Exception { + Object mcRecipeManager = BukkitRecipeManager.minecraftRecipeManager(); + Object type = field$InjectedCacheChecker$recipeType.get(thisObj); + Object lastRecipe = field$InjectedCacheChecker$lastRecipe.get(thisObj); + Optional optionalRecipe = (Optional) Reflections.method$RecipeManager$getRecipeFor0.invoke(mcRecipeManager, type, args[0], args[1], lastRecipe); + if (optionalRecipe.isPresent()) { + Object holder = optionalRecipe.get(); + Object id = Reflections.field$RecipeHolder$id.get(holder); + Key recipeId = Key.of(id.toString()); + BukkitRecipeManager recipeManager = BukkitRecipeManager.instance(); + + ItemStack itemStack; + List items; + if (type == Reflections.instance$RecipeType$CAMPFIRE_COOKING) { + items = (List) Reflections.field$SimpleContainer$items.get(args[0]); + } else { + items = (List) Reflections.field$AbstractFurnaceBlockEntity$items.get(args[0]); + } + itemStack = (ItemStack) Reflections.method$CraftItemStack$asCraftMirror.invoke(null, items.get(0)); + + // it's a recipe from other plugins + boolean isCustom = recipeManager.isCustomRecipe(recipeId); + if (!isCustom) { + field$InjectedCacheChecker$lastRecipe.set(thisObj, id); + return optionalRecipe; + } + + Item wrappedItem = BukkitItemManager.instance().wrap(itemStack); + Optional> idHolder = BuiltInRegistries.OPTIMIZED_ITEM_ID.get(wrappedItem.id()); + if (idHolder.isEmpty()) { + return Optional.empty(); + } + + SingleItemInput input = new SingleItemInput<>(new OptimizedIDItem<>(idHolder.get(), itemStack)); + CustomCookingRecipe ceRecipe; + Key lastCustomRecipe = (Key) field$InjectedCacheChecker$lastCustomRecipe.get(thisObj); + if (type == Reflections.instance$RecipeType$SMELTING) { + ceRecipe = (CustomCookingRecipe) recipeManager.getRecipe(RecipeTypes.SMELTING, input, lastCustomRecipe); + } else if (type == Reflections.instance$RecipeType$BLASTING) { + ceRecipe = (CustomCookingRecipe) recipeManager.getRecipe(RecipeTypes.BLASTING, input, lastCustomRecipe); + } else if (type == Reflections.instance$RecipeType$SMOKING) { + ceRecipe = (CustomCookingRecipe) recipeManager.getRecipe(RecipeTypes.SMOKING, input, lastCustomRecipe); + } else if (type == Reflections.instance$RecipeType$CAMPFIRE_COOKING) { + ceRecipe = (CustomCookingRecipe) recipeManager.getRecipe(RecipeTypes.CAMPFIRE_COOKING, input, lastCustomRecipe); + } else { + return Optional.empty(); + } + if (ceRecipe == null) { + return Optional.empty(); + } + + // Cache recipes, it might be incorrect on reloading + field$InjectedCacheChecker$lastCustomRecipe.set(thisObj, ceRecipe.id()); + // It doesn't matter at all + field$InjectedCacheChecker$lastRecipe.set(thisObj, id); + return Optional.of(Optional.ofNullable(recipeManager.getRecipeHolderByRecipe(ceRecipe)).orElse(holder)); + } else { + return Optional.empty(); + } + } + } + + public static class GetRecipeForMethodInterceptor1_21 { + public static final GetRecipeForMethodInterceptor1_21 INSTANCE = new GetRecipeForMethodInterceptor1_21(); + + @SuppressWarnings("unchecked") + @RuntimeType + public Object intercept(@This Object thisObj, @AllArguments Object[] args) throws Exception { + Object mcRecipeManager = BukkitRecipeManager.minecraftRecipeManager(); + Object type = field$InjectedCacheChecker$recipeType.get(thisObj); + Object lastRecipe = field$InjectedCacheChecker$lastRecipe.get(thisObj); + Optional optionalRecipe = (Optional) Reflections.method$RecipeManager$getRecipeFor0.invoke(mcRecipeManager, type, args[0], args[1], lastRecipe); + if (optionalRecipe.isPresent()) { + Object holder = optionalRecipe.get(); + Object id = Reflections.field$RecipeHolder$id.get(holder); + Key recipeId = Key.of(id.toString()); + BukkitRecipeManager recipeManager = BukkitRecipeManager.instance(); + ItemStack itemStack = (ItemStack) Reflections.method$CraftItemStack$asCraftMirror.invoke(null, Reflections.field$SingleRecipeInput$item.get(args[0])); + + // it's a recipe from other plugins + boolean isCustom = recipeManager.isCustomRecipe(recipeId); + if (!isCustom) { + field$InjectedCacheChecker$lastRecipe.set(thisObj, id); + return optionalRecipe; + } + + Item wrappedItem = BukkitItemManager.instance().wrap(itemStack); + Optional> idHolder = BuiltInRegistries.OPTIMIZED_ITEM_ID.get(wrappedItem.id()); + if (idHolder.isEmpty()) { + return Optional.empty(); + } + + SingleItemInput input = new SingleItemInput<>(new OptimizedIDItem<>(idHolder.get(), itemStack)); + CustomCookingRecipe ceRecipe; + Key lastCustomRecipe = (Key) field$InjectedCacheChecker$lastCustomRecipe.get(thisObj); + if (type == Reflections.instance$RecipeType$SMELTING) { + ceRecipe = (CustomCookingRecipe) recipeManager.getRecipe(RecipeTypes.SMELTING, input, lastCustomRecipe); + } else if (type == Reflections.instance$RecipeType$BLASTING) { + ceRecipe = (CustomCookingRecipe) recipeManager.getRecipe(RecipeTypes.BLASTING, input, lastCustomRecipe); + } else if (type == Reflections.instance$RecipeType$SMOKING) { + ceRecipe = (CustomCookingRecipe) recipeManager.getRecipe(RecipeTypes.SMOKING, input, lastCustomRecipe); + } else if (type == Reflections.instance$RecipeType$CAMPFIRE_COOKING) { + ceRecipe = (CustomCookingRecipe) recipeManager.getRecipe(RecipeTypes.CAMPFIRE_COOKING, input, lastCustomRecipe); + } else { + return Optional.empty(); + } + if (ceRecipe == null) { + return Optional.empty(); + } + + // Cache recipes, it might be incorrect on reloading + field$InjectedCacheChecker$lastCustomRecipe.set(thisObj, ceRecipe.id()); + // It doesn't matter at all + field$InjectedCacheChecker$lastRecipe.set(thisObj, id); + return Optional.of(Optional.ofNullable(recipeManager.getRecipeHolderByRecipe(ceRecipe)).orElse(holder)); + } else { + return Optional.empty(); + } + } + } + + public static class GetRecipeForMethodInterceptor1_21_2 { + public static final GetRecipeForMethodInterceptor1_21_2 INSTANCE = new GetRecipeForMethodInterceptor1_21_2(); + + @SuppressWarnings("unchecked") + @RuntimeType + public Object intercept(@This Object thisObj, @AllArguments Object[] args) throws Exception { + Object mcRecipeManager = BukkitRecipeManager.minecraftRecipeManager(); + Object type = field$InjectedCacheChecker$recipeType.get(thisObj); + Object lastRecipe = field$InjectedCacheChecker$lastRecipe.get(thisObj); + Optional optionalRecipe = (Optional) Reflections.method$RecipeManager$getRecipeFor1.invoke(mcRecipeManager, type, args[0], args[1], lastRecipe); + if (optionalRecipe.isPresent()) { + Object holder = optionalRecipe.get(); + Object id = Reflections.field$RecipeHolder$id.get(holder); + Object resourceLocation = Reflections.field$ResourceKey$location.get(id); + Key recipeId = Key.of(resourceLocation.toString()); + BukkitRecipeManager recipeManager = BukkitRecipeManager.instance(); + ItemStack itemStack = (ItemStack) Reflections.method$CraftItemStack$asCraftMirror.invoke(null, Reflections.field$SingleRecipeInput$item.get(args[0])); + + // it's a recipe from other plugins + boolean isCustom = recipeManager.isCustomRecipe(recipeId); + if (!isCustom) { + field$InjectedCacheChecker$lastRecipe.set(thisObj, id); + return optionalRecipe; + } + + Item wrappedItem = BukkitItemManager.instance().wrap(itemStack); + Optional> idHolder = BuiltInRegistries.OPTIMIZED_ITEM_ID.get(wrappedItem.id()); + if (idHolder.isEmpty()) { + return Optional.empty(); + } + + SingleItemInput input = new SingleItemInput<>(new OptimizedIDItem<>(idHolder.get(), itemStack)); + CustomCookingRecipe ceRecipe; + Key lastCustomRecipe = (Key) field$InjectedCacheChecker$lastCustomRecipe.get(thisObj); + if (type == Reflections.instance$RecipeType$SMELTING) { + ceRecipe = (CustomCookingRecipe) recipeManager.getRecipe(RecipeTypes.SMELTING, input, lastCustomRecipe); + } else if (type == Reflections.instance$RecipeType$BLASTING) { + ceRecipe = (CustomCookingRecipe) recipeManager.getRecipe(RecipeTypes.BLASTING, input, lastCustomRecipe); + } else if (type == Reflections.instance$RecipeType$SMOKING) { + ceRecipe = (CustomCookingRecipe) recipeManager.getRecipe(RecipeTypes.SMOKING, input, lastCustomRecipe); + } else { + return Optional.empty(); + } + if (ceRecipe == null) { + return Optional.empty(); + } + + // Cache recipes, it might be incorrect on reloading + field$InjectedCacheChecker$lastCustomRecipe.set(thisObj, ceRecipe.id()); + // It doesn't matter at all + field$InjectedCacheChecker$lastRecipe.set(thisObj, id); + return Optional.of(Optional.ofNullable(recipeManager.getRecipeHolderByRecipe(ceRecipe)).orElse(holder)); + } else { + return Optional.empty(); + } + } + } + + public static class PalettedContainerMethodInterceptor { + public static final PalettedContainerMethodInterceptor INSTANCE = new PalettedContainerMethodInterceptor(); + + @RuntimeType + public Object intercept(@This Object thisObj, @AllArguments Object[] args, @Origin Method method) throws Throwable { + InjectedPalettedContainerHolder holder = (InjectedPalettedContainerHolder) thisObj; + return method.invoke(holder.target(), args); + } + } + + public static class GetAndSetInterceptor { + public static final GetAndSetInterceptor INSTANCE = new GetAndSetInterceptor(); + + @RuntimeType + public Object intercept(@This Object thisObj, @AllArguments Object[] args, @Origin MethodHandle method) throws Throwable { + InjectedPalettedContainerHolder holder = (InjectedPalettedContainerHolder) thisObj; + Object targetStates = holder.target(); + int x = (int) args[0]; + int y = (int) args[1]; + int z = (int) args[2]; + Object previousState = method.invoke(targetStates, x, y, z, args[3]); + try { + Object newState = args[3]; + int stateId = BlockStateUtils.blockStateToId(newState); + CESection section = holder.ceSection(); + if (BlockStateUtils.isVanillaBlock(stateId)) { + section.setBlockState(x, y, z, EmptyBlock.INSTANCE.getDefaultState()); + if (ConfigManager.enableLightSystem() && ConfigManager.forceUpdateLight()) { + updateLightIfChanged(holder, previousState, newState, null, y, z, x); + } + } else { + ImmutableBlockState immutableBlockState = BukkitBlockManager.instance().getImmutableBlockStateUnsafe(stateId); + section.setBlockState(x, y, z, immutableBlockState); + if (ConfigManager.enableLightSystem()) { + updateLightIfChanged(holder, previousState, newState, immutableBlockState.vanillaBlockState().handle(), y, z, x); + } + } + } catch (Exception e) { + CraftEngine.instance().logger().warn("Failed to intercept setBlockState", e); + } + return previousState; + } + + private void updateLightIfChanged(@This InjectedPalettedContainerHolder thisObj, Object previousBlockState, Object newState, @Nullable Object clientSideNewState, int y, int z, int x) throws ReflectiveOperationException { + int previousLight = BlockStateUtils.getLightEmission(previousBlockState); + int newLight = BlockStateUtils.getLightEmission(newState); + if (previousLight != newLight || (clientSideNewState != null && (BlockStateUtils.isOcclude(newState) != BlockStateUtils.isOcclude(clientSideNewState)))) { + CEWorld world = thisObj.ceWorld(); + SectionPos sectionPos = thisObj.cePos(); + Set posSet = SectionPosUtils.calculateAffectedRegions((sectionPos.x() << 4) + x, (sectionPos.y() << 4) + y, (sectionPos.z() << 4) + z, Math.max(newLight, previousLight)); + world.sectionLightUpdated(posSet); + } + } + } + + public static Object generateBlock(Key replacedBlock, Object ownerBlock, Object properties) throws Throwable { + Object ownerProperties = Reflections.field$BlockBehaviour$properties.get(ownerBlock); + Reflections.field$BlockBehaviour$Properties$hasCollision.set(properties, Reflections.field$BlockBehaviour$Properties$hasCollision.get(ownerProperties)); + + ObjectHolder behaviorHolder = new ObjectHolder<>(EmptyBlockBehavior.INSTANCE); + ObjectHolder shapeHolder = new ObjectHolder<>(STONE_SHAPE); + + Object newBlockInstance = constructor$CraftEngineBlock.invoke(properties); + field$CraftEngineBlock$behavior.set(newBlockInstance, behaviorHolder); + field$CraftEngineBlock$shape.set(newBlockInstance, shapeHolder); + field$CraftEngineBlock$isNoteBlock.set(newBlockInstance, replacedBlock.equals(BlockKeys.NOTE_BLOCK)); + return newBlockInstance; + } + + public static class FluidStateInterceptor { + public static final FluidStateInterceptor INSTANCE = new FluidStateInterceptor(); + + @RuntimeType + public Object intercept(@This Object thisObj, @AllArguments Object[] args, @SuperCall Callable superMethod) { + ObjectHolder holder = ((BehaviorHolder) thisObj).getBehaviorHolder(); + try { + return holder.value().getFluidState(thisObj, args, superMethod); + } catch (Exception e) { + CraftEngine.instance().logger().severe("Failed to run getFluidState", e); + return args[0]; + } + } + } + + public static class UpdateShapeInterceptor { + public static final UpdateShapeInterceptor INSTANCE = new UpdateShapeInterceptor(); + + @RuntimeType + public Object intercept(@This Object thisObj, @AllArguments Object[] args, @SuperCall Callable superMethod) throws Exception { + ObjectHolder holder = ((BehaviorHolder) thisObj).getBehaviorHolder(); + if (((NoteBlockIndicator) thisObj).isNoteBlock()) { + startNoteBlockChain(args); + } + try { + return holder.value().updateShape(thisObj, args, superMethod); + } catch (Exception e) { + CraftEngine.instance().logger().severe("Failed to run updateShape", e); + return args[0]; + } + } + } + + private static void startNoteBlockChain(Object[] args) throws ReflectiveOperationException { + Object direction; + Object serverLevel; + Object blockPos; + if (VersionHelper.isVersionNewerThan1_21_2()) { + direction = args[4]; + serverLevel = args[1]; + blockPos = args[3]; + } else { + direction = args[1]; + serverLevel = args[3]; + blockPos = args[4]; + } + int id = (int) Reflections.field$Direction$data3d.get(direction); + // Y axis + if (id == 0 || id == 1) { + Object chunkSource = Reflections.field$ServerLevel$chunkSource.get(serverLevel); + Reflections.method$ServerChunkCache$blockChanged.invoke(chunkSource, blockPos); + if (id == 1) { + NoteBlockChainUpdateUtils.noteBlockChainUpdate(serverLevel, chunkSource, Reflections.instance$Direction$DOWN, blockPos, 0); + } else { + NoteBlockChainUpdateUtils.noteBlockChainUpdate(serverLevel, chunkSource, Reflections.instance$Direction$UP, blockPos, 0); + } + } + } + + public static class GetShapeInterceptor { + public static final GetShapeInterceptor INSTANCE = new GetShapeInterceptor(); + + @RuntimeType + public Object intercept(@This Object thisObj, @AllArguments Object[] args, @SuperCall Callable superMethod) throws Exception { + ObjectHolder holder = ((ShapeHolder) thisObj).getShapeHolder(); + try { + return holder.value().getShape(thisObj, args); + } catch (Exception e) { + CraftEngine.instance().logger().severe("Failed to run getShape", e); + return superMethod.call(); + } + } + } + + public static class RandomTickInterceptor { + public static final RandomTickInterceptor INSTANCE = new RandomTickInterceptor(); + + @RuntimeType + public void intercept(@This Object thisObj, @AllArguments Object[] args, @SuperCall Callable superMethod) { + ObjectHolder holder = ((BehaviorHolder) thisObj).getBehaviorHolder(); + try { + holder.value().randomTick(thisObj, args, superMethod); + } catch (Exception e) { + CraftEngine.instance().logger().severe("Failed to run randomTick", e); + } + } + } + + public static class TickInterceptor { + public static final TickInterceptor INSTANCE = new TickInterceptor(); + + @RuntimeType + public void intercept(@This Object thisObj, @AllArguments Object[] args, @SuperCall Callable superMethod) { + ObjectHolder holder = ((BehaviorHolder) thisObj).getBehaviorHolder(); + try { + holder.value().tick(thisObj, args, superMethod); + } catch (Exception e) { + CraftEngine.instance().logger().severe("Failed to run tick", e); + } + } + } + + public static class OnPlaceInterceptor { + public static final OnPlaceInterceptor INSTANCE = new OnPlaceInterceptor(); + + @RuntimeType + public void intercept(@This Object thisObj, @AllArguments Object[] args, @SuperCall Callable superMethod) { + ObjectHolder holder = ((BehaviorHolder) thisObj).getBehaviorHolder(); + try { + holder.value().onPlace(thisObj, args, superMethod); + } catch (Exception e) { + CraftEngine.instance().logger().severe("Failed to run onPlace", e); + } + } + } + + public static class OnBrokenAfterFallInterceptor { + public static final OnBrokenAfterFallInterceptor INSTANCE = new OnBrokenAfterFallInterceptor(); + + @RuntimeType + public void intercept(@This Object thisObj, @AllArguments Object[] args, @SuperCall Callable superMethod) { + ObjectHolder holder = ((BehaviorHolder) thisObj).getBehaviorHolder(); + try { + holder.value().onBrokenAfterFall(thisObj, args, superMethod); + } catch (Exception e) { + CraftEngine.instance().logger().severe("Failed to run onBrokenAfterFall", e); + } + } + } + + public static class CanSurviveInterceptor { + public static final CanSurviveInterceptor INSTANCE = new CanSurviveInterceptor(); + + @RuntimeType + public boolean intercept(@This Object thisObj, @AllArguments Object[] args, @SuperCall Callable superMethod) { + ObjectHolder holder = ((BehaviorHolder) thisObj).getBehaviorHolder(); + try { + return holder.value().canSurvive(thisObj, args, superMethod); + } catch (Exception e) { + CraftEngine.instance().logger().severe("Failed to run canSurvive", e); + return true; + } + } + } + + public static class IsBoneMealSuccessInterceptor { + public static final IsBoneMealSuccessInterceptor INSTANCE = new IsBoneMealSuccessInterceptor(); + + @RuntimeType + public boolean intercept(@This Object thisObj, @AllArguments Object[] args) { + ObjectHolder holder = ((BehaviorHolder) thisObj).getBehaviorHolder(); + try { + return holder.value().isBoneMealSuccess(thisObj, args); + } catch (Exception e) { + CraftEngine.instance().logger().severe("Failed to run isBoneMealSuccess", e); + return true; + } + } + } + + public static class IsValidBoneMealTargetInterceptor { + public static final IsValidBoneMealTargetInterceptor INSTANCE = new IsValidBoneMealTargetInterceptor(); + + @RuntimeType + public boolean intercept(@This Object thisObj, @AllArguments Object[] args) { + ObjectHolder holder = ((BehaviorHolder) thisObj).getBehaviorHolder(); + try { + return holder.value().isValidBoneMealTarget(thisObj, args); + } catch (Exception e) { + CraftEngine.instance().logger().severe("Failed to run isValidBoneMealTarget", e); + return true; + } + } + } + + public static class PerformBoneMealInterceptor { + public static final PerformBoneMealInterceptor INSTANCE = new PerformBoneMealInterceptor(); + + @RuntimeType + public void intercept(@This Object thisObj, @AllArguments Object[] args) { + ObjectHolder holder = ((BehaviorHolder) thisObj).getBehaviorHolder(); + try { + holder.value().performBoneMeal(thisObj, args); + } catch (Exception e) { + CraftEngine.instance().logger().severe("Failed to run performBoneMeal", e); + } + } + } +} diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/network/BukkitNetworkManager.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/network/BukkitNetworkManager.java new file mode 100644 index 000000000..a6bd3107a --- /dev/null +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/network/BukkitNetworkManager.java @@ -0,0 +1,570 @@ +package net.momirealms.craftengine.bukkit.plugin.network; + +import io.netty.buffer.ByteBuf; +import io.netty.channel.*; +import io.netty.handler.codec.MessageToMessageDecoder; +import io.netty.handler.codec.MessageToMessageEncoder; +import io.netty.util.internal.logging.InternalLogger; +import io.netty.util.internal.logging.InternalLoggerFactory; +import net.momirealms.craftengine.bukkit.plugin.BukkitCraftEngine; +import net.momirealms.craftengine.bukkit.plugin.network.impl.*; +import net.momirealms.craftengine.bukkit.plugin.user.BukkitServerPlayer; +import net.momirealms.craftengine.bukkit.util.Reflections; +import net.momirealms.craftengine.core.plugin.CraftEngine; +import net.momirealms.craftengine.core.plugin.network.ConnectionState; +import net.momirealms.craftengine.core.plugin.network.NetWorkUser; +import net.momirealms.craftengine.core.plugin.network.NetworkManager; +import net.momirealms.craftengine.core.util.FriendlyByteBuf; +import net.momirealms.craftengine.core.util.ListMonitor; +import net.momirealms.craftengine.core.util.TriConsumer; +import net.momirealms.craftengine.core.util.VersionHelper; +import org.bukkit.Bukkit; +import org.bukkit.entity.Player; +import org.bukkit.event.EventHandler; +import org.bukkit.event.EventPriority; +import org.bukkit.event.HandlerList; +import org.bukkit.event.Listener; +import org.bukkit.event.player.PlayerJoinEvent; +import org.bukkit.event.player.PlayerQuitEvent; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +import java.util.*; +import java.util.concurrent.ConcurrentHashMap; +import java.util.function.BiConsumer; + +public class BukkitNetworkManager implements NetworkManager, Listener { + private static BukkitNetworkManager instance; + private static final Map, TriConsumer> nmsPacketFunctions = new HashMap<>(); + private static final Map> byteBufPacketFunctions = new HashMap<>(); + + private static void registerNMSPacketConsumer(final TriConsumer function, @Nullable Class packet) { + if (packet == null) return; + nmsPacketFunctions.put(packet, function); + } + + private static void registerByteBufPacketConsumer(final BiConsumer function, int id) { + byteBufPacketFunctions.put(id, function); + } + + private final BiConsumer> packetsConsumer; + private final BiConsumer delayedPacketConsumer; + private final BiConsumer immediatePacketConsumer; + private final BukkitCraftEngine plugin; + + private final Map users = new ConcurrentHashMap<>(); + private final Map onlineUsers = new ConcurrentHashMap<>(); + private final HashSet injectedChannels = new HashSet<>(); + + private final PacketIds packetIds; + + private static final String CONNECTION_HANDLER_NAME = "craftengine_connection_handler"; + private static final String SERVER_CHANNEL_HANDLER_NAME = "craftengine_server_channel_handler"; + private static final String PLAYER_CHANNEL_HANDLER_NAME = "craftengine_player_packet_handler"; + private static final String PACKET_ENCODER = "craftengine_encoder"; + private static final String PACKET_DECODER = "craftengine_decoder"; + + private boolean active; + private boolean init; + + public BukkitNetworkManager(BukkitCraftEngine plugin) { + this.plugin = plugin; + if (VersionHelper.isVersionNewerThan1_21_2()) { + this.packetIds = new PacketIds1_21_2(); + } else if (VersionHelper.isVersionNewerThan1_20_5()) { + this.packetIds = new PacketIds1_20_5(); + } else if (VersionHelper.isVersionNewerThan1_20_3()) { + this.packetIds = new PacketIds1_20_3(); + } else if (VersionHelper.isVersionNewerThan1_20_2()) { + this.packetIds = new PacketIds1_20_2(); + } else { + this.packetIds = new PacketIds1_20(); + } + this.registerConsumers(); + this.packetsConsumer = ((serverPlayer, packets) -> { + try { + Object bundle = Reflections.constructor$ClientboundBundlePacket.newInstance(packets); + Reflections.method$ServerGamePacketListenerImpl$sendPacket.invoke( + Reflections.field$ServerPlayer$connection.get(serverPlayer), bundle); + } catch (ReflectiveOperationException e) { + plugin.logger().warn("Failed to create bundle packet", e); + } + }); + this.delayedPacketConsumer = (serverPlayer, packet) -> { + try { + Reflections.method$ServerGamePacketListenerImpl$sendPacket.invoke( + Reflections.field$ServerPlayer$connection.get(serverPlayer), packet); + } catch (ReflectiveOperationException e) { + plugin.logger().warn("Failed to invoke send packet", e); + } + }; + this.immediatePacketConsumer = (serverPlayer, packet) -> { + try { + Reflections.method$Connection$sendPacketImmediate.invoke(Reflections.field$ServerCommonPacketListenerImpl$connection.get(Reflections.field$ServerPlayer$connection.get(serverPlayer)), packet, null, true); + } catch (ReflectiveOperationException e) { + plugin.logger().warn("Failed to invoke send packet", e); + } + }; + this.active = true; + instance = this; + } + + private void registerConsumers() { + registerNMSPacketConsumer(PacketConsumers.LEVEL_CHUNK_WITH_LIGHT, Reflections.clazz$ClientboundLevelChunkWithLightPacket); + registerNMSPacketConsumer(PacketConsumers.PLAYER_ACTION, Reflections.clazz$ServerboundPlayerActionPacket); + registerNMSPacketConsumer(PacketConsumers.SWING_HAND, Reflections.clazz$ServerboundSwingPacket); + registerNMSPacketConsumer(PacketConsumers.USE_ITEM_ON, Reflections.clazz$ServerboundUseItemOnPacket); + registerNMSPacketConsumer(PacketConsumers.PICK_ITEM_FROM_BLOCK, Reflections.clazz$ServerboundPickItemFromBlockPacket); + registerNMSPacketConsumer(PacketConsumers.SET_CREATIVE_SLOT, Reflections.clazz$ServerboundSetCreativeModeSlotPacket); + registerNMSPacketConsumer(PacketConsumers.ADD_ENTITY, Reflections.clazz$ClientboundAddEntityPacket); + registerNMSPacketConsumer(PacketConsumers.LOGIN, Reflections.clazz$ClientboundLoginPacket); + registerNMSPacketConsumer(PacketConsumers.RESPAWN, Reflections.clazz$ClientboundRespawnPacket); + registerNMSPacketConsumer(PacketConsumers.INTERACT_ENTITY, Reflections.clazz$ServerboundInteractPacket); + registerNMSPacketConsumer(PacketConsumers.REMOVE_ENTITY, Reflections.clazz$ClientboundRemoveEntitiesPacket); + registerNMSPacketConsumer(PacketConsumers.SYNC_ENTITY_POSITION, Reflections.clazz$ClientboundEntityPositionSyncPacket); + registerNMSPacketConsumer(PacketConsumers.MOVE_ENTITY, Reflections.clazz$ClientboundMoveEntityPacket$Pos); + registerNMSPacketConsumer(PacketConsumers.PICK_ITEM_FROM_ENTITY, Reflections.clazz$ServerboundPickItemFromEntityPacket); + registerNMSPacketConsumer(PacketConsumers.SOUND, Reflections.clazz$ClientboundSoundPacket); + registerByteBufPacketConsumer(PacketConsumers.SECTION_BLOCK_UPDATE, this.packetIds.clientboundSectionBlocksUpdatePacket()); + registerByteBufPacketConsumer(PacketConsumers.BLOCK_UPDATE, this.packetIds.clientboundBlockUpdatePacket()); + registerByteBufPacketConsumer(PacketConsumers.LEVEL_PARTICLE, this.packetIds.clientboundLevelParticlesPacket()); + registerByteBufPacketConsumer(PacketConsumers.LEVEL_EVENT, this.packetIds.clientboundLevelEventPacket()); + } + + public static BukkitNetworkManager instance() { + return instance; + } + + @EventHandler(priority = EventPriority.LOWEST) + public void onPlayerJoin(PlayerJoinEvent event) { + Player player = event.getPlayer(); + BukkitServerPlayer user = (BukkitServerPlayer) getUser(player); + if (user != null) { + user.setPlayer(player); + this.onlineUsers.put(player.getUniqueId(), user); + } + } + + @EventHandler + public void onPlayerQuit(PlayerQuitEvent event) { + Player player = event.getPlayer(); + Channel channel = getChannel(player); + NetWorkUser user = removeUser(channel); + if (user == null) return; + handleDisconnection(channel); + this.onlineUsers.remove(player.getUniqueId()); + } + + @Override + public Collection onlineUsers() { + return onlineUsers.values(); + } + + @Override + public void init() { + if (init) return; + try { + Object server = Reflections.method$MinecraftServer$getServer.invoke(null); + Object serverConnection = Reflections.field$MinecraftServer$connection.get(server); + @SuppressWarnings("unchecked") + List channels = (List) Reflections.field$ServerConnectionListener$channels.get(serverConnection); + ListMonitor monitor = new ListMonitor<>(channels, (future) -> { + if (!active) return; + Channel channel = future.channel(); + injectServerChannel(channel); + injectedChannels.add(channel); + }, (object) -> {}); + Reflections.field$ServerConnectionListener$channels.set(serverConnection, monitor); + init = true; + } catch (ReflectiveOperationException e) { + plugin.logger().warn("Failed to init server connection", e); + } + } + + @Override + public void enable() { + Bukkit.getPluginManager().registerEvents(this, plugin.bootstrap()); + } + + @Override + public void shutdown() { + HandlerList.unregisterAll(this); + for (Channel channel : injectedChannels) { + uninjectServerChannel(channel); + } + for (Player player : Bukkit.getOnlinePlayers()) { + handleDisconnection(getChannel(player)); + } + injectedChannels.clear(); + active = false; + } + + @Override + public void setUser(Channel channel, NetWorkUser user) { + ChannelPipeline pipeline = channel.pipeline(); + users.put(pipeline, (BukkitServerPlayer) user); + } + + @Override + public NetWorkUser getUser(Channel channel) { + ChannelPipeline pipeline = channel.pipeline(); + return users.get(pipeline); + } + + @Override + public NetWorkUser removeUser(Channel channel) { + ChannelPipeline pipeline = channel.pipeline(); + return users.remove(pipeline); + } + + @Override + public Channel getChannel(net.momirealms.craftengine.core.entity.player.Player player) { + return getChannel((Player) player.platformPlayer()); + } + + public NetWorkUser getUser(Player player) { + return getUser(getChannel(player)); + } + + public NetWorkUser getOnlineUser(Player player) { + return onlineUsers.get(player.getUniqueId()); + } + + public Channel getChannel(Player player) { + try { + return (Channel) Reflections.field$Channel.get( + Reflections.field$NetworkManager.get( + Reflections.field$ServerPlayer$connection.get( + Reflections.method$CraftPlayer$getHandle.invoke(player) + ) + ) + ); + } catch (ReflectiveOperationException e) { + throw new RuntimeException(e); + } + } + + public void sendPacket(@NotNull Player player, @NotNull Object packet) { + try { + Object serverPlayer = Reflections.method$CraftPlayer$getHandle.invoke(player); + this.immediatePacketConsumer.accept(serverPlayer, packet); + } catch (Exception e) { + this.plugin.logger().warn("Failed to send packet", e); + } + } + + public void sendPacket(@NotNull NetWorkUser player, Object packet, boolean immediately) { + if (immediately) { + this.immediatePacketConsumer.accept(player.serverPlayer(), packet); + } else { + this.delayedPacketConsumer.accept(player.serverPlayer(), packet); + } + } + + public void sendPackets(@NotNull NetWorkUser player, List packet) { + this.packetsConsumer.accept(player.serverPlayer(), packet); + } + + private void injectServerChannel(Channel serverChannel) { + ChannelPipeline pipeline = serverChannel.pipeline(); + ChannelHandler connectionHandler = pipeline.get(CONNECTION_HANDLER_NAME); + if (connectionHandler != null) { + pipeline.remove(CONNECTION_HANDLER_NAME); + } + if (pipeline.get("SpigotNettyServerChannelHandler#0") != null) { + pipeline.addAfter("SpigotNettyServerChannelHandler#0", CONNECTION_HANDLER_NAME, new ServerChannelHandler()); + } else if (pipeline.get("floodgate-init") != null) { + pipeline.addAfter("floodgate-init", CONNECTION_HANDLER_NAME, new ServerChannelHandler()); + } else if (pipeline.get("MinecraftPipeline#0") != null) { + pipeline.addAfter("MinecraftPipeline#0", CONNECTION_HANDLER_NAME, new ServerChannelHandler()); + } else { + pipeline.addFirst(CONNECTION_HANDLER_NAME, new ServerChannelHandler()); + } + + for (Player player : Bukkit.getOnlinePlayers()) { + Channel channel = getChannel(player); + NetWorkUser user = getUser(player); + if (user == null) { + user = new BukkitServerPlayer(plugin, channel); + ((BukkitServerPlayer) user).setPlayer(player); + injectChannel(channel, ConnectionState.PLAY); + } + } + } + + private void uninjectServerChannel(Channel channel) { + if (channel.pipeline().get(CONNECTION_HANDLER_NAME) != null) { + channel.pipeline().remove(CONNECTION_HANDLER_NAME); + } + } + + public void handleDisconnection(Channel channel) { + NetWorkUser user = removeUser(channel); + if (user == null) return; + if (channel.pipeline().get(PLAYER_CHANNEL_HANDLER_NAME) != null) { + channel.pipeline().remove(PLAYER_CHANNEL_HANDLER_NAME); + } + if (channel.pipeline().get(PACKET_ENCODER) != null) { + channel.pipeline().remove(PACKET_ENCODER); + } + if (channel.pipeline().get(PACKET_DECODER) != null) { + channel.pipeline().remove(PACKET_DECODER); + } + } + + public class ServerChannelHandler extends ChannelInboundHandlerAdapter { + + @Override + public void channelRead(@NotNull ChannelHandlerContext context, @NotNull Object c) throws Exception { + Channel channel = (Channel) c; + channel.pipeline().addLast(SERVER_CHANNEL_HANDLER_NAME, new PreChannelInitializer()); + super.channelRead(context, c); + } + } + + public class PreChannelInitializer extends ChannelInboundHandlerAdapter { + + private static final InternalLogger logger = InternalLoggerFactory.getInstance(ChannelInitializer.class); + + @Override + public void channelRegistered(ChannelHandlerContext context) { + try { + injectChannel(context.channel(), ConnectionState.HANDSHAKING); + } catch (Throwable t) { + exceptionCaught(context, t); + } finally { + ChannelPipeline pipeline = context.pipeline(); + if (pipeline.context(this) != null) { + pipeline.remove(this); + } + } + context.pipeline().fireChannelRegistered(); + } + + @Override + public void exceptionCaught(ChannelHandlerContext context, Throwable t) { + PreChannelInitializer.logger.warn("Failed to inject channel: " + context.channel(), t); + context.close(); + } + } + + public void injectChannel(Channel channel, ConnectionState state) { + if (isFakeChannel(channel)) { + return; + } + + BukkitServerPlayer user = new BukkitServerPlayer(plugin, channel); + if (channel.pipeline().get("splitter") == null) { + channel.close(); + return; + } + + ChannelPipeline pipeline = channel.pipeline(); + if (pipeline.get(PACKET_ENCODER) != null) { + pipeline.remove(PACKET_ENCODER); + } + if (pipeline.get(PACKET_DECODER) != null) { + pipeline.remove(PACKET_DECODER); + } + for (Map.Entry entry : pipeline.toMap().entrySet()) { + if (Reflections.clazz$Connection.isAssignableFrom(entry.getValue().getClass())) { + pipeline.addBefore(entry.getKey(), PLAYER_CHANNEL_HANDLER_NAME, new PluginChannelHandler(user)); + break; + } + } + + String decoderName = pipeline.names().contains("inbound_config") ? "inbound_config" : "decoder"; + pipeline.addBefore(decoderName, PACKET_DECODER, new PluginChannelDecoder(user)); + String encoderName = pipeline.names().contains("outbound_config") ? "outbound_config" : "encoder"; + pipeline.addBefore(encoderName, PACKET_ENCODER, new PluginChannelEncoder(user)); + + channel.closeFuture().addListener((ChannelFutureListener) future -> handleDisconnection(user.nettyChannel())); + setUser(channel, user); + } + + public static boolean isFakeChannel(Object channel) { + return channel.getClass().getSimpleName().equals("FakeChannel") + || channel.getClass().getSimpleName().equals("SpoofedChannel"); + } + + public class PluginChannelHandler extends ChannelDuplexHandler { + + private final NetWorkUser player; + + public PluginChannelHandler(NetWorkUser player) { + this.player = player; + } + + @Override + public void write(ChannelHandlerContext context, Object packet, ChannelPromise channelPromise) throws Exception { + try { + NMSPacketEvent event = new NMSPacketEvent(packet); + onNMSPacketSend(player, event, packet); + if (event.isCancelled()) return; + super.write(context, packet, channelPromise); + channelPromise.addListener((p) -> { + for (Runnable task : event.getDelayedTasks()) { + task.run(); + } + }); + } catch (Throwable e) { + plugin.logger().severe("An error occurred when reading packets", e); + super.write(context, packet, channelPromise); + } + } + + @Override + public void channelRead(@NotNull ChannelHandlerContext context, @NotNull Object packet) throws Exception { + NMSPacketEvent event = new NMSPacketEvent(packet); + onNMSPacketReceive(player, event, packet); + if (event.isCancelled()) return; + super.channelRead(context, packet); + } + } + + public class PluginChannelEncoder extends MessageToMessageEncoder { + private final NetWorkUser player; + private boolean handledCompression = false; + + public PluginChannelEncoder(NetWorkUser player) { + this.player = player; + } + + public PluginChannelEncoder(PluginChannelEncoder encoder) { + this.player = encoder.player; + this.handledCompression = encoder.handledCompression; + } + + @Override + protected void encode(ChannelHandlerContext channelHandlerContext, ByteBuf byteBuf, List list) { + boolean needCompression = !handledCompression && handleCompression(channelHandlerContext, byteBuf); + this.onByteBufSend(byteBuf); + if (needCompression) { + compress(channelHandlerContext, byteBuf); + } + if (byteBuf.isReadable()) { + list.add(byteBuf.retain()); + } + } + + private boolean handleCompression(ChannelHandlerContext ctx, ByteBuf buffer) { + if (handledCompression) return false; + int compressIndex = ctx.pipeline().names().indexOf("compress"); + if (compressIndex == -1) return false; + handledCompression = true; + int encoderIndex = ctx.pipeline().names().indexOf(PACKET_ENCODER); + if (encoderIndex == -1) return false; + if (compressIndex > encoderIndex) { + decompress(ctx, buffer, buffer); + PluginChannelEncoder encoder = (PluginChannelEncoder) ctx.pipeline().remove(PACKET_ENCODER); + String encoderName = ctx.pipeline().names().contains("outbound_config") ? "outbound_config" : "encoder"; + ctx.pipeline().addBefore(encoderName, PACKET_ENCODER, new PluginChannelEncoder(encoder)); + return true; + } + return false; + } + + private void onByteBufSend(ByteBuf buffer) { + // I don't care packets before PLAY for the moment + if (player.encoderState() != ConnectionState.PLAY) return; + int size = buffer.readableBytes(); + if (size != 0) { + FriendlyByteBuf buf = new FriendlyByteBuf(buffer); + int preProcessIndex = buf.readerIndex(); + int packetId = buf.readVarInt(); + ByteBufPacketEvent event = new ByteBufPacketEvent(packetId, buf); + BukkitNetworkManager.this.handleByteBufPacket(this.player, event); + if (event.isCancelled()) { + buf.clear(); + } else if (!event.changed()) { + buf.readerIndex(preProcessIndex); + } + } + } + } + + public class PluginChannelDecoder extends MessageToMessageDecoder { + private final NetWorkUser player; + + public PluginChannelDecoder(NetWorkUser player) { + this.player = player; + } + + @Override + protected void decode(ChannelHandlerContext context, ByteBuf byteBuf, List list) { + if (byteBuf.isReadable()) { + list.add(byteBuf.retain()); + } + } + } + + private void onNMSPacketReceive(NetWorkUser user, NMSPacketEvent event, Object packet) { + handleNMSPacket(user, event, packet); + } + + @SuppressWarnings("unchecked") + private void onNMSPacketSend(NetWorkUser player, NMSPacketEvent event, Object packet) throws ReflectiveOperationException { + if (Reflections.clazz$ClientboundBundlePacket.isInstance(packet)) { + Iterable packets = (Iterable) Reflections.field$BundlePacket$packets.get(packet); + for (Object p : packets) { + onNMSPacketSend(player, event, p); + } + } else { + handleNMSPacket(player, event, packet); + } + } + + protected void handleNMSPacket(NetWorkUser user, NMSPacketEvent event, Object packet) { + Optional.ofNullable(nmsPacketFunctions.get(packet.getClass())) + .ifPresent(function -> function.accept(user, event, packet)); + } + + protected void handleByteBufPacket(NetWorkUser user, ByteBufPacketEvent event) { + int packetID = event.packetID(); + Optional.ofNullable(byteBufPacketFunctions.get(packetID)) + .ifPresent(function -> function.accept(user, event)); + } + + private void compress(ChannelHandlerContext ctx, ByteBuf input) { + ChannelHandler compressor = ctx.pipeline().get("compress"); + ByteBuf temp = ctx.alloc().buffer(); + try { + if (compressor != null) { + callEncode(compressor, ctx, input, temp); + } + } finally { + input.clear().writeBytes(temp); + temp.release(); + } + } + + private void decompress(ChannelHandlerContext ctx, ByteBuf input, ByteBuf output) { + ChannelHandler decompressor = ctx.pipeline().get("decompress"); + if (decompressor != null) { + ByteBuf temp = (ByteBuf) callDecode(decompressor, ctx, input).get(0); + try { + output.clear().writeBytes(temp); + } finally { + temp.release(); + } + } + } + + private static void callEncode(Object encoder, ChannelHandlerContext ctx, ByteBuf msg, ByteBuf output) { + try { + Reflections.method$messageToByteEncoder$encode.invoke(encoder, ctx, msg, output); + } catch (ReflectiveOperationException e) { + CraftEngine.instance().logger().warn("Failed to call encode", e); + } + } + + public static List callDecode(Object decoder, Object ctx, Object input) { + List output = new ArrayList<>(); + try { + Reflections.method$byteToMessageDecoder$decode.invoke(decoder, ctx, input, output); + } catch (ReflectiveOperationException e) { + CraftEngine.instance().logger().warn("Failed to call decode", e); + } + return output; + } +} diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/network/ByteBufPacketEvent.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/network/ByteBufPacketEvent.java new file mode 100644 index 000000000..023bb5b94 --- /dev/null +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/network/ByteBufPacketEvent.java @@ -0,0 +1,59 @@ +package net.momirealms.craftengine.bukkit.plugin.network; + +import net.momirealms.craftengine.core.util.Cancellable; +import net.momirealms.craftengine.core.util.FriendlyByteBuf; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; +import java.util.Optional; + +public class ByteBufPacketEvent implements Cancellable { + private boolean cancelled; + private List delayedTasks = null; + private final FriendlyByteBuf buf; + private boolean changed; + private final int packetID; + + public ByteBufPacketEvent(int packetID, FriendlyByteBuf buf) { + this.buf = buf; + this.packetID = packetID; + } + + public int packetID() { + return packetID; + } + + public FriendlyByteBuf getBuffer() { + return buf; + } + + public void setChanged(boolean dirty) { + this.changed = dirty; + } + + public boolean changed() { + return changed; + } + + public void addDelayedTask(Runnable task) { + if (delayedTasks == null) { + delayedTasks = new ArrayList<>(); + } + delayedTasks.add(task); + } + + public List getDelayedTasks() { + return Optional.ofNullable(delayedTasks).orElse(Collections.emptyList()); + } + + @Override + public boolean isCancelled() { + return cancelled; + } + + @Override + public void setCancelled(boolean cancel) { + cancelled = cancel; + } +} diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/network/NMSPacketEvent.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/network/NMSPacketEvent.java new file mode 100644 index 000000000..bce61806f --- /dev/null +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/network/NMSPacketEvent.java @@ -0,0 +1,43 @@ +package net.momirealms.craftengine.bukkit.plugin.network; + +import net.momirealms.craftengine.core.util.Cancellable; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; +import java.util.Optional; + +public class NMSPacketEvent implements Cancellable { + private boolean cancelled; + private List delayedTasks = null; + private final Object packet; + + public NMSPacketEvent(Object packet) { + this.packet = packet; + } + + public Object getPacket() { + return packet; + } + + public void addDelayedTask(Runnable task) { + if (delayedTasks == null) { + delayedTasks = new ArrayList<>(); + } + delayedTasks.add(task); + } + + public List getDelayedTasks() { + return Optional.ofNullable(delayedTasks).orElse(Collections.emptyList()); + } + + @Override + public boolean isCancelled() { + return cancelled; + } + + @Override + public void setCancelled(boolean cancel) { + cancelled = cancel; + } +} \ No newline at end of file diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/network/PacketConsumers.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/network/PacketConsumers.java new file mode 100644 index 000000000..bed62bf99 --- /dev/null +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/network/PacketConsumers.java @@ -0,0 +1,664 @@ +package net.momirealms.craftengine.bukkit.plugin.network; + +import io.netty.buffer.ByteBuf; +import io.netty.buffer.Unpooled; +import it.unimi.dsi.fastutil.ints.IntList; +import net.momirealms.craftengine.bukkit.api.CraftEngineFurniture; +import net.momirealms.craftengine.bukkit.api.event.FurnitureBreakEvent; +import net.momirealms.craftengine.bukkit.api.event.FurnitureInteractEvent; +import net.momirealms.craftengine.bukkit.block.BukkitBlockManager; +import net.momirealms.craftengine.bukkit.entity.furniture.BukkitFurnitureManager; +import net.momirealms.craftengine.bukkit.entity.furniture.LoadedFurniture; +import net.momirealms.craftengine.bukkit.plugin.BukkitCraftEngine; +import net.momirealms.craftengine.bukkit.plugin.user.BukkitServerPlayer; +import net.momirealms.craftengine.bukkit.util.*; +import net.momirealms.craftengine.core.block.ImmutableBlockState; +import net.momirealms.craftengine.core.entity.player.InteractionHand; +import net.momirealms.craftengine.core.plugin.CraftEngine; +import net.momirealms.craftengine.core.plugin.config.ConfigManager; +import net.momirealms.craftengine.core.plugin.network.ConnectionState; +import net.momirealms.craftengine.core.plugin.network.NetWorkUser; +import net.momirealms.craftengine.core.util.*; +import net.momirealms.craftengine.core.world.BlockPos; +import net.momirealms.craftengine.core.world.chunk.Palette; +import net.momirealms.craftengine.core.world.chunk.PalettedContainer; +import net.momirealms.craftengine.core.world.chunk.packet.MCSection; +import org.bukkit.*; +import org.bukkit.block.data.BlockData; +import org.bukkit.entity.Player; +import org.bukkit.inventory.ItemStack; +import org.bukkit.inventory.PlayerInventory; +import org.bukkit.util.RayTraceResult; + +import java.lang.reflect.InvocationTargetException; +import java.lang.reflect.Method; +import java.util.Arrays; +import java.util.Map; +import java.util.Objects; +import java.util.function.BiConsumer; + +public class PacketConsumers { + private static int[] mappings; + private static IntIdentityList BLOCK_LIST; + private static IntIdentityList BIOME_LIST; + + public static void init(Map map, int registrySize) { + mappings = new int[registrySize]; + Arrays.fill(mappings, -1); + for (int i = 0; i < registrySize; i++) { + mappings[i] = i; + } + for (Map.Entry entry : map.entrySet()) { + mappings[entry.getKey()] = entry.getValue(); + } + BLOCK_LIST = new IntIdentityList(registrySize); + BIOME_LIST = new IntIdentityList(RegistryUtils.currentBiomeRegistrySize()); + } + + public static int remap(int stateId) { + return mappings[stateId]; + } + + public static final TriConsumer LEVEL_CHUNK_WITH_LIGHT = (user, event, packet) -> { + try { + BukkitServerPlayer player = (BukkitServerPlayer) user; + Object chunkData = Reflections.field$ClientboundLevelChunkWithLightPacket$chunkData.get(packet); + byte[] buffer = (byte[]) Reflections.field$ClientboundLevelChunkPacketData$buffer.get(chunkData); + ByteBuf buf = Unpooled.copiedBuffer(buffer); + FriendlyByteBuf friendlyByteBuf = new FriendlyByteBuf(buf); + FriendlyByteBuf newBuf = new FriendlyByteBuf(Unpooled.buffer()); + for (int i = 0, count = player.clientSideSectionCount(); i < count; i++) { + try { + MCSection mcSection = new MCSection(BLOCK_LIST, BIOME_LIST); + mcSection.readPacket(friendlyByteBuf); + PalettedContainer container = mcSection.blockStateContainer(); + Palette palette = container.data().palette(); + if (palette.canRemap()) { + palette.remap(PacketConsumers::remap); + } else { + for (int j = 0; j < 4096; j ++) { + int state = container.get(j); + int newState = remap(state); + if (newState != state) { + container.set(j, newState); + } + } + } + mcSection.writePacket(newBuf); + } catch (Exception e) { + break; + } + } + Reflections.field$ClientboundLevelChunkPacketData$buffer.set(chunkData, newBuf.array()); + } catch (Exception e) { + CraftEngine.instance().logger().warn("Failed to handle ClientboundLevelChunkWithLightPacket", e); + } + }; + + public static final BiConsumer SECTION_BLOCK_UPDATE = (user, event) -> { + try { + FriendlyByteBuf buf = event.getBuffer(); + long pos = buf.readLong(); + int blocks = buf.readVarInt(); + short[] positions = new short[blocks]; + int[] states = new int[blocks]; + for (int i = 0; i < blocks; i++) { + long k = buf.readVarLong(); + positions[i] = (short) ((int) (k & 4095L)); + states[i] = remap((int) (k >>> 12)); + } + buf.clear(); + buf.writeVarInt(event.packetID()); + buf.writeLong(pos); + buf.writeVarInt(blocks); + for (int i = 0; i < blocks; i ++) { + buf.writeVarLong((long) states[i] << 12 | positions[i]); + } + event.setChanged(true); + } catch (Exception e) { + CraftEngine.instance().logger().warn("Failed to handle ClientboundSectionBlocksUpdatePacket", e); + } + }; + + public static final BiConsumer BLOCK_UPDATE = (user, event) -> { + try { + FriendlyByteBuf buf = event.getBuffer(); + BlockPos pos = buf.readBlockPos(buf); + int before = buf.readVarInt(); + int state = remap(before); + if (state == before) { + return; + } + event.setChanged(true); + buf.clear(); + buf.writeVarInt(event.packetID()); + buf.writeBlockPos(pos); + buf.writeVarInt(state); + } catch (Exception e) { + CraftEngine.instance().logger().warn("Failed to handle ClientboundBlockUpdatePacket", e); + } + }; + + public static final BiConsumer LEVEL_EVENT = (user, event) -> { + try { + FriendlyByteBuf buf = event.getBuffer(); + int eventId = buf.readInt(); + if (eventId != 2001) return; + BlockPos blockPos = buf.readBlockPos(buf); + int state = buf.readInt(); + boolean global = buf.readBoolean(); + int newState = remap(state); + if (newState == state) { + return; + } + event.setChanged(true); + buf.clear(); + buf.writeVarInt(event.packetID()); + buf.writeInt(eventId); + buf.writeBlockPos(blockPos); + buf.writeInt(newState); + buf.writeBoolean(global); + } catch (Exception e) { + CraftEngine.instance().logger().warn("Failed to handle ClientboundLevelEventPacket", e); + } + }; + + public static final BiConsumer LEVEL_PARTICLE = (user, event) -> { + try { + FriendlyByteBuf buf = event.getBuffer(); + Object mcByteBuf; + Method writeMethod; + if (VersionHelper.isVersionNewerThan1_20_5()) { + mcByteBuf = Reflections.constructor$RegistryFriendlyByteBuf.newInstance(buf, Reflections.instance$registryAccess); + writeMethod = Reflections.method$ClientboundLevelParticlesPacket$write; + } else { + mcByteBuf = Reflections.constructor$FriendlyByteBuf.newInstance(event.getBuffer().source()); + writeMethod = Reflections.method$Packet$write; + } + Object packet = Reflections.constructor$ClientboundLevelParticlesPacket.newInstance(mcByteBuf); + Object option = Reflections.field$ClientboundLevelParticlesPacket$particle.get(packet); + if (option == null) return; + if (!Reflections.clazz$BlockParticleOption.isInstance(option)) return; + Object blockState = Reflections.field$BlockParticleOption$blockState.get(option); + int id = BlockStateUtils.blockStateToId(blockState); + int remapped = remap(id); + if (remapped == id) return; + Reflections.field$BlockParticleOption$blockState.set(option, BlockStateUtils.idToBlockState(remapped)); + event.setChanged(true); + buf.clear(); + buf.writeVarInt(event.packetID()); + writeMethod.invoke(packet, mcByteBuf); + } catch (Exception e) { + CraftEngine.instance().logger().warn("Failed to handle ClientboundLevelParticlesPacket", e); + } + }; + + public static final TriConsumer PLAYER_ACTION = (user, event, packet) -> { + try { + if (!user.isOnline()) return; + BukkitServerPlayer player = (BukkitServerPlayer) user; + Player platformPlayer = player.platformPlayer(); + World world = platformPlayer.getWorld(); + Object blockPos = Reflections.field$ServerboundPlayerActionPacket$pos.get(packet); + BlockPos pos = new BlockPos( + (int) Reflections.field$Vec3i$x.get(blockPos), + (int) Reflections.field$Vec3i$y.get(blockPos), + (int) Reflections.field$Vec3i$z.get(blockPos) + ); + if (VersionHelper.isFolia()) { + BukkitCraftEngine.instance().scheduler().sync().run(() -> { + try { + handlePlayerActionPacketOnMainThread(player, world, pos, packet); + } catch (Exception e) { + CraftEngine.instance().logger().warn("Failed to handle ServerboundPlayerActionPacket", e); + } + }, world, pos.x() >> 4, pos.z() >> 4); + } else { + handlePlayerActionPacketOnMainThread(player, world, pos, packet); + } + } catch (Exception e) { + CraftEngine.instance().logger().warn("Failed to handle ServerboundPlayerActionPacket", e); + } + }; + + private static void handlePlayerActionPacketOnMainThread(BukkitServerPlayer player, World world, BlockPos pos, Object packet) throws Exception { + + Object action = Reflections.field$ServerboundPlayerActionPacket$action.get(packet); + if (action == Reflections.instance$ServerboundPlayerActionPacket$Action$START_DESTROY_BLOCK) { + Object serverLevel = Reflections.field$CraftWorld$ServerLevel.get(world); + Object blockState = Reflections.method$BlockGetter$getBlockState.invoke(serverLevel, LocationUtils.toBlockPos(pos)); + int stateId = BlockStateUtils.blockStateToId(blockState); + // not a custom block + if (BlockStateUtils.isVanillaBlock(stateId)) { + if (ConfigManager.enableSoundSystem()) { + Object blockOwner = Reflections.field$StateHolder$owner.get(blockState); + if (BukkitBlockManager.instance().isBlockSoundRemoved(blockOwner)) { + player.startMiningBlock(world, pos, blockState, false, null); + return; + } + } + if (player.isMiningBlock() || player.shouldSyncAttribute()) { + player.stopMiningBlock(); + } + return; + } + player.startMiningBlock(world, pos, blockState, true, BukkitBlockManager.instance().getImmutableBlockStateUnsafe(stateId)); + } else if (action == Reflections.instance$ServerboundPlayerActionPacket$Action$ABORT_DESTROY_BLOCK) { + if (player.isMiningBlock()) { + player.abortMiningBlock(); + } + } else if (action == Reflections.instance$ServerboundPlayerActionPacket$Action$STOP_DESTROY_BLOCK) { + if (player.isMiningBlock()) { + player.stopMiningBlock(); + } + } + } + + public static final TriConsumer SWING_HAND = (user, event, packet) -> { + try { + if (!user.isOnline()) return; + BukkitServerPlayer player = (BukkitServerPlayer) user; + if (!player.isMiningBlock()) return; + Object hand = Reflections.field$ServerboundSwingPacket$hand.get(packet); + if (hand == Reflections.instance$InteractionHand$MAIN_HAND) { + player.onSwingHand(); + } + } catch (Exception e) { + CraftEngine.instance().logger().warn("Failed to handle ServerboundSwingPacket", e); + } + }; + + public static final TriConsumer USE_ITEM_ON = (user, event, packet) -> { + try { + if (!user.isOnline()) return; + BukkitServerPlayer player = (BukkitServerPlayer) user; + if (player.isMiningBlock()) { + player.stopMiningBlock(); + } + } catch (Exception e) { + CraftEngine.instance().logger().warn("Failed to handle ServerboundUseItemOnPacket", e); + } + }; + + public static final TriConsumer RESPAWN = (user, event, packet) -> { + try { + BukkitServerPlayer player = (BukkitServerPlayer) user; + Object dimensionKey; + if (!VersionHelper.isVersionNewerThan1_20_2()) { + dimensionKey = Reflections.field$ClientboundRespawnPacket$dimension.get(packet); + } else { + Object commonInfo = Reflections.field$ClientboundRespawnPacket$commonPlayerSpawnInfo.get(packet); + dimensionKey = Reflections.field$CommonPlayerSpawnInfo$dimension.get(commonInfo); + } + Object location = Reflections.field$ResourceKey$location.get(dimensionKey); + World world = Bukkit.getWorld(Objects.requireNonNull(NamespacedKey.fromString(location.toString()))); + if (world != null) { + int sectionCount = (world.getMaxHeight() - world.getMinHeight()) / 16; + player.setClientSideSectionCount(sectionCount); + player.setClientSideDimension(Key.of(location.toString())); + } else { + CraftEngine.instance().logger().warn("Failed to handle ClientboundRespawnPacket: World " + location + " does not exist"); + } + } catch (Exception e) { + CraftEngine.instance().logger().warn("Failed to handle ClientboundRespawnPacket", e); + } + }; + + public static final TriConsumer LOGIN = (user, event, packet) -> { + try { + BukkitServerPlayer player = (BukkitServerPlayer) user; + player.setConnectionState(ConnectionState.PLAY); + Object dimensionKey; + if (!VersionHelper.isVersionNewerThan1_20_2()) { + dimensionKey = Reflections.field$ClientboundLoginPacket$dimension.get(packet); + } else { + Object commonInfo = Reflections.field$ClientboundLoginPacket$commonPlayerSpawnInfo.get(packet); + dimensionKey = Reflections.field$CommonPlayerSpawnInfo$dimension.get(commonInfo); + } + Object location = Reflections.field$ResourceKey$location.get(dimensionKey); + World world = Bukkit.getWorld(Objects.requireNonNull(NamespacedKey.fromString(location.toString()))); + if (world != null) { + int sectionCount = (world.getMaxHeight() - world.getMinHeight()) / 16; + player.setClientSideSectionCount(sectionCount); + player.setClientSideDimension(Key.of(location.toString())); + } else { + CraftEngine.instance().logger().warn("Failed to handle ClientboundLoginPacket: World " + location + " does not exist"); + } + } catch (Exception e) { + CraftEngine.instance().logger().warn("Failed to handle ClientboundLoginPacket", e); + } + }; + + // 1.21.4- + // We can't find the best solution, we can only keep the feel as good as possible + // When the hotbar is full, the latest creative mode inventory can only be accessed when the player opens the inventory screen. Currently, it is not worth further handling this issue. + public static final TriConsumer SET_CREATIVE_SLOT = (user, event, packet) -> { + try { + if (VersionHelper.isVersionNewerThan1_21_4()) return; + if (!user.isOnline()) return; + BukkitServerPlayer player = (BukkitServerPlayer) user; + if (VersionHelper.isFolia()) { + BukkitCraftEngine.instance().scheduler().sync().run(() -> { + try { + handleSetCreativeSlotPacketOnMainThread(player, packet); + } catch (Exception e) { + CraftEngine.instance().logger().warn("Failed to handle ServerboundSetCreativeModeSlotPacket", e); + } + }, (World) player.level().getHandle(), (MCUtils.fastFloor(player.x())) >> 4, (MCUtils.fastFloor(player.z())) >> 4); + } else { + handleSetCreativeSlotPacketOnMainThread(player, packet); + } + } catch (Exception e) { + CraftEngine.instance().logger().warn("Failed to handle ServerboundSetCreativeModeSlotPacket", e); + } + }; + + private static void handleSetCreativeSlotPacketOnMainThread(BukkitServerPlayer player, Object packet) throws Exception { + Player bukkitPlayer = player.platformPlayer(); + if (bukkitPlayer == null) return; + if (bukkitPlayer.getGameMode() != GameMode.CREATIVE) return; + int slot = VersionHelper.isVersionNewerThan1_20_5() ? Reflections.field$ServerboundSetCreativeModeSlotPacket$slotNum.getShort(packet) : Reflections.field$ServerboundSetCreativeModeSlotPacket$slotNum.getInt(packet); + if (slot < 36 || slot > 44) return; + ItemStack item = (ItemStack) Reflections.method$CraftItemStack$asCraftMirror.invoke(null, Reflections.field$ServerboundSetCreativeModeSlotPacket$itemStack.get(packet)); + if (ItemUtils.isEmpty(item)) return; + if (slot - 36 != bukkitPlayer.getInventory().getHeldItemSlot()) { + return; + } + double interactionRange = player.getInteractionRange(); + // do ray trace to get current block + RayTraceResult result = bukkitPlayer.rayTraceBlocks(interactionRange, FluidCollisionMode.NEVER); + if (result == null) return; + org.bukkit.block.Block hitBlock = result.getHitBlock(); + if (hitBlock == null) return; + ImmutableBlockState state = BukkitBlockManager.instance().getImmutableBlockState(BlockStateUtils.blockDataToId(hitBlock.getBlockData())); + // not a custom block + if (state == null || state.isEmpty()) return; + Key itemId = state.settings().itemId(); + // no item available + if (itemId == null) return; + BlockData data = BlockStateUtils.createBlockData(state.vanillaBlockState().handle()); + // compare item + if (data == null || !data.getMaterial().equals(item.getType())) return; + ItemStack itemStack = BukkitCraftEngine.instance().itemManager().buildCustomItemStack(itemId, player); + if (ItemUtils.isEmpty(itemStack)) { + CraftEngine.instance().logger().warn("Item: " + itemId + " is not a valid item"); + return; + } + PlayerInventory inventory = bukkitPlayer.getInventory(); + int sameItemSlot = -1; + int emptySlot = -1; + for (int i = 0; i < 9 + 27; i++) { + ItemStack invItem = inventory.getItem(i); + if (ItemUtils.isEmpty(invItem)) { + if (emptySlot == -1 && i < 9) emptySlot = i; + continue; + } + if (invItem.getType().equals(itemStack.getType()) && invItem.getItemMeta().equals(itemStack.getItemMeta())) { + if (sameItemSlot == -1) sameItemSlot = i; + } + } + if (sameItemSlot != -1) { + if (sameItemSlot < 9) { + inventory.setHeldItemSlot(sameItemSlot); + ItemStack previousItem = inventory.getItem(slot - 36); + BukkitCraftEngine.instance().scheduler().sync().runDelayed(() -> inventory.setItem(slot - 36, previousItem)); + } else { + ItemStack sameItem = inventory.getItem(sameItemSlot); + int finalSameItemSlot = sameItemSlot; + BukkitCraftEngine.instance().scheduler().sync().runDelayed(() -> { + inventory.setItem(finalSameItemSlot, new ItemStack(Material.AIR)); + inventory.setItem(slot - 36, sameItem); + }); + } + } else { + if (item.getAmount() == 1) { + if (ItemUtils.isEmpty(inventory.getItem(slot - 36))) { + BukkitCraftEngine.instance().scheduler().sync().runDelayed(() -> inventory.setItem(slot - 36, itemStack)); + return; + } + if (emptySlot != -1) { + inventory.setHeldItemSlot(emptySlot); + inventory.setItem(emptySlot, itemStack); + } else { + BukkitCraftEngine.instance().scheduler().sync().runDelayed(() -> inventory.setItem(slot - 36, itemStack)); + } + } + } + } + + // 1.21.4+ + public static final TriConsumer PICK_ITEM_FROM_BLOCK = (user, event, packet) -> { + try { + if (!user.isOnline()) return; + Player player = (Player) user.platformPlayer(); + if (player == null) return; + Object pos = Reflections.field$ServerboundPickItemFromBlockPacket$pos.get(packet); + if (VersionHelper.isFolia()) { + int x = (int) Reflections.field$Vec3i$x.get(pos); + int z = (int) Reflections.field$Vec3i$z.get(pos); + BukkitCraftEngine.instance().scheduler().sync().run(() -> { + try { + handlePickItemFromBlockPacketOnMainThread(player, pos); + } catch (Exception e) { + CraftEngine.instance().logger().warn("Failed to handle ServerboundPickItemFromBlockPacket", e); + } + }, player.getWorld(), x >> 4, z >> 4); + } else { + BukkitCraftEngine.instance().scheduler().sync().run(() -> { + try { + handlePickItemFromBlockPacketOnMainThread(player, pos); + } catch (Exception e) { + CraftEngine.instance().logger().warn("Failed to handle ServerboundPickItemFromBlockPacket", e); + } + }); + } + } catch (Exception e) { + CraftEngine.instance().logger().warn("Failed to handle ServerboundPickItemFromBlockPacket", e); + } + }; + + private static void handlePickItemFromBlockPacketOnMainThread(Player player, Object pos) throws Exception { + Object serverLevel = Reflections.field$CraftWorld$ServerLevel.get(player.getWorld()); + Object blockState = Reflections.method$BlockGetter$getBlockState.invoke(serverLevel, pos); + ImmutableBlockState state = BukkitBlockManager.instance().getImmutableBlockState(BlockStateUtils.blockStateToId(blockState)); + if (state == null) return; + Key itemId = state.settings().itemId(); + if (itemId == null) return; + pickItem(player, itemId); + } + + // 1.21.4+ + public static final TriConsumer PICK_ITEM_FROM_ENTITY = (user, event, packet) -> { + try { + int entityId = (int) Reflections.field$ServerboundPickItemFromEntityPacket$id.get(packet); + LoadedFurniture furniture = BukkitFurnitureManager.instance().getLoadedFurnitureByInteractionEntityId(entityId); + if (furniture == null) return; + Player player = (Player) user.platformPlayer(); + if (player == null) return; + if (VersionHelper.isFolia()) { + Location location = player.getLocation(); + int x = location.getBlockX(); + int z = location.getBlockZ(); + BukkitCraftEngine.instance().scheduler().sync().run(() -> { + try { + handlePickItemFromEntityOnMainThread(player, furniture); + } catch (Exception e) { + CraftEngine.instance().logger().warn("Failed to handle ServerboundPickItemFromEntityPacket", e); + } + }, player.getWorld(), x >> 4, z >> 4); + } else { + BukkitCraftEngine.instance().scheduler().sync().run(() -> { + try { + handlePickItemFromEntityOnMainThread(player, furniture); + } catch (Exception e) { + CraftEngine.instance().logger().warn("Failed to handle ServerboundPickItemFromEntityPacket", e); + } + }); + } + } catch (Exception e) { + CraftEngine.instance().logger().warn("Failed to handle ServerboundPickItemFromEntityPacket", e); + } + }; + + private static void handlePickItemFromEntityOnMainThread(Player player, LoadedFurniture furniture) throws Exception { + Key itemId = furniture.furniture().settings().itemId(); + if (itemId == null) return; + pickItem(player, itemId); + } + + private static void pickItem(Player player, Key itemId) throws IllegalAccessException, InvocationTargetException { + ItemStack itemStack = BukkitCraftEngine.instance().itemManager().buildCustomItemStack(itemId, BukkitCraftEngine.instance().adapt(player)); + if (itemStack == null) { + CraftEngine.instance().logger().warn("Item: " + itemId + " is not a valid item"); + return; + } + assert Reflections.method$ServerGamePacketListenerImpl$tryPickItem != null; + Reflections.method$ServerGamePacketListenerImpl$tryPickItem.invoke( + Reflections.field$ServerPlayer$connection.get(Reflections.method$CraftPlayer$getHandle.invoke(player)), Reflections.method$CraftItemStack$asNMSMirror.invoke(null, itemStack)); + } + + public static final TriConsumer ADD_ENTITY = (user, event, packet) -> { + try { + Object entityType = Reflections.field$ClientboundAddEntityPacket$type.get(packet); + // Falling blocks + if (entityType == Reflections.instance$EntityType$FALLING_BLOCK) { + int data = Reflections.field$ClientboundAddEntityPacket$data.getInt(packet); + int remapped = remap(data); + if (remapped != data) { + Reflections.field$ClientboundAddEntityPacket$data.set(packet, remapped); + } + } else if (entityType == Reflections.instance$EntityType$ITEM_DISPLAY) { + // Furniture + int entityId = (int) Reflections.field$ClientboundAddEntityPacket$entityId.get(packet); + LoadedFurniture furniture = BukkitFurnitureManager.instance().getLoadedFurnitureByBaseEntityId(entityId); + if (furniture != null) { + user.sendPacket(furniture.spawnPacket(), false); + } + } + } catch (Exception e) { + CraftEngine.instance().logger().warn("Failed to handle ClientboundAddEntityPacket", e); + } + }; + + public static final TriConsumer SYNC_ENTITY_POSITION = (user, event, packet) -> { + try { + int entityId = (int) Reflections.field$ClientboundEntityPositionSyncPacket$id.get(packet); + if (BukkitFurnitureManager.instance().isFurnitureBaseEntity(entityId)) { + event.setCancelled(true); + } + } catch (Exception e) { + CraftEngine.instance().logger().warn("Failed to handle ClientboundEntityPositionSyncPacket", e); + } + }; + + public static final TriConsumer MOVE_ENTITY = (user, event, packet) -> { + try { + int entityId = (int) Reflections.field$ClientboundMoveEntityPacket$entityId.get(packet); + if (BukkitFurnitureManager.instance().isFurnitureBaseEntity(entityId)) { + event.setCancelled(true); + } + } catch (Exception e) { + CraftEngine.instance().logger().warn("Failed to handle ClientboundMoveEntityPacket$Pos", e); + } + }; + + public static final TriConsumer REMOVE_ENTITY = (user, event, packet) -> { + try { + IntList intList = (IntList) Reflections.field$ClientboundRemoveEntitiesPacket$entityIds.get(packet); + for (int i = 0, size = intList.size(); i < size; i++) { + int[] entities = BukkitFurnitureManager.instance().getSubEntityIdsByBaseEntityId(intList.getInt(i)); + if (entities == null) continue; + for (int entityId : entities) { + intList.add(entityId); + } + } + } catch (Exception e) { + CraftEngine.instance().logger().warn("Failed to handle ClientboundRemoveEntitiesPacket", e); + } + }; + + public static final TriConsumer INTERACT_ENTITY = (user, event, packet) -> { + try { + Player player = (Player) user.platformPlayer(); + if (player == null) return; + int entityId = (int) Reflections.field$ServerboundInteractPacket$entityId.get(packet); + Object action = Reflections.field$ServerboundInteractPacket$action.get(packet); + Object actionType = Reflections.method$ServerboundInteractPacket$Action$getType.invoke(action); + if (actionType == null) return; + LoadedFurniture furniture = BukkitFurnitureManager.instance().getLoadedFurnitureByInteractionEntityId(entityId); + if (furniture == null) return; + Location location = furniture.baseEntity().getLocation(); + BukkitServerPlayer serverPlayer = (BukkitServerPlayer) user; + if (serverPlayer.isSpectatorMode() || serverPlayer.isAdventureMode()) return; + BukkitCraftEngine.instance().scheduler().sync().run(() -> { + if (actionType == Reflections.instance$ServerboundInteractPacket$ActionType$ATTACK) { + if (furniture.isValid()) { + if (!BukkitCraftEngine.instance().antiGrief().canBreak(player, location)) { + return; + } + FurnitureBreakEvent breakEvent = new FurnitureBreakEvent(serverPlayer.platformPlayer(), furniture); + if (EventUtils.fireAndCheckCancel(breakEvent)) { + return; + } + CraftEngineFurniture.remove(furniture, serverPlayer, !serverPlayer.isCreativeMode(), true); + } + } else if (actionType == Reflections.instance$ServerboundInteractPacket$ActionType$INTERACT_AT) { + InteractionHand hand; + Location interactionPoint; + try { + Object interactionHand = Reflections.field$ServerboundInteractPacket$InteractionAtLocationAction$hand.get(action); + hand = interactionHand == Reflections.instance$InteractionHand$MAIN_HAND ? InteractionHand.MAIN_HAND : InteractionHand.OFF_HAND; + Object vec3 = Reflections.field$ServerboundInteractPacket$InteractionAtLocationAction$location.get(action); + double x = (double) Reflections.field$Vec3$x.get(vec3); + double y = (double) Reflections.field$Vec3$y.get(vec3); + double z = (double) Reflections.field$Vec3$z.get(vec3); + interactionPoint = new Location(location.getWorld(), x, y, z); + } catch (ReflectiveOperationException e) { + throw new RuntimeException("Failed to get interaction hand from interact packet", e); + } + FurnitureInteractEvent interactEvent = new FurnitureInteractEvent(serverPlayer.platformPlayer(), furniture, hand, interactionPoint); + if (EventUtils.fireAndCheckCancel(interactEvent)) { + return; + } + if (player.isSneaking()) + return; + furniture.getAvailableSeat(entityId).ifPresent(seatPos -> { + if (furniture.occupySeat(seatPos)) { + furniture.mountSeat(Objects.requireNonNull(player.getPlayer()), seatPos); + } + }); + } + }, player.getWorld(), location.getBlockX() >> 4,location.getBlockZ() >> 4); + } catch (Exception e) { + CraftEngine.instance().logger().warn("Failed to handle ServerboundInteractPacket", e); + } + }; + + public static final TriConsumer SOUND = (user, event, packet) -> { + try { + Object sound = Reflections.field$ClientboundSoundPacket$sound.get(packet); + Object soundEvent = Reflections.method$Holder$value.invoke(sound); + Key mapped = BukkitBlockManager.instance().replaceSoundIfExist(Key.of(Reflections.field$SoundEvent$location.get(soundEvent).toString())); + if (mapped != null) { + event.setCancelled(true); + Object newId = Reflections.method$ResourceLocation$fromNamespaceAndPath.invoke(null, mapped.namespace(), mapped.value()); + Object newSoundEvent = VersionHelper.isVersionNewerThan1_21_2() ? + Reflections.constructor$SoundEvent.newInstance(newId, Reflections.field$SoundEvent$fixedRange.get(soundEvent)) : + Reflections.constructor$SoundEvent.newInstance(newId, Reflections.field$SoundEvent$range.get(soundEvent), Reflections.field$SoundEvent$newSystem.get(soundEvent)); + Object newSoundPacket = Reflections.constructor$ClientboundSoundPacket.newInstance( + Reflections.method$Holder$direct.invoke(null, newSoundEvent), + Reflections.field$ClientboundSoundPacket$source.get(packet), + (double) Reflections.field$ClientboundSoundPacket$x.getInt(packet) / 8, + (double) Reflections.field$ClientboundSoundPacket$y.getInt(packet) / 8, + (double) Reflections.field$ClientboundSoundPacket$z.getInt(packet) / 8, + Reflections.field$ClientboundSoundPacket$volume.get(packet), + Reflections.field$ClientboundSoundPacket$pitch.get(packet), + Reflections.field$ClientboundSoundPacket$seed.get(packet) + ); + user.sendPacket(newSoundPacket, true); + } + } catch (Exception e) { + CraftEngine.instance().logger().warn("Failed to handle ClientboundSoundPacket", e); + } + }; +} diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/network/PacketIds.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/network/PacketIds.java new file mode 100644 index 000000000..bb457e96f --- /dev/null +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/network/PacketIds.java @@ -0,0 +1,14 @@ +package net.momirealms.craftengine.bukkit.plugin.network; + +public interface PacketIds { + + int clientboundBlockUpdatePacket(); + + int clientboundSectionBlocksUpdatePacket(); + + int clientboundLevelParticlesPacket(); + + int clientboundLevelEventPacket(); + + int clientboundAddEntityPacket(); +} diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/network/impl/PacketIds1_20.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/network/impl/PacketIds1_20.java new file mode 100644 index 000000000..6b46ed66b --- /dev/null +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/network/impl/PacketIds1_20.java @@ -0,0 +1,31 @@ +package net.momirealms.craftengine.bukkit.plugin.network.impl; + +import net.momirealms.craftengine.bukkit.plugin.network.PacketIds; + +public class PacketIds1_20 implements PacketIds { + + @Override + public int clientboundBlockUpdatePacket() { + return 10; + } + + @Override + public int clientboundSectionBlocksUpdatePacket() { + return 67; + } + + @Override + public int clientboundLevelParticlesPacket() { + return 38; + } + + @Override + public int clientboundLevelEventPacket() { + return 37; + } + + @Override + public int clientboundAddEntityPacket() { + return 1; + } +} diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/network/impl/PacketIds1_20_2.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/network/impl/PacketIds1_20_2.java new file mode 100644 index 000000000..aca5b2d18 --- /dev/null +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/network/impl/PacketIds1_20_2.java @@ -0,0 +1,31 @@ +package net.momirealms.craftengine.bukkit.plugin.network.impl; + +import net.momirealms.craftengine.bukkit.plugin.network.PacketIds; + +public class PacketIds1_20_2 implements PacketIds { + + @Override + public int clientboundBlockUpdatePacket() { + return 9; + } + + @Override + public int clientboundSectionBlocksUpdatePacket() { + return 69; + } + + @Override + public int clientboundLevelParticlesPacket() { + return 39; + } + + @Override + public int clientboundLevelEventPacket() { + return 38; + } + + @Override + public int clientboundAddEntityPacket() { + return 1; + } +} diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/network/impl/PacketIds1_20_3.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/network/impl/PacketIds1_20_3.java new file mode 100644 index 000000000..cfbf46214 --- /dev/null +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/network/impl/PacketIds1_20_3.java @@ -0,0 +1,31 @@ +package net.momirealms.craftengine.bukkit.plugin.network.impl; + +import net.momirealms.craftengine.bukkit.plugin.network.PacketIds; + +public class PacketIds1_20_3 implements PacketIds { + + @Override + public int clientboundBlockUpdatePacket() { + return 9; + } + + @Override + public int clientboundSectionBlocksUpdatePacket() { + return 71; + } + + @Override + public int clientboundLevelParticlesPacket() { + return 39; + } + + @Override + public int clientboundLevelEventPacket() { + return 38; + } + + @Override + public int clientboundAddEntityPacket() { + return 1; + } +} diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/network/impl/PacketIds1_20_5.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/network/impl/PacketIds1_20_5.java new file mode 100644 index 000000000..a09fd1392 --- /dev/null +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/network/impl/PacketIds1_20_5.java @@ -0,0 +1,31 @@ +package net.momirealms.craftengine.bukkit.plugin.network.impl; + +import net.momirealms.craftengine.bukkit.plugin.network.PacketIds; + +public class PacketIds1_20_5 implements PacketIds { + + @Override + public int clientboundBlockUpdatePacket() { + return 9; + } + + @Override + public int clientboundSectionBlocksUpdatePacket() { + return 73; + } + + @Override + public int clientboundLevelParticlesPacket() { + return 41; + } + + @Override + public int clientboundLevelEventPacket() { + return 40; + } + + @Override + public int clientboundAddEntityPacket() { + return 1; + } +} diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/network/impl/PacketIds1_21_2.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/network/impl/PacketIds1_21_2.java new file mode 100644 index 000000000..0d387b007 --- /dev/null +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/network/impl/PacketIds1_21_2.java @@ -0,0 +1,31 @@ +package net.momirealms.craftengine.bukkit.plugin.network.impl; + +import net.momirealms.craftengine.bukkit.plugin.network.PacketIds; + +public class PacketIds1_21_2 implements PacketIds { + + @Override + public int clientboundBlockUpdatePacket() { + return 9; + } + + @Override + public int clientboundSectionBlocksUpdatePacket() { + return 78; + } + + @Override + public int clientboundLevelParticlesPacket() { + return 42; + } + + @Override + public int clientboundLevelEventPacket() { + return 41; + } + + @Override + public int clientboundAddEntityPacket() { + return 1; + } +} diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/papi/ImageExpansion.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/papi/ImageExpansion.java new file mode 100644 index 000000000..9a5ca429c --- /dev/null +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/papi/ImageExpansion.java @@ -0,0 +1,87 @@ +package net.momirealms.craftengine.bukkit.plugin.papi; + +import me.clip.placeholderapi.expansion.PlaceholderExpansion; +import net.momirealms.craftengine.core.font.BitmapImage; +import net.momirealms.craftengine.core.plugin.CraftEngine; +import net.momirealms.craftengine.core.util.FormatUtils; +import net.momirealms.craftengine.core.util.Key; +import org.bukkit.OfflinePlayer; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +import java.util.Optional; + +public class ImageExpansion extends PlaceholderExpansion { + private final CraftEngine plugin; + + public ImageExpansion(CraftEngine plugin) { + this.plugin = plugin; + } + + @Override + public @NotNull String getIdentifier() { + return "image"; + } + + @Override + public @NotNull String getAuthor() { + return "XiaoMoMi"; + } + + @Override + public @NotNull String getVersion() { + return "1.0"; + } + + @Override + public boolean persist() { + return true; + } + + @Override + public @Nullable String onRequest(OfflinePlayer player, @NotNull String params) { + String[] split = params.split("_", 2); + if (split.length != 2) return null; + String[] param = split[1].split(":", 4); + if (param.length < 2) return null; + Key key; + try { + key = Key.of(param[0], param[1]); + } catch (IllegalArgumentException e) { + plugin.logger().warn("Invalid image namespaced key: " + param[0] + ":" + param[1]); + return null; + } + Optional optional = plugin.imageManager().bitmapImageByImageId(key); + if (optional.isEmpty()) { + return null; + } + BitmapImage image = optional.get(); + int codepoint; + if (param.length == 4) { + codepoint = image.codepointAt(Integer.parseInt(param[2]), Integer.parseInt(param[3])); + } else if (param.length == 2) { + codepoint = image.codepointAt(0,0); + } else { + return null; + } + try { + switch (split[0]) { + case "mm", "minimessage", "mini" -> { + return FormatUtils.miniMessageFont(new String(Character.toChars(codepoint)), image.font().toString()); + } + case "md", "minedown" -> { + return FormatUtils.mineDownFont(new String(Character.toChars(codepoint)), image.font().toString()); + } + case "raw" -> { + return new String(Character.toChars(codepoint)); + } + default -> { + return null; + } + } + } catch (IndexOutOfBoundsException e) { + return null; + } + } +} + diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/papi/ShiftExpansion.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/papi/ShiftExpansion.java new file mode 100644 index 000000000..f8650a55d --- /dev/null +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/papi/ShiftExpansion.java @@ -0,0 +1,75 @@ +package net.momirealms.craftengine.bukkit.plugin.papi; + +import me.clip.placeholderapi.expansion.PlaceholderExpansion; +import net.momirealms.craftengine.core.plugin.CraftEngine; +import org.bukkit.OfflinePlayer; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +public class ShiftExpansion extends PlaceholderExpansion { + private final CraftEngine plugin; + + public ShiftExpansion(CraftEngine plugin) { + this.plugin = plugin; + } + + @Override + public @NotNull String getIdentifier() { + return "shift"; + } + + @Override + public @NotNull String getAuthor() { + return "XiaoMoMi"; + } + + @Override + public @NotNull String getVersion() { + return "1.0"; + } + + @Override + public boolean persist() { + return true; + } + + @Override + public @Nullable String onRequest(OfflinePlayer player, @NotNull String params) { + String[] split = params.split("_", 2); + switch (split[0]) { + case "mini", "minimessage", "mm" -> { + if (split.length != 2) return null; + try { + return plugin.imageManager().createMiniMessageOffsets(Integer.parseInt(split[1])); + } catch (NumberFormatException e) { + return null; + } + } + case "md", "minedown" -> { + if (split.length != 2) return null; + try { + return plugin.imageManager().createMineDownOffsets(Integer.parseInt(split[1])); + } catch (NumberFormatException e) { + return null; + } + } + case "raw" -> { + if (split.length != 2) return null; + try { + return plugin.imageManager().createRawOffsets(Integer.parseInt(split[1])); + } catch (NumberFormatException e) { + return null; + } + } + default -> { + if (split.length != 1) return null; + try { + return plugin.imageManager().createMiniMessageOffsets(Integer.parseInt(split[0])); + } catch (NumberFormatException e) { + return null; + } + } + } + } +} + diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/scheduler/BukkitSchedulerAdapter.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/scheduler/BukkitSchedulerAdapter.java new file mode 100644 index 000000000..169b9f3fb --- /dev/null +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/scheduler/BukkitSchedulerAdapter.java @@ -0,0 +1,27 @@ +package net.momirealms.craftengine.bukkit.plugin.scheduler; + +import net.momirealms.craftengine.bukkit.plugin.BukkitCraftEngine; +import net.momirealms.craftengine.bukkit.plugin.scheduler.impl.BukkitExecutor; +import net.momirealms.craftengine.bukkit.plugin.scheduler.impl.FoliaExecutor; +import net.momirealms.craftengine.core.plugin.scheduler.AbstractJavaScheduler; +import net.momirealms.craftengine.core.plugin.scheduler.RegionExecutor; +import net.momirealms.craftengine.core.util.VersionHelper; +import org.bukkit.World; + +public class BukkitSchedulerAdapter extends AbstractJavaScheduler { + protected RegionExecutor sync; + + public BukkitSchedulerAdapter(BukkitCraftEngine plugin) { + super(plugin); + if (VersionHelper.isFolia()) { + this.sync = new FoliaExecutor(plugin.bootstrap()); + } else { + this.sync = new BukkitExecutor(plugin.bootstrap()); + } + } + + @Override + public RegionExecutor sync() { + return this.sync; + } +} diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/scheduler/impl/BukkitExecutor.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/scheduler/impl/BukkitExecutor.java new file mode 100644 index 000000000..5270e29ea --- /dev/null +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/scheduler/impl/BukkitExecutor.java @@ -0,0 +1,64 @@ +package net.momirealms.craftengine.bukkit.plugin.scheduler.impl; + +import net.momirealms.craftengine.core.plugin.scheduler.DummyTask; +import net.momirealms.craftengine.core.plugin.scheduler.RegionExecutor; +import net.momirealms.craftengine.core.plugin.scheduler.SchedulerTask; +import org.bukkit.Bukkit; +import org.bukkit.World; +import org.bukkit.plugin.Plugin; +import org.jetbrains.annotations.NotNull; + +public class BukkitExecutor implements RegionExecutor { + private final Plugin plugin; + + public BukkitExecutor(Plugin plugin) { + this.plugin = plugin; + } + + @Override + public void run(Runnable runnable, World world, int x, int z) { + execute(runnable); + } + + @Override + public void runDelayed(Runnable r, World world, int x, int z) { + Bukkit.getScheduler().runTask(plugin, r); + } + + @Override + public SchedulerTask runAsyncRepeating(Runnable runnable, long delay, long period) { + return new BukkitTask(Bukkit.getScheduler().runTaskTimerAsynchronously(plugin, runnable, delay, period)); + } + + @Override + public SchedulerTask runAsyncLater(Runnable runnable, long delay) { + return new BukkitTask(Bukkit.getScheduler().runTaskLaterAsynchronously(plugin, runnable, delay)); + } + + @Override + public SchedulerTask runLater(Runnable runnable, long delay, World world, int x, int z) { + if (delay <= 0) { + if (Bukkit.isPrimaryThread()) { + runnable.run(); + return new DummyTask(); + } else { + return new BukkitTask(Bukkit.getScheduler().runTask(plugin, runnable)); + } + } + return new BukkitTask(Bukkit.getScheduler().runTaskLater(plugin, runnable, delay)); + } + + @Override + public SchedulerTask runRepeating(Runnable runnable, long delay, long period, World world, int x, int z) { + return new BukkitTask(Bukkit.getScheduler().runTaskTimer(plugin, runnable, delay, period)); + } + + @Override + public void execute(@NotNull Runnable runnable) { + if (Bukkit.isPrimaryThread()) { + runnable.run(); + return; + } + Bukkit.getScheduler().runTask(plugin, runnable); + } +} diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/scheduler/impl/BukkitTask.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/scheduler/impl/BukkitTask.java new file mode 100644 index 000000000..edb4842df --- /dev/null +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/scheduler/impl/BukkitTask.java @@ -0,0 +1,21 @@ +package net.momirealms.craftengine.bukkit.plugin.scheduler.impl; + +import net.momirealms.craftengine.core.plugin.scheduler.SchedulerTask; + +public class BukkitTask implements SchedulerTask { + private final org.bukkit.scheduler.BukkitTask bukkitTask; + + public BukkitTask(org.bukkit.scheduler.BukkitTask bukkitTask) { + this.bukkitTask = bukkitTask; + } + + @Override + public void cancel() { + this.bukkitTask.cancel(); + } + + @Override + public boolean cancelled() { + return bukkitTask.isCancelled(); + } +} diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/scheduler/impl/FoliaExecutor.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/scheduler/impl/FoliaExecutor.java new file mode 100644 index 000000000..420c04d1d --- /dev/null +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/scheduler/impl/FoliaExecutor.java @@ -0,0 +1,72 @@ +package net.momirealms.craftengine.bukkit.plugin.scheduler.impl; + +import net.momirealms.craftengine.core.plugin.scheduler.RegionExecutor; +import net.momirealms.craftengine.core.plugin.scheduler.SchedulerTask; +import org.bukkit.Bukkit; +import org.bukkit.World; +import org.bukkit.plugin.Plugin; +import org.jetbrains.annotations.NotNull; + +import java.util.Optional; + +public class FoliaExecutor implements RegionExecutor { + private final Plugin plugin; + + public FoliaExecutor(Plugin plugin) { + this.plugin = plugin; + } + + @Override + public void run(Runnable runnable, World world, int x, int z) { + Optional.ofNullable(world).ifPresentOrElse(w -> + Bukkit.getRegionScheduler().execute(plugin, w, x, z, runnable), + () -> Bukkit.getGlobalRegionScheduler().execute(plugin, runnable) + ); + } + + @Override + public void runDelayed(Runnable runnable, World world, int x, int z) { + run(runnable, world, x, z); + } + + @Override + public SchedulerTask runAsyncRepeating(Runnable runnable, long delay, long period) { + return runRepeating(runnable, delay, period, null, 0, 0); + } + + @Override + public SchedulerTask runAsyncLater(Runnable runnable, long delay) { + return runLater(runnable, delay, null, 0, 0); + } + + @Override + public SchedulerTask runLater(Runnable runnable, long delay, World world, int x, int z) { + if (world == null) { + if (delay <= 0) { + return new FoliaTask(Bukkit.getGlobalRegionScheduler().runDelayed(plugin, scheduledTask -> runnable.run(), delay)); + } else { + return new FoliaTask(Bukkit.getGlobalRegionScheduler().run(plugin, scheduledTask -> runnable.run())); + } + } else { + if (delay <= 0) { + return new FoliaTask(Bukkit.getRegionScheduler().run(plugin, world, x, z, scheduledTask -> runnable.run())); + } else { + return new FoliaTask(Bukkit.getRegionScheduler().runDelayed(plugin, world, x, z, scheduledTask -> runnable.run(), delay)); + } + } + } + + @Override + public SchedulerTask runRepeating(Runnable runnable, long delay, long period, World world, int x, int z) { + if (world == null) { + return new FoliaTask(Bukkit.getGlobalRegionScheduler().runAtFixedRate(plugin, scheduledTask -> runnable.run(), delay, period)); + } else { + return new FoliaTask(Bukkit.getRegionScheduler().runAtFixedRate(plugin, world, x, z, scheduledTask -> runnable.run(), delay, period)); + } + } + + @Override + public void execute(@NotNull Runnable runnable) { + Bukkit.getGlobalRegionScheduler().execute(plugin, runnable); + } +} diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/scheduler/impl/FoliaTask.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/scheduler/impl/FoliaTask.java new file mode 100644 index 000000000..397739261 --- /dev/null +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/scheduler/impl/FoliaTask.java @@ -0,0 +1,22 @@ +package net.momirealms.craftengine.bukkit.plugin.scheduler.impl; + +import io.papermc.paper.threadedregions.scheduler.ScheduledTask; +import net.momirealms.craftengine.core.plugin.scheduler.SchedulerTask; + +public class FoliaTask implements SchedulerTask { + private final ScheduledTask task; + + public FoliaTask(ScheduledTask task) { + this.task = task; + } + + @Override + public void cancel() { + this.task.cancel(); + } + + @Override + public boolean cancelled() { + return task.isCancelled(); + } +} diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/user/BukkitServerPlayer.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/user/BukkitServerPlayer.java new file mode 100644 index 000000000..89cd4b05d --- /dev/null +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/user/BukkitServerPlayer.java @@ -0,0 +1,574 @@ +package net.momirealms.craftengine.bukkit.plugin.user; + +import com.google.common.collect.Lists; +import io.netty.channel.Channel; +import net.kyori.adventure.text.Component; +import net.momirealms.craftengine.bukkit.item.BukkitItemManager; +import net.momirealms.craftengine.bukkit.plugin.BukkitCraftEngine; +import net.momirealms.craftengine.bukkit.util.*; +import net.momirealms.craftengine.bukkit.world.BukkitWorld; +import net.momirealms.craftengine.core.block.ImmutableBlockState; +import net.momirealms.craftengine.core.entity.player.InteractionHand; +import net.momirealms.craftengine.core.entity.player.Player; +import net.momirealms.craftengine.core.item.Item; +import net.momirealms.craftengine.core.plugin.CraftEngine; +import net.momirealms.craftengine.core.plugin.network.ConnectionState; +import net.momirealms.craftengine.core.util.Direction; +import net.momirealms.craftengine.core.util.Key; +import net.momirealms.craftengine.core.util.VersionHelper; +import net.momirealms.craftengine.core.world.BlockPos; +import net.momirealms.craftengine.core.world.Vec3d; +import net.momirealms.craftengine.core.world.World; +import org.bukkit.*; +import org.bukkit.block.Block; +import org.bukkit.inventory.EquipmentSlot; +import org.bukkit.inventory.ItemStack; +import org.bukkit.inventory.PlayerInventory; +import org.bukkit.util.RayTraceResult; +import org.jetbrains.annotations.Nullable; + +import java.lang.ref.Reference; +import java.lang.ref.WeakReference; +import java.util.UUID; + +public class BukkitServerPlayer extends Player { + private final Channel channel; + private final BukkitCraftEngine plugin; + + private ConnectionState decoderState; + private ConnectionState encoderState; + + private Reference playerRef; + private Reference serverPlayerRef; + + private int sectionCount; + private int lastSuccessfulInteraction; + private long lastAttributeSyncTime; + private Key clientSideDimension; + + private int lastSentState = -1; + private int lastHitBlockTime; + private BlockPos destroyPos; + private Object destroyedState; + private boolean isDestroyingBlock; + private boolean isDestroyingCustomBlock; + private boolean swingHandAck; + private float miningProgress; + + private int resentSoundTick; + private int resentSwingTick; + + private Key lastUsedRecipe = null; + + public BukkitServerPlayer(BukkitCraftEngine plugin, Channel channel) { + this.channel = channel; + this.plugin = plugin; + } + + public void setPlayer(org.bukkit.entity.Player player) { + playerRef = new WeakReference<>(player); + try { + serverPlayerRef = new WeakReference<>(Reflections.method$CraftPlayer$getHandle.invoke(player)); + } catch (ReflectiveOperationException e) { + throw new RuntimeException(e); + } + } + + @Override + public Channel nettyChannel() { + return channel; + } + + @Override + public CraftEngine plugin() { + return plugin; + } + + @Override + public boolean isMiningBlock() { + return destroyPos != null; + } + + public void setDestroyedState(Object destroyedState) { + this.destroyedState = destroyedState; + } + + public void setDestroyPos(BlockPos destroyPos) { + this.destroyPos = destroyPos; + } + + @Override + public boolean shouldSyncAttribute() { + long current = System.currentTimeMillis(); + if (current - this.lastAttributeSyncTime > 10000) { + this.lastAttributeSyncTime = current; + return true; + } + return false; + } + + @Override + public boolean isSneaking() { + return platformPlayer().isSneaking(); + } + + @Override + public boolean isCreativeMode() { + return platformPlayer().getGameMode() == GameMode.CREATIVE; + } + + @Override + public boolean isSpectatorMode() { + return platformPlayer().getGameMode() == GameMode.SPECTATOR; + } + + @Override + public boolean isAdventureMode() { + return platformPlayer().getGameMode() == GameMode.ADVENTURE; + } + + @Override + public void sendActionBar(Component text) { + try { + Object packet = Reflections.constructor$ClientboundSetActionBarTextPacket.newInstance(ComponentUtils.adventureToMinecraft(text)); + sendPacket(packet, false); + } catch (ReflectiveOperationException e) { + plugin.logger().warn("Failed to send action bar", e); + } + } + + @Override + public boolean updateLastSuccessfulInteractionTick(int tick) { + if (lastSuccessfulInteraction != tick) { + lastSuccessfulInteraction = tick; + return true; + } else { + return false; + } + } + + @Override + public int gameTicks() { + try { + Object serverPlayer = serverPlayer(); + Object gameMode = Reflections.field$ServerPlayer$gameMode.get(serverPlayer); + return (int) Reflections.field$ServerPlayerGameMode$gameTicks.get(gameMode); + } catch (ReflectiveOperationException e) { + throw new RuntimeException("Failed to get current tick", e); + } + } + + @Override + public void swingHand(InteractionHand hand) { + platformPlayer().swingHand(hand == InteractionHand.MAIN_HAND ? EquipmentSlot.HAND : EquipmentSlot.OFF_HAND); + } + + @Override + public boolean hasPermission(String permission) { + return platformPlayer().hasPermission(permission); + } + + @Override + public boolean canInstabuild() { + try { + Object abilities = Reflections.field$Player$abilities.get(serverPlayer()); + return (boolean) Reflections.field$Abilities$instabuild.get(abilities); + } catch (ReflectiveOperationException e) { + CraftEngine.instance().logger().warn("Failed to get canInstabuild for " + name(), e); + return false; + } + } + + @Override + public String name() { + org.bukkit.entity.Player player = platformPlayer(); + if (player == null) return "Unknown"; + return player.getName(); + } + + @Override + public void playSound(Key sound, float volume, float pitch) { + platformPlayer().playSound(platformPlayer(), sound.toString(), SoundCategory.MASTER, volume, pitch); + } + + @Override + public void giveItem(Item item) { + PlayerUtils.giveItem(platformPlayer(), (ItemStack) item.getItem(), item.count()); + } + + @Override + public void sendPacket(Object packet, boolean immediately) { + this.plugin.networkManager().sendPacket(this, packet, immediately); + } + + @Override + public ConnectionState decoderState() { + return decoderState; + } + + @Override + public ConnectionState encoderState() { + return encoderState; + } + + @Override + public int clientSideSectionCount() { + return sectionCount; + } + + public void setClientSideSectionCount(int sectionCount) { + this.sectionCount = sectionCount; + } + + @Override + public Key clientSideDimension() { + return clientSideDimension; + } + + public void setClientSideDimension(Key clientSideDimension) { + this.clientSideDimension = clientSideDimension; + } + + public void setConnectionState(ConnectionState connectionState) { + this.encoderState = connectionState; + this.decoderState = connectionState; + } + + public void setDecoderState(ConnectionState decoderState) { + this.decoderState = decoderState; + } + + public void setEncoderState(ConnectionState encoderState) { + this.encoderState = encoderState; + } + + @Override + public void tick() { + // not fully online + if (serverPlayer() == null) return; + if (this.isDestroyingBlock) { + this.tickBlockDestroy(); + } + } + + @Override + public float getDestroyProgress(Object blockState, BlockPos pos) { + try { + Object serverPlayer = serverPlayer(); + Object blockPos = Reflections.constructor$BlockPos.newInstance(pos.x(), pos.y(), pos.z()); + return (float) Reflections.method$BlockStateBase$getDestroyProgress.invoke(blockState, serverPlayer, Reflections.method$Entity$level.invoke(serverPlayer), blockPos); + } catch (ReflectiveOperationException e) { + this.plugin.logger().warn("Failed to get destroy progress for player " + platformPlayer().getName()); + return 0f; + } + } + + public void startMiningBlock(org.bukkit.World world, BlockPos pos, Object state, boolean custom, @Nullable ImmutableBlockState immutableBlockState) { + // instant break + if (custom && getDestroyProgress(state, pos) >= 1f) { + assert immutableBlockState != null; + // not an instant break on client side + if (getDestroyProgress(immutableBlockState.vanillaBlockState().handle(), pos) < 1f) { + try { + Object levelEventPacket = Reflections.constructor$ClientboundLevelEventPacket.newInstance(2001, LocationUtils.toBlockPos(pos), BlockStateUtils.blockStateToId(this.destroyedState), false); + sendPacket(levelEventPacket, false); + } catch (ReflectiveOperationException e) { + this.plugin.logger().warn("Failed to send level event packet", e); + } + } + //ParticleUtils.addBlockBreakParticles(world, LocationUtils.toBlockPos(pos), state); + return; + } + setCanBreakBlock(!custom); + setDestroyPos(pos); + setDestroyedState(state); + setIsDestroyingBlock(true, custom); + } + + private void setCanBreakBlock(boolean canBreak) { + try { + if (canBreak) { + if (VersionHelper.isVersionNewerThan1_20_5()) { + Object serverPlayer = serverPlayer(); + Object attributeInstance = Reflections.method$ServerPlayer$getAttribute.invoke(serverPlayer, Reflections.instance$Holder$Attribute$block_break_speed); + Object newPacket = Reflections.constructor$ClientboundUpdateAttributesPacket0.newInstance(entityID(), Lists.newArrayList(attributeInstance)); + sendPacket(newPacket, true); + } else { + resetEffect(Reflections.instance$MobEffecr$mining_fatigue); + resetEffect(Reflections.instance$MobEffecr$haste); + } + } else { + if (VersionHelper.isVersionNewerThan1_20_5()) { + Object attributeModifier = VersionHelper.isVersionNewerThan1_21() ? + Reflections.constructor$AttributeModifier.newInstance(Reflections.method$ResourceLocation$fromNamespaceAndPath.invoke(null, "craftengine", "custom_hardness"), -9999d, Reflections.instance$AttributeModifier$Operation$ADD_VALUE) : + Reflections.constructor$AttributeModifier.newInstance(UUID.randomUUID(), "craftengine:custom_hardness", -9999d, Reflections.instance$AttributeModifier$Operation$ADD_VALUE); + Object attributeSnapshot = Reflections.constructor$ClientboundUpdateAttributesPacket$AttributeSnapshot.newInstance(Reflections.instance$Holder$Attribute$block_break_speed, 1d, Lists.newArrayList(attributeModifier)); + Object newPacket = Reflections.constructor$ClientboundUpdateAttributesPacket1.newInstance(entityID(), Lists.newArrayList(attributeSnapshot)); + sendPacket(newPacket, true); + } else { + Object fatiguePacket = MobEffectUtils.createPacket(Reflections.instance$MobEffecr$mining_fatigue, entityID(), (byte) 9, -1, false, false, false); + Object hastePacket = MobEffectUtils.createPacket(Reflections.instance$MobEffecr$haste, entityID(), (byte) 0, -1, false, false, false); + sendPacket(fatiguePacket, true); + sendPacket(hastePacket, true); + } + } + } catch (ReflectiveOperationException e) { + plugin.logger().warn("Failed to set attribute for player " + platformPlayer().getName(), e); + } + } + + @Override + public void stopMiningBlock() { + setCanBreakBlock(true); + setIsDestroyingBlock(false, false); + } + + private void resetEffect(Object mobEffect) throws ReflectiveOperationException { + Object effectInstance = Reflections.method$ServerPlayer$getEffect.invoke(serverPlayer(), mobEffect); + Object packet; + if (effectInstance != null) { + packet = Reflections.constructor$ClientboundUpdateMobEffectPacket.newInstance(entityID(), effectInstance); + } else { + packet = Reflections.constructor$ClientboundRemoveMobEffectPacket.newInstance(entityID(), mobEffect); + } + sendPacket(packet, true); + } + + @Override + public void abortMiningBlock() { + abortDestroyProgress(); + } + + private void tickBlockDestroy() { + // prevent server from taking over breaking blocks + if (this.isDestroyingCustomBlock) { + try { + Object serverPlayer = serverPlayer(); + Object gameMode = Reflections.field$ServerPlayer$gameMode.get(serverPlayer); + Reflections.field$ServerPlayerGameMode$isDestroyingBlock.set(gameMode, false); + } catch (ReflectiveOperationException e) { + throw new RuntimeException(e); + } + } + if (!this.swingHandAck) return; + this.swingHandAck = false; + try { + org.bukkit.entity.Player player = platformPlayer(); + double range = getInteractionRange(); + RayTraceResult result = player.rayTraceBlocks(range, FluidCollisionMode.NEVER); + if (result == null) return; + Block hitBlock = result.getHitBlock(); + if (hitBlock == null) return; + Location location = hitBlock.getLocation(); + BlockPos hitPos = new BlockPos(location.getBlockX(), location.getBlockY(), location.getBlockZ()); + if (!hitPos.equals(this.destroyPos)) { + return; + } + Object blockPos = LocationUtils.toBlockPos(hitPos); + Object serverPlayer = serverPlayer(); + Object gameMode = Reflections.field$ServerPlayer$gameMode.get(serverPlayer); + int currentTick = (int) Reflections.field$ServerPlayerGameMode$gameTicks.get(gameMode); + if (currentTick - this.lastHitBlockTime > 3) { + Object blockOwner = Reflections.field$StateHolder$owner.get(this.destroyedState); + Object soundType = Reflections.field$BlockBehaviour$soundType.get(blockOwner); + Object soundEvent = Reflections.field$SoundType$hitSound.get(soundType); + Object soundId = Reflections.field$SoundEvent$location.get(soundEvent); + level().playBlockSound(new Vec3d(this.destroyPos.x(), this.destroyPos.y(), this.destroyPos.z()), Key.of(soundId.toString()), 0.5F, 0.5F); + this.lastHitBlockTime = currentTick; + } + + // accumulate progress (custom blocks only) + if (this.isDestroyingCustomBlock) { + Item item = this.getItemInHand(InteractionHand.MAIN_HAND); + if (item != null) { + Material itemMaterial = item.getItem().getType(); + if (canInstabuild() && (itemMaterial == Material.DEBUG_STICK + || itemMaterial == Material.TRIDENT + || (VersionHelper.isVersionNewerThan1_20_5() && itemMaterial == MaterialUtils.MACE) + || item.is(ItemTags.SWORDS))) { + return; + } + } + this.miningProgress = (float) Reflections.method$BlockStateBase$getDestroyProgress.invoke(this.destroyedState, serverPlayer, Reflections.method$Entity$level.invoke(serverPlayer), blockPos) + miningProgress; + int packetStage = (int) (this.miningProgress * 10.0F); + if (packetStage != this.lastSentState) { + this.lastSentState = packetStage; + broadcastDestroyProgress(player, hitPos, blockPos, packetStage); + } + if (this.miningProgress >= 1f) { + //Reflections.method$ServerLevel$levelEvent.invoke(Reflections.field$CraftWorld$ServerLevel.get(player.getWorld()), null, 2001, blockPos, BlockStateUtils.blockStateToId(this.destroyedState)); + Reflections.method$ServerPlayerGameMode$destroyBlock.invoke(gameMode, blockPos); + Object levelEventPacket = Reflections.constructor$ClientboundLevelEventPacket.newInstance(2001, blockPos, BlockStateUtils.blockStateToId(this.destroyedState), false); + sendPacket(levelEventPacket, false); + this.stopMiningBlock(); + } + } + } catch (Exception e) { + plugin.logger().warn("Failed to tick destroy for player " + platformPlayer().getName(), e); + } + } + + private void broadcastDestroyProgress(org.bukkit.entity.Player player, BlockPos hitPos, Object blockPos, int stage) throws ReflectiveOperationException { + Object packet = Reflections.constructor$ClientboundBlockDestructionPacket.newInstance(Integer.MAX_VALUE - entityID(), blockPos, stage); + for (org.bukkit.entity.Player other : player.getWorld().getPlayers()) { + Location otherLocation = other.getLocation(); + double d0 = (double) hitPos.x() - otherLocation.getX(); + double d1 = (double) hitPos.y() - otherLocation.getY(); + double d2 = (double) hitPos.z() - otherLocation.getZ(); + if (d0 * d0 + d1 * d1 + d2 * d2 < 1024.0D) { + plugin.networkManager().sendPacket(other, packet); + } + } + } + + @Override + public double getInteractionRange() { + try { + if (VersionHelper.isVersionNewerThan1_20_5()) { + Object attributeInstance = Reflections.method$ServerPlayer$getAttribute.invoke(serverPlayer(), Reflections.instance$Holder$Attribute$block_interaction_range); + if (attributeInstance == null) return 4.5d; + return (double) Reflections.method$AttributeInstance$getValue.invoke(attributeInstance); + } else { + return 4.5d; + } + } catch (ReflectiveOperationException e) { + plugin.logger().warn("Failed to get interaction range for player " + platformPlayer().getName(), e); + return 4.5d; + } + } + + public void setIsDestroyingBlock(boolean value, boolean custom) { + if (value) { + this.isDestroyingBlock = true; + this.isDestroyingCustomBlock = custom; + this.swingHandAck = true; + this.miningProgress = 0; + } else { + this.isDestroyingBlock = false; + this.swingHandAck = false; + if (this.destroyPos != null) { + try { + this.broadcastDestroyProgress(platformPlayer(), this.destroyPos, LocationUtils.toBlockPos(this.destroyPos), -1); + } catch (ReflectiveOperationException e) { + plugin.logger().warn("Failed to set isDestroyingCustomBlock", e); + } + } + this.destroyPos = null; + this.miningProgress = 0; + this.destroyedState = null; + this.isDestroyingCustomBlock = false; + } + } + + @Override + public void abortDestroyProgress() { + this.swingHandAck = false; + this.miningProgress = 0; + if (this.destroyPos == null) return; + try { + this.broadcastDestroyProgress(platformPlayer(), this.destroyPos, LocationUtils.toBlockPos(this.destroyPos), -1); + } catch (ReflectiveOperationException e) { + plugin.logger().warn("Failed to abort destroyProgress", e); + } + } + + @Override + public void onSwingHand() { + this.swingHandAck = true; + } + + @Override + public int entityID() { + return platformPlayer().getEntityId(); + } + + @Override + public boolean isOnline() { + org.bukkit.entity.Player player = platformPlayer(); + if (player == null) return false; + return player.isOnline(); + } + + @Override + public float getYRot() { + return platformPlayer().getLocation().getPitch(); + } + + @Override + public float getXRot() { + return platformPlayer().getLocation().getYaw(); + } + + @Override + public boolean isSecondaryUseActive() { + return isSneaking(); + } + + @Override + public Direction getDirection() { + return DirectionUtils.toDirection(platformPlayer().getFacing()); + } + + @Nullable + @Override + public Item getItemInHand(InteractionHand hand) { + PlayerInventory inventory = platformPlayer().getInventory(); + return BukkitItemManager.instance().wrap(hand == InteractionHand.MAIN_HAND ? inventory.getItemInMainHand() : inventory.getItemInOffHand()); + } + + @Override + public World level() { + return new BukkitWorld(platformPlayer().getWorld()); + } + + @Override + public double x() { + return platformPlayer().getLocation().getX(); + } + + @Override + public double y() { + return platformPlayer().getLocation().getY(); + } + + @Override + public double z() { + return platformPlayer().getLocation().getZ(); + } + + @Override + public Object serverPlayer() { + if (serverPlayerRef == null) return null; + return serverPlayerRef.get(); + } + + @Override + public org.bukkit.entity.Player platformPlayer() { + if (playerRef == null) return null; + return playerRef.get(); + } + + public void setResendSound() { + resentSoundTick = gameTicks(); + } + + public void setResendSwing() { + resentSwingTick = gameTicks(); + } + + public boolean shouldResendSound() { + return resentSoundTick == gameTicks(); + } + + public boolean shouldResendSwing() { + return resentSwingTick == gameTicks(); + } + + public Key lastUsedRecipe() { + return lastUsedRecipe; + } + + public void setLastUsedRecipe(Key lastUsedRecipe) { + this.lastUsedRecipe = lastUsedRecipe; + } +} diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/sound/BukkitJukeboxSongManager.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/sound/BukkitJukeboxSongManager.java new file mode 100644 index 000000000..c1279b3fd --- /dev/null +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/sound/BukkitJukeboxSongManager.java @@ -0,0 +1,58 @@ +package net.momirealms.craftengine.bukkit.sound; + +import net.momirealms.craftengine.bukkit.util.ComponentUtils; +import net.momirealms.craftengine.bukkit.util.Reflections; +import net.momirealms.craftengine.core.plugin.CraftEngine; +import net.momirealms.craftengine.core.sound.song.AbstractJukeboxSongManager; +import net.momirealms.craftengine.core.sound.song.JukeboxSong; +import net.momirealms.craftengine.core.util.Key; +import net.momirealms.craftengine.core.util.VersionHelper; + +import java.util.Map; +import java.util.Optional; +import java.util.Set; + +public class BukkitJukeboxSongManager extends AbstractJukeboxSongManager { + + public BukkitJukeboxSongManager(CraftEngine plugin) { + super(plugin); + } + + @Override + protected void registerSongs(Map songs) { + if (songs.isEmpty()) return; + try { + unfreezeRegistry(); + for (Map.Entry entry : songs.entrySet()) { + Key id = entry.getKey(); + JukeboxSong jukeboxSong = entry.getValue(); + Object resourceLocation = Reflections.method$ResourceLocation$fromNamespaceAndPath.invoke(null, id.namespace(), id.value()); + Object soundId = Reflections.method$ResourceLocation$fromNamespaceAndPath.invoke(null, jukeboxSong.sound().namespace(), jukeboxSong.sound().value()); + Object song = Reflections.method$Registry$get.invoke(Reflections.instance$InternalRegistries$JUKEBOX_SONG, resourceLocation); + + Object soundEvent = VersionHelper.isVersionNewerThan1_21_2() ? + Reflections.constructor$SoundEvent.newInstance(soundId, Optional.of(jukeboxSong.range())) : + Reflections.constructor$SoundEvent.newInstance(soundId, jukeboxSong.range(), false); + Object soundHolder = Reflections.method$Holder$direct.invoke(null, soundEvent); + + if (song == null) { + song = Reflections.constructor$JukeboxSong.newInstance(soundHolder, ComponentUtils.adventureToMinecraft(jukeboxSong.description()), jukeboxSong.lengthInSeconds(), jukeboxSong.comparatorOutput()); + Object holder = Reflections.method$Registry$registerForHolder.invoke(null, Reflections.instance$InternalRegistries$JUKEBOX_SONG, resourceLocation, song); + Reflections.method$Holder$Reference$bindValue.invoke(holder, song); + Reflections.field$Holder$Reference$tags.set(holder, Set.of()); + } + } + freezeRegistry(); + } catch (Exception e) { + plugin.logger().warn("Failed to register jukebox songs.", e); + } + } + + private void unfreezeRegistry() throws IllegalAccessException { + Reflections.field$MappedRegistry$frozen.set(Reflections.instance$InternalRegistries$JUKEBOX_SONG, false); + } + + private void freezeRegistry() throws IllegalAccessException { + Reflections.field$MappedRegistry$frozen.set(Reflections.instance$InternalRegistries$JUKEBOX_SONG, true); + } +} diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/sound/BukkitSoundManager.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/sound/BukkitSoundManager.java new file mode 100644 index 000000000..e3f4d769f --- /dev/null +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/sound/BukkitSoundManager.java @@ -0,0 +1,17 @@ +package net.momirealms.craftengine.bukkit.sound; + +import net.momirealms.craftengine.core.plugin.CraftEngine; +import net.momirealms.craftengine.core.sound.AbstractSoundManager; +import net.momirealms.craftengine.core.sound.song.JukeboxSongManager; + +public class BukkitSoundManager extends AbstractSoundManager { + + public BukkitSoundManager(CraftEngine plugin) { + super(plugin); + } + + @Override + protected JukeboxSongManager createJukeboxSongManager() { + return new BukkitJukeboxSongManager(super.plugin); + } +} diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/util/BlockStateUtils.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/util/BlockStateUtils.java new file mode 100644 index 000000000..efdd420cf --- /dev/null +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/util/BlockStateUtils.java @@ -0,0 +1,202 @@ +package net.momirealms.craftengine.bukkit.util; + +import net.momirealms.craftengine.core.block.ImmutableBlockState; +import net.momirealms.craftengine.core.block.PushReaction; +import net.momirealms.craftengine.core.util.Instrument; +import net.momirealms.craftengine.core.util.Key; +import net.momirealms.craftengine.core.util.MapColor; +import net.momirealms.craftengine.core.world.BlockPos; +import org.bukkit.block.Block; +import org.bukkit.block.data.BlockData; +import org.bukkit.event.block.BlockPhysicsEvent; + +import java.lang.reflect.InvocationTargetException; +import java.util.IdentityHashMap; + +public class BlockStateUtils { + public static final IdentityHashMap CLIENT_SIDE_NOTE_BLOCKS = new IdentityHashMap<>(); + private static int vanillaStateSize; + private static boolean hasInit; + + public static void init(int size) { + if (hasInit) { + throw new IllegalStateException("BlockStateUtils has already been initialized"); + } + vanillaStateSize = size; + hasInit = true; + } + + public static Object createBlockUpdatePacket(BlockPos pos, ImmutableBlockState state) { + try { + return Reflections.constructor$ClientboundBlockUpdatePacket.newInstance(LocationUtils.toBlockPos(pos), state.customBlockState().handle()); + } catch (ReflectiveOperationException e) { + throw new RuntimeException(e); + } + } + + public static BlockData createBlockData(Object blockState) { + try { + return (BlockData) Reflections.method$CraftBlockData$createData.invoke(null, blockState); + } catch (InvocationTargetException | IllegalAccessException e) { + throw new RuntimeException(e); + } + } + + public static BlockData fromBlockData(Object blockState) { + try { + return (BlockData) Reflections.method$CraftBlockData$fromData.invoke(null, blockState); + } catch (InvocationTargetException | IllegalAccessException e) { + throw new RuntimeException(e); + } + } + + public static int blockDataToId(BlockData blockData) { + try { + Object blockState = Reflections.field$CraftBlockData$data.get(blockData); + return (int) Reflections.method$IdMapper$getId.invoke(Reflections.instance$BLOCK_STATE_REGISTRY, blockState); + } catch (ReflectiveOperationException e) { + throw new RuntimeException(e); + } + } + + public static Key getBlockOwnerId(Block block) { + BlockData data = block.getBlockData(); + Object blockState = blockDataToBlockState(data); + return getBlockOwnerIdFromState(blockState); + } + + public static Key getBlockOwnerIdFromState(Object blockState) { + String id = blockState.toString(); + int first = id.indexOf('{'); + int last = id.indexOf('}'); + if (first != -1 && last != -1 && last > first) { + String blockId = id.substring(first + 1, last); + return Key.of(blockId); + } else { + throw new IllegalArgumentException("Invalid block ID format: " + id); + } + } + + public static Object blockDataToBlockState(BlockData blockData) { + try { + return Reflections.field$CraftBlockData$data.get(blockData); + } catch (ReflectiveOperationException e) { + throw new RuntimeException(e); + } + } + + public static Object idToBlockState(int id) { + try { + return Reflections.method$IdMapper$byId.invoke(Reflections.instance$BLOCK_STATE_REGISTRY, id); + } catch (ReflectiveOperationException e) { + throw new RuntimeException(e); + } + } + + public static int blockStateToId(Object blockState) { + try { + return (int) Reflections.method$IdMapper$getId.invoke(Reflections.instance$BLOCK_STATE_REGISTRY, blockState); + } catch (ReflectiveOperationException e) { + throw new RuntimeException(e); + } + } + + public static Object getBlockOwner(Object blockState) { + try { + return Reflections.field$StateHolder$owner.get(blockState); + } catch (ReflectiveOperationException e) { + throw new RuntimeException(e); + } + } + + public static int physicsEventToId(BlockPhysicsEvent event) throws ReflectiveOperationException { + Object blockData = Reflections.field$BlockPhysicsEvent$changed.get(event); + Object blockState = Reflections.field$CraftBlockData$data.get(blockData); + return (int) Reflections.method$IdMapper$getId.invoke(Reflections.instance$BLOCK_STATE_REGISTRY, blockState); + } + + public static Object physicsEventToState(BlockPhysicsEvent event) throws ReflectiveOperationException { + Object blockData = Reflections.field$BlockPhysicsEvent$changed.get(event); + return Reflections.field$CraftBlockData$data.get(blockData); + } + + public static void setLightEmission(Object state, int emission) throws ReflectiveOperationException { + Reflections.field$BlockStateBase$lightEmission.set(state, emission); + } + + public static int getLightEmission(Object state) throws ReflectiveOperationException { + return (int) Reflections.field$BlockStateBase$lightEmission.get(state); + } + + public static void setMapColor(Object state, MapColor color) throws ReflectiveOperationException { + Object mcMapColor = Reflections.method$MapColor$byId.invoke(null, color.id); + Reflections.field$BlockStateBase$mapColor.set(state, mcMapColor); + } + + public static void setInstrument(Object state, Instrument instrument) throws ReflectiveOperationException { + Object mcInstrument = ((Object[]) Reflections.method$NoteBlockInstrument$values.invoke(null))[instrument.ordinal()]; + Reflections.field$BlockStateBase$instrument.set(state, mcInstrument); + } + + public static void setHardness(Object state, float hardness) throws ReflectiveOperationException { + Reflections.field$BlockStateBase$hardness.set(state, hardness); + } + + public static void setBurnable(Object state, boolean burnable) throws ReflectiveOperationException { + Reflections.field$BlockStateBase$burnable.set(state, burnable); + } + + public static void setPushReaction(Object state, PushReaction reaction) throws ReflectiveOperationException { + Object pushReaction = ((Object[]) Reflections.method$PushReaction$values.invoke(null))[reaction.ordinal()]; + Reflections.field$BlockStateBase$pushReaction.set(state, pushReaction); + } + + public static void setIsRandomlyTicking(Object state, boolean randomlyTicking) throws ReflectiveOperationException { + Reflections.field$BlockStateBase$isRandomlyTicking.set(state, randomlyTicking); + } + + public static void setReplaceable(Object state, boolean replaceable) throws ReflectiveOperationException { + Reflections.field$BlockStateBase$replaceable.set(state, replaceable); + } + + public static boolean isReplaceable(Object state) throws ReflectiveOperationException { + return (boolean) Reflections.field$BlockStateBase$replaceable.get(state); + } + + public static void setCanOcclude(Object state, boolean canOcclude) throws ReflectiveOperationException { + Reflections.field$BlockStateBase$canOcclude.set(state, canOcclude); + } + + public static boolean isOcclude(Object state) throws ReflectiveOperationException { + return (boolean) Reflections.field$BlockStateBase$canOcclude.get(state); + } + + public static void setIsRedstoneConductor(Object state, Object predicate) throws ReflectiveOperationException { + Reflections.field$BlockStateBase$isRedstoneConductor.set(state, predicate); + } + + public static void setIsSuffocating(Object state, Object predicate) throws ReflectiveOperationException { + Reflections.field$BlockStateBase$isSuffocating.set(state, predicate); + } + + public static void setIsViewBlocking(Object state, Object predicate) throws ReflectiveOperationException { + Reflections.field$BlockStateBase$isViewBlocking.set(state, predicate); + } + + public static boolean isClientSideNoteBlock(Object state) { + return CLIENT_SIDE_NOTE_BLOCKS.containsKey(state); + } + + public static boolean isVanillaBlock(Object state) { + int id = blockStateToId(state); + return id >= 0 && id < vanillaStateSize; + } + + public static boolean isVanillaBlock(int id) { + return id >= 0 && id < vanillaStateSize; + } + + public static int vanillaStateSize() { + return vanillaStateSize; + } +} diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/util/BlockTags.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/util/BlockTags.java new file mode 100644 index 000000000..9642e8cfd --- /dev/null +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/util/BlockTags.java @@ -0,0 +1,27 @@ +package net.momirealms.craftengine.bukkit.util; + +import net.momirealms.craftengine.core.util.Key; + +import java.util.HashMap; +import java.util.Map; + +public class BlockTags { + private static final Map CACHE = new HashMap<>(); + + private BlockTags() {} + + public static Object getOrCreate(Key key) { + Object value = CACHE.get(key); + if (value == null) { + try { + value = Reflections.method$TagKey$create.invoke(null, Reflections.instance$Registries$BLOCK, Reflections.method$ResourceLocation$fromNamespaceAndPath.invoke(null, key.namespace(), key.value())); + CACHE.put(key, value); + return value; + } catch (Exception e) { + throw new RuntimeException("Failed to create block tag: " + key, e); + } + } else { + return value; + } + } +} diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/util/BukkitReflectionUtils.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/util/BukkitReflectionUtils.java new file mode 100644 index 000000000..9bd26a702 --- /dev/null +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/util/BukkitReflectionUtils.java @@ -0,0 +1,69 @@ +package net.momirealms.craftengine.bukkit.util; + +import net.momirealms.craftengine.core.util.ReflectionUtils; +import org.bukkit.Bukkit; + +import java.lang.reflect.Method; +import java.util.Objects; + +public final class BukkitReflectionUtils { + private static final String PREFIX_MC = "net.minecraft."; + private static final String PREFIX_CRAFTBUKKIT = "org.bukkit.craftbukkit"; + private static final String CRAFT_SERVER = "CraftServer"; + private static final String CB_PKG_VERSION; + public static final int MAJOR_REVISION; + + private BukkitReflectionUtils() {} + + static { + final Class serverClass; + if (Bukkit.getServer() == null) { + // Paper plugin Bootstrapper 1.20.6+ + serverClass = Objects.requireNonNull(ReflectionUtils.getClazz("org.bukkit.craftbukkit.CraftServer")); + } else { + serverClass = Bukkit.getServer().getClass(); + } + final String pkg = serverClass.getPackage().getName(); + final String nmsVersion = pkg.substring(pkg.lastIndexOf(".") + 1); + if (!nmsVersion.contains("_")) { + int fallbackVersion = -1; + if (Bukkit.getServer() != null) { + try { + final Method getMinecraftVersion = serverClass.getDeclaredMethod("getMinecraftVersion"); + fallbackVersion = Integer.parseInt(getMinecraftVersion.invoke(Bukkit.getServer()).toString().split("\\.")[1]); + } catch (final Exception ignored) { + } + } else { + // Paper plugin bootstrapper 1.20.6+ + try { + final Class sharedConstants = Objects.requireNonNull(ReflectionUtils.getClazz("net.minecraft.SharedConstants")); + final Method getCurrentVersion = sharedConstants.getDeclaredMethod("getCurrentVersion"); + final Object currentVersion = getCurrentVersion.invoke(null); + final Method getName = currentVersion.getClass().getDeclaredMethod("getName"); + final String versionName = (String) getName.invoke(currentVersion); + try { + fallbackVersion = Integer.parseInt(versionName.split("\\.")[1]); + } catch (final Exception ignored) { + } + } catch (final ReflectiveOperationException e) { + throw new RuntimeException(e); + } + } + MAJOR_REVISION = fallbackVersion; + } else { + MAJOR_REVISION = Integer.parseInt(nmsVersion.split("_")[1]); + } + String name = serverClass.getName(); + name = name.substring(PREFIX_CRAFTBUKKIT.length()); + name = name.substring(0, name.length() - CRAFT_SERVER.length()); + CB_PKG_VERSION = name; + } + + public static String assembleCBClass(String className) { + return PREFIX_CRAFTBUKKIT + CB_PKG_VERSION + className; + } + + public static String assembleMCClass(String className) { + return PREFIX_MC + className; + } +} diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/util/ComponentUtils.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/util/ComponentUtils.java new file mode 100644 index 000000000..ac86735e0 --- /dev/null +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/util/ComponentUtils.java @@ -0,0 +1,27 @@ +package net.momirealms.craftengine.bukkit.util; + +import net.kyori.adventure.text.Component; +import net.momirealms.craftengine.core.util.AdventureHelper; +import net.momirealms.craftengine.core.util.VersionHelper; + +public class ComponentUtils { + + private ComponentUtils() {} + + public static Object adventureToMinecraft(Component component) { + String json = AdventureHelper.componentToJson(component); + if (VersionHelper.isVersionNewerThan1_20_5()) { + try { + return Reflections.method$Component$Serializer$fromJson.invoke(null, json, Reflections.instance$MinecraftRegistry); + } catch (ReflectiveOperationException e) { + throw new RuntimeException(e); + } + } else { + try { + return Reflections.method$CraftChatMessage$fromJSON.invoke(null, json); + } catch (ReflectiveOperationException e) { + throw new RuntimeException(e); + } + } + } +} diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/util/DirectionUtils.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/util/DirectionUtils.java new file mode 100644 index 000000000..25d566d1e --- /dev/null +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/util/DirectionUtils.java @@ -0,0 +1,32 @@ +package net.momirealms.craftengine.bukkit.util; + +import net.momirealms.craftengine.core.util.Direction; +import org.bukkit.block.BlockFace; + +public class DirectionUtils { + + private DirectionUtils() {} + + public static Direction toDirection(BlockFace face) { + return switch (face) { + case UP -> Direction.UP; + case DOWN -> Direction.DOWN; + case NORTH -> Direction.NORTH; + case SOUTH -> Direction.SOUTH; + case WEST -> Direction.WEST; + case EAST -> Direction.EAST; + default -> throw new IllegalStateException("Unexpected value: " + face); + }; + } + + public static BlockFace toBlockFace(Direction direction) { + return switch (direction) { + case UP -> BlockFace.UP; + case DOWN -> BlockFace.DOWN; + case NORTH -> BlockFace.NORTH; + case SOUTH -> BlockFace.SOUTH; + case WEST -> BlockFace.WEST; + case EAST -> BlockFace.EAST; + }; + } +} diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/util/EnchantmentUtils.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/util/EnchantmentUtils.java new file mode 100644 index 000000000..f184091e8 --- /dev/null +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/util/EnchantmentUtils.java @@ -0,0 +1,23 @@ +package net.momirealms.craftengine.bukkit.util; + +import java.util.HashMap; +import java.util.Map; + +public class EnchantmentUtils { + + private EnchantmentUtils() {} + + @SuppressWarnings("unchecked") + public static Map toMap(Object itemEnchantments) throws ReflectiveOperationException { + Map map = new HashMap<>(); + Map enchantments = (Map) Reflections.field$ItemEnchantments$enchantments.get(itemEnchantments); + + for (Map.Entry entry : enchantments.entrySet()) { + Object holder = entry.getKey(); + String name = (String) Reflections.method$Holder$getRegisteredName.invoke(holder); + int level = entry.getValue(); + map.put(name, level); + } + return map; + } +} diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/util/EntityDataUtils.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/util/EntityDataUtils.java new file mode 100644 index 000000000..dc4bafc43 --- /dev/null +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/util/EntityDataUtils.java @@ -0,0 +1,84 @@ +package net.momirealms.craftengine.bukkit.util; + +public class EntityDataUtils { + + private EntityDataUtils() {} + + private static final int HAS_SHADOW = 0x01; // 1 + private static final int IS_SEE_THROUGH = 0x02; // 2 + private static final int USE_DEFAULT_BACKGROUND = 0x04; // 4 + private static final int LEFT_ALIGNMENT = 0x08; // 8 + private static final int RIGHT_ALIGNMENT = 0x10; // 16 + + public static byte encodeTextDisplayMask(boolean hasShadow, boolean isSeeThrough, boolean useDefaultBackground, int alignment) { + int bitMask = 0; + if (hasShadow) { + bitMask |= HAS_SHADOW; + } + if (isSeeThrough) { + bitMask |= IS_SEE_THROUGH; + } + if (useDefaultBackground) { + bitMask |= USE_DEFAULT_BACKGROUND; + } + switch (alignment) { + case 0: // CENTER + break; + case 1: // LEFT + bitMask |= LEFT_ALIGNMENT; + break; + case 2: // RIGHT + bitMask |= RIGHT_ALIGNMENT; + break; + default: + throw new IllegalArgumentException("Invalid alignment value"); + } + return (byte) bitMask; + } + + private static final int IS_ON_FIRE = 0x01; // 1 + private static final int IS_CROUCHING = 0x02; // 2 + private static final int UNUSED = 0x04; // 4 + private static final int IS_SPRINTING = 0x08; // 8 + private static final int IS_SWIMMING = 0x10; // 16 + private static final int IS_INVISIBLE = 0x20; // 32 + private static final int HAS_GLOWING_EFFECT = 0x40; // 64 + private static final int IS_FLYING_WITH_ELYTRA = 0x80; // 128 + + public static byte encodeCommonMask(boolean isOnFire, boolean isCrouching, boolean isUnused, + boolean isSprinting, boolean isSwimming, boolean isInvisible, + boolean hasGlowingEffect, boolean isFlyingWithElytra) { + int bitMask = 0; + + if (isOnFire) { + bitMask |= IS_ON_FIRE; + } + if (isCrouching) { + bitMask |= IS_CROUCHING; + } + if (isUnused) { + bitMask |= UNUSED; + } + if (isSprinting) { + bitMask |= IS_SPRINTING; + } + if (isSwimming) { + bitMask |= IS_SWIMMING; + } + if (isInvisible) { + bitMask |= IS_INVISIBLE; + } + if (hasGlowingEffect) { + bitMask |= HAS_GLOWING_EFFECT; + } + if (isFlyingWithElytra) { + bitMask |= IS_FLYING_WITH_ELYTRA; + } + + return (byte) bitMask; + } + + public static boolean isCrouching(byte mask) { + return (mask & IS_CROUCHING) != 0; + } +} diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/util/EntityUtils.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/util/EntityUtils.java new file mode 100644 index 000000000..cb44a126b --- /dev/null +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/util/EntityUtils.java @@ -0,0 +1,37 @@ +package net.momirealms.craftengine.bukkit.util; + +import net.momirealms.craftengine.core.world.BlockPos; +import org.bukkit.Location; +import org.bukkit.World; +import org.bukkit.entity.Entity; +import org.bukkit.entity.EntityType; +import org.bukkit.entity.Player; +import org.bukkit.event.entity.CreatureSpawnEvent; + +public class EntityUtils { + + private EntityUtils() {} + + public static BlockPos getOnPos(Player player) { + try { + Object serverPlayer = Reflections.method$CraftPlayer$getHandle.invoke(player); + Object blockPos = Reflections.method$Entity$getOnPos.invoke(serverPlayer, 1.0E-5F); + return new BlockPos( + (int) Reflections.field$Vec3i$x.get(blockPos), + (int) Reflections.field$Vec3i$y.get(blockPos), + (int) Reflections.field$Vec3i$z.get(blockPos) + ); + } catch (ReflectiveOperationException e) { + throw new RuntimeException(e); + } + } + + @SuppressWarnings("deprecation") + public static Entity spawnEntity(World world, Location loc, EntityType type, org.bukkit.util.Consumer function) { + try { + return (Entity) Reflections.method$World$spawnEntity.invoke(world, loc, type, CreatureSpawnEvent.SpawnReason.CUSTOM, function); + } catch (ReflectiveOperationException e) { + throw new RuntimeException("Failed to spawn entity", e); + } + } +} diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/util/EventUtils.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/util/EventUtils.java new file mode 100644 index 000000000..2a09a636b --- /dev/null +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/util/EventUtils.java @@ -0,0 +1,21 @@ +package net.momirealms.craftengine.bukkit.util; + +import org.bukkit.Bukkit; +import org.bukkit.event.Cancellable; +import org.bukkit.event.Event; + +public class EventUtils { + + private EventUtils() {} + + public static void fireAndForget(Event event) { + Bukkit.getPluginManager().callEvent(event); + } + + public static boolean fireAndCheckCancel(Event event) { + if (!(event instanceof Cancellable cancellable)) + throw new IllegalArgumentException("Only cancellable events are allowed here"); + Bukkit.getPluginManager().callEvent(event); + return cancellable.isCancelled(); + } +} diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/util/FeatureUtils.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/util/FeatureUtils.java new file mode 100644 index 000000000..5cea4c373 --- /dev/null +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/util/FeatureUtils.java @@ -0,0 +1,16 @@ +package net.momirealms.craftengine.bukkit.util; + +import net.momirealms.craftengine.core.util.Key; + +public class FeatureUtils { + + private FeatureUtils() {} + + public static Object createFeatureKey(Key id) { + try { + return Reflections.method$ResourceKey$create.invoke(null, Reflections.instance$Registries$CONFIGURED_FEATURE, Reflections.method$ResourceLocation$fromNamespaceAndPath.invoke(null, id.namespace(), id.value())); + } catch (ReflectiveOperationException e) { + throw new RuntimeException(e); + } + } +} diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/util/InteractUtils.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/util/InteractUtils.java new file mode 100644 index 000000000..f41f5437a --- /dev/null +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/util/InteractUtils.java @@ -0,0 +1,287 @@ +package net.momirealms.craftengine.bukkit.util; + +import net.momirealms.craftengine.bukkit.item.recipe.BukkitRecipeManager; +import net.momirealms.craftengine.core.block.BlockKeys; +import net.momirealms.craftengine.core.item.Item; +import net.momirealms.craftengine.core.item.recipe.OptimizedIDItem; +import net.momirealms.craftengine.core.item.recipe.RecipeTypes; +import net.momirealms.craftengine.core.item.recipe.input.SingleItemInput; +import net.momirealms.craftengine.core.plugin.CraftEngine; +import net.momirealms.craftengine.core.plugin.config.ConfigManager; +import net.momirealms.craftengine.core.registry.BuiltInRegistries; +import net.momirealms.craftengine.core.registry.Holder; +import net.momirealms.craftengine.core.util.Direction; +import net.momirealms.craftengine.core.util.Key; +import net.momirealms.craftengine.core.util.QuadFunction; +import net.momirealms.craftengine.core.world.BlockHitResult; +import net.momirealms.craftengine.core.world.BlockPos; +import org.bukkit.block.data.BlockData; +import org.bukkit.block.data.type.Bell; +import org.bukkit.entity.Player; +import org.bukkit.inventory.ItemStack; + +import java.util.HashMap; +import java.util.Map; +import java.util.Optional; + +public class InteractUtils { + private static final Map, BlockData, BlockHitResult, Boolean>> INTERACTIONS = new HashMap<>(); + private static final Key NOTE_BLOCK_TOP_INSTRUMENTS = Key.of("minecraft:noteblock_top_instruments"); + + private InteractUtils() {} + + static { + register(BlockKeys.NOTE_BLOCK, (player, item, blockState, result) -> result.getDirection() != Direction.UP || !item.is(NOTE_BLOCK_TOP_INSTRUMENTS)); + register(BlockKeys.CAKE, (player, item, blockState, result) -> !canEat(player, false)); + register(BlockKeys.CANDLE_CAKE, (player, item, blockState, result) -> !canEat(player, false)); + register(BlockKeys.WHITE_CANDLE_CAKE, (player, item, blockState, result) -> !canEat(player, false)); + register(BlockKeys.ORANGE_CANDLE_CAKE, (player, item, blockState, result) -> !canEat(player, false)); + register(BlockKeys.MAGENTA_CANDLE_CAKE, (player, item, blockState, result) -> !canEat(player, false)); + register(BlockKeys.LIGHT_BLUE_CANDLE_CAKE, (player, item, blockState, result) -> !canEat(player, false)); + register(BlockKeys.YELLOW_CANDLE_CAKE, (player, item, blockState, result) -> !canEat(player, false)); + register(BlockKeys.LIME_CANDLE_CAKE, (player, item, blockState, result) -> !canEat(player, false)); + register(BlockKeys.PINK_CANDLE_CAKE, (player, item, blockState, result) -> !canEat(player, false)); + register(BlockKeys.GRAY_CANDLE_CAKE, (player, item, blockState, result) -> !canEat(player, false)); + register(BlockKeys.LIGHT_GRAY_CANDLE_CAKE, (player, item, blockState, result) -> !canEat(player, false)); + register(BlockKeys.CYAN_CANDLE_CAKE, (player, item, blockState, result) -> !canEat(player, false)); + register(BlockKeys.PURPLE_CANDLE_CAKE, (player, item, blockState, result) -> !canEat(player, false)); + register(BlockKeys.BLUE_CANDLE_CAKE, (player, item, blockState, result) -> !canEat(player, false)); + register(BlockKeys.BROWN_CANDLE_CAKE, (player, item, blockState, result) -> !canEat(player, false)); + register(BlockKeys.GREEN_CANDLE_CAKE, (player, item, blockState, result) -> !canEat(player, false)); + register(BlockKeys.RED_CANDLE_CAKE, (player, item, blockState, result) -> !canEat(player, false)); + register(BlockKeys.BLACK_CANDLE_CAKE, (player, item, blockState, result) -> !canEat(player, false)); + register(BlockKeys.BELL, (player, item, blockState, result) -> { + Direction direction = result.getDirection(); + BlockPos pos = result.getBlockPos(); + if (blockState instanceof Bell bell) { + double y = result.getLocation().y() - pos.y(); + if (direction.axis() != Direction.Axis.Y && y <= 0.8123999834060669D) { + Direction facing = DirectionUtils.toDirection(bell.getFacing()); + Bell.Attachment attachment = bell.getAttachment(); + switch (attachment) { + case FLOOR -> { + return facing.axis() == direction.axis(); + } + case DOUBLE_WALL, SINGLE_WALL -> { + return facing.axis() != direction.axis(); + } + case CEILING -> { + return true; + } + default -> { + return false; + } + } + } + } + return false; + }); + register(BlockKeys.SOUL_CAMPFIRE, (player, item, blockState, result) -> { + if (!ConfigManager.enableRecipeSystem()) return false; + Optional> optional = BuiltInRegistries.OPTIMIZED_ITEM_ID.get(item.id()); + return optional.filter(keyReference -> BukkitRecipeManager.instance().getRecipe(RecipeTypes.CAMPFIRE_COOKING, new SingleItemInput<>(new OptimizedIDItem<>( + keyReference, item.getItem() + ))) != null).isPresent(); + }); + register(BlockKeys.CAMPFIRE, (player, item, blockState, result) -> { + if (!ConfigManager.enableRecipeSystem()) return false; + Optional> optional = BuiltInRegistries.OPTIMIZED_ITEM_ID.get(item.id()); + return optional.filter(keyReference -> BukkitRecipeManager.instance().getRecipe(RecipeTypes.CAMPFIRE_COOKING, new SingleItemInput<>(new OptimizedIDItem<>( + keyReference, item.getItem() + ))) != null).isPresent(); + }); + register(BlockKeys.HOPPER, (player, item, blockState, result) -> true); + register(BlockKeys.DISPENSER, (player, item, blockState, result) -> true); + register(BlockKeys.DROPPER, (player, item, blockState, result) -> true); + register(BlockKeys.CRAFTER, (player, item, blockState, result) -> true); + register(BlockKeys.REPEATER, (player, item, blockState, result) -> true); + register(BlockKeys.COMPARATOR, (player, item, blockState, result) -> true); + register(BlockKeys.DAYLIGHT_DETECTOR, (player, item, blockState, result) -> true); + register(BlockKeys.LECTERN, (player, item, blockState, result) -> true); + register(BlockKeys.CHEST, (player, item, blockState, result) -> true); + register(BlockKeys.ENDER_CHEST, (player, item, blockState, result) -> true); + register(BlockKeys.TRAPPED_CHEST, (player, item, blockState, result) -> true); + register(BlockKeys.BEACON, (player, item, blockState, result) -> true); + register(BlockKeys.ENCHANTING_TABLE, (player, item, blockState, result) -> true); + register(BlockKeys.BREWING_STAND, (player, item, blockState, result) -> true); + register(BlockKeys.GRINDSTONE, (player, item, blockState, result) -> true); + register(BlockKeys.ANVIL, (player, item, blockState, result) -> true); + register(BlockKeys.CHIPPED_ANVIL, (player, item, blockState, result) -> true); + register(BlockKeys.DAMAGED_ANVIL, (player, item, blockState, result) -> true); + register(BlockKeys.FURNACE, (player, item, blockState, result) -> true); + register(BlockKeys.CRAFTING_TABLE, (player, item, blockState, result) -> true); + register(BlockKeys.STONECUTTER, (player, item, blockState, result) -> true); + register(BlockKeys.SMITHING_TABLE, (player, item, blockState, result) -> true); + register(BlockKeys.LOOM, (player, item, blockState, result) -> true); + register(BlockKeys.BARREL, (player, item, blockState, result) -> true); + register(BlockKeys.SMOKER, (player, item, blockState, result) -> true); + register(BlockKeys.BLAST_FURNACE, (player, item, blockState, result) -> true); + register(BlockKeys.LEVER, (player, item, blockState, result) -> true); + register(BlockKeys.OAK_BUTTON, (player, item, blockState, result) -> true); + register(BlockKeys.SPRUCE_BUTTON, (player, item, blockState, result) -> true); + register(BlockKeys.BIRCH_BUTTON, (player, item, blockState, result) -> true); + register(BlockKeys.JUNGLE_BUTTON, (player, item, blockState, result) -> true); + register(BlockKeys.ACACIA_BUTTON, (player, item, blockState, result) -> true); + register(BlockKeys.CHERRY_BUTTON, (player, item, blockState, result) -> true); + register(BlockKeys.DARK_OAK_BUTTON, (player, item, blockState, result) -> true); + register(BlockKeys.PALE_OAK_BUTTON, (player, item, blockState, result) -> true); + register(BlockKeys.MANGROVE_BUTTON, (player, item, blockState, result) -> true); + register(BlockKeys.BAMBOO_BUTTON, (player, item, blockState, result) -> true); + register(BlockKeys.OAK_TRAPDOOR, (player, item, blockState, result) -> true); + register(BlockKeys.SPRUCE_TRAPDOOR, (player, item, blockState, result) -> true); + register(BlockKeys.BIRCH_TRAPDOOR, (player, item, blockState, result) -> true); + register(BlockKeys.JUNGLE_TRAPDOOR, (player, item, blockState, result) -> true); + register(BlockKeys.ACACIA_TRAPDOOR, (player, item, blockState, result) -> true); + register(BlockKeys.CHERRY_TRAPDOOR, (player, item, blockState, result) -> true); + register(BlockKeys.DARK_OAK_TRAPDOOR, (player, item, blockState, result) -> true); + register(BlockKeys.PALE_OAK_TRAPDOOR, (player, item, blockState, result) -> true); + register(BlockKeys.MANGROVE_TRAPDOOR, (player, item, blockState, result) -> true); + register(BlockKeys.BAMBOO_TRAPDOOR, (player, item, blockState, result) -> true); + register(BlockKeys.CRIMSON_TRAPDOOR, (player, item, blockState, result) -> true); + register(BlockKeys.WARPED_TRAPDOOR, (player, item, blockState, result) -> true); + register(BlockKeys.OAK_DOOR, (player, item, blockState, result) -> true); + register(BlockKeys.SPRUCE_DOOR, (player, item, blockState, result) -> true); + register(BlockKeys.BIRCH_DOOR, (player, item, blockState, result) -> true); + register(BlockKeys.JUNGLE_DOOR, (player, item, blockState, result) -> true); + register(BlockKeys.ACACIA_DOOR, (player, item, blockState, result) -> true); + register(BlockKeys.CHERRY_DOOR, (player, item, blockState, result) -> true); + register(BlockKeys.DARK_OAK_DOOR, (player, item, blockState, result) -> true); + register(BlockKeys.PALE_OAK_DOOR, (player, item, blockState, result) -> true); + register(BlockKeys.MANGROVE_DOOR, (player, item, blockState, result) -> true); + register(BlockKeys.BAMBOO_DOOR, (player, item, blockState, result) -> true); + register(BlockKeys.CRIMSON_DOOR, (player, item, blockState, result) -> true); + register(BlockKeys.WARPED_DOOR, (player, item, blockState, result) -> true); + register(BlockKeys.COPPER_DOOR, (player, item, blockState, result) -> true); + register(BlockKeys.EXPOSED_COPPER_DOOR, (player, item, blockState, result) -> true); + register(BlockKeys.OXIDIZED_COPPER_DOOR, (player, item, blockState, result) -> true); + register(BlockKeys.WEATHERED_COPPER_DOOR, (player, item, blockState, result) -> true); + register(BlockKeys.WAXED_COPPER_DOOR, (player, item, blockState, result) -> true); + register(BlockKeys.WAXED_EXPOSED_COPPER_DOOR, (player, item, blockState, result) -> true); + register(BlockKeys.WAXED_OXIDIZED_COPPER_DOOR, (player, item, blockState, result) -> true); + register(BlockKeys.WAXED_WEATHERED_COPPER_DOOR, (player, item, blockState, result) -> true); + register(BlockKeys.COPPER_TRAPDOOR, (player, item, blockState, result) -> true); + register(BlockKeys.EXPOSED_COPPER_TRAPDOOR, (player, item, blockState, result) -> true); + register(BlockKeys.OXIDIZED_COPPER_TRAPDOOR, (player, item, blockState, result) -> true); + register(BlockKeys.WEATHERED_COPPER_TRAPDOOR, (player, item, blockState, result) -> true); + register(BlockKeys.WAXED_COPPER_TRAPDOOR, (player, item, blockState, result) -> true); + register(BlockKeys.WAXED_EXPOSED_COPPER_TRAPDOOR, (player, item, blockState, result) -> true); + register(BlockKeys.WAXED_OXIDIZED_COPPER_TRAPDOOR, (player, item, blockState, result) -> true); + register(BlockKeys.WAXED_WEATHERED_COPPER_TRAPDOOR, (player, item, blockState, result) -> true); + register(BlockKeys.OAK_FENCE_GATE, (player, item, blockState, result) -> true); + register(BlockKeys.SPRUCE_FENCE_GATE, (player, item, blockState, result) -> true); + register(BlockKeys.BIRCH_FENCE_GATE, (player, item, blockState, result) -> true); + register(BlockKeys.JUNGLE_FENCE_GATE, (player, item, blockState, result) -> true); + register(BlockKeys.ACACIA_FENCE_GATE, (player, item, blockState, result) -> true); + register(BlockKeys.CHERRY_FENCE_GATE, (player, item, blockState, result) -> true); + register(BlockKeys.DARK_OAK_FENCE_GATE, (player, item, blockState, result) -> true); + register(BlockKeys.PALE_OAK_FENCE_GATE, (player, item, blockState, result) -> true); + register(BlockKeys.MANGROVE_FENCE_GATE, (player, item, blockState, result) -> true); + register(BlockKeys.BAMBOO_FENCE_GATE, (player, item, blockState, result) -> true); + register(BlockKeys.CRIMSON_FENCE_GATE, (player, item, blockState, result) -> true); + register(BlockKeys.WARPED_FENCE_GATE, (player, item, blockState, result) -> true); + register(BlockKeys.OAK_SIGN, (player, item, blockState, result) -> true); + register(BlockKeys.SPRUCE_SIGN, (player, item, blockState, result) -> true); + register(BlockKeys.ACACIA_SIGN, (player, item, blockState, result) -> true); + register(BlockKeys.BIRCH_SIGN, (player, item, blockState, result) -> true); + register(BlockKeys.CHERRY_SIGN, (player, item, blockState, result) -> true); + register(BlockKeys.JUNGLE_SIGN, (player, item, blockState, result) -> true); + register(BlockKeys.DARK_OAK_SIGN, (player, item, blockState, result) -> true); + register(BlockKeys.PALE_OAK_SIGN, (player, item, blockState, result) -> true); + register(BlockKeys.MANGROVE_SIGN, (player, item, blockState, result) -> true); + register(BlockKeys.BAMBOO_SIGN, (player, item, blockState, result) -> true); + register(BlockKeys.WARPED_SIGN, (player, item, blockState, result) -> true); + register(BlockKeys.CRIMSON_SIGN, (player, item, blockState, result) -> true); + register(BlockKeys.OAK_WALL_SIGN, (player, item, blockState, result) -> true); + register(BlockKeys.SPRUCE_WALL_SIGN, (player, item, blockState, result) -> true); + register(BlockKeys.BIRCH_WALL_SIGN, (player, item, blockState, result) -> true); + register(BlockKeys.ACACIA_WALL_SIGN, (player, item, blockState, result) -> true); + register(BlockKeys.CHERRY_WALL_SIGN, (player, item, blockState, result) -> true); + register(BlockKeys.JUNGLE_WALL_SIGN, (player, item, blockState, result) -> true); + register(BlockKeys.DARK_OAK_WALL_SIGN, (player, item, blockState, result) -> true); + register(BlockKeys.PALE_OAK_WALL_SIGN, (player, item, blockState, result) -> true); + register(BlockKeys.MANGROVE_WALL_SIGN, (player, item, blockState, result) -> true); + register(BlockKeys.BAMBOO_WALL_SIGN, (player, item, blockState, result) -> true); + register(BlockKeys.CRIMSON_WALL_SIGN, (player, item, blockState, result) -> true); + register(BlockKeys.WARPED_WALL_SIGN, (player, item, blockState, result) -> true); + register(BlockKeys.OAK_HANGING_SIGN, (player, item, blockState, result) -> true); + register(BlockKeys.SPRUCE_HANGING_SIGN, (player, item, blockState, result) -> true); + register(BlockKeys.BIRCH_HANGING_SIGN, (player, item, blockState, result) -> true); + register(BlockKeys.ACACIA_HANGING_SIGN, (player, item, blockState, result) -> true); + register(BlockKeys.CHERRY_HANGING_SIGN, (player, item, blockState, result) -> true); + register(BlockKeys.JUNGLE_HANGING_SIGN, (player, item, blockState, result) -> true); + register(BlockKeys.DARK_OAK_HANGING_SIGN, (player, item, blockState, result) -> true); + register(BlockKeys.PALE_OAK_HANGING_SIGN, (player, item, blockState, result) -> true); + register(BlockKeys.CRIMSON_HANGING_SIGN, (player, item, blockState, result) -> true); + register(BlockKeys.WARPED_HANGING_SIGN, (player, item, blockState, result) -> true); + register(BlockKeys.MANGROVE_HANGING_SIGN, (player, item, blockState, result) -> true); + register(BlockKeys.BAMBOO_HANGING_SIGN, (player, item, blockState, result) -> true); + register(BlockKeys.OAK_WALL_HANGING_SIGN, (player, item, blockState, result) -> true); + register(BlockKeys.SPRUCE_WALL_HANGING_SIGN, (player, item, blockState, result) -> true); + register(BlockKeys.BIRCH_WALL_HANGING_SIGN, (player, item, blockState, result) -> true); + register(BlockKeys.ACACIA_WALL_HANGING_SIGN, (player, item, blockState, result) -> true); + register(BlockKeys.CHERRY_WALL_HANGING_SIGN, (player, item, blockState, result) -> true); + register(BlockKeys.JUNGLE_WALL_HANGING_SIGN, (player, item, blockState, result) -> true); + register(BlockKeys.DARK_OAK_WALL_HANGING_SIGN, (player, item, blockState, result) -> true); + register(BlockKeys.PALE_OAK_WALL_HANGING_SIGN, (player, item, blockState, result) -> true); + register(BlockKeys.MANGROVE_WALL_HANGING_SIGN, (player, item, blockState, result) -> true); + register(BlockKeys.CRIMSON_WALL_HANGING_SIGN, (player, item, blockState, result) -> true); + register(BlockKeys.WARPED_WALL_HANGING_SIGN, (player, item, blockState, result) -> true); + register(BlockKeys.BAMBOO_WALL_HANGING_SIGN, (player, item, blockState, result) -> true); + register(BlockKeys.SHULKER_BOX, (player, item, blockState, result) -> true); + register(BlockKeys.WHITE_SHULKER_BOX, (player, item, blockState, result) -> true); + register(BlockKeys.ORANGE_SHULKER_BOX, (player, item, blockState, result) -> true); + register(BlockKeys.MAGENTA_SHULKER_BOX, (player, item, blockState, result) -> true); + register(BlockKeys.LIGHT_BLUE_SHULKER_BOX, (player, item, blockState, result) -> true); + register(BlockKeys.YELLOW_SHULKER_BOX, (player, item, blockState, result) -> true); + register(BlockKeys.LIME_SHULKER_BOX, (player, item, blockState, result) -> true); + register(BlockKeys.PINK_SHULKER_BOX, (player, item, blockState, result) -> true); + register(BlockKeys.GRAY_SHULKER_BOX, (player, item, blockState, result) -> true); + register(BlockKeys.LIGHT_GRAY_SHULKER_BOX, (player, item, blockState, result) -> true); + register(BlockKeys.CYAN_SHULKER_BOX, (player, item, blockState, result) -> true); + register(BlockKeys.PURPLE_SHULKER_BOX, (player, item, blockState, result) -> true); + register(BlockKeys.BLUE_SHULKER_BOX, (player, item, blockState, result) -> true); + register(BlockKeys.BROWN_SHULKER_BOX, (player, item, blockState, result) -> true); + register(BlockKeys.GREEN_SHULKER_BOX, (player, item, blockState, result) -> true); + register(BlockKeys.RED_SHULKER_BOX, (player, item, blockState, result) -> true); + register(BlockKeys.BLACK_SHULKER_BOX, (player, item, blockState, result) -> true); + register(BlockKeys.WHITE_BED, (player, item, blockState, result) -> true); + register(BlockKeys.ORANGE_BED, (player, item, blockState, result) -> true); + register(BlockKeys.MAGENTA_BED, (player, item, blockState, result) -> true); + register(BlockKeys.LIGHT_BLUE_BED, (player, item, blockState, result) -> true); + register(BlockKeys.YELLOW_BED, (player, item, blockState, result) -> true); + register(BlockKeys.LIME_BED, (player, item, blockState, result) -> true); + register(BlockKeys.PINK_BED, (player, item, blockState, result) -> true); + register(BlockKeys.GRAY_BED, (player, item, blockState, result) -> true); + register(BlockKeys.LIGHT_GRAY_BED, (player, item, blockState, result) -> true); + register(BlockKeys.CYAN_BED, (player, item, blockState, result) -> true); + register(BlockKeys.PURPLE_BED, (player, item, blockState, result) -> true); + register(BlockKeys.BLUE_BED, (player, item, blockState, result) -> true); + register(BlockKeys.BROWN_BED, (player, item, blockState, result) -> true); + register(BlockKeys.GREEN_BED, (player, item, blockState, result) -> true); + register(BlockKeys.RED_BED, (player, item, blockState, result) -> true); + register(BlockKeys.BLACK_BED, (player, item, blockState, result) -> true); + register(BlockKeys.DRAGON_EGG, (player, item, blockState, result) -> true); + register(BlockKeys.REPEATING_COMMAND_BLOCK, (player, item, blockState, result) -> true); + register(BlockKeys.CHAIN_COMMAND_BLOCK, (player, item, blockState, result) -> true); + register(BlockKeys.COMMAND_BLOCK, (player, item, blockState, result) -> true); + } + + private static void register(Key key, QuadFunction, BlockData, BlockHitResult, Boolean> function) { + var previous = INTERACTIONS.put(key, function); + if (previous != null) { + CraftEngine.instance().logger().warn("Duplicated interaction check: " + key); + } + } + + public static boolean isInteractable(Key block, org.bukkit.entity.Player player, BlockData state, BlockHitResult hit, Item item) { + if (INTERACTIONS.containsKey(block)) { + return INTERACTIONS.get(block).apply(player, item, state, hit); + } else { + return false; + } + } + + private static boolean canEat(Player player, boolean ignoreHunger) { + return ignoreHunger || player.isInvulnerable() || player.getFoodLevel() < 20; + } +} diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/util/InventoryUtils.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/util/InventoryUtils.java new file mode 100644 index 000000000..c6ade8fe1 --- /dev/null +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/util/InventoryUtils.java @@ -0,0 +1,41 @@ +package net.momirealms.craftengine.bukkit.util; + +import org.bukkit.inventory.ItemStack; +import org.bukkit.inventory.PlayerInventory; + +public class InventoryUtils { + + private InventoryUtils() {} + + public static int getSuitableHotBarSlot(PlayerInventory inventory) { + int selectedSlot = inventory.getHeldItemSlot(); + int i; + int j; + for (j = 0; j < 9; ++j) { + i = (selectedSlot + j) % 9; + if (ItemUtils.isEmpty(inventory.getItem(i))) { + return i; + } + } + for (j = 0; j < 9; ++j) { + i = (selectedSlot + j) % 9; + ItemStack item = inventory.getItem(i); + if (ItemUtils.isEmpty(item) || item.getEnchantments().isEmpty()) { + return i; + } + } + return selectedSlot; + } + + public static int findMatchingItemSlot(PlayerInventory inventory, ItemStack itemStack) { + ItemStack[] items = inventory.getStorageContents(); + for (int i = 0; i < items.length; ++i) { + ItemStack stack = items[i]; + if (ItemUtils.isEmpty(stack)) continue; + if (stack.isSimilar(itemStack)) { + return i; + } + } + return -1; + } +} diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/util/ItemTags.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/util/ItemTags.java new file mode 100644 index 000000000..4ff38788e --- /dev/null +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/util/ItemTags.java @@ -0,0 +1,30 @@ +package net.momirealms.craftengine.bukkit.util; + +import net.momirealms.craftengine.core.util.Key; + +import java.util.HashMap; +import java.util.Map; + +public class ItemTags { + private static final Map CACHE = new HashMap<>(); + + public static final Key AXES = Key.of("minecraft:axes"); + public static final Key SWORDS = Key.of("minecraft:swords"); + + private ItemTags() {} + + public static Object getOrCreate(Key key) { + Object value = CACHE.get(key); + if (value == null) { + try { + value = Reflections.method$TagKey$create.invoke(null, Reflections.instance$Registries$ITEM, Reflections.method$ResourceLocation$fromNamespaceAndPath.invoke(null, key.namespace(), key.value())); + CACHE.put(key, value); + return value; + } catch (Exception e) { + throw new RuntimeException("Failed to create block tag: " + key, e); + } + } else { + return value; + } + } +} diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/util/ItemUtils.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/util/ItemUtils.java new file mode 100644 index 000000000..1841169e8 --- /dev/null +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/util/ItemUtils.java @@ -0,0 +1,36 @@ +package net.momirealms.craftengine.bukkit.util; + +import net.momirealms.craftengine.bukkit.item.BukkitItemManager; +import org.bukkit.Material; +import org.bukkit.inventory.ItemStack; +import org.jetbrains.annotations.Contract; + +public class ItemUtils { + + private ItemUtils() {} + + @Contract("null -> true") + public static boolean isEmpty(final ItemStack item) { + if (item == null) return true; + if (item.getType() == Material.AIR) return true; + return item.getAmount() == 0; + } + + public static boolean hasCustomItem(ItemStack[] stack) { + for (ItemStack itemStack : stack) { + if (!ItemUtils.isEmpty(itemStack)) { + if (BukkitItemManager.instance().wrap(itemStack).customId().isPresent()) { + return true; + } + } + } + return false; + } + + public static boolean isCustomItem(ItemStack stack) { + if (!ItemUtils.isEmpty(stack)) { + return BukkitItemManager.instance().wrap(stack).customId().isPresent(); + } + return false; + } +} diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/util/KeyUtils.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/util/KeyUtils.java new file mode 100644 index 000000000..6c60650df --- /dev/null +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/util/KeyUtils.java @@ -0,0 +1,17 @@ +package net.momirealms.craftengine.bukkit.util; + +import net.momirealms.craftengine.core.util.Key; +import org.bukkit.NamespacedKey; + +public class KeyUtils { + + private KeyUtils() {} + + public static Key namespacedKey2Key(NamespacedKey key) { + return Key.of(key.namespace(), key.value()); + } + + public static Key adventureKey2Key(net.kyori.adventure.key.Key key) { + return Key.of(key.namespace(), key.value()); + } +} diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/util/LightUtils.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/util/LightUtils.java new file mode 100644 index 000000000..11d772e19 --- /dev/null +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/util/LightUtils.java @@ -0,0 +1,39 @@ +package net.momirealms.craftengine.bukkit.util; + +import net.momirealms.craftengine.core.plugin.CraftEngine; +import org.bukkit.World; + +import java.util.BitSet; +import java.util.List; +import java.util.Map; + +public class LightUtils { + + private LightUtils() {} + + public static void updateChunkLight(World world, Map sectionPosSet) { + try { + Object serverLevel = Reflections.field$CraftWorld$ServerLevel.get(world); + Object chunkSource = Reflections.field$ServerLevel$chunkSource.get(serverLevel); + for (Map.Entry entry : sectionPosSet.entrySet()) { + long chunkKey = entry.getKey(); + Object chunkHolder = Reflections.method$ServerChunkCache$getVisibleChunkIfPresent.invoke(chunkSource, chunkKey); + if (chunkHolder == null) continue; + @SuppressWarnings("unchecked") + List players = (List) Reflections.method$ChunkHolder$getPlayers.invoke(chunkHolder, false); + if (players.isEmpty()) continue; + Object lightEngine = Reflections.field$ChunkHolder$lightEngine.get(chunkHolder); + BitSet blockChangedLightSectionFilter = (BitSet) Reflections.field$ChunkHolder$blockChangedLightSectionFilter.get(chunkHolder); + blockChangedLightSectionFilter.or(entry.getValue()); + BitSet skyChangedLightSectionFilter = (BitSet) Reflections.field$ChunkHolder$skyChangedLightSectionFilter.get(chunkHolder); + Object chunkPos = Reflections.constructor$ChunkPos.newInstance((int) chunkKey, (int) (chunkKey >> 32)); + Object lightPacket = Reflections.constructor$ClientboundLightUpdatePacket.newInstance(chunkPos, lightEngine, skyChangedLightSectionFilter, blockChangedLightSectionFilter); + Reflections.method$ChunkHolder$broadcast.invoke(chunkHolder, players, lightPacket); + blockChangedLightSectionFilter.clear(); + skyChangedLightSectionFilter.clear(); + } + } catch (Exception e) { + CraftEngine.instance().logger().warn("Could not update light for world " + world.getName()); + } + } +} diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/util/LocationUtils.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/util/LocationUtils.java new file mode 100644 index 000000000..4fa7782e9 --- /dev/null +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/util/LocationUtils.java @@ -0,0 +1,78 @@ +package net.momirealms.craftengine.bukkit.util; + +import net.momirealms.craftengine.core.world.BlockPos; +import net.momirealms.craftengine.core.world.Vec3d; +import org.bukkit.Location; +import org.jetbrains.annotations.NotNull; + +public class LocationUtils { + + private LocationUtils() {} + + public static Vec3d toVec3d(Location loc) { + return new Vec3d(loc.getX(), loc.getY(), loc.getZ()); + } + + public static Object toBlockPos(BlockPos pos) { + try { + return Reflections.constructor$BlockPos.newInstance(pos.x(), pos.y(), pos.z()); + } catch (ReflectiveOperationException e) { + throw new RuntimeException("Failed to create BlockPos", e); + } + } + + public static Object toBlockPos(int x, int y, int z) { + try { + return Reflections.constructor$BlockPos.newInstance(x, y, z); + } catch (ReflectiveOperationException e) { + throw new RuntimeException("Failed to create BlockPos", e); + } + } + + + public static BlockPos toBlockPos(Location pos) { + return new BlockPos(pos.getBlockX(), pos.getBlockY(), pos.getBlockZ()); + } + + public static BlockPos fromBlockPos(Object pos) throws ReflectiveOperationException { + return new BlockPos( + Reflections.field$Vec3i$x.getInt(pos), + Reflections.field$Vec3i$y.getInt(pos), + Reflections.field$Vec3i$z.getInt(pos) + ); + } + + public static double getDistance(Location location1, Location location2) { + return Math.sqrt(Math.pow(location2.getX() - location1.getX(), 2) + + Math.pow(location2.getY() - location1.getY(), 2) + + Math.pow(location2.getZ() - location1.getZ(), 2) + ); + } + + @NotNull + public static Location toBlockLocation(Location location) { + Location blockLoc = location.clone(); + blockLoc.setX(location.getBlockX()); + blockLoc.setY(location.getBlockY()); + blockLoc.setZ(location.getBlockZ()); + return blockLoc; + } + + @NotNull + public static Location toBlockCenterLocation(Location location) { + Location centerLoc = location.clone(); + centerLoc.setX(location.getBlockX() + 0.5); + centerLoc.setY(location.getBlockY() + 0.5); + centerLoc.setZ(location.getBlockZ() + 0.5); + return centerLoc; + } + + @NotNull + public static Location toSurfaceCenterLocation(Location location) { + Location centerLoc = location.clone(); + centerLoc.setX(location.getBlockX() + 0.5); + centerLoc.setZ(location.getBlockZ() + 0.5); + centerLoc.setY(location.getBlockY()); + return centerLoc; + } +} diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/util/MaterialUtils.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/util/MaterialUtils.java new file mode 100644 index 000000000..f6cc84aa0 --- /dev/null +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/util/MaterialUtils.java @@ -0,0 +1,44 @@ +package net.momirealms.craftengine.bukkit.util; + +import net.momirealms.craftengine.core.util.Key; +import org.bukkit.Material; +import org.bukkit.NamespacedKey; +import org.bukkit.Registry; + +import javax.annotation.Nullable; +import java.util.Locale; +import java.util.Objects; +import java.util.Optional; + +public class MaterialUtils { + + public static Material MACE; + + static { + try { + MACE = Material.valueOf("MACE"); + } catch (Exception ignore) { + MACE = null; + } + } + + private MaterialUtils() {} + + @Nullable + public static Material getMaterial(String name) { + if (name == null || name.isEmpty()) return null; + if (name.contains(":")) return Registry.MATERIAL.get(Objects.requireNonNull(NamespacedKey.fromString(name))); + NamespacedKey key = NamespacedKey.minecraft(name.toLowerCase(Locale.ENGLISH)); + return Optional.ofNullable(Registry.MATERIAL.get(key)).orElseGet(() -> { + try { + return Material.valueOf(name.toUpperCase(Locale.ENGLISH)); + } catch (IllegalArgumentException e) { + return null; + } + }); + } + + public static Material getMaterial(Key key) { + return Registry.MATERIAL.get(Objects.requireNonNull(NamespacedKey.fromString(key.toString()))); + } +} diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/util/MobEffectUtils.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/util/MobEffectUtils.java new file mode 100644 index 000000000..f61c6f023 --- /dev/null +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/util/MobEffectUtils.java @@ -0,0 +1,35 @@ +package net.momirealms.craftengine.bukkit.util; + +public class MobEffectUtils { + + private MobEffectUtils() {} + + public static byte pack(boolean isAmbient, boolean isVisible, boolean showIcon) { + byte b = 0; + if (isAmbient) { + b = (byte) (b | 1); + } + if (isVisible) { + b = (byte) (b | 2); + } + if (showIcon) { + b = (byte) (b | 4); + } + return b; + } + + public static Object createPacket(Object mobEffect, int entityId, byte amplifier, int duration, boolean isAmbient, boolean isVisible, boolean showIcon) { + try { + Object packet = Reflections.allocateClientboundUpdateMobEffectPacketInstance(); + Reflections.field$ClientboundUpdateMobEffectPacket$entityId.set(packet, entityId); + Reflections.field$ClientboundUpdateMobEffectPacket$duration.set(packet, duration); + Reflections.field$ClientboundUpdateMobEffectPacket$amplifier.set(packet, amplifier); + Reflections.field$ClientboundUpdateMobEffectPacket$effect.set(packet, mobEffect); + byte flags = pack(isAmbient, isVisible, showIcon); + Reflections.field$ClientboundUpdateMobEffectPacket$flags.set(packet, flags); + return packet; + } catch (InstantiationException | IllegalAccessException e) { + throw new RuntimeException(e); + } + } +} diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/util/NoteBlockChainUpdateUtils.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/util/NoteBlockChainUpdateUtils.java new file mode 100644 index 000000000..badab57bf --- /dev/null +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/util/NoteBlockChainUpdateUtils.java @@ -0,0 +1,18 @@ +package net.momirealms.craftengine.bukkit.util; + +import net.momirealms.craftengine.core.plugin.config.ConfigManager; + +public class NoteBlockChainUpdateUtils { + + private NoteBlockChainUpdateUtils() {} + + public static void noteBlockChainUpdate(Object level, Object chunkSource, Object direction, Object blockPos, int times) throws ReflectiveOperationException { + if (times >= ConfigManager.maxChainUpdate()) return; + Object relativePos = Reflections.method$BlockPos$relative.invoke(blockPos, direction); + Object state = Reflections.method$BlockGetter$getBlockState.invoke(level, relativePos); + if (BlockStateUtils.isClientSideNoteBlock(state)) { + Reflections.method$ServerChunkCache$blockChanged.invoke(chunkSource, relativePos); + noteBlockChainUpdate(level, chunkSource, direction, relativePos, times+1); + } + } +} diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/util/PlaceholderAPIUtils.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/util/PlaceholderAPIUtils.java new file mode 100644 index 000000000..200ab0b88 --- /dev/null +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/util/PlaceholderAPIUtils.java @@ -0,0 +1,13 @@ +package net.momirealms.craftengine.bukkit.util; + +import me.clip.placeholderapi.PlaceholderAPI; +import org.bukkit.OfflinePlayer; + +public class PlaceholderAPIUtils { + + private PlaceholderAPIUtils() {} + + public static String parse(OfflinePlayer player, String text) { + return PlaceholderAPI.setPlaceholders(player, text); + } +} diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/util/PlayerUtils.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/util/PlayerUtils.java new file mode 100644 index 000000000..0030b1a93 --- /dev/null +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/util/PlayerUtils.java @@ -0,0 +1,143 @@ +package net.momirealms.craftengine.bukkit.util; + +import net.momirealms.craftengine.core.util.RandomUtils; +import org.bukkit.Location; +import org.bukkit.entity.Item; +import org.bukkit.entity.Player; +import org.bukkit.inventory.Inventory; +import org.bukkit.inventory.ItemStack; +import org.bukkit.inventory.PlayerInventory; +import org.bukkit.inventory.meta.ItemMeta; +import org.bukkit.util.Vector; +import org.jetbrains.annotations.NotNull; + +import static java.util.Objects.requireNonNull; + +public class PlayerUtils { + + private PlayerUtils() {} + + public static void dropItem(@NotNull Player player, @NotNull ItemStack itemStack, boolean retainOwnership, boolean noPickUpDelay, boolean throwRandomly) { + requireNonNull(player, "player"); + requireNonNull(itemStack, "itemStack"); + Location location = player.getLocation().clone(); + Item item = player.getWorld().dropItem(player.getEyeLocation().clone().subtract(new Vector(0,0.3,0)), itemStack); + item.setPickupDelay(noPickUpDelay ? 0 : 40); + item.setOwner(player.getUniqueId()); + if (retainOwnership) { + item.setThrower(player.getUniqueId()); + } + if (throwRandomly) { + double d1 = RandomUtils.generateRandomDouble(0,1) * 0.5f; + double d2 = RandomUtils.generateRandomDouble(0,1) * (Math.PI * 2); + item.setVelocity(new Vector(-Math.sin(d2) * d1, 0.2f, Math.cos(d2) * d1)); + } else { + double d1 = Math.sin(location.getPitch() * (Math.PI/180)); + double d2 = RandomUtils.generateRandomDouble(0, 0.02); + double d3 = RandomUtils.generateRandomDouble(0,1) * (Math.PI * 2); + Vector vector = location.getDirection().multiply(0.3).setY(-d1 * 0.3 + 0.1 + (RandomUtils.generateRandomDouble(0,1) - RandomUtils.generateRandomDouble(0,1)) * 0.1); + vector.add(new Vector(Math.cos(d3) * d2, 0, Math.sin(d3) * d2)); + item.setVelocity(vector); + } + } + + public static int putItemsToInventory(Inventory inventory, ItemStack itemStack, int amount) { + ItemMeta meta = itemStack.getItemMeta(); + int maxStackSize = itemStack.getMaxStackSize(); + for (ItemStack other : inventory.getStorageContents()) { + if (other != null) { + if (other.getType() == itemStack.getType() && other.getItemMeta().equals(meta)) { + if (other.getAmount() < maxStackSize) { + int delta = maxStackSize - other.getAmount(); + if (amount > delta) { + other.setAmount(maxStackSize); + amount -= delta; + } else { + other.setAmount(amount + other.getAmount()); + return 0; + } + } + } + } + } + + if (amount > 0) { + for (ItemStack other : inventory.getStorageContents()) { + if (other == null) { + if (amount > maxStackSize) { + amount -= maxStackSize; + ItemStack cloned = itemStack.clone(); + cloned.setAmount(maxStackSize); + inventory.addItem(cloned); + } else { + ItemStack cloned = itemStack.clone(); + cloned.setAmount(amount); + inventory.addItem(cloned); + return 0; + } + } + } + } + + return amount; + } + + public static int giveItem(Player player, ItemStack itemStack, int amount) { + PlayerInventory inventory = player.getInventory(); + ItemMeta meta = itemStack.getItemMeta(); + int maxStackSize = itemStack.getMaxStackSize(); + if (amount > maxStackSize * 100) { + amount = maxStackSize * 100; + } + int actualAmount = amount; + for (ItemStack other : inventory.getStorageContents()) { + if (other != null) { + if (other.getType() == itemStack.getType() && other.getItemMeta().equals(meta)) { + if (other.getAmount() < maxStackSize) { + int delta = maxStackSize - other.getAmount(); + if (amount > delta) { + other.setAmount(maxStackSize); + amount -= delta; + } else { + other.setAmount(amount + other.getAmount()); + return actualAmount; + } + } + } + } + } + if (amount > 0) { + for (ItemStack other : inventory.getStorageContents()) { + if (other == null) { + if (amount > maxStackSize) { + amount -= maxStackSize; + ItemStack cloned = itemStack.clone(); + cloned.setAmount(maxStackSize); + inventory.addItem(cloned); + } else { + ItemStack cloned = itemStack.clone(); + cloned.setAmount(amount); + inventory.addItem(cloned); + return actualAmount; + } + } + } + } + + if (amount > 0) { + for (int i = 0; i < amount / maxStackSize; i++) { + ItemStack cloned = itemStack.clone(); + cloned.setAmount(maxStackSize); + player.getWorld().dropItem(player.getLocation(), cloned); + } + int left = amount % maxStackSize; + if (left != 0) { + ItemStack cloned = itemStack.clone(); + cloned.setAmount(left); + player.getWorld().dropItem(player.getLocation(), cloned); + } + } + + return actualAmount; + } +} diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/util/RecipeUtils.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/util/RecipeUtils.java new file mode 100644 index 000000000..dfff3fd0a --- /dev/null +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/util/RecipeUtils.java @@ -0,0 +1,49 @@ +package net.momirealms.craftengine.bukkit.util; + +import net.momirealms.craftengine.core.plugin.CraftEngine; +import net.momirealms.craftengine.core.util.VersionHelper; + +import java.util.ArrayList; +import java.util.List; +import java.util.Optional; + +public class RecipeUtils { + + private RecipeUtils() {} + + @SuppressWarnings("unchecked") + public static List getIngredientsFromShapedRecipe(Object recipe) { + List ingredients = new ArrayList<>(); + try { + if (VersionHelper.isVersionNewerThan1_20_3()) { + Object pattern = Reflections.field$1_20_3$ShapedRecipe$pattern.get(recipe); + if (VersionHelper.isVersionNewerThan1_21_2()) { + List> optionals = (List>) Reflections.field$ShapedRecipePattern$ingredients1_21_2.get(pattern); + for (Optional optional : optionals) { + optional.ifPresent(ingredients::add); + } + } else { + List objectList = (List) Reflections.field$ShapedRecipePattern$ingredients1_20_3.get(pattern); + for (Object object : objectList) { + Object[] values = (Object[]) Reflections.field$Ingredient$values.get(object); + // is empty or not + if (values.length != 0) { + ingredients.add(object); + } + } + } + } else { + List objectList = (List) Reflections.field$1_20_1$ShapedRecipe$recipeItems.get(recipe); + for (Object object : objectList) { + Object[] values = (Object[]) Reflections.field$Ingredient$values.get(object); + if (values.length != 0) { + ingredients.add(object); + } + } + } + } catch (ReflectiveOperationException e) { + CraftEngine.instance().logger().warn("Failed to get ingredients from shaped recipe", e); + } + return ingredients; + } +} diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/util/Reflections.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/util/Reflections.java new file mode 100644 index 000000000..1afda911d --- /dev/null +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/util/Reflections.java @@ -0,0 +1,4863 @@ +package net.momirealms.craftengine.bukkit.util; + +import com.google.common.collect.ImmutableList; +import io.netty.buffer.ByteBuf; +import io.netty.channel.Channel; +import io.netty.channel.ChannelFuture; +import io.netty.channel.ChannelHandlerContext; +import io.netty.handler.codec.ByteToMessageDecoder; +import io.netty.handler.codec.MessageToByteEncoder; +import net.momirealms.craftengine.core.util.ReflectionUtils; +import net.momirealms.craftengine.core.util.VersionHelper; +import org.bukkit.Location; +import org.bukkit.NamespacedKey; +import org.bukkit.World; +import org.bukkit.block.BlockState; +import org.bukkit.block.data.BlockData; +import org.bukkit.entity.Entity; +import org.bukkit.entity.EntityType; +import org.bukkit.entity.HumanEntity; +import org.bukkit.event.block.BlockPhysicsEvent; +import org.bukkit.event.block.BlockPlaceEvent; +import org.bukkit.event.entity.CreatureSpawnEvent; +import org.bukkit.inventory.*; +import org.jetbrains.annotations.Nullable; +import sun.misc.Unsafe; + +import java.io.BufferedReader; +import java.lang.reflect.*; +import java.util.*; +import java.util.concurrent.CompletableFuture; +import java.util.concurrent.atomic.AtomicInteger; +import java.util.function.BiConsumer; +import java.util.function.Consumer; + +import static java.util.Objects.requireNonNull; + +public class Reflections { + + public static void init() { + } + + public static final Unsafe UNSAFE; + + static { + try { + Field unsafeField = Unsafe.class.getDeclaredField("theUnsafe"); + unsafeField.setAccessible(true); + UNSAFE = (Unsafe) unsafeField.get(null); + } catch (ReflectiveOperationException e) { + throw new RuntimeException(e); + } + } + + public static final Class clazz$CraftChatMessage = requireNonNull( + ReflectionUtils.getClazz( + BukkitReflectionUtils.assembleCBClass("util.CraftChatMessage") + ) + ); + + public static final Method method$CraftChatMessage$fromJSON = requireNonNull( + ReflectionUtils.getMethod( + clazz$CraftChatMessage, + new String[]{"fromJSON"}, + String.class + ) + ); + + public static final Class clazz$Component = requireNonNull( + ReflectionUtils.getClazz( + BukkitReflectionUtils.assembleMCClass("network.chat.Component"), + BukkitReflectionUtils.assembleMCClass("network.chat.IChatBaseComponent") + ) + ); + + public static final Class clazz$RandomSource = requireNonNull( + ReflectionUtils.getClazz( + BukkitReflectionUtils.assembleMCClass("util.RandomSource") + ) + ); + + + public static final Class clazz$ClientboundSetActionBarTextPacket = requireNonNull( + ReflectionUtils.getClazz( + BukkitReflectionUtils.assembleMCClass("network.protocol.game.ClientboundSetActionBarTextPacket") + ) + ); + + public static final Field field$ClientboundSetActionBarTextPacket$text = requireNonNull( + ReflectionUtils.getDeclaredField( + clazz$ClientboundSetActionBarTextPacket, clazz$Component, 0 + ) + ); + + public static final Constructor constructor$ClientboundSetActionBarTextPacket = requireNonNull( + ReflectionUtils.getConstructor( + clazz$ClientboundSetActionBarTextPacket, clazz$Component + ) + ); + + public static final Class clazz$ComponentContents = requireNonNull( + ReflectionUtils.getClazz( + BukkitReflectionUtils.assembleMCClass("network.chat.ComponentContents") + ) + ); + + public static final Method method$Component$getContents = requireNonNull( + ReflectionUtils.getMethods( + clazz$Component, clazz$ComponentContents + ).get(0) + ); + + public static final Class clazz$ScoreContents = requireNonNull( + ReflectionUtils.getClazz( + BukkitReflectionUtils.assembleMCClass("network.chat.contents.ScoreContents") + ) + ); + + public static final Field field$ScoreContents$name = requireNonNull( + ReflectionUtils.getInstanceDeclaredField( + clazz$ScoreContents, String.class, 0 + ) + ); + + public static final Class clazz$ClientboundSystemChatPacket = requireNonNull( + ReflectionUtils.getClazz( + BukkitReflectionUtils.assembleMCClass("network.protocol.game.ClientboundSystemChatPacket") + ) + ); + + public static final Constructor constructor$ClientboundSystemChatPacket = requireNonNull( + ReflectionUtils.getConstructor( + clazz$ClientboundSystemChatPacket, clazz$Component, boolean.class + ) + ); + + public static final Field field$ClientboundSystemChatPacket$overlay = requireNonNull( + ReflectionUtils.getDeclaredField( + clazz$ClientboundSystemChatPacket, boolean.class, 0 + ) + ); + + public static final Class clazz$LevelWriter = requireNonNull( + ReflectionUtils.getClazz( + BukkitReflectionUtils.assembleMCClass("world.level.LevelWriter"), + BukkitReflectionUtils.assembleMCClass("world.level.IWorldWriter") + ) + ); + + public static final Class clazz$LevelReader = requireNonNull( + ReflectionUtils.getClazz( + BukkitReflectionUtils.assembleMCClass("world.level.LevelReader"), + BukkitReflectionUtils.assembleMCClass("world.level.IWorldReader") + ) + ); + + public static final Class clazz$DimensionType = requireNonNull( + ReflectionUtils.getClazz( + BukkitReflectionUtils.assembleMCClass("world.level.dimension.DimensionType"), + BukkitReflectionUtils.assembleMCClass("world.level.dimension.DimensionManager") + ) + ); + + public static final Method method$$LevelReader$dimensionType = requireNonNull( + ReflectionUtils.getMethod( + clazz$LevelReader, clazz$DimensionType + ) + ); + + public static final Field field$DimensionType$minY = requireNonNull( + ReflectionUtils.getInstanceDeclaredField( + clazz$DimensionType, int.class, 0 + ) + ); + + public static final Field field$DimensionType$height = requireNonNull( + ReflectionUtils.getInstanceDeclaredField( + clazz$DimensionType, int.class, 1 + ) + ); + + public static final Field field$ClientboundSystemChatPacket$component = + ReflectionUtils.getDeclaredField( + clazz$ClientboundSystemChatPacket, clazz$Component, 0 + ); + + public static final Field field$ClientboundSystemChatPacket$text = + ReflectionUtils.getDeclaredField( + clazz$ClientboundSystemChatPacket, String.class, 0 + ); + + public static final Class clazz$ClientboundBossEventPacket = requireNonNull( + ReflectionUtils.getClazz( + BukkitReflectionUtils.assembleMCClass("network.protocol.game.ClientboundBossEventPacket"), + BukkitReflectionUtils.assembleMCClass("network.protocol.game.PacketPlayOutBoss") + ) + ); + + public static final Class clazz$ClientboundBossEventPacket$Operation = requireNonNull( + ReflectionUtils.getClazz( + BukkitReflectionUtils.assembleMCClass("network.protocol.game.ClientboundBossEventPacket$Operation"), + BukkitReflectionUtils.assembleMCClass("network.protocol.game.PacketPlayOutBoss$Action") + ) + ); + + public static final Constructor constructor$ClientboundBossEventPacket = requireNonNull( + ReflectionUtils.getDeclaredConstructor( + clazz$ClientboundBossEventPacket, + UUID.class, clazz$ClientboundBossEventPacket$Operation + ) + ); + + public static final Class clazz$ClientboundBossEventPacket$AddOperation = requireNonNull( + ReflectionUtils.getClazz( + BukkitReflectionUtils.assembleMCClass("network.protocol.game.ClientboundBossEventPacket$AddOperation"), + BukkitReflectionUtils.assembleMCClass("network.protocol.game.PacketPlayOutBoss$a") + ) + ); + + + public static final Class clazz$BossEvent$BossBarColor = requireNonNull( + ReflectionUtils.getClazz( + BukkitReflectionUtils.assembleMCClass("world.BossEvent$BossBarColor"), + BukkitReflectionUtils.assembleMCClass("world.BossBattle$BarColor") + ) + ); + + public static final Method method$BossEvent$BossBarColor$valueOf = requireNonNull( + ReflectionUtils.getMethod( + clazz$BossEvent$BossBarColor, + new String[]{"valueOf"}, + String.class + ) + ); + + public static final Class clazz$BossEvent$BossBarOverlay = requireNonNull( + ReflectionUtils.getClazz( + BukkitReflectionUtils.assembleMCClass("world.BossEvent$BossBarOverlay"), + BukkitReflectionUtils.assembleMCClass("world.BossBattle$BarStyle") + ) + ); + + public static final Method method$BossEvent$BossBarOverlay$valueOf = requireNonNull( + ReflectionUtils.getMethod( + clazz$BossEvent$BossBarOverlay, + new String[]{"valueOf"}, + String.class + ) + ); + + public static final Field field$ClientboundBossEventPacket$AddOperation$name = requireNonNull( + ReflectionUtils.getDeclaredField( + clazz$ClientboundBossEventPacket$AddOperation, + 0 + ) + ); + + public static final Field field$ClientboundBossEventPacket$AddOperation$progress = requireNonNull( + ReflectionUtils.getDeclaredField( + clazz$ClientboundBossEventPacket$AddOperation, + 1 + ) + ); + + public static final Field field$ClientboundBossEventPacket$AddOperation$color = requireNonNull( + ReflectionUtils.getDeclaredField( + clazz$ClientboundBossEventPacket$AddOperation, + 2 + ) + ); + + public static final Field field$ClientboundBossEventPacket$AddOperation$overlay = requireNonNull( + ReflectionUtils.getDeclaredField( + clazz$ClientboundBossEventPacket$AddOperation, + 3 + ) + ); + + public static final Field field$ClientboundBossEventPacket$AddOperation$darkenScreen = requireNonNull( + ReflectionUtils.getDeclaredField( + clazz$ClientboundBossEventPacket$AddOperation, + 4 + ) + ); + + public static final Field field$ClientboundBossEventPacket$AddOperation$playMusic = requireNonNull( + ReflectionUtils.getDeclaredField( + clazz$ClientboundBossEventPacket$AddOperation, + 5 + ) + ); + + public static final Field field$ClientboundBossEventPacket$AddOperation$createWorldFog = requireNonNull( + ReflectionUtils.getDeclaredField( + clazz$ClientboundBossEventPacket$AddOperation, + 6 + ) + ); + + public static final Class clazz$ResourceLocation = requireNonNull( + ReflectionUtils.getClazz( + BukkitReflectionUtils.assembleMCClass("resources.ResourceLocation"), + BukkitReflectionUtils.assembleMCClass("resources.MinecraftKey") + ) + ); + + public static Object allocateAddOperationInstance() throws InstantiationException { + return UNSAFE.allocateInstance(clazz$ClientboundBossEventPacket$AddOperation); + } + + public static final Class clazz$ClientboundBossEventPacket$UpdateNameOperation = requireNonNull( + ReflectionUtils.getClazz( + BukkitReflectionUtils.assembleMCClass("network.protocol.game.ClientboundBossEventPacket$UpdateNameOperation"), + BukkitReflectionUtils.assembleMCClass("network.protocol.game.PacketPlayOutBoss$e") + ) + ); + + public static final Constructor constructor$ClientboundBossEventPacket$UpdateNameOperation = requireNonNull( + ReflectionUtils.getDeclaredConstructor( + clazz$ClientboundBossEventPacket$UpdateNameOperation, + clazz$Component + ) + ); + + public static final Class clazz$SoundEvent = requireNonNull( + ReflectionUtils.getClazz( + BukkitReflectionUtils.assembleMCClass("sounds.SoundEvent"), + BukkitReflectionUtils.assembleMCClass("sounds.SoundEffect") + ) + ); + + public static final Constructor constructor$SoundEvent = requireNonNull( + VersionHelper.isVersionNewerThan1_21_2() ? + ReflectionUtils.getConstructor( + clazz$SoundEvent, clazz$ResourceLocation, Optional.class + ) : + ReflectionUtils.getDeclaredConstructor( + clazz$SoundEvent, clazz$ResourceLocation, float.class, boolean.class + ) + ); + + // 1.21.2+ + public static final Field field$SoundEvent$fixedRange = ReflectionUtils.getInstanceDeclaredField( + clazz$SoundEvent, Optional.class, 0 + ); + + // 1.21.2- + public static final Field field$SoundEvent$range = ReflectionUtils.getInstanceDeclaredField( + clazz$SoundEvent, float.class, 0 + ); + + public static final Field field$SoundEvent$newSystem = ReflectionUtils.getInstanceDeclaredField( + clazz$SoundEvent, boolean.class, 0 + ); + + public static final Method method$SoundEvent$createVariableRangeEvent = requireNonNull( + ReflectionUtils.getStaticMethod( + clazz$SoundEvent, clazz$SoundEvent, clazz$ResourceLocation + ) + ); + + public static final Class clazz$CraftRegistry = ReflectionUtils.getClazz( + BukkitReflectionUtils.assembleCBClass("CraftRegistry") + ); + + public static final Object instance$MinecraftRegistry; + + static { + if (VersionHelper.isVersionNewerThan1_20()) { + try { + Method method = requireNonNull(ReflectionUtils.getMethod(clazz$CraftRegistry, new String[]{"getMinecraftRegistry"})); + instance$MinecraftRegistry = method.invoke(null); + } catch (Throwable t) { + throw new RuntimeException(t); + } + } else { + instance$MinecraftRegistry = null; + } + } + + public static final Class clazz$Component$Serializer = requireNonNull( + ReflectionUtils.getClazz( + BukkitReflectionUtils.assembleMCClass("network.chat.Component$Serializer"), + BukkitReflectionUtils.assembleMCClass("network.chat.IChatBaseComponent$ChatSerializer") + ) + ); + + public static final Class clazz$HolderLookup$Provider = ReflectionUtils.getClazz( + BukkitReflectionUtils.assembleMCClass("core.HolderLookup$Provider"), + BukkitReflectionUtils.assembleMCClass("core.HolderLookup$b") + ); + + public static final Method method$Component$Serializer$fromJson = ReflectionUtils.getMethod( + clazz$Component$Serializer, + new String[] { "fromJson" }, + String.class, clazz$HolderLookup$Provider + ); + + public static final Method method$Component$Serializer$toJson = ReflectionUtils.getMethod( + clazz$Component$Serializer, + new String[] { "toJson" }, + clazz$Component, clazz$HolderLookup$Provider + ); + + public static final Class clazz$ClientboundBundlePacket = requireNonNull( + ReflectionUtils.getClazz( + BukkitReflectionUtils.assembleMCClass("network.protocol.game.ClientboundBundlePacket") + ) + ); + + public static final Constructor constructor$ClientboundBundlePacket = requireNonNull( + ReflectionUtils.getConstructor(clazz$ClientboundBundlePacket, Iterable.class) + ); + + public static final Class clazz$Packet = requireNonNull( + ReflectionUtils.getClazz( + BukkitReflectionUtils.assembleMCClass("network.protocol.Packet") + ) + ); + + public static final Class clazz$ServerPlayer = requireNonNull(ReflectionUtils.getClazz( + BukkitReflectionUtils.assembleMCClass("server.level.ServerPlayer"), + BukkitReflectionUtils.assembleMCClass("server.level.EntityPlayer") + )); + + public static final Class clazz$ServerGamePacketListenerImpl = requireNonNull(ReflectionUtils.getClazz( + BukkitReflectionUtils.assembleMCClass("server.network.ServerGamePacketListenerImpl"), + BukkitReflectionUtils.assembleMCClass("server.network.PlayerConnection") + )); + + public static final Class clazz$ServerCommonPacketListenerImpl = requireNonNull( + clazz$ServerGamePacketListenerImpl.getSuperclass() + ); + + public static final Class clazz$Connection = requireNonNull( + ReflectionUtils.getClazz( + BukkitReflectionUtils.assembleMCClass("network.Connection"), + BukkitReflectionUtils.assembleMCClass("network.NetworkManager") + ) + ); + + public static final Field field$ServerCommonPacketListenerImpl$connection = requireNonNull( + VersionHelper.isVersionNewerThan1_20_2() ? + ReflectionUtils.getDeclaredField( + clazz$ServerCommonPacketListenerImpl, clazz$Connection, 0 + ) : + ReflectionUtils.getDeclaredField( + clazz$ServerGamePacketListenerImpl, clazz$Connection, 0 + ) + ); + + public static final Class clazz$PacketSendListener = requireNonNull( + ReflectionUtils.getClazz( + BukkitReflectionUtils.assembleMCClass("network.PacketSendListener") + ) + ); + + public static final Class clazz$CraftPlayer = requireNonNull(ReflectionUtils.getClazz( + BukkitReflectionUtils.assembleCBClass("entity.CraftPlayer") + )); + + public static final Method method$CraftPlayer$getHandle = requireNonNull( + ReflectionUtils.getMethod(clazz$CraftPlayer, new String[] { "getHandle" }) + ); + + public static final Field field$ServerPlayer$connection = requireNonNull( + ReflectionUtils.getInstanceDeclaredField(clazz$ServerPlayer, clazz$ServerGamePacketListenerImpl, 0) + ); + + public static final Method method$ServerGamePacketListenerImpl$sendPacket = requireNonNull( + ReflectionUtils.getMethods(clazz$ServerGamePacketListenerImpl, void.class, clazz$Packet).get(0) + ); + + public static final Method method$Connection$sendPacketImmediate = requireNonNull( + VersionHelper.isVersionNewerThan1_20_2() ? + ReflectionUtils.getDeclaredMethod( + clazz$Connection, void.class, new String[] {"sendPacket", "b"}, clazz$Packet, clazz$PacketSendListener, boolean.class + ) : + ReflectionUtils.getDeclaredMethod( + clazz$Connection, void.class, new String[] {"sendPacket"}, clazz$Packet, clazz$PacketSendListener, Boolean.class + ) + ); + + public static final Field field$NetworkManager = requireNonNull( + VersionHelper.isVersionNewerThan1_20_2() ? + ReflectionUtils.getDeclaredField(clazz$ServerGamePacketListenerImpl.getSuperclass(), clazz$Connection, 0) : + ReflectionUtils.getDeclaredField(clazz$ServerGamePacketListenerImpl, clazz$Connection, 0) + ); + + public static final Field field$Channel = requireNonNull( + ReflectionUtils.getDeclaredField( + clazz$Connection, Channel.class, 0 + ) + ); + + public static final Field field$BundlePacket$packets = requireNonNull( + ReflectionUtils.getDeclaredField( + clazz$ClientboundBundlePacket.getSuperclass(), Iterable.class, 0 + ) + ); + + public static final Class clazz$EntityType = requireNonNull( + ReflectionUtils.getClazz( + BukkitReflectionUtils.assembleMCClass("world.entity.EntityType"), + BukkitReflectionUtils.assembleMCClass("world.entity.EntityTypes") + ) + ); + + public static final Class clazz$EntityType$EntityFactory = requireNonNull( + ReflectionUtils.getClazz( + BukkitReflectionUtils.assembleMCClass("world.entity.EntityType$EntityFactory"), + BukkitReflectionUtils.assembleMCClass("world.entity.EntityTypes$b") + ) + ); + + public static final Field field$EntityType$factory = requireNonNull( + ReflectionUtils.getDeclaredField( + clazz$EntityType, clazz$EntityType$EntityFactory, 0 + ) + ); + + public static final Class clazz$ClientboundAddEntityPacket = requireNonNull( + ReflectionUtils.getClazz( + BukkitReflectionUtils.assembleMCClass("network.protocol.game.PacketPlayOutSpawnEntity"), + BukkitReflectionUtils.assembleMCClass("network.protocol.game.ClientboundAddEntityPacket") + ) + ); + + public static final Class clazz$VoxelShape = requireNonNull( + ReflectionUtils.getClazz( + BukkitReflectionUtils.assembleMCClass("world.phys.shapes.VoxelShape") + ) + ); + + public static final Field field$ClientboundAddEntityPacket$data = requireNonNull( + ReflectionUtils.getDeclaredField( + clazz$ClientboundAddEntityPacket, int.class, 4 + ) + ); + + public static final Field field$ClientboundAddEntityPacket$type = requireNonNull( + ReflectionUtils.getDeclaredField( + clazz$ClientboundAddEntityPacket, clazz$EntityType, 0 + ) + ); + + public static final Class clazz$PacketPlayOutNamedEntitySpawn = + ReflectionUtils.getClazz( + BukkitReflectionUtils.assembleMCClass("network.protocol.game.PacketPlayOutNamedEntitySpawn") + ); + + public static final Class clazz$ClientboundRemoveEntitiesPacket = requireNonNull( + ReflectionUtils.getClazz( + BukkitReflectionUtils.assembleMCClass("network.protocol.game.ClientboundRemoveEntitiesPacket"), + BukkitReflectionUtils.assembleMCClass("network.protocol.game.PacketPlayOutEntityDestroy") + ) + ); + + public static final Field field$ClientboundRemoveEntitiesPacket$entityIds = requireNonNull( + ReflectionUtils.getInstanceDeclaredField( + clazz$ClientboundRemoveEntitiesPacket, 0 + ) + ); + + public static final Field field$ClientboundAddEntityPacket$entityId = requireNonNull( + ReflectionUtils.getDeclaredField( + clazz$ClientboundAddEntityPacket, int.class, 0 + ) + ); + + public static final Field field$PacketPlayOutNamedEntitySpawn$entityId = clazz$PacketPlayOutNamedEntitySpawn != null ? + ReflectionUtils.getDeclaredField( + clazz$PacketPlayOutNamedEntitySpawn, int.class, 0 + ) : null; + + public static final Class clazz$Vec3 = requireNonNull( + ReflectionUtils.getClazz( + BukkitReflectionUtils.assembleMCClass("world.phys.Vec3"), + BukkitReflectionUtils.assembleMCClass("world.phys.Vec3D") + ) + ); + + public static final Field field$Vec3$x = requireNonNull( + ReflectionUtils.getInstanceDeclaredField( + clazz$Vec3, double.class, 0 + ) + ); + + public static final Field field$Vec3$y = requireNonNull( + ReflectionUtils.getInstanceDeclaredField( + clazz$Vec3, double.class, 1 + ) + ); + + public static final Field field$Vec3$z = requireNonNull( + ReflectionUtils.getInstanceDeclaredField( + clazz$Vec3, double.class, 2 + ) + ); + + public static final Constructor constructor$Vec3 = requireNonNull( + ReflectionUtils.getConstructor( + clazz$Vec3, double.class, double.class, double.class + ) + ); + + public static final Constructor constructor$ClientboundAddEntityPacket = requireNonNull( + ReflectionUtils.getConstructor(clazz$ClientboundAddEntityPacket, + int.class, UUID.class, + double.class, double.class, double.class, + float.class, float.class, + clazz$EntityType, + int.class, clazz$Vec3, double.class + ) + ); + + public static final Constructor constructor$ClientboundRemoveEntitiesPacket = requireNonNull( + ReflectionUtils.getConstructor(clazz$ClientboundRemoveEntitiesPacket, int[].class) + ); + + public static final Class clazz$ClientboundSetPassengersPacket = requireNonNull( + ReflectionUtils.getClazz( + BukkitReflectionUtils.assembleMCClass("network.protocol.game.PacketPlayOutMount"), + BukkitReflectionUtils.assembleMCClass("network.protocol.game.ClientboundSetPassengersPacket") + ) + ); + + public static final Field field$ClientboundSetPassengersPacket$vehicle = requireNonNull( + ReflectionUtils.getInstanceDeclaredField( + clazz$ClientboundSetPassengersPacket, 0 + ) + ); + + public static final Field field$ClientboundSetPassengersPacket$passengers = requireNonNull( + ReflectionUtils.getInstanceDeclaredField( + clazz$ClientboundSetPassengersPacket, 1 + ) + ); + + public static Object allocateClientboundSetPassengersPacketInstance() throws InstantiationException { + return UNSAFE.allocateInstance(clazz$ClientboundSetPassengersPacket); + } + + public static final Field field$Vec3$Zero = requireNonNull( + ReflectionUtils.getDeclaredField( + clazz$Vec3, clazz$Vec3, 0 + ) + ); + + public static final Object instance$Vec3$Zero; + + static { + try { + instance$Vec3$Zero = field$Vec3$Zero.get(null); + } catch (ReflectiveOperationException e) { + throw new AssertionError(e); + } + } + + public static final Class clazz$ClientboundSetEntityDataPacket = requireNonNull( + ReflectionUtils.getClazz( + BukkitReflectionUtils.assembleMCClass("network.protocol.game.PacketPlayOutEntityMetadata"), + BukkitReflectionUtils.assembleMCClass("network.protocol.game.ClientboundSetEntityDataPacket") + ) + ); + + public static final Constructor constructor$ClientboundSetEntityDataPacket = requireNonNull( + ReflectionUtils.getConstructor(clazz$ClientboundSetEntityDataPacket, + int.class, List.class) + ); + + public static final Class clazz$EntityDataSerializers = requireNonNull( + ReflectionUtils.getClazz( + BukkitReflectionUtils.assembleMCClass("network.syncher.EntityDataSerializers"), + BukkitReflectionUtils.assembleMCClass("network.syncher.DataWatcherRegistry") + ) + ); + + public static final Class clazz$EntityDataSerializer = requireNonNull( + ReflectionUtils.getClazz( + BukkitReflectionUtils.assembleMCClass("network.syncher.EntityDataSerializer"), + BukkitReflectionUtils.assembleMCClass("network.syncher.DataWatcherSerializer") + ) + ); + + public static final Class clazz$EntityDataAccessor = requireNonNull( + ReflectionUtils.getClazz( + BukkitReflectionUtils.assembleMCClass("network.syncher.EntityDataAccessor"), + BukkitReflectionUtils.assembleMCClass("network.syncher.DataWatcherObject") + ) + ); + + public static final Constructor constructor$EntityDataAccessor = requireNonNull( + ReflectionUtils.getConstructor( + clazz$EntityDataAccessor, int.class, clazz$EntityDataSerializer + ) + ); + + public static final Class clazz$SynchedEntityData$DataValue = requireNonNull( + ReflectionUtils.getClazz( + BukkitReflectionUtils.assembleMCClass("network.syncher.SynchedEntityData$DataValue"), + BukkitReflectionUtils.assembleMCClass("network.syncher.DataWatcher$b") + ) + ); + + public static final Method method$SynchedEntityData$DataValue$create = requireNonNull( + ReflectionUtils.getMethod( + clazz$SynchedEntityData$DataValue, clazz$SynchedEntityData$DataValue, clazz$EntityDataAccessor, Object.class + ) + ); + + public static final Method method$Component$empty = requireNonNull( + ReflectionUtils.getStaticMethod( + clazz$Component, clazz$Component + ) + ); + + public static final Object instance$Component$empty; + + static { + try { + instance$Component$empty = method$Component$empty.invoke(null); + } catch (ReflectiveOperationException e) { + throw new AssertionError(e); + } + } + + public static final Class clazz$Quaternionf = requireNonNull( + ReflectionUtils.getClazz( + "org.joml.Quaternionf" + ) + ); + + public static final Constructor constructor$Quaternionf = requireNonNull( + ReflectionUtils.getConstructor( + clazz$Quaternionf, float.class, float.class, float.class, float.class + ) + ); + + public static final Object instance$Quaternionf$None; + + static { + try { + instance$Quaternionf$None = constructor$Quaternionf.newInstance(0f, 0f, 0f, 1f); + } catch (ReflectiveOperationException e) { + throw new AssertionError(e); + } + } + + public static final Class clazz$Vector3f = requireNonNull( + ReflectionUtils.getClazz( + "org.joml.Vector3f" + ) + ); + + public static final Constructor constructor$Vector3f = requireNonNull( + ReflectionUtils.getConstructor( + clazz$Vector3f, float.class, float.class, float.class + ) + ); + + public static final Object instance$Vector3f$None; + public static final Object instance$Vector3f$Normal; + + static { + try { + instance$Vector3f$None = constructor$Vector3f.newInstance(0f, 0f, 0f); + instance$Vector3f$Normal = constructor$Vector3f.newInstance(1f, 1f, 1f); + } catch (ReflectiveOperationException e) { + throw new AssertionError(e); + } + } + + public static final Field field$ClientboundSetEntityDataPacket$id = requireNonNull( + ReflectionUtils.getDeclaredField( + clazz$ClientboundSetEntityDataPacket, int.class, 0 + ) + ); + + public static final Field field$ClientboundSetEntityDataPacket$packedItems = requireNonNull( + ReflectionUtils.getDeclaredField( + clazz$ClientboundSetEntityDataPacket, List.class, 0 + ) + ); + + public static final Field field$SynchedEntityData$DataValue$id = requireNonNull( + ReflectionUtils.getDeclaredField( + clazz$SynchedEntityData$DataValue, int.class, 0 + ) + ); + + public static final Field field$SynchedEntityData$DataValue$value = requireNonNull( + ReflectionUtils.getDeclaredField( + clazz$SynchedEntityData$DataValue, 2 + ) + ); + + public static final Class clazz$ClientboundUpdateAttributesPacket = requireNonNull( + ReflectionUtils.getClazz( + BukkitReflectionUtils.assembleMCClass("network.protocol.game.ClientboundUpdateAttributesPacket"), + BukkitReflectionUtils.assembleMCClass("network.protocol.game.PacketPlayOutUpdateAttributes") + ) + ); + + public static final Class clazz$AttributeInstance = requireNonNull( + ReflectionUtils.getClazz( + BukkitReflectionUtils.assembleMCClass("world.entity.ai.attributes.AttributeInstance"), + BukkitReflectionUtils.assembleMCClass("world.entity.ai.attributes.AttributeModifiable") + ) + ); + + public static final Method method$AttributeInstance$getValue = requireNonNull( + ReflectionUtils.getMethod( + clazz$AttributeInstance, double.class, new String[]{"getValue", "f"} + ) + ); + + public static final Class clazz$AttributeModifier = requireNonNull( + ReflectionUtils.getClazz( + BukkitReflectionUtils.assembleMCClass("world.entity.ai.attributes.AttributeModifier") + ) + ); + + public static final Class clazz$AttributeModifier$Operation = requireNonNull( + ReflectionUtils.getClazz( + BukkitReflectionUtils.assembleMCClass("world.entity.ai.attributes.AttributeModifier$Operation") + ) + ); + + public static final Method method$AttributeModifier$Operation$values = requireNonNull( + ReflectionUtils.getStaticMethod( + clazz$AttributeModifier$Operation, clazz$AttributeModifier$Operation.arrayType() + ) + ); + + public static final Object instance$AttributeModifier$Operation$ADD_VALUE; + + static { + try { + Object[] values = (Object[]) method$AttributeModifier$Operation$values.invoke(null); + instance$AttributeModifier$Operation$ADD_VALUE = values[0]; + } catch (ReflectiveOperationException e) { + throw new AssertionError(e); + } + } + + public static final Constructor constructor$AttributeModifier = requireNonNull( + !VersionHelper.isVersionNewerThan1_20_5() ? + ReflectionUtils.getConstructor(clazz$AttributeModifier, String.class, double.class, clazz$AttributeModifier$Operation): + ( + !VersionHelper.isVersionNewerThan1_21() ? + ReflectionUtils.getConstructor(clazz$AttributeModifier, UUID.class, String.class, double.class, clazz$AttributeModifier$Operation) : + ( + ReflectionUtils.getConstructor(clazz$AttributeModifier, clazz$ResourceLocation, double.class, clazz$AttributeModifier$Operation) + ) + ) + ); + + public static final Constructor constructor$ClientboundUpdateAttributesPacket0 = requireNonNull( + ReflectionUtils.getConstructor( + clazz$ClientboundUpdateAttributesPacket, 0 + ) + ); + + public static final Constructor constructor$ClientboundUpdateAttributesPacket1 = requireNonNull( + ReflectionUtils.getConstructor( + clazz$ClientboundUpdateAttributesPacket, 1 + ) + ); + + public static final Field field$ClientboundUpdateAttributesPacket$id = requireNonNull( + ReflectionUtils.getDeclaredField( + clazz$ClientboundUpdateAttributesPacket, int.class, 0 + ) + ); + + public static final Field field$ClientboundUpdateAttributesPacket$attributes = requireNonNull( + ReflectionUtils.getDeclaredField( + clazz$ClientboundUpdateAttributesPacket, List.class, 0 + ) + ); + + public static final Class clazz$ClientboundUpdateAttributesPacket$AttributeSnapshot = requireNonNull( + ReflectionUtils.getClazz( + BukkitReflectionUtils.assembleMCClass("network.protocol.game.ClientboundUpdateAttributesPacket$AttributeSnapshot"), + BukkitReflectionUtils.assembleMCClass("network.protocol.game.PacketPlayOutUpdateAttributes$AttributeSnapshot") + ) + ); + + public static final Class clazz$Holder = requireNonNull( + ReflectionUtils.getClazz( + BukkitReflectionUtils.assembleMCClass("core.Holder") + ) + ); + + // 1.20.6+ + public static final Method method$Holder$getRegisteredName = + ReflectionUtils.getMethod( + clazz$Holder, String.class + ); + + public static final Class clazz$Holder$Reference = requireNonNull( + ReflectionUtils.getClazz( + BukkitReflectionUtils.assembleMCClass("core.Holder$Reference"), + BukkitReflectionUtils.assembleMCClass("core.Holder$c") + ) + ); + + public static final Field field$ClientboundUpdateAttributesPacket$AttributeSnapshot$attribute = + ReflectionUtils.getDeclaredField( + clazz$ClientboundUpdateAttributesPacket$AttributeSnapshot, clazz$Holder, 0 + ); + + public static final Field field$ClientboundUpdateAttributesPacket$AttributeSnapshot$base = + ReflectionUtils.getDeclaredField( + clazz$ClientboundUpdateAttributesPacket$AttributeSnapshot, double.class, 0 + ); + + public static final Field field$ClientboundUpdateAttributesPacket$AttributeSnapshot$modifiers = + ReflectionUtils.getDeclaredField( + clazz$ClientboundUpdateAttributesPacket$AttributeSnapshot, Collection.class, 0 + ); + + public static final Method method$Holder$value = requireNonNull( + ReflectionUtils.getMethod( + clazz$Holder, new String[]{"a", "value"} + ) + ); + + public static final Method method$Holder$direct = requireNonNull( + ReflectionUtils.getStaticMethod( + clazz$Holder, clazz$Holder, Object.class + ) + ); + + public static final Class clazz$Attribute = requireNonNull( + ReflectionUtils.getClazz( + BukkitReflectionUtils.assembleMCClass("world.entity.ai.attributes.Attribute"), + BukkitReflectionUtils.assembleMCClass("world.entity.ai.attributes.AttributeBase") + ) + ); + + public static final Constructor constructor$ClientboundUpdateAttributesPacket$AttributeSnapshot = requireNonNull( + VersionHelper.isVersionNewerThan1_20_5() ? + ReflectionUtils.getConstructor( + clazz$ClientboundUpdateAttributesPacket$AttributeSnapshot, clazz$Holder, double.class, Collection.class + ) : + ReflectionUtils.getConstructor( + clazz$ClientboundUpdateAttributesPacket$AttributeSnapshot, clazz$Attribute, double.class, Collection.class + ) + ); + + public static final Field field$Attribute$id = requireNonNull( + ReflectionUtils.getDeclaredField( + clazz$Attribute, String.class, 0 + ) + ); + + public static final Field field$AttributeModifier$amount = requireNonNull( + ReflectionUtils.getDeclaredField( + clazz$AttributeModifier, double.class, 0 + ) + ); + + public static final Class clazz$ClientboundGameEventPacket = requireNonNull( + ReflectionUtils.getClazz( + BukkitReflectionUtils.assembleMCClass("network.protocol.game.ClientboundGameEventPacket"), + BukkitReflectionUtils.assembleMCClass("network.protocol.game.PacketPlayOutGameStateChange") + ) + ); + + public static final Class clazz$ClientboundGameEventPacket$Type = requireNonNull( + ReflectionUtils.getClazz( + BukkitReflectionUtils.assembleMCClass("network.protocol.game.ClientboundGameEventPacket$Type"), + BukkitReflectionUtils.assembleMCClass("network.protocol.game.PacketPlayOutGameStateChange$a") + ) + ); + + public static final Field field$ClientboundGameEventPacket$event = requireNonNull( + ReflectionUtils.getDeclaredField( + clazz$ClientboundGameEventPacket, clazz$ClientboundGameEventPacket$Type, 0 + ) + ); + + public static final Field field$ClientboundGameEventPacket$param = requireNonNull( + ReflectionUtils.getDeclaredField( + clazz$ClientboundGameEventPacket, float.class, 0 + ) + ); + + public static final Field field$ClientboundGameEventPacket$Type$id = requireNonNull( + ReflectionUtils.getDeclaredField( + clazz$ClientboundGameEventPacket$Type, int.class, 0 + ) + ); + + public static final Class clazz$GameType = requireNonNull( + ReflectionUtils.getClazz( + BukkitReflectionUtils.assembleMCClass("world.level.GameType"), + BukkitReflectionUtils.assembleMCClass("world.level.EnumGamemode") + ) + ); + + public static final Method method$GameType$getId = requireNonNull( + ReflectionUtils.getMethod( + clazz$GameType, new String[] { "getId", "a" } + ) + ); + + public static final Class clazz$Biome = requireNonNull( + ReflectionUtils.getClazz( + BukkitReflectionUtils.assembleMCClass("world.level.biome.Biome"), + BukkitReflectionUtils.assembleMCClass("world.level.biome.BiomeBase") + ) + ); + + public static final Class clazz$CraftWorld = requireNonNull( + ReflectionUtils.getClazz( + BukkitReflectionUtils.assembleCBClass("CraftWorld") + ) + ); + + public static final Class clazz$ServerLevel = requireNonNull( + ReflectionUtils.getClazz( + BukkitReflectionUtils.assembleMCClass("server.level.ServerLevel"), + BukkitReflectionUtils.assembleMCClass("server.level.WorldServer") + ) + ); + + public static final Field field$CraftWorld$ServerLevel = requireNonNull( + ReflectionUtils.getDeclaredField( + clazz$CraftWorld, clazz$ServerLevel, 0 + ) + ); + + public static final Method method$ServerLevel$getNoiseBiome = requireNonNull( + ReflectionUtils.getMethod( + clazz$ServerLevel, clazz$Holder, int.class, int.class, int.class + ) + ); + + public static final Class clazz$ResourceKey = requireNonNull( + ReflectionUtils.getClazz( + BukkitReflectionUtils.assembleMCClass("resources.ResourceKey") + ) + ); + + public static final Field field$ResourceKey$registry = requireNonNull( + ReflectionUtils.getDeclaredField( + clazz$ResourceKey, clazz$ResourceLocation, 0 + ) + ); + + public static final Field field$ResourceKey$location = requireNonNull( + ReflectionUtils.getDeclaredField( + clazz$ResourceKey, clazz$ResourceLocation, 1 + ) + ); + + public static final Method method$ResourceKey$create = requireNonNull( + ReflectionUtils.getStaticMethod( + clazz$ResourceKey, clazz$ResourceKey, clazz$ResourceKey, clazz$ResourceLocation + ) + ); + + public static final Class clazz$MinecraftServer = requireNonNull( + ReflectionUtils.getClazz( + BukkitReflectionUtils.assembleMCClass("server.MinecraftServer") + ) + ); + + public static final Method method$MinecraftServer$getServer = requireNonNull( + ReflectionUtils.getMethod(clazz$MinecraftServer, new String[] { "getServer" }) + ); + + public static final Class clazz$LayeredRegistryAccess = requireNonNull( + ReflectionUtils.getClazz( + BukkitReflectionUtils.assembleMCClass("core.LayeredRegistryAccess") + ) + ); + + public static final Field field$MinecraftServer$registries = requireNonNull( + ReflectionUtils.getDeclaredField( + clazz$MinecraftServer, clazz$LayeredRegistryAccess, 0 + ) + ); + + public static final Class clazz$RegistryAccess$Frozen = requireNonNull( + ReflectionUtils.getClazz( + BukkitReflectionUtils.assembleMCClass("core.RegistryAccess$Frozen"), + BukkitReflectionUtils.assembleMCClass("core.IRegistryCustom$Dimension") + ) + ); + + public static final Class clazz$RegistryAccess = requireNonNull( + ReflectionUtils.getClazz( + BukkitReflectionUtils.assembleMCClass("core.RegistryAccess"), + BukkitReflectionUtils.assembleMCClass("core.IRegistryCustom") + ) + ); + + public static final Field field$LayeredRegistryAccess$composite = requireNonNull( + ReflectionUtils.getDeclaredField( + clazz$LayeredRegistryAccess, clazz$RegistryAccess$Frozen, 0 + ) + ); + + public static final Class clazz$Registry = requireNonNull( + requireNonNull(ReflectionUtils.getClazz( + BukkitReflectionUtils.assembleMCClass("core.WritableRegistry"), + BukkitReflectionUtils.assembleMCClass("core.IRegistryWritable") + )).getInterfaces()[0] + ); + + public static final Method method$RegistryAccess$registryOrThrow = requireNonNull( + ReflectionUtils.getMethod( + clazz$RegistryAccess, clazz$Registry, clazz$ResourceKey + ) + ); + + public static final Method method$Registry$register = requireNonNull( + ReflectionUtils.getStaticMethod( + clazz$Registry, Object.class, clazz$Registry, clazz$ResourceLocation, Object.class + ) + ); + + public static final Method method$Registry$registerForHolder = requireNonNull( + ReflectionUtils.getStaticMethod( + clazz$Registry, clazz$Holder$Reference, clazz$Registry, clazz$ResourceLocation, Object.class + ) + ); + + public static final Method method$Holder$Reference$bindValue = requireNonNull( + ReflectionUtils.getDeclaredMethod( + clazz$Holder$Reference, void.class, Object.class + ) + ); + + public static final Class clazz$Registries = requireNonNull( + ReflectionUtils.getClazz( + BukkitReflectionUtils.assembleMCClass("core.registries.Registries") + ) + ); + + public static final Class clazz$DefaultedRegistry = requireNonNull( + ReflectionUtils.getClazz( + BukkitReflectionUtils.assembleMCClass("core.DefaultedRegistry"), + BukkitReflectionUtils.assembleMCClass("core.RegistryBlocks") + ) + ); + + public static final Method method$Registry$getKey = requireNonNull( + ReflectionUtils.getMethod(clazz$Registry, clazz$ResourceLocation, Object.class) + ); + + public static final Method method$Registry$get = requireNonNull( + ReflectionUtils.getMethods( + clazz$Registry, Object.class, clazz$ResourceLocation + ).stream().filter(m -> m.getReturnType() != Optional.class).findAny().orElse(null) + ); + + // use ResourceLocation + public static final Method method$Registry$getHolder0; + // use ResourceKey + public static final Method method$Registry$getHolder1; + + static { + List methods = ReflectionUtils.getMethods( + clazz$Registry, Optional.class, clazz$ResourceLocation + ); + Method theMethod1 = null; + for (Method method : methods) { + Type returnType = method.getGenericReturnType(); + if (method.getParameterCount() == 1 && method.getParameterTypes()[0] == clazz$ResourceLocation) { + if (returnType instanceof ParameterizedType parameterizedType) { + Type[] actualTypeArguments = parameterizedType.getActualTypeArguments(); + if (actualTypeArguments.length == 1) { + if (actualTypeArguments[0] instanceof ParameterizedType) { + theMethod1 = method; + } + } + } + } + } + method$Registry$getHolder0 = theMethod1; + } + + static { + List methods = ReflectionUtils.getMethods( + clazz$Registry, Optional.class, clazz$ResourceKey + ); + Method theMethod1 = null; + for (Method method : methods) { + Type returnType = method.getGenericReturnType(); + if (method.getParameterCount() == 1 && method.getParameterTypes()[0] == clazz$ResourceKey) { + if (returnType instanceof ParameterizedType parameterizedType) { + Type[] actualTypeArguments = parameterizedType.getActualTypeArguments(); + if (actualTypeArguments.length == 1) { + if (actualTypeArguments[0] instanceof ParameterizedType) { + theMethod1 = method; + } + } + } + } + } + method$Registry$getHolder1 = theMethod1; + } + + public static final Class clazz$ClientboundSetPlayerTeamPacket = requireNonNull( + ReflectionUtils.getClazz( + BukkitReflectionUtils.assembleMCClass("network.protocol.game.ClientboundSetPlayerTeamPacket"), + BukkitReflectionUtils.assembleMCClass("network.protocol.game.PacketPlayOutScoreboardTeam") + ) + ); + + public static final Field field$ClientboundSetPlayerTeamPacket$method = requireNonNull( + ReflectionUtils.getInstanceDeclaredField( + clazz$ClientboundSetPlayerTeamPacket, int.class, 0 + ) + ); + + public static final Field field$ClientboundSetPlayerTeamPacket$players = requireNonNull( + ReflectionUtils.getInstanceDeclaredField( + clazz$ClientboundSetPlayerTeamPacket, Collection.class, 0 + ) + ); + + public static final Field field$ClientboundSetPlayerTeamPacket$parameters = requireNonNull( + ReflectionUtils.getInstanceDeclaredField( + clazz$ClientboundSetPlayerTeamPacket, Optional.class, 0 + ) + ); + + public static final Class clazz$ClientboundSetPlayerTeamPacket$Parameters = requireNonNull( + ReflectionUtils.getClazz( + BukkitReflectionUtils.assembleMCClass("network.protocol.game.ClientboundSetPlayerTeamPacket$Parameters"), + BukkitReflectionUtils.assembleMCClass("network.protocol.game.PacketPlayOutScoreboardTeam$b") + ) + ); + + public static final Field field$ClientboundSetPlayerTeamPacket$Parameters$nametagVisibility = requireNonNull( + ReflectionUtils.getInstanceDeclaredField( + clazz$ClientboundSetPlayerTeamPacket$Parameters, String.class, 0 + ) + ); + + public static final Class clazz$ServerConnectionListener = requireNonNull( + ReflectionUtils.getClazz( + BukkitReflectionUtils.assembleMCClass("server.network.ServerConnectionListener"), + BukkitReflectionUtils.assembleMCClass("server.network.ServerConnection") + ) + ); + + public static final Field field$MinecraftServer$connection = requireNonNull( + ReflectionUtils.getDeclaredField(clazz$MinecraftServer, clazz$ServerConnectionListener, 0) + ); + + public static final Field field$ServerConnectionListener$channels; + + static { + Field[] fields = clazz$ServerConnectionListener.getDeclaredFields(); + Field f = null; + for (Field field : fields) { + if (List.class.isAssignableFrom(field.getType())) { + Type genericType = field.getGenericType(); + if (genericType instanceof ParameterizedType paramType) { + Type[] actualTypeArguments = paramType.getActualTypeArguments(); + if (actualTypeArguments.length > 0 && actualTypeArguments[0] == ChannelFuture.class) { + f = ReflectionUtils.setAccessible(field); + break; + } + } + } + } + field$ServerConnectionListener$channels = requireNonNull(f); + } + + public static final Field field$ServerConnectionListener$connections; + + static { + Field[] fields = clazz$ServerConnectionListener.getDeclaredFields(); + Field f = null; + for (Field field : fields) { + if (List.class.isAssignableFrom(field.getType())) { + Type genericType = field.getGenericType(); + if (genericType instanceof ParameterizedType paramType) { + Type[] actualTypeArguments = paramType.getActualTypeArguments(); + if (actualTypeArguments.length > 0 && actualTypeArguments[0] == clazz$Connection) { + f = ReflectionUtils.setAccessible(field); + break; + } + } + } + } + field$ServerConnectionListener$connections = requireNonNull(f); + } + + public static final Class clazz$ClientboundBlockUpdatePacket = requireNonNull( + ReflectionUtils.getClazz( + BukkitReflectionUtils.assembleMCClass("network.protocol.game.ClientboundBlockUpdatePacket"), + BukkitReflectionUtils.assembleMCClass("network.protocol.game.PacketPlayOutBlockChange") + ) + ); + + public static final Class clazz$ClientboundSectionBlocksUpdatePacket = requireNonNull( + ReflectionUtils.getClazz( + BukkitReflectionUtils.assembleMCClass("network.protocol.game.ClientboundSectionBlocksUpdatePacket"), + BukkitReflectionUtils.assembleMCClass("network.protocol.game.PacketPlayOutMultiBlockChange") + ) + ); + + public static final Class clazz$BlockPos = requireNonNull( + ReflectionUtils.getClazz( + BukkitReflectionUtils.assembleMCClass("core.BlockPos"), + BukkitReflectionUtils.assembleMCClass("core.BlockPosition") + ) + ); + + public static final Class clazz$SectionPos = requireNonNull( + ReflectionUtils.getClazz( + BukkitReflectionUtils.assembleMCClass("core.SectionPos"), + BukkitReflectionUtils.assembleMCClass("core.SectionPosition") + ) + ); + + public static final Class clazz$Vec3i = requireNonNull( + ReflectionUtils.getClazz( + BukkitReflectionUtils.assembleMCClass("core.Vec3i"), + BukkitReflectionUtils.assembleMCClass("core.BaseBlockPosition") + ) + ); + + public static final Field field$Vec3i$x = requireNonNull( + ReflectionUtils.getDeclaredField(clazz$Vec3i, int.class, 0) + ); + + public static final Field field$Vec3i$y = requireNonNull( + ReflectionUtils.getDeclaredField(clazz$Vec3i, int.class, 1) + ); + + public static final Field field$Vec3i$z = requireNonNull( + ReflectionUtils.getDeclaredField(clazz$Vec3i, int.class, 2) + ); + + public static final Class clazz$BlockState = requireNonNull( + ReflectionUtils.getClazz( + BukkitReflectionUtils.assembleMCClass("world.level.block.state.BlockState"), + BukkitReflectionUtils.assembleMCClass("world.level.block.state.IBlockData") + ) + ); + + public static final Field field$ClientboundSectionBlocksUpdatePacket$positions = requireNonNull( + ReflectionUtils.getDeclaredField( + clazz$ClientboundSectionBlocksUpdatePacket, short[].class, 0 + ) + ); + + public static final Field field$ClientboundSectionBlocksUpdatePacket$states = requireNonNull( + ReflectionUtils.getDeclaredField( + clazz$ClientboundSectionBlocksUpdatePacket, clazz$BlockState.arrayType(), 0 + ) + ); + + public static final Field field$ClientboundSectionBlocksUpdatePacket$sectionPos = requireNonNull( + ReflectionUtils.getDeclaredField( + clazz$ClientboundSectionBlocksUpdatePacket, clazz$SectionPos, 0 + ) + ); + + public static final Field field$ClientboundBlockUpdatePacket$blockstate = requireNonNull( + ReflectionUtils.getDeclaredField( + clazz$ClientboundBlockUpdatePacket, clazz$BlockState, 0 + ) + ); + + public static final Field field$ClientboundBlockUpdatePacket$blockPos = requireNonNull( + ReflectionUtils.getDeclaredField( + clazz$ClientboundBlockUpdatePacket, clazz$BlockPos, 0 + ) + ); + + public static final Class clazz$Block = requireNonNull( + ReflectionUtils.getClazz( + BukkitReflectionUtils.assembleMCClass("world.level.block.Block") + ) + ); + + public static final Class clazz$IdMapper = requireNonNull( + ReflectionUtils.getClazz( + BukkitReflectionUtils.assembleMCClass("core.IdMapper"), + BukkitReflectionUtils.assembleMCClass("core.RegistryBlockID") + ) + ); + + public static final Class clazz$IdMap = requireNonNull( + clazz$IdMapper.getInterfaces()[0] + ); + + public static final Method method$IdMap$byId = requireNonNull( + ReflectionUtils.getMethod( + clazz$IdMap, Object.class, int.class + ) + ); + + public static final Method method$IdMap$size = requireNonNull( + ReflectionUtils.getMethod(clazz$IdMap, int.class) + ); + + public static final Method method$IdMapper$size = requireNonNull( + ReflectionUtils.getMethod(clazz$IdMapper, int.class) + ); + + public static final Method method$IdMapper$getId = requireNonNull( + ReflectionUtils.getMethod(clazz$IdMapper, int.class, Object.class) + ); + + public static final Method method$IdMapper$byId = requireNonNull( + ReflectionUtils.getMethod(clazz$IdMapper, Object.class, int.class) + ); + + public static final Field field$BLOCK_STATE_REGISTRY = requireNonNull( + ReflectionUtils.getDeclaredField(clazz$Block, clazz$IdMapper, 0) + ); + + public static final Method method$Registry$asHolderIdMap = requireNonNull( + ReflectionUtils.getMethod(clazz$Registry, clazz$IdMap) + ); + + public static final Class clazz$LevelAccessor = requireNonNull( + ReflectionUtils.getClazz( + BukkitReflectionUtils.assembleMCClass("world.level.LevelAccessor"), + BukkitReflectionUtils.assembleMCClass("world.level.GeneratorAccess") + ) + ); + + public static final Object instance$BLOCK_STATE_REGISTRY; + + static { + try { + instance$BLOCK_STATE_REGISTRY = field$BLOCK_STATE_REGISTRY.get(null); + } catch (ReflectiveOperationException e) { + throw new RuntimeException(e); + } + } + + public static final Class clazz$Direction = requireNonNull( + ReflectionUtils.getClazz( + BukkitReflectionUtils.assembleMCClass("core.Direction"), + BukkitReflectionUtils.assembleMCClass("core.EnumDirection") + ) + ); + + public static final Method method$Direction$values = requireNonNull( + ReflectionUtils.getStaticMethod( + clazz$Direction, clazz$Direction.arrayType() + ) + ); + + public static final Object instance$Direction$DOWN; + public static final Object instance$Direction$UP; + public static final Object[] instance$Directions; + + static { + try { + instance$Directions = (Object[]) method$Direction$values.invoke(null); + instance$Direction$DOWN = instance$Directions[0]; + instance$Direction$UP = instance$Directions[1]; + } catch (ReflectiveOperationException e) { + throw new RuntimeException(e); + } + } + + public static final Class clazz$CraftBlock = requireNonNull( + ReflectionUtils.getClazz( + BukkitReflectionUtils.assembleCBClass("block.CraftBlock") + ) + ); + + public static final Class clazz$CraftEventFactory = requireNonNull( + ReflectionUtils.getClazz( + BukkitReflectionUtils.assembleCBClass("event.CraftEventFactory") + ) + ); + + public static final Class clazz$CraftBlockStates = requireNonNull( + ReflectionUtils.getClazz( + BukkitReflectionUtils.assembleCBClass("block.CraftBlockStates") + ) + ); + + public static final Class clazz$CraftBlockState = requireNonNull( + ReflectionUtils.getClazz( + BukkitReflectionUtils.assembleCBClass("block.CraftBlockState") + ) + ); + + public static final Method method$CraftBlock$at = requireNonNull( + ReflectionUtils.getStaticMethod( + clazz$CraftBlock, clazz$CraftBlock, clazz$LevelAccessor, clazz$BlockPos + ) + ); + + public static final Method method$CraftBlockStates$getBlockState = requireNonNull( + ReflectionUtils.getStaticMethod( + clazz$CraftBlockStates, clazz$CraftBlockState, clazz$LevelAccessor, clazz$BlockPos + ) + ); + + public static final Class clazz$CraftBlockData = requireNonNull( + ReflectionUtils.getClazz( + BukkitReflectionUtils.assembleCBClass("block.data.CraftBlockData") + ) + ); + + public static final Field field$CraftBlockData$data = requireNonNull( + ReflectionUtils.getDeclaredField( + clazz$CraftBlockData, clazz$BlockState, 0 + ) + ); + + public static final Method method$CraftBlockData$createData = requireNonNull( + ReflectionUtils.getStaticMethod( + clazz$CraftBlockData, new String[]{"createData"}, clazz$CraftBlockData, clazz$BlockState + ) + ); + + public static final Method method$CraftBlockData$fromData = requireNonNull( + ReflectionUtils.getStaticMethod( + clazz$CraftBlockData, new String[]{"fromData"}, clazz$CraftBlockData, clazz$BlockState + ) + ); + + public static final Constructor constructor$BlockPos = requireNonNull( + ReflectionUtils.getConstructor( + clazz$BlockPos, int.class, int.class, int.class + ) + ); + + public static final Method method$Vec3i$relative = requireNonNull( + ReflectionUtils.getMethod( + clazz$Vec3i, clazz$Vec3i, clazz$Direction + ) + ); + + public static final Method method$BlockPos$relative = requireNonNull( + ReflectionUtils.getMethod( + clazz$BlockPos, clazz$BlockPos, clazz$Direction + ) + ); + + public static final Constructor constructor$ClientboundBlockUpdatePacket = requireNonNull( + ReflectionUtils.getConstructor( + clazz$ClientboundBlockUpdatePacket, clazz$BlockPos, clazz$BlockState + ) + ); + + public static final Class clazz$FriendlyByteBuf = requireNonNull( + ReflectionUtils.getClazz( + BukkitReflectionUtils.assembleMCClass("network.FriendlyByteBuf"), + BukkitReflectionUtils.assembleMCClass("network.PacketDataSerializer") + ) + ); + + public static final Class clazz$RegistryFriendlyByteBuf = + ReflectionUtils.getClazz( + BukkitReflectionUtils.assembleMCClass("network.RegistryFriendlyByteBuf") + ); + + public static final Constructor constructor$RegistryFriendlyByteBuf = Optional.ofNullable(clazz$RegistryFriendlyByteBuf) + .map(it -> ReflectionUtils.getConstructor(it, 0)) + .orElse(null); + + public static final Constructor constructor$FriendlyByteBuf = requireNonNull( + ReflectionUtils.getConstructor( + clazz$FriendlyByteBuf, ByteBuf.class + ) + ); + + public static final Method method$FriendlyByteBuf$writeByte = requireNonNull( + ReflectionUtils.getMethod( + clazz$FriendlyByteBuf, clazz$FriendlyByteBuf, int.class + ) + ); + + public static final Method method$FriendlyByteBuf$writeLongArray = requireNonNull( + ReflectionUtils.getMethod( + clazz$FriendlyByteBuf, clazz$FriendlyByteBuf, long[].class + ) + ); + + public static final Class clazz$PalettedContainer = requireNonNull( + ReflectionUtils.getClazz( + BukkitReflectionUtils.assembleMCClass("world.level.chunk.PalettedContainer"), + BukkitReflectionUtils.assembleMCClass("world.level.chunk.DataPaletteBlock") + ) + ); + + public static final Class clazz$PalettedContainer$Data = requireNonNull( + ReflectionUtils.getClazz( + BukkitReflectionUtils.assembleMCClass("world.level.chunk.PalettedContainer$Data"), + BukkitReflectionUtils.assembleMCClass("world.level.chunk.DataPaletteBlock$c") + ) + ); + + public static final Class clazz$BitStorage = requireNonNull( + ReflectionUtils.getClazz( + BukkitReflectionUtils.assembleMCClass("util.BitStorage"), + BukkitReflectionUtils.assembleMCClass("util.DataBits") + ) + ); + + public static final Class clazz$Palette = requireNonNull( + ReflectionUtils.getClazz( + BukkitReflectionUtils.assembleMCClass("world.level.chunk.Palette"), + BukkitReflectionUtils.assembleMCClass("world.level.chunk.DataPalette") + ) + ); + + public static final Field field$PalettedContainer$data = requireNonNull( + ReflectionUtils.getDeclaredField( + clazz$PalettedContainer, clazz$PalettedContainer$Data, 0 + ) + ); + + public static final Field field$PalettedContainer$Data$storage = requireNonNull( + ReflectionUtils.getDeclaredField( + clazz$PalettedContainer$Data, clazz$BitStorage, 0 + ) + ); + + public static final Field field$PalettedContainer$Data$palette = requireNonNull( + ReflectionUtils.getDeclaredField( + clazz$PalettedContainer$Data, clazz$Palette, 0 + ) + ); + + public static final Method method$BitStorage$getBits = requireNonNull( + ReflectionUtils.getMethod( + clazz$BitStorage, int.class + ) + ); + + public static final Method method$BitStorage$getRaw = requireNonNull( + ReflectionUtils.getMethod( + clazz$BitStorage, long[].class + ) + ); + + public static final Method method$Palette$write = requireNonNull( + ReflectionUtils.getMethod( + clazz$Palette, void.class, clazz$FriendlyByteBuf + ) + ); + + public static final Class clazz$ClientboundLevelChunkWithLightPacket = requireNonNull( + ReflectionUtils.getClazz( + BukkitReflectionUtils.assembleMCClass("network.protocol.game.ClientboundLevelChunkWithLightPacket") + ) + ); + + public static final Class clazz$ClientboundLevelChunkPacketData = requireNonNull( + ReflectionUtils.getClazz( + BukkitReflectionUtils.assembleMCClass("network.protocol.game.ClientboundLevelChunkPacketData") + ) + ); + + public static final Field field$ClientboundLevelChunkWithLightPacket$chunkData = requireNonNull( + ReflectionUtils.getDeclaredField( + clazz$ClientboundLevelChunkWithLightPacket, clazz$ClientboundLevelChunkPacketData, 0 + ) + ); + + public static final Field field$ClientboundLevelChunkWithLightPacket$x = requireNonNull( + ReflectionUtils.getDeclaredField( + clazz$ClientboundLevelChunkWithLightPacket, int.class, 0 + ) + ); + + public static final Field field$ClientboundLevelChunkWithLightPacket$z = requireNonNull( + ReflectionUtils.getDeclaredField( + clazz$ClientboundLevelChunkWithLightPacket, int.class, 1 + ) + ); + + public static final Field field$ClientboundLevelChunkPacketData$buffer = requireNonNull( + ReflectionUtils.getDeclaredField( + clazz$ClientboundLevelChunkPacketData, byte[].class, 0 + ) + ); + + public static final Field field$BlockPhysicsEvent$changed = requireNonNull( + ReflectionUtils.getDeclaredField( + BlockPhysicsEvent.class, BlockData.class, 0 + ) + ); + + public static final Class clazz$CraftChunk = requireNonNull( + ReflectionUtils.getClazz( + BukkitReflectionUtils.assembleCBClass("CraftChunk") + ) + ); + + public static final Field field$CraftChunk$worldServer = requireNonNull( + ReflectionUtils.getDeclaredField( + clazz$CraftChunk, clazz$ServerLevel, 0 + ) + ); + + public static final Class clazz$ChunkAccess = requireNonNull( + ReflectionUtils.getClazz( + BukkitReflectionUtils.assembleMCClass("world.level.chunk.ChunkAccess"), + BukkitReflectionUtils.assembleMCClass("world.level.chunk.IChunkAccess") + ) + ); + + public static final Class clazz$LevelChunk = requireNonNull( + ReflectionUtils.getClazz( + BukkitReflectionUtils.assembleMCClass("world.level.chunk.LevelChunk"), + BukkitReflectionUtils.assembleMCClass("world.level.chunk.Chunk") + ) + ); + + public static final Class clazz$LevelChunkSection = requireNonNull( + ReflectionUtils.getClazz( + BukkitReflectionUtils.assembleMCClass("world.level.chunk.LevelChunkSection"), + BukkitReflectionUtils.assembleMCClass("world.level.chunk.ChunkSection") + ) + ); + + public static final Class clazz$ServerChunkCache = requireNonNull( + ReflectionUtils.getClazz( + BukkitReflectionUtils.assembleMCClass("server.level.ServerChunkCache"), + BukkitReflectionUtils.assembleMCClass("server.level.ChunkProviderServer") + ) + ); + + public static final Field field$ServerLevel$chunkSource = requireNonNull( + ReflectionUtils.getDeclaredField( + clazz$ServerLevel, clazz$ServerChunkCache, 0 + ) + ); + + public static final Method method$ServerChunkCache$blockChanged = requireNonNull( + ReflectionUtils.getMethod( + clazz$ServerChunkCache, void.class, clazz$BlockPos + ) + ); + + public static final Method method$ServerChunkCache$getChunkAtIfLoadedMainThread = requireNonNull( + ReflectionUtils.getMethod( + clazz$ServerChunkCache, clazz$LevelChunk, int.class, int.class + ) + ); + + public static final Field field$ChunkAccess$sections = requireNonNull( + ReflectionUtils.getDeclaredField( + clazz$ChunkAccess, clazz$LevelChunkSection.arrayType(), 0 + ) + ); + + public static final Class clazz$BlockEntity = requireNonNull( + ReflectionUtils.getClazz( + BukkitReflectionUtils.assembleMCClass("world.level.block.entity.BlockEntity"), + BukkitReflectionUtils.assembleMCClass("world.level.block.entity.TileEntity") + ) + ); + + public static final Class clazz$AbstractFurnaceBlockEntity = requireNonNull( + ReflectionUtils.getClazz( + BukkitReflectionUtils.assembleMCClass("world.level.block.entity.AbstractFurnaceBlockEntity"), + BukkitReflectionUtils.assembleMCClass("world.level.block.entity.TileEntityFurnace") + ) + ); + + public static final Class clazz$CampfireBlockEntity = requireNonNull( + ReflectionUtils.getClazz( + BukkitReflectionUtils.assembleMCClass("world.level.block.entity.CampfireBlockEntity"), + BukkitReflectionUtils.assembleMCClass("world.level.block.entity.TileEntityCampfire") + ) + ); + + public static final Field field$ChunkAccess$blockEntities; + + static { + Field targetField = null; + for (Field field : clazz$ChunkAccess.getDeclaredFields()) { + if (Map.class.isAssignableFrom(field.getType())) { + Type genericType = field.getGenericType(); + if (genericType instanceof ParameterizedType parameterizedType) { + Type[] actualTypeArguments = parameterizedType.getActualTypeArguments(); + if (actualTypeArguments.length == 2 && + actualTypeArguments[0].equals(clazz$BlockPos) && + actualTypeArguments[1].equals(clazz$BlockEntity)) { + field.setAccessible(true); + targetField = field; + } + } + } + } + field$ChunkAccess$blockEntities = targetField; + } + + public static final Method method$LevelChunkSection$setBlockState = requireNonNull( + ReflectionUtils.getMethod( + clazz$LevelChunkSection, clazz$BlockState, int.class, int.class, int.class, clazz$BlockState, boolean.class + ) + ); + + public static final Class clazz$StatePredicate = requireNonNull( + ReflectionUtils.getClazz( + BukkitReflectionUtils.assembleMCClass("world.level.block.state.BlockBehaviour$StatePredicate"), + BukkitReflectionUtils.assembleMCClass("world.level.block.state.BlockBase$f") + ) + ); + + public static final Class clazz$BlockBehaviour$Properties = requireNonNull( + ReflectionUtils.getClazz( + BukkitReflectionUtils.assembleMCClass("world.level.block.state.BlockBehaviour$Properties"), + BukkitReflectionUtils.assembleMCClass("world.level.block.state.BlockBase$Info") + ) + ); + + public static final Class clazz$BlockBehaviour = requireNonNull( + ReflectionUtils.getClazz( + BukkitReflectionUtils.assembleMCClass("world.level.block.state.BlockBehaviour"), + BukkitReflectionUtils.assembleMCClass("world.level.block.state.BlockBase") + ) + ); + + public static final Method method$BlockBehaviour$Properties$of = requireNonNull( + ReflectionUtils.getStaticMethod( + clazz$BlockBehaviour$Properties, clazz$BlockBehaviour$Properties + ) + ); + + public static final Field field$BlockBehaviour$Properties$id = ReflectionUtils.getDeclaredField( + clazz$BlockBehaviour$Properties, clazz$ResourceKey, 0 + ); + + public static final Constructor constructor$Block = requireNonNull( + ReflectionUtils.getConstructor(clazz$Block, clazz$BlockBehaviour$Properties) + ); + + public static final Class clazz$MobEffect = requireNonNull( + ReflectionUtils.getClazz( + BukkitReflectionUtils.assembleMCClass("world.effect.MobEffectList"), + BukkitReflectionUtils.assembleMCClass("world.effect.MobEffect") + ) + ); + + public static final Class clazz$MobEffectInstance = requireNonNull( + ReflectionUtils.getClazz( + BukkitReflectionUtils.assembleMCClass("world.effect.MobEffectInstance"), + BukkitReflectionUtils.assembleMCClass("world.effect.MobEffect") + ) + ); + + public static final Class clazz$ParticleType = requireNonNull( + Optional.of(Objects.requireNonNull(ReflectionUtils.getClazz( + BukkitReflectionUtils.assembleMCClass("core.particles.ParticleType")))).map(it -> { + if (it.getSuperclass() != Object.class) { + return it.getSuperclass(); + } + return it; + }).orElseThrow() + ); + + public static final Class clazz$SoundType = requireNonNull( + ReflectionUtils.getClazz( + BukkitReflectionUtils.assembleMCClass("world.level.block.SoundType"), + BukkitReflectionUtils.assembleMCClass("world.level.block.SoundEffectType") + ) + ); + + public static final Constructor constructor$SoundType = requireNonNull( + ReflectionUtils.getConstructor( + clazz$SoundType, float.class, float.class, clazz$SoundEvent, clazz$SoundEvent, clazz$SoundEvent, clazz$SoundEvent, clazz$SoundEvent + ) + ); + + public static final Class clazz$ItemLike = requireNonNull( + ReflectionUtils.getClazz( + BukkitReflectionUtils.assembleMCClass("world.level.ItemLike"), + BukkitReflectionUtils.assembleMCClass("world.level.IMaterial") + ) + ); + + public static final Class clazz$Item = requireNonNull( + ReflectionUtils.getClazz( + BukkitReflectionUtils.assembleMCClass("world.item.Item") + ) + ); + + public static final Class clazz$FluidState = requireNonNull( + ReflectionUtils.getClazz( + BukkitReflectionUtils.assembleMCClass("world.level.material.Fluid"), + BukkitReflectionUtils.assembleMCClass("world.level.material.FluidState") + ) + ); + + public static final Class clazz$Fluid = requireNonNull( + ReflectionUtils.getClazz( + BukkitReflectionUtils.assembleMCClass("world.level.material.FluidType"), + BukkitReflectionUtils.assembleMCClass("world.level.material.Fluid") + ) + ); + + public static final Class clazz$RecipeType = requireNonNull( + ReflectionUtils.getClazz( + BukkitReflectionUtils.assembleMCClass("world.item.crafting.RecipeType"), + BukkitReflectionUtils.assembleMCClass("world.item.crafting.Recipes") + ) + ); + + public static final Class clazz$WorldGenLevel = requireNonNull( + ReflectionUtils.getClazz( + BukkitReflectionUtils.assembleMCClass("world.level.WorldGenLevel"), + BukkitReflectionUtils.assembleMCClass("world.level.GeneratorAccessSeed") + ) + ); + + public static final Class clazz$ChunkGenerator = requireNonNull( + ReflectionUtils.getClazz( + BukkitReflectionUtils.assembleMCClass("world.level.chunk.ChunkGenerator") + ) + ); + + // 1.20.1-1.20.2 + public static final Class clazz$AbstractTreeGrower = + ReflectionUtils.getClazz( + BukkitReflectionUtils.assembleMCClass("world.level.block.grower.AbstractTreeGrower"), + BukkitReflectionUtils.assembleMCClass("world.level.block.grower.WorldGenTreeProvider") + ); + + public static final Class clazz$ConfiguredFeature = requireNonNull( + ReflectionUtils.getClazz( + BukkitReflectionUtils.assembleMCClass("world.level.levelgen.feature.ConfiguredFeature"), + BukkitReflectionUtils.assembleMCClass("world.level.levelgen.feature.WorldGenFeatureConfigured") + ) + ); + + // 1.21+ + public static final Class clazz$JukeboxSong = + ReflectionUtils.getClazz( + BukkitReflectionUtils.assembleMCClass("world.item.JukeboxSong") + ); + + public static final Object instance$BuiltInRegistries$BLOCK; + public static final Object instance$BuiltInRegistries$ITEM; + public static final Object instance$BuiltInRegistries$ATTRIBUTE; + public static final Object instance$BuiltInRegistries$BIOME; + public static final Object instance$BuiltInRegistries$MOB_EFFECT; + public static final Object instance$BuiltInRegistries$SOUND_EVENT; + public static final Object instance$BuiltInRegistries$PARTICLE_TYPE; + public static final Object instance$BuiltInRegistries$ENTITY_TYPE; + public static final Object instance$BuiltInRegistries$FLUID; + public static final Object instance$BuiltInRegistries$RECIPE_TYPE; + public static final Object instance$InternalRegistries$DIMENSION_TYPE; + @Nullable // 1.21+ + public static final Object instance$InternalRegistries$JUKEBOX_SONG; + + public static final Object instance$Registries$BLOCK; + public static final Object instance$Registries$ITEM; + public static final Object instance$Registries$ATTRIBUTE; + public static final Object instance$Registries$BIOME; + public static final Object instance$Registries$MOB_EFFECT; + public static final Object instance$Registries$SOUND_EVENT; + public static final Object instance$Registries$PARTICLE_TYPE; + public static final Object instance$Registries$ENTITY_TYPE; + public static final Object instance$Registries$FLUID; + public static final Object instance$Registries$RECIPE_TYPE; + public static final Object instance$Registries$DIMENSION_TYPE; + public static final Object instance$Registries$CONFIGURED_FEATURE; + @Nullable // 1.21+ + public static final Object instance$Registries$JUKEBOX_SONG; + + public static final Object instance$registryAccess; + + static { + Field[] fields = clazz$Registries.getDeclaredFields(); + try { + Object registries$Block = null; + Object registries$Attribute = null; + Object registries$Biome = null; + Object registries$MobEffect = null; + Object registries$SoundEvent = null; + Object registries$DimensionType = null; + Object registries$ParticleType = null; + Object registries$EntityType = null; + Object registries$Item = null; + Object registries$Fluid = null; + Object registries$RecipeType = null; + Object registries$ConfiguredFeature = null; + Object registries$JukeboxSong = null; + for (Field field : fields) { + Type fieldType = field.getGenericType(); + if (fieldType instanceof ParameterizedType paramType) { + if (paramType.getRawType() == clazz$ResourceKey) { + Type[] actualTypeArguments = paramType.getActualTypeArguments(); + if (actualTypeArguments.length == 1 && actualTypeArguments[0] instanceof ParameterizedType registryType) { + Type type = registryType.getActualTypeArguments()[0]; + if (type instanceof ParameterizedType parameterizedType) { + Type rawType = parameterizedType.getRawType(); + if (rawType == clazz$ParticleType) { + registries$ParticleType = field.get(null); + } else if (rawType == clazz$EntityType) { + registries$EntityType = field.get(null); + } else if (rawType == clazz$RecipeType) { + registries$RecipeType = field.get(null); + } else if (rawType == clazz$ConfiguredFeature) { + registries$ConfiguredFeature = field.get(null); + } + } else { + if (type == clazz$Block) { + registries$Block = field.get(null); + } else if (type == clazz$Attribute) { + registries$Attribute = field.get(null); + } else if (type == clazz$Biome) { + registries$Biome = field.get(null); + } else if (type == clazz$MobEffect) { + registries$MobEffect = field.get(null); + } else if (type == clazz$SoundEvent) { + registries$SoundEvent = field.get(null); + } else if (type == clazz$DimensionType) { + registries$DimensionType = field.get(null); + } else if (type == clazz$Item) { + registries$Item = field.get(null); + } else if (type == clazz$Fluid) { + registries$Fluid = field.get(null); + } else if (VersionHelper.isVersionNewerThan1_21() && type == clazz$JukeboxSong) { + registries$JukeboxSong = field.get(null); + } + } + } + } + } + } + instance$Registries$BLOCK = requireNonNull(registries$Block); + instance$Registries$ITEM = requireNonNull(registries$Item); + instance$Registries$ATTRIBUTE = requireNonNull(registries$Attribute); + instance$Registries$BIOME = requireNonNull(registries$Biome); + instance$Registries$MOB_EFFECT = requireNonNull(registries$MobEffect); + instance$Registries$SOUND_EVENT = requireNonNull(registries$SoundEvent); + instance$Registries$DIMENSION_TYPE = requireNonNull(registries$DimensionType); + instance$Registries$PARTICLE_TYPE = requireNonNull(registries$ParticleType); + instance$Registries$ENTITY_TYPE = requireNonNull(registries$EntityType); + instance$Registries$FLUID = requireNonNull(registries$Fluid); + instance$Registries$RECIPE_TYPE = requireNonNull(registries$RecipeType); + instance$Registries$CONFIGURED_FEATURE = requireNonNull(registries$ConfiguredFeature); + instance$Registries$JUKEBOX_SONG = registries$JukeboxSong; + Object server = method$MinecraftServer$getServer.invoke(null); + Object registries = field$MinecraftServer$registries.get(server); + instance$registryAccess = field$LayeredRegistryAccess$composite.get(registries); + instance$BuiltInRegistries$BLOCK = method$RegistryAccess$registryOrThrow.invoke(instance$registryAccess, registries$Block); + instance$BuiltInRegistries$ITEM = method$RegistryAccess$registryOrThrow.invoke(instance$registryAccess, registries$Item); + instance$BuiltInRegistries$ATTRIBUTE = method$RegistryAccess$registryOrThrow.invoke(instance$registryAccess, registries$Attribute); + instance$BuiltInRegistries$BIOME = method$RegistryAccess$registryOrThrow.invoke(instance$registryAccess, registries$Biome); + instance$BuiltInRegistries$MOB_EFFECT = method$RegistryAccess$registryOrThrow.invoke(instance$registryAccess, registries$MobEffect); + instance$BuiltInRegistries$SOUND_EVENT = method$RegistryAccess$registryOrThrow.invoke(instance$registryAccess, registries$SoundEvent); + instance$InternalRegistries$DIMENSION_TYPE = method$RegistryAccess$registryOrThrow.invoke(instance$registryAccess, registries$DimensionType); + instance$BuiltInRegistries$PARTICLE_TYPE = method$RegistryAccess$registryOrThrow.invoke(instance$registryAccess, registries$ParticleType); + instance$BuiltInRegistries$ENTITY_TYPE = method$RegistryAccess$registryOrThrow.invoke(instance$registryAccess, registries$EntityType); + instance$BuiltInRegistries$FLUID = method$RegistryAccess$registryOrThrow.invoke(instance$registryAccess, registries$Fluid); + instance$BuiltInRegistries$RECIPE_TYPE = method$RegistryAccess$registryOrThrow.invoke(instance$registryAccess, registries$RecipeType); + if (registries$JukeboxSong == null) instance$InternalRegistries$JUKEBOX_SONG = null; + else instance$InternalRegistries$JUKEBOX_SONG = method$RegistryAccess$registryOrThrow.invoke(instance$registryAccess, registries$JukeboxSong); + } catch (ReflectiveOperationException e) { + throw new RuntimeException(e); + } + } + + public static final Method method$ResourceLocation$fromNamespaceAndPath = requireNonNull( + ReflectionUtils.getStaticMethod( + clazz$ResourceLocation, clazz$ResourceLocation, String.class, String.class + ) + ); + + public static final Object instance$Block$BLOCK_STATE_REGISTRY; + + static { + try { + Field field = ReflectionUtils.getDeclaredField(clazz$Block, clazz$IdMapper, 0); + assert field != null; + instance$Block$BLOCK_STATE_REGISTRY = field.get(null); + } catch (ReflectiveOperationException e) { + throw new RuntimeException(e); + } + } + + public static final Method method$IdMapper$add = requireNonNull( + ReflectionUtils.getMethod( + clazz$IdMapper, void.class, Object.class + ) + ); + + public static final Class clazz$StateDefinition = requireNonNull( + ReflectionUtils.getClazz( + BukkitReflectionUtils.assembleMCClass("world.level.block.state.StateDefinition"), + BukkitReflectionUtils.assembleMCClass("world.level.block.state.BlockStateList") + ) + ); + + public static final Field field$Block$StateDefinition = requireNonNull( + ReflectionUtils.getDeclaredField( + clazz$Block, clazz$StateDefinition, 0 + ) + ); + + public static final Field field$StateDefinition$states = requireNonNull( + ReflectionUtils.getDeclaredField( + clazz$StateDefinition, ImmutableList.class, 0 + ) + ); + + public static final Class clazz$MappedRegistry = requireNonNull( + ReflectionUtils.getClazz( + BukkitReflectionUtils.assembleMCClass("core.MappedRegistry"), + BukkitReflectionUtils.assembleMCClass("core.RegistryMaterials") + ) + ); + + public static final Field field$MappedRegistry$frozen = requireNonNull( + ReflectionUtils.getDeclaredField( + clazz$MappedRegistry, boolean.class, 0 + ) + ); + + public static final Method method$MappedRegistry$freeze = requireNonNull( + ReflectionUtils.getMethod( + clazz$MappedRegistry, clazz$Registry + ) + ); + + public static final Field field$MappedRegistry$byValue = requireNonNull( + ReflectionUtils.getDeclaredField( + clazz$MappedRegistry, Map.class, 2 + ) + ); + + public static final Field field$MappedRegistry$unregisteredIntrusiveHolders = requireNonNull( + ReflectionUtils.getDeclaredField( + clazz$MappedRegistry, Map.class, 5 + ) + ); + + public static final Class clazz$MapColor = requireNonNull( + ReflectionUtils.getClazz( + BukkitReflectionUtils.assembleMCClass("world.level.material.MapColor"), + BukkitReflectionUtils.assembleMCClass("world.level.material.MaterialMapColor") + ) + ); + + public static final Method method$MapColor$byId = requireNonNull( + ReflectionUtils.getStaticMethod( + clazz$MapColor, clazz$MapColor, int.class + ) + ); + + public static final Class clazz$PushReaction = requireNonNull( + ReflectionUtils.getClazz( + BukkitReflectionUtils.assembleMCClass("world.level.material.PushReaction"), + BukkitReflectionUtils.assembleMCClass("world.level.material.EnumPistonReaction") + ) + ); + + public static final Method method$PushReaction$values = requireNonNull( + ReflectionUtils.getMethod( + clazz$PushReaction, new String[] { "values" } + ) + ); + + public static final Class clazz$NoteBlockInstrument = requireNonNull( + ReflectionUtils.getClazz( + BukkitReflectionUtils.assembleMCClass("world.level.block.state.properties.NoteBlockInstrument"), + BukkitReflectionUtils.assembleMCClass("world.level.block.state.properties.BlockPropertyInstrument") + ) + ); + + public static final Method method$NoteBlockInstrument$values = requireNonNull( + ReflectionUtils.getMethod( + clazz$NoteBlockInstrument, new String[] { "values" } + ) + ); + + public static final Class clazz$BlockStateBase = requireNonNull( + ReflectionUtils.getClazz( + BukkitReflectionUtils.assembleMCClass("world.level.block.state.BlockBehaviour$BlockStateBase"), + BukkitReflectionUtils.assembleMCClass("world.level.block.state.BlockBase$BlockData") + ) + ); + + public static final Method method$BlockStateBase$initCache = requireNonNull( + ReflectionUtils.getMethod( + clazz$BlockStateBase, void.class, new String[] { "initCache", "a" } + ) + ); + + public static final Field field$BlockStateBase$isRedstoneConductor = requireNonNull( + ReflectionUtils.getDeclaredField( + clazz$BlockStateBase, clazz$StatePredicate, 0 + ) + ); + + public static final Field field$BlockStateBase$isSuffocating = requireNonNull( + ReflectionUtils.getDeclaredField( + clazz$BlockStateBase, clazz$StatePredicate, 1 + ) + ); + + public static final Field field$BlockStateBase$isViewBlocking = requireNonNull( + ReflectionUtils.getDeclaredField( + clazz$BlockStateBase, clazz$StatePredicate, 2 + ) + ); + + public static final Field field$BlockStateBase$pushReaction = requireNonNull( + ReflectionUtils.getDeclaredField( + clazz$BlockStateBase, clazz$PushReaction, 0 + ) + ); + + public static final Field field$BlockStateBase$mapColor = requireNonNull( + ReflectionUtils.getDeclaredField( + clazz$BlockStateBase, clazz$MapColor, 0 + ) + ); + + public static final Field field$BlockStateBase$instrument = requireNonNull( + ReflectionUtils.getDeclaredField( + clazz$BlockStateBase, clazz$NoteBlockInstrument, 0 + ) + ); + + public static final Field field$BlockStateBase$hardness = requireNonNull( + ReflectionUtils.getDeclaredField( + clazz$BlockStateBase, float.class, 0 + ) + ); + + public static final Field field$BlockStateBase$burnable = requireNonNull( + ReflectionUtils.getDeclaredField( + clazz$BlockStateBase, boolean.class, 2 + ) + ); + + public static final Field field$BlockStateBase$isRandomlyTicking = requireNonNull( + ReflectionUtils.getDeclaredField( + clazz$BlockStateBase, boolean.class, 9 + ) + ); + + public static final Field field$BlockStateBase$canOcclude = requireNonNull( + ReflectionUtils.getDeclaredField( + clazz$BlockStateBase, boolean.class, 6 + ) + ); + + public static final Field field$BlockStateBase$replaceable = requireNonNull( + ReflectionUtils.getDeclaredField( + clazz$BlockStateBase, boolean.class, 8 + ) + ); + + public static final Field field$BlockStateBase$lightEmission = requireNonNull( + ReflectionUtils.getDeclaredField( + clazz$BlockStateBase, int.class, 0 + ) + ); + + public static final Class clazz$AABB = requireNonNull( + ReflectionUtils.getClazz( + BukkitReflectionUtils.assembleMCClass("world.phys.AABB"), + BukkitReflectionUtils.assembleMCClass("world.phys.AxisAlignedBB") + ) + ); + + public static final Field field$AABB$minX = requireNonNull( + ReflectionUtils.getInstanceDeclaredField( + clazz$AABB, double.class, 0 + ) + ); + + public static final Field field$AABB$minY = requireNonNull( + ReflectionUtils.getInstanceDeclaredField( + clazz$AABB, double.class, 1 + ) + ); + + public static final Field field$AABB$minZ = requireNonNull( + ReflectionUtils.getInstanceDeclaredField( + clazz$AABB, double.class, 2 + ) + ); + + public static final Field field$AABB$maxX = requireNonNull( + ReflectionUtils.getInstanceDeclaredField( + clazz$AABB, double.class, 3 + ) + ); + + public static final Field field$AABB$maxY = requireNonNull( + ReflectionUtils.getInstanceDeclaredField( + clazz$AABB, double.class, 4 + ) + ); + + public static final Field field$AABB$maxZ = requireNonNull( + ReflectionUtils.getInstanceDeclaredField( + clazz$AABB, double.class, 5 + ) + ); + + public static final Method method$Block$box = requireNonNull( + ReflectionUtils.getStaticMethod( + clazz$Block, clazz$VoxelShape, double.class, double.class, double.class, double.class, double.class, double.class + ) + ); + + public static final Class clazz$BlockGetter = requireNonNull( + ReflectionUtils.getClazz( + BukkitReflectionUtils.assembleMCClass("world.level.BlockGetter"), + BukkitReflectionUtils.assembleMCClass("world.level.IBlockAccess") + ) + ); + + public static final Class clazz$StateHolder = requireNonNull( + ReflectionUtils.getClazz( + BukkitReflectionUtils.assembleMCClass("world.level.block.state.StateHolder"), + BukkitReflectionUtils.assembleMCClass("world.level.block.state.IBlockDataHolder") + ) + ); + + public static final Field field$StateHolder$owner = requireNonNull( + ReflectionUtils.getDeclaredField( + clazz$StateHolder, Object.class, 0 + ) + ); + + public static final Class clazz$CollisionContext = requireNonNull( + ReflectionUtils.getClazz( + BukkitReflectionUtils.assembleMCClass("world.phys.shapes.CollisionContext"), + BukkitReflectionUtils.assembleMCClass("world.phys.shapes.VoxelShapeCollision") + ) + ); + + public static final Method method$BlockBehaviour$getShape = requireNonNull( + ReflectionUtils.getDeclaredMethod( + clazz$BlockBehaviour, clazz$VoxelShape, new String[]{"getShape", "a"}, clazz$BlockState, clazz$BlockGetter, clazz$BlockPos, clazz$CollisionContext + ) + ); + + public static final Method method$BlockBehaviour$tick = requireNonNull( + ReflectionUtils.getDeclaredMethod( + clazz$BlockBehaviour, void.class, new String[]{"tick", "a"}, clazz$BlockState, clazz$ServerLevel, clazz$BlockPos, clazz$RandomSource + ) + ); + + public static final Method method$BlockBehaviour$randomTick = requireNonNull( + ReflectionUtils.getDeclaredMethod( + clazz$BlockBehaviour, void.class, new String[]{"randomTick", "b"}, clazz$BlockState, clazz$ServerLevel, clazz$BlockPos, clazz$RandomSource + ) + ); + + public static final Method method$BlockGetter$getBlockState = requireNonNull( + ReflectionUtils.getMethod( + clazz$BlockGetter, clazz$BlockState, clazz$BlockPos + ) + ); + + public static final Method method$LevelAccessor$scheduleTick = requireNonNull( + ReflectionUtils.getMethod( + clazz$LevelAccessor, void.class, clazz$BlockPos, clazz$Block, int.class + ) + ); + + public static final Method method$CraftBlock$setTypeAndData = requireNonNull( + ReflectionUtils.getStaticMethod( + clazz$CraftBlock, boolean.class, clazz$LevelAccessor, clazz$BlockPos, clazz$BlockState, clazz$BlockState, boolean.class + ) + ); + + public static final Class clazz$MappedRegistry$TagSet = ReflectionUtils.getClazz( + BukkitReflectionUtils.assembleMCClass("core.MappedRegistry$TagSet") + //BukkitReflectionUtils.assembleMCClass("core.RegistryMaterials$TagSet") 1.21.2+ + ); + + public static final Field field$MappedRegistry$allTags = Optional.ofNullable(clazz$MappedRegistry$TagSet) + .map(it -> ReflectionUtils.getDeclaredField(clazz$MappedRegistry, it, 0)) + .orElse(null); + + public static final Method method$MappedRegistry$TagSet$unbound = Optional.ofNullable(clazz$MappedRegistry$TagSet) + .map(it -> ReflectionUtils.getStaticMethod(clazz$MappedRegistry$TagSet, clazz$MappedRegistry$TagSet)) + .orElse(null); + + public static final Method method$TagSet$forEach = Optional.ofNullable(clazz$MappedRegistry$TagSet) + .map(it -> ReflectionUtils.getDeclaredMethod(clazz$MappedRegistry$TagSet, void.class, BiConsumer.class)) + .orElse(null); + + public static final Method method$Holder$Reference$bingTags = requireNonNull( + ReflectionUtils.getDeclaredMethod( + clazz$Holder$Reference, void.class, Collection.class + ) + ); + + public static final Class clazz$ClientboundLevelParticlesPacket = requireNonNull( + ReflectionUtils.getClazz( + BukkitReflectionUtils.assembleMCClass("network.protocol.game.ClientboundLevelParticlesPacket"), + BukkitReflectionUtils.assembleMCClass("network.protocol.game.PacketPlayOutWorldParticles") + ) + ); + + public static final Constructor constructor$ClientboundLevelParticlesPacket = requireNonNull( + VersionHelper.isVersionNewerThan1_20_5() ? + ReflectionUtils.getDeclaredConstructor(clazz$ClientboundLevelParticlesPacket, clazz$RegistryFriendlyByteBuf) : + ReflectionUtils.getConstructor(clazz$ClientboundLevelParticlesPacket, clazz$FriendlyByteBuf) + ); + + public static final Class clazz$ParticleOptions = requireNonNull( + ReflectionUtils.getClazz( + BukkitReflectionUtils.assembleMCClass("core.particles.ParticleOptions"), + BukkitReflectionUtils.assembleMCClass("core.particles.ParticleParam") + ) + ); + + public static final Class clazz$BlockParticleOption = requireNonNull( + ReflectionUtils.getClazz( + BukkitReflectionUtils.assembleMCClass("core.particles.BlockParticleOption"), + BukkitReflectionUtils.assembleMCClass("core.particles.ParticleParamBlock") + ) + ); + + public static final Field field$ClientboundLevelParticlesPacket$particle = requireNonNull( + ReflectionUtils.getDeclaredField( + clazz$ClientboundLevelParticlesPacket, clazz$ParticleOptions, 0 + ) + ); + + public static final Field field$BlockParticleOption$blockState = requireNonNull( + ReflectionUtils.getDeclaredField( + clazz$BlockParticleOption, clazz$BlockState, 0 + ) + ); + + public static final Class clazz$CraftMagicNumbers = requireNonNull( + ReflectionUtils.getClazz( + BukkitReflectionUtils.assembleCBClass("util.CraftMagicNumbers") + ) + ); + + public static final Field field$CraftMagicNumbers$BLOCK_MATERIAL = requireNonNull( + ReflectionUtils.getDeclaredField( + clazz$CraftMagicNumbers, "BLOCK_MATERIAL" + ) + ); + + public static final Field field$BlockBehaviour$properties = requireNonNull( + ReflectionUtils.getInstanceDeclaredField( + clazz$BlockBehaviour, clazz$BlockBehaviour$Properties, 0 + ) + ); + + public static final Field field$BlockBehaviour$explosionResistance = requireNonNull( + ReflectionUtils.getInstanceDeclaredField( + clazz$BlockBehaviour, float.class, 0 + ) + ); + + public static final Field field$BlockBehaviour$soundType = requireNonNull( + ReflectionUtils.getInstanceDeclaredField( + clazz$BlockBehaviour, clazz$SoundType, 0 + ) + ); + + public static final Field field$SoundType$breakSound = requireNonNull( + ReflectionUtils.getDeclaredField( + clazz$SoundType, clazz$SoundEvent, 0 + ) + ); + + public static final Field field$SoundType$stepSound = requireNonNull( + ReflectionUtils.getDeclaredField( + clazz$SoundType, clazz$SoundEvent, 1 + ) + ); + + public static final Field field$SoundType$placeSound = requireNonNull( + ReflectionUtils.getDeclaredField( + clazz$SoundType, clazz$SoundEvent, 2 + ) + ); + + public static final Field field$SoundType$hitSound = requireNonNull( + ReflectionUtils.getDeclaredField( + clazz$SoundType, clazz$SoundEvent, 3 + ) + ); + + public static final Field field$SoundType$fallSound = requireNonNull( + ReflectionUtils.getDeclaredField( + clazz$SoundType, clazz$SoundEvent, 4 + ) + ); + + public static final Field field$SoundEvent$location = requireNonNull( + ReflectionUtils.getInstanceDeclaredField( + clazz$SoundEvent, clazz$ResourceLocation, 0 + ) + ); + + public static final Field field$BlockBehaviour$Properties$hasCollision = requireNonNull( + ReflectionUtils.getInstanceDeclaredField( + clazz$BlockBehaviour$Properties, boolean.class, 0 + ) + ); + + public static final Class clazz$ClientboundLightUpdatePacket = requireNonNull( + ReflectionUtils.getClazz( + BukkitReflectionUtils.assembleMCClass("network.protocol.game.ClientboundLightUpdatePacket"), + BukkitReflectionUtils.assembleMCClass("network.protocol.game.PacketPlayOutLightUpdate") + ) + ); + + public static final Class clazz$ChunkPos = requireNonNull( + ReflectionUtils.getClazz( + BukkitReflectionUtils.assembleMCClass("world.level.ChunkPos"), + BukkitReflectionUtils.assembleMCClass("world.level.ChunkCoordIntPair") + ) + ); + + public static final Constructor constructor$ChunkPos = requireNonNull( + ReflectionUtils.getConstructor( + clazz$ChunkPos, int.class, int.class + ) + ); + + public static final Class clazz$LevelLightEngine = requireNonNull( + ReflectionUtils.getClazz( + BukkitReflectionUtils.assembleMCClass("world.level.lighting.LevelLightEngine") + ) + ); + + public static final Constructor constructor$ClientboundLightUpdatePacket = requireNonNull( + ReflectionUtils.getConstructor( + clazz$ClientboundLightUpdatePacket, clazz$ChunkPos, clazz$LevelLightEngine, BitSet.class, BitSet.class + ) + ); + + public static final Class clazz$ChunkHolder = requireNonNull( + ReflectionUtils.getClazz( + BukkitReflectionUtils.assembleMCClass("server.level.ChunkHolder"), + BukkitReflectionUtils.assembleMCClass("server.level.PlayerChunk") + ) + ); + + public static final Class clazz$ChunkMap = requireNonNull( + ReflectionUtils.getClazz( + BukkitReflectionUtils.assembleMCClass("server.level.ChunkMap"), + BukkitReflectionUtils.assembleMCClass("server.level.PlayerChunkMap") + ) + ); + + public static final Method method$ChunkHolder$getPlayers = requireNonNull( + ReflectionUtils.getMethod( + clazz$ChunkHolder, List.class, boolean.class + ) + ); + + public static final Field field$ChunkHolder$lightEngine = requireNonNull( + ReflectionUtils.getDeclaredField( + clazz$ChunkHolder, clazz$LevelLightEngine, 0 + ) + ); + + public static final Field field$ChunkHolder$blockChangedLightSectionFilter = requireNonNull( + ReflectionUtils.getDeclaredField( + clazz$ChunkHolder, BitSet.class, 0 + ) + ); + + public static final Field field$ChunkHolder$skyChangedLightSectionFilter = requireNonNull( + ReflectionUtils.getDeclaredField( + clazz$ChunkHolder, BitSet.class, 1 + ) + ); + + public static final Method method$ChunkHolder$broadcast = requireNonNull( + ReflectionUtils.getDeclaredMethod( + clazz$ChunkHolder, void.class, List.class, clazz$Packet + ) + ); + + public static final Method method$ServerChunkCache$getVisibleChunkIfPresent = requireNonNull( + ReflectionUtils.getDeclaredMethod( + clazz$ServerChunkCache, clazz$ChunkHolder, long.class + ) + ); + + public static final Class clazz$LightLayer = requireNonNull( + ReflectionUtils.getClazz( + BukkitReflectionUtils.assembleMCClass("world.level.LightLayer"), + BukkitReflectionUtils.assembleMCClass("world.level.EnumSkyBlock") + ) + ); + + public static final Method method$LightLayer$values = requireNonNull( + ReflectionUtils.getStaticMethod( + clazz$LightLayer, clazz$LightLayer.arrayType() + ) + ); + + public static final Object instance$LightLayer$BLOCK; + + static { + try { + instance$LightLayer$BLOCK = ((Object[]) method$LightLayer$values.invoke(null))[1]; + } catch (ReflectiveOperationException e) { + throw new RuntimeException(e); + } + } + + public static final Method method$ChunkHolder$sectionLightChanged = requireNonNull( + VersionHelper.isVersionNewerThan1_21_2() ? + ReflectionUtils.getMethod(clazz$ChunkHolder, boolean.class, clazz$LightLayer, int.class) : + ReflectionUtils.getMethod(clazz$ChunkHolder, void.class, clazz$LightLayer, int.class) + ); + + public static final Class clazz$ServerboundPlayerActionPacket = requireNonNull( + ReflectionUtils.getClazz( + BukkitReflectionUtils.assembleMCClass("network.protocol.game.ServerboundPlayerActionPacket"), + BukkitReflectionUtils.assembleMCClass("network.protocol.game.PacketPlayInBlockDig") + ) + ); + + public static final Class clazz$ServerboundPlayerActionPacket$Action = requireNonNull( + ReflectionUtils.getClazz( + BukkitReflectionUtils.assembleMCClass("network.protocol.game.ServerboundPlayerActionPacket$Action"), + BukkitReflectionUtils.assembleMCClass("network.protocol.game.PacketPlayInBlockDig$EnumPlayerDigType") + ) + ); + + public static final Field field$ServerboundPlayerActionPacket$pos = requireNonNull( + ReflectionUtils.getDeclaredField( + clazz$ServerboundPlayerActionPacket, clazz$BlockPos, 0 + ) + ); + + public static final Field field$ServerboundPlayerActionPacket$action = requireNonNull( + ReflectionUtils.getDeclaredField( + clazz$ServerboundPlayerActionPacket, clazz$ServerboundPlayerActionPacket$Action, 0 + ) + ); + + public static final Method method$ServerboundPlayerActionPacket$Action$values = requireNonNull( + ReflectionUtils.getStaticMethod( + clazz$ServerboundPlayerActionPacket$Action, clazz$ServerboundPlayerActionPacket$Action.arrayType() + ) + ); + + public static final Object instance$ServerboundPlayerActionPacket$Action$START_DESTROY_BLOCK; + public static final Object instance$ServerboundPlayerActionPacket$Action$ABORT_DESTROY_BLOCK; + public static final Object instance$ServerboundPlayerActionPacket$Action$STOP_DESTROY_BLOCK; + + static { + try { + Object[] values = (Object[]) method$ServerboundPlayerActionPacket$Action$values.invoke(null); + instance$ServerboundPlayerActionPacket$Action$START_DESTROY_BLOCK = values[0]; + instance$ServerboundPlayerActionPacket$Action$ABORT_DESTROY_BLOCK = values[1]; + instance$ServerboundPlayerActionPacket$Action$STOP_DESTROY_BLOCK = values[2]; + } catch (ReflectiveOperationException e) { + throw new RuntimeException(e); + } + } + + public static final Object instance$Holder$Attribute$block_break_speed; + public static final Object instance$Holder$Attribute$block_interaction_range; + + static { + try { + if (VersionHelper.isVersionNewerThan1_20_5()) { + Object block_break_speed = method$ResourceLocation$fromNamespaceAndPath.invoke(null, "minecraft", VersionHelper.isVersionNewerThan1_21_2() ? "block_break_speed" : "player.block_break_speed"); + @SuppressWarnings("unchecked") + Optional breakSpeedHolder = (Optional) method$Registry$getHolder0.invoke(instance$BuiltInRegistries$ATTRIBUTE, block_break_speed); + instance$Holder$Attribute$block_break_speed = breakSpeedHolder.orElse(null); + + Object block_interaction_range = method$ResourceLocation$fromNamespaceAndPath.invoke(null, "minecraft", VersionHelper.isVersionNewerThan1_21_2() ? "block_interaction_range" : "player.block_interaction_range"); + @SuppressWarnings("unchecked") + Optional blockInteractionRangeHolder = (Optional) method$Registry$getHolder0.invoke(instance$BuiltInRegistries$ATTRIBUTE, block_interaction_range); + instance$Holder$Attribute$block_interaction_range = blockInteractionRangeHolder.orElse(null); + } else { + instance$Holder$Attribute$block_break_speed = null; + instance$Holder$Attribute$block_interaction_range = null; + } + } catch (ReflectiveOperationException e) { + throw new RuntimeException(e); + } + } + + public static final Method method$ServerPlayer$getAttribute = requireNonNull( + VersionHelper.isVersionNewerThan1_20_5() ? + ReflectionUtils.getMethod(clazz$ServerPlayer, clazz$AttributeInstance, clazz$Holder) : + ReflectionUtils.getMethod(clazz$ServerPlayer, clazz$AttributeInstance, clazz$Attribute) + ); + + public static final Class clazz$ServerPlayerGameMode = requireNonNull( + ReflectionUtils.getClazz( + BukkitReflectionUtils.assembleMCClass("server.level.ServerPlayerGameMode"), + BukkitReflectionUtils.assembleMCClass("server.level.PlayerInteractManager") + ) + ); + + public static final Field field$ServerPlayer$gameMode = requireNonNull( + ReflectionUtils.getDeclaredField( + clazz$ServerPlayer, clazz$ServerPlayerGameMode, 0 + ) + ); + + public static final Field field$ServerPlayerGameMode$destroyProgressStart = requireNonNull( + ReflectionUtils.getDeclaredField( + clazz$ServerPlayerGameMode, int.class, 0 + ) + ); + + public static final Field field$ServerPlayerGameMode$gameTicks = requireNonNull( + ReflectionUtils.getDeclaredField( + clazz$ServerPlayerGameMode, int.class, 1 + ) + ); + + public static final Field field$ServerPlayerGameMode$delayedTickStart = requireNonNull( + ReflectionUtils.getDeclaredField( + clazz$ServerPlayerGameMode, int.class, 2 + ) + ); + + public static final Field field$ServerPlayerGameMode$isDestroyingBlock = requireNonNull( + ReflectionUtils.getDeclaredField( + clazz$ServerPlayerGameMode, boolean.class, 0 + ) + ); + + public static final Field field$ServerPlayerGameMode$hasDelayedDestroy = requireNonNull( + ReflectionUtils.getDeclaredField( + clazz$ServerPlayerGameMode, boolean.class, 1 + ) + ); + + public static final Method method$ServerPlayerGameMode$destroyBlock = requireNonNull( + ReflectionUtils.getMethod( + clazz$ServerPlayerGameMode, boolean.class, clazz$BlockPos + ) + ); + + public static final Class clazz$Player = requireNonNull( + ReflectionUtils.getClazz( + BukkitReflectionUtils.assembleMCClass("world.entity.player.Player"), + BukkitReflectionUtils.assembleMCClass("world.entity.player.EntityHuman") + ) + ); + + public static final Class clazz$Entity = requireNonNull( + ReflectionUtils.getClazz( + BukkitReflectionUtils.assembleMCClass("world.entity.Entity") + ) + ); + + public static final Field field$Entity$ENTITY_COUNTER = requireNonNull( + ReflectionUtils.getDeclaredField( + clazz$Entity, AtomicInteger.class, 0 + ) + ); + + public static final AtomicInteger instance$Entity$ENTITY_COUNTER; + + static { + try { + instance$Entity$ENTITY_COUNTER = (AtomicInteger) requireNonNull(field$Entity$ENTITY_COUNTER.get(null)); + } catch (IllegalAccessException e) { + throw new RuntimeException(e); + } + } + + public static final Class clazz$Level = requireNonNull( + ReflectionUtils.getClazz( + BukkitReflectionUtils.assembleMCClass("world.level.Level"), + BukkitReflectionUtils.assembleMCClass("world.level.World") + ) + ); + + public static final Method method$Entity$level = requireNonNull( + ReflectionUtils.getMethod( + clazz$Entity, clazz$Level + ) + ); + + public static final Method method$BlockStateBase$getDestroyProgress = requireNonNull( + ReflectionUtils.getDeclaredMethod( + clazz$BlockStateBase, float.class, clazz$Player, clazz$BlockGetter, clazz$BlockPos + ) + ); + + public static final Class clazz$ClientboundBlockDestructionPacket = requireNonNull( + ReflectionUtils.getClazz( + BukkitReflectionUtils.assembleMCClass("network.protocol.game.ClientboundBlockDestructionPacket"), + BukkitReflectionUtils.assembleMCClass("network.protocol.game.PacketPlayOutBlockBreakAnimation") + ) + ); + + public static final Constructor constructor$ClientboundBlockDestructionPacket = requireNonNull( + ReflectionUtils.getConstructor( + clazz$ClientboundBlockDestructionPacket, int.class, clazz$BlockPos, int.class + ) + ); + + public static final Class clazz$ServerboundSwingPacket = requireNonNull( + ReflectionUtils.getClazz( + BukkitReflectionUtils.assembleMCClass("network.protocol.game.ServerboundSwingPacket"), + BukkitReflectionUtils.assembleMCClass("network.protocol.game.PacketPlayInArmAnimation") + ) + ); + + public static final Class clazz$InteractionHand = requireNonNull( + ReflectionUtils.getClazz( + BukkitReflectionUtils.assembleMCClass("world.InteractionHand"), + BukkitReflectionUtils.assembleMCClass("world.EnumHand") + ) + ); + + public static final Field field$ServerboundSwingPacket$hand = requireNonNull( + ReflectionUtils.getDeclaredField( + clazz$ServerboundSwingPacket, clazz$InteractionHand, 0 + ) + ); + + public static final Method method$InteractionHand$values = requireNonNull( + ReflectionUtils.getStaticMethod( + clazz$InteractionHand, clazz$InteractionHand.arrayType() + ) + ); + + public static final Object instance$InteractionHand$MAIN_HAND; + public static final Object instance$InteractionHand$OFF_HAND; + + static { + try { + Object[] values = (Object[]) method$InteractionHand$values.invoke(null); + instance$InteractionHand$MAIN_HAND = values[0]; + instance$InteractionHand$OFF_HAND = values[1]; + } catch (ReflectiveOperationException e) { + throw new RuntimeException(e); + } + } + + public static final Class clazz$EquipmentSlot = requireNonNull( + ReflectionUtils.getClazz( + BukkitReflectionUtils.assembleMCClass("world.entity.EquipmentSlot"), + BukkitReflectionUtils.assembleMCClass("world.entity.EnumItemSlot") + ) + ); + + public static final Method method$EquipmentSlot$values = requireNonNull( + ReflectionUtils.getStaticMethod( + clazz$EquipmentSlot, clazz$EquipmentSlot.arrayType() + ) + ); + + public static final Object instance$EquipmentSlot$MAINHAND; + public static final Object instance$EquipmentSlot$OFFHAND; + public static final Object instance$EquipmentSlot$FEET; + public static final Object instance$EquipmentSlot$LEGS; + public static final Object instance$EquipmentSlot$CHEST; + public static final Object instance$EquipmentSlot$HEAD; +// public static final Object instance$EquipmentSlot$BODY; + + static { + try { + Object[] values = (Object[]) method$EquipmentSlot$values.invoke(null); + instance$EquipmentSlot$MAINHAND = values[0]; + instance$EquipmentSlot$OFFHAND = values[1]; + instance$EquipmentSlot$FEET = values[2]; + instance$EquipmentSlot$LEGS = values[3]; + instance$EquipmentSlot$CHEST = values[4]; + instance$EquipmentSlot$HEAD = values[5]; +// instance$EquipmentSlot$BODY = values[6]; + } catch (ReflectiveOperationException e) { + throw new RuntimeException(e); + } + } + + public static final Method method$Block$defaultBlockState = requireNonNull( + ReflectionUtils.getMethod( + clazz$Block, clazz$BlockState + ) + ); + + public static final Class clazz$ServerboundInteractPacket = requireNonNull( + ReflectionUtils.getClazz( + BukkitReflectionUtils.assembleMCClass("network.protocol.game.ServerboundInteractPacket"), + BukkitReflectionUtils.assembleMCClass("network.protocol.game.PacketPlayInUseEntity") + ) + ); + + public static final Class clazz$ServerboundInteractPacket$Action = requireNonNull( + ReflectionUtils.getClazz( + BukkitReflectionUtils.assembleMCClass("network.protocol.game.ServerboundInteractPacket$Action"), + BukkitReflectionUtils.assembleMCClass("network.protocol.game.PacketPlayInUseEntity$EnumEntityUseAction") + ) + ); + + public static final Class clazz$ServerboundInteractPacket$InteractionAction = requireNonNull( + ReflectionUtils.getClazz( + BukkitReflectionUtils.assembleMCClass("network.protocol.game.ServerboundInteractPacket$InteractionAction"), + BukkitReflectionUtils.assembleMCClass("network.protocol.game.PacketPlayInUseEntity$d") + ) + ); + + public static final Field field$ServerboundInteractPacket$InteractionAction$hand = requireNonNull( + ReflectionUtils.getDeclaredField( + clazz$ServerboundInteractPacket$InteractionAction, clazz$InteractionHand, 0 + ) + ); + + public static final Class clazz$ServerboundInteractPacket$InteractionAtLocationAction = requireNonNull( + ReflectionUtils.getClazz( + BukkitReflectionUtils.assembleMCClass("network.protocol.game.ServerboundInteractPacket$InteractionAtLocationAction"), + BukkitReflectionUtils.assembleMCClass("network.protocol.game.PacketPlayInUseEntity$e") + ) + ); + + public static final Field field$ServerboundInteractPacket$InteractionAtLocationAction$hand = requireNonNull( + ReflectionUtils.getDeclaredField( + clazz$ServerboundInteractPacket$InteractionAtLocationAction, clazz$InteractionHand, 0 + ) + ); + + public static final Field field$ServerboundInteractPacket$InteractionAtLocationAction$location = requireNonNull( + ReflectionUtils.getDeclaredField( + clazz$ServerboundInteractPacket$InteractionAtLocationAction, clazz$Vec3, 0 + ) + ); + + public static final Class clazz$ServerboundInteractPacket$ActionType = requireNonNull( + ReflectionUtils.getClazz( + BukkitReflectionUtils.assembleMCClass("network.protocol.game.ServerboundInteractPacket$ActionType"), + BukkitReflectionUtils.assembleMCClass("network.protocol.game.PacketPlayInUseEntity$b") + ) + ); + + public static final Method method$ServerboundInteractPacket$ActionType$values = requireNonNull( + ReflectionUtils.getStaticMethod( + clazz$ServerboundInteractPacket$ActionType, clazz$ServerboundInteractPacket$ActionType.arrayType() + ) + ); + + public static final Object instance$ServerboundInteractPacket$ActionType$INTERACT; + public static final Object instance$ServerboundInteractPacket$ActionType$ATTACK; + public static final Object instance$ServerboundInteractPacket$ActionType$INTERACT_AT; + + static { + try { + Object[] values = (Object[]) method$ServerboundInteractPacket$ActionType$values.invoke(null); + instance$ServerboundInteractPacket$ActionType$INTERACT = values[0]; + instance$ServerboundInteractPacket$ActionType$ATTACK = values[1]; + instance$ServerboundInteractPacket$ActionType$INTERACT_AT = values[2]; + } catch (ReflectiveOperationException e) { + throw new RuntimeException(e); + } + } + + public static final Field field$ServerboundInteractPacket$entityId = requireNonNull( + ReflectionUtils.getInstanceDeclaredField( + clazz$ServerboundInteractPacket, int.class, 0 + ) + ); + + public static final Field field$ServerboundInteractPacket$usingSecondaryAction = requireNonNull( + ReflectionUtils.getInstanceDeclaredField( + clazz$ServerboundInteractPacket, boolean.class, 0 + ) + ); + + public static final Field field$ServerboundInteractPacket$action = requireNonNull( + ReflectionUtils.getInstanceDeclaredField( + clazz$ServerboundInteractPacket, clazz$ServerboundInteractPacket$Action, 0 + ) + ); + + public static final Method method$ServerboundInteractPacket$Action$getType = requireNonNull( + ReflectionUtils.getDeclaredMethod( + clazz$ServerboundInteractPacket$Action, clazz$ServerboundInteractPacket$ActionType + ) + ); + + public static final Class clazz$ClientboundUpdateMobEffectPacket = requireNonNull( + ReflectionUtils.getClazz( + BukkitReflectionUtils.assembleMCClass("network.protocol.game.ClientboundUpdateMobEffectPacket"), + BukkitReflectionUtils.assembleMCClass("network.protocol.game.PacketPlayOutEntityEffect") + ) + ); + + public static final Class clazz$ClientboundRemoveMobEffectPacket = requireNonNull( + ReflectionUtils.getClazz( + BukkitReflectionUtils.assembleMCClass("network.protocol.game.ClientboundRemoveMobEffectPacket"), + BukkitReflectionUtils.assembleMCClass("network.protocol.game.PacketPlayOutRemoveEntityEffect") + ) + ); + + public static final Object instance$MobEffecr$mining_fatigue; + public static final Object instance$MobEffecr$haste; + + // for 1.20.1-1.20.4 + static { + try { + Object mining_fatigue = method$ResourceLocation$fromNamespaceAndPath.invoke(null, "minecraft", "mining_fatigue"); + instance$MobEffecr$mining_fatigue = method$Registry$get.invoke(instance$BuiltInRegistries$MOB_EFFECT, mining_fatigue); + Object haste = method$ResourceLocation$fromNamespaceAndPath.invoke(null, "minecraft", "haste"); + instance$MobEffecr$haste = method$Registry$get.invoke(instance$BuiltInRegistries$MOB_EFFECT, haste); + } catch (ReflectiveOperationException e) { + throw new RuntimeException(e); + } + } + + public static Object allocateClientboundUpdateMobEffectPacketInstance() throws InstantiationException { + return UNSAFE.allocateInstance(clazz$ClientboundUpdateMobEffectPacket); + } + + public static final Constructor constructor$ClientboundRemoveMobEffectPacket = requireNonNull( + ReflectionUtils.getConstructor( + clazz$ClientboundRemoveMobEffectPacket, 0 + ) + ); + + public static final Constructor constructor$ClientboundUpdateMobEffectPacket = requireNonNull( + !VersionHelper.isVersionNewerThan1_20_5() ? + ReflectionUtils.getConstructor( + clazz$ClientboundUpdateMobEffectPacket, int.class, clazz$MobEffectInstance + ) : + ReflectionUtils.getConstructor( + clazz$ClientboundUpdateMobEffectPacket, int.class, clazz$MobEffectInstance, boolean.class + ) + ); + + public static final Field field$ClientboundUpdateMobEffectPacket$entityId = requireNonNull( + ReflectionUtils.getInstanceDeclaredField( + clazz$ClientboundUpdateMobEffectPacket, int.class, 0 + ) + ); + + public static final Field field$ClientboundUpdateMobEffectPacket$effect = requireNonNull( + !VersionHelper.isVersionNewerThan1_20_5() ? + ReflectionUtils.getInstanceDeclaredField( + clazz$ClientboundUpdateMobEffectPacket, clazz$MobEffect, 0 + ) : + ReflectionUtils.getInstanceDeclaredField( + clazz$ClientboundUpdateMobEffectPacket, clazz$Holder, 0 + ) + ); + + public static final Field field$ClientboundUpdateMobEffectPacket$amplifier = requireNonNull( + !VersionHelper.isVersionNewerThan1_20_5() ? + ReflectionUtils.getInstanceDeclaredField( + clazz$ClientboundUpdateMobEffectPacket, byte.class, 0 + ) : + ReflectionUtils.getInstanceDeclaredField( + clazz$ClientboundUpdateMobEffectPacket, int.class, 1 + ) + ); + + public static final Field field$ClientboundUpdateMobEffectPacket$duration = requireNonNull( + !VersionHelper.isVersionNewerThan1_20_5() ? + ReflectionUtils.getInstanceDeclaredField( + clazz$ClientboundUpdateMobEffectPacket, int.class, 1 + ) : + ReflectionUtils.getInstanceDeclaredField( + clazz$ClientboundUpdateMobEffectPacket, int.class, 2 + ) + ); + + public static final Field field$ClientboundUpdateMobEffectPacket$flags = requireNonNull( + !VersionHelper.isVersionNewerThan1_20_5() ? + ReflectionUtils.getInstanceDeclaredField( + clazz$ClientboundUpdateMobEffectPacket, byte.class, 1 + ) : + ReflectionUtils.getInstanceDeclaredField( + clazz$ClientboundUpdateMobEffectPacket, byte.class, 0 + ) + ); + + public static final Method method$ServerPlayer$getEffect = requireNonNull( + !VersionHelper.isVersionNewerThan1_20_5() ? + ReflectionUtils.getMethod( + clazz$ServerPlayer, clazz$MobEffectInstance, clazz$MobEffect + ) : + ReflectionUtils.getMethod( + clazz$ServerPlayer, clazz$MobEffectInstance, clazz$Holder + ) + ); + + public static final Object instance$SoundEvent$EMPTY; + + static { + try { + Object key = method$ResourceLocation$fromNamespaceAndPath.invoke(null, "minecraft", "intentionally_empty"); + instance$SoundEvent$EMPTY = method$Registry$get.invoke(instance$BuiltInRegistries$SOUND_EVENT, key); + } catch (ReflectiveOperationException e) { + throw new RuntimeException(e); + } + } + + public static final Method method$Entity$getOnPos = requireNonNull( + ReflectionUtils.getDeclaredMethod( + clazz$Entity, clazz$BlockPos, float.class + ) + ); + + // 1.21.4+ + public static final Class clazz$ServerboundPickItemFromBlockPacket = + ReflectionUtils.getClazz( + BukkitReflectionUtils.assembleMCClass("network.protocol.game.ServerboundPickItemFromBlockPacket") + ); + + public static final Field field$ServerboundPickItemFromBlockPacket$pos = Optional.ofNullable(clazz$ServerboundPickItemFromBlockPacket) + .map(it -> ReflectionUtils.getDeclaredField(it, clazz$BlockPos, 0)) + .orElse(null); + + public static final Class clazz$ServerboundSetCreativeModeSlotPacket = requireNonNull( + ReflectionUtils.getClazz( + BukkitReflectionUtils.assembleMCClass("network.protocol.game.ServerboundSetCreativeModeSlotPacket"), + BukkitReflectionUtils.assembleMCClass("network.protocol.game.PacketPlayInSetCreativeSlot") + ) + ); + + public static final Field field$ServerboundSetCreativeModeSlotPacket$slotNum = requireNonNull( + VersionHelper.isVersionNewerThan1_20_5() ? + ReflectionUtils.getDeclaredField( + clazz$ServerboundSetCreativeModeSlotPacket, short.class, 0 + ) : + ReflectionUtils.getDeclaredField( + clazz$ServerboundSetCreativeModeSlotPacket, int.class, 0 + ) + ); + + public static final Class clazz$ItemStack = requireNonNull( + ReflectionUtils.getClazz( + BukkitReflectionUtils.assembleMCClass("world.item.ItemStack") + ) + ); + + public static final Field field$ServerboundSetCreativeModeSlotPacket$itemStack = requireNonNull( + ReflectionUtils.getDeclaredField( + clazz$ServerboundSetCreativeModeSlotPacket, clazz$ItemStack, 0 + ) + ); + + public static final Class clazz$CraftItemStack = requireNonNull( + ReflectionUtils.getClazz( + BukkitReflectionUtils.assembleCBClass("inventory.CraftItemStack") + ) + ); + + public static final Method method$CraftItemStack$asCraftMirror = requireNonNull( + ReflectionUtils.getStaticMethod( + clazz$CraftItemStack, new String[]{"asCraftMirror"}, clazz$CraftItemStack, clazz$ItemStack + ) + ); + + public static final Method method$CraftItemStack$asNMSMirror = requireNonNull( + ReflectionUtils.getStaticMethod( + clazz$CraftItemStack, new String[]{"asNMSCopy"}, clazz$ItemStack, ItemStack.class + ) + ); + + public static final Field field$Holder$Reference$tags = requireNonNull( + ReflectionUtils.getDeclaredField( + clazz$Holder$Reference, Set.class, 0 + ) + ); + + public static final Class clazz$TagKey = requireNonNull( + ReflectionUtils.getClazz( + BukkitReflectionUtils.assembleMCClass("tags.TagKey") + ) + ); + + public static final Field field$TagKey$location = requireNonNull( + ReflectionUtils.getInstanceDeclaredField( + clazz$TagKey, clazz$ResourceLocation, 0 + ) + ); + + public static final Method method$TagKey$create = requireNonNull( + ReflectionUtils.getStaticMethod( + clazz$TagKey, clazz$TagKey, clazz$ResourceKey, clazz$ResourceLocation + ) + ); + + public static final Class clazz$ItemEnchantments = + ReflectionUtils.getClazz( + BukkitReflectionUtils.assembleMCClass( "world.item.enchantment.ItemEnchantments") + ); + + public static final Field field$ItemEnchantments$enchantments = Optional.ofNullable(clazz$ItemEnchantments) + .map(it -> ReflectionUtils.getInstanceDeclaredField(it, 0)) + .orElse(null); + + public static final Field field$Direction$data3d = requireNonNull( + ReflectionUtils.getInstanceDeclaredField( + clazz$Direction, int.class, 0 + ) + ); + + public static final Field field$Holder$Reference$value = requireNonNull( + ReflectionUtils.getDeclaredField( + clazz$Holder$Reference, Object.class, 0 + ) + ); + + // 1.21.3+ + public static final Class clazz$ScheduledTickAccess = + ReflectionUtils.getClazz( + BukkitReflectionUtils.assembleMCClass("world.level.ScheduledTickAccess") + ); + + public static final Method method$RandomSource$nextFloat = requireNonNull( + ReflectionUtils.getMethod( + clazz$RandomSource, float.class + ) + ); + + public static final Method method$BlockBehaviour$updateShape = requireNonNull( + VersionHelper.isVersionNewerThan1_21_2() ? + ReflectionUtils.getDeclaredMethod( + clazz$BlockBehaviour, clazz$BlockState, clazz$BlockState, clazz$LevelReader, clazz$ScheduledTickAccess, clazz$BlockPos, clazz$Direction, clazz$BlockPos, clazz$BlockState, clazz$RandomSource + ) : + ReflectionUtils.getDeclaredMethod( + clazz$BlockBehaviour, clazz$BlockState, clazz$BlockState, clazz$Direction, clazz$BlockState, clazz$LevelAccessor, clazz$BlockPos, clazz$BlockPos + ) + ); + + public static final Class clazz$Fallable = requireNonNull( + ReflectionUtils.getClazz( + BukkitReflectionUtils.assembleMCClass("world.level.block.Fallable") + ) + ); + + public static final Class clazz$FallingBlock = requireNonNull( + ReflectionUtils.getClazz( + BukkitReflectionUtils.assembleMCClass("world.level.block.FallingBlock"), + BukkitReflectionUtils.assembleMCClass("world.level.block.BlockFalling") + ) + ); + + public static final Method method$FallingBlock$isFree = requireNonNull( + ReflectionUtils.getStaticMethod( + clazz$FallingBlock, boolean.class, clazz$BlockState + ) + ); + + public static final Class clazz$FallingBlockEntity = requireNonNull( + ReflectionUtils.getClazz( + BukkitReflectionUtils.assembleMCClass("world.entity.item.FallingBlockEntity"), + BukkitReflectionUtils.assembleMCClass("world.entity.item.EntityFallingBlock") + ) + ); + + public static final Method method$FallingBlockEntity$fall = requireNonNull( + ReflectionUtils.getStaticMethod( + clazz$FallingBlockEntity, clazz$FallingBlockEntity, clazz$Level, clazz$BlockPos, clazz$BlockState + ) + ); + + public static final Method method$FallingBlockEntity$setHurtsEntities = requireNonNull( + ReflectionUtils.getMethod( + clazz$FallingBlockEntity, void.class, float.class, int.class + ) + ); + + public static final Field field$ServerLevel$uuid = requireNonNull( + ReflectionUtils.getDeclaredField( + clazz$ServerLevel, UUID.class, 0 + ) + ); + + public static final Field field$FallingBlockEntity$blockState = requireNonNull( + ReflectionUtils.getDeclaredField( + clazz$FallingBlockEntity, clazz$BlockState, 0 + ) + ); + + public static final Field field$FallingBlockEntity$cancelDrop = requireNonNull( + ReflectionUtils.getDeclaredField( + clazz$FallingBlockEntity, boolean.class, 1 + ) + ); + + public static final Method method$Level$getCraftWorld = requireNonNull( + ReflectionUtils.getMethod( + clazz$Level, clazz$CraftWorld + ) + ); + + public static final Field field$Entity$xo = requireNonNull( + ReflectionUtils.getInstanceDeclaredField( + clazz$Entity, double.class, 0 + ) + ); + + public static final Field field$Entity$yo = requireNonNull( + ReflectionUtils.getInstanceDeclaredField( + clazz$Entity, double.class, 1 + ) + ); + + public static final Field field$Entity$zo = requireNonNull( + ReflectionUtils.getInstanceDeclaredField( + clazz$Entity, double.class, 2 + ) + ); + + public static final Object instance$Blocks$AIR; + public static final Object instance$Blocks$AIR$defaultState; + public static final Object instance$Blocks$STONE; + public static final Object instance$Blocks$STONE$defaultState; + public static final Object instance$Blocks$FIRE; + + static { + try { + Object air = method$ResourceLocation$fromNamespaceAndPath.invoke(null, "minecraft", "air"); + instance$Blocks$AIR = method$Registry$get.invoke(instance$BuiltInRegistries$BLOCK, air); + instance$Blocks$AIR$defaultState = method$Block$defaultBlockState.invoke(instance$Blocks$AIR); + Object fire = method$ResourceLocation$fromNamespaceAndPath.invoke(null, "minecraft", "fire"); + instance$Blocks$FIRE = method$Registry$get.invoke(instance$BuiltInRegistries$BLOCK, fire); + Object stone = method$ResourceLocation$fromNamespaceAndPath.invoke(null, "minecraft", "stone"); + instance$Blocks$STONE = method$Registry$get.invoke(instance$BuiltInRegistries$BLOCK, stone); + instance$Blocks$STONE$defaultState = method$Block$defaultBlockState.invoke(instance$Blocks$STONE); + } catch (ReflectiveOperationException e) { + throw new RuntimeException(e); + } + } + + public static final Method method$BlockStateBase$hasTag = requireNonNull( + ReflectionUtils.getMethod( + clazz$BlockStateBase, boolean.class, clazz$TagKey + ) + ); + + public static final Method method$Level$removeBlock = requireNonNull( + ReflectionUtils.getMethod( + clazz$Level, boolean.class, clazz$BlockPos, boolean.class + ) + ); + + public static final Class clazz$MutableBlockPos = requireNonNull( + ReflectionUtils.getClazz( + BukkitReflectionUtils.assembleMCClass("core.BlockPos$MutableBlockPos"), + BukkitReflectionUtils.assembleMCClass("core.BlockPosition$MutableBlockPosition") + ) + ); + + public static final Constructor constructor$MutableBlockPos = requireNonNull( + ReflectionUtils.getConstructor( + clazz$MutableBlockPos + ) + ); + + public static final Method method$MutableBlockPos$setWithOffset = requireNonNull( + ReflectionUtils.getMethod( + clazz$MutableBlockPos, clazz$MutableBlockPos, clazz$Vec3i, clazz$Direction + ) + ); + + public static final Class clazz$LeavesBlock = requireNonNull( + ReflectionUtils.getClazz( + BukkitReflectionUtils.assembleMCClass("world.level.block.LeavesBlock"), + BukkitReflectionUtils.assembleMCClass("world.level.block.BlockLeaves") + ) + ); + + public static final Class clazz$IntegerProperty = requireNonNull( + ReflectionUtils.getClazz( + BukkitReflectionUtils.assembleMCClass("world.level.block.state.properties.IntegerProperty"), + BukkitReflectionUtils.assembleMCClass("world.level.block.state.properties.BlockStateInteger") + ) + ); + + public static final Class clazz$Property = requireNonNull( + ReflectionUtils.getClazz( + BukkitReflectionUtils.assembleMCClass("world.level.block.state.properties.Property"), + BukkitReflectionUtils.assembleMCClass("world.level.block.state.properties.IBlockState") + ) + ); + + public static final Field field$LeavesBlock$DISTANCE = requireNonNull( + ReflectionUtils.getDeclaredField( + clazz$LeavesBlock, clazz$IntegerProperty, 0 + ) + ); + + public static final Method method$StateHolder$hasProperty = requireNonNull( + ReflectionUtils.getMethod( + clazz$StateHolder, boolean.class, clazz$Property + ) + ); + + public static final Method method$StateHolder$getValue = requireNonNull( + ReflectionUtils.getMethod( + clazz$StateHolder, Object.class, new String[] {"getValue", "c"}, clazz$Property + ) + ); + + public static final Method method$Level$setBlock = requireNonNull( + ReflectionUtils.getMethod( + clazz$Level, boolean.class, clazz$BlockPos, clazz$BlockState, int.class + ) + ); + + public static final Method method$Block$updateFromNeighbourShapes = requireNonNull( + ReflectionUtils.getStaticMethod( + clazz$Block, clazz$BlockState, clazz$BlockState, clazz$LevelAccessor, clazz$BlockPos + ) + ); + + public static final Method method$BlockStateBase$updateNeighbourShapes = requireNonNull( + ReflectionUtils.getMethod( + // flags // depth + clazz$BlockStateBase, void.class, clazz$LevelAccessor, clazz$BlockPos, int.class, int.class + ) + ); + + public static final Method method$messageToByteEncoder$encode = requireNonNull( + ReflectionUtils.getDeclaredMethod( + MessageToByteEncoder.class, void.class, ChannelHandlerContext.class, Object.class, ByteBuf.class + ) + ); + + public static final Method method$byteToMessageDecoder$decode = requireNonNull( + ReflectionUtils.getDeclaredMethod( + ByteToMessageDecoder.class, void.class, ChannelHandlerContext.class, ByteBuf.class, List.class + ) + ); + + public static final Class clazz$ClientboundRespawnPacket = requireNonNull( + ReflectionUtils.getClazz( + BukkitReflectionUtils.assembleMCClass("network.protocol.game.ClientboundRespawnPacket"), + BukkitReflectionUtils.assembleMCClass("network.protocol.game.PacketPlayOutRespawn") + ) + ); + + public static final Class clazz$ClientboundLoginPacket = requireNonNull( + ReflectionUtils.getClazz( + BukkitReflectionUtils.assembleMCClass("network.protocol.game.ClientboundLoginPacket"), + BukkitReflectionUtils.assembleMCClass("network.protocol.game.PacketPlayOutLogin") + ) + ); + + // 1.20 + public static final Field field$ClientboundRespawnPacket$dimension = + ReflectionUtils.getDeclaredField( + clazz$ClientboundRespawnPacket, clazz$ResourceKey, 1 + ); + + // 1.20 + public static final Field field$ClientboundLoginPacket$dimension = + ReflectionUtils.getDeclaredField( + clazz$ClientboundLoginPacket, clazz$ResourceKey, 1 + ); + + // 1.20.2+ + public static final Class clazz$CommonPlayerSpawnInfo = + ReflectionUtils.getClazz( + BukkitReflectionUtils.assembleMCClass("network.protocol.game.CommonPlayerSpawnInfo") + ); + + // 1.20.2+ + public static final Field field$ClientboundRespawnPacket$commonPlayerSpawnInfo = Optional.ofNullable(clazz$CommonPlayerSpawnInfo) + .map(it -> ReflectionUtils.getDeclaredField(clazz$ClientboundRespawnPacket, it, 0)) + .orElse(null); + + // 1.20.2+ + public static final Field field$CommonPlayerSpawnInfo$dimension = Optional.ofNullable(clazz$CommonPlayerSpawnInfo) + .map(it -> { + if (VersionHelper.isVersionNewerThan1_20_5()) { + return ReflectionUtils.getDeclaredField(it, clazz$ResourceKey, 0); + } else { + return ReflectionUtils.getDeclaredField(it, clazz$ResourceKey, 1); + } + }) + .orElse(null); + + // 1.20.2+ + public static final Field field$ClientboundLoginPacket$commonPlayerSpawnInfo = Optional.ofNullable(clazz$CommonPlayerSpawnInfo) + .map(it -> ReflectionUtils.getDeclaredField(clazz$ClientboundLoginPacket, it, 0)) + .orElse(null); + + // 1.20-1.20.4 + public static final Method method$Packet$write = + ReflectionUtils.getMethod( + clazz$Packet, void.class, clazz$FriendlyByteBuf + ); + + // 1.20.5+ + public static final Method method$ClientboundLevelParticlesPacket$write = Optional.ofNullable(clazz$RegistryFriendlyByteBuf) + .map(it -> ReflectionUtils.getDeclaredMethod(clazz$ClientboundLevelParticlesPacket, void.class, it)) + .orElse(null); + + public static final Object instance$EntityType$TEXT_DISPLAY; + public static final Object instance$EntityType$ITEM_DISPLAY; + public static final Object instance$EntityType$FALLING_BLOCK; + public static final Object instance$EntityType$INTERACTION; + + static { + try { + Object textDisplay = method$ResourceLocation$fromNamespaceAndPath.invoke(null, "minecraft", "text_display"); + instance$EntityType$TEXT_DISPLAY = Reflections.method$Registry$get.invoke(Reflections.instance$BuiltInRegistries$ENTITY_TYPE, textDisplay); + Object itemDisplay = method$ResourceLocation$fromNamespaceAndPath.invoke(null, "minecraft", "item_display"); + instance$EntityType$ITEM_DISPLAY = Reflections.method$Registry$get.invoke(Reflections.instance$BuiltInRegistries$ENTITY_TYPE, itemDisplay); + Object fallingBlock = method$ResourceLocation$fromNamespaceAndPath.invoke(null, "minecraft", "falling_block"); + instance$EntityType$FALLING_BLOCK = Reflections.method$Registry$get.invoke(Reflections.instance$BuiltInRegistries$ENTITY_TYPE, fallingBlock); + Object interaction = method$ResourceLocation$fromNamespaceAndPath.invoke(null, "minecraft", "interaction"); + instance$EntityType$INTERACTION = Reflections.method$Registry$get.invoke(Reflections.instance$BuiltInRegistries$ENTITY_TYPE, interaction); + } catch (ReflectiveOperationException e) { + throw new RuntimeException(e); + } + } + + public static final Object instance$RecipeType$CRAFTING; + public static final Object instance$RecipeType$SMELTING; + public static final Object instance$RecipeType$BLASTING; + public static final Object instance$RecipeType$SMOKING; + public static final Object instance$RecipeType$CAMPFIRE_COOKING; + public static final Object instance$RecipeType$STONECUTTING; + public static final Object instance$RecipeType$SMITHING; + + static { + try { + instance$RecipeType$CRAFTING = Reflections.method$Registry$get.invoke(Reflections.instance$BuiltInRegistries$RECIPE_TYPE, method$ResourceLocation$fromNamespaceAndPath.invoke(null, "minecraft", "crafting")); + instance$RecipeType$SMELTING = Reflections.method$Registry$get.invoke(Reflections.instance$BuiltInRegistries$RECIPE_TYPE, method$ResourceLocation$fromNamespaceAndPath.invoke(null, "minecraft", "smelting")); + instance$RecipeType$BLASTING = Reflections.method$Registry$get.invoke(Reflections.instance$BuiltInRegistries$RECIPE_TYPE, method$ResourceLocation$fromNamespaceAndPath.invoke(null, "minecraft", "blasting")); + instance$RecipeType$SMOKING = Reflections.method$Registry$get.invoke(Reflections.instance$BuiltInRegistries$RECIPE_TYPE, method$ResourceLocation$fromNamespaceAndPath.invoke(null, "minecraft", "smoking")); + instance$RecipeType$CAMPFIRE_COOKING = Reflections.method$Registry$get.invoke(Reflections.instance$BuiltInRegistries$RECIPE_TYPE, method$ResourceLocation$fromNamespaceAndPath.invoke(null, "minecraft", "campfire_cooking")); + instance$RecipeType$STONECUTTING = Reflections.method$Registry$get.invoke(Reflections.instance$BuiltInRegistries$RECIPE_TYPE, method$ResourceLocation$fromNamespaceAndPath.invoke(null, "minecraft", "stonecutting")); + instance$RecipeType$SMITHING = Reflections.method$Registry$get.invoke(Reflections.instance$BuiltInRegistries$RECIPE_TYPE, method$ResourceLocation$fromNamespaceAndPath.invoke(null, "minecraft", "smithing")); + } catch (ReflectiveOperationException e) { + throw new RuntimeException(e); + } + } + + public static final Method method$BlockState$getShape = requireNonNull( + ReflectionUtils.getMethod( + clazz$BlockStateBase, clazz$VoxelShape, new String[]{"getShape", "a"}, clazz$BlockGetter, clazz$BlockPos, clazz$CollisionContext + ) + ); + + public static final Method method$VoxelShape$isEmpty = requireNonNull( + ReflectionUtils.getMethod( + clazz$VoxelShape, boolean.class + ) + ); + + public static final Method method$VoxelShape$bounds = requireNonNull( + ReflectionUtils.getMethod( + clazz$VoxelShape, clazz$AABB + ) + ); + + public static final Method method$LevelWriter$setBlock = requireNonNull( + ReflectionUtils.getMethod( + clazz$LevelWriter, boolean.class, clazz$BlockPos, clazz$BlockState, int.class + ) + ); + + public static final Method method$CollisionContext$of = requireNonNull( + ReflectionUtils.getStaticMethod( + clazz$CollisionContext, clazz$CollisionContext, clazz$Entity + ) + ); + + public static final Method method$CollisionContext$empty = requireNonNull( + ReflectionUtils.getStaticMethod( + clazz$CollisionContext, clazz$CollisionContext + ) + ); + + public static final Method method$ServerLevel$checkEntityCollision = requireNonNull( + ReflectionUtils.getMethod( + clazz$ServerLevel, boolean.class, clazz$BlockState, clazz$Entity, clazz$CollisionContext, clazz$BlockPos, boolean.class + ) + ); + + public static final Method method$BlockStateBase$canSurvive = requireNonNull( + ReflectionUtils.getMethod( + clazz$BlockStateBase, boolean.class, clazz$LevelReader, clazz$BlockPos + ) + ); + + public static final Method method$BlockStateBase$onPlace = requireNonNull( + ReflectionUtils.getMethod( + clazz$BlockStateBase, void.class, clazz$Level, clazz$BlockPos, clazz$BlockState, boolean.class + ) + ); + + public static final Method method$ItemStack$isTag = requireNonNull( + ReflectionUtils.getMethod( + clazz$ItemStack, boolean.class, clazz$TagKey + ) + ); + + public static final Class clazz$FireBlock = requireNonNull( + ReflectionUtils.getClazz( + BukkitReflectionUtils.assembleMCClass("world.level.block.FireBlock"), + BukkitReflectionUtils.assembleMCClass("world.level.block.BlockFire") + ) + ); + + public static final Method method$FireBlock$setFlammable = requireNonNull( + Optional.ofNullable(ReflectionUtils.getMethod( + clazz$FireBlock, void.class, clazz$Block, int.class, int.class + )).orElse(ReflectionUtils.getDeclaredMethod( + clazz$FireBlock, void.class, clazz$Block, int.class, int.class) + ) + ); + + public static final Field field$LevelChunkSection$states = requireNonNull( + ReflectionUtils.getDeclaredField( + clazz$LevelChunkSection, clazz$PalettedContainer, 0 + ) + ); + + public static final Constructor constructor$ItemStack = requireNonNull( + ReflectionUtils.getConstructor( + clazz$ItemStack, clazz$ItemLike + ) + ); + + public static final Object instance$Items$AIR; + public static final Object instance$ItemStack$Air; + + static { + try { + Object air = method$ResourceLocation$fromNamespaceAndPath.invoke(null, "minecraft", "air"); + instance$Items$AIR = method$Registry$get.invoke(Reflections.instance$BuiltInRegistries$ITEM, air); + instance$ItemStack$Air = constructor$ItemStack.newInstance(instance$Items$AIR); + } catch (ReflectiveOperationException e) { + throw new RuntimeException(e); + } + } + + public static final Class clazz$Registry$SimpleRegistry = requireNonNull( + ReflectionUtils.getClazz( + "org.bukkit.Registry$SimpleRegistry" + ) + ); + + public static final Field field$Registry$SimpleRegistry$map = requireNonNull( + ReflectionUtils.getDeclaredField( + clazz$Registry$SimpleRegistry, Map.class, 0 + ) + ); + + public static final Class clazz$Display$ItemDisplay = requireNonNull( + ReflectionUtils.getClazz( + BukkitReflectionUtils.assembleMCClass("world.entity.Display$ItemDisplay") + ) + ); + + // 1.21.3+ + public static final Class clazz$ClientboundEntityPositionSyncPacket = + ReflectionUtils.getClazz( + BukkitReflectionUtils.assembleMCClass("network.protocol.game.ClientboundEntityPositionSyncPacket") + ); + + public static final Field field$ClientboundEntityPositionSyncPacket$id = Optional.ofNullable(clazz$ClientboundEntityPositionSyncPacket) + .map(it -> ReflectionUtils.getInstanceDeclaredField(it, int.class, 0)) + .orElse(null); + + public static final Class clazz$ClientboundMoveEntityPacket = requireNonNull( + ReflectionUtils.getClazz( + BukkitReflectionUtils.assembleMCClass("network.protocol.game.ClientboundMoveEntityPacket"), + BukkitReflectionUtils.assembleMCClass("network.protocol.game.PacketPlayOutEntity") + ) + ); + + public static final Field field$ClientboundMoveEntityPacket$entityId = requireNonNull( + ReflectionUtils.getInstanceDeclaredField( + clazz$ClientboundMoveEntityPacket, int.class, 0 + ) + ); + + public static final Class clazz$ClientboundMoveEntityPacket$Pos = requireNonNull( + ReflectionUtils.getClazz( + BukkitReflectionUtils.assembleMCClass("network.protocol.game.ClientboundMoveEntityPacket$Pos"), + BukkitReflectionUtils.assembleMCClass("network.protocol.game.PacketPlayOutEntity$PacketPlayOutRelEntityMove") + ) + ); + + public static final Class clazz$ClientboundMoveEntityPacket$Rot = requireNonNull( + ReflectionUtils.getClazz( + BukkitReflectionUtils.assembleMCClass("network.protocol.game.ClientboundMoveEntityPacket$Rot"), + BukkitReflectionUtils.assembleMCClass("network.protocol.game.PacketPlayOutEntity$PacketPlayOutEntityLook") + ) + ); + + public static final Constructor constructor$ClientboundMoveEntityPacket$Rot = requireNonNull( + ReflectionUtils.getConstructor(clazz$ClientboundMoveEntityPacket$Rot, int.class, byte.class, byte.class, boolean.class) + ); + + public static final Class clazz$ServerboundUseItemOnPacket = requireNonNull( + ReflectionUtils.getClazz( + BukkitReflectionUtils.assembleMCClass("network.protocol.game.ServerboundUseItemOnPacket"), + BukkitReflectionUtils.assembleMCClass("network.protocol.game.PacketPlayInUseItem") + ) + ); + + @SuppressWarnings("deprecation") + public static final Method method$World$spawnEntity = requireNonNull( + VersionHelper.isVersionNewerThan1_20_2() ? + ReflectionUtils.getMethod(World.class, Entity.class, Location.class, EntityType.class, CreatureSpawnEvent.SpawnReason.class, Consumer.class) : + ReflectionUtils.getMethod(World.class, Entity.class, Location.class, EntityType.class, CreatureSpawnEvent.SpawnReason.class, org.bukkit.util.Consumer.class) + ); + + // 1.21.4+ + public static final Class clazz$ServerboundPickItemFromEntityPacket = + ReflectionUtils.getClazz( + BukkitReflectionUtils.assembleMCClass("network.protocol.game.ServerboundPickItemFromEntityPacket") + ); + + public static final Field field$ServerboundPickItemFromEntityPacket$id = Optional.ofNullable(clazz$ServerboundPickItemFromEntityPacket) + .map(it -> ReflectionUtils.getInstanceDeclaredField(it, int.class, 0)) + .orElse(null); + + public static final Class clazz$ClientboundSoundPacket = requireNonNull( + ReflectionUtils.getClazz( + BukkitReflectionUtils.assembleMCClass("network.protocol.game.ClientboundSoundPacket"), + BukkitReflectionUtils.assembleMCClass("network.protocol.game.PacketPlayOutNamedSoundEffect") + ) + ); + + public static final Class clazz$SoundSource = requireNonNull( + ReflectionUtils.getClazz( + BukkitReflectionUtils.assembleMCClass("sounds.SoundSource"), + BukkitReflectionUtils.assembleMCClass("sounds.SoundCategory") + ) + ); + + public static final Constructor constructor$ClientboundSoundPacket = requireNonNull( + ReflectionUtils.getConstructor( + clazz$ClientboundSoundPacket, clazz$Holder, clazz$SoundSource, double.class, double.class, double.class, float.class, float.class, long.class + ) + ); + + public static final Field field$ClientboundSoundPacket$sound = requireNonNull( + ReflectionUtils.getInstanceDeclaredField( + clazz$ClientboundSoundPacket, clazz$Holder, 0 + ) + ); + + public static final Field field$ClientboundSoundPacket$source = requireNonNull( + ReflectionUtils.getInstanceDeclaredField( + clazz$ClientboundSoundPacket, clazz$SoundSource, 0 + ) + ); + + public static final Field field$ClientboundSoundPacket$x = requireNonNull( + ReflectionUtils.getInstanceDeclaredField( + clazz$ClientboundSoundPacket, int.class, 0 + ) + ); + + public static final Field field$ClientboundSoundPacket$y = requireNonNull( + ReflectionUtils.getInstanceDeclaredField( + clazz$ClientboundSoundPacket, int.class, 1 + ) + ); + + public static final Field field$ClientboundSoundPacket$z = requireNonNull( + ReflectionUtils.getInstanceDeclaredField( + clazz$ClientboundSoundPacket, int.class, 2 + ) + ); + + public static final Field field$ClientboundSoundPacket$volume = requireNonNull( + ReflectionUtils.getInstanceDeclaredField( + clazz$ClientboundSoundPacket, float.class, 0 + ) + ); + + public static final Field field$ClientboundSoundPacket$pitch = requireNonNull( + ReflectionUtils.getInstanceDeclaredField( + clazz$ClientboundSoundPacket, float.class, 1 + ) + ); + + public static final Field field$ClientboundSoundPacket$seed = requireNonNull( + ReflectionUtils.getInstanceDeclaredField( + clazz$ClientboundSoundPacket, long.class, 0 + ) + ); + + public static final Method method$CraftEventFactory$callBlockPlaceEvent = requireNonNull( + ReflectionUtils.getStaticMethod( + clazz$CraftEventFactory, BlockPlaceEvent.class, clazz$ServerLevel, clazz$Player, clazz$InteractionHand, BlockState.class, int.class, int.class, int.class + ) + ); + + public static final Class clazz$Abilities = requireNonNull( + ReflectionUtils.getClazz( + BukkitReflectionUtils.assembleMCClass("world.entity.player.Abilities"), + BukkitReflectionUtils.assembleMCClass("world.entity.player.PlayerAbilities") + ) + ); + + public static final Field field$Abilities$invulnerable = requireNonNull( + ReflectionUtils.getInstanceDeclaredField( + clazz$Abilities, boolean.class, 0 + ) + ); + + public static final Field field$Abilities$flying = requireNonNull( + ReflectionUtils.getInstanceDeclaredField( + clazz$Abilities, boolean.class, 1 + ) + ); + + public static final Field field$Abilities$mayfly = requireNonNull( + ReflectionUtils.getInstanceDeclaredField( + clazz$Abilities, boolean.class, 2 + ) + ); + + public static final Field field$Abilities$instabuild = requireNonNull( + ReflectionUtils.getInstanceDeclaredField( + clazz$Abilities, boolean.class, 3 + ) + ); + + public static final Field field$Abilities$mayBuild = requireNonNull( + ReflectionUtils.getInstanceDeclaredField( + clazz$Abilities, boolean.class, 4 + ) + ); + + public static final Field field$Player$abilities = requireNonNull( + ReflectionUtils.getInstanceDeclaredField( + clazz$Player, clazz$Abilities, 0 + ) + ); + + public static final Class clazz$CraftEntity = requireNonNull( + ReflectionUtils.getClazz( + BukkitReflectionUtils.assembleCBClass("entity.CraftEntity") + ) + ); + + public static final Field field$CraftEntity$entity = requireNonNull( + ReflectionUtils.getDeclaredField( + clazz$CraftEntity, clazz$Entity, 0 + ) + ); + + public static final Object instance$Fluids$WATER; + + static { + try { + Object waterId = method$ResourceLocation$fromNamespaceAndPath.invoke(null, "minecraft", "water"); + instance$Fluids$WATER = method$Registry$get.invoke(instance$BuiltInRegistries$FLUID, waterId); + } catch (ReflectiveOperationException e) { + throw new RuntimeException(e); + } + } + + public static final Class clazz$FlowingFluid = requireNonNull( + ReflectionUtils.getClazz( + BukkitReflectionUtils.assembleMCClass("world.level.material.FlowingFluid"), + BukkitReflectionUtils.assembleMCClass("world.level.material.FluidTypeFlowing") + ) + ); + + public static final Method method$FlowingFluid$getSource = requireNonNull( + ReflectionUtils.getMethod( + clazz$FlowingFluid, clazz$FluidState, boolean.class + ) + ); + + public static final Method method$Level$getFluidState = requireNonNull( + ReflectionUtils.getMethod( + clazz$Level, clazz$FluidState, clazz$BlockPos + ) + ); + + public static final Method method$FluidState$isSource = requireNonNull( + ReflectionUtils.getMethod( + clazz$FluidState, boolean.class, new String[]{"isSource", "b"} + ) + ); + + public static final Method method$FluidState$createLegacyBlock = requireNonNull( + ReflectionUtils.getMethod( + clazz$FluidState, clazz$BlockState + ) + ); + + public static final Class clazz$FileToIdConverter = requireNonNull( + ReflectionUtils.getClazz( + BukkitReflectionUtils.assembleMCClass("resources.FileToIdConverter") + ) + ); + + public static final Method method$FileToIdConverter$json = requireNonNull( + ReflectionUtils.getStaticMethod( + clazz$FileToIdConverter, clazz$FileToIdConverter, String.class + ) + ); + + public static final Class clazz$ResourceManager = requireNonNull( + ReflectionUtils.getClazz( + BukkitReflectionUtils.assembleMCClass("server.packs.resources.IResourceManager"), + BukkitReflectionUtils.assembleMCClass("server.packs.resources.ResourceManager") + ) + ); + + public static final Method method$FileToIdConverter$listMatchingResources = requireNonNull( + ReflectionUtils.getMethod( + clazz$FileToIdConverter, Map.class, new String[]{"listMatchingResources", "a"}, clazz$ResourceManager + ) + ); + + public static final Class clazz$Resource = requireNonNull( + ReflectionUtils.getClazz( + BukkitReflectionUtils.assembleMCClass("server.packs.resources.IResource"), + BukkitReflectionUtils.assembleMCClass("server.packs.resources.Resource") + ) + ); + + public static final Method method$Resource$openAsReader = requireNonNull( + ReflectionUtils.getMethod( + clazz$Resource, BufferedReader.class + ) + ); + + public static final Class clazz$MultiPackResourceManager = requireNonNull( + ReflectionUtils.getClazz( + BukkitReflectionUtils.assembleMCClass("server.packs.resources.MultiPackResourceManager"), + BukkitReflectionUtils.assembleMCClass("server.packs.resources.ResourceManager") + ) + ); + + public static final Class clazz$PackType = requireNonNull( + ReflectionUtils.getClazz( + BukkitReflectionUtils.assembleMCClass("server.packs.PackType"), + BukkitReflectionUtils.assembleMCClass("server.packs.EnumResourcePackType") + ) + ); + + public static final Method method$PackType$values = requireNonNull( + ReflectionUtils.getStaticMethod( + clazz$PackType, clazz$PackType.arrayType() + ) + ); + + public static final Object instance$PackType$SERVER_DATA; + + static { + try { + Object[] values = (Object[]) method$PackType$values.invoke(null); + instance$PackType$SERVER_DATA = values[1]; + } catch (ReflectiveOperationException e) { + throw new RuntimeException(e); + } + } + + public static final Class clazz$PackRepository = requireNonNull( + ReflectionUtils.getClazz( + BukkitReflectionUtils.assembleMCClass("server.packs.repository.ResourcePackRepository"), + BukkitReflectionUtils.assembleMCClass("server.packs.repository.PackRepository") + ) + ); + + public static final Method method$MinecraftServer$getPackRepository = requireNonNull( + ReflectionUtils.getMethod( + clazz$MinecraftServer, clazz$PackRepository + ) + ); + + public static final Field field$PackRepository$selected = requireNonNull( + ReflectionUtils.getInstanceDeclaredField( + clazz$PackRepository, List.class, 0 + ) + ); + + public static final Class clazz$Pack = requireNonNull( + ReflectionUtils.getClazz( + BukkitReflectionUtils.assembleMCClass("server.packs.repository.ResourcePackLoader"), + BukkitReflectionUtils.assembleMCClass("server.packs.repository.Pack") + ) + ); + + public static final Method method$PackRepository$getPack = requireNonNull( + ReflectionUtils.getMethod( + clazz$PackRepository, clazz$Pack, String.class + ) + ); + + public static final Method method$Pack$getId = requireNonNull( + ReflectionUtils.getMethod( + clazz$Pack, String.class + ) + ); + + public static final Method method$MinecraftServer$reloadResources = requireNonNull( + ReflectionUtils.getMethod( + clazz$MinecraftServer, CompletableFuture.class, Collection.class + ) + ); + + public static final Class clazz$PackResources = requireNonNull( + ReflectionUtils.getClazz( + BukkitReflectionUtils.assembleMCClass("server.packs.PackResources"), + BukkitReflectionUtils.assembleMCClass("server.packs.IResourcePack") + ) + ); + + public static final Method method$Pack$open = requireNonNull( + ReflectionUtils.getMethod( + clazz$Pack, clazz$PackResources + ) + ); + + public static final Constructor constructor$MultiPackResourceManager = requireNonNull( + ReflectionUtils.getConstructor( + clazz$MultiPackResourceManager, clazz$PackType, List.class + ) + ); + + public static final Class clazz$InventoryView = requireNonNull( + ReflectionUtils.getClazz( + "org.bukkit.inventory.InventoryView" + ) + ); + + public static final Method method$InventoryView$getPlayer = requireNonNull( + ReflectionUtils.getMethod( + clazz$InventoryView, HumanEntity.class + ) + ); + + public static final Class clazz$RecipeManager = requireNonNull( + ReflectionUtils.getClazz( + BukkitReflectionUtils.assembleMCClass("world.item.crafting.RecipeManager"), + BukkitReflectionUtils.assembleMCClass("world.item.crafting.CraftingManager") + ) + ); + + public static final Class clazz$RecipeManager$CachedCheck = requireNonNull( + ReflectionUtils.getClazz( + BukkitReflectionUtils.assembleMCClass("world.item.crafting.RecipeManager$CachedCheck"), + BukkitReflectionUtils.assembleMCClass("world.item.crafting.CraftingManager$a") + ) + ); + + public static final Method method$RecipeManager$finalizeRecipeLoading = + ReflectionUtils.getMethod( + clazz$RecipeManager, new String[]{"finalizeRecipeLoading"} + ); + + public static final Method method$MinecraftServer$getRecipeManager = requireNonNull( + ReflectionUtils.getMethod( + clazz$MinecraftServer, clazz$RecipeManager + ) + ); + + public static final Class clazz$RecipeMap = + ReflectionUtils.getClazz( + BukkitReflectionUtils.assembleMCClass("world.item.crafting.RecipeMap") + ); + + public static final Field field$RecipeManager$recipes = Optional.ofNullable(clazz$RecipeMap) + .map(it -> ReflectionUtils.getDeclaredField(clazz$RecipeManager, it, 0)) + .orElse(null); + + public static final Method method$RecipeMap$removeRecipe = Optional.ofNullable(clazz$RecipeMap) + .map(it -> ReflectionUtils.getMethod(it, boolean.class, clazz$ResourceKey)) + .orElse(null); + + public static final Class clazz$CraftRecipe = requireNonNull( + ReflectionUtils.getClazz( + BukkitReflectionUtils.assembleCBClass("inventory.CraftRecipe") + ) + ); + + public static final Method method$CraftRecipe$addToCraftingManager = requireNonNull( + ReflectionUtils.getMethod( + clazz$CraftRecipe, new String[]{"addToCraftingManager"} + ) + ); + + public static final Method method$CraftRecipe$toMinecraft = Optional.of(clazz$CraftRecipe) + .map(it -> ReflectionUtils.getStaticMethod(it, clazz$ResourceKey, NamespacedKey.class)) + .orElse(null); + + public static final Class clazz$CraftShapedRecipe = requireNonNull( + ReflectionUtils.getClazz( + BukkitReflectionUtils.assembleCBClass("inventory.CraftShapedRecipe") + ) + ); + + public static final Method method$CraftShapedRecipe$fromBukkitRecipe = requireNonNull( + ReflectionUtils.getStaticMethod( + clazz$CraftShapedRecipe, clazz$CraftShapedRecipe, ShapedRecipe.class + ) + ); + + public static final Class clazz$CraftShapelessRecipe = requireNonNull( + ReflectionUtils.getClazz( + BukkitReflectionUtils.assembleCBClass("inventory.CraftShapelessRecipe") + ) + ); + + public static final Method method$CraftShapelessRecipe$fromBukkitRecipe = requireNonNull( + ReflectionUtils.getStaticMethod( + clazz$CraftShapelessRecipe, clazz$CraftShapelessRecipe, ShapelessRecipe.class + ) + ); + + public static final Class clazz$FeatureFlagSet = requireNonNull( + ReflectionUtils.getClazz( + BukkitReflectionUtils.assembleMCClass("world.flag.FeatureFlagSet") + ) + ); + + public static final Field field$RecipeManager$featureflagset = + ReflectionUtils.getDeclaredField( + clazz$RecipeManager, clazz$FeatureFlagSet, 0 + ); + + public static final Class clazz$CraftInventoryPlayer = requireNonNull( + ReflectionUtils.getClazz( + BukkitReflectionUtils.assembleCBClass("inventory.CraftInventoryPlayer") + ) + ); + + public static final Class clazz$CraftInventory = requireNonNull( + ReflectionUtils.getClazz( + BukkitReflectionUtils.assembleCBClass("inventory.CraftInventory") + ) + ); + + public static final Class clazz$Inventory = requireNonNull( + ReflectionUtils.getClazz( + BukkitReflectionUtils.assembleMCClass("world.entity.player.Inventory"), + BukkitReflectionUtils.assembleMCClass("world.entity.player.PlayerInventory") + ) + ); + + public static final Method method$CraftInventoryPlayer$getInventory = requireNonNull( + ReflectionUtils.getMethod( + clazz$CraftInventoryPlayer, clazz$Inventory, new String[]{ "getInventory" } + ) + ); + + public static final Class clazz$NonNullList = requireNonNull( + ReflectionUtils.getClazz( + BukkitReflectionUtils.assembleMCClass("core.NonNullList") + ) + ); + + public static final Field field$Inventory$items = requireNonNull( + ReflectionUtils.getInstanceDeclaredField( + clazz$Inventory, clazz$NonNullList, 0 + ) + ); + + public static final Method method$NonNullList$set = requireNonNull( + ReflectionUtils.getMethod( + clazz$NonNullList, Object.class, int.class, Object.class + ) + ); + + public static final Class clazz$Ingredient = requireNonNull( + ReflectionUtils.getClazz( + BukkitReflectionUtils.assembleMCClass("world.item.crafting.Ingredient"), + BukkitReflectionUtils.assembleMCClass("world.item.crafting.RecipeItemStack") + ) + ); + + // 1.20.1-1.21.1 + public static final Field field$Ingredient$itemStacks1_20_1 = + ReflectionUtils.getDeclaredField( + clazz$Ingredient, clazz$ItemStack.arrayType(), 0 + ); + + // 1.21.2-1.21.3 + public static final Field field$Ingredient$itemStacks1_21_2 = + ReflectionUtils.getDeclaredField( + clazz$Ingredient, List.class, 1 + ); + + // 1.21.4 paper + public static final Field field$Ingredient$itemStacks1_21_4 = + ReflectionUtils.getDeclaredField( + clazz$Ingredient, Set.class, 0 + ); + + // Since 1.21.2, exact has been removed + public static final Field field$Ingredient$exact = + ReflectionUtils.getDeclaredField( + clazz$Ingredient, boolean.class, 0 + ); + + public static final Class clazz$ShapedRecipe = requireNonNull( + ReflectionUtils.getClazz( + BukkitReflectionUtils.assembleMCClass("world.item.crafting.ShapedRecipe"), + BukkitReflectionUtils.assembleMCClass("world.item.crafting.ShapedRecipes") + ) + ); + + // 1.20.3+ + public static final Class clazz$ShapedRecipePattern = + ReflectionUtils.getClazz( + BukkitReflectionUtils.assembleMCClass("world.item.crafting.ShapedRecipePattern") + ); + + // 1.20.1-1.20.2 + public static final Field field$1_20_1$ShapedRecipe$recipeItems= + ReflectionUtils.getDeclaredField( + clazz$ShapedRecipe, clazz$NonNullList, 0 + ); + + // 1.20.3+ + public static final Field field$1_20_3$ShapedRecipe$pattern= + ReflectionUtils.getDeclaredField( + clazz$ShapedRecipe, clazz$ShapedRecipePattern, 0 + ); + + // 1.20.3-1.21.1 + public static final Field field$ShapedRecipePattern$ingredients1_20_3 = Optional.ofNullable(clazz$ShapedRecipePattern) + .map(it -> ReflectionUtils.getDeclaredField(it, clazz$NonNullList, 0)) + .orElse(null); + + // 1.21.2+ + public static final Field field$ShapedRecipePattern$ingredients1_21_2 = Optional.ofNullable(clazz$ShapedRecipePattern) + .map(it -> ReflectionUtils.getDeclaredField(it, List.class, 0)) + .orElse(null); + + // 1.20.1-1.21.1 + public static final Field field$Ingredient$values = ReflectionUtils.getInstanceDeclaredField( + clazz$Ingredient, 0 + ); + + // 1.20.2+ + public static final Class clazz$RecipeHolder = ReflectionUtils.getClazz( + BukkitReflectionUtils.assembleMCClass("world.item.crafting.RecipeHolder") + ); + + // 1.20.2+ + public static final Field field$RecipeHolder$recipe = Optional.ofNullable(clazz$RecipeHolder) + .map(it -> ReflectionUtils.getDeclaredField(it, 1)) + .orElse(null); + + public static final Field field$RecipeHolder$id = Optional.ofNullable(clazz$RecipeHolder) + .map(it -> ReflectionUtils.getDeclaredField(it, 0)) + .orElse(null); + + public static final Class clazz$ShapelessRecipe = requireNonNull( + ReflectionUtils.getClazz( + BukkitReflectionUtils.assembleMCClass("world.item.crafting.ShapelessRecipe"), + BukkitReflectionUtils.assembleMCClass("world.item.crafting.ShapelessRecipes") + ) + ); + + public static final Class clazz$PlacementInfo = + ReflectionUtils.getClazz( + BukkitReflectionUtils.assembleMCClass("world.item.crafting.PlacementInfo") + ); + + // 1.21.2+ + public static final Field field$ShapelessRecipe$placementInfo = Optional.ofNullable(clazz$PlacementInfo) + .map(it -> ReflectionUtils.getDeclaredField(clazz$ShapelessRecipe, it, 0)) + .orElse(null); + + public static final Field field$ShapedRecipe$placementInfo = Optional.ofNullable(clazz$PlacementInfo) + .map(it -> ReflectionUtils.getDeclaredField(clazz$ShapedRecipe, it, 0)) + .orElse(null); + + public static final Field field$ShapelessRecipe$ingredients = + Optional.ofNullable(ReflectionUtils.getDeclaredField(clazz$ShapelessRecipe, List.class, 0)) + .orElse(ReflectionUtils.getDeclaredField(clazz$ShapelessRecipe, clazz$NonNullList, 0)); + + // require ResourceLocation for 1.20.1-1.21.1 + // require ResourceKey for 1.21.2+ + public static final Method method$RecipeManager$byKey; + + static { + Method method$RecipeManager$byKey0 = null; + if (VersionHelper.isVersionNewerThan1_21_2()) { + for (Method method : clazz$RecipeManager.getMethods()) { + if (method.getParameterCount() == 1 && method.getParameterTypes()[0] == clazz$ResourceKey) { + if (method.getReturnType() == Optional.class && method.getGenericReturnType() instanceof ParameterizedType type) { + Type[] actualTypeArguments = type.getActualTypeArguments(); + if (actualTypeArguments.length == 1) { + method$RecipeManager$byKey0 = method; + } + } + } + } + } else if (VersionHelper.isVersionNewerThan1_20_2()) { + for (Method method : clazz$RecipeManager.getMethods()) { + if (method.getParameterCount() == 1 && method.getParameterTypes()[0] == clazz$ResourceLocation) { + if (method.getReturnType() == Optional.class && method.getGenericReturnType() instanceof ParameterizedType type) { + Type[] actualTypeArguments = type.getActualTypeArguments(); + if (actualTypeArguments.length == 1) { + method$RecipeManager$byKey0 = method; + } + } + } + } + } else { + for (Method method : clazz$RecipeManager.getMethods()) { + if (method.getParameterCount() == 1 && method.getParameterTypes()[0] == clazz$ResourceLocation) { + if (method.getReturnType() == Optional.class) { + method$RecipeManager$byKey0 = method; + } + } + } + } + method$RecipeManager$byKey = requireNonNull(method$RecipeManager$byKey0); + } + + public static final Class clazz$CraftServer = requireNonNull( + ReflectionUtils.getClazz( + BukkitReflectionUtils.assembleCBClass("CraftServer") + ) + ); + + public static final Class clazz$DedicatedPlayerList = requireNonNull( + ReflectionUtils.getClazz( + BukkitReflectionUtils.assembleMCClass("server.dedicated.DedicatedPlayerList") + ) + ); + + public static final Field field$CraftServer$playerList = requireNonNull( + ReflectionUtils.getDeclaredField( + clazz$CraftServer, clazz$DedicatedPlayerList, 0 + ) + ); + + public static final Method method$DedicatedPlayerList$reloadRecipes = requireNonNull( + ReflectionUtils.getMethod( + clazz$DedicatedPlayerList, new String[] {"reloadRecipeData", "reloadRecipes"} + ) + ); + + public static final Class clazz$ResultContainer = requireNonNull( + ReflectionUtils.getClazz( + BukkitReflectionUtils.assembleMCClass("world.inventory.ResultContainer"), + BukkitReflectionUtils.assembleMCClass("world.inventory.InventoryCraftResult") + ) + ); + + public static final Class clazz$Container = requireNonNull( + ReflectionUtils.getClazz( + BukkitReflectionUtils.assembleMCClass("world.Container"), + BukkitReflectionUtils.assembleMCClass("world.IInventory") + ) + ); + + public static final Class clazz$Recipe = requireNonNull( + ReflectionUtils.getClazz( + BukkitReflectionUtils.assembleMCClass("world.item.crafting.Recipe"), + BukkitReflectionUtils.assembleMCClass("world.item.crafting.IRecipe") + ) + ); + + public static final Field field$ResultContainer$recipeUsed = Optional.ofNullable(ReflectionUtils.getDeclaredField(clazz$ResultContainer, clazz$Recipe, 0)) + .orElse(ReflectionUtils.getDeclaredField(clazz$ResultContainer, clazz$RecipeHolder, 0)); + + public static final Class clazz$CraftInventoryCrafting = requireNonNull( + ReflectionUtils.getClazz( + BukkitReflectionUtils.assembleCBClass("inventory.CraftInventoryCrafting") + ) + ); + + public static final Field field$CraftInventoryCrafting$resultInventory = requireNonNull( + ReflectionUtils.getDeclaredField( + clazz$CraftInventoryCrafting, clazz$Container, 0 + ) + ); + + public static final Class clazz$LivingEntity = requireNonNull( + ReflectionUtils.getClazz( + BukkitReflectionUtils.assembleMCClass("world.entity.LivingEntity"), + BukkitReflectionUtils.assembleMCClass("world.entity.EntityLiving") + ) + ); + + // 1.20.5+ + public static final Method method$ItemStack$hurtAndBreak = + ReflectionUtils.getMethod( + clazz$ItemStack, void.class, int.class, clazz$LivingEntity, clazz$EquipmentSlot + ); + + // for 1.20.1-1.21.1 + public static final Class clazz$AbstractCookingRecipe = requireNonNull( + ReflectionUtils.getClazz( + BukkitReflectionUtils.assembleMCClass("world.item.crafting.AbstractCookingRecipe"), + BukkitReflectionUtils.assembleMCClass("world.item.crafting.RecipeCooking") + ) + ); + + // for 1.20.1-1.21.1 + public static final Field field$AbstractCookingRecipe$input = + ReflectionUtils.getDeclaredField( + clazz$AbstractCookingRecipe, clazz$Ingredient, 0 + ); + + // for 1.21.2+ + public static final Class clazz$SingleItemRecipe = + ReflectionUtils.getClazz( + BukkitReflectionUtils.assembleMCClass("world.item.crafting.SingleItemRecipe") + ); + + // for 1.21.2+ + public static final Field field$SingleItemRecipe$input = + Optional.ofNullable(clazz$SingleItemRecipe) + .map(it -> ReflectionUtils.getDeclaredField(it, clazz$Ingredient, 0)) + .orElse(null); + + public static final Class clazz$CraftFurnaceRecipe = requireNonNull( + ReflectionUtils.getClazz( + BukkitReflectionUtils.assembleCBClass("inventory.CraftFurnaceRecipe") + ) + ); + + public static final Method method$CraftFurnaceRecipe$fromBukkitRecipe = requireNonNull( + ReflectionUtils.getStaticMethod( + clazz$CraftFurnaceRecipe, clazz$CraftFurnaceRecipe, FurnaceRecipe.class + ) + ); + + public static final Class clazz$CraftBlastingRecipe = requireNonNull( + ReflectionUtils.getClazz( + BukkitReflectionUtils.assembleCBClass("inventory.CraftBlastingRecipe") + ) + ); + + public static final Method method$CraftBlastingRecipe$fromBukkitRecipe = requireNonNull( + ReflectionUtils.getStaticMethod( + clazz$CraftBlastingRecipe, clazz$CraftBlastingRecipe, BlastingRecipe.class + ) + ); + + public static final Class clazz$CraftSmokingRecipe = requireNonNull( + ReflectionUtils.getClazz( + BukkitReflectionUtils.assembleCBClass("inventory.CraftSmokingRecipe") + ) + ); + + public static final Method method$CraftSmokingRecipe$fromBukkitRecipe = requireNonNull( + ReflectionUtils.getStaticMethod( + clazz$CraftSmokingRecipe, clazz$CraftSmokingRecipe, SmokingRecipe.class + ) + ); + + public static final Class clazz$CraftCampfireRecipe = requireNonNull( + ReflectionUtils.getClazz( + BukkitReflectionUtils.assembleCBClass("inventory.CraftCampfireRecipe") + ) + ); + + public static final Method method$CraftCampfireRecipe$fromBukkitRecipe = requireNonNull( + ReflectionUtils.getStaticMethod( + clazz$CraftCampfireRecipe, clazz$CraftCampfireRecipe, CampfireRecipe.class + ) + ); + + public static final Class clazz$CraftStonecuttingRecipe = requireNonNull( + ReflectionUtils.getClazz( + BukkitReflectionUtils.assembleCBClass("inventory.CraftStonecuttingRecipe") + ) + ); + + public static final Method method$CraftStonecuttingRecipe$fromBukkitRecipe = requireNonNull( + ReflectionUtils.getStaticMethod( + clazz$CraftStonecuttingRecipe, clazz$CraftStonecuttingRecipe, StonecuttingRecipe.class + ) + ); + + public static final Field field$AbstractFurnaceBlockEntity$recipeType = requireNonNull( + ReflectionUtils.getDeclaredField( + clazz$AbstractFurnaceBlockEntity, clazz$RecipeType, 0 + ) + ); + + public static final Field field$AbstractFurnaceBlockEntity$quickCheck = requireNonNull( + ReflectionUtils.getDeclaredField( + clazz$AbstractFurnaceBlockEntity, clazz$RecipeManager$CachedCheck, 0 + ) + ); + + // 1.20.1-1.21.1 + public static final Field field$CampfireBlockEntity$quickCheck = + ReflectionUtils.getDeclaredField( + clazz$CampfireBlockEntity, clazz$RecipeManager$CachedCheck, 0 + ); + + // 1.21+ + public static final Class clazz$RecipeInput = ReflectionUtils.getClazz( + BukkitReflectionUtils.assembleMCClass("world.item.crafting.RecipeInput") + ); + + public static final Class clazz$SingleRecipeInput = ReflectionUtils.getClazz( + BukkitReflectionUtils.assembleMCClass("world.item.crafting.SingleRecipeInput") + ); + + public static final Constructor constructor$SingleRecipeInput = Optional.ofNullable(clazz$SingleRecipeInput) + .map(it -> ReflectionUtils.getConstructor(it, clazz$ItemStack)) + .orElse(null); + + // 1.20.1-1.21.1 + public static final Method method$RecipeManager$getRecipeFor0 = + ReflectionUtils.getMethod( + clazz$RecipeManager, Optional.class, clazz$RecipeType, clazz$Container, clazz$Level, clazz$ResourceLocation + ); + + // 1.21.2+ + public static final Method method$RecipeManager$getRecipeFor1 = + ReflectionUtils.getMethod( + clazz$RecipeManager, Optional.class, clazz$RecipeType, clazz$RecipeInput, clazz$Level, clazz$ResourceKey + ); + + // 1.21+ + public static final Field field$SingleRecipeInput$item = Optional.ofNullable(clazz$SingleRecipeInput) + .map(it -> ReflectionUtils.getDeclaredField(it, clazz$ItemStack, 0)) + .orElse(null); + + public static final Field field$AbstractFurnaceBlockEntity$items = requireNonNull( + ReflectionUtils.getDeclaredField( + clazz$AbstractFurnaceBlockEntity, clazz$NonNullList, 0 + ) + ); + + public static final Class clazz$CraftBlockEntityState = requireNonNull( + ReflectionUtils.getClazz( + BukkitReflectionUtils.assembleCBClass("block.CraftBlockEntityState") + ) + ); + + public static final Field field$CraftBlockEntityState$tileEntity = requireNonNull( + ReflectionUtils.getDeclaredField( + clazz$CraftBlockEntityState, 0 + ) + ); + + public static final Class clazz$SimpleContainer = requireNonNull( + ReflectionUtils.getClazz( + BukkitReflectionUtils.assembleMCClass("world.SimpleContainer"), + BukkitReflectionUtils.assembleMCClass("world.InventorySubcontainer") + ) + ); + + public static final Field field$SimpleContainer$items = requireNonNull( + ReflectionUtils.getDeclaredField( + clazz$SimpleContainer, clazz$NonNullList, 0 + ) + ); + + public static final Method method$LevelReader$getMaxLocalRawBrightness = requireNonNull( + ReflectionUtils.getMethod( + Reflections.clazz$LevelReader, int.class, Reflections.clazz$BlockPos + ) + ); + + public static final Method method$ConfiguredFeature$place = requireNonNull( + ReflectionUtils.getMethod( + clazz$ConfiguredFeature, boolean.class, clazz$WorldGenLevel, clazz$ChunkGenerator, clazz$RandomSource, clazz$BlockPos + ) + ); + + public static final Method method$ServerChunkCache$getGenerator = requireNonNull( + ReflectionUtils.getMethod( + clazz$ServerChunkCache, clazz$ChunkGenerator + ) + ); + + public static final Method method$ServerLevel$sendBlockUpdated = requireNonNull( + ReflectionUtils.getMethod( + clazz$ServerLevel, void.class, clazz$BlockPos, clazz$BlockState, clazz$BlockState, int.class + ) + ); + + public static final Class clazz$BonemealableBlock = requireNonNull( + ReflectionUtils.getClazz( + BukkitReflectionUtils.assembleMCClass("world.level.block.BonemealableBlock"), + BukkitReflectionUtils.assembleMCClass("world.level.block.IBlockFragilePlantElement") + ) + ); + + public static final Method method$BonemealableBlock$isValidBonemealTarget = requireNonNull( + VersionHelper.isVersionNewerThan1_20_2() ? + ReflectionUtils.getMethod( + clazz$BonemealableBlock, boolean.class, clazz$LevelReader, clazz$BlockPos, clazz$BlockState + ) : + ReflectionUtils.getMethod( + clazz$BonemealableBlock, boolean.class, clazz$LevelReader, clazz$BlockPos, clazz$BlockState, boolean.class + ) + ); + + public static final Method method$BonemealableBlock$isBonemealSuccess = requireNonNull( + ReflectionUtils.getMethod( + clazz$BonemealableBlock, boolean.class, clazz$Level, clazz$RandomSource, clazz$BlockPos, clazz$BlockState + ) + ); + + public static final Method method$BonemealableBlock$performBonemeal = requireNonNull( + ReflectionUtils.getMethod( + clazz$BonemealableBlock, void.class, clazz$ServerLevel, clazz$RandomSource, clazz$BlockPos, clazz$BlockState + ) + ); + + public static final Class clazz$ClientboundLevelEventPacket = requireNonNull( + ReflectionUtils.getClazz( + BukkitReflectionUtils.assembleMCClass("network.protocol.game.ClientboundLevelEventPacket"), + BukkitReflectionUtils.assembleMCClass("network.protocol.game.PacketPlayOutWorldEvent") + ) + ); + + public static final Constructor constructor$ClientboundLevelEventPacket = requireNonNull( + ReflectionUtils.getConstructor( + clazz$ClientboundLevelEventPacket, int.class, clazz$BlockPos, int.class, boolean.class + ) + ); + + public static final Field field$ClientboundLevelEventPacket$eventId = requireNonNull( + ReflectionUtils.getDeclaredField( + clazz$ClientboundLevelEventPacket, int.class, 0 + ) + ); + + public static final Field field$ClientboundLevelEventPacket$data = requireNonNull( + ReflectionUtils.getDeclaredField( + clazz$ClientboundLevelEventPacket, int.class, 1 + ) + ); + + public static final Field field$ClientboundLevelEventPacket$global = requireNonNull( + ReflectionUtils.getDeclaredField( + clazz$ClientboundLevelEventPacket, boolean.class, 0 + ) + ); + + public static final Method method$ServerLevel$levelEvent = requireNonNull( + ReflectionUtils.getMethod( + clazz$ServerLevel, void.class, clazz$Player, int.class, clazz$BlockPos, int.class + ) + ); + + public static final Method method$PalettedContainer$getAndSet = Objects.requireNonNull( + ReflectionUtils.getMethod( + Reflections.clazz$PalettedContainer, + Object.class, + new String[] {"a", "getAndSet"}, + int.class, int.class, int.class, Object.class + ) + ); + + public static final Method method$ServerGamePacketListenerImpl$tryPickItem = + ReflectionUtils.getDeclaredMethod( + clazz$ServerGamePacketListenerImpl, void.class, clazz$ItemStack + ); + + public static final Class clazz$ClientboundOpenScreenPacket = requireNonNull( + ReflectionUtils.getClazz( + BukkitReflectionUtils.assembleMCClass("network.protocol.game.ClientboundOpenScreenPacket"), + BukkitReflectionUtils.assembleMCClass("network.protocol.game.PacketPlayOutOpenWindow") + ) + ); + + public static final Class clazz$MenuType = requireNonNull( + ReflectionUtils.getClazz( + BukkitReflectionUtils.assembleMCClass("world.inventory.MenuType"), + BukkitReflectionUtils.assembleMCClass("world.inventory.Containers") + ) + ); + + public static final Constructor constructor$ClientboundOpenScreenPacket = requireNonNull( + ReflectionUtils.getConstructor( + clazz$ClientboundOpenScreenPacket, int.class, clazz$MenuType, clazz$Component + ) + ); + + public static final Class clazz$AbstractContainerMenu = requireNonNull( + ReflectionUtils.getClazz( + BukkitReflectionUtils.assembleMCClass("world.inventory.AbstractContainerMenu"), + BukkitReflectionUtils.assembleMCClass("world.inventory.Container") + ) + ); + + public static final Field field$AbstractContainerMenu$title = requireNonNull( + ReflectionUtils.getDeclaredField( + clazz$AbstractContainerMenu, clazz$Component, 0 + ) + ); + + public static final Field field$Player$containerMenu = requireNonNull( + ReflectionUtils.getDeclaredField( + clazz$Player, clazz$AbstractContainerMenu, 0 + ) + ); + + public static final Field field$AbstractContainerMenu$containerId = requireNonNull( + ReflectionUtils.getDeclaredField( + clazz$AbstractContainerMenu, int.class, 1 + ) + ); + + public static final Field field$AbstractContainerMenu$menuType = requireNonNull( + ReflectionUtils.getDeclaredField( + clazz$AbstractContainerMenu, clazz$MenuType, 0 + ) + ); + + public static final Method method$CraftInventory$getInventory = requireNonNull( + ReflectionUtils.getMethod( + clazz$CraftInventory, clazz$Container, new String[]{ "getInventory" } + ) + ); + + public static final Class clazz$CraftContainer = requireNonNull( + ReflectionUtils.getClazz( + BukkitReflectionUtils.assembleCBClass("inventory.CraftContainer") + ) + ); + + public static final Constructor constructor$CraftContainer = requireNonNull( + ReflectionUtils.getConstructor( + clazz$CraftContainer, Inventory.class, clazz$Player, int.class + ) + ); + + public static final Field field$AbstractContainerMenu$checkReachable = requireNonNull( + ReflectionUtils.getDeclaredFieldBackwards( + clazz$AbstractContainerMenu, boolean.class, 0 + ) + ); + + public static final Method method$CraftContainer$getNotchInventoryType = requireNonNull( + ReflectionUtils.getStaticMethod( + clazz$CraftContainer, clazz$MenuType, Inventory.class + ) + ); + + public static final Method method$ServerPlayer$nextContainerCounter = requireNonNull( + ReflectionUtils.getMethod( + clazz$ServerPlayer, int.class, new String[] {"nextContainerCounter"} + ) + ); + + public static final Method method$ServerPlayer$initMenu = requireNonNull( + ReflectionUtils.getMethod( + clazz$ServerPlayer, void.class, clazz$AbstractContainerMenu + ) + ); + + public static final Class clazz$ClientboundResourcePackPushPacket = requireNonNull( + ReflectionUtils.getClazz( + BukkitReflectionUtils.assembleMCClass("network.protocol.common.ClientboundResourcePackPushPacket"), + BukkitReflectionUtils.assembleMCClass("network.protocol.common.ClientboundResourcePackPacket"), + BukkitReflectionUtils.assembleMCClass("network.protocol.game.PacketPlayOutResourcePackSend") + ) + ); + + public static final Constructor constructor$ClientboundResourcePackPushPacket = requireNonNull( + VersionHelper.isVersionNewerThan1_20_5() ? + ReflectionUtils.getConstructor( + clazz$ClientboundResourcePackPushPacket, UUID.class, String.class, String.class, boolean.class, Optional.class + ) : + VersionHelper.isVersionNewerThan1_20_3() ? + ReflectionUtils.getConstructor( + clazz$ClientboundResourcePackPushPacket, UUID.class, String.class, String.class, boolean.class, clazz$Component + ) : + ReflectionUtils.getConstructor( + clazz$ClientboundResourcePackPushPacket, String.class, String.class, boolean.class, clazz$Component + ) + ); + + public static final Class clazz$DedicatedServerProperties = requireNonNull( + ReflectionUtils.getClazz( + BukkitReflectionUtils.assembleMCClass("server.dedicated.DedicatedServerProperties") + ) + ); + + public static final Class clazz$DedicatedServerSettings = requireNonNull( + ReflectionUtils.getClazz( + BukkitReflectionUtils.assembleMCClass("server.dedicated.DedicatedServerSettings") + ) + ); + + public static final Class clazz$DedicatedServer = requireNonNull( + ReflectionUtils.getClazz( + BukkitReflectionUtils.assembleMCClass("server.dedicated.DedicatedServer") + ) + ); + + public static final Field field$DedicatedServerSettings$properties = requireNonNull( + ReflectionUtils.getDeclaredField( + clazz$DedicatedServerSettings, clazz$DedicatedServerProperties, 0 + ) + ); + + public static final Field field$DedicatedServer$settings = requireNonNull( + ReflectionUtils.getDeclaredField( + clazz$DedicatedServer, clazz$DedicatedServerSettings, 0 + ) + ); + + public static final Class clazz$MinecraftServer$ServerResourcePackInfo = requireNonNull( + ReflectionUtils.getClazz( + BukkitReflectionUtils.assembleMCClass("server.MinecraftServer$ServerResourcePackInfo") + ) + ); + + public static final Field field$DedicatedServerProperties$serverResourcePackInfo = requireNonNull( + ReflectionUtils.getDeclaredField( + clazz$DedicatedServerProperties, Optional.class, 0 + ) + ); + + public static final Constructor constructor$ServerResourcePackInfo = requireNonNull( + ReflectionUtils.getConstructor(clazz$MinecraftServer$ServerResourcePackInfo, 0) + ); + + public static final Class clazz$ClientboundResourcePackPopPacket = + ReflectionUtils.getClazz( + BukkitReflectionUtils.assembleMCClass("network.protocol.common.ClientboundResourcePackPopPacket") + ); + + public static final Constructor constructor$ClientboundResourcePackPopPacket = Optional.ofNullable(clazz$ClientboundResourcePackPopPacket) + .map(it -> ReflectionUtils.getConstructor(it, Optional.class)) + .orElse(null); + + public static final Constructor constructor$JukeboxSong = Optional.ofNullable(clazz$JukeboxSong) + .map(it -> ReflectionUtils.getConstructor(it, clazz$Holder, clazz$Component, float.class, int.class)) + .orElse(null); + + public static final Field field$JukeboxSong$soundEvent = Optional.ofNullable(clazz$JukeboxSong) + .map(it -> ReflectionUtils.getDeclaredField(it, clazz$Holder, 0)) + .orElse(null); + + public static final Field field$JukeboxSong$description = Optional.ofNullable(clazz$JukeboxSong) + .map(it -> ReflectionUtils.getDeclaredField(it, clazz$Component, 0)) + .orElse(null); + + public static final Field field$JukeboxSong$lengthInSeconds = Optional.ofNullable(clazz$JukeboxSong) + .map(it -> ReflectionUtils.getDeclaredField(it, float.class, 0)) + .orElse(null); + + public static final Field field$JukeboxSong$comparatorOutput = Optional.ofNullable(clazz$JukeboxSong) + .map(it -> ReflectionUtils.getDeclaredField(it, int.class, 0)) + .orElse(null); + + public static final Method method$FluidState$getType = requireNonNull( + ReflectionUtils.getMethod( + clazz$FluidState, clazz$Fluid + ) + ); +} diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/util/RegistryUtils.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/util/RegistryUtils.java new file mode 100644 index 000000000..52390c0bf --- /dev/null +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/util/RegistryUtils.java @@ -0,0 +1,23 @@ +package net.momirealms.craftengine.bukkit.util; + +public class RegistryUtils { + + private RegistryUtils() {} + + public static int currentBlockRegistrySize() { + try { + return (int) Reflections.method$IdMapper$size.invoke(Reflections.instance$BLOCK_STATE_REGISTRY); + } catch (ReflectiveOperationException e) { + throw new RuntimeException(e); + } + } + + public static int currentBiomeRegistrySize() { + try { + Object idMap = Reflections.method$Registry$asHolderIdMap.invoke(Reflections.instance$BuiltInRegistries$BIOME); + return (int) Reflections.method$IdMap$size.invoke(idMap); + } catch (ReflectiveOperationException e) { + throw new RuntimeException(e); + } + } +} diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/util/SoundUtils.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/util/SoundUtils.java new file mode 100644 index 000000000..b5fca65a4 --- /dev/null +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/util/SoundUtils.java @@ -0,0 +1,26 @@ +package net.momirealms.craftengine.bukkit.util; + +import net.momirealms.craftengine.core.block.BlockSounds; +import net.momirealms.craftengine.core.util.Key; + +public class SoundUtils { + + private SoundUtils() {} + + public static Object toSoundType(BlockSounds sounds) throws ReflectiveOperationException { + return Reflections.constructor$SoundType.newInstance( + 1f, 1f, + getOrRegisterSoundEvent(sounds.breakSound()), + getOrRegisterSoundEvent(sounds.stepSound()), + getOrRegisterSoundEvent(sounds.placeSound()), + getOrRegisterSoundEvent(sounds.hitSound()), + getOrRegisterSoundEvent(sounds.fallSound()) + ); + } + + public static Object getOrRegisterSoundEvent(Key key) throws ReflectiveOperationException { + return Reflections.method$SoundEvent$createVariableRangeEvent.invoke(null, + Reflections.method$ResourceLocation$fromNamespaceAndPath.invoke(null, key.namespace(), key.value()) + ); + } +} diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/world/BukkitCEWorld.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/world/BukkitCEWorld.java new file mode 100644 index 000000000..6c886d116 --- /dev/null +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/world/BukkitCEWorld.java @@ -0,0 +1,22 @@ +package net.momirealms.craftengine.bukkit.world; + +import net.momirealms.craftengine.bukkit.util.LightUtils; +import net.momirealms.craftengine.core.plugin.config.ConfigManager; +import net.momirealms.craftengine.core.util.SectionPosUtils; +import net.momirealms.craftengine.core.world.CEWorld; +import net.momirealms.craftengine.core.world.World; + +public class BukkitCEWorld extends CEWorld { + + public BukkitCEWorld(World world) { + super(world); + } + + @Override + public void tick() { + if (ConfigManager.enableLightSystem()) { + LightUtils.updateChunkLight((org.bukkit.World) world.getHandle(), SectionPosUtils.toMap(super.updatedSectionPositions, world.worldHeight().getMinSection() - 1, world.worldHeight().getMaxSection() + 1)); + super.updatedSectionPositions.clear(); + } + } +} diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/world/BukkitWorld.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/world/BukkitWorld.java new file mode 100644 index 000000000..f4fee5aca --- /dev/null +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/world/BukkitWorld.java @@ -0,0 +1,87 @@ +package net.momirealms.craftengine.bukkit.world; + +import net.momirealms.craftengine.bukkit.util.EntityUtils; +import net.momirealms.craftengine.bukkit.util.ItemUtils; +import net.momirealms.craftengine.core.item.Item; +import net.momirealms.craftengine.core.util.Key; +import net.momirealms.craftengine.core.util.VersionHelper; +import net.momirealms.craftengine.core.world.Vec3d; +import net.momirealms.craftengine.core.world.World; +import net.momirealms.craftengine.core.world.WorldBlock; +import net.momirealms.craftengine.core.world.WorldHeight; +import org.bukkit.Location; +import org.bukkit.SoundCategory; +import org.bukkit.entity.EntityType; +import org.bukkit.entity.ExperienceOrb; +import org.bukkit.inventory.ItemStack; + +import java.lang.ref.WeakReference; +import java.nio.file.Path; +import java.util.UUID; + +public class BukkitWorld implements World { + private final WeakReference world; + private WorldHeight worldHeight; + + public BukkitWorld(org.bukkit.World world) { + this.world = new WeakReference<>(world); + } + + @Override + public org.bukkit.World getHandle() { + return world.get(); + } + + @Override + public WorldHeight worldHeight() { + if (this.worldHeight == null) { + this.worldHeight = WorldHeight.create(getHandle().getMinHeight(), getHandle().getMaxHeight() - getHandle().getMinHeight()); + } + return this.worldHeight; + } + + @Override + public WorldBlock getBlockAt(int x, int y, int z) { + return new BukkitWorldBlock(getHandle().getBlockAt(x, y, z)); + } + + @Override + public String name() { + return getHandle().getName(); + } + + @Override + public Path directory() { + return getHandle().getWorldFolder().toPath(); + } + + @Override + public UUID uuid() { + return getHandle().getUID(); + } + + @Override + public void dropItemNaturally(Vec3d location, Item item) { + ItemStack itemStack = (ItemStack) item.load(); + if (ItemUtils.isEmpty(itemStack)) return; + if (VersionHelper.isVersionNewerThan1_21_2()) { + getHandle().dropItemNaturally(new Location(null, location.x(), location.y(), location.z()), (ItemStack) item.getItem()); + } else { + getHandle().dropItemNaturally(new Location(null, location.x() - 0.5, location.y() - 0.5, location.z() - 0.5), (ItemStack) item.getItem()); + } + } + + @Override + public void dropExp(Vec3d location, int amount) { + if (amount <= 0) return; + EntityUtils.spawnEntity(getHandle(), new Location(getHandle(), location.x(), location.y(), location.z()), EntityType.EXPERIENCE_ORB, (e) -> { + ExperienceOrb orb = (ExperienceOrb) e; + orb.setExperience(amount); + }); + } + + @Override + public void playBlockSound(Vec3d location, Key sound, float volume, float pitch) { + getHandle().playSound(new Location(null, location.x(), location.y(), location.z()), sound.toString(), SoundCategory.BLOCKS, volume, pitch); + } +} diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/world/BukkitWorldBlock.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/world/BukkitWorldBlock.java new file mode 100644 index 000000000..c7840ffb8 --- /dev/null +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/world/BukkitWorldBlock.java @@ -0,0 +1,67 @@ +package net.momirealms.craftengine.bukkit.world; + +import net.momirealms.craftengine.bukkit.block.BukkitBlockManager; +import net.momirealms.craftengine.bukkit.item.BukkitItemManager; +import net.momirealms.craftengine.bukkit.item.behavior.BlockItemBehavior; +import net.momirealms.craftengine.bukkit.util.BlockStateUtils; +import net.momirealms.craftengine.bukkit.util.LocationUtils; +import net.momirealms.craftengine.bukkit.util.Reflections; +import net.momirealms.craftengine.core.block.ImmutableBlockState; +import net.momirealms.craftengine.core.item.CustomItem; +import net.momirealms.craftengine.core.item.Item; +import net.momirealms.craftengine.core.item.context.BlockPlaceContext; +import net.momirealms.craftengine.core.plugin.CraftEngine; +import net.momirealms.craftengine.core.util.Key; +import net.momirealms.craftengine.core.world.WorldBlock; +import org.bukkit.Location; +import org.bukkit.block.Block; +import org.bukkit.inventory.ItemStack; + +import java.util.Optional; + +public class BukkitWorldBlock implements WorldBlock { + private final Block block; + + public BukkitWorldBlock(Block block) { + this.block = block; + } + + @SuppressWarnings("unchecked") + @Override + public boolean canBeReplaced(BlockPlaceContext context) { + ImmutableBlockState customState = BukkitBlockManager.instance().getImmutableBlockState(BlockStateUtils.blockDataToId(block.getBlockData())); + if (customState != null && !customState.isEmpty()) { + Key clickedBlockId = customState.owner().value().id(); + Item item = (Item) context.getPlayer().getItemInHand(context.getHand()); + Optional> customItem = BukkitItemManager.instance().getCustomItem(item.id()); + if (customItem.isPresent()) { + CustomItem custom = customItem.get(); + if (custom.behaviors() instanceof BlockItemBehavior blockItemBehavior) { + Key blockId = blockItemBehavior.blockId(); + if (blockId.equals(clickedBlockId)) { + return false; + } + } + } + } + return block.isReplaceable(); + } + + @Override + public boolean isWaterSource(BlockPlaceContext blockPlaceContext) { + try { + Location location = block.getLocation(); + Object serverLevel = Reflections.field$CraftWorld$ServerLevel.get(block.getWorld()); + Object fluidData = Reflections.method$Level$getFluidState.invoke(serverLevel, LocationUtils.toBlockPos(location.getBlockX(), location.getBlockY(), location.getBlockZ())); + if (fluidData == null) return false; + return (boolean) Reflections.method$FluidState$isSource.invoke(fluidData); + } catch (ReflectiveOperationException e) { + CraftEngine.instance().logger().warn("Failed to check if water source is available", e); + return false; + } + } + + public Block block() { + return block; + } +} diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/world/BukkitWorldManager.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/world/BukkitWorldManager.java new file mode 100644 index 000000000..96ae9b111 --- /dev/null +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/world/BukkitWorldManager.java @@ -0,0 +1,289 @@ +package net.momirealms.craftengine.bukkit.world; + +import net.momirealms.craftengine.bukkit.plugin.BukkitCraftEngine; +import net.momirealms.craftengine.bukkit.plugin.injector.BukkitInjector; +import net.momirealms.craftengine.bukkit.util.Reflections; +import net.momirealms.craftengine.core.block.ImmutableBlockState; +import net.momirealms.craftengine.core.plugin.config.ConfigManager; +import net.momirealms.craftengine.core.plugin.scheduler.SchedulerTask; +import net.momirealms.craftengine.core.world.CEWorld; +import net.momirealms.craftengine.core.world.ChunkPos; +import net.momirealms.craftengine.core.world.SectionPos; +import net.momirealms.craftengine.core.world.WorldManager; +import net.momirealms.craftengine.core.world.chunk.CEChunk; +import net.momirealms.craftengine.core.world.chunk.CESection; +import net.momirealms.craftengine.core.world.chunk.serialization.ChunkSerializer; +import net.momirealms.sparrow.nbt.CompoundTag; +import org.bukkit.Bukkit; +import org.bukkit.Chunk; +import org.bukkit.World; +import org.bukkit.event.EventHandler; +import org.bukkit.event.EventPriority; +import org.bukkit.event.HandlerList; +import org.bukkit.event.Listener; +import org.bukkit.event.world.ChunkLoadEvent; +import org.bukkit.event.world.ChunkUnloadEvent; +import org.bukkit.event.world.WorldLoadEvent; +import org.bukkit.event.world.WorldUnloadEvent; + +import java.io.IOException; +import java.util.HashMap; +import java.util.Map; +import java.util.UUID; +import java.util.concurrent.locks.ReentrantReadWriteLock; + +public class BukkitWorldManager implements WorldManager, Listener { + private static BukkitWorldManager instance; + private final BukkitCraftEngine plugin; + private final Map worlds; + private CEWorld[] worldArray; + private final ReentrantReadWriteLock worldMapLock = new ReentrantReadWriteLock(); + private SchedulerTask tickTask; + // cache + private UUID lastVisitedUUID; + private CEWorld lastVisitedWorld; + + public BukkitWorldManager(BukkitCraftEngine plugin) { + instance = this; + this.plugin = plugin; + this.worlds = new HashMap<>(); + resetWorldArray(); + } + + public static BukkitWorldManager instance() { + return instance; + } + + public CEWorld getWorld(World world) { + return getWorld(world.getUID()); + } + + @Override + public CEWorld getWorld(UUID uuid) { + if (uuid.equals(this.lastVisitedUUID)) { + return this.lastVisitedWorld; + } + this.worldMapLock.readLock().lock(); + try { + CEWorld world = worlds.get(uuid); + if (world != null) { + this.lastVisitedUUID = uuid; + this.lastVisitedWorld = world; + } + return world; + } finally { + this.worldMapLock.readLock().unlock(); + } + } + + private void resetWorldArray() { + this.worldArray = this.worlds.values().toArray(new CEWorld[0]); + } + + public void delayedInit() { + // events and tasks + Bukkit.getPluginManager().registerEvents(this, plugin.bootstrap()); + this.tickTask = plugin.scheduler().sync().runRepeating(() -> { + for (CEWorld world : worldArray) { + world.tick(); + } + }, 1, 1); + + // load loaded chunks + this.worldMapLock.writeLock().lock(); + try { + for (World world : Bukkit.getWorlds()) { + CEWorld ceWorld = new BukkitCEWorld(new BukkitWorld(world)); + this.worlds.put(world.getUID(), ceWorld); + this.resetWorldArray(); + for (Chunk chunk : world.getLoadedChunks()) { + handleChunkLoad(ceWorld, chunk); + } + } + } finally { + this.worldMapLock.writeLock().unlock(); + } + } + + @Override + public void disable() { + HandlerList.unregisterAll(this); + if (tickTask != null && !tickTask.cancelled()) { + tickTask.cancel(); + } + + for (World world : Bukkit.getWorlds()) { + CEWorld ceWorld = getWorld(world.getUID()); + for (Chunk chunk : world.getLoadedChunks()) { + handleChunkUnload(ceWorld, chunk); + } + } + this.worlds.clear(); + } + + @EventHandler(ignoreCancelled = true, priority = EventPriority.LOWEST) + public void onWorldLoad(WorldLoadEvent event) { + World world = event.getWorld(); + CEWorld ceWorld = new BukkitCEWorld(new BukkitWorld(world)); + this.worldMapLock.writeLock().lock(); + try { + if (this.worlds.containsKey(world.getUID())) return; + this.worlds.put(event.getWorld().getUID(), ceWorld); + this.resetWorldArray(); + for (Chunk chunk : world.getLoadedChunks()) { + handleChunkLoad(ceWorld, chunk); + } + } finally { + this.worldMapLock.writeLock().unlock(); + } + } + + @EventHandler(ignoreCancelled = true, priority = EventPriority.HIGHEST) + public void onWorldUnload(WorldUnloadEvent event) { + World world = event.getWorld(); + CEWorld ceWorld; + this.worldMapLock.writeLock().lock(); + try { + ceWorld = this.worlds.remove(world.getUID()); + if (ceWorld == null) { + return; + } + if (ceWorld == this.lastVisitedWorld) { + this.lastVisitedWorld = null; + this.lastVisitedUUID = null; + } + this.resetWorldArray(); + } finally { + this.worldMapLock.writeLock().unlock(); + } + for (Chunk chunk : world.getLoadedChunks()) { + handleChunkUnload(ceWorld, chunk); + } + } + + @EventHandler(ignoreCancelled = true, priority = EventPriority.LOWEST) + public void onChunkLoad(ChunkLoadEvent event) { + this.worldMapLock.readLock().lock(); + CEWorld world; + try { + world = worlds.get(event.getWorld().getUID()); + if (world == null) { + return; + } + } finally { + this.worldMapLock.readLock().unlock(); + } + handleChunkLoad(world, event.getChunk()); + } + + @EventHandler(ignoreCancelled = true, priority = EventPriority.HIGHEST) + public void onChunkUnload(ChunkUnloadEvent event) { + CEWorld world; + this.worldMapLock.readLock().lock(); + try { + world = worlds.get(event.getWorld().getUID()); + if (world == null) { + return; + } + } finally { + this.worldMapLock.readLock().unlock(); + } + handleChunkUnload(world, event.getChunk()); + } + + private void handleChunkUnload(CEWorld world, Chunk chunk) { + ChunkPos pos = new ChunkPos(chunk.getX(), chunk.getZ()); + CEChunk ceChunk = world.getChunkAtIfLoaded(chunk.getX(), chunk.getZ()); + if (ceChunk != null) { + try { + world.worldDataStorage().writeChunkTagAt(pos, ChunkSerializer.serialize(ceChunk)); + } catch (IOException e) { + plugin.logger().warn("Failed to write chunk tag at " + chunk.getX() + " " + chunk.getZ(), e); + return; + } finally { + if (ConfigManager.restoreVanillaBlocks()) { + try { + CESection[] ceSections = ceChunk.sections(); + Object worldServer = Reflections.field$CraftChunk$worldServer.get(chunk); + Object chunkSource = Reflections.field$ServerLevel$chunkSource.get(worldServer); + Object levelChunk = Reflections.method$ServerChunkCache$getChunkAtIfLoadedMainThread.invoke(chunkSource, chunk.getX(), chunk.getZ()); + Object[] sections = (Object[]) Reflections.field$ChunkAccess$sections.get(levelChunk); + for (int i = 0; i < ceSections.length; i++) { + CESection ceSection = ceSections[i]; + Object section = sections[i]; + BukkitInjector.uninjectLevelChunkSection(section); + if (ceSection.statesContainer().isEmpty()) continue; + for (int x = 0; x < 16; x++) { + for (int z = 0; z < 16; z++) { + for (int y = 0; y < 16; y++) { + ImmutableBlockState customState = ceSection.getBlockState(x, y, z); + if (customState != null && customState.vanillaBlockState() != null) { + Reflections.method$LevelChunkSection$setBlockState.invoke(section, x, y, z, customState.vanillaBlockState().handle(), false); + } + } + } + } + } + } catch (ReflectiveOperationException e) { + plugin.logger().warn("Failed to restore chunk at " + chunk.getX() + " " + chunk.getZ(), e); + } + } + } + ceChunk.unload(); + } + } + + private void handleChunkLoad(CEWorld ceWorld, Chunk chunk) { + ChunkPos pos = new ChunkPos(chunk.getX(), chunk.getZ()); + if (ceWorld.isChunkLoaded(pos.longKey)) return; + CEChunk ceChunk; + try { + CompoundTag chunkNbt = ceWorld.worldDataStorage().readChunkTagAt(pos); + if (chunkNbt != null) { + ceChunk = ChunkSerializer.deserialize(ceWorld, pos, chunkNbt); + } else { + ceChunk = new CEChunk(ceWorld, pos); + } + try { + CESection[] ceSections = ceChunk.sections(); + Object worldServer = Reflections.field$CraftChunk$worldServer.get(chunk); + Object chunkSource = Reflections.field$ServerLevel$chunkSource.get(worldServer); + Object levelChunk = Reflections.method$ServerChunkCache$getChunkAtIfLoadedMainThread.invoke(chunkSource, chunk.getX(), chunk.getZ()); + Object[] sections = (Object[]) Reflections.field$ChunkAccess$sections.get(levelChunk); + for (int i = 0; i < ceSections.length; i++) { + CESection ceSection = ceSections[i]; + Object section = sections[i]; + if (ConfigManager.restoreCustomBlocks()) { + if (!ceSection.statesContainer().isEmpty()) { + for (int x = 0; x < 16; x++) { + for (int z = 0; z < 16; z++) { + for (int y = 0; y < 16; y++) { + ImmutableBlockState customState = ceSection.getBlockState(x, y, z); + if (customState != null && customState.customBlockState() != null) { + Reflections.method$LevelChunkSection$setBlockState.invoke(section, x, y, z, customState.customBlockState().handle(), false); + } + } + } + } + } + } + BukkitInjector.injectLevelChunkSection(section, ceSection, ceWorld, new SectionPos(pos.x, ceChunk.sectionY(i), pos.z)); + } + if (ConfigManager.enableRecipeSystem()) { + @SuppressWarnings("unchecked") + Map blockEntities = (Map) Reflections.field$ChunkAccess$blockEntities.get(levelChunk); + for (Object blockEntity : blockEntities.values()) { + BukkitInjector.injectCookingBlockEntity(blockEntity); + } + } + } catch (ReflectiveOperationException e) { + this.plugin.logger().warn("Failed to restore chunk at " + chunk.getX() + " " + chunk.getZ(), e); + return; + } + } catch (IOException e) { + this.plugin.logger().warn("Failed to read chunk tag at " + chunk.getX() + " " + chunk.getZ(), e); + return; + } + ceChunk.load(); + } +} diff --git a/core/build.gradle.kts b/core/build.gradle.kts new file mode 100644 index 000000000..04d5bd3dc --- /dev/null +++ b/core/build.gradle.kts @@ -0,0 +1,112 @@ +plugins { + id("com.gradleup.shadow") version "9.0.0-beta6" + id("maven-publish") +} + +repositories { + maven("https://jitpack.io/") + maven("https://libraries.minecraft.net/") + maven("https://repo.momirealms.net/releases/") +} + +dependencies { + implementation(project(":shared")) + // JOML + compileOnly("org.joml:joml:1.10.8") + // YAML + compileOnly(files("${rootProject.rootDir}/libs/boosted-yaml-${rootProject.properties["boosted_yaml_version"]}.jar")) + compileOnly("org.yaml:snakeyaml:${rootProject.properties["snake_yaml_version"]}") + // NBT + implementation("net.momirealms:sparrow-nbt:${rootProject.properties["sparrow_nbt_version"]}") + compileOnly("net.momirealms:sparrow-util:${rootProject.properties["sparrow_util_version"]}") + // Adventure + implementation("net.kyori:adventure-api:${rootProject.properties["adventure_bundle_version"]}") + compileOnly("net.kyori:adventure-text-minimessage:${rootProject.properties["adventure_bundle_version"]}") + compileOnly("net.kyori:adventure-text-serializer-gson:${rootProject.properties["adventure_bundle_version"]}") { + exclude("com.google.code.gson", "gson") + } + // Command + compileOnly("org.incendo:cloud-core:${rootProject.properties["cloud_core_version"]}") + compileOnly("org.incendo:cloud-minecraft-extras:${rootProject.properties["cloud_minecraft_extras_version"]}") + // FastUtil + compileOnly("it.unimi.dsi:fastutil:${rootProject.properties["fastutil_version"]}") + // Gson + compileOnly("com.google.code.gson:gson:${rootProject.properties["gson_version"]}") + // Guava + compileOnly("com.google.guava:guava:${rootProject.properties["guava_version"]}") + // Logger + compileOnly("org.slf4j:slf4j-api:${rootProject.properties["slf4j_version"]}") + compileOnly("org.apache.logging.log4j:log4j-core:${rootProject.properties["log4j_version"]}") + // Netty + compileOnly("io.netty:netty-all:${rootProject.properties["netty_version"]}") + // Cache + compileOnly("com.github.ben-manes.caffeine:caffeine:${rootProject.properties["caffeine_version"]}") + // Compression + compileOnly("com.github.luben:zstd-jni:${rootProject.properties["zstd_version"]}") + compileOnly("org.lz4:lz4-java:${rootProject.properties["lz4_version"]}") + // Commons IO + compileOnly("commons-io:commons-io:${rootProject.properties["commons_io_version"]}") + compileOnly("commons-io:commons-io:${rootProject.properties["commons_io_version"]}") + // Data Fixer Upper + compileOnly("com.mojang:datafixerupper:${rootProject.properties["datafixerupper_version"]}") +} + +java { + sourceCompatibility = JavaVersion.VERSION_21 + targetCompatibility = JavaVersion.VERSION_21 + toolchain { + languageVersion = JavaLanguageVersion.of(21) + } + withSourcesJar() +} + +tasks.withType { + options.encoding = "UTF-8" + options.release.set(21) + dependsOn(tasks.clean) +} + +tasks { + shadowJar { + archiveClassifier = "" + archiveFileName = "craft-engine-core-${rootProject.properties["project_version"]}.jar" + relocate("net.kyori", "net.momirealms.craftengine.libraries") + relocate("dev.dejvokep", "net.momirealms.craftengine.libraries") + relocate("com.saicone.rtag", "net.momirealms.craftengine.libraries.rtag") + relocate("org.yaml.snakeyaml", "net.momirealms.craftengine.libraries.snakeyaml") + relocate("net.kyori", "net.momirealms.craftengine.libraries") + relocate("net.momirealms.sparrow.nbt", "net.momirealms.craftengine.libraries.nbt") + } +} + +publishing { + repositories { + maven { + url = uri("https://repo.momirealms.net/releases") + credentials(PasswordCredentials::class) { + username = System.getenv("REPO_USERNAME") + password = System.getenv("REPO_PASSWORD") + } + } + } + publications { + create("mavenJava") { + groupId = "net.momirealms" + artifactId = "craft-engine-core" + version = rootProject.properties["project_version"].toString() + artifact(tasks["sourcesJar"]) + from(components["shadow"]) + pom { + name = "CraftEngine API" + url = "https://github.com/Xiao-MoMi/craft-engine" + licenses { + license { + name = "GNU General Public License v3.0" + url = "https://www.gnu.org/licenses/gpl-3.0.html" + distribution = "repo" + } + } + } + } + } +} \ No newline at end of file diff --git a/core/src/main/java/net/momirealms/craftengine/core/block/AbstractBlockManager.java b/core/src/main/java/net/momirealms/craftengine/core/block/AbstractBlockManager.java new file mode 100644 index 000000000..357f8f6a2 --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/block/AbstractBlockManager.java @@ -0,0 +1,11 @@ +package net.momirealms.craftengine.core.block; + +import net.momirealms.craftengine.core.pack.model.generator.AbstractModelGenerator; +import net.momirealms.craftengine.core.plugin.CraftEngine; + +public abstract class AbstractBlockManager extends AbstractModelGenerator implements BlockManager { + + public AbstractBlockManager(CraftEngine plugin) { + super(plugin); + } +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/block/BlockKeys.java b/core/src/main/java/net/momirealms/craftengine/core/block/BlockKeys.java new file mode 100644 index 000000000..2b1c2959c --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/block/BlockKeys.java @@ -0,0 +1,215 @@ +package net.momirealms.craftengine.core.block; + +import net.momirealms.craftengine.core.util.Key; + +public class BlockKeys { + public static final Key NOTE_BLOCK = Key.of("minecraft:note_block"); + public static final Key CRAFTING_TABLE = Key.of("minecraft:crafting_table"); + public static final Key STONECUTTER = Key.of("minecraft:stonecutter"); + public static final Key BELL = Key.of("minecraft:bell"); + public static final Key SMITHING_TABLE = Key.of("minecraft:smithing_table"); + public static final Key LOOM = Key.of("minecraft:loom"); + public static final Key BARREL = Key.of("minecraft:barrel"); + public static final Key SMOKER = Key.of("minecraft:smoker"); + public static final Key BLAST_FURNACE = Key.of("minecraft:blast_furnace"); + public static final Key FURNACE = Key.of("minecraft:furnace"); + public static final Key LEVER = Key.of("minecraft:lever"); + public static final Key ANVIL = Key.of("minecraft:anvil"); + public static final Key CHIPPED_ANVIL = Key.of("minecraft:chipped_anvil"); + public static final Key DAMAGED_ANVIL = Key.of("minecraft:damaged_anvil"); + public static final Key GRINDSTONE = Key.of("minecraft:grindstone"); + public static final Key ENCHANTING_TABLE = Key.of("minecraft:enchanting_table"); + public static final Key BREWING_STAND = Key.of("minecraft:brewing_stand"); + public static final Key BEACON = Key.of("minecraft:beacon"); + public static final Key CHEST = Key.of("minecraft:chest"); + public static final Key CAMPFIRE = Key.of("minecraft:campfire"); + public static final Key SOUL_CAMPFIRE = Key.of("minecraft:soul_campfire"); + public static final Key ENDER_CHEST = Key.of("minecraft:ender_chest"); + public static final Key TRAPPED_CHEST = Key.of("minecraft:trapped_chest"); + public static final Key DAYLIGHT_DETECTOR = Key.of("minecraft:daylight_detector"); + public static final Key LECTERN = Key.of("minecraft:lectern"); + public static final Key REPEATER = Key.of("minecraft:repeater"); + public static final Key COMPARATOR = Key.of("minecraft:comparator"); + public static final Key DRAGON_EGG = Key.of("minecraft:dragon_egg"); + public static final Key HOPPER = Key.of("minecraft:hopper"); + public static final Key DISPENSER = Key.of("minecraft:dispenser"); + public static final Key DROPPER = Key.of("minecraft:dropper"); + public static final Key CRAFTER = Key.of("minecraft:crafter"); + public static final Key COMMAND_BLOCK = Key.of("minecraft:command_block"); + public static final Key CHAIN_COMMAND_BLOCK = Key.of("minecraft:chain_command_block"); + public static final Key REPEATING_COMMAND_BLOCK = Key.of("minecraft:repeating_command_block"); + + public static final Key CAKE = Key.of("minecraft:cake"); + public static final Key CANDLE_CAKE = Key.of("minecraft:candle_cake"); + public static final Key WHITE_CANDLE_CAKE = Key.of("minecraft:white_candle_cake"); + public static final Key ORANGE_CANDLE_CAKE = Key.of("minecraft:orange_candle_cake"); + public static final Key MAGENTA_CANDLE_CAKE = Key.of("minecraft:magenta_candle_cake"); + public static final Key LIGHT_BLUE_CANDLE_CAKE = Key.of("minecraft:light_blue_candle_cake"); + public static final Key YELLOW_CANDLE_CAKE = Key.of("minecraft:yellow_candle_cake"); + public static final Key LIME_CANDLE_CAKE = Key.of("minecraft:lime_candle_cake"); + public static final Key PINK_CANDLE_CAKE = Key.of("minecraft:pink_candle_cake"); + public static final Key GRAY_CANDLE_CAKE = Key.of("minecraft:gray_candle_cake"); + public static final Key LIGHT_GRAY_CANDLE_CAKE = Key.of("minecraft:light_gray_candle_cake"); + public static final Key CYAN_CANDLE_CAKE = Key.of("minecraft:cyan_candle_cake"); + public static final Key PURPLE_CANDLE_CAKE = Key.of("minecraft:purple_candle_cake"); + public static final Key BLUE_CANDLE_CAKE = Key.of("minecraft:blue_candle_cake"); + public static final Key BROWN_CANDLE_CAKE = Key.of("minecraft:brown_candle_cake"); + public static final Key GREEN_CANDLE_CAKE = Key.of("minecraft:green_candle_cake"); + public static final Key RED_CANDLE_CAKE = Key.of("minecraft:red_candle_cake"); + public static final Key BLACK_CANDLE_CAKE = Key.of("minecraft:black_candle_cake"); + + public static final Key WHITE_BED = Key.of("minecraft:white_bed"); + public static final Key ORANGE_BED = Key.of("minecraft:orange_bed"); + public static final Key MAGENTA_BED = Key.of("minecraft:magenta_bed"); + public static final Key LIGHT_BLUE_BED = Key.of("minecraft:light_blue_bed"); + public static final Key YELLOW_BED = Key.of("minecraft:yellow_bed"); + public static final Key LIME_BED = Key.of("minecraft:lime_bed"); + public static final Key PINK_BED = Key.of("minecraft:pink_bed"); + public static final Key GRAY_BED = Key.of("minecraft:gray_bed"); + public static final Key LIGHT_GRAY_BED = Key.of("minecraft:light_gray_bed"); + public static final Key CYAN_BED = Key.of("minecraft:cyan_bed"); + public static final Key PURPLE_BED = Key.of("minecraft:purple_bed"); + public static final Key BLUE_BED = Key.of("minecraft:blue_bed"); + public static final Key BROWN_BED = Key.of("minecraft:brown_bed"); + public static final Key GREEN_BED = Key.of("minecraft:green_bed"); + public static final Key RED_BED = Key.of("minecraft:red_bed"); + public static final Key BLACK_BED = Key.of("minecraft:black_bed"); + + public static final Key SHULKER_BOX = Key.of("minecraft:shulker_box"); + public static final Key WHITE_SHULKER_BOX = Key.of("minecraft:white_shulker_box"); + public static final Key ORANGE_SHULKER_BOX = Key.of("minecraft:orange_shulker_box"); + public static final Key MAGENTA_SHULKER_BOX = Key.of("minecraft:magenta_shulker_box"); + public static final Key LIGHT_BLUE_SHULKER_BOX = Key.of("minecraft:light_blue_shulker_box"); + public static final Key YELLOW_SHULKER_BOX = Key.of("minecraft:yellow_shulker_box"); + public static final Key LIME_SHULKER_BOX = Key.of("minecraft:lime_shulker_box"); + public static final Key PINK_SHULKER_BOX = Key.of("minecraft:pink_shulker_box"); + public static final Key GRAY_SHULKER_BOX = Key.of("minecraft:gray_shulker_box"); + public static final Key LIGHT_GRAY_SHULKER_BOX = Key.of("minecraft:light_gray_shulker_box"); + public static final Key CYAN_SHULKER_BOX = Key.of("minecraft:cyan_shulker_box"); + public static final Key PURPLE_SHULKER_BOX = Key.of("minecraft:purple_shulker_box"); + public static final Key BLUE_SHULKER_BOX = Key.of("minecraft:blue_shulker_box"); + public static final Key BROWN_SHULKER_BOX = Key.of("minecraft:brown_shulker_box"); + public static final Key GREEN_SHULKER_BOX = Key.of("minecraft:green_shulker_box"); + public static final Key RED_SHULKER_BOX = Key.of("minecraft:red_shulker_box"); + public static final Key BLACK_SHULKER_BOX = Key.of("minecraft:black_shulker_box"); + + public static final Key OAK_BUTTON = Key.of("minecraft:oak_button"); + public static final Key SPRUCE_BUTTON = Key.of("minecraft:spruce_button"); + public static final Key BIRCH_BUTTON = Key.of("minecraft:birch_button"); + public static final Key JUNGLE_BUTTON = Key.of("minecraft:jungle_button"); + public static final Key ACACIA_BUTTON = Key.of("minecraft:acacia_button"); + public static final Key CHERRY_BUTTON = Key.of("minecraft:cherry_button"); + public static final Key DARK_OAK_BUTTON = Key.of("minecraft:dark_oak_button"); + public static final Key PALE_OAK_BUTTON = Key.of("minecraft:pale_oak_button"); + public static final Key MANGROVE_BUTTON = Key.of("minecraft:mangrove_button"); + public static final Key BAMBOO_BUTTON = Key.of("minecraft:bamboo_button"); + + public static final Key OAK_TRAPDOOR = Key.of("minecraft:oak_trapdoor"); + public static final Key SPRUCE_TRAPDOOR = Key.of("minecraft:spruce_trapdoor"); + public static final Key BIRCH_TRAPDOOR = Key.of("minecraft:birch_trapdoor"); + public static final Key JUNGLE_TRAPDOOR = Key.of("minecraft:jungle_trapdoor"); + public static final Key ACACIA_TRAPDOOR = Key.of("minecraft:acacia_trapdoor"); + public static final Key CHERRY_TRAPDOOR = Key.of("minecraft:cherry_trapdoor"); + public static final Key DARK_OAK_TRAPDOOR = Key.of("minecraft:dark_oak_trapdoor"); + public static final Key PALE_OAK_TRAPDOOR = Key.of("minecraft:pale_oak_trapdoor"); + public static final Key MANGROVE_TRAPDOOR = Key.of("minecraft:mangrove_trapdoor"); + public static final Key BAMBOO_TRAPDOOR = Key.of("minecraft:bamboo_trapdoor"); + public static final Key CRIMSON_TRAPDOOR = Key.of("minecraft:crimson_trapdoor"); + public static final Key WARPED_TRAPDOOR = Key.of("minecraft:warped_trapdoor"); + + public static final Key OAK_DOOR = Key.of("minecraft:oak_door"); + public static final Key SPRUCE_DOOR = Key.of("minecraft:spruce_door"); + public static final Key BIRCH_DOOR = Key.of("minecraft:birch_door"); + public static final Key JUNGLE_DOOR = Key.of("minecraft:jungle_door"); + public static final Key ACACIA_DOOR = Key.of("minecraft:acacia_door"); + public static final Key CHERRY_DOOR = Key.of("minecraft:cherry_door"); + public static final Key DARK_OAK_DOOR = Key.of("minecraft:dark_oak_door"); + public static final Key PALE_OAK_DOOR = Key.of("minecraft:pale_oak_door"); + public static final Key MANGROVE_DOOR = Key.of("minecraft:mangrove_door"); + public static final Key BAMBOO_DOOR = Key.of("minecraft:bamboo_door"); + public static final Key CRIMSON_DOOR = Key.of("minecraft:crimson_door"); + public static final Key WARPED_DOOR = Key.of("minecraft:warped_door"); + + public static final Key COPPER_DOOR = Key.of("minecraft:copper_door"); + public static final Key EXPOSED_COPPER_DOOR = Key.of("minecraft:exposed_copper_door"); + public static final Key OXIDIZED_COPPER_DOOR = Key.of("minecraft:oxidized_copper_door"); + public static final Key WEATHERED_COPPER_DOOR = Key.of("minecraft:weathered_copper_door"); + public static final Key WAXED_COPPER_DOOR = Key.of("minecraft:waxed_copper_door"); + public static final Key WAXED_EXPOSED_COPPER_DOOR = Key.of("minecraft:waxed_exposed_copper_door"); + public static final Key WAXED_OXIDIZED_COPPER_DOOR = Key.of("minecraft:waxed_oxidized_copper_door"); + public static final Key WAXED_WEATHERED_COPPER_DOOR = Key.of("minecraft:waxed_weathered_copper_door"); + + public static final Key COPPER_TRAPDOOR = Key.of("minecraft:copper_trapdoor"); + public static final Key EXPOSED_COPPER_TRAPDOOR = Key.of("minecraft:exposed_copper_trapdoor"); + public static final Key OXIDIZED_COPPER_TRAPDOOR = Key.of("minecraft:oxidized_copper_trapdoor"); + public static final Key WEATHERED_COPPER_TRAPDOOR = Key.of("minecraft:weathered_copper_trapdoor"); + public static final Key WAXED_COPPER_TRAPDOOR = Key.of("minecraft:waxed_copper_trapdoor"); + public static final Key WAXED_EXPOSED_COPPER_TRAPDOOR = Key.of("minecraft:waxed_exposed_copper_trapdoor"); + public static final Key WAXED_OXIDIZED_COPPER_TRAPDOOR = Key.of("minecraft:waxed_oxidized_copper_trapdoor"); + public static final Key WAXED_WEATHERED_COPPER_TRAPDOOR = Key.of("minecraft:waxed_weathered_copper_trapdoor"); + + public static final Key OAK_FENCE_GATE = Key.of("minecraft:oak_fence_gate"); + public static final Key SPRUCE_FENCE_GATE = Key.of("minecraft:spruce_fence_gate"); + public static final Key BIRCH_FENCE_GATE = Key.of("minecraft:birch_fence_gate"); + public static final Key JUNGLE_FENCE_GATE = Key.of("minecraft:jungle_fence_gate"); + public static final Key ACACIA_FENCE_GATE = Key.of("minecraft:acacia_fence_gate"); + public static final Key CHERRY_FENCE_GATE = Key.of("minecraft:cherry_fence_gate"); + public static final Key DARK_OAK_FENCE_GATE = Key.of("minecraft:dark_oak_fence_gate"); + public static final Key PALE_OAK_FENCE_GATE = Key.of("minecraft:pale_oak_fence_gate"); + public static final Key MANGROVE_FENCE_GATE = Key.of("minecraft:mangrove_fence_gate"); + public static final Key BAMBOO_FENCE_GATE = Key.of("minecraft:bamboo_fence_gate"); + public static final Key CRIMSON_FENCE_GATE = Key.of("minecraft:crimson_fence_gate"); + public static final Key WARPED_FENCE_GATE = Key.of("minecraft:warped_fence_gate"); + + public static final Key OAK_SIGN = Key.of("minecraft:oak_sign"); + public static final Key SPRUCE_SIGN = Key.of("minecraft:spruce_sign"); + public static final Key ACACIA_SIGN = Key.of("minecraft:acacia_sign"); + public static final Key BIRCH_SIGN = Key.of("minecraft:birch_sign"); + public static final Key CHERRY_SIGN = Key.of("minecraft:cherry_sign"); + public static final Key JUNGLE_SIGN = Key.of("minecraft:jungle_sign"); + public static final Key DARK_OAK_SIGN = Key.of("minecraft:dark_oak_sign"); + public static final Key PALE_OAK_SIGN = Key.of("minecraft:pale_oak_sign"); + public static final Key MANGROVE_SIGN = Key.of("minecraft:mangrove_sign"); + public static final Key BAMBOO_SIGN = Key.of("minecraft:bamboo_sign"); + public static final Key WARPED_SIGN = Key.of("minecraft:warped_sign"); + public static final Key CRIMSON_SIGN = Key.of("minecraft:crimson_sign"); + + public static final Key OAK_WALL_SIGN = Key.of("minecraft:oak_wall_sign"); + public static final Key SPRUCE_WALL_SIGN = Key.of("minecraft:spruce_wall_sign"); + public static final Key BIRCH_WALL_SIGN = Key.of("minecraft:birch_wall_sign"); + public static final Key ACACIA_WALL_SIGN = Key.of("minecraft:acacia_wall_sign"); + public static final Key CHERRY_WALL_SIGN = Key.of("minecraft:cherry_wall_sign"); + public static final Key JUNGLE_WALL_SIGN = Key.of("minecraft:jungle_wall_sign"); + public static final Key DARK_OAK_WALL_SIGN = Key.of("minecraft:dark_oak_wall_sign"); + public static final Key PALE_OAK_WALL_SIGN = Key.of("minecraft:pale_oak_wall_sign"); + public static final Key MANGROVE_WALL_SIGN = Key.of("minecraft:mangrove_wall_sign"); + public static final Key BAMBOO_WALL_SIGN = Key.of("minecraft:bamboo_wall_sign"); + public static final Key CRIMSON_WALL_SIGN = Key.of("minecraft:crimson_wall_sign"); + public static final Key WARPED_WALL_SIGN = Key.of("minecraft:warped_wall_sign"); + + public static final Key OAK_HANGING_SIGN = Key.of("minecraft:oak_hanging_sign"); + public static final Key SPRUCE_HANGING_SIGN = Key.of("minecraft:spruce_hanging_sign"); + public static final Key BIRCH_HANGING_SIGN = Key.of("minecraft:birch_hanging_sign"); + public static final Key ACACIA_HANGING_SIGN = Key.of("minecraft:acacia_hanging_sign"); + public static final Key CHERRY_HANGING_SIGN = Key.of("minecraft:cherry_hanging_sign"); + public static final Key JUNGLE_HANGING_SIGN = Key.of("minecraft:jungle_hanging_sign"); + public static final Key DARK_OAK_HANGING_SIGN = Key.of("minecraft:dark_oak_hanging_sign"); + public static final Key PALE_OAK_HANGING_SIGN = Key.of("minecraft:pale_oak_hanging_sign"); + public static final Key CRIMSON_HANGING_SIGN = Key.of("minecraft:crimson_hanging_sign"); + public static final Key WARPED_HANGING_SIGN = Key.of("minecraft:warped_hanging_sign"); + public static final Key MANGROVE_HANGING_SIGN = Key.of("minecraft:mangrove_hanging_sign"); + public static final Key BAMBOO_HANGING_SIGN = Key.of("minecraft:bamboo_hanging_sign"); + + public static final Key OAK_WALL_HANGING_SIGN = Key.of("minecraft:oak_wall_hanging_sign"); + public static final Key SPRUCE_WALL_HANGING_SIGN = Key.of("minecraft:spruce_wall_hanging_sign"); + public static final Key BIRCH_WALL_HANGING_SIGN = Key.of("minecraft:birch_wall_hanging_sign"); + public static final Key ACACIA_WALL_HANGING_SIGN = Key.of("minecraft:acacia_wall_hanging_sign"); + public static final Key CHERRY_WALL_HANGING_SIGN = Key.of("minecraft:cherry_wall_hanging_sign"); + public static final Key JUNGLE_WALL_HANGING_SIGN = Key.of("minecraft:jungle_wall_hanging_sign"); + public static final Key DARK_OAK_WALL_HANGING_SIGN = Key.of("minecraft:dark_oak_wall_hanging_sign"); + public static final Key PALE_OAK_WALL_HANGING_SIGN = Key.of("minecraft:pale_oak_wall_hanging_sign"); + public static final Key MANGROVE_WALL_HANGING_SIGN = Key.of("minecraft:mangrove_wall_hanging_sign"); + public static final Key CRIMSON_WALL_HANGING_SIGN = Key.of("minecraft:crimson_wall_hanging_sign"); + public static final Key WARPED_WALL_HANGING_SIGN = Key.of("minecraft:warped_wall_hanging_sign"); + public static final Key BAMBOO_WALL_HANGING_SIGN = Key.of("minecraft:bamboo_wall_hanging_sign"); +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/block/BlockManager.java b/core/src/main/java/net/momirealms/craftengine/core/block/BlockManager.java new file mode 100644 index 000000000..ec3323410 --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/block/BlockManager.java @@ -0,0 +1,44 @@ +package net.momirealms.craftengine.core.block; + +import com.google.gson.JsonElement; +import net.momirealms.craftengine.core.pack.LoadingSequence; +import net.momirealms.craftengine.core.pack.model.generator.ModelGeneration; +import net.momirealms.craftengine.core.pack.model.generator.ModelGenerator; +import net.momirealms.craftengine.core.plugin.Reloadable; +import net.momirealms.craftengine.core.plugin.config.ConfigSectionParser; +import net.momirealms.craftengine.core.util.Key; +import org.incendo.cloud.suggestion.Suggestion; + +import java.util.Collection; +import java.util.Map; +import java.util.Optional; + +public interface BlockManager extends Reloadable, ModelGenerator, ConfigSectionParser { + String CONFIG_SECTION_NAME = "blocks"; + + default String sectionId() { + return CONFIG_SECTION_NAME; + } + + Collection modelsToGenerate(); + + Map> blockOverrides(); + + Map blocks(); + + Optional getBlock(Key key); + + Collection cachedSuggestions(); + + Map soundMapper(); + + void initSuggestions(); + + void delayedLoad(); + + void delayedInit(); + + default int loadingSequence() { + return LoadingSequence.BLOCK; + } +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/block/BlockNbtParser.java b/core/src/main/java/net/momirealms/craftengine/core/block/BlockNbtParser.java new file mode 100644 index 000000000..aada90b73 --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/block/BlockNbtParser.java @@ -0,0 +1,41 @@ +package net.momirealms.craftengine.core.block; + +import net.momirealms.craftengine.core.block.properties.Property; +import net.momirealms.craftengine.core.util.StringReader; +import net.momirealms.sparrow.nbt.CompoundTag; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +public class BlockNbtParser { + + private BlockNbtParser() {} + + @Nullable + public static CompoundTag deserialize(@NotNull CustomBlock block, @NotNull String data) { + StringReader reader = new StringReader(data); + CompoundTag properties = new CompoundTag(); + while (reader.canRead()) { + String propertyName = reader.readUnquotedString(); + if (propertyName.isEmpty() || !reader.canRead() || reader.peek() != '=') { + return null; + } + reader.skip(); + String propertyValue = reader.readUnquotedString(); + if (propertyValue.isEmpty()) { + return null; + } + Property property = block.getProperty(propertyName); + if (property != null) { + property.createOptionalTag(propertyValue).ifPresent(tag -> { + properties.put(propertyName, tag); + }); + } + if (reader.canRead() && reader.peek() == ',') { + reader.skip(); + } else { + break; + } + } + return properties; + } +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/block/BlockRegistryMirror.java b/core/src/main/java/net/momirealms/craftengine/core/block/BlockRegistryMirror.java new file mode 100644 index 000000000..77645ffa1 --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/block/BlockRegistryMirror.java @@ -0,0 +1,18 @@ +package net.momirealms.craftengine.core.block; + +public class BlockRegistryMirror { + private static PackedBlockState[] customBlockStates; + + public static void init(PackedBlockState[] states) { + customBlockStates = states; + } + + public static PackedBlockState stateByRegistryId(int vanillaId) { + if (vanillaId < 0) return null; + return customBlockStates[vanillaId]; + } + + public static int size() { + return customBlockStates.length; + } +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/block/BlockSettings.java b/core/src/main/java/net/momirealms/craftengine/core/block/BlockSettings.java new file mode 100644 index 000000000..42c66df96 --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/block/BlockSettings.java @@ -0,0 +1,350 @@ +package net.momirealms.craftengine.core.block; + +import net.momirealms.craftengine.core.util.*; +import org.jetbrains.annotations.Nullable; + +import java.util.*; +import java.util.stream.Collectors; + +public class BlockSettings { + boolean isRandomlyTicking; + boolean burnable; + int burnChance; + int fireSpreadChance; + boolean replaceable; + float hardness = 2f; + float resistance = 2f; + boolean canOcclude; + Tristate isRedstoneConductor = Tristate.UNDEFINED; + Tristate isSuffocating = Tristate.UNDEFINED; + Tristate isViewBlocking = Tristate.UNDEFINED; + MapColor mapColor = MapColor.CLEAR; + PushReaction pushReaction = PushReaction.NORMAL; + int luminance; + Instrument instrument = Instrument.HARP; + BlockSounds sounds = BlockSounds.EMPTY; + @Nullable + Key itemId; + Set tags = Set.of(); + Set correctTools = Set.of(); + + private BlockSettings() {} + + public static BlockSettings of() { + return new BlockSettings(); + } + + public static BlockSettings fromMap(Map map) { + return applyModifiers(BlockSettings.of(), map); + } + + public static BlockSettings ofFullCopy(BlockSettings settings, Map map) { + return applyModifiers(ofFullCopy(settings), map); + } + + public static BlockSettings applyModifiers(BlockSettings settings, Map map) { + for (Map.Entry entry : map.entrySet()) { + Modifier.Factory factory = Modifiers.FACTORIES.get(entry.getKey()); + if (factory != null) { + factory.createModifier(entry.getValue()).apply(settings); + } else { + throw new IllegalArgumentException("Unknown block settings key: " + entry.getKey()); + } + } + return settings; + } + + public static BlockSettings ofFullCopy(BlockSettings settings) { + BlockSettings newSettings = of(); + newSettings.canOcclude = settings.canOcclude; + newSettings.hardness = settings.hardness; + newSettings.resistance = settings.resistance; + newSettings.isRandomlyTicking = settings.isRandomlyTicking; + newSettings.burnable = settings.burnable; + newSettings.replaceable = settings.replaceable; + newSettings.mapColor = settings.mapColor; + newSettings.pushReaction = settings.pushReaction; + newSettings.luminance = settings.luminance; + newSettings.instrument = settings.instrument; + newSettings.sounds = settings.sounds; + newSettings.itemId = settings.itemId; + newSettings.tags = settings.tags; + newSettings.burnChance = settings.burnChance; + newSettings.fireSpreadChance = settings.fireSpreadChance; + newSettings.isRedstoneConductor = settings.isRedstoneConductor; + newSettings.isSuffocating = settings.isSuffocating; + newSettings.isViewBlocking = settings.isViewBlocking; + newSettings.correctTools = settings.correctTools; + return newSettings; + } + + public Set tags() { + return tags; + } + + public Key itemId() { + return itemId; + } + + public BlockSounds sounds() { + return sounds; + } + + public float resistance() { + return resistance; + } + + public boolean isRandomlyTicking() { + return isRandomlyTicking; + } + + public boolean burnable() { + return burnable; + } + + public boolean replaceable() { + return replaceable; + } + + public float hardness() { + return hardness; + } + + public boolean canOcclude() { + return canOcclude; + } + + public MapColor mapColor() { + return mapColor; + } + + public PushReaction pushReaction() { + return pushReaction; + } + + public int luminance() { + return luminance; + } + + public Instrument instrument() { + return instrument; + } + + public int burnChance() { + return burnChance; + } + + public int fireSpreadChance() { + return fireSpreadChance; + } + + public Tristate isRedstoneConductor() { + return isRedstoneConductor; + } + + public Tristate isSuffocating() { + return isSuffocating; + } + + public Tristate isViewBlocking() { + return isViewBlocking; + } + + public boolean isCorrectTool(Key key) { + if (this.correctTools.isEmpty()) return true; + return this.correctTools.contains(key); + } + + public BlockSettings correctTools(Set correctTools) { + this.correctTools = correctTools; + return this; + } + + public BlockSettings burnChance(int burnChance) { + this.burnChance = burnChance; + return this; + } + + public BlockSettings fireSpreadChance(int fireSpreadChance) { + this.fireSpreadChance = fireSpreadChance; + return this; + } + + public BlockSettings tags(Set tags) { + this.tags = tags; + return this; + } + + public BlockSettings itemId(Key itemId) { + this.itemId = itemId; + return this; + } + + public BlockSettings sounds(BlockSounds sounds) { + this.sounds = sounds; + return this; + } + + public BlockSettings instrument(Instrument instrument) { + this.instrument = instrument; + return this; + } + + public BlockSettings luminance(int luminance) { + this.luminance = luminance; + return this; + } + + public BlockSettings pushReaction(PushReaction pushReaction) { + this.pushReaction = pushReaction; + return this; + } + + public BlockSettings mapColor(MapColor mapColor) { + this.mapColor = mapColor; + return this; + } + + public BlockSettings hardness(float hardness) { + this.hardness = hardness; + return this; + } + + public BlockSettings resistance(float resistance) { + this.resistance = resistance; + return this; + } + + public BlockSettings canOcclude(boolean canOcclude) { + this.canOcclude = canOcclude; + return this; + } + + public BlockSettings isRandomlyTicking(boolean isRandomlyTicking) { + this.isRandomlyTicking = isRandomlyTicking; + return this; + } + + public BlockSettings burnable(boolean burnable) { + this.burnable = burnable; + return this; + } + + public BlockSettings isRedstoneConductor(boolean isRedstoneConductor) { + this.isRedstoneConductor = isRedstoneConductor ? Tristate.TRUE : Tristate.FALSE; + return this; + } + + public BlockSettings isSuffocating(boolean isSuffocating) { + this.isSuffocating = isSuffocating ? Tristate.TRUE : Tristate.FALSE; + return this; + } + + public BlockSettings isViewBlocking(boolean isViewBlocking) { + this.isViewBlocking = isViewBlocking ? Tristate.TRUE : Tristate.FALSE; + return this; + } + + public BlockSettings replaceable(boolean replaceable) { + this.replaceable = replaceable; + return this; + } + + public interface Modifier { + + void apply(BlockSettings settings); + + interface Factory { + + Modifier createModifier(Object value); + } + } + + public static class Modifiers { + private static final Map FACTORIES = new HashMap<>(); + + static { + registerFactory("luminance", (value -> { + int intValue = MiscUtils.getAsInt(value); + return settings -> settings.luminance(intValue); + })); + registerFactory("hardness", (value -> { + float floatValue = MiscUtils.getAsFloat(value); + return settings -> settings.hardness(floatValue); + })); + registerFactory("resistance", (value -> { + float floatValue = MiscUtils.getAsFloat(value); + return settings -> settings.resistance(floatValue); + })); + registerFactory("is-randomly-ticking", (value -> { + boolean booleanValue = (boolean) value; + return settings -> settings.isRandomlyTicking(booleanValue); + })); + registerFactory("push-reaction", (value -> { + PushReaction reaction = PushReaction.valueOf(value.toString().toUpperCase(Locale.ENGLISH)); + return settings -> settings.pushReaction(reaction); + })); + registerFactory("map-color", (value -> { + int intValue = MiscUtils.getAsInt(value); + return settings -> settings.mapColor(MapColor.get(intValue)); + })); + registerFactory("burnable", (value -> { + boolean booleanValue = (boolean) value; + return settings -> settings.burnable(booleanValue); + })); + registerFactory("instrument", (value -> { + Instrument instrument = Instrument.valueOf(value.toString().toUpperCase(Locale.ENGLISH)); + return settings -> settings.instrument(instrument); + })); + registerFactory("item", (value -> { + Key item = Key.of(value.toString()); + return settings -> settings.itemId(item); + })); + registerFactory("tags", (value -> { + List tags = MiscUtils.getAsStringList(value); + return settings -> settings.tags(tags.stream().map(Key::of).collect(Collectors.toSet())); + })); + registerFactory("burn-chance", (value -> { + int intValue = MiscUtils.getAsInt(value); + return settings -> settings.burnChance(intValue); + })); + registerFactory("fire-spread-chance", (value -> { + int intValue = MiscUtils.getAsInt(value); + return settings -> settings.fireSpreadChance(intValue); + })); + registerFactory("replaceable", (value -> { + boolean booleanValue = (boolean) value; + return settings -> settings.replaceable(booleanValue); + })); + registerFactory("is-redstone-conductor", (value -> { + boolean booleanValue = (boolean) value; + return settings -> settings.isRedstoneConductor(booleanValue); + })); + registerFactory("is-suffocating", (value -> { + boolean booleanValue = (boolean) value; + return settings -> settings.isSuffocating(booleanValue); + })); + registerFactory("is-view-blocking", (value -> { + boolean booleanValue = (boolean) value; + return settings -> settings.isViewBlocking(booleanValue); + })); + registerFactory("sounds", (value -> { + Map soundMap = MiscUtils.castToMap(value, false); + return settings -> settings.sounds(BlockSounds.fromMap(soundMap)); + })); + registerFactory("can-occlude", (value -> { + boolean booleanValue = (boolean) value; + return settings -> settings.canOcclude(booleanValue); + })); + registerFactory("correct-tools", (value -> { + List tools = MiscUtils.getAsStringList(value); + return settings -> settings.correctTools(tools.stream().map(Key::of).collect(Collectors.toSet())); + })); + } + + private static void registerFactory(String id, Modifier.Factory factory) { + FACTORIES.put(id, factory); + } + } +} + diff --git a/core/src/main/java/net/momirealms/craftengine/core/block/BlockSounds.java b/core/src/main/java/net/momirealms/craftengine/core/block/BlockSounds.java new file mode 100644 index 000000000..bc6e95247 --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/block/BlockSounds.java @@ -0,0 +1,62 @@ +package net.momirealms.craftengine.core.block; + +import net.momirealms.craftengine.core.util.Key; + +import java.util.Map; + +public class BlockSounds { + /* + Fall 0.5 0.75 + Place 1, 0.8 + Step 0.15, 1 + Hit 0.5 0.5 + Break 1 0.8 + */ + public static final Key EMPTY_SOUND = Key.of("minecraft:intentionally_empty"); + public static final BlockSounds EMPTY = new BlockSounds(EMPTY_SOUND, EMPTY_SOUND, EMPTY_SOUND, EMPTY_SOUND, EMPTY_SOUND); + + private final Key breakSound; + private final Key stepSound; + private final Key placeSound; + private final Key hitSound; + private final Key fallSound; + + public BlockSounds(Key breakSound, Key stepSound, Key placeSound, Key hitSound, Key fallSound) { + this.breakSound = breakSound; + this.stepSound = stepSound; + this.placeSound = placeSound; + this.hitSound = hitSound; + this.fallSound = fallSound; + } + + public static BlockSounds fromMap(Map map) { + if (map == null) return EMPTY; + return new BlockSounds( + Key.of(map.getOrDefault("break", "minecraft:intentionally_empty").toString()), + Key.of(map.getOrDefault("step", "minecraft:intentionally_empty").toString()), + Key.of(map.getOrDefault("place", "minecraft:intentionally_empty").toString()), + Key.of(map.getOrDefault("hit", "minecraft:intentionally_empty").toString()), + Key.of(map.getOrDefault("fall", "minecraft:intentionally_empty").toString()) + ); + } + + public Key breakSound() { + return breakSound; + } + + public Key stepSound() { + return stepSound; + } + + public Key placeSound() { + return placeSound; + } + + public Key hitSound() { + return hitSound; + } + + public Key fallSound() { + return fallSound; + } +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/block/BlockStateArrangeException.java b/core/src/main/java/net/momirealms/craftengine/core/block/BlockStateArrangeException.java new file mode 100644 index 000000000..d287ec63b --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/block/BlockStateArrangeException.java @@ -0,0 +1,7 @@ +package net.momirealms.craftengine.core.block; + +public class BlockStateArrangeException extends RuntimeException { + public BlockStateArrangeException(String message) { + super(message); + } +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/block/BlockStateHolder.java b/core/src/main/java/net/momirealms/craftengine/core/block/BlockStateHolder.java new file mode 100644 index 000000000..feb5535cb --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/block/BlockStateHolder.java @@ -0,0 +1,136 @@ +package net.momirealms.craftengine.core.block; + +import it.unimi.dsi.fastutil.objects.Reference2ObjectArrayMap; +import net.momirealms.craftengine.core.block.properties.Property; +import net.momirealms.craftengine.core.registry.Holder; +import org.jetbrains.annotations.Nullable; + +import java.util.*; +import java.util.stream.Collectors; + +public class BlockStateHolder { + protected final Holder owner; + private final Reference2ObjectArrayMap, Comparable> propertyMap; + private Map, ImmutableBlockState[]> withMap; + + public BlockStateHolder(Holder owner, Reference2ObjectArrayMap, Comparable> propertyMap) { + this.owner = owner; + this.propertyMap = new Reference2ObjectArrayMap<>(propertyMap); + } + + public Holder owner() { + return owner; + } + + public > ImmutableBlockState cycle(Property property) { + T currentValue = get(property); + List values = property.possibleValues(); + return with(property, getNextValue(values, currentValue)); + } + + protected static T getNextValue(List values, T currentValue) { + int index = values.indexOf(currentValue); + if (index == -1) { + throw new IllegalArgumentException("Current value not found in possible values"); + } + return values.get((index + 1) % values.size()); + } + + @Override + public String toString() { + if (propertyMap.isEmpty()) { + return owner.value().id().toString(); + } + return owner.value().id() + "[" + getPropertiesAsString() + "]"; + } + + public String getPropertiesAsString() { + return propertyMap.entrySet().stream() + .map(entry -> { + Property property = entry.getKey(); + return property.name() + "=" + formatValue(property, entry.getValue()); + }) + .collect(Collectors.joining(",")); + } + + @SuppressWarnings("unchecked") + private static > String formatValue(Property property, Comparable value) { + return property.valueName((T) value); + } + + public Collection> getProperties() { + return Collections.unmodifiableSet(propertyMap.keySet()); + } + + public > boolean contains(Property property) { + return propertyMap.containsKey(property); + } + + public > T get(Property property) { + T value = getNullable(property); + if (value == null) { + throw new IllegalArgumentException("Property " + property + " not found in " + owner.value().id()); + } + return value; + } + + public > T get(Property property, T fallback) { + return Objects.requireNonNullElse(getNullable(property), fallback); + } + + @Nullable + public > T getNullable(Property property) { + Comparable value = propertyMap.get(property); + return value != null ? property.valueClass().cast(value) : null; + } + + public , V extends T> ImmutableBlockState with(Property property, V value) { + if (!propertyMap.containsKey(property)) { + throw new IllegalArgumentException("Property " + property + " not found in " + owner.value().id()); + } + return withInternal(property, value); + } + + private , V extends T> ImmutableBlockState withInternal(Property property, V newValue) { + if (newValue.equals(propertyMap.get(property))) { + return (ImmutableBlockState) this; + } + + int index = property.indexOf(newValue); + if (index == -1) { + throw new IllegalArgumentException("Invalid value " + newValue + " for property " + property); + } + + return withMap.get(property)[index]; + } + + public void createWithMap(Map, Comparable>, ImmutableBlockState> states) { + if (withMap != null) { + throw new IllegalStateException("WithMap already initialized"); + } + + Reference2ObjectArrayMap, ImmutableBlockState[]> map = new Reference2ObjectArrayMap<>(propertyMap.size()); + + for (Property property : propertyMap.keySet()) { + ImmutableBlockState[] statesArray = property.possibleValues().stream() + .map(value -> { + Map, Comparable> testMap = new Reference2ObjectArrayMap<>(propertyMap); + testMap.put(property, value); + ImmutableBlockState state = states.get(testMap); + if (state == null) { + throw new IllegalStateException("Missing state for " + testMap); + } + return state; + }) + .toArray(ImmutableBlockState[]::new); + + map.put(property, statesArray); + } + + this.withMap = Map.copyOf(map); + } + + public Map, Comparable> propertyEntries() { + return Collections.unmodifiableMap(propertyMap); + } +} \ No newline at end of file diff --git a/core/src/main/java/net/momirealms/craftengine/core/block/BlockStateParser.java b/core/src/main/java/net/momirealms/craftengine/core/block/BlockStateParser.java new file mode 100644 index 000000000..ce3e7984a --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/block/BlockStateParser.java @@ -0,0 +1,59 @@ +package net.momirealms.craftengine.core.block; + +import net.momirealms.craftengine.core.block.properties.Property; +import net.momirealms.craftengine.core.registry.BuiltInRegistries; +import net.momirealms.craftengine.core.registry.Holder; +import net.momirealms.craftengine.core.util.Key; +import net.momirealms.craftengine.core.util.StringReader; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +import java.util.Optional; + +public class BlockStateParser { + + @Nullable + public static ImmutableBlockState deserialize(@NotNull String data) { + StringReader reader = new StringReader(data); + String blockIdString = reader.readUnquotedString(); + if (reader.canRead() && reader.peek() == ':') { + reader.skip(); + blockIdString = blockIdString + ":" + reader.readUnquotedString(); + } + Optional> optional = BuiltInRegistries.BLOCK.get(Key.from(blockIdString)); + if (optional.isEmpty()) { + return null; + } + Holder holder = optional.get(); + ImmutableBlockState defaultState = holder.value().getDefaultState(); + if (reader.canRead() && reader.peek() == '[') { + reader.skip(); + while (reader.canRead() && reader.peek() != ']') { + String propertyName = reader.readUnquotedString(); + if (!reader.canRead() || reader.peek() != '=') { + return null; + } + reader.skip(); + String propertyValue = reader.readUnquotedString(); + Property property = holder.value().getProperty(propertyName); + if (property != null) { + Optional optionalValue = property.optional(propertyValue); + if (optionalValue.isEmpty()) { + defaultState = ImmutableBlockState.with(defaultState, property, property.defaultValue()); + } else { + defaultState = ImmutableBlockState.with(defaultState, property, optionalValue.get()); + } + } + if (reader.canRead() && reader.peek() == ',') { + reader.skip(); + } + } + if (reader.canRead() && reader.peek() == ']') { + reader.skip(); + } else { + return null; + } + } + return defaultState; + } +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/block/BlockStateVariantProvider.java b/core/src/main/java/net/momirealms/craftengine/core/block/BlockStateVariantProvider.java new file mode 100644 index 000000000..86d9ee40a --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/block/BlockStateVariantProvider.java @@ -0,0 +1,87 @@ +package net.momirealms.craftengine.core.block; + +import com.google.common.collect.ImmutableList; +import com.google.common.collect.ImmutableSortedMap; +import com.google.common.collect.Lists; +import com.google.common.collect.Maps; +import it.unimi.dsi.fastutil.objects.Reference2ObjectArrayMap; +import net.momirealms.craftengine.core.block.properties.Property; +import net.momirealms.craftengine.core.registry.Holder; +import net.momirealms.craftengine.core.util.Pair; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; +import java.util.Map; +import java.util.function.Function; +import java.util.stream.Stream; + +public class BlockStateVariantProvider { + private final ImmutableSortedMap> properties; + private final ImmutableList states; + private final Holder owner; + + public BlockStateVariantProvider(Holder owner, Factory, ImmutableBlockState> factory, Map> propertiesMap) { + this.owner = owner; + this.properties = ImmutableSortedMap.copyOf(propertiesMap); + + List list = Lists.newArrayList(); + Stream, Comparable>>> stream = Stream.of(Collections.emptyList()); + Map, Comparable>, ImmutableBlockState> map = Maps.newLinkedHashMap(); + + for (Property property : this.properties.values()) { + stream = stream.flatMap(entries -> { + List, Comparable>>>> streams = new ArrayList<>(); + for (Comparable value : property.possibleValues()) { + List, Comparable>> newEntries = new ArrayList<>(entries); + newEntries.add(Pair.of(property, value)); + streams.add(Stream.of(newEntries)); + } + return streams.stream().flatMap(Function.identity()); + }); + } + + stream.forEach((entries) -> { + Reference2ObjectArrayMap, Comparable> reference2ObjectArrayMap = new Reference2ObjectArrayMap<>(entries.size()); + for (Pair, Comparable> entry : entries) { + reference2ObjectArrayMap.put(entry.left(), entry.right()); + } + ImmutableBlockState state = factory.create(owner, reference2ObjectArrayMap); + map.put(reference2ObjectArrayMap, state); + list.add(state); + }); + + for (ImmutableBlockState state : list) { + state.createWithMap(map); + } + this.states = ImmutableList.copyOf(list); + } + + public interface Factory { + S create(O owner, Reference2ObjectArrayMap, Comparable> propertyMap); + } + + @NotNull + public ImmutableBlockState getDefaultState() { + ImmutableBlockState first = this.states.get(0); + for (Property property : this.properties.values()) { + first = ImmutableBlockState.with(first, property, property.defaultValue()); + } + return first; + } + + public ImmutableList states() { + return states; + } + + public Holder owner() { + return owner; + } + + @Nullable + public Property getProperty(String name) { + return this.properties.get(name); + } +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/block/CustomBlock.java b/core/src/main/java/net/momirealms/craftengine/core/block/CustomBlock.java new file mode 100644 index 000000000..d63ca24fe --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/block/CustomBlock.java @@ -0,0 +1,186 @@ +package net.momirealms.craftengine.core.block; + +import net.momirealms.craftengine.core.block.behavior.BlockBehaviors; +import net.momirealms.craftengine.core.block.properties.Property; +import net.momirealms.craftengine.core.item.context.BlockPlaceContext; +import net.momirealms.craftengine.core.loot.LootTable; +import net.momirealms.craftengine.core.plugin.CraftEngine; +import net.momirealms.craftengine.core.registry.Holder; +import net.momirealms.craftengine.core.util.Direction; +import net.momirealms.craftengine.core.util.HorizontalDirection; +import net.momirealms.craftengine.core.util.Key; +import net.momirealms.craftengine.shared.block.BlockBehavior; +import net.momirealms.sparrow.nbt.CompoundTag; +import net.momirealms.sparrow.nbt.Tag; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +import java.util.ArrayList; +import java.util.Collection; +import java.util.List; +import java.util.Map; + +public abstract class CustomBlock { + protected final Holder holder; + protected Key id; + protected ImmutableBlockState defaultState; + protected BlockStateVariantProvider variantProvider; + protected Map> properties; + protected BlockBehavior behavior; + @Nullable + protected LootTable lootTable; + + public CustomBlock( + @NotNull Key id, + @NotNull Holder.Reference holder, + @NotNull Map> properties, + @NotNull Map appearances, + @NotNull Map variantMapper, + @NotNull BlockSettings settings, + @Nullable Map behaviorSettings, + @Nullable LootTable lootTable + ) { + holder.bindValue(this); + this.holder = holder; + this.id = id; + this.lootTable = lootTable; + this.properties = properties; + this.variantProvider = new BlockStateVariantProvider(holder, ImmutableBlockState::new, properties); + this.setDefaultState(this.variantProvider.getDefaultState()); + this.behavior = BlockBehaviors.fromMap(this, behaviorSettings); + for (Map.Entry entry : variantMapper.entrySet()) { + String nbtString = entry.getKey(); + CompoundTag tag = BlockNbtParser.deserialize(this, nbtString); + if (tag == null) { + CraftEngine.instance().logger().warn("Illegal block state: " + nbtString); + continue; + } + VariantState variantState = entry.getValue(); + int vanillaStateRegistryId = appearances.getOrDefault(variantState.appearance(), -1); + if (vanillaStateRegistryId == -1) { + CraftEngine.instance().logger().warn("Could not find appearance " + variantState.appearance() + " for block " + id); + vanillaStateRegistryId = appearances.values().iterator().next(); + } + // Late init states + for (ImmutableBlockState state : this.getPossibleStates(tag)) { + state.setBehavior(this.behavior); + state.setSettings(variantState.settings()); + state.setVanillaBlockState(BlockRegistryMirror.stateByRegistryId(vanillaStateRegistryId)); + state.setCustomBlockState(BlockRegistryMirror.stateByRegistryId(variantState.internalRegistryId())); + } + } + // double check if there's any invalid state + for (ImmutableBlockState state : this.variantProvider().states()) { + if (state.settings() == null) { + state.setSettings(settings); + } + } + this.applyPlatformSettings(); + } + + protected abstract void applyPlatformSettings(); + + @Nullable + public LootTable lootTable() { + return lootTable; + } + + @NotNull + public BlockStateVariantProvider variantProvider() { + return variantProvider; + } + + @NotNull + public final Key id() { + return id; + } + + private List getPossibleStates(CompoundTag nbt) { + List tempStates = new ArrayList<>(); + tempStates.add(getDefaultState()); + for (Property property : variantProvider.getDefaultState().getProperties()) { + Tag value = nbt.get(property.name()); + if (value != null) { + tempStates.replaceAll(immutableBlockState -> ImmutableBlockState.with(immutableBlockState, property, property.unpack(value))); + } else { + List newStates = new ArrayList<>(); + for (ImmutableBlockState state : tempStates) { + for (Object possibleValue : property.possibleValues()) { + newStates.add(ImmutableBlockState.with(state, property, possibleValue)); + } + } + tempStates = newStates; + } + } + return tempStates; + } + + public ImmutableBlockState getBlockState(CompoundTag nbt) { + ImmutableBlockState state = getDefaultState(); + for (Map.Entry entry : nbt.tags.entrySet()) { + Property property = variantProvider.getProperty(entry.getKey()); + if (property != null) { + try { + state = ImmutableBlockState.with(state, property, property.unpack(entry.getValue())); + } catch (Exception e) { + CraftEngine.instance().logger().warn("Failed to parse block state: " + entry.getKey(), e); + } + } + } + return state; + } + + @Nullable + public Property getProperty(String name) { + return this.properties.get(name); + } + + @NotNull + public Collection> properties() { + return this.properties.values(); + } + + protected final void setDefaultState(ImmutableBlockState state) { + this.defaultState = state; + } + + public final ImmutableBlockState getDefaultState() { + return this.defaultState; + } + + // TODO refactor this method + @SuppressWarnings("unchecked") + public ImmutableBlockState getStateForPlacement(BlockPlaceContext context) { + ImmutableBlockState state = getDefaultState(); + Property axisProperty = (Property) this.variantProvider.getProperty("axis"); + if (axisProperty != null) { + state = state.with(axisProperty, context.getClickedFace().axis()); + } + Property directionProperty = this.variantProvider.getProperty("facing"); + if (directionProperty != null) { + if (directionProperty.valueClass() == HorizontalDirection.class) { + state = state.with((Property) directionProperty, context.getHorizontalDirection().opposite().toHorizontalDirection()); + } else if (directionProperty.valueClass() == Direction.class) { + state = state.with((Property) directionProperty, context.getNearestLookingDirection().opposite()); + } + } + Property waterloggedProperty = (Property) this.variantProvider.getProperty("waterlogged"); + if (waterloggedProperty != null) { + if (context.isWaterSource()) { + state = state.with(waterloggedProperty, true); + } + } + + //TODO Use default values + Property persistentProperty = (Property) this.variantProvider.getProperty("persistent"); + if (persistentProperty != null) { + state = state.with(persistentProperty, true); + } + Property distanceProperty = (Property) this.variantProvider.getProperty("distance"); + if (distanceProperty != null) { + state = state.with(distanceProperty, distanceProperty.defaultValue()); + } + //TODO state = state.behavior().getStateForPlacement(state, context); + return state; + } +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/block/EmptyBlock.java b/core/src/main/java/net/momirealms/craftengine/core/block/EmptyBlock.java new file mode 100644 index 000000000..84d079d37 --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/block/EmptyBlock.java @@ -0,0 +1,19 @@ +package net.momirealms.craftengine.core.block; + +import net.momirealms.craftengine.core.registry.Holder; +import net.momirealms.craftengine.core.util.Key; + +import java.util.Map; + +public class EmptyBlock extends CustomBlock { + public static EmptyBlock INSTANCE; + + public EmptyBlock(Key id, Holder.Reference holder) { + super(id, holder, Map.of(), Map.of(), Map.of(), BlockSettings.of(), null, null); + INSTANCE = this; + } + + @Override + protected void applyPlatformSettings() { + } +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/block/ImmutableBlockState.java b/core/src/main/java/net/momirealms/craftengine/core/block/ImmutableBlockState.java new file mode 100644 index 000000000..6a4f2ae9e --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/block/ImmutableBlockState.java @@ -0,0 +1,149 @@ +package net.momirealms.craftengine.core.block; + +import it.unimi.dsi.fastutil.objects.Reference2ObjectArrayMap; +import net.momirealms.craftengine.core.block.properties.Property; +import net.momirealms.craftengine.core.item.Item; +import net.momirealms.craftengine.core.loot.LootTable; +import net.momirealms.craftengine.core.loot.parameter.LootParameters; +import net.momirealms.craftengine.core.registry.Holder; +import net.momirealms.craftengine.core.util.context.ContextHolder; +import net.momirealms.craftengine.core.world.World; +import net.momirealms.craftengine.shared.block.BlockBehavior; +import net.momirealms.sparrow.nbt.CompoundTag; +import net.momirealms.sparrow.nbt.NBT; +import net.momirealms.sparrow.nbt.Tag; + +import javax.annotation.Nullable; +import java.util.List; + +public class ImmutableBlockState extends BlockStateHolder { + private CompoundTag tag; + @Nullable + private PackedBlockState customBlockState; + @Nullable + private PackedBlockState vanillaBlockState; + + private BlockBehavior behavior; + private Integer hashCode; + private BlockSettings settings; + + protected ImmutableBlockState( + Holder owner, + Reference2ObjectArrayMap, Comparable> propertyMap + ) { + super(owner, propertyMap); + } + + public BlockBehavior behavior() { + return behavior; + } + + public void setBehavior(BlockBehavior behavior) { + this.behavior = behavior; + } + + public BlockSettings settings() { + return settings; + } + + public void setSettings(BlockSettings settings) { + this.settings = settings; + } + + public boolean isEmpty() { + return this == EmptyBlock.INSTANCE.getDefaultState(); + } + + @Override + public final boolean equals(Object o) { + if (this == o) return true; + if (!(o instanceof ImmutableBlockState state)) return false; + return state.owner == this.owner && state.tag.equals(this.tag); + } + + @Override + public int hashCode() { + if (hashCode == null) { + hashCode = getNbtToSave().hashCode(); + } + return hashCode; + } + + public BlockSounds sounds() { + return settings.sounds; + } + + public int luminance() { + return settings.luminance; + } + + public PushReaction pushReaction() { + return settings.pushReaction; + } + + public PackedBlockState customBlockState() { + return customBlockState; + } + + public PackedBlockState vanillaBlockState() { + return vanillaBlockState; + } + + public void setCustomBlockState(@Nullable PackedBlockState customBlockState) { + this.customBlockState = customBlockState; + } + + public void setVanillaBlockState(@Nullable PackedBlockState vanillaBlockState) { + this.vanillaBlockState = vanillaBlockState; + } + + public CompoundTag propertiesNbt() { + CompoundTag properties = new CompoundTag(); + for (Property property : getProperties()) { + Comparable value = get(property); + if (value != null) { + properties.put(property.name(), pack(property, value)); + continue; + } + properties.put(property.name(), pack(property, property.defaultValue())); + } + return properties; + } + + @SuppressWarnings("unchecked") + public static > Tag pack(Property property, Object value) { + return property.pack((T) value); + } + + public CompoundTag getNbtToSave() { + if (tag == null) { + tag = toNbtToSave(propertiesNbt()); + } + return tag; + } + + public CompoundTag toNbtToSave(CompoundTag properties) { + CompoundTag tag = new CompoundTag(); + tag.put("properties", properties); + tag.put("id", NBT.createString(owner.value().id().toString())); + return tag; + } + + public void setNbtToSave(CompoundTag tag) { + this.tag = tag; + } + + @SuppressWarnings("unchecked") + public static > ImmutableBlockState with(ImmutableBlockState state, Property property, Object value) { + return state.with(property, (T) value); + } + + @SuppressWarnings("unchecked") + public List> getDrops(ContextHolder.Builder builder, World world) { + CustomBlock block = owner.value(); + if (block == null) return List.of(); + LootTable lootTable = (LootTable) block.lootTable(); + if (lootTable == null) return List.of(); + return lootTable.getRandomItems(builder.withParameter(LootParameters.BLOCK_STATE, this).build(), world); + } +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/block/InactiveCustomBlock.java b/core/src/main/java/net/momirealms/craftengine/core/block/InactiveCustomBlock.java new file mode 100644 index 000000000..db164c62e --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/block/InactiveCustomBlock.java @@ -0,0 +1,30 @@ +package net.momirealms.craftengine.core.block; + +import it.unimi.dsi.fastutil.objects.Reference2ObjectArrayMap; +import net.momirealms.craftengine.core.registry.Holder; +import net.momirealms.craftengine.core.util.Key; +import net.momirealms.sparrow.nbt.CompoundTag; + +import java.util.HashMap; +import java.util.Map; + +public class InactiveCustomBlock extends CustomBlock { + private final Map cachedData = new HashMap<>(); + + public InactiveCustomBlock(Key id, Holder.Reference holder) { + super(id, holder, Map.of(), Map.of(), Map.of(), BlockSettings.of(), null, null); + } + + @Override + protected void applyPlatformSettings() { + } + + @Override + public ImmutableBlockState getBlockState(CompoundTag nbt) { + return this.cachedData.computeIfAbsent(nbt, k -> { + ImmutableBlockState state = new ImmutableBlockState(holder, new Reference2ObjectArrayMap<>()); + state.setNbtToSave(state.toNbtToSave(nbt)); + return state; + }); + } +} \ No newline at end of file diff --git a/core/src/main/java/net/momirealms/craftengine/core/block/PackedBlockState.java b/core/src/main/java/net/momirealms/craftengine/core/block/PackedBlockState.java new file mode 100644 index 000000000..9abfb6db8 --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/block/PackedBlockState.java @@ -0,0 +1,4 @@ +package net.momirealms.craftengine.core.block; + +public record PackedBlockState(Object handle, int registryId) { +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/block/PushReaction.java b/core/src/main/java/net/momirealms/craftengine/core/block/PushReaction.java new file mode 100644 index 000000000..db1d653be --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/block/PushReaction.java @@ -0,0 +1,9 @@ +package net.momirealms.craftengine.core.block; + +public enum PushReaction { + NORMAL, + DESTROY, + BLOCK, + IGNORE, + PUSH_ONLY +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/block/StatePredicate.java b/core/src/main/java/net/momirealms/craftengine/core/block/StatePredicate.java new file mode 100644 index 000000000..02c72350a --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/block/StatePredicate.java @@ -0,0 +1,19 @@ +package net.momirealms.craftengine.core.block; + +public class StatePredicate { + private static Object TRUE; + private static Object FALSE; + + public static void init(Object alwaysTrue, Object alwaysFalse) { + TRUE = alwaysTrue; + FALSE = alwaysFalse; + } + + public static Object alwaysTrue() { + return TRUE; + } + + public static Object alwaysFalse() { + return FALSE; + } +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/block/UpdateOption.java b/core/src/main/java/net/momirealms/craftengine/core/block/UpdateOption.java new file mode 100644 index 000000000..98286d2ea --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/block/UpdateOption.java @@ -0,0 +1,73 @@ +package net.momirealms.craftengine.core.block; + +public class UpdateOption { + public static final UpdateOption UPDATE_ALL = new UpdateOption(3); + public static final UpdateOption UPDATE_NONE = new UpdateOption(4); + public static final UpdateOption UPDATE_ALL_IMMEDIATE = new UpdateOption(11); + private final int flags; + + private UpdateOption(int flags) { + this.flags = flags; + } + + public int flags() { + return flags; + } + + public static class Builder { + private int flags; + + public Builder() { + flags = 0; + } + + public Builder updateNeighbors() { + flags |= Flags.UPDATE_NEIGHBORS; + return this; + } + + public Builder updateClients() { + flags |= Flags.UPDATE_CLIENTS; + return this; + } + + public Builder updateInvisible() { + flags |= Flags.UPDATE_INVISIBLE; + return this; + } + + public Builder updateImmediate() { + flags |= Flags.UPDATE_IMMEDIATE; + return this; + } + + public Builder updateKnownShape() { + flags |= Flags.UPDATE_KNOWN_SHAPE; + return this; + } + + public Builder updateSuppressDrops() { + flags |= Flags.UPDATE_SUPPRESS_DROPS; + return this; + } + + public Builder updateMoveByPiston() { + flags |= Flags.UPDATE_MOVE_BY_PISTON; + return this; + } + + public UpdateOption build() { + return new UpdateOption(flags); + } + } + + public static class Flags { + public static final int UPDATE_NEIGHBORS = 1; + public static final int UPDATE_CLIENTS = 2; + public static final int UPDATE_INVISIBLE = 4; + public static final int UPDATE_IMMEDIATE = 8; + public static final int UPDATE_KNOWN_SHAPE = 16; + public static final int UPDATE_SUPPRESS_DROPS = 32; + public static final int UPDATE_MOVE_BY_PISTON = 64; + } +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/block/VariantState.java b/core/src/main/java/net/momirealms/craftengine/core/block/VariantState.java new file mode 100644 index 000000000..e4e2924a2 --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/block/VariantState.java @@ -0,0 +1,25 @@ +package net.momirealms.craftengine.core.block; + +public class VariantState { + private final String appearance; + private final BlockSettings settings; + private final int internalId; + + public VariantState(String appearance, BlockSettings settings, int internalId) { + this.appearance = appearance; + this.settings = settings; + this.internalId = internalId; + } + + public String appearance() { + return appearance; + } + + public BlockSettings settings() { + return settings; + } + + public int internalRegistryId() { + return internalId; + } +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/block/behavior/BlockBehaviorFactory.java b/core/src/main/java/net/momirealms/craftengine/core/block/behavior/BlockBehaviorFactory.java new file mode 100644 index 000000000..630e7629b --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/block/behavior/BlockBehaviorFactory.java @@ -0,0 +1,11 @@ +package net.momirealms.craftengine.core.block.behavior; + +import net.momirealms.craftengine.core.block.CustomBlock; +import net.momirealms.craftengine.shared.block.BlockBehavior; + +import java.util.Map; + +public interface BlockBehaviorFactory { + + BlockBehavior create(CustomBlock block, Map arguments); +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/block/behavior/BlockBehaviors.java b/core/src/main/java/net/momirealms/craftengine/core/block/behavior/BlockBehaviors.java new file mode 100644 index 000000000..8217b0000 --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/block/behavior/BlockBehaviors.java @@ -0,0 +1,37 @@ +package net.momirealms.craftengine.core.block.behavior; + +import net.momirealms.craftengine.core.block.CustomBlock; +import net.momirealms.craftengine.core.registry.BuiltInRegistries; +import net.momirealms.craftengine.core.registry.Holder; +import net.momirealms.craftengine.core.registry.Registries; +import net.momirealms.craftengine.core.registry.WritableRegistry; +import net.momirealms.craftengine.core.util.Key; +import net.momirealms.craftengine.core.util.ResourceKey; +import net.momirealms.craftengine.shared.block.BlockBehavior; +import net.momirealms.craftengine.shared.block.EmptyBlockBehavior; +import org.jetbrains.annotations.Nullable; + +import java.util.Map; + +public class BlockBehaviors { + + public static void register(Key key, BlockBehaviorFactory factory) { + Holder.Reference holder = ((WritableRegistry) BuiltInRegistries.BLOCK_BEHAVIOR_FACTORY) + .registerForHolder(new ResourceKey<>(Registries.BLOCK_BEHAVIOR_FACTORY.location(), key)); + holder.bindValue(factory); + } + + public static BlockBehavior fromMap(CustomBlock block, @Nullable Map map) { + if (map == null) return EmptyBlockBehavior.INSTANCE; + String type = (String) map.getOrDefault("type", "empty"); + if (type == null) { + throw new NullPointerException("behavior type cannot be null"); + } + Key key = Key.withDefaultNamespace(type, "craftengine"); + BlockBehaviorFactory factory = BuiltInRegistries.BLOCK_BEHAVIOR_FACTORY.getValue(key); + if (factory == null) { + throw new IllegalArgumentException("Unknown behavior type: " + type); + } + return factory.create(block, map); + } +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/block/properties/BooleanProperty.java b/core/src/main/java/net/momirealms/craftengine/core/block/properties/BooleanProperty.java new file mode 100644 index 000000000..9541878ae --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/block/properties/BooleanProperty.java @@ -0,0 +1,80 @@ +package net.momirealms.craftengine.core.block.properties; + +import net.momirealms.sparrow.nbt.ByteTag; +import net.momirealms.sparrow.nbt.Tag; + +import java.util.List; +import java.util.Map; +import java.util.Optional; + +public class BooleanProperty extends Property { + public final static Factory FACTORY = new Factory(); + private static final List VALUES = List.of(true, false); + private static final Boolean[] BY_ID = new Boolean[]{ Boolean.FALSE, Boolean.TRUE }; + private static final ByteTag TRUE = new ByteTag((byte) 1); + private static final ByteTag FALSE = new ByteTag((byte) 0); + + private BooleanProperty(String name, boolean defaultValue) { + super(name, Boolean.class, defaultValue); + this.setById(BY_ID); + } + + @Override + public List possibleValues() { + return VALUES; + } + + @Override + public Optional optional(String valueName) { + return switch (valueName) { + case "true" -> Optional.of(true); + case "false" -> Optional.of(false); + default -> Optional.empty(); + }; + } + + @Override + public Optional createOptionalTag(String valueName) { + return optional(valueName).map(ByteTag::new); + } + + @Override + public Tag pack(Boolean value) { + return value ? TRUE : FALSE; + } + + @Override + public final int idFor(final Boolean value) { + return value ? 1 : 0; + } + + @Override + public String valueName(Boolean bool) { + return bool.toString(); + } + + @Override + public int indexOf(Boolean bool) { + return bool ? 0 : 1; + } + + @Override + public Boolean unpack(Tag tag) { + if (tag instanceof ByteTag byteTag) { + return byteTag.booleanValue(); + } + throw new IllegalArgumentException("Invalid boolean tag: " + tag); + } + + public static BooleanProperty create(String name, boolean defaultValue) { + return new BooleanProperty(name, defaultValue); + } + + public static class Factory implements PropertyFactory { + @Override + public Property create(String name, Map arguments) { + boolean bool = (boolean) arguments.getOrDefault("default", false); + return BooleanProperty.create(name, bool); + } + } +} \ No newline at end of file diff --git a/core/src/main/java/net/momirealms/craftengine/core/block/properties/EnumProperty.java b/core/src/main/java/net/momirealms/craftengine/core/block/properties/EnumProperty.java new file mode 100644 index 000000000..085e09505 --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/block/properties/EnumProperty.java @@ -0,0 +1,126 @@ +package net.momirealms.craftengine.core.block.properties; + +import com.google.common.collect.ImmutableMap; +import net.momirealms.craftengine.core.plugin.CraftEngine; +import net.momirealms.sparrow.nbt.StringTag; +import net.momirealms.sparrow.nbt.Tag; + +import java.lang.reflect.Array; +import java.util.*; + +public class EnumProperty> extends Property { + private final List values; + private final Map names; + private final int[] ordinalToIndex; + private final int[] idLookupTable; + + public EnumProperty(String name, Class type, List values, T defaultValue) { + super(name, type, defaultValue); + this.values = List.copyOf(values); + T[] enums = type.getEnumConstants(); + this.ordinalToIndex = new int[enums.length]; + + for (T enum_ : enums) { + this.ordinalToIndex[enum_.ordinal()] = values.indexOf(enum_); + } + + ImmutableMap.Builder builder = ImmutableMap.builder(); + for (T enum2 : values) { + String string = enum2.name().toLowerCase(Locale.ENGLISH); + builder.put(string, enum2); + } + + this.names = builder.buildOrThrow(); + Class clazz = this.valueClass(); + + int id = 0; + this.idLookupTable = new int[clazz.getEnumConstants().length]; + Arrays.fill(this.idLookupTable, -1); + @SuppressWarnings("unchecked") + final T[] byId = (T[]) Array.newInstance(clazz, values.size()); + + for (final T value : values) { + int valueId = id++; + this.idLookupTable[value.ordinal()] = valueId; + byId[valueId] = value; + } + + this.setById(byId); + } + + @Override + public List possibleValues() { + return this.values; + } + + @Override + public Optional optional(String valueName) { + return Optional.ofNullable(this.names.get(valueName)); + } + + @Override + public Optional createOptionalTag(String valueName) { + return optional(valueName).map(it -> new StringTag(names.get(valueName).name().toLowerCase(Locale.ENGLISH))); + } + + @Override + public Tag pack(T value) { + return new StringTag(valueName(value)); + } + + @Override + public T unpack(Tag tag) { + if (tag instanceof StringTag stringTag) { + return names.get(stringTag.getAsString()); + } + throw new IllegalArgumentException("Invalid string tag: " + tag); + } + + @Override + public final int idFor(T value) { + final Class target = this.valueClass(); + return ((value.getClass() != target && value.getDeclaringClass() != target)) ? -1 : this.idLookupTable[value.ordinal()]; + } + + @Override + public String valueName(T value) { + return value.name().toLowerCase(Locale.ENGLISH); + } + + @Override + public int indexOf(T value) { + return this.ordinalToIndex[value.ordinal()]; + } + + @Override + public int generateHashCode() { + int i = super.generateHashCode(); + return 31 * i + this.values.hashCode(); + } + + public static > EnumProperty create(String name, Class type, List values, T defaultValue) { + return new EnumProperty<>(name, type, values, defaultValue); + } + + public static class Factory> implements PropertyFactory { + private final Class enumClass; + + public Factory(Class enumClass) { + this.enumClass = enumClass; + } + + @Override + public Property create(String name, Map arguments) { + List enums = Arrays.asList(enumClass.getEnumConstants()); + String defaultValueName = arguments.getOrDefault("default", "").toString().toLowerCase(Locale.ENGLISH); + A defaultValue = enums.stream() + .filter(e -> e.name().toLowerCase(Locale.ENGLISH).equals(defaultValueName)) + .findFirst() + .orElseGet(() -> { + CraftEngine.instance().logger().warn("Invalid default value '" + defaultValueName + "' for property '" + name + "'"); + return enums.get(0); + }); + return EnumProperty.create(name, enumClass, enums, defaultValue); + } + } +} \ No newline at end of file diff --git a/core/src/main/java/net/momirealms/craftengine/core/block/properties/IntegerProperty.java b/core/src/main/java/net/momirealms/craftengine/core/block/properties/IntegerProperty.java new file mode 100644 index 000000000..4b17184ac --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/block/properties/IntegerProperty.java @@ -0,0 +1,98 @@ +package net.momirealms.craftengine.core.block.properties; + +import it.unimi.dsi.fastutil.ints.IntImmutableList; +import net.momirealms.craftengine.core.util.MiscUtils; +import net.momirealms.sparrow.nbt.IntTag; +import net.momirealms.sparrow.nbt.NumericTag; +import net.momirealms.sparrow.nbt.Tag; + +import java.util.List; +import java.util.Map; +import java.util.Optional; +import java.util.stream.IntStream; + +public class IntegerProperty extends Property { + public static final Factory FACTORY = new Factory(); + private final IntImmutableList values; + public final int min; + public final int max; + + private IntegerProperty(String name, int min, int max, int defaultValue) { + super(name, Integer.class, defaultValue); + this.min = min; + this.max = max; + this.values = IntImmutableList.toList(IntStream.range(min, max + 1)); + + final Integer[] byId = new Integer[max - min + 1]; + for (int i = min; i <= max; ++i) { + byId[i - min] = i; + } + + this.setById(byId); + } + + @Override + public List possibleValues() { + return this.values; + } + + @Override + public Optional optional(String valueName) { + try { + int i = Integer.parseInt(valueName); + return i >= this.min && i <= this.max ? Optional.of(i) : Optional.empty(); + } catch (NumberFormatException var3) { + return Optional.empty(); + } + } + + @Override + public Optional createOptionalTag(String valueName) { + return optional(valueName).map(IntTag::new); + } + + @Override + public Tag pack(Integer value) { + return new IntTag(value); + } + + @Override + public final int idFor(final Integer value) { + final int ret = value - this.min; + return ret | ((this.max - ret) >> 31); + } + + @Override + public Integer unpack(Tag tag) { + if (tag instanceof NumericTag numericTag) { + return values.getInt(idFor(numericTag.getAsInt())); + } + throw new IllegalArgumentException("Invalid numeric tag: " + tag); + } + + @Override + public String valueName(Integer integer) { + return integer.toString(); + } + + @Override + public int indexOf(Integer integer) { + return integer <= this.max ? integer - this.min : -1; + } + + public static IntegerProperty create(String name, int min, int max, int defaultValue) { + return new IntegerProperty(name, min, max, defaultValue); + } + + public static class Factory implements PropertyFactory { + @Override + public Property create(String name, Map arguments) { + String range = arguments.getOrDefault("range", "1~1").toString(); + String[] split = range.split("~"); + int min = Integer.parseInt(split[0]); + int max = Integer.parseInt(split[1]); + int defaultValue = MiscUtils.getAsInt(arguments.getOrDefault("default", min)); + return IntegerProperty.create(name, min, max,defaultValue); + } + } +} \ No newline at end of file diff --git a/core/src/main/java/net/momirealms/craftengine/core/block/properties/Properties.java b/core/src/main/java/net/momirealms/craftengine/core/block/properties/Properties.java new file mode 100644 index 000000000..ad31c10fb --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/block/properties/Properties.java @@ -0,0 +1,48 @@ +package net.momirealms.craftengine.core.block.properties; + +import net.momirealms.craftengine.core.registry.BuiltInRegistries; +import net.momirealms.craftengine.core.registry.Holder; +import net.momirealms.craftengine.core.registry.Registries; +import net.momirealms.craftengine.core.registry.WritableRegistry; +import net.momirealms.craftengine.core.util.Direction; +import net.momirealms.craftengine.core.util.HorizontalDirection; +import net.momirealms.craftengine.core.util.Key; +import net.momirealms.craftengine.core.util.ResourceKey; + +import java.util.Map; + +public class Properties { + public static final Key BOOLEAN = Key.of("craftengine:boolean"); + public static final Key INT = Key.of("craftengine:int"); + public static final Key STRING = Key.of("craftengine:string"); + public static final Key AXIS = Key.of("craftengine:axis"); + public static final Key HORIZONTAL_DIRECTION = Key.of("craftengine:4-direction"); + public static final Key DIRECTION = Key.of("craftengine:6-direction"); + + static { + register(BOOLEAN, BooleanProperty.FACTORY); + register(INT, IntegerProperty.FACTORY); + register(STRING, StringProperty.FACTORY); + register(AXIS, new EnumProperty.Factory<>(Direction.Axis.class)); + register(DIRECTION, new EnumProperty.Factory<>(Direction.class)); + register(HORIZONTAL_DIRECTION, new EnumProperty.Factory<>(HorizontalDirection.class)); + } + + public static void register(Key key, PropertyFactory factory) { + Holder.Reference holder = ((WritableRegistry) BuiltInRegistries.PROPERTY_FACTORY).registerForHolder(new ResourceKey<>(Registries.PROPERTY_FACTORY.location(), key)); + holder.bindValue(factory); + } + + public static Property fromMap(String name, Map map) { + String type = (String) map.getOrDefault("type", "empty"); + if (type == null) { + throw new NullPointerException("behavior type cannot be null"); + } + Key key = Key.withDefaultNamespace(type, "craftengine"); + PropertyFactory factory = BuiltInRegistries.PROPERTY_FACTORY.getValue(key); + if (factory == null) { + throw new IllegalArgumentException("Unknown property type: " + type); + } + return factory.create(name, map); + } +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/block/properties/Property.java b/core/src/main/java/net/momirealms/craftengine/core/block/properties/Property.java new file mode 100644 index 000000000..d85dc93d1 --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/block/properties/Property.java @@ -0,0 +1,118 @@ +package net.momirealms.craftengine.core.block.properties; + +import net.momirealms.sparrow.nbt.Tag; + +import javax.annotation.Nullable; +import java.util.List; +import java.util.Optional; +import java.util.concurrent.atomic.AtomicInteger; + +public abstract class Property> { + private final Class clazz; + private final String name; + @Nullable + private Integer hashCode; + + private static final AtomicInteger ID_GENERATOR = new AtomicInteger(); + private final int id; + private final T defaultValue; + private T[] byId; + private int defaultValueIndex; + + protected Property(String name, Class clazz, T defaultValue) { + this.clazz = clazz; + this.name = name; + this.id = ID_GENERATOR.getAndIncrement(); + this.defaultValue = defaultValue; + } + + public T defaultValue() { + return defaultValue; + } + + public int defaultValueIndex() { + return defaultValueIndex; + } + + public int id() { + return this.id; + } + + public T byId(int id) { + final T[] byId = this.byId; + return id < 0 || id >= byId.length ? null : this.byId[id]; + } + + protected void setById(T[] byId) { + if (this.byId != null) { + throw new IllegalStateException(); + } + this.byId = byId; + this.defaultValueIndex = indexOf(defaultValue); + } + + public Value value(T value) { + return new Value<>(this, value); + } + + public abstract int idFor(T value); + + public abstract String valueName(T value); + + public abstract List possibleValues(); + + public abstract Optional optional(String valueName); + + public abstract Optional createOptionalTag(String valueName); + + public abstract Tag pack(T value); + + public int indexOf(Tag tag) { + return indexOf(unpack(tag)); + } + + public abstract int indexOf(T value); + + public abstract T unpack(Tag tag); + + public String name() { + return this.name; + } + + public Class valueClass() { + return this.clazz; + } + + @Override + public boolean equals(Object object) { + return this == object; + } + + @Override + public final int hashCode() { + if (this.hashCode == null) { + this.hashCode = this.generateHashCode(); + } + return this.hashCode; + } + + protected int generateHashCode() { + return 31 * this.clazz.hashCode() + this.name.hashCode(); + } + + public record Value>(Property property, T value) { + public Value(Property property, T value) { + if (!property.possibleValues().contains(value)) { + throw new IllegalArgumentException("Value " + value + " does not belong to property " + property); + } else { + this.property = property; + this.value = value; + } + } + + @Override + public String toString() { + return this.property.name + "=" + this.property.valueName(this.value); + } + } +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/block/properties/PropertyFactory.java b/core/src/main/java/net/momirealms/craftengine/core/block/properties/PropertyFactory.java new file mode 100644 index 000000000..32ea8ee86 --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/block/properties/PropertyFactory.java @@ -0,0 +1,8 @@ +package net.momirealms.craftengine.core.block.properties; + +import java.util.Map; + +public interface PropertyFactory { + + Property create(String name, Map arguments); +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/block/properties/StringProperty.java b/core/src/main/java/net/momirealms/craftengine/core/block/properties/StringProperty.java new file mode 100644 index 000000000..ee1e88cff --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/block/properties/StringProperty.java @@ -0,0 +1,109 @@ +package net.momirealms.craftengine.core.block.properties; + +import com.google.common.collect.ImmutableMap; +import net.momirealms.craftengine.core.plugin.CraftEngine; +import net.momirealms.craftengine.core.util.MiscUtils; +import net.momirealms.sparrow.nbt.StringTag; +import net.momirealms.sparrow.nbt.Tag; + +import java.util.List; +import java.util.Locale; +import java.util.Map; +import java.util.Optional; + +public class StringProperty extends Property { + public static final Factory FACTORY = new Factory(); + private final List values; + private final ImmutableMap names; + + public StringProperty(String name, List values, String defaultValue) { + super(name, String.class, defaultValue); + + this.values = List.copyOf(values); + + ImmutableMap.Builder builder = ImmutableMap.builder(); + for (String value : values) { + builder.put(value, value); + } + this.names = builder.build(); + + this.setById(values.toArray(new String[0])); + } + + @Override + public List possibleValues() { + return this.values; + } + + @Override + public Optional optional(String valueName) { + return Optional.ofNullable(this.names.get(valueName.toLowerCase(Locale.ENGLISH))); + } + + @Override + public Optional createOptionalTag(String valueName) { + return optional(valueName).map(StringTag::new); + } + + @Override + public Tag pack(String value) { + return new StringTag(valueName(value)); + } + + @Override + public String unpack(Tag tag) { + if (tag instanceof StringTag stringTag) { + return names.get(stringTag.getAsString()); + } + throw new IllegalArgumentException("Invalid string tag: " + tag); + } + + @Override + public final int idFor(String value) { + int index = indexOf(value.toLowerCase(Locale.ENGLISH)); + if (index == -1) { + throw new IllegalArgumentException("Invalid value: " + value); + } + return index; + } + + @Override + public String valueName(String value) { + return value.toLowerCase(Locale.ENGLISH); + } + + @Override + public int indexOf(String value) { + return values.indexOf(value.toLowerCase(Locale.ENGLISH)); + } + + @Override + public int generateHashCode() { + int i = super.generateHashCode(); + return 31 * i + this.values.hashCode(); + } + + public static StringProperty create(String name, List values, String defaultValue) { + return new StringProperty(name, values, defaultValue); + } + + public static class Factory implements PropertyFactory { + + @Override + public Property create(String name, Map arguments) { + List values = MiscUtils.getAsStringList(arguments.get("values")) + .stream() + .map(it -> it.toLowerCase(Locale.ENGLISH)) + .toList(); + String defaultValueName = arguments.getOrDefault("default", "").toString().toLowerCase(Locale.ENGLISH); + String defaultValue = values.stream() + .filter(e -> e.toLowerCase(Locale.ENGLISH).equals(defaultValueName)) + .findFirst() + .orElseGet(() -> { + CraftEngine.instance().logger().warn("Invalid default value '" + defaultValueName + "' for property '" + name + "'"); + return values.getFirst(); + }); + return StringProperty.create(name, values, defaultValue); + } + } +} \ No newline at end of file diff --git a/core/src/main/java/net/momirealms/craftengine/core/entity/Entity.java b/core/src/main/java/net/momirealms/craftengine/core/entity/Entity.java new file mode 100644 index 000000000..57afad7cc --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/entity/Entity.java @@ -0,0 +1,25 @@ +package net.momirealms.craftengine.core.entity; + +import net.momirealms.craftengine.core.util.Direction; +import net.momirealms.craftengine.core.world.World; + +public abstract class Entity { + + public abstract double x(); + + public abstract double y(); + + public abstract double z(); + + public abstract void tick(); + + public abstract int entityID(); + + public abstract float getXRot(); + + public abstract float getYRot(); + + public abstract World level(); + + public abstract Direction getDirection(); +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/entity/EquipmentSlot.java b/core/src/main/java/net/momirealms/craftengine/core/entity/EquipmentSlot.java new file mode 100644 index 000000000..55c343103 --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/entity/EquipmentSlot.java @@ -0,0 +1,12 @@ +package net.momirealms.craftengine.core.entity; + +public enum EquipmentSlot { + HEAD, + CHEST, + LEGS, + FEET, + BODY, + MAIN_HAND, + OFF_HAND, + SADDLE +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/entity/furniture/AlignmentRule.java b/core/src/main/java/net/momirealms/craftengine/core/entity/furniture/AlignmentRule.java new file mode 100644 index 000000000..983ca8529 --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/entity/furniture/AlignmentRule.java @@ -0,0 +1,39 @@ +package net.momirealms.craftengine.core.entity.furniture; + +import net.momirealms.craftengine.core.util.Pair; + +import java.util.function.Function; + +public enum AlignmentRule { + ANY(Function.identity()), + CORNER(pair -> { + double p1 = (double) Math.round(pair.left()); + double p2 = (double) Math.round(pair.right()); + return new Pair<>(p1, p2); + }), + CENTER(pair -> { + double p1 = Math.floor(pair.left()) + 0.5; + double p2 = Math.floor(pair.right()) + 0.5; + return new Pair<>(p1, p2); + }), + HALF(pair -> { + double p1 = Math.round(pair.left() * 2) / 2.0; + double p2 = Math.round(pair.right() * 2) / 2.0; + return new Pair<>(p1, p2); + }), + QUARTER(pair -> { + double p1 = Math.round(pair.left() * 4) / 4.0; + double p2 = Math.round(pair.right() * 4) / 4.0; + return new Pair<>(p1, p2); + }); + + private final Function, Pair> function; + + AlignmentRule(Function, Pair> function) { + this.function = function; + } + + public Pair apply(final Pair pair) { + return function.apply(pair); + } +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/entity/furniture/AnchorType.java b/core/src/main/java/net/momirealms/craftengine/core/entity/furniture/AnchorType.java new file mode 100644 index 000000000..d3a099b6f --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/entity/furniture/AnchorType.java @@ -0,0 +1,21 @@ +package net.momirealms.craftengine.core.entity.furniture; + +public enum AnchorType { + GROUND(0), + WALL(1), + CEILING(2); + + private final int id; + + AnchorType(int id) { + this.id = id; + } + + public int getId() { + return id; + } + + public static AnchorType byId(int id) { + return values()[id]; + } +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/entity/furniture/Billboard.java b/core/src/main/java/net/momirealms/craftengine/core/entity/furniture/Billboard.java new file mode 100644 index 000000000..16545019d --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/entity/furniture/Billboard.java @@ -0,0 +1,18 @@ +package net.momirealms.craftengine.core.entity.furniture; + +public enum Billboard { + FIXED(0), + VERTICAL(1), + HORIZONTAL(2), + CENTER(3); + + private final byte id; + + Billboard(int index) { + this.id = (byte) index; + } + + public byte id() { + return id; + } +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/entity/furniture/CustomFurniture.java b/core/src/main/java/net/momirealms/craftengine/core/entity/furniture/CustomFurniture.java new file mode 100644 index 000000000..eb4a1b681 --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/entity/furniture/CustomFurniture.java @@ -0,0 +1,85 @@ +package net.momirealms.craftengine.core.entity.furniture; + +import net.momirealms.craftengine.core.loot.LootTable; +import net.momirealms.craftengine.core.util.Key; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +import java.util.EnumMap; + +public class CustomFurniture { + private final Key id; + private final FurnitureSettings settings; + private final EnumMap placements; + @Nullable + private final LootTable lootTable; + + public CustomFurniture(@NotNull Key id, + @NotNull FurnitureSettings settings, + @NotNull EnumMap placements, + @Nullable LootTable lootTable) { + this.id = id; + this.settings = settings; + this.placements = placements; + this.lootTable = lootTable; + } + + public Key id() { + return id; + } + + public EnumMap placements() { + return placements; + } + + public FurnitureSettings settings() { + return settings; + } + + @Nullable + public LootTable lootTable() { + return lootTable; + } + + public AnchorType getAnyPlacement() { + return placements.keySet().stream().findFirst().orElse(null); + } + + public boolean isAllowedPlacement(AnchorType anchorType) { + return placements.containsKey(anchorType); + } + + public Placement getPlacement(AnchorType anchorType) { + return placements.get(anchorType); + } + + public static class Placement { + private final FurnitureElement[] elements; + private final HitBox[] hitbox; + private final RotationRule rotationRule; + private final AlignmentRule alignmentRule; + + public Placement(FurnitureElement[] elements, HitBox[] hitbox, RotationRule rotationRule, AlignmentRule alignmentRule) { + this.elements = elements; + this.hitbox = hitbox; + this.rotationRule = rotationRule; + this.alignmentRule = alignmentRule; + } + + public HitBox[] hitbox() { + return hitbox; + } + + public FurnitureElement[] elements() { + return elements; + } + + public RotationRule rotationRule() { + return rotationRule; + } + + public AlignmentRule alignmentRule() { + return alignmentRule; + } + } +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/entity/furniture/FurnitureElement.java b/core/src/main/java/net/momirealms/craftengine/core/entity/furniture/FurnitureElement.java new file mode 100644 index 000000000..5e48e9c21 --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/entity/furniture/FurnitureElement.java @@ -0,0 +1,53 @@ +package net.momirealms.craftengine.core.entity.furniture; + +import net.momirealms.craftengine.core.util.Key; +import org.joml.Quaternionf; +import org.joml.Vector3f; + +public class FurnitureElement { + private final Key item; + private final Billboard billboard; + private final ItemDisplayContext transform; + private final Vector3f scale; + private final Vector3f translation; + private final Vector3f offset; + private final Quaternionf rotation; + + public FurnitureElement(Key item, Billboard billboard, ItemDisplayContext transform, Vector3f scale, Vector3f translation, Vector3f offset, Quaternionf rotation) { + this.billboard = billboard; + this.transform = transform; + this.scale = scale; + this.translation = translation; + this.item = item; + this.rotation = rotation; + this.offset = offset; + } + + public Quaternionf rotation() { + return rotation; + } + + public Key item() { + return item; + } + + public Billboard billboard() { + return billboard; + } + + public ItemDisplayContext transform() { + return transform; + } + + public Vector3f scale() { + return scale; + } + + public Vector3f translation() { + return translation; + } + + public Vector3f offset() { + return offset; + } +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/entity/furniture/FurnitureManager.java b/core/src/main/java/net/momirealms/craftengine/core/entity/furniture/FurnitureManager.java new file mode 100644 index 000000000..639a61bcf --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/entity/furniture/FurnitureManager.java @@ -0,0 +1,32 @@ +package net.momirealms.craftengine.core.entity.furniture; + +import net.momirealms.craftengine.core.pack.LoadingSequence; +import net.momirealms.craftengine.core.plugin.Reloadable; +import net.momirealms.craftengine.core.plugin.config.ConfigSectionParser; +import net.momirealms.craftengine.core.util.Key; + +import javax.annotation.Nullable; +import java.util.Optional; + +public interface FurnitureManager extends Reloadable, ConfigSectionParser { + String CONFIG_SECTION_NAME = "furniture"; + + void delayedInit(); + + @Override + default String sectionId() { + return CONFIG_SECTION_NAME; + } + + @Override + default int loadingSequence() { + return LoadingSequence.FURNITURE; + } + + Optional getFurniture(Key id); + + @Nullable + int[] getSubEntityIdsByBaseEntityId(int entityId); + + boolean isFurnitureBaseEntity(int entityId); +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/entity/furniture/FurnitureSettings.java b/core/src/main/java/net/momirealms/craftengine/core/entity/furniture/FurnitureSettings.java new file mode 100644 index 000000000..e1cdc66fb --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/entity/furniture/FurnitureSettings.java @@ -0,0 +1,91 @@ +package net.momirealms.craftengine.core.entity.furniture; + +import net.momirealms.craftengine.core.util.Key; +import net.momirealms.craftengine.core.util.MiscUtils; +import org.jetbrains.annotations.Nullable; + +import java.util.HashMap; +import java.util.Map; + +public class FurnitureSettings { + FurnitureSounds sounds = FurnitureSounds.EMPTY; + @Nullable + Key itemId; + + private FurnitureSettings() {} + + public static FurnitureSettings of() { + return new FurnitureSettings(); + } + + public static FurnitureSettings fromMap(Map map) { + return applyModifiers(FurnitureSettings.of(), map); + } + + public static FurnitureSettings ofFullCopy(FurnitureSettings settings) { + FurnitureSettings newSettings = of(); + newSettings.sounds = settings.sounds; + newSettings.itemId = settings.itemId; + return newSettings; + } + + public static FurnitureSettings applyModifiers(FurnitureSettings settings, Map map) { + for (Map.Entry entry : map.entrySet()) { + FurnitureSettings.Modifier.Factory factory = FurnitureSettings.Modifiers.FACTORIES.get(entry.getKey()); + if (factory != null) { + factory.createModifier(entry.getValue()).apply(settings); + } else { + throw new IllegalArgumentException("Unknown item settings key: " + entry.getKey()); + } + } + return settings; + } + + public FurnitureSounds sounds() { + return sounds; + } + + @Nullable + public Key itemId() { + return itemId; + } + + public FurnitureSettings sounds(FurnitureSounds sounds) { + this.sounds = sounds; + return this; + } + + public FurnitureSettings itemId(Key itemId) { + this.itemId = itemId; + return this; + } + + public interface Modifier { + + void apply(FurnitureSettings settings); + + interface Factory { + + FurnitureSettings.Modifier createModifier(Object value); + } + } + + public static class Modifiers { + private static final Map FACTORIES = new HashMap<>(); + + static { + registerFactory("sounds", (value -> { + Map sounds = MiscUtils.castToMap(value, false); + return settings -> settings.sounds(FurnitureSounds.fromMap(sounds)); + })); + registerFactory("item", (value -> { + String item = value.toString(); + return settings -> settings.itemId(Key.of(item)); + })); + } + + private static void registerFactory(String id, FurnitureSettings.Modifier.Factory factory) { + FACTORIES.put(id, factory); + } + } +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/entity/furniture/FurnitureSounds.java b/core/src/main/java/net/momirealms/craftengine/core/entity/furniture/FurnitureSounds.java new file mode 100644 index 000000000..fc4f1dfed --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/entity/furniture/FurnitureSounds.java @@ -0,0 +1,41 @@ +package net.momirealms.craftengine.core.entity.furniture; + +import net.momirealms.craftengine.core.util.Key; + +import java.util.Map; + +public class FurnitureSounds { + public static final Key EMPTY_SOUND = Key.of("minecraft:intentionally_empty"); + public static final FurnitureSounds EMPTY = new FurnitureSounds(EMPTY_SOUND, EMPTY_SOUND, EMPTY_SOUND); + + private final Key breakSound; + private final Key placeSound; + private final Key rotateSound; + + public FurnitureSounds(Key breakSound, Key placeSound, Key rotateSound) { + this.breakSound = breakSound; + this.placeSound = placeSound; + this.rotateSound = rotateSound; + } + + public static FurnitureSounds fromMap(Map map) { + if (map == null) return EMPTY; + return new FurnitureSounds( + Key.of(map.getOrDefault("break", "minecraft:intentionally_empty").toString()), + Key.of(map.getOrDefault("place", "minecraft:intentionally_empty").toString()), + Key.of(map.getOrDefault("rotate", "minecraft:intentionally_empty").toString()) + ); + } + + public Key breakSound() { + return breakSound; + } + + public Key placeSound() { + return placeSound; + } + + public Key rotateSound() { + return rotateSound; + } +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/entity/furniture/HitBox.java b/core/src/main/java/net/momirealms/craftengine/core/entity/furniture/HitBox.java new file mode 100644 index 000000000..1ec2c1c82 --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/entity/furniture/HitBox.java @@ -0,0 +1,33 @@ +package net.momirealms.craftengine.core.entity.furniture; + +import org.joml.Vector3f; + +public class HitBox { + private final Vector3f position; + private final Vector3f size; + private final Seat[] seats; + private final boolean responsive; + + public HitBox(Vector3f position, Vector3f size, Seat[] seats, boolean responsive) { + this.position = position; + this.size = size; + this.seats = seats; + this.responsive = responsive; + } + + public boolean responsive() { + return responsive; + } + + public Seat[] seats() { + return seats; + } + + public Vector3f offset() { + return position; + } + + public Vector3f size() { + return size; + } +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/entity/furniture/ItemDisplayContext.java b/core/src/main/java/net/momirealms/craftengine/core/entity/furniture/ItemDisplayContext.java new file mode 100644 index 000000000..2fbd54078 --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/entity/furniture/ItemDisplayContext.java @@ -0,0 +1,23 @@ +package net.momirealms.craftengine.core.entity.furniture; + +public enum ItemDisplayContext { + NONE(0), + THIRD_PERSON_LEFT_HAND(1), + THIRD_PERSON_RIGHT_HAND(2), + FIRST_PERSON_LEFT_HAND(3), + FIRST_PERSON_RIGHT_HAND(4), + HEAD(5), + GUI(6), + GROUND(7), + FIXED(8); + + private final byte id; + + ItemDisplayContext(int index) { + this.id = (byte) index; + } + + public byte id() { + return id; + } +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/entity/furniture/RotationRule.java b/core/src/main/java/net/momirealms/craftengine/core/entity/furniture/RotationRule.java new file mode 100644 index 000000000..e30a3d0b5 --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/entity/furniture/RotationRule.java @@ -0,0 +1,24 @@ +package net.momirealms.craftengine.core.entity.furniture; + +import java.util.function.Function; + +public enum RotationRule { + ANY(Function.identity()), + FOUR(yaw -> (float) (Math.round(yaw / 90) * 90)), + EIGHT(yaw -> (float) (Math.round(yaw / 45) * 45)), + SIXTEEN(yaw -> (float) (Math.round(yaw / 22.5) * 22.5)), + NORTH(__ -> 180f), + EAST(__ -> -90f), + WEST(__ -> 90f), + SOUTH(__ -> 0f); + + private final Function function; + + RotationRule(Function function) { + this.function = function; + } + + public float apply(float yaw) { + return function.apply(yaw); + } +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/entity/furniture/Seat.java b/core/src/main/java/net/momirealms/craftengine/core/entity/furniture/Seat.java new file mode 100644 index 000000000..885333703 --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/entity/furniture/Seat.java @@ -0,0 +1,23 @@ +package net.momirealms.craftengine.core.entity.furniture; + +import org.joml.Vector3f; + +import java.util.Objects; + +public record Seat(Vector3f offset, float yaw, boolean limitPlayerRotation) { + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (!(o instanceof Seat seat)) return false; + return Float.compare(yaw, seat.yaw) == 0 && Objects.equals(offset, seat.offset) && limitPlayerRotation == seat.limitPlayerRotation; + } + + @Override + public int hashCode() { + int result = Objects.hashCode(offset); + result = 31 * result + Float.hashCode(yaw); + result = 31 * result + Boolean.hashCode(limitPlayerRotation); + return result; + } +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/entity/player/InteractionHand.java b/core/src/main/java/net/momirealms/craftengine/core/entity/player/InteractionHand.java new file mode 100644 index 000000000..0e3edc552 --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/entity/player/InteractionHand.java @@ -0,0 +1,6 @@ +package net.momirealms.craftengine.core.entity.player; + +public enum InteractionHand { + MAIN_HAND, + OFF_HAND +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/entity/player/InteractionResult.java b/core/src/main/java/net/momirealms/craftengine/core/entity/player/InteractionResult.java new file mode 100644 index 000000000..bb586139d --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/entity/player/InteractionResult.java @@ -0,0 +1,8 @@ +package net.momirealms.craftengine.core.entity.player; + +public enum InteractionResult { + FAIL, + SUCCESS, + PASS, + SUCCESS_AND_CANCEL +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/entity/player/Player.java b/core/src/main/java/net/momirealms/craftengine/core/entity/player/Player.java new file mode 100644 index 000000000..3f236352e --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/entity/player/Player.java @@ -0,0 +1,69 @@ +package net.momirealms.craftengine.core.entity.player; + +import net.kyori.adventure.text.Component; +import net.momirealms.craftengine.core.entity.Entity; +import net.momirealms.craftengine.core.item.Item; +import net.momirealms.craftengine.core.plugin.network.NetWorkUser; +import net.momirealms.craftengine.core.util.Key; +import net.momirealms.craftengine.core.world.BlockPos; +import org.jetbrains.annotations.Nullable; + +public abstract class Player extends Entity implements NetWorkUser { + + public abstract boolean isSecondaryUseActive(); + + @Nullable + public abstract Item getItemInHand(InteractionHand hand); + + @Override + public abstract Object platformPlayer(); + + @Override + public abstract Object serverPlayer(); + + public abstract float getDestroyProgress(Object blockState, BlockPos pos); + + public abstract void stopMiningBlock(); + + public abstract void abortMiningBlock(); + + public abstract double getInteractionRange(); + + public abstract void abortDestroyProgress(); + + public abstract void onSwingHand(); + + public abstract boolean isMiningBlock(); + + public abstract boolean shouldSyncAttribute(); + + public abstract boolean isSneaking(); + + public abstract boolean isCreativeMode(); + + public abstract boolean isSpectatorMode(); + + public abstract boolean isAdventureMode(); + + public abstract void sendActionBar(Component text); + + public abstract boolean updateLastSuccessfulInteractionTick(int tick); + + public abstract int gameTicks(); + + public abstract void swingHand(InteractionHand hand); + + public abstract boolean hasPermission(String permission); + + public abstract boolean canInstabuild(); + + public abstract String name(); + + public void playSound(Key sound) { + playSound(sound, 1, 1); + } + + public abstract void playSound(Key sound, float volume, float pitch); + + public abstract void giveItem(Item item); +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/font/BitmapImage.java b/core/src/main/java/net/momirealms/craftengine/core/font/BitmapImage.java new file mode 100644 index 000000000..bc96bd66b --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/font/BitmapImage.java @@ -0,0 +1,99 @@ +package net.momirealms.craftengine.core.font; + +import com.google.gson.JsonArray; +import com.google.gson.JsonObject; +import net.kyori.adventure.text.Component; +import net.momirealms.craftengine.core.util.CharacterUtils; +import net.momirealms.craftengine.core.util.Key; + +public class BitmapImage implements FontProvider { + private final Key imageId; + private final Key font; + private final int height; + private final int ascent; + private final String file; + private final int[][] codepointGrid; + + public BitmapImage(Key imageId, Key font, int height, int ascent, String file, int[][] codepointGrid) { + this.imageId = imageId; + this.font = font; + this.height = height; + this.ascent = ascent; + this.file = file; + this.codepointGrid = codepointGrid; + } + + public int height() { + return height; + } + + public int ascent() { + return ascent; + } + + public String file() { + return file; + } + + public Key font() { + return font; + } + + public Key imageId() { + return imageId; + } + + public int[][] codepointGrid() { + return codepointGrid; + } + + public int codepointAt(int row, int column) { + if (row < 0 || row >= codepointGrid.length || column < 0 || column >= codepointGrid[row].length) { + throw new IndexOutOfBoundsException("Invalid index: (" + row + ", " + column + ")"); + } + return codepointGrid[row][column]; + } + + @SuppressWarnings("all") + public Component componentAt(int row, int column) { + int codepoint = codepointAt(row, column); + return Component.text(new String(Character.toChars(codepoint))).font(net.kyori.adventure.key.Key.key(font().toString())); + } + + public boolean isValidCoordinate(int row, int column) { + return row >= 0 && row < codepointGrid.length && column >= 0 && column < codepointGrid[row].length; + } + + @Override + public boolean equals(Object object) { + if (this == object) return true; + if (object == null || getClass() != object.getClass()) return false; + BitmapImage image = (BitmapImage) object; + return imageId.equals(image.imageId); + } + + @Override + public int hashCode() { + return imageId.hashCode(); + } + + @Override + public JsonObject getJson() { + JsonObject jsonObject = new JsonObject(); + jsonObject.addProperty("type", "bitmap"); + jsonObject.addProperty("height", height); + jsonObject.addProperty("ascent", ascent); + jsonObject.addProperty("file", file); + JsonArray charArray = new JsonArray(); + jsonObject.add("chars", charArray); + for (int[] codepoints : codepointGrid) { + StringBuilder stringBuilder = new StringBuilder(); + for (int codepoint : codepoints) { + stringBuilder.append(CharacterUtils.encodeCharsToUnicode(Character.toChars(codepoint))); + } + // to deceive Gson + charArray.add(stringBuilder.toString()); + } + return jsonObject; + } +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/font/EmojiManager.java b/core/src/main/java/net/momirealms/craftengine/core/font/EmojiManager.java new file mode 100644 index 000000000..868846fd6 --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/font/EmojiManager.java @@ -0,0 +1,9 @@ +package net.momirealms.craftengine.core.font; + +import net.momirealms.craftengine.core.plugin.config.ConfigSectionParser; + +public interface EmojiManager extends ConfigSectionParser { + String CONFIG_SECTION_NAME = "emojis"; + + +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/font/Font.java b/core/src/main/java/net/momirealms/craftengine/core/font/Font.java new file mode 100644 index 000000000..ffc3f6dd2 --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/font/Font.java @@ -0,0 +1,50 @@ +package net.momirealms.craftengine.core.font; + +import net.momirealms.craftengine.core.util.Key; + +import java.util.Collection; +import java.util.HashMap; +import java.util.LinkedHashMap; + +public class Font { + private final Key key; + private final HashMap idToCodepoint = new LinkedHashMap<>(); + + public Font(Key key) { + this.key = key; + } + + public boolean isCodepointInUse(int codepoint) { + if (codepoint == 0) return false; + return this.idToCodepoint.containsKey(codepoint); + } + + public BitmapImage getImageByCodepoint(int codepoint) { + return this.idToCodepoint.get(codepoint); + } + + public void registerCodepoint(int codepoint, BitmapImage image) { + this.idToCodepoint.put(codepoint, image); + } + + public Key key() { + return key; + } + + public Collection bitmapImages() { + return idToCodepoint.values().stream().distinct().toList(); + } + + @Override + public boolean equals(Object object) { + if (this == object) return true; + if (object == null || getClass() != object.getClass()) return false; + Font font = (Font) object; + return key.equals(font.key); + } + + @Override + public int hashCode() { + return key.hashCode(); + } +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/font/FontProvider.java b/core/src/main/java/net/momirealms/craftengine/core/font/FontProvider.java new file mode 100644 index 000000000..1a2621a38 --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/font/FontProvider.java @@ -0,0 +1,8 @@ +package net.momirealms.craftengine.core.font; + +import com.google.gson.JsonObject; + +public interface FontProvider { + + JsonObject getJson(); +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/font/ImageManager.java b/core/src/main/java/net/momirealms/craftengine/core/font/ImageManager.java new file mode 100644 index 000000000..c4916334c --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/font/ImageManager.java @@ -0,0 +1,64 @@ +package net.momirealms.craftengine.core.font; + +import net.momirealms.craftengine.core.pack.LoadingSequence; +import net.momirealms.craftengine.core.plugin.Reloadable; +import net.momirealms.craftengine.core.plugin.config.ConfigSectionParser; +import net.momirealms.craftengine.core.util.CharacterUtils; +import net.momirealms.craftengine.core.util.FormatUtils; +import net.momirealms.craftengine.core.util.Key; + +import java.util.Collection; +import java.util.Optional; +import java.util.function.BiFunction; + +public interface ImageManager extends Reloadable, ConfigSectionParser { + String CONFIG_SECTION_NAME = "images"; + + default String sectionId() { + return CONFIG_SECTION_NAME; + } + + Collection fontsInUse(); + + Optional bitmapImageByCodepoint(Key font, int codepoint); + + default Optional getBitmapImageByChars(Key font, char[] chars) { + return bitmapImageByCodepoint(font, CharacterUtils.charsToCodePoint(chars)); + } + + Optional bitmapImageByImageId(Key imageId); + + Optional getFontInUse(Key font); + + int codepointByImageId(Key imageId, int x, int y); + + default int codepointByImageId(Key imageId) { + return this.codepointByImageId(imageId, 0, 0); + } + + default char[] getCharsByImageId(Key imageId) { + return getCharsByImageId(imageId, 0, 0); + } + + default char[] getCharsByImageId(Key imageId, int x, int y) { + return Character.toChars(this.codepointByImageId(imageId, x, y)); + } + + String createOffsets(int offset, BiFunction tagFormatter); + + default String createMiniMessageOffsets(int offset) { + return createOffsets(offset, FormatUtils::miniMessageFont); + } + + default String createMineDownOffsets(int offset) { + return createOffsets(offset, FormatUtils::mineDownFont); + } + + default String createRawOffsets(int offset) { + return createOffsets(offset, (raw, font) -> raw); + } + + default int loadingSequence() { + return LoadingSequence.FONT; + } +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/font/ImageManagerImpl.java b/core/src/main/java/net/momirealms/craftengine/core/font/ImageManagerImpl.java new file mode 100644 index 000000000..4c4436362 --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/font/ImageManagerImpl.java @@ -0,0 +1,153 @@ +package net.momirealms.craftengine.core.font; + +import net.momirealms.craftengine.core.pack.Pack; +import net.momirealms.craftengine.core.plugin.CraftEngine; +import net.momirealms.craftengine.core.util.CharacterUtils; +import net.momirealms.craftengine.core.util.Key; +import net.momirealms.craftengine.core.util.MiscUtils; +import net.momirealms.craftengine.core.util.PreConditions; + +import java.nio.file.Files; +import java.nio.file.Path; +import java.util.*; +import java.util.function.BiFunction; + +public class ImageManagerImpl implements ImageManager { + private final CraftEngine plugin; + // namespace:font font + private final HashMap fonts = new HashMap<>(); + // namespace:id image + private final HashMap images = new HashMap<>(); + + private OffsetFont offsetFont; + + public ImageManagerImpl(CraftEngine plugin) { + this.plugin = plugin; + } + + @Override + public void load() { + this.offsetFont = Optional.ofNullable(plugin.configManager().settings().getSection("offset-characters")) + .map(OffsetFont::new) + .orElse(null); + } + + @Override + public void unload() { + this.fonts.clear(); + this.images.clear(); + } + + @Override + public void parseSection(Pack pack, Path path, Key id, Map section) { + int height = MiscUtils.getAsInt(section.get("height")); + int ascent = MiscUtils.getAsInt(section.get("ascent")); + if (PreConditions.runIfTrue(height < ascent, + () -> this.plugin.logger().warn(path, "Illegal ascent found at " + id + ". Height should be no lower than ascent"))) return; + + String file = (String) section.get("file"); + if (PreConditions.isNull(file, + () -> this.plugin.logger().warn(path, "`file` option is not set in image " + id))) return; + + String fontName = (String) section.getOrDefault("font", "minecraft:default"); + if (PreConditions.isNull(fontName, + () -> this.plugin.logger().warn(path, "`font` option is not set in image " + id))) return; + + Key fontKey = Key.withDefaultNamespace(fontName, id.namespace()); + // get the font + Font font = this.getOrCreateFont(fontKey); + List chars; + if (section.containsKey("chars")) { + chars = MiscUtils.getAsStringList(section.get("chars")).stream().map(it -> { + if (it.startsWith("\\u")) { + return CharacterUtils.decodeUnicodeToChars(it); + } else { + return it.toCharArray(); + } + }).toList(); + } else { + String character = (String) section.get("char"); + if (PreConditions.isNull(character, + () -> this.plugin.logger().warn(path, "`char` option is not set in image " + id))) return; + if (character.length() == 1) { + chars = List.of(character.toCharArray()); + } else { + chars = List.of(CharacterUtils.decodeUnicodeToChars(character)); + } + } + + int size = -1; + int[][] codepointGrid = new int[chars.size()][]; + for (int i = 0; i < chars.size(); ++i) { + int[] codepoints = CharacterUtils.charsToCodePoints(chars.get(i)); + for (int codepoint : codepoints) { + if (PreConditions.runIfTrue(font.isCodepointInUse(codepoint), + () -> this.plugin.logger().warn(path, String.format("Codepoint [%s] is already used in font [%s]", CharacterUtils.encodeCharsToUnicode(Character.toChars(codepoint)), font.key().toString())))) return; + } + codepointGrid[i] = codepoints; + if (size == -1) size = codepoints.length; + if (PreConditions.runIfTrue(size != codepoints.length, + () -> this.plugin.logger().warn(path, "Illegal chars format found at " + id))) return; + } + + if (PreConditions.runIfTrue(size == -1, + () -> this.plugin.logger().warn(path, "Illegal chars format found at " + id))) return; + + if (!file.endsWith(".png")) file += ".png"; + file = file.replace("\\", "/"); + Key namespacedPath = Key.of(file); + Path targetImageFile = pack.resourcePackFolder() + .resolve("assets") + .resolve(namespacedPath.namespace()) + .resolve("textures") + .resolve(namespacedPath.value()); + + if (PreConditions.runIfTrue(!Files.exists(targetImageFile), + () -> this.plugin.logger().warn(targetImageFile, "PNG file not found for image " + id))) return; + + BitmapImage bitmapImage = new BitmapImage(id, fontKey, height, ascent, file, codepointGrid); + for (int[] y : codepointGrid) { + for (int x : y) { + font.registerCodepoint(x, bitmapImage); + } + } + + this.images.put(id, bitmapImage); + } + + @Override + public Collection fontsInUse() { + return new ArrayList<>(this.fonts.values()); + } + + @Override + public Optional bitmapImageByCodepoint(Key font, int codepoint) { + return getFontInUse(font).map(f -> f.getImageByCodepoint(codepoint)); + } + + @Override + public Optional bitmapImageByImageId(Key id) { + return Optional.ofNullable(this.images.get(id)); + } + + @Override + public int codepointByImageId(Key key, int x, int y) { + BitmapImage image = this.images.get(key); + if (image == null) return -1; + return image.codepointAt(x, y); + } + + @Override + public String createOffsets(int offset, BiFunction tagFormatter) { + return Optional.ofNullable(this.offsetFont).map(it -> it.createOffset(offset, tagFormatter)).orElse(""); + } + + @Override + public Optional getFontInUse(Key key) { + return Optional.ofNullable(fonts.get(key)); + } + + private Font getOrCreateFont(Key key) { + return this.fonts.computeIfAbsent(key, Font::new); + } +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/font/OffsetFont.java b/core/src/main/java/net/momirealms/craftengine/core/font/OffsetFont.java new file mode 100644 index 000000000..eaa5e9444 --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/font/OffsetFont.java @@ -0,0 +1,153 @@ +package net.momirealms.craftengine.core.font; + +import com.github.benmanes.caffeine.cache.Cache; +import com.github.benmanes.caffeine.cache.Caffeine; +import dev.dejvokep.boostedyaml.block.implementation.Section; +import net.momirealms.craftengine.core.util.CharacterUtils; + +import java.util.concurrent.TimeUnit; +import java.util.function.BiFunction; + +public class OffsetFont { + private final String font; + + private final String NEG_16; + private final String NEG_24; + private final String NEG_32; + private final String NEG_48; + private final String NEG_64; + private final String NEG_128; + private final String NEG_256; + + private final String POS_16; + private final String POS_24; + private final String POS_32; + private final String POS_48; + private final String POS_64; + private final String POS_128; + private final String POS_256; + + private final String[] negativeOffsets = new String[16]; + private final String[] positiveOffsets = new String[16]; + + private final Cache fastLookup = Caffeine.newBuilder() + .expireAfterWrite(5, TimeUnit.MINUTES) + .maximumSize(256) + .build(); + + public OffsetFont(Section section) { + font = section.getString("font", "minecraft:default"); + + NEG_16 = convertIfUnicode(section.getString("-16", "")); + NEG_24 = convertIfUnicode(section.getString("-24", "")); + NEG_32 = convertIfUnicode(section.getString("-32", "")); + NEG_48 = convertIfUnicode(section.getString("-48", "")); + NEG_64 = convertIfUnicode(section.getString("-64", "")); + NEG_128 = convertIfUnicode(section.getString("-128", "")); + NEG_256 = convertIfUnicode(section.getString("-256", "")); + POS_16 = convertIfUnicode(section.getString("16", "")); + POS_24 = convertIfUnicode(section.getString("24", "")); + POS_32 = convertIfUnicode(section.getString("32", "")); + POS_48 = convertIfUnicode(section.getString("48", "")); + POS_64 = convertIfUnicode(section.getString("64", "")); + POS_128 = convertIfUnicode(section.getString("128", "")); + POS_256 = convertIfUnicode(section.getString("256", "")); + + for (int i = 1; i <= 15; i++) { + negativeOffsets[i] = convertIfUnicode(section.getString("-" + i, "")); + positiveOffsets[i] = convertIfUnicode(section.getString(String.valueOf(i), "")); + } + } + + public String createOffset(int offset, BiFunction tagDecorator) { + if (offset == 0) return ""; + String raw = fastLookup.get(offset, k -> { + if (k > 0) { + return createPos(k); + } else { + return createNeg(-k); + } + }); + return tagDecorator.apply(raw, font); + } + + @SuppressWarnings("DuplicatedCode") + private String createPos(int offset) { + StringBuilder stringBuilder = new StringBuilder(); + while (offset >= 256) { + stringBuilder.append(POS_256); + offset -= 256; + } + if (offset >= 128) { + stringBuilder.append(POS_128); + offset -= 128; + } + if (offset >= 64) { + stringBuilder.append(POS_64); + offset -= 64; + } + if (offset >= 48) { + stringBuilder.append(POS_48); + offset -= 48; + } + if (offset >= 32) { + stringBuilder.append(POS_32); + offset -= 32; + } + if (offset >= 24) { + stringBuilder.append(POS_24); + offset -= 24; + } + if (offset >= 16) { + stringBuilder.append(POS_16); + offset -= 16; + } + if (offset == 0) return stringBuilder.toString(); + stringBuilder.append(positiveOffsets[offset]); + return stringBuilder.toString(); + } + + @SuppressWarnings("DuplicatedCode") + private String createNeg(int offset) { + StringBuilder stringBuilder = new StringBuilder(); + while (offset >= 256) { + stringBuilder.append(NEG_256); + offset -= 256; + } + if (offset >= 128) { + stringBuilder.append(NEG_128); + offset -= 128; + } + if (offset >= 64) { + stringBuilder.append(NEG_64); + offset -= 64; + } + if (offset >= 48) { + stringBuilder.append(NEG_48); + offset -= 48; + } + if (offset >= 32) { + stringBuilder.append(NEG_32); + offset -= 32; + } + if (offset >= 24) { + stringBuilder.append(NEG_24); + offset -= 24; + } + if (offset >= 16) { + stringBuilder.append(NEG_16); + offset -= 16; + } + if (offset == 0) return stringBuilder.toString(); + stringBuilder.append(negativeOffsets[offset]); + return stringBuilder.toString(); + } + + private String convertIfUnicode(String s) { + if (s.startsWith("\\u")) { + return new String(CharacterUtils.decodeUnicodeToChars(font)); + } else { + return s; + } + } +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/item/AbstractItem.java b/core/src/main/java/net/momirealms/craftengine/core/item/AbstractItem.java new file mode 100644 index 000000000..e3edb3355 --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/item/AbstractItem.java @@ -0,0 +1,268 @@ +package net.momirealms.craftengine.core.item; + +import net.momirealms.craftengine.core.item.behavior.ItemBehavior; +import net.momirealms.craftengine.core.util.Key; + +import java.util.List; +import java.util.Optional; + +public class AbstractItem, I> implements Item { + private final ItemFactory factory; + private final ItemWrapper item; + + AbstractItem(ItemFactory factory, ItemWrapper item) { + this.factory = factory; + this.item = item; + } + + @Override + public Item damage(Integer data) { + this.factory.damage(this.item, data); + return this; + } + + @Override + public Optional damage() { + return this.factory.damage(this.item); + } + + @Override + public Item maxDamage(Integer data) { + this.factory.maxDamage(this.item, data); + return this; + } + + @Override + public Optional maxDamage() { + return this.factory.maxDamage(this.item); + } + + @SuppressWarnings("unchecked") + @Override + public Optional> getCustomItem() { + return ((ItemManager) factory.plugin.itemManager()).getCustomItem(id()); + } + + @Override + public Optional> getItemBehavior() { + return factory.plugin.itemManager().getItemBehavior(id()); + } + + @Override + public boolean isCustomItem() { + return factory.plugin.itemManager().getCustomItem(id()).isPresent(); + } + + @Override + public boolean isBlockItem() { + return factory.isBlockItem(item); + } + + @Override + public Key id() { + return this.factory.id(this.item); + } + + @Override + public Key vanillaId() { + return this.factory.vanillaId(this.item); + } + + @Override + public Optional customId() { + return this.factory.customId(this.item); + } + + @Override + public int count() { + return this.item.count(); + } + + @Override + public Item count(int amount) { + this.item.count(amount); + return this; + } + + @Override + public Item customModelData(Integer data) { + this.factory.customModelData(this.item, data); + return this; + } + + @Override + public Optional customModelData() { + return this.factory.customModelData(this.item); + } + + @Override + public Optional displayName() { + return this.factory.displayName(this.item); + } + + @Override + public Optional itemName() { + return this.factory.itemName(this.item); + } + + @Override + public Item lore(List lore) { + this.factory.lore(this.item, lore); + return this; + } + + @Override + public Optional> lore() { + return this.factory.lore(this.item); + } + + @Override + public Item unbreakable(boolean unbreakable) { + this.factory.unbreakable(this.item, unbreakable); + return this; + } + + @Override + public boolean unbreakable() { + return this.factory.unbreakable(this.item); + } + + @Override + public Item displayName(String displayName) { + this.factory.displayName(this.item, displayName); + return this; + } + @Override + public Item itemName(String itemName) { + this.factory.itemName(this.item, itemName); + return this; + } + + @Override + public Item skull(String data) { + this.factory.skull(this.item, data); + return this; + } + + @Override + public Optional getEnchantment(Key enchantmentId) { + return this.factory.getEnchantment(this.item, enchantmentId); + } + + @Override + public Item setEnchantments(List enchantments) { + this.factory.enchantments(this.item, enchantments); + return this; + } + + @Override + public Item addEnchantment(Enchantment enchantment) { + this.factory.addEnchantment(this.item, enchantment); + return this; + } + + @Override + public Item setStoredEnchantments(List enchantments) { + this.factory.storedEnchantments(this.item, enchantments); + return this; + } + + @Override + public Item addStoredEnchantment(Enchantment enchantment) { + this.factory.addStoredEnchantment(this.item, enchantment); + return this; + } + + @Override + public int maxStackSize() { + return this.factory.maxStackSize(this.item); + } + + @Override + public Item maxStackSize(int amount) { + this.factory.maxStackSize(this.item, amount); + return this; + } + + @Override + public Item itemFlags(List flags) { + this.factory.itemFlags(this.item, flags); + return this; + } + + @Override + public Object getTag(Object... path) { + return this.factory.getTag(this.item, path); + } + + @Override + public Item setTag(Object value, Object... path) { + this.factory.setTag(this.item, value, path); + return this; + } + + @Override + public boolean hasTag(Object... path) { + return this.factory.hasTag(this.item, path); + } + + @Override + public boolean removeTag(Object... path) { + return this.factory.removeTag(this.item, path); + } + + @Override + public boolean hasComponent(String type) { + return this.factory.hasComponent(this.item, type); + } + + @Override + public void removeComponent(String type) { + this.factory.removeComponent(this.item, type); + } + + @Override + public Object getComponent(String type) { + return this.factory.getComponent(this.item, type); + } + + @Override + public void setComponent(String type, Object value) { + this.factory.setComponent(this.item, type, value); + } + + @Override + public I getItem() { + return this.factory.getItem(this.item); + } + + @Override + public I load() { + return this.factory.load(this.item); + } + + @Override + public I loadCopy() { + return this.factory.loadCopy(this.item); + } + + @Override + public void update() { + this.factory.update(this.item); + } + + @Override + public Item copyWithCount(int count) { + return new AbstractItem<>(this.factory, this.item.copyWithCount(count)); + } + + @Override + public boolean is(Key itemTag) { + return this.factory.is(this.item, itemTag); + } + + @Override + public Object getLiteralObject() { + return this.item.getLiteralObject(); + } +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/item/AbstractItemManager.java b/core/src/main/java/net/momirealms/craftengine/core/item/AbstractItemManager.java new file mode 100644 index 000000000..bf8c35676 --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/item/AbstractItemManager.java @@ -0,0 +1,92 @@ +package net.momirealms.craftengine.core.item; + +import net.momirealms.craftengine.core.item.modifier.*; +import net.momirealms.craftengine.core.pack.model.generator.AbstractModelGenerator; +import net.momirealms.craftengine.core.plugin.CraftEngine; +import net.momirealms.craftengine.core.util.Key; +import net.momirealms.craftengine.core.util.MiscUtils; +import net.momirealms.craftengine.core.util.TypeUtils; +import net.momirealms.craftengine.core.util.VersionHelper; + +import java.util.*; +import java.util.function.Function; + +public abstract class AbstractItemManager extends AbstractModelGenerator implements ItemManager { + protected final Map>> dataFunctions = new HashMap<>(); + protected final Map> customItems = new HashMap<>(); + + private void registerDataFunction(Function> function, String... alias) { + for (String a : alias) { + dataFunctions.put(a, function); + } + } + + @Override + public void unload() { + this.customItems.clear(); + super.clearModelsToGenerate(); + } + + @Override + public Optional> getCustomItem(Key key) { + return Optional.ofNullable(this.customItems.get(key)); + } + + public AbstractItemManager(CraftEngine plugin) { + super(plugin); + this.registerFunctions(); + } + + private void registerFunctions() { + registerDataFunction((obj) -> { + String name = obj.toString(); + return new DisplayNameModifier<>(name); + }, "name", "display-name", "custom-name"); + registerDataFunction((obj) -> { + List name = MiscUtils.getAsStringList(obj); + return new LoreModifier<>(name); + }, "lore", "display-lore", "description"); + registerDataFunction((obj) -> { + Map data = MiscUtils.castToMap(obj, false); + return new TagsModifier<>(data); + }, "tags", "tag", "nbt"); + registerDataFunction((obj) -> { + boolean value = TypeUtils.checkType(obj, Boolean.class); + return new UnbreakableModifier<>(value); + }, "unbreakable"); + registerDataFunction((obj) -> { + Map data = MiscUtils.castToMap(obj, false); + List enchantments = new ArrayList<>(); + for (Map.Entry e : data.entrySet()) { + if (e.getValue() instanceof Number number) { + enchantments.add(new Enchantment(Key.of(e.getKey()), number.intValue())); + } + } + return new EnchantmentModifier<>(enchantments); + }, "enchantment", "enchantments", "enchant"); + if (VersionHelper.isVersionNewerThan1_20_5()) { + registerDataFunction((obj) -> { + String name = obj.toString(); + return new ItemNameModifier<>(name); + }, "item-name"); + } + if (VersionHelper.isVersionNewerThan1_20_5()) { + registerDataFunction((obj) -> { + Map data = MiscUtils.castToMap(obj, false); + return new ComponentModifier<>(data); + }, "components", "component"); + } + if (VersionHelper.isVersionNewerThan1_21()) { + registerDataFunction((obj) -> { + String song = obj.toString(); + return new JukeboxSongModifier<>(Key.of(song)); + }, "jukebox-playable"); + } + if (VersionHelper.isVersionNewerThan1_21_2()) { + registerDataFunction((obj) -> { + String id = obj.toString(); + return new TooltipStyleModifier<>(Key.of(id)); + }, "tooltip-style"); + } + } +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/item/BuildableItem.java b/core/src/main/java/net/momirealms/craftengine/core/item/BuildableItem.java new file mode 100644 index 000000000..3f755d6b1 --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/item/BuildableItem.java @@ -0,0 +1,32 @@ +package net.momirealms.craftengine.core.item; + +import net.momirealms.craftengine.core.entity.player.Player; +import net.momirealms.craftengine.core.util.Key; +import net.momirealms.craftengine.core.util.context.ContextHolder; + +public interface BuildableItem { + + Key id(); + + I buildItemStack(ItemBuildContext context, int count); + + default I buildItemStack(ItemBuildContext context) { + return buildItemStack(context, 1); + } + + default I buildItemStack() { + return buildItemStack(ItemBuildContext.EMPTY, 1); + } + + default I buildItemStack(int count) { + return buildItemStack(ItemBuildContext.EMPTY, count); + } + + default I buildItemStack(Player player) { + return this.buildItemStack(new ItemBuildContext(player, ContextHolder.EMPTY), 1); + } + + default I buildItemStack(Player player, int count) { + return this.buildItemStack(new ItemBuildContext(player, ContextHolder.EMPTY), count); + } +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/item/ComponentKeys.java b/core/src/main/java/net/momirealms/craftengine/core/item/ComponentKeys.java new file mode 100644 index 000000000..a7fce729f --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/item/ComponentKeys.java @@ -0,0 +1,21 @@ +package net.momirealms.craftengine.core.item; + +import net.kyori.adventure.key.Key; + +public class ComponentKeys { + public static final String CUSTOM_MODEL_DATA = Key.key("minecraft", "custom_model_data").asString(); + public static final String CUSTOM_NAME = Key.key("minecraft", "custom_name").asString(); + public static final String ITEM_NAME = Key.key("minecraft", "item_name").asString(); + public static final String LORE = Key.key("minecraft", "lore").asString(); + public static final String DAMAGE = Key.key("minecraft", "damage").asString(); + public static final String MAX_DAMAGE = Key.key("minecraft", "max_damage").asString(); + public static final String ENCHANTMENT_GLINT_OVERRIDE = Key.key("minecraft", "enchantment_glint_override").asString(); + public static final String ENCHANTMENTS = Key.key("minecraft", "enchantments").asString(); + public static final String STORED_ENCHANTMENTS = Key.key("minecraft", "stored_enchantments").asString(); + public static final String UNBREAKABLE = Key.key("minecraft", "unbreakable").asString(); + public static final String MAX_STACK_SIZE = Key.key("minecraft", "max_stack_size").asString(); + public static final String EQUIPPABLE = Key.key("minecraft", "equippable").asString(); + public static final String ITEM_MODEL = Key.key("minecraft", "item_model").asString(); + public static final String TOOLTIP_STYLE = Key.key("minecraft", "tooltip_style").asString(); + public static final String JUKEBOX_PLAYABLE = Key.key("minecraft", "jukebox_playable").asString(); +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/item/CustomItem.java b/core/src/main/java/net/momirealms/craftengine/core/item/CustomItem.java new file mode 100644 index 000000000..e3dabdc37 --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/item/CustomItem.java @@ -0,0 +1,48 @@ +package net.momirealms.craftengine.core.item; + +import net.momirealms.craftengine.core.entity.player.Player; +import net.momirealms.craftengine.core.item.behavior.ItemBehavior; +import net.momirealms.craftengine.core.item.modifier.ItemModifier; +import net.momirealms.craftengine.core.util.Key; +import net.momirealms.craftengine.core.util.context.ContextHolder; +import org.jetbrains.annotations.NotNull; + +import java.util.List; + +public interface CustomItem extends BuildableItem { + + Key id(); + + Key material(); + + List> modifiers(); + + ItemSettings settings(); + + default Item buildItem(Player player) { + return buildItem(new ItemBuildContext(player, ContextHolder.EMPTY)); + } + + Item buildItem(ItemBuildContext context); + + @NotNull + List behaviors(); + + interface Builder { + Builder id(Key id); + + Builder material(Key material); + + Builder modifiers(List> modifiers); + + Builder modifier(ItemModifier modifier); + + Builder behavior(ItemBehavior behavior); + + Builder behavior(List behaviors); + + Builder settings(ItemSettings settings); + + CustomItem build(); + } +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/item/Enchantment.java b/core/src/main/java/net/momirealms/craftengine/core/item/Enchantment.java new file mode 100644 index 000000000..80cb64a05 --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/item/Enchantment.java @@ -0,0 +1,6 @@ +package net.momirealms.craftengine.core.item; + +import net.momirealms.craftengine.core.util.Key; + +public record Enchantment(Key id, int level) { +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/item/EquipmentData.java b/core/src/main/java/net/momirealms/craftengine/core/item/EquipmentData.java new file mode 100644 index 000000000..8c09a403e --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/item/EquipmentData.java @@ -0,0 +1,136 @@ +package net.momirealms.craftengine.core.item; + +import net.momirealms.craftengine.core.entity.EquipmentSlot; +import net.momirealms.craftengine.core.util.Key; +import net.momirealms.craftengine.core.util.VersionHelper; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +import java.util.HashMap; +import java.util.Map; + +public class EquipmentData { + @NotNull + private final EquipmentSlot slot; + @Nullable + private final Key assetId; + private final boolean dispensable; + private final boolean swappable; + private final boolean damageOnHurt; + // 1.21.5+ + private final boolean equipOnInteract; + @Nullable + private final Key cameraOverlay; + + public EquipmentData(@NotNull EquipmentSlot slot, @Nullable Key assetId, boolean dispensable, boolean swappable, boolean damageOnHurt, boolean equipOnInteract, @Nullable Key cameraOverlay) { + this.slot = slot; + this.assetId = assetId; + this.dispensable = dispensable; + this.swappable = swappable; + this.damageOnHurt = damageOnHurt; + this.equipOnInteract = equipOnInteract; + this.cameraOverlay = cameraOverlay; + } + + public EquipmentSlot slot() { + return slot; + } + + public Key assetId() { + return assetId; + } + + public boolean dispensable() { + return dispensable; + } + + public boolean swappable() { + return swappable; + } + + public boolean damageOnHurt() { + return damageOnHurt; + } + + public boolean equipOnInteract() { + return equipOnInteract; + } + + public Key cameraOverlay() { + return cameraOverlay; + } + + public Map toMap() { + Map map = new HashMap<>(); + map.put("slot", this.slot.toString()); + if (this.assetId != null) { + map.put("asset_id", this.assetId.toString()); + } + map.put("dispensable", this.dispensable); + map.put("swappable", this.swappable); + map.put("damage_on_hurt", this.damageOnHurt); + if (VersionHelper.isVersionNewerThan1_21_5()) { + map.put("equip_on_interact", this.equipOnInteract); + } + if (this.cameraOverlay != null) { + map.put("camera_overlay", this.cameraOverlay.toString()); + } + return map; + } + + public static Builder builder() { + return new Builder(); + } + + public static class Builder { + private EquipmentSlot slot = EquipmentSlot.HEAD; + private Key assetId; + private boolean dispensable = true; + private boolean swappable = true; + private boolean damageOnHurt = true; + // 1.21.5+ + private boolean equipOnInteract = true; + private Key cameraOverlay; + + public Builder() {} + + public Builder slot(EquipmentSlot slot) { + this.slot = slot; + return this; + } + + public Builder assetId(Key assetId) { + this.assetId = assetId; + return this; + } + + public Builder dispensable(boolean dispensable) { + this.dispensable = dispensable; + return this; + } + + public Builder swappable(boolean swappable) { + this.swappable = swappable; + return this; + } + + public Builder damageOnHurt(boolean damageOnHurt) { + this.damageOnHurt = damageOnHurt; + return this; + } + + public Builder equipOnInteract(boolean equipOnInteract) { + this.equipOnInteract = equipOnInteract; + return this; + } + + public Builder cameraOverlay(Key cameraOverlay) { + this.cameraOverlay = cameraOverlay; + return this; + } + + public EquipmentData build() { + return new EquipmentData(slot, assetId, dispensable, swappable, damageOnHurt, equipOnInteract, cameraOverlay); + } + } +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/item/Item.java b/core/src/main/java/net/momirealms/craftengine/core/item/Item.java new file mode 100644 index 000000000..478f741b3 --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/item/Item.java @@ -0,0 +1,111 @@ +package net.momirealms.craftengine.core.item; + +import net.momirealms.craftengine.core.item.behavior.ItemBehavior; +import net.momirealms.craftengine.core.util.Key; + +import java.util.List; +import java.util.Optional; + +/** + * Interface representing an item. + * This interface provides methods for managing item properties such as custom model data, + * damage, display name, lore, enchantments, and tags. + * + * @param the type of the item implementation + */ +public interface Item { + + Optional> getCustomItem(); + + Optional> getItemBehavior(); + + boolean isCustomItem(); + + boolean isBlockItem(); + + Key id(); + + Key vanillaId(); + + Optional customId(); + + int count(); + + Item count(int amount); + + Item customModelData(Integer data); + + Optional customModelData(); + + Item damage(Integer data); + + Optional damage(); + + Item maxDamage(Integer data); + + Optional maxDamage(); + + Item displayName(String displayName); + + Optional displayName(); + + Item itemName(String itemName); + + Optional itemName(); + + Item lore(List lore); + + Optional> lore(); + + Item unbreakable(boolean unbreakable); + + boolean unbreakable(); + + Item skull(String data); + + Optional getEnchantment(Key enchantmentId); + + Item setEnchantments(List enchantments); + + Item addEnchantment(Enchantment enchantment); + + Item setStoredEnchantments(List enchantments); + + Item addStoredEnchantment(Enchantment enchantment); + + Item itemFlags(List flags); + + Object getTag(Object... path); + + Item setTag(Object value, Object... path); + + boolean hasTag(Object... path); + + boolean removeTag(Object... path); + + boolean hasComponent(String type); + + void removeComponent(String type); + + Object getComponent(String type); + + void setComponent(String type, Object value); + + I getItem(); + + I load(); + + I loadCopy(); + + void update(); + + int maxStackSize(); + + Item maxStackSize(int amount); + + Item copyWithCount(int count); + + boolean is(Key itemTag); + + Object getLiteralObject(); +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/item/ItemBuildContext.java b/core/src/main/java/net/momirealms/craftengine/core/item/ItemBuildContext.java new file mode 100644 index 000000000..aeb808506 --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/item/ItemBuildContext.java @@ -0,0 +1,43 @@ +package net.momirealms.craftengine.core.item; + +import net.kyori.adventure.text.minimessage.tag.resolver.TagResolver; +import net.momirealms.craftengine.core.entity.player.Player; +import net.momirealms.craftengine.core.plugin.minimessage.*; +import net.momirealms.craftengine.core.util.context.ContextHolder; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +public class ItemBuildContext implements MiniMessageTextContext { + public static final ItemBuildContext EMPTY = new ItemBuildContext(null, ContextHolder.EMPTY); + private final Player player; + private final ContextHolder contexts; + private TagResolver[] tagResolvers; + + public ItemBuildContext(@Nullable Player player, @NotNull ContextHolder contexts) { + this.player = player; + this.contexts = contexts; + } + + @NotNull + public static ItemBuildContext of(@Nullable Player player, @NotNull ContextHolder contexts) { + return new ItemBuildContext(player, contexts); + } + + @Nullable + public Player player() { + return this.player; + } + + @NotNull + public ContextHolder contexts() { + return this.contexts; + } + + @NotNull + public TagResolver[] tagResolvers() { + if (this.tagResolvers == null) { + this.tagResolvers = new TagResolver[]{ShiftTag.INSTANCE, ImageTag.INSTANCE, new PlaceholderTag(this.player), new I18NTag(this), new NamedArgumentTag(this)}; + } + return this.tagResolvers; + } +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/item/ItemFactory.java b/core/src/main/java/net/momirealms/craftengine/core/item/ItemFactory.java new file mode 100644 index 000000000..5a497afd4 --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/item/ItemFactory.java @@ -0,0 +1,107 @@ +package net.momirealms.craftengine.core.item; + +import net.momirealms.craftengine.core.plugin.Plugin; +import net.momirealms.craftengine.core.util.Key; + +import java.util.List; +import java.util.Objects; +import java.util.Optional; + +public abstract class ItemFactory

+ * The folder structure allows users to organize and manage + * resource packs and configurations provided by external sources. + *

+ * This class provides access to the resource pack folder + * and configuration folder within the specified directory. + */ +public class Pack { + private final Path folder; + private final PackMeta meta; + + public Pack(Path folder, PackMeta meta) { + this.folder = folder; + this.meta = meta; + } + + public String namespace() { + return meta.namespace(); + } + + public PackMeta meta() { + return meta; + } + + public Path folder() { + return folder; + } + + /** + * Returns the 'resourcepack' folder within the specified directory, + * used for storing third-party resource packs. + */ + public Path resourcePackFolder() { + return folder.resolve("resourcepack"); + } + + /** + * Returns the 'configuration' folder within the specified directory, + * used for storing configuration files related to the resource packs. + */ + public Path configurationFolder() { + return folder.resolve("configuration"); + } +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/pack/PackManager.java b/core/src/main/java/net/momirealms/craftengine/core/pack/PackManager.java new file mode 100644 index 000000000..4916f9568 --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/pack/PackManager.java @@ -0,0 +1,28 @@ +package net.momirealms.craftengine.core.pack; + +import net.momirealms.craftengine.core.plugin.Reloadable; +import net.momirealms.craftengine.core.plugin.config.ConfigSectionParser; +import org.jetbrains.annotations.NotNull; + +import java.nio.file.Path; +import java.util.Collection; + +public interface PackManager extends Reloadable { + + @NotNull + Collection loadedPacks(); + + boolean registerConfigSectionParser(ConfigSectionParser parser); + + boolean unregisterConfigSectionParser(String id); + + default boolean unregisterConfigSectionParser(ConfigSectionParser parser) { + return this.unregisterConfigSectionParser(parser.sectionId()); + } + + void delayedInit(); + + void generateResourcePack(); + + Path resourcePackPath(); +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/pack/PackMeta.java b/core/src/main/java/net/momirealms/craftengine/core/pack/PackMeta.java new file mode 100644 index 000000000..7a1d5c0b3 --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/pack/PackMeta.java @@ -0,0 +1,4 @@ +package net.momirealms.craftengine.core.pack; + +public record PackMeta(String author, String description, String version, String namespace) { +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/pack/conflict/matcher/AllOfPathMatcher.java b/core/src/main/java/net/momirealms/craftengine/core/pack/conflict/matcher/AllOfPathMatcher.java new file mode 100644 index 000000000..e71d62d3e --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/pack/conflict/matcher/AllOfPathMatcher.java @@ -0,0 +1,41 @@ +package net.momirealms.craftengine.core.pack.conflict.matcher; + +import net.momirealms.craftengine.core.util.Key; + +import java.nio.file.Path; +import java.util.List; +import java.util.Map; + +public class AllOfPathMatcher implements PathMatcher { + public static final Factory FACTORY = new Factory(); + private final List matchers; + + public AllOfPathMatcher(List matchers) { + this.matchers = matchers; + } + + @Override + public Key type() { + return PathMatchers.ALL_OF; + } + + @Override + public boolean test(Path path) { + for (PathMatcher matcher : matchers) { + if (!matcher.test(path)) { + return false; + } + } + return true; + } + + public static class Factory implements PathMatcherFactory { + + @SuppressWarnings("unchecked") + @Override + public PathMatcher create(Map arguments) { + List> terms = (List>) arguments.get("terms"); + return new AllOfPathMatcher(PathMatchers.fromMapList(terms)); + } + } +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/pack/conflict/matcher/AnyOfPathMatcher.java b/core/src/main/java/net/momirealms/craftengine/core/pack/conflict/matcher/AnyOfPathMatcher.java new file mode 100644 index 000000000..97b1fb1c6 --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/pack/conflict/matcher/AnyOfPathMatcher.java @@ -0,0 +1,41 @@ +package net.momirealms.craftengine.core.pack.conflict.matcher; + +import net.momirealms.craftengine.core.util.Key; + +import java.nio.file.Path; +import java.util.List; +import java.util.Map; + +public class AnyOfPathMatcher implements PathMatcher { + public static final Factory FACTORY = new Factory(); + private final List matchers; + + public AnyOfPathMatcher(List matchers) { + this.matchers = matchers; + } + + @Override + public Key type() { + return PathMatchers.ANY_OF; + } + + @Override + public boolean test(Path path) { + for (PathMatcher matcher : matchers) { + if (matcher.test(path)) { + return true; + } + } + return false; + } + + public static class Factory implements PathMatcherFactory { + + @SuppressWarnings("unchecked") + @Override + public PathMatcher create(Map arguments) { + List> terms = (List>) arguments.get("terms"); + return new AnyOfPathMatcher(PathMatchers.fromMapList(terms)); + } + } +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/pack/conflict/matcher/ExactPathMatcher.java b/core/src/main/java/net/momirealms/craftengine/core/pack/conflict/matcher/ExactPathMatcher.java new file mode 100644 index 000000000..0553cbafb --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/pack/conflict/matcher/ExactPathMatcher.java @@ -0,0 +1,35 @@ +package net.momirealms.craftengine.core.pack.conflict.matcher; + +import net.momirealms.craftengine.core.util.Key; + +import java.nio.file.Path; +import java.util.Map; + +public class ExactPathMatcher implements PathMatcher { + public static final Factory FACTORY = new Factory(); + private final String path; + + public ExactPathMatcher(String path) { + this.path = path; + } + + @Override + public boolean test(Path path) { + String pathStr = path.toString().replace("\\", "/"); + return pathStr.equals(this.path); + } + + @Override + public Key type() { + return PathMatchers.EXACT; + } + + public static class Factory implements PathMatcherFactory { + + @Override + public PathMatcher create(Map arguments) { + String path = (String) arguments.get("path"); + return new ExactPathMatcher(path); + } + } +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/pack/conflict/matcher/FilenameMatcher.java b/core/src/main/java/net/momirealms/craftengine/core/pack/conflict/matcher/FilenameMatcher.java new file mode 100644 index 000000000..82e171d23 --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/pack/conflict/matcher/FilenameMatcher.java @@ -0,0 +1,38 @@ +package net.momirealms.craftengine.core.pack.conflict.matcher; + +import net.momirealms.craftengine.core.util.Key; + +import java.nio.file.Path; +import java.util.Map; + +public class FilenameMatcher implements PathMatcher { + public static final Factory FACTORY = new Factory(); + private final String name; + + public FilenameMatcher(String name) { + this.name = name; + } + + @Override + public boolean test(Path path) { + String fileName = String.valueOf(path.getFileName()); + return fileName.equals(name); + } + + @Override + public Key type() { + return PathMatchers.FILENAME; + } + + public static class Factory implements PathMatcherFactory { + + @Override + public PathMatcher create(Map arguments) { + String name = (String) arguments.get("name"); + if (name == null) { + throw new IllegalArgumentException("The name argument must not be null"); + } + return new FilenameMatcher(name); + } + } +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/pack/conflict/matcher/InvertedPathMatcher.java b/core/src/main/java/net/momirealms/craftengine/core/pack/conflict/matcher/InvertedPathMatcher.java new file mode 100644 index 000000000..34055c5a6 --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/pack/conflict/matcher/InvertedPathMatcher.java @@ -0,0 +1,35 @@ +package net.momirealms.craftengine.core.pack.conflict.matcher; + +import net.momirealms.craftengine.core.util.Key; + +import java.nio.file.Path; +import java.util.Map; + +public class InvertedPathMatcher implements PathMatcher { + public static final Factory FACTORY = new Factory(); + private final PathMatcher matcher; + + public InvertedPathMatcher(PathMatcher matcher) { + this.matcher = matcher; + } + + @Override + public Key type() { + return PathMatchers.INVERTED; + } + + @Override + public boolean test(Path path) { + return !matcher.test(path); + } + + public static class Factory implements PathMatcherFactory { + + @SuppressWarnings("unchecked") + @Override + public PathMatcher create(Map arguments) { + Map term = (Map) arguments.get("term"); + return new InvertedPathMatcher(PathMatchers.fromMap(term)); + } + } +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/pack/conflict/matcher/ParentPathPrefixMatcher.java b/core/src/main/java/net/momirealms/craftengine/core/pack/conflict/matcher/ParentPathPrefixMatcher.java new file mode 100644 index 000000000..49d45fa5d --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/pack/conflict/matcher/ParentPathPrefixMatcher.java @@ -0,0 +1,40 @@ +package net.momirealms.craftengine.core.pack.conflict.matcher; + +import net.momirealms.craftengine.core.util.Key; + +import java.nio.file.Path; +import java.util.Map; + +public class ParentPathPrefixMatcher implements PathMatcher { + public static final Factory FACTORY = new Factory(); + private final String prefix; + + public ParentPathPrefixMatcher(String prefix) { + this.prefix = prefix; + } + + @Override + public boolean test(Path path) { + Path parent = path.getParent(); + if (parent == null) return false; + String pathStr = parent.toString().replace("\\", "/"); + return pathStr.startsWith(this.prefix); + } + + @Override + public Key type() { + return PathMatchers.PARENT_PATH_PREFIX; + } + + public static class Factory implements PathMatcherFactory { + + @Override + public PathMatcher create(Map arguments) { + String prefix = (String) arguments.get("prefix"); + if (prefix == null) { + throw new IllegalArgumentException("The prefix argument must not be null"); + } + return new ParentPathPrefixMatcher(prefix); + } + } +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/pack/conflict/matcher/ParentPathSuffixMatcher.java b/core/src/main/java/net/momirealms/craftengine/core/pack/conflict/matcher/ParentPathSuffixMatcher.java new file mode 100644 index 000000000..b5728bd52 --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/pack/conflict/matcher/ParentPathSuffixMatcher.java @@ -0,0 +1,40 @@ +package net.momirealms.craftengine.core.pack.conflict.matcher; + +import net.momirealms.craftengine.core.util.Key; + +import java.nio.file.Path; +import java.util.Map; + +public class ParentPathSuffixMatcher implements PathMatcher { + public static final Factory FACTORY = new Factory(); + private final String suffix; + + public ParentPathSuffixMatcher(String suffix) { + this.suffix = suffix; + } + + @Override + public boolean test(Path path) { + Path parent = path.getParent(); + if (parent == null) return false; + String pathStr = parent.toString().replace("\\", "/"); + return pathStr.endsWith(suffix); + } + + @Override + public Key type() { + return PathMatchers.PARENT_PATH_SUFFIX; + } + + public static class Factory implements PathMatcherFactory { + + @Override + public PathMatcher create(Map arguments) { + String suffix = (String) arguments.get("suffix"); + if (suffix == null) { + throw new IllegalArgumentException("The suffix argument must not be null"); + } + return new ParentPathSuffixMatcher(suffix); + } + } +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/pack/conflict/matcher/PathContainsMatcher.java b/core/src/main/java/net/momirealms/craftengine/core/pack/conflict/matcher/PathContainsMatcher.java new file mode 100644 index 000000000..2a138c0d9 --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/pack/conflict/matcher/PathContainsMatcher.java @@ -0,0 +1,35 @@ +package net.momirealms.craftengine.core.pack.conflict.matcher; + +import net.momirealms.craftengine.core.util.Key; + +import java.nio.file.Path; +import java.util.Map; + +public class PathContainsMatcher implements PathMatcher { + public static final Factory FACTORY = new Factory(); + private final String path; + + public PathContainsMatcher(String path) { + this.path = path; + } + + @Override + public boolean test(Path path) { + String pathStr = path.toString().replace("\\", "/"); + return pathStr.contains(this.path); + } + + @Override + public Key type() { + return PathMatchers.CONTAINS; + } + + public static class Factory implements PathMatcherFactory { + + @Override + public PathMatcher create(Map arguments) { + String path = (String) arguments.get("path"); + return new PathContainsMatcher(path); + } + } +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/pack/conflict/matcher/PathMatcher.java b/core/src/main/java/net/momirealms/craftengine/core/pack/conflict/matcher/PathMatcher.java new file mode 100644 index 000000000..a03126da9 --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/pack/conflict/matcher/PathMatcher.java @@ -0,0 +1,11 @@ +package net.momirealms.craftengine.core.pack.conflict.matcher; + +import net.momirealms.craftengine.core.util.Key; + +import java.nio.file.Path; +import java.util.function.Predicate; + +public interface PathMatcher extends Predicate { + + Key type(); +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/pack/conflict/matcher/PathMatcherFactory.java b/core/src/main/java/net/momirealms/craftengine/core/pack/conflict/matcher/PathMatcherFactory.java new file mode 100644 index 000000000..7b9b2d9a0 --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/pack/conflict/matcher/PathMatcherFactory.java @@ -0,0 +1,8 @@ +package net.momirealms.craftengine.core.pack.conflict.matcher; + +import java.util.Map; + +public interface PathMatcherFactory { + + PathMatcher create(Map arguments); +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/pack/conflict/matcher/PathMatchers.java b/core/src/main/java/net/momirealms/craftengine/core/pack/conflict/matcher/PathMatchers.java new file mode 100644 index 000000000..55d6ba56d --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/pack/conflict/matcher/PathMatchers.java @@ -0,0 +1,62 @@ +package net.momirealms.craftengine.core.pack.conflict.matcher; + +import net.momirealms.craftengine.core.registry.BuiltInRegistries; +import net.momirealms.craftengine.core.registry.Holder; +import net.momirealms.craftengine.core.registry.Registries; +import net.momirealms.craftengine.core.registry.WritableRegistry; +import net.momirealms.craftengine.core.util.Key; +import net.momirealms.craftengine.core.util.ResourceKey; + +import java.util.ArrayList; +import java.util.List; +import java.util.Map; + +public class PathMatchers { + public static final Key EXACT = Key.of("craftengine:exact"); + public static final Key CONTAINS = Key.of("craftengine:contains"); + public static final Key FILENAME = Key.of("craftengine:filename"); + public static final Key PARENT_PATH_SUFFIX = Key.of("craftengine:parent_path_suffix"); + public static final Key PARENT_PATH_PREFIX = Key.of("craftengine:parent_path_prefix"); + public static final Key PATTERN = Key.of("craftengine:pattern"); + public static final Key ANY_OF = Key.of("craftengine:any_of"); + public static final Key ALL_OF = Key.of("craftengine:all_of"); + public static final Key INVERTED = Key.of("craftengine:inverted"); + + static { + register(PARENT_PATH_SUFFIX, ParentPathSuffixMatcher.FACTORY); + register(PARENT_PATH_PREFIX, ParentPathPrefixMatcher.FACTORY); + register(PATTERN, PathPatternMatcher.FACTORY); + register(EXACT, ExactPathMatcher.FACTORY); + register(FILENAME, FilenameMatcher.FACTORY); + register(ANY_OF, AnyOfPathMatcher.FACTORY); + register(ALL_OF, AllOfPathMatcher.FACTORY); + register(INVERTED, InvertedPathMatcher.FACTORY); + register(CONTAINS, PathContainsMatcher.FACTORY); + } + + public static void register(Key key, PathMatcherFactory factory) { + Holder.Reference holder = ((WritableRegistry) BuiltInRegistries.PATH_MATCHER_FACTORY).registerForHolder(new ResourceKey<>(Registries.PATH_MATCHER_FACTORY.location(), key)); + holder.bindValue(factory); + } + + public static List fromMapList(List> arguments) { + List matchers = new ArrayList<>(); + for (Map term : arguments) { + matchers.add(PathMatchers.fromMap(term)); + } + return matchers; + } + + public static PathMatcher fromMap(Map map) { + String type = (String) map.getOrDefault("type", "empty"); + if (type == null) { + throw new NullPointerException("path matcher type cannot be null"); + } + Key key = Key.withDefaultNamespace(type, "craftengine"); + PathMatcherFactory factory = BuiltInRegistries.PATH_MATCHER_FACTORY.getValue(key); + if (factory == null) { + throw new IllegalArgumentException("Unknown matcher type: " + type); + } + return factory.create(map); + } +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/pack/conflict/matcher/PathPatternMatcher.java b/core/src/main/java/net/momirealms/craftengine/core/pack/conflict/matcher/PathPatternMatcher.java new file mode 100644 index 000000000..30c9e958f --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/pack/conflict/matcher/PathPatternMatcher.java @@ -0,0 +1,38 @@ +package net.momirealms.craftengine.core.pack.conflict.matcher; + +import net.momirealms.craftengine.core.util.Key; + +import java.nio.file.Path; +import java.util.Map; + +public class PathPatternMatcher implements PathMatcher { + public static final Factory FACTORY = new Factory(); + private final String pattern; + + public PathPatternMatcher(String pattern) { + this.pattern = pattern; + } + + @Override + public boolean test(Path path) { + String pathStr = path.toString().replace("\\", "/"); + return pathStr.matches(pattern); + } + + @Override + public Key type() { + return PathMatchers.PATTERN; + } + + public static class Factory implements PathMatcherFactory { + + @Override + public PathMatcher create(Map arguments) { + String pattern = (String) arguments.get("pattern"); + if (pattern == null) { + throw new IllegalArgumentException("The pattern argument must not be null"); + } + return new PathPatternMatcher(pattern); + } + } +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/pack/conflict/resolution/ConditionalResolution.java b/core/src/main/java/net/momirealms/craftengine/core/pack/conflict/resolution/ConditionalResolution.java new file mode 100644 index 000000000..d0079cf50 --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/pack/conflict/resolution/ConditionalResolution.java @@ -0,0 +1,35 @@ +package net.momirealms.craftengine.core.pack.conflict.resolution; + +import net.momirealms.craftengine.core.pack.conflict.matcher.PathMatcher; +import net.momirealms.craftengine.core.pack.conflict.matcher.PathMatchers; +import net.momirealms.craftengine.core.util.Key; +import net.momirealms.craftengine.core.util.MiscUtils; + +import java.nio.file.Path; +import java.util.Map; + +public record ConditionalResolution(PathMatcher matcher, Resolution resolution) implements Resolution { + public static final Factory FACTORY = new Factory(); + + @Override + public void run(Path existing, Path conflict) { + if (this.matcher.test(existing)) { + this.resolution.run(existing, conflict); + } + } + + @Override + public Key type() { + return Resolutions.CONDITIONAL; + } + + public static class Factory implements ResolutionFactory { + + @Override + public ConditionalResolution create(Map arguments) { + Map term = MiscUtils.castToMap(arguments.get("term"), false); + Map resolution = MiscUtils.castToMap(arguments.get("resolution"), false); + return new ConditionalResolution(PathMatchers.fromMap(term), Resolutions.fromMap(resolution)); + } + } +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/pack/conflict/resolution/MergeJsonResolution.java b/core/src/main/java/net/momirealms/craftengine/core/pack/conflict/resolution/MergeJsonResolution.java new file mode 100644 index 000000000..db9c77242 --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/pack/conflict/resolution/MergeJsonResolution.java @@ -0,0 +1,50 @@ +package net.momirealms.craftengine.core.pack.conflict.resolution; + +import com.google.gson.JsonObject; +import net.momirealms.craftengine.core.plugin.CraftEngine; +import net.momirealms.craftengine.core.util.GsonHelper; +import net.momirealms.craftengine.core.util.Key; + +import java.io.IOException; +import java.nio.file.Path; +import java.util.Map; + +public class MergeJsonResolution implements Resolution { + public static final Factory FACTORY = new Factory(); + private final boolean deeply; + + public MergeJsonResolution(boolean deeply) { + this.deeply = deeply; + } + + @Override + public void run(Path existing, Path conflict) { + try { + JsonObject j1 = GsonHelper.readJsonFile(existing).getAsJsonObject(); + JsonObject j2 = GsonHelper.readJsonFile(conflict).getAsJsonObject(); + JsonObject j3; + if (deeply) { + j3 = GsonHelper.deepMerge(j1, j2); + } else { + j3 = GsonHelper.shallowMerge(j1, j2); + } + GsonHelper.writeJsonFile(j3, existing); + } catch (IOException e) { + CraftEngine.instance().logger().severe("Failed to merge json when resolving file conflicts", e); + } + } + + @Override + public Key type() { + return Resolutions.MERGE_JSON; + } + + public static class Factory implements ResolutionFactory { + + @Override + public Resolution create(Map arguments) { + boolean deeply = (boolean) arguments.getOrDefault("deeply", false); + return new MergeJsonResolution(deeply); + } + } +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/pack/conflict/resolution/Resolution.java b/core/src/main/java/net/momirealms/craftengine/core/pack/conflict/resolution/Resolution.java new file mode 100644 index 000000000..b33592e38 --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/pack/conflict/resolution/Resolution.java @@ -0,0 +1,12 @@ +package net.momirealms.craftengine.core.pack.conflict.resolution; + +import net.momirealms.craftengine.core.util.Key; + +import java.nio.file.Path; + +public interface Resolution { + + void run(Path existing, Path conflict); + + Key type(); +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/pack/conflict/resolution/ResolutionFactory.java b/core/src/main/java/net/momirealms/craftengine/core/pack/conflict/resolution/ResolutionFactory.java new file mode 100644 index 000000000..b6533aa87 --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/pack/conflict/resolution/ResolutionFactory.java @@ -0,0 +1,8 @@ +package net.momirealms.craftengine.core.pack.conflict.resolution; + +import java.util.Map; + +public interface ResolutionFactory { + + Resolution create(Map arguments); +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/pack/conflict/resolution/Resolutions.java b/core/src/main/java/net/momirealms/craftengine/core/pack/conflict/resolution/Resolutions.java new file mode 100644 index 000000000..66fa4a5b5 --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/pack/conflict/resolution/Resolutions.java @@ -0,0 +1,40 @@ +package net.momirealms.craftengine.core.pack.conflict.resolution; + +import net.momirealms.craftengine.core.registry.BuiltInRegistries; +import net.momirealms.craftengine.core.registry.Holder; +import net.momirealms.craftengine.core.registry.Registries; +import net.momirealms.craftengine.core.registry.WritableRegistry; +import net.momirealms.craftengine.core.util.Key; +import net.momirealms.craftengine.core.util.ResourceKey; + +import java.util.Map; + +public class Resolutions { + public static final Key RETAIN_MATCHING = Key.of("craftengine:retain_matching"); + public static final Key MERGE_JSON = Key.of("craftengine:merge_json"); + public static final Key CONDITIONAL = Key.of("craftengine:conditional"); + + static { + register(RETAIN_MATCHING, RetainMatchingResolution.FACTORY); + register(MERGE_JSON, MergeJsonResolution.FACTORY); + register(CONDITIONAL, ConditionalResolution.FACTORY); + } + + public static void register(Key key, ResolutionFactory factory) { + Holder.Reference holder = ((WritableRegistry) BuiltInRegistries.RESOLUTION_FACTORY).registerForHolder(new ResourceKey<>(Registries.RESOLUTION_FACTORY.location(), key)); + holder.bindValue(factory); + } + + public static Resolution fromMap(Map map) { + String type = (String) map.getOrDefault("type", "empty"); + if (type == null) { + throw new NullPointerException("path matcher type cannot be null"); + } + Key key = Key.withDefaultNamespace(type, "craftengine"); + ResolutionFactory factory = BuiltInRegistries.RESOLUTION_FACTORY.getValue(key); + if (factory == null) { + throw new IllegalArgumentException("Unknown matcher type: " + type); + } + return factory.create(map); + } +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/pack/conflict/resolution/RetainMatchingResolution.java b/core/src/main/java/net/momirealms/craftengine/core/pack/conflict/resolution/RetainMatchingResolution.java new file mode 100644 index 000000000..874279027 --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/pack/conflict/resolution/RetainMatchingResolution.java @@ -0,0 +1,47 @@ +package net.momirealms.craftengine.core.pack.conflict.resolution; + +import net.momirealms.craftengine.core.pack.conflict.matcher.PathMatcher; +import net.momirealms.craftengine.core.pack.conflict.matcher.PathMatchers; +import net.momirealms.craftengine.core.plugin.CraftEngine; +import net.momirealms.craftengine.core.util.Key; +import net.momirealms.craftengine.core.util.MiscUtils; + +import java.io.IOException; +import java.nio.file.Files; +import java.nio.file.Path; +import java.nio.file.StandardCopyOption; +import java.util.Map; + +public class RetainMatchingResolution implements Resolution { + public static final Factory FACTORY = new Factory(); + private final PathMatcher matcher; + + public RetainMatchingResolution(PathMatcher matcher) { + this.matcher = matcher; + } + + @Override + public void run(Path existing, Path conflict) { + if (this.matcher.test(conflict)) { + try { + Files.copy(conflict, existing, StandardCopyOption.REPLACE_EXISTING); + } catch (IOException e) { + CraftEngine.instance().logger().warn("Failed to copy conflict file " + conflict + " to " + existing, e); + } + } + } + + @Override + public Key type() { + return Resolutions.RETAIN_MATCHING; + } + + public static class Factory implements ResolutionFactory { + + @Override + public Resolution create(Map arguments) { + Map term = MiscUtils.castToMap(arguments.get("term"), false); + return new RetainMatchingResolution(PathMatchers.fromMap(term)); + } + } +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/pack/host/HostMode.java b/core/src/main/java/net/momirealms/craftengine/core/pack/host/HostMode.java new file mode 100644 index 000000000..aade43875 --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/pack/host/HostMode.java @@ -0,0 +1,7 @@ +package net.momirealms.craftengine.core.pack.host; + +public enum HostMode { + SELF_HOST, + EXTERNAL_HOST, + NONE +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/pack/host/ResourcePackHost.java b/core/src/main/java/net/momirealms/craftengine/core/pack/host/ResourcePackHost.java new file mode 100644 index 000000000..48dd33894 --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/pack/host/ResourcePackHost.java @@ -0,0 +1,139 @@ +package net.momirealms.craftengine.core.pack.host; + +import com.sun.net.httpserver.HttpExchange; +import com.sun.net.httpserver.HttpHandler; +import com.sun.net.httpserver.HttpServer; +import net.momirealms.craftengine.core.plugin.CraftEngine; +import net.momirealms.craftengine.core.plugin.config.ConfigManager; + +import java.io.IOException; +import java.io.OutputStream; +import java.net.InetSocketAddress; +import java.nio.file.Files; +import java.nio.file.Path; +import java.util.concurrent.ConcurrentHashMap; +import java.util.concurrent.Executors; +import java.util.concurrent.TimeUnit; + +public class ResourcePackHost { + private static ResourcePackHost instance; + private HttpServer server; + private String ip; + private int port; + private Path resourcePackPath; + private final ConcurrentHashMap ipAccessMap = new ConcurrentHashMap<>(); + private int rateLimit = 1; + private long rateLimitInterval = 1000; + + public String url() { + return ConfigManager.hostProtocol() + "://" + ip + ":" + port + "/"; + } + + public void enable(String ip, int port, Path resourcePackPath) { + if (isAlive() && ip.equals(this.ip) && port == this.port && resourcePackPath.equals(this.resourcePackPath)) { + return; + } + if (server != null) { + disable(); + } + this.ip = ip; + this.port = port; + this.resourcePackPath = resourcePackPath; + + try { + server = HttpServer.create(new InetSocketAddress("::", port), 0); + server.createContext("/", new ResourcePackHandler()); + server.setExecutor(Executors.newCachedThreadPool()); + server.start(); + CraftEngine.instance().logger().info("HTTP resource pack server running on " + ip + ":" + port); + } catch (IOException e) { + CraftEngine.instance().logger().warn("Failed to start HTTP server", e); + } + } + + public void disable() { + if (server != null) { + server.stop(0); + server = null; + } + } + + public boolean isAlive() { + return server != null; + } + + public static ResourcePackHost instance() { + if (instance == null) { + instance = new ResourcePackHost(); + } + return instance; + } + + public void setRateLimit(int rateLimit, long rateLimitInterval, TimeUnit timeUnit) { + this.rateLimit = rateLimit; + this.rateLimitInterval = timeUnit.toMillis(rateLimitInterval); + } + + private class ResourcePackHandler implements HttpHandler { + @Override + public void handle(HttpExchange exchange) throws IOException { + if (ConfigManager.denyNonMinecraftRequest()) { + String userAgent = exchange.getRequestHeaders().getFirst("User-Agent"); + if (userAgent == null || !userAgent.startsWith("Minecraft Java/")) { + CraftEngine.instance().debug(() -> "Blocked non-Minecraft Java client. User-Agent: " + userAgent); + sendError(exchange, 403); + return; + } + } + + String clientIp = exchange.getRemoteAddress().getAddress().getHostAddress(); + + IpAccessRecord record = ipAccessMap.compute(clientIp, (k, v) -> { + long currentTime = System.currentTimeMillis(); + if (v == null || currentTime - v.lastAccessTime > rateLimitInterval) { + return new IpAccessRecord(currentTime, 1); + } else { + v.accessCount++; + return v; + } + }); + + if (record.accessCount > rateLimit) { + CraftEngine.instance().debug(() -> "Rate limit exceeded for IP: " + clientIp); + sendError(exchange, 429); + return; + } + + if (!Files.exists(resourcePackPath)) { + CraftEngine.instance().logger().warn("ResourcePack not found: " + resourcePackPath); + sendError(exchange, 404); + return; + } + + exchange.getResponseHeaders().set("Content-Type", "application/zip"); + exchange.getResponseHeaders().set("Content-Length", String.valueOf(Files.size(resourcePackPath))); + exchange.sendResponseHeaders(200, Files.size(resourcePackPath)); + + try (OutputStream os = exchange.getResponseBody()) { + Files.copy(resourcePackPath, os); + } catch (IOException e) { + CraftEngine.instance().logger().warn("Failed to send pack", e); + } + } + + private void sendError(HttpExchange exchange, int code) throws IOException { + exchange.sendResponseHeaders(code, 0); + exchange.getResponseBody().close(); + } + } + + private static class IpAccessRecord { + long lastAccessTime; + int accessCount; + + IpAccessRecord(long lastAccessTime, int accessCount) { + this.lastAccessTime = lastAccessTime; + this.accessCount = accessCount; + } + } +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/pack/model/BaseItemModel.java b/core/src/main/java/net/momirealms/craftengine/core/pack/model/BaseItemModel.java new file mode 100644 index 000000000..36a9ea7ef --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/pack/model/BaseItemModel.java @@ -0,0 +1,89 @@ +package net.momirealms.craftengine.core.pack.model; + +import com.google.gson.JsonArray; +import com.google.gson.JsonObject; +import net.momirealms.craftengine.core.pack.model.generator.ModelGeneration; +import net.momirealms.craftengine.core.pack.model.tint.Tint; +import net.momirealms.craftengine.core.pack.model.tint.Tints; +import net.momirealms.craftengine.core.util.Key; +import net.momirealms.craftengine.core.util.MiscUtils; +import org.jetbrains.annotations.Nullable; + +import java.util.ArrayList; +import java.util.List; +import java.util.Map; +import java.util.Objects; + +public class BaseItemModel implements ItemModel { + public static final Factory FACTORY = new Factory(); + private final String path; + private final List tints; + private final ModelGeneration modelGeneration; + + public BaseItemModel(String path, List tints, @Nullable ModelGeneration modelGeneration) { + this.path = path; + this.tints = tints; + this.modelGeneration = modelGeneration; + } + + public List tints() { + return tints; + } + + public String path() { + return path; + } + + @Override + public JsonObject get() { + JsonObject json = new JsonObject(); + json.addProperty("type", type().toString()); + json.addProperty("model", path); + if (!tints.isEmpty()) { + JsonArray array = new JsonArray(); + for (Tint tint : tints) { + array.add(tint.get()); + } + json.add("tints", array); + } + return json; + } + + @Override + public Key type() { + return ItemModels.MODEL; + } + + @Override + public List modelsToGenerate() { + if (this.modelGeneration == null) { + return List.of(); + } else { + return List.of(this.modelGeneration); + } + } + + public static class Factory implements ItemModelFactory { + + @SuppressWarnings("unchecked") + @Override + public ItemModel create(Map arguments) { + String modelPath = Objects.requireNonNull(arguments.get("path"), "'path' is required for 'minecraft:model'. Current arguments: "+ arguments).toString(); + Map generation = MiscUtils.castToMap(arguments.get("generation"), true); + ModelGeneration modelGeneration = null; + if (generation != null) { + modelGeneration = new ModelGeneration(Key.of(modelPath), generation); + } + if (arguments.containsKey("tints")) { + List tints = new ArrayList<>(); + List> tintList = (List>) arguments.get("tints"); + for (Map tint : tintList) { + tints.add(Tints.fromMap(tint)); + } + return new BaseItemModel(modelPath, tints, modelGeneration); + } else { + return new BaseItemModel(modelPath, List.of(), modelGeneration); + } + } + } +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/pack/model/CompositeItemModel.java b/core/src/main/java/net/momirealms/craftengine/core/pack/model/CompositeItemModel.java new file mode 100644 index 000000000..07143e7f6 --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/pack/model/CompositeItemModel.java @@ -0,0 +1,63 @@ +package net.momirealms.craftengine.core.pack.model; + +import com.google.gson.JsonArray; +import com.google.gson.JsonObject; +import net.momirealms.craftengine.core.pack.model.generator.ModelGeneration; +import net.momirealms.craftengine.core.util.Key; + +import java.util.ArrayList; +import java.util.List; +import java.util.Map; + +public class CompositeItemModel implements ItemModel { + public static final Factory FACTORY = new Factory(); + private final List models; + + public CompositeItemModel(List models) { + this.models = models; + } + + public List models() { + return models; + } + + @Override + public JsonObject get() { + JsonObject json = new JsonObject(); + json.addProperty("type", type().toString()); + JsonArray array = new JsonArray(); + for (ItemModel model : models) { + array.add(model.get()); + } + json.add("models", array); + return json; + } + + @Override + public Key type() { + return ItemModels.COMPOSITE; + } + + @Override + public List modelsToGenerate() { + List models = new ArrayList<>(4); + for (ItemModel model : this.models) { + models.addAll(model.modelsToGenerate()); + } + return models; + } + + public static class Factory implements ItemModelFactory { + + @SuppressWarnings("unchecked") + @Override + public ItemModel create(Map arguments) { + List> models = (List>) arguments.get("models"); + List modelList = new ArrayList<>(); + for (Map model : models) { + modelList.add(ItemModels.fromMap(model)); + } + return new CompositeItemModel(modelList); + } + } +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/pack/model/ConditionItemModel.java b/core/src/main/java/net/momirealms/craftengine/core/pack/model/ConditionItemModel.java new file mode 100644 index 000000000..4ae76603e --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/pack/model/ConditionItemModel.java @@ -0,0 +1,72 @@ +package net.momirealms.craftengine.core.pack.model; + +import com.google.gson.JsonObject; +import net.momirealms.craftengine.core.pack.model.condition.ConditionProperties; +import net.momirealms.craftengine.core.pack.model.condition.ConditionProperty; +import net.momirealms.craftengine.core.pack.model.generator.ModelGeneration; +import net.momirealms.craftengine.core.util.Key; + +import java.util.ArrayList; +import java.util.List; +import java.util.Map; +import java.util.Objects; + +public class ConditionItemModel implements ItemModel { + public static final Factory FACTORY = new Factory(); + private final ConditionProperty property; + private final ItemModel onTrue; + private final ItemModel onFalse; + + public ConditionItemModel(ConditionProperty property, ItemModel onTrue, ItemModel onFalse) { + this.property = property; + this.onTrue = onTrue; + this.onFalse = onFalse; + } + + public ConditionProperty property() { + return property; + } + + public ItemModel onTrue() { + return onTrue; + } + + public ItemModel onFalse() { + return onFalse; + } + + @Override + public Key type() { + return ItemModels.CONDITION; + } + + @Override + public List modelsToGenerate() { + List models = new ArrayList<>(4); + models.addAll(onTrue.modelsToGenerate()); + models.addAll(onFalse.modelsToGenerate()); + return models; + } + + @Override + public JsonObject get() { + JsonObject json = new JsonObject(); + json.addProperty("type", type().toString()); + json.add("on_true", onTrue.get()); + json.add("on_false", onFalse.get()); + property.accept(json); + return json; + } + + public static class Factory implements ItemModelFactory { + + @SuppressWarnings("unchecked") + @Override + public ItemModel create(Map arguments) { + ConditionProperty property = ConditionProperties.fromMap(arguments); + Map onTrue = Objects.requireNonNull((Map) arguments.get("on-true")); + Map onFalse = Objects.requireNonNull((Map) arguments.get("on-false")); + return new ConditionItemModel(property, ItemModels.fromMap(onTrue), ItemModels.fromMap(onFalse)); + } + } +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/pack/model/EmptyItemModel.java b/core/src/main/java/net/momirealms/craftengine/core/pack/model/EmptyItemModel.java new file mode 100644 index 000000000..020953a29 --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/pack/model/EmptyItemModel.java @@ -0,0 +1,38 @@ +package net.momirealms.craftengine.core.pack.model; + +import com.google.gson.JsonObject; +import net.momirealms.craftengine.core.pack.model.generator.ModelGeneration; +import net.momirealms.craftengine.core.util.Key; + +import java.util.List; +import java.util.Map; + +public class EmptyItemModel implements ItemModel { + public static final Factory FACTORY = new Factory(); + private static final EmptyItemModel INSTANCE = new EmptyItemModel(); + + @Override + public JsonObject get() { + JsonObject json = new JsonObject(); + json.addProperty("type", type().toString()); + return json; + } + + @Override + public Key type() { + return ItemModels.EMPTY; + } + + @Override + public List modelsToGenerate() { + return List.of(); + } + + public static class Factory implements ItemModelFactory { + + @Override + public ItemModel create(Map arguments) { + return INSTANCE; + } + } +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/pack/model/ItemModel.java b/core/src/main/java/net/momirealms/craftengine/core/pack/model/ItemModel.java new file mode 100644 index 000000000..1f167246f --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/pack/model/ItemModel.java @@ -0,0 +1,15 @@ +package net.momirealms.craftengine.core.pack.model; + +import com.google.gson.JsonObject; +import net.momirealms.craftengine.core.pack.model.generator.ModelGeneration; +import net.momirealms.craftengine.core.util.Key; + +import java.util.List; +import java.util.function.Supplier; + +public interface ItemModel extends Supplier { + + Key type(); + + List modelsToGenerate(); +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/pack/model/ItemModelFactory.java b/core/src/main/java/net/momirealms/craftengine/core/pack/model/ItemModelFactory.java new file mode 100644 index 000000000..43b9631bf --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/pack/model/ItemModelFactory.java @@ -0,0 +1,8 @@ +package net.momirealms.craftengine.core.pack.model; + +import java.util.Map; + +public interface ItemModelFactory { + + ItemModel create(Map arguments); +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/pack/model/ItemModels.java b/core/src/main/java/net/momirealms/craftengine/core/pack/model/ItemModels.java new file mode 100644 index 000000000..37df55401 --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/pack/model/ItemModels.java @@ -0,0 +1,46 @@ +package net.momirealms.craftengine.core.pack.model; + +import net.momirealms.craftengine.core.registry.BuiltInRegistries; +import net.momirealms.craftengine.core.registry.Holder; +import net.momirealms.craftengine.core.registry.Registries; +import net.momirealms.craftengine.core.registry.WritableRegistry; +import net.momirealms.craftengine.core.util.Key; +import net.momirealms.craftengine.core.util.ResourceKey; + +import java.util.Map; + +public class ItemModels { + public static final Key EMPTY = Key.of("minecraft:empty"); + public static final Key MODEL = Key.of("minecraft:model"); + public static final Key COMPOSITE = Key.of("minecraft:composite"); + public static final Key CONDITION = Key.of("minecraft:condition"); + public static final Key RANGE_DISPATCH = Key.of("minecraft:range_dispatch"); + public static final Key SELECT = Key.of("minecraft:select"); + public static final Key SPECIAL = Key.of("minecraft:special"); + + static { + register(EMPTY, EmptyItemModel.FACTORY); + register(COMPOSITE, CompositeItemModel.FACTORY); + register(MODEL, BaseItemModel.FACTORY); + register(CONDITION, ConditionItemModel.FACTORY); + register(SPECIAL, SpecialItemModel.FACTORY); + register(RANGE_DISPATCH, RangeDispatchItemModel.FACTORY); + register(SELECT, SelectItemModel.FACTORY); + } + + public static void register(Key key, ItemModelFactory factory) { + Holder.Reference holder = ((WritableRegistry) BuiltInRegistries.ITEM_MODEL_FACTORY) + .registerForHolder(new ResourceKey<>(Registries.ITEM_MODEL_FACTORY.location(), key)); + holder.bindValue(factory); + } + + public static ItemModel fromMap(Map map) { + String type = (String) map.getOrDefault("type", "minecraft:model"); + Key key = Key.withDefaultNamespace(type, "minecraft"); + ItemModelFactory factory = BuiltInRegistries.ITEM_MODEL_FACTORY.getValue(key); + if (factory == null) { + throw new IllegalArgumentException("Unknown model type: " + type); + } + return factory.create(map); + } +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/pack/model/LegacyModelPredicate.java b/core/src/main/java/net/momirealms/craftengine/core/pack/model/LegacyModelPredicate.java new file mode 100644 index 000000000..10ab58f4a --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/pack/model/LegacyModelPredicate.java @@ -0,0 +1,10 @@ +package net.momirealms.craftengine.core.pack.model; + +import net.momirealms.craftengine.core.util.Key; + +public interface LegacyModelPredicate { + + String legacyPredicateId(Key material); + + Number toLegacyValue(T value); +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/pack/model/RangeDispatchItemModel.java b/core/src/main/java/net/momirealms/craftengine/core/pack/model/RangeDispatchItemModel.java new file mode 100644 index 000000000..58c8d686d --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/pack/model/RangeDispatchItemModel.java @@ -0,0 +1,114 @@ +package net.momirealms.craftengine.core.pack.model; + +import com.google.gson.JsonArray; +import com.google.gson.JsonObject; +import net.momirealms.craftengine.core.pack.model.generator.ModelGeneration; +import net.momirealms.craftengine.core.pack.model.rangedisptach.RangeDispatchProperties; +import net.momirealms.craftengine.core.pack.model.rangedisptach.RangeDispatchProperty; +import net.momirealms.craftengine.core.util.Key; +import net.momirealms.craftengine.core.util.MiscUtils; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +public class RangeDispatchItemModel implements ItemModel { + public static final Factory FACTORY = new Factory(); + private final RangeDispatchProperty property; + private final float scale; + private final ItemModel fallBack; + private final Map entries; + + public RangeDispatchItemModel(@NotNull RangeDispatchProperty property, + float scale, + @Nullable ItemModel fallBack, + @NotNull Map entries) { + this.property = property; + this.scale = scale; + this.fallBack = fallBack; + this.entries = entries; + } + + public RangeDispatchProperty property() { + return property; + } + + public float scale() { + return scale; + } + + @Nullable + public ItemModel fallBack() { + return fallBack; + } + + public Map entries() { + return entries; + } + + @Override + public JsonObject get() { + JsonObject json = new JsonObject(); + json.addProperty("type", type().toString()); + property.accept(json); + JsonArray array = new JsonArray(); + for (Map.Entry entry : entries.entrySet()) { + float threshold = entry.getKey(); + ItemModel model = entry.getValue(); + JsonObject jo = new JsonObject(); + jo.addProperty("threshold", threshold); + jo.add("model", model.get()); + array.add(jo); + } + json.add("entries", array); + if (scale != 1) { + json.addProperty("scale", scale); + } + if (fallBack != null) { + json.add("fallback", fallBack.get()); + } + return json; + } + + @Override + public Key type() { + return ItemModels.RANGE_DISPATCH; + } + + @Override + public List modelsToGenerate() { + List models = new ArrayList<>(4); + if (fallBack != null) { + models.addAll(fallBack.modelsToGenerate()); + } + for (ItemModel model : entries.values()) { + models.addAll(model.modelsToGenerate()); + } + return models; + } + + public static class Factory implements ItemModelFactory { + + @SuppressWarnings("unchecked") + @Override + public ItemModel create(Map arguments) { + RangeDispatchProperty property = RangeDispatchProperties.fromMap(arguments); + float scale = MiscUtils.getAsFloat(arguments.getOrDefault("scale", 1.0)); + Map fallback = MiscUtils.castToMap(arguments.get("fallback"), true); + List> entries = (List>) arguments.get("entries"); + if (entries != null && !entries.isEmpty()) { + Map entryMap = new HashMap<>(); + for (Map entry : entries) { + float threshold = MiscUtils.getAsFloat(entry.getOrDefault("threshold", 1)); + Map model = MiscUtils.castToMap(entry.getOrDefault("model", fallback), false); + entryMap.put(threshold, ItemModels.fromMap(model)); + } + return new RangeDispatchItemModel(property, scale, fallback == null ? null : ItemModels.fromMap(fallback), entryMap); + } + throw new IllegalArgumentException("No entries set for range dispatch"); + } + } +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/pack/model/SelectItemModel.java b/core/src/main/java/net/momirealms/craftengine/core/pack/model/SelectItemModel.java new file mode 100644 index 000000000..8cb28541b --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/pack/model/SelectItemModel.java @@ -0,0 +1,123 @@ +package net.momirealms.craftengine.core.pack.model; + +import com.google.gson.JsonArray; +import com.google.gson.JsonObject; +import net.momirealms.craftengine.core.pack.model.generator.ModelGeneration; +import net.momirealms.craftengine.core.pack.model.select.SelectProperties; +import net.momirealms.craftengine.core.pack.model.select.SelectProperty; +import net.momirealms.craftengine.core.util.Key; +import net.momirealms.craftengine.core.util.MiscUtils; +import org.incendo.cloud.type.Either; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +public class SelectItemModel implements ItemModel { + public static final Factory FACTORY = new Factory(); + private final SelectProperty property; + private final Map>, ItemModel> whenMap; + private final ItemModel fallBack; + + public SelectItemModel(@NotNull SelectProperty property, + @NotNull Map>, ItemModel> whenMap, + @Nullable ItemModel fallBack) { + this.property = property; + this.whenMap = whenMap; + this.fallBack = fallBack; + } + + public SelectProperty property() { + return property; + } + + public Map>, ItemModel> whenMap() { + return whenMap; + } + + public ItemModel fallBack() { + return fallBack; + } + + @Override + public JsonObject get() { + JsonObject json = new JsonObject(); + json.addProperty("type", type().toString()); + property.accept(json); + JsonArray array = new JsonArray(); + json.add("cases", array); + for (Map.Entry>, ItemModel> entry : whenMap.entrySet()) { + JsonObject item = new JsonObject(); + ItemModel itemModel = entry.getValue(); + item.add("model", itemModel.get()); + Either> either = entry.getKey(); + if (either.primary().isPresent()) { + item.addProperty("when", either.primary().get()); + } else { + List list = either.fallback().get(); + JsonArray whens = new JsonArray(); + for (String e : list) { + whens.add(e); + } + item.add("when", whens); + } + array.add(item); + } + if (fallBack != null) { + json.add("fallback", fallBack.get()); + } + return json; + } + + @Override + public Key type() { + return ItemModels.SELECT; + } + + @Override + public List modelsToGenerate() { + List models = new ArrayList<>(4); + if (fallBack != null) { + models.addAll(fallBack.modelsToGenerate()); + } + for (ItemModel itemModel : whenMap.values()) { + models.addAll(itemModel.modelsToGenerate()); + } + return models; + } + + public static class Factory implements ItemModelFactory { + + @SuppressWarnings("unchecked") + @Override + public ItemModel create(Map arguments) { + SelectProperty property = SelectProperties.fromMap(arguments); + Map fallback = MiscUtils.castToMap(arguments.get("fallback"), true); + List> cases = (List>) arguments.get("cases"); + if (cases != null && !cases.isEmpty()) { + Map>, ItemModel> whenMap = new HashMap<>(); + for (Map c : cases) { + Object when = c.get("when"); + if (when == null) continue; + Either> either; + if (when instanceof List whenList) { + List whens = new ArrayList<>(whenList.size()); + for (Object o : whenList) { + whens.add(o.toString()); + } + either = Either.ofFallback(whens); + } else { + either = Either.ofPrimary(when.toString()); + } + Map model = MiscUtils.castToMap(c.get("model"), false); + whenMap.put(either, ItemModels.fromMap(model)); + } + return new SelectItemModel(property, whenMap, fallback == null ? null : ItemModels.fromMap(fallback)); + } + throw new IllegalArgumentException("No cases set for select"); + } + } +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/pack/model/SpecialItemModel.java b/core/src/main/java/net/momirealms/craftengine/core/pack/model/SpecialItemModel.java new file mode 100644 index 000000000..e202ca708 --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/pack/model/SpecialItemModel.java @@ -0,0 +1,60 @@ +package net.momirealms.craftengine.core.pack.model; + +import com.google.gson.JsonObject; +import net.momirealms.craftengine.core.pack.model.generator.ModelGeneration; +import net.momirealms.craftengine.core.pack.model.special.SpecialModel; +import net.momirealms.craftengine.core.pack.model.special.SpecialModels; +import net.momirealms.craftengine.core.util.Key; +import net.momirealms.craftengine.core.util.MiscUtils; + +import java.util.List; +import java.util.Map; +import java.util.Objects; + +public class SpecialItemModel implements ItemModel { + public static final Factory FACTORY = new Factory(); + private final SpecialModel specialModel; + private final String base; + + public SpecialItemModel(SpecialModel specialModel, String base) { + this.specialModel = specialModel; + this.base = base; + } + + public SpecialModel specialModel() { + return specialModel; + } + + public String base() { + return base; + } + + @Override + public JsonObject get() { + JsonObject json = new JsonObject(); + json.addProperty("type", type().toString()); + json.add("model", specialModel.get()); + json.addProperty("base", base); + return json; + } + + @Override + public Key type() { + return ItemModels.SPECIAL; + } + + @Override + public List modelsToGenerate() { + return List.of(); + } + + public static class Factory implements ItemModelFactory { + + @Override + public ItemModel create(Map arguments) { + String base = Objects.requireNonNull(arguments.get("base")).toString(); + Map model = MiscUtils.castToMap(arguments.get("model"), false); + return new SpecialItemModel(SpecialModels.fromMap(model), base); + } + } +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/pack/model/condition/BrokenConditionProperty.java b/core/src/main/java/net/momirealms/craftengine/core/pack/model/condition/BrokenConditionProperty.java new file mode 100644 index 000000000..3cc36665a --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/pack/model/condition/BrokenConditionProperty.java @@ -0,0 +1,40 @@ +package net.momirealms.craftengine.core.pack.model.condition; + +import com.google.gson.JsonObject; +import net.momirealms.craftengine.core.item.ItemKeys; +import net.momirealms.craftengine.core.pack.model.LegacyModelPredicate; +import net.momirealms.craftengine.core.util.Key; + +import java.util.Map; + +public class BrokenConditionProperty implements ConditionProperty, LegacyModelPredicate { + public static final Factory FACTORY = new Factory(); + + @Override + public Key type() { + return ConditionProperties.BROKEN; + } + + @Override + public void accept(JsonObject jsonObject) { + jsonObject.addProperty("property", type().toString()); + } + + @Override + public String legacyPredicateId(Key material) { + if (material.equals(ItemKeys.ELYTRA)) return "broken"; + return null; + } + + @Override + public Number toLegacyValue(Boolean value) { + return value ? 1 : 0; + } + + public static class Factory implements ConditionPropertyFactory { + @Override + public ConditionProperty create(Map arguments) { + return new BrokenConditionProperty(); + } + } +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/pack/model/condition/ConditionProperties.java b/core/src/main/java/net/momirealms/craftengine/core/pack/model/condition/ConditionProperties.java new file mode 100644 index 000000000..c0e1e83e6 --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/pack/model/condition/ConditionProperties.java @@ -0,0 +1,59 @@ +package net.momirealms.craftengine.core.pack.model.condition; + +import net.momirealms.craftengine.core.registry.BuiltInRegistries; +import net.momirealms.craftengine.core.registry.Holder; +import net.momirealms.craftengine.core.registry.Registries; +import net.momirealms.craftengine.core.registry.WritableRegistry; +import net.momirealms.craftengine.core.util.Key; +import net.momirealms.craftengine.core.util.ResourceKey; + +import java.util.Map; + +public class ConditionProperties { + public static final Key BROKEN = Key.of("minecraft:broken"); + public static final Key BUNDLE_HAS_SELECTED_ITEM = Key.of("minecraft:bundle/has_selected_item"); + public static final Key CARRIED = Key.of("minecraft:carried"); + public static final Key CUSTOM_MODEL_DATA = Key.of("minecraft:custom_model_data"); + public static final Key DAMAGED = Key.of("minecraft:damaged"); + public static final Key EXTENDED_VIEW = Key.of("minecraft:extended_view"); + public static final Key FISHING_ROD_CAST = Key.of("minecraft:fishing_rod/cast"); + public static final Key HAS_COMPONENT = Key.of("minecraft:has_component"); + public static final Key KEYBIND_DOWN = Key.of("minecraft:keybind_down"); + public static final Key SELECTED = Key.of("minecraft:selected"); + public static final Key USING_ITEM = Key.of("minecraft:using_item"); + public static final Key VIEW_ENTITY = Key.of("minecraft:view_entity"); + + static { + register(BROKEN, BrokenConditionProperty.FACTORY); + register(BUNDLE_HAS_SELECTED_ITEM, SimpleConditionProperty.FACTORY); + register(CARRIED, SimpleConditionProperty.FACTORY); + register(DAMAGED, DamagedConditionProperty.FACTORY); + register(EXTENDED_VIEW, SimpleConditionProperty.FACTORY); + register(FISHING_ROD_CAST, RodCastConditionProperty.FACTORY); + register(SELECTED, SimpleConditionProperty.FACTORY); + register(USING_ITEM, UsingItemConditionProperty.FACTORY); + register(VIEW_ENTITY, SimpleConditionProperty.FACTORY); + register(CUSTOM_MODEL_DATA, CustomModelDataConditionProperty.FACTORY); + register(HAS_COMPONENT, HasComponentConditionProperty.FACTORY); + register(KEYBIND_DOWN, KeyBindDownConditionProperty.FACTORY); + } + + public static void register(Key key, ConditionPropertyFactory factory) { + Holder.Reference holder = ((WritableRegistry) BuiltInRegistries.CONDITION_PROPERTY_FACTORY) + .registerForHolder(new ResourceKey<>(Registries.CONDITION_PROPERTY_FACTORY.location(), key)); + holder.bindValue(factory); + } + + public static ConditionProperty fromMap(Map map) { + String type = (String) map.get("property"); + if (type == null) { + throw new NullPointerException("property type cannot be null"); + } + Key key = Key.withDefaultNamespace(type, "minecraft"); + ConditionPropertyFactory factory = BuiltInRegistries.CONDITION_PROPERTY_FACTORY.getValue(key); + if (factory == null) { + throw new IllegalArgumentException("Unknown property type: " + type); + } + return factory.create(map); + } +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/pack/model/condition/ConditionProperty.java b/core/src/main/java/net/momirealms/craftengine/core/pack/model/condition/ConditionProperty.java new file mode 100644 index 000000000..4680c534e --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/pack/model/condition/ConditionProperty.java @@ -0,0 +1,11 @@ +package net.momirealms.craftengine.core.pack.model.condition; + +import com.google.gson.JsonObject; +import net.momirealms.craftengine.core.util.Key; + +import java.util.function.Consumer; + +public interface ConditionProperty extends Consumer { + + Key type(); +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/pack/model/condition/ConditionPropertyFactory.java b/core/src/main/java/net/momirealms/craftengine/core/pack/model/condition/ConditionPropertyFactory.java new file mode 100644 index 000000000..b3d60032b --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/pack/model/condition/ConditionPropertyFactory.java @@ -0,0 +1,8 @@ +package net.momirealms.craftengine.core.pack.model.condition; + +import java.util.Map; + +public interface ConditionPropertyFactory { + + ConditionProperty create(Map arguments); +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/pack/model/condition/CustomModelDataConditionProperty.java b/core/src/main/java/net/momirealms/craftengine/core/pack/model/condition/CustomModelDataConditionProperty.java new file mode 100644 index 000000000..3cfea5b88 --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/pack/model/condition/CustomModelDataConditionProperty.java @@ -0,0 +1,37 @@ +package net.momirealms.craftengine.core.pack.model.condition; + +import com.google.gson.JsonObject; +import net.momirealms.craftengine.core.util.Key; +import net.momirealms.craftengine.core.util.MiscUtils; + +import java.util.Map; + +public class CustomModelDataConditionProperty implements ConditionProperty { + public static final Factory FACTORY = new Factory(); + private final int index; + + public CustomModelDataConditionProperty(int index) { + this.index = index; + } + + @Override + public Key type() { + return ConditionProperties.CUSTOM_MODEL_DATA; + } + + @Override + public void accept(JsonObject jsonObject) { + jsonObject.addProperty("property", type().toString()); + if (index != 0) + jsonObject.addProperty("index", index); + } + + public static class Factory implements ConditionPropertyFactory { + + @Override + public ConditionProperty create(Map arguments) { + int index = MiscUtils.getAsInt(arguments.getOrDefault("index", 0)); + return new CustomModelDataConditionProperty(index); + } + } +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/pack/model/condition/DamagedConditionProperty.java b/core/src/main/java/net/momirealms/craftengine/core/pack/model/condition/DamagedConditionProperty.java new file mode 100644 index 000000000..c6ace3972 --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/pack/model/condition/DamagedConditionProperty.java @@ -0,0 +1,38 @@ +package net.momirealms.craftengine.core.pack.model.condition; + +import com.google.gson.JsonObject; +import net.momirealms.craftengine.core.pack.model.LegacyModelPredicate; +import net.momirealms.craftengine.core.util.Key; + +import java.util.Map; + +public class DamagedConditionProperty implements ConditionProperty, LegacyModelPredicate { + public static final Factory FACTORY = new Factory(); + + @Override + public Key type() { + return ConditionProperties.DAMAGED; + } + + @Override + public void accept(JsonObject jsonObject) { + jsonObject.addProperty("property", type().toString()); + } + + @Override + public String legacyPredicateId(Key material) { + return "damaged"; + } + + @Override + public Number toLegacyValue(Boolean value) { + return value ? 1 : 0; + } + + public static class Factory implements ConditionPropertyFactory { + @Override + public ConditionProperty create(Map arguments) { + return new DamagedConditionProperty(); + } + } +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/pack/model/condition/HasComponentConditionProperty.java b/core/src/main/java/net/momirealms/craftengine/core/pack/model/condition/HasComponentConditionProperty.java new file mode 100644 index 000000000..790e8b87d --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/pack/model/condition/HasComponentConditionProperty.java @@ -0,0 +1,42 @@ +package net.momirealms.craftengine.core.pack.model.condition; + +import com.google.gson.JsonObject; +import net.momirealms.craftengine.core.util.Key; + +import java.util.Map; +import java.util.Objects; + +public class HasComponentConditionProperty implements ConditionProperty { + public static final Factory FACTORY = new Factory(); + private final String component; + private final boolean ignoreDefault; + + public HasComponentConditionProperty(String component, boolean ignoreDefault) { + this.component = component; + this.ignoreDefault = ignoreDefault; + } + + @Override + public Key type() { + return ConditionProperties.HAS_COMPONENT; + } + + @Override + public void accept(JsonObject jsonObject) { + jsonObject.addProperty("property", type().toString()); + jsonObject.addProperty("component", component); + if (ignoreDefault) { + jsonObject.addProperty("ignore_default", true); + } + } + + public static class Factory implements ConditionPropertyFactory { + + @Override + public ConditionProperty create(Map arguments) { + boolean ignoreDefault = (boolean) arguments.getOrDefault("ignore-default", false); + String component = Objects.requireNonNull(arguments.get("component"), "component").toString(); + return new HasComponentConditionProperty(component, ignoreDefault); + } + } +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/pack/model/condition/KeyBindDownConditionProperty.java b/core/src/main/java/net/momirealms/craftengine/core/pack/model/condition/KeyBindDownConditionProperty.java new file mode 100644 index 000000000..19df014e9 --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/pack/model/condition/KeyBindDownConditionProperty.java @@ -0,0 +1,36 @@ +package net.momirealms.craftengine.core.pack.model.condition; + +import com.google.gson.JsonObject; +import net.momirealms.craftengine.core.util.Key; + +import java.util.Map; +import java.util.Objects; + +public class KeyBindDownConditionProperty implements ConditionProperty { + public static final Factory FACTORY = new Factory(); + private final String keybind; + + public KeyBindDownConditionProperty(String keybind) { + this.keybind = keybind; + } + + @Override + public Key type() { + return ConditionProperties.KEYBIND_DOWN; + } + + @Override + public void accept(JsonObject jsonObject) { + jsonObject.addProperty("property", type().toString()); + jsonObject.addProperty("keybind", keybind); + } + + public static class Factory implements ConditionPropertyFactory { + + @Override + public ConditionProperty create(Map arguments) { + String keybind = Objects.requireNonNull(arguments.get("keybind"), "keybind").toString(); + return new KeyBindDownConditionProperty(keybind); + } + } +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/pack/model/condition/RodCastConditionProperty.java b/core/src/main/java/net/momirealms/craftengine/core/pack/model/condition/RodCastConditionProperty.java new file mode 100644 index 000000000..d228e33a2 --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/pack/model/condition/RodCastConditionProperty.java @@ -0,0 +1,40 @@ +package net.momirealms.craftengine.core.pack.model.condition; + +import com.google.gson.JsonObject; +import net.momirealms.craftengine.core.item.ItemKeys; +import net.momirealms.craftengine.core.pack.model.LegacyModelPredicate; +import net.momirealms.craftengine.core.util.Key; + +import java.util.Map; + +public class RodCastConditionProperty implements ConditionProperty, LegacyModelPredicate { + public static final Factory FACTORY = new Factory(); + + @Override + public Key type() { + return ConditionProperties.FISHING_ROD_CAST; + } + + @Override + public void accept(JsonObject jsonObject) { + jsonObject.addProperty("property", type().toString()); + } + + @Override + public String legacyPredicateId(Key material) { + if (material.equals(ItemKeys.FISHING_ROD)) return "cast"; + return null; + } + + @Override + public Number toLegacyValue(Boolean value) { + return value ? 1 : 0; + } + + public static class Factory implements ConditionPropertyFactory { + @Override + public ConditionProperty create(Map arguments) { + return new RodCastConditionProperty(); + } + } +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/pack/model/condition/SimpleConditionProperty.java b/core/src/main/java/net/momirealms/craftengine/core/pack/model/condition/SimpleConditionProperty.java new file mode 100644 index 000000000..70d9709e5 --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/pack/model/condition/SimpleConditionProperty.java @@ -0,0 +1,33 @@ +package net.momirealms.craftengine.core.pack.model.condition; + +import com.google.gson.JsonObject; +import net.momirealms.craftengine.core.util.Key; + +import java.util.Map; + +public class SimpleConditionProperty implements ConditionProperty { + public static final Factory FACTORY = new Factory(); + private final Key type; + + public SimpleConditionProperty(Key type) { + this.type = type; + } + + @Override + public Key type() { + return type; + } + + @Override + public void accept(JsonObject jsonObject) { + jsonObject.addProperty("property", type().toString()); + } + + public static class Factory implements ConditionPropertyFactory { + @Override + public ConditionProperty create(Map arguments) { + Key type = Key.of(arguments.get("property").toString()); + return new SimpleConditionProperty(type); + } + } +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/pack/model/condition/UsingItemConditionProperty.java b/core/src/main/java/net/momirealms/craftengine/core/pack/model/condition/UsingItemConditionProperty.java new file mode 100644 index 000000000..08cd5ad2f --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/pack/model/condition/UsingItemConditionProperty.java @@ -0,0 +1,43 @@ +package net.momirealms.craftengine.core.pack.model.condition; + +import com.google.gson.JsonObject; +import net.momirealms.craftengine.core.item.ItemKeys; +import net.momirealms.craftengine.core.pack.model.LegacyModelPredicate; +import net.momirealms.craftengine.core.util.Key; + +import java.util.Map; + +public class UsingItemConditionProperty implements ConditionProperty, LegacyModelPredicate { + public static final Factory FACTORY = new Factory(); + + @Override + public Key type() { + return ConditionProperties.USING_ITEM; + } + + @Override + public void accept(JsonObject jsonObject) { + jsonObject.addProperty("property", type().toString()); + } + + @Override + public String legacyPredicateId(Key material) { + if (material.equals(ItemKeys.SHIELD)) return "blocking"; + if (material.equals(ItemKeys.TRIDENT)) return "throwing"; + if (material.equals(ItemKeys.CROSSBOW) || material.equals(ItemKeys.BOW)) return "pulling"; + if (material.equals(ItemKeys.GOAT_HORN)) return "tooting"; + return null; + } + + @Override + public Number toLegacyValue(Boolean value) { + return value ? 1 : 0; + } + + public static class Factory implements ConditionPropertyFactory { + @Override + public ConditionProperty create(Map arguments) { + return new UsingItemConditionProperty(); + } + } +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/pack/model/generator/AbstractModelGenerator.java b/core/src/main/java/net/momirealms/craftengine/core/pack/model/generator/AbstractModelGenerator.java new file mode 100644 index 000000000..53ba90b3f --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/pack/model/generator/AbstractModelGenerator.java @@ -0,0 +1,40 @@ +package net.momirealms.craftengine.core.pack.model.generator; + +import net.momirealms.craftengine.core.plugin.CraftEngine; +import net.momirealms.craftengine.core.util.Key; + +import java.util.Collection; +import java.util.HashMap; +import java.util.Map; + +public abstract class AbstractModelGenerator implements ModelGenerator { + protected final CraftEngine plugin; + protected final Map modelsToGenerate = new HashMap<>(); + + public AbstractModelGenerator(CraftEngine plugin) { + this.plugin = plugin; + } + + @Override + public Collection modelsToGenerate() { + return this.modelsToGenerate.values(); + } + + @Override + public void clearModelsToGenerate() { + this.modelsToGenerate.clear(); + } + + @Override + public void prepareModelGeneration(ModelGeneration model) { + ModelGeneration generation = this.modelsToGenerate.get(model.path()); + if (generation != null) { + if (generation.equals(model)) { + return; + } + this.plugin.logger().severe("Two or more configurations attempt to generate different json models with the same path: " + model.path()); + return; + } + this.modelsToGenerate.put(model.path(), model); + } +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/pack/model/generator/ModelGeneration.java b/core/src/main/java/net/momirealms/craftengine/core/pack/model/generator/ModelGeneration.java new file mode 100644 index 000000000..50a6ad3d0 --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/pack/model/generator/ModelGeneration.java @@ -0,0 +1,96 @@ +package net.momirealms.craftengine.core.pack.model.generator; + +import com.google.gson.JsonObject; +import dev.dejvokep.boostedyaml.block.implementation.Section; +import net.momirealms.craftengine.core.util.Key; +import net.momirealms.craftengine.core.util.MiscUtils; + +import java.util.Collections; +import java.util.LinkedHashMap; +import java.util.Map; +import java.util.Objects; + +public class ModelGeneration { + private final Key path; + private final String parentModelPath; + private final Map texturesOverride; + + public ModelGeneration(Key path, String parentModelPath, Map texturesOverride) { + this.path = path; + this.parentModelPath = parentModelPath; + this.texturesOverride = texturesOverride; + } + + public ModelGeneration(Key path, Section section) { + this.path = path; + this.parentModelPath = Objects.requireNonNull(section.getString("parent")); + Section texturesSection = section.getSection("textures"); + if (texturesSection != null) { + this.texturesOverride = new LinkedHashMap<>(); + for (Map.Entry entry : texturesSection.getStringRouteMappedValues(false).entrySet()) { + if (entry.getValue() instanceof String p) { + this.texturesOverride.put(entry.getKey(), p); + } + } + } else { + this.texturesOverride = Collections.emptyMap(); + } + } + + public ModelGeneration(Key path, Map map) { + this.path = path; + this.parentModelPath = Objects.requireNonNull((String) map.get("parent")); + Map texturesMap = MiscUtils.castToMap(map.get("textures"), true); + if (texturesMap != null) { + this.texturesOverride = new LinkedHashMap<>(); + for (Map.Entry entry : texturesMap.entrySet()) { + if (entry.getValue() instanceof String p) { + this.texturesOverride.put(entry.getKey(), p); + } + } + } else { + this.texturesOverride = Collections.emptyMap(); + } + } + + public Key path() { + return path; + } + + public String parentModelPath() { + return parentModelPath; + } + + public Map texturesOverride() { + return texturesOverride; + } + + public JsonObject getJson() { + JsonObject model = new JsonObject(); + model.addProperty("parent", parentModelPath); + if (this.texturesOverride != null && !this.texturesOverride.isEmpty()) { + JsonObject textures = new JsonObject(); + for (Map.Entry entry : this.texturesOverride.entrySet()) { + textures.addProperty(entry.getKey(), entry.getValue()); + } + model.add("textures", textures); + } + return model; + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + ModelGeneration that = (ModelGeneration) o; + return this.path.equals(that.path) && parentModelPath.equals(that.parentModelPath) && Objects.equals(texturesOverride, that.texturesOverride); + } + + @Override + public int hashCode() { + int result = path.hashCode(); + result = 31 * result + parentModelPath.hashCode(); + result = 31 * result + texturesOverride.hashCode(); + return result; + } +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/pack/model/generator/ModelGenerator.java b/core/src/main/java/net/momirealms/craftengine/core/pack/model/generator/ModelGenerator.java new file mode 100644 index 000000000..4e31ffcbb --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/pack/model/generator/ModelGenerator.java @@ -0,0 +1,11 @@ +package net.momirealms.craftengine.core.pack.model.generator; + +import java.util.Collection; + +public interface ModelGenerator { + Collection modelsToGenerate(); + + void clearModelsToGenerate(); + + void prepareModelGeneration(ModelGeneration model); +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/pack/model/rangedisptach/CompassRangeDispatchProperty.java b/core/src/main/java/net/momirealms/craftengine/core/pack/model/rangedisptach/CompassRangeDispatchProperty.java new file mode 100644 index 000000000..0481ace29 --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/pack/model/rangedisptach/CompassRangeDispatchProperty.java @@ -0,0 +1,36 @@ +package net.momirealms.craftengine.core.pack.model.rangedisptach; + +import com.google.gson.JsonObject; +import net.momirealms.craftengine.core.util.Key; + +import java.util.Map; +import java.util.Objects; + +public class CompassRangeDispatchProperty implements RangeDispatchProperty { + public static final Factory FACTORY = new Factory(); + private final String target; + + public CompassRangeDispatchProperty(String target) { + this.target = target; + } + + @Override + public Key type() { + return RangeDispatchProperties.COMPASS; + } + + @Override + public void accept(JsonObject jsonObject) { + jsonObject.addProperty("property", type().toString()); + jsonObject.addProperty("target", target); + } + + public static class Factory implements RangeDispatchPropertyFactory { + + @Override + public RangeDispatchProperty create(Map arguments) { + String target = Objects.requireNonNull(arguments.get("target")).toString(); + return new CompassRangeDispatchProperty(target); + } + } +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/pack/model/rangedisptach/CrossBowPullingRangeDispatchProperty.java b/core/src/main/java/net/momirealms/craftengine/core/pack/model/rangedisptach/CrossBowPullingRangeDispatchProperty.java new file mode 100644 index 000000000..74c3d336c --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/pack/model/rangedisptach/CrossBowPullingRangeDispatchProperty.java @@ -0,0 +1,41 @@ +package net.momirealms.craftengine.core.pack.model.rangedisptach; + +import com.google.gson.JsonObject; +import net.momirealms.craftengine.core.item.ItemKeys; +import net.momirealms.craftengine.core.pack.model.LegacyModelPredicate; +import net.momirealms.craftengine.core.util.Key; + +import java.util.Map; + +public class CrossBowPullingRangeDispatchProperty implements RangeDispatchProperty, LegacyModelPredicate { + public static final Factory FACTORY = new Factory(); + + @Override + public void accept(JsonObject jsonObject) { + jsonObject.addProperty("property", type().toString()); + } + + @Override + public Key type() { + return RangeDispatchProperties.CROSSBOW_PULL; + } + + @Override + public String legacyPredicateId(Key material) { + if (material.equals(ItemKeys.CROSSBOW) || material.equals(ItemKeys.BOW)) return "pull"; + return null; + } + + @Override + public Number toLegacyValue(Float value) { + return value; + } + + public static class Factory implements RangeDispatchPropertyFactory { + + @Override + public RangeDispatchProperty create(Map arguments) { + return new CrossBowPullingRangeDispatchProperty(); + } + } +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/pack/model/rangedisptach/CustomModelDataRangeDispatchProperty.java b/core/src/main/java/net/momirealms/craftengine/core/pack/model/rangedisptach/CustomModelDataRangeDispatchProperty.java new file mode 100644 index 000000000..52a0aab71 --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/pack/model/rangedisptach/CustomModelDataRangeDispatchProperty.java @@ -0,0 +1,47 @@ +package net.momirealms.craftengine.core.pack.model.rangedisptach; + +import com.google.gson.JsonObject; +import net.momirealms.craftengine.core.pack.model.LegacyModelPredicate; +import net.momirealms.craftengine.core.util.Key; +import net.momirealms.craftengine.core.util.MiscUtils; + +import java.util.Map; + +public class CustomModelDataRangeDispatchProperty implements RangeDispatchProperty, LegacyModelPredicate { + public static final Factory FACTORY = new Factory(); + private final int index; + + public CustomModelDataRangeDispatchProperty(int index) { + this.index = index; + } + + @Override + public Key type() { + return RangeDispatchProperties.CUSTOM_MODEL_DATA; + } + + @Override + public void accept(JsonObject jsonObject) { + jsonObject.addProperty("property", type().toString()); + jsonObject.addProperty("index", index); + } + + @Override + public String legacyPredicateId(Key material) { + return "custom_model_data"; + } + + @Override + public Number toLegacyValue(Float value) { + return value.intValue(); + } + + public static class Factory implements RangeDispatchPropertyFactory { + + @Override + public RangeDispatchProperty create(Map arguments) { + int index = MiscUtils.getAsInt(arguments.getOrDefault("index", 0)); + return new CustomModelDataRangeDispatchProperty(index); + } + } +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/pack/model/rangedisptach/DamageRangeDispatchProperty.java b/core/src/main/java/net/momirealms/craftengine/core/pack/model/rangedisptach/DamageRangeDispatchProperty.java new file mode 100644 index 000000000..1bdf0e52a --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/pack/model/rangedisptach/DamageRangeDispatchProperty.java @@ -0,0 +1,50 @@ +package net.momirealms.craftengine.core.pack.model.rangedisptach; + +import com.google.gson.JsonObject; +import net.momirealms.craftengine.core.pack.model.LegacyModelPredicate; +import net.momirealms.craftengine.core.util.Key; + +import java.util.Map; + +public class DamageRangeDispatchProperty implements RangeDispatchProperty, LegacyModelPredicate { + public static final Factory FACTORY = new Factory(); + private final boolean normalize; + + public DamageRangeDispatchProperty(boolean normalize) { + this.normalize = normalize; + } + + @Override + public Key type() { + return RangeDispatchProperties.DAMAGE; + } + + @Override + public void accept(JsonObject jsonObject) { + jsonObject.addProperty("property", type().toString()); + if (!normalize) { + jsonObject.addProperty("normalize", false); + } + } + + @Override + public String legacyPredicateId(Key material) { + if (this.normalize) return "damage"; + throw new RuntimeException("Enable 'normalize' option if you want to use 'damage' on 1.21.3 and below"); + } + + @Override + public Number toLegacyValue(Float value) { + if (this.normalize) return value; + throw new RuntimeException("Enable 'normalize' option if you want to use 'damage' on 1.21.3 and below"); + } + + public static class Factory implements RangeDispatchPropertyFactory { + + @Override + public RangeDispatchProperty create(Map arguments) { + boolean normalize = (boolean) arguments.getOrDefault("normalize", true); + return new DamageRangeDispatchProperty(normalize); + } + } +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/pack/model/rangedisptach/NormalizeRangeDispatchProperty.java b/core/src/main/java/net/momirealms/craftengine/core/pack/model/rangedisptach/NormalizeRangeDispatchProperty.java new file mode 100644 index 000000000..39877b474 --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/pack/model/rangedisptach/NormalizeRangeDispatchProperty.java @@ -0,0 +1,40 @@ +package net.momirealms.craftengine.core.pack.model.rangedisptach; + +import com.google.gson.JsonObject; +import net.momirealms.craftengine.core.util.Key; + +import java.util.Map; + +public class NormalizeRangeDispatchProperty implements RangeDispatchProperty { + public static final Factory FACTORY = new Factory(); + private final Key type; + private final boolean normalize; + + public NormalizeRangeDispatchProperty(Key type, boolean normalize) { + this.type = type; + this.normalize = normalize; + } + + @Override + public Key type() { + return type; + } + + @Override + public void accept(JsonObject jsonObject) { + jsonObject.addProperty("property", type().toString()); + if (!normalize) { + jsonObject.addProperty("normalize", false); + } + } + + public static class Factory implements RangeDispatchPropertyFactory { + + @Override + public RangeDispatchProperty create(Map arguments) { + Key type = Key.of(arguments.get("property").toString()); + boolean normalize = (boolean) arguments.getOrDefault("normalize", true); + return new NormalizeRangeDispatchProperty(type, normalize); + } + } +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/pack/model/rangedisptach/RangeDispatchProperties.java b/core/src/main/java/net/momirealms/craftengine/core/pack/model/rangedisptach/RangeDispatchProperties.java new file mode 100644 index 000000000..087a3acaa --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/pack/model/rangedisptach/RangeDispatchProperties.java @@ -0,0 +1,55 @@ +package net.momirealms.craftengine.core.pack.model.rangedisptach; + +import net.momirealms.craftengine.core.registry.BuiltInRegistries; +import net.momirealms.craftengine.core.registry.Holder; +import net.momirealms.craftengine.core.registry.Registries; +import net.momirealms.craftengine.core.registry.WritableRegistry; +import net.momirealms.craftengine.core.util.Key; +import net.momirealms.craftengine.core.util.ResourceKey; + +import java.util.Map; + +public class RangeDispatchProperties { + public static final Key BUNDLE_FULLNESS = Key.of("minecraft:bundle/fullness"); + public static final Key COMPASS = Key.of("minecraft:compass"); + public static final Key COOLDOWN = Key.of("minecraft:cooldown"); + public static final Key COUNT = Key.of("minecraft:count"); + public static final Key CROSSBOW_PULL = Key.of("minecraft:crossbow/pull"); + public static final Key CUSTOM_MODEL_DATA = Key.of("minecraft:custom_model_data"); + public static final Key DAMAGE = Key.of("minecraft:damage"); + public static final Key TIME = Key.of("minecraft:time"); + public static final Key USE_CYCLE = Key.of("minecraft:use_cycle"); + public static final Key USE_DURATION = Key.of("minecraft:use_duration"); + + static { + register(BUNDLE_FULLNESS, SimpleRangeDispatchProperty.FACTORY); + register(COOLDOWN, SimpleRangeDispatchProperty.FACTORY); + register(CROSSBOW_PULL, CrossBowPullingRangeDispatchProperty.FACTORY); + register(COMPASS, CompassRangeDispatchProperty.FACTORY); + register(COUNT, NormalizeRangeDispatchProperty.FACTORY); + register(DAMAGE, DamageRangeDispatchProperty.FACTORY); + register(CUSTOM_MODEL_DATA, CustomModelDataRangeDispatchProperty.FACTORY); + register(TIME, TimeRangeDispatchProperty.FACTORY); + register(USE_CYCLE, UseCycleRangeDispatchProperty.FACTORY); + register(USE_DURATION, UseDurationRangeDispatchProperty.FACTORY); + } + + public static void register(Key key, RangeDispatchPropertyFactory factory) { + Holder.Reference holder = ((WritableRegistry) BuiltInRegistries.RANGE_DISPATCH_PROPERTY_FACTORY) + .registerForHolder(new ResourceKey<>(Registries.RANGE_DISPATCH_PROPERTY_FACTORY.location(), key)); + holder.bindValue(factory); + } + + public static RangeDispatchProperty fromMap(Map map) { + String type = (String) map.get("property"); + if (type == null) { + throw new NullPointerException("property type cannot be null"); + } + Key key = Key.withDefaultNamespace(type, "minecraft"); + RangeDispatchPropertyFactory factory = BuiltInRegistries.RANGE_DISPATCH_PROPERTY_FACTORY.getValue(key); + if (factory == null) { + throw new IllegalArgumentException("Unknown property type: " + type); + } + return factory.create(map); + } +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/pack/model/rangedisptach/RangeDispatchProperty.java b/core/src/main/java/net/momirealms/craftengine/core/pack/model/rangedisptach/RangeDispatchProperty.java new file mode 100644 index 000000000..c6fb47b48 --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/pack/model/rangedisptach/RangeDispatchProperty.java @@ -0,0 +1,11 @@ +package net.momirealms.craftengine.core.pack.model.rangedisptach; + +import com.google.gson.JsonObject; +import net.momirealms.craftengine.core.util.Key; + +import java.util.function.Consumer; + +public interface RangeDispatchProperty extends Consumer { + + Key type(); +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/pack/model/rangedisptach/RangeDispatchPropertyFactory.java b/core/src/main/java/net/momirealms/craftengine/core/pack/model/rangedisptach/RangeDispatchPropertyFactory.java new file mode 100644 index 000000000..0d5a274de --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/pack/model/rangedisptach/RangeDispatchPropertyFactory.java @@ -0,0 +1,8 @@ +package net.momirealms.craftengine.core.pack.model.rangedisptach; + +import java.util.Map; + +public interface RangeDispatchPropertyFactory { + + RangeDispatchProperty create(Map arguments); +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/pack/model/rangedisptach/SimpleRangeDispatchProperty.java b/core/src/main/java/net/momirealms/craftengine/core/pack/model/rangedisptach/SimpleRangeDispatchProperty.java new file mode 100644 index 000000000..e354b683c --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/pack/model/rangedisptach/SimpleRangeDispatchProperty.java @@ -0,0 +1,34 @@ +package net.momirealms.craftengine.core.pack.model.rangedisptach; + +import com.google.gson.JsonObject; +import net.momirealms.craftengine.core.util.Key; + +import java.util.Map; + +public class SimpleRangeDispatchProperty implements RangeDispatchProperty { + public static final Factory FACTORY = new Factory(); + private final Key type; + + public SimpleRangeDispatchProperty(Key type) { + this.type = type; + } + + @Override + public void accept(JsonObject jsonObject) { + jsonObject.addProperty("property", type.toString()); + } + + @Override + public Key type() { + return type; + } + + public static class Factory implements RangeDispatchPropertyFactory { + + @Override + public RangeDispatchProperty create(Map arguments) { + Key type = Key.of(arguments.get("property").toString()); + return new SimpleRangeDispatchProperty(type); + } + } +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/pack/model/rangedisptach/TimeRangeDispatchProperty.java b/core/src/main/java/net/momirealms/craftengine/core/pack/model/rangedisptach/TimeRangeDispatchProperty.java new file mode 100644 index 000000000..de8bc007f --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/pack/model/rangedisptach/TimeRangeDispatchProperty.java @@ -0,0 +1,42 @@ +package net.momirealms.craftengine.core.pack.model.rangedisptach; + +import com.google.gson.JsonObject; +import net.momirealms.craftengine.core.util.Key; + +import java.util.Map; +import java.util.Objects; + +public class TimeRangeDispatchProperty implements RangeDispatchProperty { + public static final Factory FACTORY = new Factory(); + private final String source; + private final boolean wobble; + + public TimeRangeDispatchProperty(String source, boolean wobble) { + this.source = source; + this.wobble = wobble; + } + + @Override + public Key type() { + return RangeDispatchProperties.TIME; + } + + @Override + public void accept(JsonObject jsonObject) { + jsonObject.addProperty("property", type().toString()); + jsonObject.addProperty("source", source); + if (!wobble) { + jsonObject.addProperty("wobble", false); + } + } + + public static class Factory implements RangeDispatchPropertyFactory { + + @Override + public RangeDispatchProperty create(Map arguments) { + String source = Objects.requireNonNull(arguments.get("source")).toString(); + boolean wobble = (boolean) arguments.getOrDefault("wobble", true); + return new TimeRangeDispatchProperty(source, wobble); + } + } +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/pack/model/rangedisptach/UseCycleRangeDispatchProperty.java b/core/src/main/java/net/momirealms/craftengine/core/pack/model/rangedisptach/UseCycleRangeDispatchProperty.java new file mode 100644 index 000000000..ff2e71104 --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/pack/model/rangedisptach/UseCycleRangeDispatchProperty.java @@ -0,0 +1,36 @@ +package net.momirealms.craftengine.core.pack.model.rangedisptach; + +import com.google.gson.JsonObject; +import net.momirealms.craftengine.core.util.Key; +import net.momirealms.craftengine.core.util.MiscUtils; + +import java.util.Map; + +public class UseCycleRangeDispatchProperty implements RangeDispatchProperty { + public static final Factory FACTORY = new Factory(); + private final int period; + + public UseCycleRangeDispatchProperty(int period) { + this.period = period; + } + + @Override + public Key type() { + return RangeDispatchProperties.USE_CYCLE; + } + + @Override + public void accept(JsonObject jsonObject) { + jsonObject.addProperty("property", type().toString()); + jsonObject.addProperty("period", period); + } + + public static class Factory implements RangeDispatchPropertyFactory { + + @Override + public RangeDispatchProperty create(Map arguments) { + int period = MiscUtils.getAsInt(arguments.getOrDefault("period", 0)); + return new UseCycleRangeDispatchProperty(period); + } + } +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/pack/model/rangedisptach/UseDurationRangeDispatchProperty.java b/core/src/main/java/net/momirealms/craftengine/core/pack/model/rangedisptach/UseDurationRangeDispatchProperty.java new file mode 100644 index 000000000..3f440c5a8 --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/pack/model/rangedisptach/UseDurationRangeDispatchProperty.java @@ -0,0 +1,50 @@ +package net.momirealms.craftengine.core.pack.model.rangedisptach; + +import com.google.gson.JsonObject; +import net.momirealms.craftengine.core.item.ItemKeys; +import net.momirealms.craftengine.core.pack.model.LegacyModelPredicate; +import net.momirealms.craftengine.core.util.Key; + +import java.util.Map; + +public class UseDurationRangeDispatchProperty implements RangeDispatchProperty, LegacyModelPredicate { + public static final Factory FACTORY = new Factory(); + private final boolean remaining; + + public UseDurationRangeDispatchProperty(boolean remaining) { + this.remaining = remaining; + } + + @Override + public Key type() { + return RangeDispatchProperties.USE_DURATION; + } + + @Override + public void accept(JsonObject jsonObject) { + jsonObject.addProperty("property", type().toString()); + if (remaining) { + jsonObject.addProperty("remaining", true); + } + } + + @Override + public String legacyPredicateId(Key material) { + if (material.equals(ItemKeys.BOW)) return "pull"; + return null; + } + + @Override + public Number toLegacyValue(Float value) { + return value; + } + + public static class Factory implements RangeDispatchPropertyFactory { + + @Override + public RangeDispatchProperty create(Map arguments) { + boolean remaining = (boolean) arguments.getOrDefault("remaining", false); + return new UseDurationRangeDispatchProperty(remaining); + } + } +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/pack/model/select/BlockStateSelectProperty.java b/core/src/main/java/net/momirealms/craftengine/core/pack/model/select/BlockStateSelectProperty.java new file mode 100644 index 000000000..92c67a2a2 --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/pack/model/select/BlockStateSelectProperty.java @@ -0,0 +1,36 @@ +package net.momirealms.craftengine.core.pack.model.select; + +import com.google.gson.JsonObject; +import net.momirealms.craftengine.core.util.Key; + +import java.util.Map; +import java.util.Objects; + +public class BlockStateSelectProperty implements SelectProperty { + public static final Factory FACTORY = new Factory(); + private final String blockStateProperty; + + public BlockStateSelectProperty(String blockStateProperty) { + this.blockStateProperty = blockStateProperty; + } + + @Override + public Key type() { + return SelectProperties.BLOCK_STATE; + } + + @Override + public void accept(JsonObject jsonObject) { + jsonObject.addProperty("property", type().toString()); + jsonObject.addProperty("block_state_property", blockStateProperty); + } + + public static class Factory implements SelectPropertyFactory { + + @Override + public SelectProperty create(Map arguments) { + String blockStateProperty = Objects.requireNonNull(arguments.get("block-state-property")).toString(); + return new BlockStateSelectProperty(blockStateProperty); + } + } +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/pack/model/select/ChargeTypeSelectProperty.java b/core/src/main/java/net/momirealms/craftengine/core/pack/model/select/ChargeTypeSelectProperty.java new file mode 100644 index 000000000..028b7db04 --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/pack/model/select/ChargeTypeSelectProperty.java @@ -0,0 +1,42 @@ +package net.momirealms.craftengine.core.pack.model.select; + +import com.google.gson.JsonObject; +import net.momirealms.craftengine.core.item.ItemKeys; +import net.momirealms.craftengine.core.pack.model.LegacyModelPredicate; +import net.momirealms.craftengine.core.util.Key; + +import java.util.Map; + +public class ChargeTypeSelectProperty implements SelectProperty, LegacyModelPredicate { + public static final Factory FACTORY = new Factory(); + + @Override + public Key type() { + return SelectProperties.CHARGE_TYPE; + } + + @Override + public void accept(JsonObject jsonObject) { + jsonObject.addProperty("property", type().toString()); + } + + @Override + public String legacyPredicateId(Key material) { + if (material.equals(ItemKeys.CROSSBOW)) return "firework"; + return null; + } + + @Override + public Number toLegacyValue(String value) { + if (value.equals("rocket")) return 1; + return 0; + } + + public static class Factory implements SelectPropertyFactory { + + @Override + public SelectProperty create(Map arguments) { + return new ChargeTypeSelectProperty(); + } + } +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/pack/model/select/CustomModelDataSelectProperty.java b/core/src/main/java/net/momirealms/craftengine/core/pack/model/select/CustomModelDataSelectProperty.java new file mode 100644 index 000000000..600f50e5b --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/pack/model/select/CustomModelDataSelectProperty.java @@ -0,0 +1,36 @@ +package net.momirealms.craftengine.core.pack.model.select; + +import com.google.gson.JsonObject; +import net.momirealms.craftengine.core.util.Key; +import net.momirealms.craftengine.core.util.MiscUtils; + +import java.util.Map; + +public class CustomModelDataSelectProperty implements SelectProperty { + public static final Factory FACTORY = new Factory(); + private final int index; + + public CustomModelDataSelectProperty(int index) { + this.index = index; + } + + @Override + public Key type() { + return SelectProperties.CUSTOM_MODEL_DATA; + } + + @Override + public void accept(JsonObject jsonObject) { + jsonObject.addProperty("property", type().toString()); + jsonObject.addProperty("index", index); + } + + public static class Factory implements SelectPropertyFactory { + + @Override + public SelectProperty create(Map arguments) { + int index = MiscUtils.getAsInt(arguments.getOrDefault("index", 0)); + return new CustomModelDataSelectProperty(index); + } + } +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/pack/model/select/LocalTimeSelectProperty.java b/core/src/main/java/net/momirealms/craftengine/core/pack/model/select/LocalTimeSelectProperty.java new file mode 100644 index 000000000..e89314e55 --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/pack/model/select/LocalTimeSelectProperty.java @@ -0,0 +1,52 @@ +package net.momirealms.craftengine.core.pack.model.select; + +import com.google.gson.JsonObject; +import net.momirealms.craftengine.core.util.Key; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +import java.util.Map; +import java.util.Objects; + +public class LocalTimeSelectProperty implements SelectProperty { + public static final Factory FACTORY = new Factory(); + private final String pattern; + private final String locale; + private final String timeZone; + + public LocalTimeSelectProperty(@NotNull String pattern, + @Nullable String locale, + @Nullable String timeZone) { + this.pattern = pattern; + this.locale = locale; + this.timeZone = timeZone; + } + + @Override + public Key type() { + return SelectProperties.LOCAL_TIME; + } + + @Override + public void accept(JsonObject jsonObject) { + jsonObject.addProperty("property", type().toString()); + jsonObject.addProperty("pattern", pattern); + if (locale != null) { + jsonObject.addProperty("locale", locale); + } + if (timeZone != null) { + jsonObject.addProperty("time_zone", timeZone); + } + } + + public static class Factory implements SelectPropertyFactory { + + @Override + public SelectProperty create(Map arguments) { + String pattern = Objects.requireNonNull(arguments.get("pattern")).toString(); + String locale = (String) arguments.get("locale"); + String timeZone = (String) arguments.get("time-zone"); + return new LocalTimeSelectProperty(pattern, locale, timeZone); + } + } +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/pack/model/select/MainHandSelectProperty.java b/core/src/main/java/net/momirealms/craftengine/core/pack/model/select/MainHandSelectProperty.java new file mode 100644 index 000000000..0a8912bfb --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/pack/model/select/MainHandSelectProperty.java @@ -0,0 +1,40 @@ +package net.momirealms.craftengine.core.pack.model.select; + +import com.google.gson.JsonObject; +import net.momirealms.craftengine.core.pack.model.LegacyModelPredicate; +import net.momirealms.craftengine.core.util.Key; + +import java.util.Map; + +public class MainHandSelectProperty implements SelectProperty, LegacyModelPredicate { + public static final Factory FACTORY = new Factory(); + + @Override + public Key type() { + return SelectProperties.MAIN_HAND; + } + + @Override + public void accept(JsonObject jsonObject) { + jsonObject.addProperty("property", type().toString()); + } + + @Override + public String legacyPredicateId(Key material) { + return "lefthanded"; + } + + @Override + public Number toLegacyValue(String value) { + if (value.equals("left")) return 1; + return 0; + } + + public static class Factory implements SelectPropertyFactory { + + @Override + public SelectProperty create(Map arguments) { + return new MainHandSelectProperty(); + } + } +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/pack/model/select/SelectProperties.java b/core/src/main/java/net/momirealms/craftengine/core/pack/model/select/SelectProperties.java new file mode 100644 index 000000000..bd01a1d6a --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/pack/model/select/SelectProperties.java @@ -0,0 +1,53 @@ +package net.momirealms.craftengine.core.pack.model.select; + +import net.momirealms.craftengine.core.registry.BuiltInRegistries; +import net.momirealms.craftengine.core.registry.Holder; +import net.momirealms.craftengine.core.registry.Registries; +import net.momirealms.craftengine.core.registry.WritableRegistry; +import net.momirealms.craftengine.core.util.Key; +import net.momirealms.craftengine.core.util.ResourceKey; + +import java.util.Map; + +public class SelectProperties { + public static final Key BLOCK_STATE = Key.of("minecraft:block_state"); + public static final Key CHARGE_TYPE = Key.of("minecraft:charge_type"); + public static final Key CONTEXT_DIMENSION = Key.of("minecraft:context_dimension"); + public static final Key CONTEXT_ENTITY_TYPE = Key.of("minecraft:context_entity_type"); + public static final Key CUSTOM_MODEL_DATA = Key.of("minecraft:custom_model_data"); + public static final Key DISPLAY_CONTEXT = Key.of("minecraft:display_context"); + public static final Key LOCAL_TIME = Key.of("minecraft:local_time"); + public static final Key MAIN_HAND = Key.of("minecraft:main_hand"); + public static final Key TRIM_MATERIAL = Key.of("minecraft:trim_material"); + + static { + register(CHARGE_TYPE, ChargeTypeSelectProperty.FACTORY); + register(CONTEXT_DIMENSION, SimpleSelectProperty.FACTORY); + register(CONTEXT_ENTITY_TYPE, SimpleSelectProperty.FACTORY); + register(DISPLAY_CONTEXT, SimpleSelectProperty.FACTORY); + register(MAIN_HAND, MainHandSelectProperty.FACTORY); + register(TRIM_MATERIAL, TrimMaterialSelectProperty.FACTORY); + register(BLOCK_STATE, BlockStateSelectProperty.FACTORY); + register(CUSTOM_MODEL_DATA, CustomModelDataSelectProperty.FACTORY); + register(LOCAL_TIME, LocalTimeSelectProperty.FACTORY); + } + + public static void register(Key key, SelectPropertyFactory factory) { + Holder.Reference holder = ((WritableRegistry) BuiltInRegistries.SELECT_PROPERTY_FACTORY) + .registerForHolder(new ResourceKey<>(Registries.SELECT_PROPERTY_FACTORY.location(), key)); + holder.bindValue(factory); + } + + public static SelectProperty fromMap(Map map) { + String type = (String) map.get("property"); + if (type == null) { + throw new NullPointerException("property type cannot be null"); + } + Key key = Key.withDefaultNamespace(type, "minecraft"); + SelectPropertyFactory factory = BuiltInRegistries.SELECT_PROPERTY_FACTORY.getValue(key); + if (factory == null) { + throw new IllegalArgumentException("Unknown property type: " + type); + } + return factory.create(map); + } +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/pack/model/select/SelectProperty.java b/core/src/main/java/net/momirealms/craftengine/core/pack/model/select/SelectProperty.java new file mode 100644 index 000000000..7e236d0b5 --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/pack/model/select/SelectProperty.java @@ -0,0 +1,11 @@ +package net.momirealms.craftengine.core.pack.model.select; + +import com.google.gson.JsonObject; +import net.momirealms.craftengine.core.util.Key; + +import java.util.function.Consumer; + +public interface SelectProperty extends Consumer { + + Key type(); +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/pack/model/select/SelectPropertyFactory.java b/core/src/main/java/net/momirealms/craftengine/core/pack/model/select/SelectPropertyFactory.java new file mode 100644 index 000000000..e44598784 --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/pack/model/select/SelectPropertyFactory.java @@ -0,0 +1,8 @@ +package net.momirealms.craftengine.core.pack.model.select; + +import java.util.Map; + +public interface SelectPropertyFactory { + + SelectProperty create(Map arguments); +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/pack/model/select/SimpleSelectProperty.java b/core/src/main/java/net/momirealms/craftengine/core/pack/model/select/SimpleSelectProperty.java new file mode 100644 index 000000000..d40592bb3 --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/pack/model/select/SimpleSelectProperty.java @@ -0,0 +1,34 @@ +package net.momirealms.craftengine.core.pack.model.select; + +import com.google.gson.JsonObject; +import net.momirealms.craftengine.core.util.Key; + +import java.util.Map; + +public class SimpleSelectProperty implements SelectProperty { + public static final Factory FACTORY = new Factory(); + private final Key type; + + public SimpleSelectProperty(Key type) { + this.type = type; + } + + @Override + public Key type() { + return type; + } + + @Override + public void accept(JsonObject jsonObject) { + jsonObject.addProperty("property", type().toString()); + } + + public static class Factory implements SelectPropertyFactory { + + @Override + public SelectProperty create(Map arguments) { + Key type = Key.of(arguments.get("property").toString()); + return new SimpleSelectProperty(type); + } + } +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/pack/model/select/TrimMaterialSelectProperty.java b/core/src/main/java/net/momirealms/craftengine/core/pack/model/select/TrimMaterialSelectProperty.java new file mode 100644 index 000000000..ce658ffff --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/pack/model/select/TrimMaterialSelectProperty.java @@ -0,0 +1,63 @@ +package net.momirealms.craftengine.core.pack.model.select; + +import com.google.gson.JsonObject; +import net.momirealms.craftengine.core.pack.model.LegacyModelPredicate; +import net.momirealms.craftengine.core.util.Key; + +import java.util.HashMap; +import java.util.Map; + +public class TrimMaterialSelectProperty implements SelectProperty, LegacyModelPredicate { + public static final Factory FACTORY = new Factory(); + private static final Map LEGACY_TRIM_DATA = new HashMap<>(); + static { + LEGACY_TRIM_DATA.put("minecraft:quartz", 0.1f); + LEGACY_TRIM_DATA.put("minecraft:iron", 0.2f); + LEGACY_TRIM_DATA.put("minecraft:netherite", 0.3f); + LEGACY_TRIM_DATA.put("minecraft:redstone", 0.4f); + LEGACY_TRIM_DATA.put("minecraft:copper", 0.5f); + LEGACY_TRIM_DATA.put("minecraft:gold", 0.6f); + LEGACY_TRIM_DATA.put("minecraft:emerald", 0.7f); + LEGACY_TRIM_DATA.put("minecraft:diamond", 0.8f); + LEGACY_TRIM_DATA.put("minecraft:lapis", 0.9f); + LEGACY_TRIM_DATA.put("minecraft:amethyst", 1.0f); + // INVALID + LEGACY_TRIM_DATA.put("minecraft:resin", 0F); + } + + @Override + public Key type() { + return SelectProperties.TRIM_MATERIAL; + } + + @Override + public void accept(JsonObject jsonObject) { + jsonObject.addProperty("property", type().toString()); + } + + @Override + public String legacyPredicateId(Key material) { + String s = material.toString(); + if (s.contains("helmet") || s.contains("chestplate") || s.contains("leggings") || s.contains("boots")) { + return "trim"; + } + return null; + } + + @Override + public Number toLegacyValue(String value) { + Float f = LEGACY_TRIM_DATA.get(value); + if (f == null) { + throw new IllegalArgumentException("Invalid trim material '" + value + "'"); + } + return f; + } + + public static class Factory implements SelectPropertyFactory { + + @Override + public SelectProperty create(Map arguments) { + return new TrimMaterialSelectProperty(); + } + } +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/pack/model/special/BannerSpecialModel.java b/core/src/main/java/net/momirealms/craftengine/core/pack/model/special/BannerSpecialModel.java new file mode 100644 index 000000000..847ad6c0d --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/pack/model/special/BannerSpecialModel.java @@ -0,0 +1,38 @@ +package net.momirealms.craftengine.core.pack.model.special; + +import com.google.gson.JsonObject; +import net.momirealms.craftengine.core.util.Key; + +import java.util.Map; +import java.util.Objects; + +public class BannerSpecialModel implements SpecialModel { + public static final Factory FACTORY = new Factory(); + private final String color; + + public BannerSpecialModel(String color) { + this.color = color; + } + + @Override + public Key type() { + return SpecialModels.BANNER; + } + + @Override + public JsonObject get() { + JsonObject json = new JsonObject(); + json.addProperty("type", type().toString()); + json.addProperty("color", color); + return json; + } + + public static class Factory implements SpecialModelFactory { + + @Override + public SpecialModel create(Map arguments) { + String color = Objects.requireNonNull(arguments.get("color"), "color").toString(); + return new BannerSpecialModel(color); + } + } +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/pack/model/special/BedSpecialModel.java b/core/src/main/java/net/momirealms/craftengine/core/pack/model/special/BedSpecialModel.java new file mode 100644 index 000000000..318f18252 --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/pack/model/special/BedSpecialModel.java @@ -0,0 +1,38 @@ +package net.momirealms.craftengine.core.pack.model.special; + +import com.google.gson.JsonObject; +import net.momirealms.craftengine.core.util.Key; + +import java.util.Map; +import java.util.Objects; + +public class BedSpecialModel implements SpecialModel { + public static final Factory FACTORY = new Factory(); + private final String texture; + + public BedSpecialModel(String texture) { + this.texture = texture; + } + + @Override + public Key type() { + return SpecialModels.BED; + } + + @Override + public JsonObject get() { + JsonObject json = new JsonObject(); + json.addProperty("type", type().toString()); + json.addProperty("texture", texture); + return json; + } + + public static class Factory implements SpecialModelFactory { + + @Override + public SpecialModel create(Map arguments) { + String color = Objects.requireNonNull(arguments.get("texture"), "texture").toString(); + return new BedSpecialModel(color); + } + } +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/pack/model/special/ChestSpecialModel.java b/core/src/main/java/net/momirealms/craftengine/core/pack/model/special/ChestSpecialModel.java new file mode 100644 index 000000000..7e1511e0f --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/pack/model/special/ChestSpecialModel.java @@ -0,0 +1,46 @@ +package net.momirealms.craftengine.core.pack.model.special; + +import com.google.gson.JsonObject; +import net.momirealms.craftengine.core.util.Key; +import net.momirealms.craftengine.core.util.MiscUtils; + +import java.util.Map; +import java.util.Objects; + +public class ChestSpecialModel implements SpecialModel { + public static final Factory FACTORY = new Factory(); + private final String texture; + private final float openness; + + public ChestSpecialModel(String texture, float openness) { + this.texture = texture; + this.openness = openness; + } + + @Override + public Key type() { + return SpecialModels.CHEST; + } + + @Override + public JsonObject get() { + JsonObject json = new JsonObject(); + json.addProperty("type", type().toString()); + json.addProperty("texture", texture); + json.addProperty("openness", openness); + return json; + } + + public static class Factory implements SpecialModelFactory { + + @Override + public SpecialModel create(Map arguments) { + float openness = MiscUtils.getAsFloat(arguments.getOrDefault("openness", 0)); + String texture = Objects.requireNonNull(arguments.get("texture"), "texture").toString(); + if (openness > 1 || openness < 0) { + throw new IllegalArgumentException("Invalid openness: " + openness + ". Valid range 0~1"); + } + return new ChestSpecialModel(texture, openness); + } + } +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/pack/model/special/HeadSpecialModel.java b/core/src/main/java/net/momirealms/craftengine/core/pack/model/special/HeadSpecialModel.java new file mode 100644 index 000000000..680b7cda2 --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/pack/model/special/HeadSpecialModel.java @@ -0,0 +1,47 @@ +package net.momirealms.craftengine.core.pack.model.special; + +import com.google.gson.JsonObject; +import net.momirealms.craftengine.core.util.Key; +import net.momirealms.craftengine.core.util.MiscUtils; + +import java.util.Map; +import java.util.Objects; + +public class HeadSpecialModel implements SpecialModel { + public static final Factory FACTORY = new Factory(); + private final String kind; + private final String texture; + private final int animation; + + public HeadSpecialModel(String kind, String texture, int animation) { + this.kind = kind; + this.texture = texture; + this.animation = animation; + } + + @Override + public Key type() { + return SpecialModels.HEAD; + } + + @Override + public JsonObject get() { + JsonObject json = new JsonObject(); + json.addProperty("type", type().toString()); + json.addProperty("kind", kind); + json.addProperty("texture", texture); + json.addProperty("animation", animation); + return json; + } + + public static class Factory implements SpecialModelFactory { + + @Override + public SpecialModel create(Map arguments) { + String kind = Objects.requireNonNull(arguments.get("kind"), "kind").toString(); + String texture = Objects.requireNonNull(arguments.get("texture"), "texture").toString(); + int animation = MiscUtils.getAsInt(arguments.getOrDefault("animation", 0)); + return new HeadSpecialModel(kind, texture, animation); + } + } +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/pack/model/special/ShulkerBoxSpecialModel.java b/core/src/main/java/net/momirealms/craftengine/core/pack/model/special/ShulkerBoxSpecialModel.java new file mode 100644 index 000000000..bc80c2693 --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/pack/model/special/ShulkerBoxSpecialModel.java @@ -0,0 +1,52 @@ +package net.momirealms.craftengine.core.pack.model.special; + +import com.google.gson.JsonObject; +import net.momirealms.craftengine.core.util.Direction; +import net.momirealms.craftengine.core.util.Key; +import net.momirealms.craftengine.core.util.MiscUtils; + +import java.util.Locale; +import java.util.Map; +import java.util.Objects; + +public class ShulkerBoxSpecialModel implements SpecialModel { + public static final Factory FACTORY = new Factory(); + private final String texture; + private final float openness; + private final Direction orientation; + + public ShulkerBoxSpecialModel(String texture, float openness, Direction orientation) { + this.texture = texture; + this.openness = openness; + this.orientation = orientation; + } + + @Override + public Key type() { + return SpecialModels.SHULKER_BOX; + } + + @Override + public JsonObject get() { + JsonObject json = new JsonObject(); + json.addProperty("type", type().toString()); + json.addProperty("texture", texture); + json.addProperty("openness", openness); + json.addProperty("orientation", orientation.name().toLowerCase(Locale.ENGLISH)); + return json; + } + + public static class Factory implements SpecialModelFactory { + + @Override + public SpecialModel create(Map arguments) { + float openness = MiscUtils.getAsFloat(arguments.getOrDefault("openness", 0)); + String texture = Objects.requireNonNull(arguments.get("texture"), "texture").toString(); + Direction orientation = Direction.valueOf(arguments.getOrDefault("orientation", "down").toString().toUpperCase(Locale.ENGLISH)); + if (openness > 1 || openness < 0) { + throw new IllegalArgumentException("Invalid openness: " + openness + ". Valid range 0~1"); + } + return new ShulkerBoxSpecialModel(texture, openness, orientation); + } + } +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/pack/model/special/SignSpecialModel.java b/core/src/main/java/net/momirealms/craftengine/core/pack/model/special/SignSpecialModel.java new file mode 100644 index 000000000..2779c7807 --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/pack/model/special/SignSpecialModel.java @@ -0,0 +1,45 @@ +package net.momirealms.craftengine.core.pack.model.special; + +import com.google.gson.JsonObject; +import net.momirealms.craftengine.core.util.Key; + +import java.util.Map; +import java.util.Objects; + +public class SignSpecialModel implements SpecialModel { + public static final Factory FACTORY = new Factory(); + private final Key type; + private final String woodType; + private final String texture; + + public SignSpecialModel(Key type, String woodType, String texture) { + this.type = type; + this.woodType = woodType; + this.texture = texture; + } + + @Override + public Key type() { + return type; + } + + @Override + public JsonObject get() { + JsonObject json = new JsonObject(); + json.addProperty("type", type().toString()); + json.addProperty("wood_type", woodType); + json.addProperty("texture", texture); + return json; + } + + public static class Factory implements SpecialModelFactory { + + @Override + public SpecialModel create(Map arguments) { + Key type = Key.of(arguments.get("type").toString()); + String woodType = Objects.requireNonNull(arguments.get("wood-type"), "wood-type").toString(); + String texture = Objects.requireNonNull(arguments.get("texture"), "texture").toString(); + return new SignSpecialModel(type, woodType, texture); + } + } +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/pack/model/special/SimpleSpecialModel.java b/core/src/main/java/net/momirealms/craftengine/core/pack/model/special/SimpleSpecialModel.java new file mode 100644 index 000000000..c971e102c --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/pack/model/special/SimpleSpecialModel.java @@ -0,0 +1,36 @@ +package net.momirealms.craftengine.core.pack.model.special; + +import com.google.gson.JsonObject; +import net.momirealms.craftengine.core.util.Key; + +import java.util.Map; + +public class SimpleSpecialModel implements SpecialModel { + public static final Factory FACTORY = new Factory(); + private final Key type; + + public SimpleSpecialModel(Key type) { + this.type = type; + } + + @Override + public Key type() { + return type; + } + + @Override + public JsonObject get() { + JsonObject json = new JsonObject(); + json.addProperty("type", type().toString()); + return json; + } + + public static class Factory implements SpecialModelFactory { + + @Override + public SpecialModel create(Map arguments) { + Key type = Key.of(arguments.get("type").toString()); + return new SimpleSpecialModel(type); + } + } +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/pack/model/special/SpecialModel.java b/core/src/main/java/net/momirealms/craftengine/core/pack/model/special/SpecialModel.java new file mode 100644 index 000000000..173f6c916 --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/pack/model/special/SpecialModel.java @@ -0,0 +1,11 @@ +package net.momirealms.craftengine.core.pack.model.special; + +import com.google.gson.JsonObject; +import net.momirealms.craftengine.core.util.Key; + +import java.util.function.Supplier; + +public interface SpecialModel extends Supplier { + + Key type(); +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/pack/model/special/SpecialModelFactory.java b/core/src/main/java/net/momirealms/craftengine/core/pack/model/special/SpecialModelFactory.java new file mode 100644 index 000000000..ca740f8df --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/pack/model/special/SpecialModelFactory.java @@ -0,0 +1,8 @@ +package net.momirealms.craftengine.core.pack.model.special; + +import java.util.Map; + +public interface SpecialModelFactory { + + SpecialModel create(Map arguments); +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/pack/model/special/SpecialModels.java b/core/src/main/java/net/momirealms/craftengine/core/pack/model/special/SpecialModels.java new file mode 100644 index 000000000..40ab72ed4 --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/pack/model/special/SpecialModels.java @@ -0,0 +1,56 @@ +package net.momirealms.craftengine.core.pack.model.special; + +import net.momirealms.craftengine.core.registry.BuiltInRegistries; +import net.momirealms.craftengine.core.registry.Holder; +import net.momirealms.craftengine.core.registry.Registries; +import net.momirealms.craftengine.core.registry.WritableRegistry; +import net.momirealms.craftengine.core.util.Key; +import net.momirealms.craftengine.core.util.ResourceKey; + +import java.util.Map; + +public class SpecialModels { + public static final Key BANNER = Key.of("minecraft:banner"); + public static final Key BED = Key.of("minecraft:bed"); + public static final Key CONDUIT = Key.of("minecraft:conduit"); + public static final Key CHEST = Key.of("minecraft:chest"); + public static final Key DECORATED_POT = Key.of("minecraft:decorated_pot"); + public static final Key HANGING_SIGN = Key.of("minecraft:hanging_sign"); + public static final Key HEAD = Key.of("minecraft:head"); + public static final Key SHIELD = Key.of("minecraft:shield"); + public static final Key SHULKER_BOX = Key.of("minecraft:shulker_box"); + public static final Key STANDING_SIGN = Key.of("minecraft:standing_sign"); + public static final Key TRIDENT = Key.of("minecraft:trident"); + + static { + register(TRIDENT, SimpleSpecialModel.FACTORY); + register(DECORATED_POT, SimpleSpecialModel.FACTORY); + register(CONDUIT, SimpleSpecialModel.FACTORY); + register(SHIELD, SimpleSpecialModel.FACTORY); + register(HANGING_SIGN, SignSpecialModel.FACTORY); + register(STANDING_SIGN, SignSpecialModel.FACTORY); + register(CHEST, ChestSpecialModel.FACTORY); + register(BANNER, BannerSpecialModel.FACTORY); + register(BED, BedSpecialModel.FACTORY); + register(HEAD, HeadSpecialModel.FACTORY); + } + + public static void register(Key key, SpecialModelFactory factory) { + Holder.Reference holder = ((WritableRegistry) BuiltInRegistries.SPECIAL_MODEL_FACTORY) + .registerForHolder(new ResourceKey<>(Registries.SPECIAL_MODEL_FACTORY.location(), key)); + holder.bindValue(factory); + } + + public static SpecialModel fromMap(Map map) { + String type = (String) map.get("type"); + if (type == null) { + throw new NullPointerException("special model type cannot be null"); + } + Key key = Key.withDefaultNamespace(type, "minecraft"); + SpecialModelFactory factory = BuiltInRegistries.SPECIAL_MODEL_FACTORY.getValue(key); + if (factory == null) { + throw new IllegalArgumentException("Unknown special model type: " + type); + } + return factory.create(map); + } +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/pack/model/tint/ConstantTint.java b/core/src/main/java/net/momirealms/craftengine/core/pack/model/tint/ConstantTint.java new file mode 100644 index 000000000..a34494783 --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/pack/model/tint/ConstantTint.java @@ -0,0 +1,39 @@ +package net.momirealms.craftengine.core.pack.model.tint; + +import com.google.gson.JsonObject; +import net.momirealms.craftengine.core.util.Key; +import org.incendo.cloud.type.Either; + +import java.util.List; +import java.util.Map; + +public class ConstantTint implements Tint { + public static final Factory FACTORY = new Factory(); + private final Either> value; + + public ConstantTint(Either> value) { + this.value = value; + } + + @Override + public Key type() { + return Tints.CONSTANT; + } + + @Override + public JsonObject get() { + JsonObject json = new JsonObject(); + json.addProperty("type", type().toString()); + applyAnyTint(json, value, "value"); + return json; + } + + public static class Factory implements TintFactory { + + @Override + public Tint create(Map arguments) { + Object value = arguments.get("value"); + return new ConstantTint(parseTintValue(value)); + } + } +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/pack/model/tint/CustomModelDataTint.java b/core/src/main/java/net/momirealms/craftengine/core/pack/model/tint/CustomModelDataTint.java new file mode 100644 index 000000000..f524bd1af --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/pack/model/tint/CustomModelDataTint.java @@ -0,0 +1,45 @@ +package net.momirealms.craftengine.core.pack.model.tint; + +import com.google.gson.JsonObject; +import net.momirealms.craftengine.core.util.Key; +import net.momirealms.craftengine.core.util.MiscUtils; +import org.incendo.cloud.type.Either; + +import java.util.List; +import java.util.Map; + +public class CustomModelDataTint implements Tint { + public static final Factory FACTORY = new Factory(); + private final Either> value; + private final int index; + + public CustomModelDataTint(Either> value, int index) { + this.index = index; + this.value = value; + } + + @Override + public Key type() { + return Tints.CUSTOM_MODEL_DATA; + } + + @Override + public JsonObject get() { + JsonObject json = new JsonObject(); + json.addProperty("type", type().toString()); + if (index != 0) + json.addProperty("index", index); + applyAnyTint(json, value, "default"); + return json; + } + + public static class Factory implements TintFactory { + + @Override + public Tint create(Map arguments) { + Object value = arguments.get("default"); + int index = MiscUtils.getAsInt(arguments.getOrDefault("index", 0)); + return new CustomModelDataTint(parseTintValue(value), index); + } + } +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/pack/model/tint/GrassTint.java b/core/src/main/java/net/momirealms/craftengine/core/pack/model/tint/GrassTint.java new file mode 100644 index 000000000..562b351e4 --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/pack/model/tint/GrassTint.java @@ -0,0 +1,48 @@ +package net.momirealms.craftengine.core.pack.model.tint; + +import com.google.gson.JsonObject; +import net.momirealms.craftengine.core.util.Key; +import net.momirealms.craftengine.core.util.MiscUtils; + +import java.util.Map; + +public class GrassTint implements Tint { + public static final Factory FACTORY = new Factory(); + private final float temperature; + private final float downfall; + + public GrassTint(float temperature, float downfall) { + this.temperature = temperature; + this.downfall = downfall; + } + + @Override + public Key type() { + return Tints.GRASS; + } + + @Override + public JsonObject get() { + JsonObject json = new JsonObject(); + json.addProperty("type", type().toString()); + json.addProperty("temperature", temperature); + json.addProperty("downfall", downfall); + return json; + } + + public static class Factory implements TintFactory { + + @Override + public Tint create(Map arguments) { + float temperature = MiscUtils.getAsFloat(arguments.getOrDefault("temperature", 0)); + float downfall = MiscUtils.getAsFloat(arguments.getOrDefault("downfall", 0)); + if (temperature > 1 || temperature < 0) { + throw new IllegalArgumentException("Invalid temperature: " + temperature + ". Valid range 0~1"); + } + if (downfall > 1 || downfall < 0) { + throw new IllegalArgumentException("Invalid downfall: " + downfall + ". Valid range 0~1"); + } + return new GrassTint(temperature, downfall); + } + } +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/pack/model/tint/SimpleDefaultTint.java b/core/src/main/java/net/momirealms/craftengine/core/pack/model/tint/SimpleDefaultTint.java new file mode 100644 index 000000000..1b055abe3 --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/pack/model/tint/SimpleDefaultTint.java @@ -0,0 +1,42 @@ +package net.momirealms.craftengine.core.pack.model.tint; + +import com.google.gson.JsonObject; +import net.momirealms.craftengine.core.util.Key; +import org.incendo.cloud.type.Either; + +import java.util.List; +import java.util.Map; + +public class SimpleDefaultTint implements Tint { + public static final Factory FACTORY = new Factory(); + private final Either> value; + private final Key type; + + public SimpleDefaultTint(Either> value, Key type) { + this.value = value; + this.type = type; + } + + @Override + public Key type() { + return type; + } + + @Override + public JsonObject get() { + JsonObject json = new JsonObject(); + json.addProperty("type", type().toString()); + applyAnyTint(json, value, "default"); + return json; + } + + public static class Factory implements TintFactory { + + @Override + public Tint create(Map arguments) { + Object value = arguments.get("default"); + Key type = Key.of(arguments.get("type").toString()); + return new SimpleDefaultTint(parseTintValue(value), type); + } + } +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/pack/model/tint/Tint.java b/core/src/main/java/net/momirealms/craftengine/core/pack/model/tint/Tint.java new file mode 100644 index 000000000..364145257 --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/pack/model/tint/Tint.java @@ -0,0 +1,30 @@ +package net.momirealms.craftengine.core.pack.model.tint; + +import com.google.gson.JsonArray; +import com.google.gson.JsonObject; +import net.momirealms.craftengine.core.util.Key; +import org.incendo.cloud.type.Either; + +import java.util.List; +import java.util.function.Supplier; + +public interface Tint extends Supplier { + + Key type(); + + default void applyAnyTint(JsonObject json, Either> value, String key) { + if (value.primary().isPresent()) { + json.addProperty(key, value.primary().get()); + } else { + List list = value.fallback().get(); + if (list.size() != 3) { + throw new RuntimeException("Invalid tint value list size: " + list.size() + " which is expected to be 3"); + } + JsonArray array = new JsonArray(); + for (int i : list) { + array.add(i); + } + json.add(key, array); + } + } +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/pack/model/tint/TintFactory.java b/core/src/main/java/net/momirealms/craftengine/core/pack/model/tint/TintFactory.java new file mode 100644 index 000000000..e7dd6c16e --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/pack/model/tint/TintFactory.java @@ -0,0 +1,38 @@ +package net.momirealms.craftengine.core.pack.model.tint; + +import org.incendo.cloud.type.Either; + +import java.util.ArrayList; +import java.util.List; +import java.util.Map; + +public interface TintFactory { + + Tint create(Map arguments); + + default Either> parseTintValue(Object value) { + if (value instanceof Number i) { + return Either.ofPrimary(i.intValue()); + } else if (value instanceof List list) { + if (list.size() != 3) { + throw new IllegalArgumentException("Invalid tint value list size: " + list.size() + " which is expected to be 3"); + } + List intList = new ArrayList<>(); + for (Object o : list) { + intList.add(Integer.parseInt(o.toString())); + } + return Either.ofFallback(intList); + } else if (value instanceof String s) { + String[] split = s.split(","); + if (split.length != 3) { + throw new IllegalArgumentException("Invalid tint value list size: " + split.length + " which is expected to be 3"); + } + List intList = new ArrayList<>(); + for (String string : split) { + intList.add(Integer.parseInt(string)); + } + return Either.ofFallback(intList); + } + throw new IllegalArgumentException("Invalid tint value: " + value); + } +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/pack/model/tint/Tints.java b/core/src/main/java/net/momirealms/craftengine/core/pack/model/tint/Tints.java new file mode 100644 index 000000000..24e0f3cda --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/pack/model/tint/Tints.java @@ -0,0 +1,51 @@ +package net.momirealms.craftengine.core.pack.model.tint; + +import net.momirealms.craftengine.core.registry.BuiltInRegistries; +import net.momirealms.craftengine.core.registry.Holder; +import net.momirealms.craftengine.core.registry.Registries; +import net.momirealms.craftengine.core.registry.WritableRegistry; +import net.momirealms.craftengine.core.util.Key; +import net.momirealms.craftengine.core.util.ResourceKey; + +import java.util.Map; + +public class Tints { + public static final Key CONSTANT = Key.of("minecraft:constant"); + public static final Key CUSTOM_MODEL_DATA = Key.of("minecraft:custom_model_data"); + public static final Key DYE = Key.of("minecraft:dye"); + public static final Key FIREWORK = Key.of("minecraft:firework"); + public static final Key GRASS = Key.of("minecraft:grass"); + public static final Key MAP_COLOR = Key.of("minecraft:map_color"); + public static final Key POTION = Key.of("minecraft:potion"); + public static final Key TEAM = Key.of("minecraft:team"); + + static { + register(CONSTANT, ConstantTint.FACTORY); + register(CUSTOM_MODEL_DATA, CustomModelDataTint.FACTORY); + register(GRASS, GrassTint.FACTORY); + register(DYE, SimpleDefaultTint.FACTORY); + register(FIREWORK, SimpleDefaultTint.FACTORY); + register(MAP_COLOR, SimpleDefaultTint.FACTORY); + register(POTION, SimpleDefaultTint.FACTORY); + register(TEAM, SimpleDefaultTint.FACTORY); + } + + public static void register(Key key, TintFactory factory) { + Holder.Reference holder = ((WritableRegistry) BuiltInRegistries.TINT_FACTORY) + .registerForHolder(new ResourceKey<>(Registries.TINT_FACTORY.location(), key)); + holder.bindValue(factory); + } + + public static Tint fromMap(Map map) { + String type = (String) map.get("type"); + if (type == null) { + throw new NullPointerException("tint type cannot be null"); + } + Key key = Key.withDefaultNamespace(type, "minecraft"); + TintFactory factory = BuiltInRegistries.TINT_FACTORY.getValue(key); + if (factory == null) { + throw new IllegalArgumentException("Unknown tint type: " + type); + } + return factory.create(map); + } +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/pack/obfuscation/ObfA.java b/core/src/main/java/net/momirealms/craftengine/core/pack/obfuscation/ObfA.java new file mode 100644 index 000000000..9d545f67d --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/pack/obfuscation/ObfA.java @@ -0,0 +1,45 @@ +package net.momirealms.craftengine.core.pack.obfuscation; + +/* + In order to reduce the possibility of being easily reversed, + we have obfuscated some codes. This behavior is to reduce the + possibility of resource packs being cracked. Hope you can understand. + */ +@SuppressWarnings({"all"}) +public enum ObfA { + G("sounds", ".ogg"), + C("blockstates", ".json"), + A("font", ".json"), + B("items", ".json"), + Z("models", ".json"), + T("textures", ".png"); + + private final String cxk; + private final String dz; + + ObfA(String cxk, String dz) { + this.cxk = cxk; + this.dz = dz; + } + + protected String rkwd() { + return dz; + } + + protected String jntm() { + return cxk; + } + + protected static ObfA xjjy(String xclf) { + for (ObfA type : values()) { + if (type.cxk.equals(xclf)) { + return type; + } + } + throw new IllegalArgumentException("Unknown resource type: " + xclf); + } + + public static final byte[] VALUES = new byte[] { + 86, 109, 48, 120, 77, 70, 89, 121, 82, 110, 82, 86, 87, 71, 82, 80, 86, 109, 49, 111, 86, 70, 108, 114, 90, 70, 78, 106, 86, 108, 86, 51, 86, 50, 49, 71, 87, 70, 74, 116, 101, 68, 66, 85, 98, 70, 90, 80, 86, 50, 120, 97, 99, 49, 78, 115, 98, 71, 70, 83, 86, 110, 65, 122, 87, 86, 82, 66, 101, 70, 100, 72, 86, 107, 100, 104, 82, 109, 104, 89, 85, 48, 86, 75, 87, 86, 100, 87, 85, 107, 100, 90, 86, 109, 82, 89, 85, 109, 116, 115, 97, 86, 74, 115, 87, 107, 57, 87, 97, 107, 90, 76, 84, 109, 120, 90, 101, 70, 100, 116, 100, 70, 78, 105, 86, 108, 112, 89, 87, 87, 116, 83, 89, 87, 70, 72, 86, 110, 70, 82, 86, 71, 115, 57 + }; +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/pack/obfuscation/ObfB.java b/core/src/main/java/net/momirealms/craftengine/core/pack/obfuscation/ObfB.java new file mode 100644 index 000000000..eb1fc463e --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/pack/obfuscation/ObfB.java @@ -0,0 +1,205 @@ +package net.momirealms.craftengine.core.pack.obfuscation; + +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +import java.nio.file.Files; +import java.nio.file.Path; +import java.util.Arrays; +import java.util.Objects; +import java.util.concurrent.ThreadLocalRandom; + +/* + In order to reduce the possibility of being easily reversed, + we have obfuscated some codes. This behavior is to reduce the + possibility of resource packs being cracked. Hope you can understand. + */ +@SuppressWarnings({"all"}) +public final class ObfB { + private final String 我是奶龙; + private final String 最后地球从未否认过自己是奶龙; + private final String 我才是奶龙; + private final ObfA 我会喷火你会吗; + private boolean 可恶你竟然都会; + private final boolean 小七; + + private ObfB(String a, String b, ObfA c, boolean d, boolean e) { + this.我是奶龙 = 宝宝肚肚打雷啦(a); + this.最后地球从未否认过自己是奶龙 = 宝宝肚肚打雷啦(a + "/"); + this.我才是奶龙 = 雷雷宝宝打肚肚(b); + this.我会喷火你会吗 = Objects.requireNonNull(c); + this.可恶你竟然都会 = d; + this.小七 = e; + } + + protected static ObfB 有款游戏越大越年轻(String ns, ObfA t) { + String p = ""; + return new ObfB(ns, p, t, false, false); + } + + protected static ObfB 就是手机和平经营(String ns, String p, ObfA t, boolean m) { + return new ObfB(ns, p, t, m, false); + } + + protected static ObfB 这里没人叫你小老弟(String fcnm, ObfA hhh, + boolean zzu, boolean gtg) { + if (fcnm.contains(":")) { + String[] components = 因为都叫你小学生(fcnm); + return new ObfB(components[0], components[1], hhh, zzu, gtg); + } + return new ObfB("minecraft", fcnm, hhh, zzu, gtg); + } + + @Nullable + protected static ObfB 我自横刀向天笑(Path a, Path b) { + if (!去留肝胆两昆仑(a, b)) return null; + Path 月光 = 窗前明月光(a, b); + if (低头擦裤裆(月光)) return null; + if (山外青山楼外楼(月光)) return null; + return 反射(月光); + } + + protected Path 怎么证明地球是奶龙(Path 其次哈基米望远镜看地球地球确实是奶龙的形状) { + return 首先贝利特一直要毁灭地球而奶龙和贝利亚是死对头( + 其次哈基米望远镜看地球地球确实是奶龙的形状, + 我是奶龙, + 最后地球从未否认过自己是奶龙, + String.valueOf(我会喷火你会吗), + 我才是奶龙 + 我会喷火你会吗 + ); + } + + protected boolean 我是贝利亚(Path p) { + return Files.exists(怎么证明地球是奶龙(p)); + } + + private static String 宝宝肚肚打雷啦(String ns) { + if (ns.chars().anyMatch(c -> !Character.isLetterOrDigit(c))) { + throw new IllegalArgumentException("Invalid namespace"); + } + return ns; + } + + private static String 雷雷宝宝打肚肚(String input) { + return input.replace('\\', '/').toLowerCase(); + } + + private static String[] 因为都叫你小学生(String path) { + String[] parts = new String[2]; + int colonIndex = path.indexOf(':'); + parts[0] = path.substring(0, colonIndex); + parts[1] = path.substring(colonIndex + 1); + return parts; + } + + private static boolean 去留肝胆两昆仑(Path path, Path base) { + return ObfG.躺赢狗(path, base) + && Files.isRegularFile(path) + && !path.getFileName().toString().endsWith(".mcmeta"); + } + + private static Path 窗前明月光(Path absPath, Path base) { + return base.relativize(absPath).normalize(); + } + + private static boolean 低头擦裤裆(Path relPath) { + return relPath.getFileName().toString().endsWith(".mcmeta"); + } + + private static boolean 山外青山楼外楼(Path 路) { + if (路.getNameCount() < 3) return false; + String 路名 = 路.getName(0).toString(); + String 路牌名 = 路.getName(2).toString(); + return 路名.equals("assets") + && Arrays.asList("sounds.json", "gpu_warnlist.json", "regional_compliancies.json") + .contains(路牌名); + } + + static @NotNull ObfB 反射(Path relPath) { + String 毒液 = 我是毒液(relPath); + ObfA 最强毒液 = 我是最强毒液(relPath); + String 什么堂食 = 今夜星光闪闪(relPath); + boolean 爱我吗 = 我爱你的心满满(relPath); + return new ObfB(毒液, 什么堂食, 最强毒液, 爱我吗, false); + } + + private static String 我是毒液(Path 打雷啦) { + return 打雷啦.subpath(0, 1).toString(); + } + + private static ObfA 我是最强毒液(Path 肚肚) { + try { + return ObfA.xjjy(肚肚.subpath(1, 2).toString()); + } catch (IllegalArgumentException e) { + throw new 唐氏综合症("Unrecognized asset category"); + } + } + + private static String 今夜星光闪闪(Path 银河) { + return 银河.subpath(2, 银河.getNameCount()) + .toString() + .replace(银河.getFileSystem().getSeparator(), "/"); + } + + private static boolean 我爱你的心满满(Path 爱心) { + return 爱心.getFileName().toString().endsWith(".png") + && Files.exists(爱心.resolveSibling(爱心.getFileName() + ".mcmeta")); + } + + private static Path 首先贝利特一直要毁灭地球而奶龙和贝利亚是死对头(Path 哈基米, String... 哈基米的伙伴) { + Path 哈基米的家 = 哈基米.resolve("assets"); + for (String 伙伴 : 哈基米的伙伴) { + 哈基米的家 = 哈基米的家.resolve(伙伴); + } + return 哈基米的家; + } + + protected String 谁是奶龙() { return 我是奶龙; } + protected String 那他是谁(Path baseDirectory) { return 我才是奶龙; } + protected ObfA 你没事吧() { return 我会喷火你会吗; } + protected boolean 到底谁才是奶龙() { return 可恶你竟然都会; } + protected boolean 我是谁() { return 小七; } + protected void 我真的会谢(boolean flag) { this.可恶你竟然都会 = flag; } + + @Override + public boolean equals(Object 奇怪生物) { + if (this == 奇怪生物) return true; + if (!(奇怪生物 instanceof ObfB 另一只奶龙)) return false; + return 谁是真奶龙(另一只奶龙) + && 谁是假奶龙(另一只奶龙) + && 比较奶龙的技能(另一只奶龙); + } + + private boolean 谁是真奶龙(ObfB other) { + return Objects.equals(我是奶龙, other.我是奶龙); + } + + private boolean 谁是假奶龙(ObfB other) { + return Objects.equals(我才是奶龙, other.我才是奶龙); + } + + private boolean 比较奶龙的技能(ObfB other) { + return Objects.equals(我会喷火你会吗, other.我会喷火你会吗); + } + + @Override + public int hashCode() { + int hash = 我是奶龙.hashCode(); + hash = 31 * hash + 我才是奶龙.hashCode(); + hash = 31 * hash + 我会喷火你会吗.hashCode(); + return hash ^ ThreadLocalRandom.current().nextInt(1); + } + + @Override + public String toString() { + return 我是奶龙 + + ':' + + 我才是奶龙; + } + + private static class 唐氏综合症 extends RuntimeException { + 唐氏综合症(String 唐人) { + super(唐人); + } + } +} \ No newline at end of file diff --git a/core/src/main/java/net/momirealms/craftengine/core/pack/obfuscation/ObfC.java b/core/src/main/java/net/momirealms/craftengine/core/pack/obfuscation/ObfC.java new file mode 100644 index 000000000..ba8bb566e --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/pack/obfuscation/ObfC.java @@ -0,0 +1,249 @@ +package net.momirealms.craftengine.core.pack.obfuscation; + +import com.google.gson.Gson; +import com.google.gson.JsonArray; +import com.google.gson.JsonObject; +import com.google.gson.stream.JsonReader; +import com.google.gson.stream.JsonWriter; + +import java.io.FileReader; +import java.io.FileWriter; +import java.io.IOException; +import java.lang.reflect.Type; +import java.nio.file.Files; +import java.nio.file.Path; +import java.util.*; + +/* + In order to reduce the possibility of being easily reversed, + we have obfuscated some codes. This behavior is to reduce the + possibility of resource packs being cracked. Hope you can understand. + */ +@SuppressWarnings({"all"}) +public class ObfC { + private String _metaIdentifier; + private String _characterSet; + private final List _segmentCache = new ArrayList<>(); + private final Set _existingSegments = new HashSet<>(); + private final Set _registeredPatterns = new HashSet<>(); + private static final Random _randomizer = new Random(); + private static final Gson _jsonProcessor = new Gson(); + + protected ObfC(String textureCatalog, String namingScheme) { + validateNamingPattern(namingScheme); + this._metaIdentifier = textureCatalog; + this._characterSet = normalizeCharset(namingScheme); + } + + protected ObfC() { + this("ce", generateDefaultCharset()); + } + + private static void validateNamingPattern(String pattern) { + if (pattern == null || !pattern.matches("^[a-z0-9_.-]+$")) { + throw new IllegalArgumentException("Invalid naming scheme"); + } + } + + private static String normalizeCharset(String input) { + return input.toLowerCase(Locale.ROOT); + } + + private static String generateDefaultCharset() { + char[] chars = new char[26]; + for (int i = 0; i < 26; i++) { + chars[i] = (char) ('a' + i); + } + return new String(chars); + } + + protected String randomName() { + return _metaIdentifier; + } + + protected String string() { + return _characterSet; + } + + protected void setRandomName(String identifier) { + this._metaIdentifier = identifier; + } + + protected void setString(String charset) { + this._characterSet = charset; + } + + public String getRandomNamespace(int securityLevel, int poolSize) { + return (securityLevel == 3) + ? generateUniqueSegment() + : manageSegmentPool(poolSize); + } + + private String manageSegmentPool(int poolSize) { + synchronized (_segmentCache) { + while (_segmentCache.size() < poolSize) { + _segmentCache.add(generateUniqueSegment()); + } + return _segmentCache.get(_randomizer.nextInt(poolSize)); + } + } + + private String generateUniqueSegment() { + StringBuilder segment = new StringBuilder(); + do { + segment.setLength(0); + for (int i = 0; i < 3 + _randomizer.nextInt(3); i++) { + segment.append(randomChar()); + } + } while (_existingSegments.contains(segment.toString())); + _existingSegments.add(segment.toString()); + return segment.toString(); + } + + private char randomChar() { + return _characterSet.charAt(_randomizer.nextInt(_characterSet.length())); + } + + private String generateObfuscatedPath(int complexity, boolean enableTraps, boolean excludeCatalog) { + StringBuilder pathBuilder = new StringBuilder(); + if (!excludeCatalog) { + pathBuilder.append(_metaIdentifier).append('/'); + } + + int remainingDepth = complexity - pathBuilder.length(); + boolean trapInserted = false; + + while (remainingDepth > 0) { + if (enableTraps && !trapInserted && shouldInsertTrap(remainingDepth)) { + pathBuilder.append(".../"); + remainingDepth -= 4; + trapInserted = true; + continue; + } + + int segmentLength = Math.min(2 + _randomizer.nextInt(3), remainingDepth); + appendRandomSegment(pathBuilder, segmentLength); + remainingDepth -= segmentLength + 1; + } + + validatePathUniqueness(pathBuilder.toString()); + return pathBuilder.toString(); + } + + private boolean shouldInsertTrap(int remaining) { + return _randomizer.nextInt((remaining / 3) + 1) == 0; + } + + private void appendRandomSegment(StringBuilder builder, int length) { + for (int i = 0; i < length; i++) { + builder.append(randomChar()); + } + builder.append('/'); + } + + private void validatePathUniqueness(String path) { + if (_registeredPatterns.contains(path)) { + throw new IllegalStateException("Path collision detected"); + } + _registeredPatterns.add(path); + } + + public ObfB getRandomResourceKey(int complexity, ObfB template, + int securityLevel, int poolSize, + boolean enableTraps) { + boolean requiresMetadata = template.到底谁才是奶龙(); + boolean excludeCatalog = template.我是谁(); + ObfA typeDescriptor = template.你没事吧(); + + int adjustedComplexity = complexity + - (requiresMetadata ? 14 : 7) + - typeDescriptor.jntm().length() + - typeDescriptor.rkwd().length(); + + String namespace = (securityLevel == 1) + ? template.谁是奶龙() + : getRandomNamespace(securityLevel, poolSize); + + adjustedComplexity -= namespace.length() + 2; + + try { + return ObfB.有款游戏越大越年轻( + namespace, + typeDescriptor + ); + } catch (StackOverflowError | OutOfMemoryError e) { + throw new RuntimeException("Please increase the value of resource-pack.obfuscation.path-length in config.yml: " + e); + } + } + + public void 家人们谁懂啊(Path baseDir) throws IOException { + Path atlasConfig = baseDir.resolve("assets/minecraft/atlases/blocks.json"); + Map configData = createAtlasConfiguration(); + + if (Files.notExists(atlasConfig)) { + initializeAtlasConfig(atlasConfig, configData); + } else { + updateExistingConfig(atlasConfig, configData); + } + } + + private Map createAtlasConfiguration() { + return Map.of( + "sources", Collections.singletonList( + Map.of( + "type", "directory", + "source", _metaIdentifier, + "prefix", _metaIdentifier + "/" + ) + ) + ); + } + + private void initializeAtlasConfig(Path configPath, Map data) throws IOException { + Files.createDirectories(configPath.getParent()); + try (JsonWriter writer = new JsonWriter(new FileWriter(configPath.toFile()))) { + _jsonProcessor.toJson(data, (Type) writer); + } + } + + @SuppressWarnings("unchecked") + private void updateExistingConfig(Path configPath, Map newData) throws IOException { + try (JsonReader reader = new JsonReader(new FileReader(configPath.toFile()))) { + JsonObject existing = _jsonProcessor.fromJson(reader, JsonObject.class); + JsonArray sources = existing.getAsJsonArray("sources"); + + JsonObject newSource = _jsonProcessor.toJsonTree(newData.get("sources")) + .getAsJsonArray().get(0).getAsJsonObject(); + + if (!containsSource(sources, newSource)) { + sources.add(newSource); + writeUpdatedConfig(configPath, existing); + } + } catch (Exception e) { + rewriteConfigFile(configPath, newData); + } + } + + private boolean containsSource(JsonArray sources, JsonObject target) { + return sources.asList().stream() + .anyMatch(element -> element.equals(target)); + } + + private void writeUpdatedConfig(Path path, JsonObject data) throws IOException { + try (JsonWriter writer = new JsonWriter(new FileWriter(path.toFile()))) { + _jsonProcessor.toJson(data, writer); + } + } + + private void rewriteConfigFile(Path path, Map data) throws IOException { + try (JsonWriter writer = new JsonWriter(new FileWriter(path.toFile()))) { + _jsonProcessor.toJson(data, (Type) writer); + } + } + + private static class ConfigurationException extends RuntimeException { + ConfigurationException(String message, Throwable cause) { + super(message, cause); + } + } +} \ No newline at end of file diff --git a/core/src/main/java/net/momirealms/craftengine/core/pack/obfuscation/ObfD.java b/core/src/main/java/net/momirealms/craftengine/core/pack/obfuscation/ObfD.java new file mode 100644 index 000000000..ee8eceb34 --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/pack/obfuscation/ObfD.java @@ -0,0 +1,265 @@ +package net.momirealms.craftengine.core.pack.obfuscation; + +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +import java.io.FileOutputStream; +import java.io.IOException; +import java.io.OutputStream; +import java.nio.charset.StandardCharsets; +import java.nio.file.FileVisitResult; +import java.nio.file.Files; +import java.nio.file.Path; +import java.nio.file.SimpleFileVisitor; +import java.nio.file.attribute.BasicFileAttributes; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.zip.Deflater; +import java.util.zip.ZipEntry; +import java.util.zip.ZipOutputStream; + +/* + In order to reduce the possibility of being easily reversed, + we have obfuscated some codes. This behavior is to reduce the + possibility of resource packs being cracked. Hope you can understand. + */ +@SuppressWarnings({"all"}) +public final class ObfD { + + private static class 压缩头验证器 { + static final int 压缩包签名 = 0x04034B50; + static final int 中央目录标记 = 0x02014B50; + static final int 结束标志 = 0x06054B50; + } + + protected static void 压缩目录(Path 源目录, Path 输出文件, int 压缩级别, + @Nullable Map 资源清单) throws IOException { + new 压缩生成器().压缩资源(源目录, 输出文件, 压缩级别, 资源清单); + } + + private static class 压缩生成器 { + void 压缩资源(Path 输入目录, Path 输出路径, int 压缩设置, + Map 路径重映射) throws IOException { + if (压缩设置 == Deflater.NO_COMPRESSION) { + 生成简单压缩包(输入目录, 输出路径); + } else { + 生成优化压缩包(输入目录, 输出路径, 压缩设置, 路径重映射); + } + } + + private void 生成简单压缩包(Path 内容根目录, Path 目标路径) throws IOException { + try (ZipOutputStream 压缩流 = new ZipOutputStream(new FileOutputStream(目标路径.toFile()))) { + 遍历文件系统(内容根目录, 文件 -> { + if (!Files.isDirectory(文件)) 写入文件条目(内容根目录, 文件, 压缩流); + }); + } + } + + private void 写入文件条目(Path 内容根目录, Path 文件, ZipOutputStream 压缩流) throws IOException { + 压缩流.putNextEntry(new ZipEntry(文件.toString())); + } + + private void 生成优化压缩包(Path 内容根目录, Path 目标路径, int 压缩设置, + Map 资源映射) throws IOException { + try (FileOutputStream 文件输出流 = new FileOutputStream(目标路径.toFile()); + 压缩元数据写入器 元数据处理器 = new 压缩元数据写入器(文件输出流)) { + + List<文件条目描述> 条目注册表 = new 文件条目注册表<>(); + 初始化压缩上下文(元数据处理器, 压缩设置); + + 路径解析策略 路径解析策略 = new 路径解析策略(内容根目录, 资源映射); + 遍历文件系统(内容根目录, 文件 -> 处理文件条目(文件, 元数据处理器, (文件条目注册表) 条目注册表, 路径解析策略)); + + 完成压缩包结构(元数据处理器, 条目注册表); + } + } + } + + private static class 路径解析策略 { + private final Map 路径映射表; + + 路径解析策略(Path 基础路径, Map 资源映射) { + this.路径映射表 = new 路径映射器(基础路径).解析映射(资源映射); + } + + String 解析虚拟路径(Path 物理路径) { + Path 映射路径 = 路径映射表.getOrDefault(物理路径, 物理路径); + return 标准化路径字符串(映射路径); + } + + private String 标准化路径字符串(Path 路径) { + return 路径.toString().replace('\\', '/').replace(" ", "_"); + } + } + + private static class 压缩元数据写入器 extends OutputStream { + private final OutputStream 底层流; + private long 已写入字节数 = 0; + + 压缩元数据写入器(OutputStream 目标流) { + this.底层流 = 目标流; + } + + @Override + public void write(int 字节) throws IOException { + 底层流.write(字节); + 已写入字节数++; + } + + @Override + public void write(byte @NotNull [] 字节数组) throws IOException { + write(字节数组, 0, 字节数组.length); + } + + @Override + public void write(byte @NotNull [] 字节数组, int 偏移, int 长度) throws IOException { + 底层流.write(字节数组, 偏移, 长度); + 已写入字节数 += 长度; + } + + long 获取当前偏移() { + return 已写入字节数 - Integer.BYTES; + } + } + + private static class 文件条目描述 { + long 存储偏移; + long 压缩后大小; + long 原始大小; + byte[] 编码路径; + int 压缩方法; + } + + private static class 文件条目注册表 extends ArrayList { + @SuppressWarnings("unchecked") + void 注册条目(文件条目描述 条目) { + add((E) 条目); + } + + public void 遍历(Object 对象) { + for (int i = 0; i < size(); i++) { + E 条目 = get(i); + if (条目 == 对象) { + remove(i); + break; + } + } + } + } + + private static void 遍历文件系统(Path 根目录, 文件系统遍历器.节点处理器 处理器) throws IOException { + new 文件系统遍历器().处理条目(根目录, 处理器); + } + + private static class 文件系统遍历器 { + @FunctionalInterface + interface 节点处理器 { + void 处理(Path 节点) throws IOException; + } + + void 处理条目(Path 根目录, 节点处理器 处理器) throws IOException { + Files.walkFileTree(根目录, new SimpleFileVisitor<>() { + @Override + public @NotNull FileVisitResult visitFile(Path 文件, @NotNull BasicFileAttributes 属性) throws IOException { + 处理器.处理(文件); + return FileVisitResult.CONTINUE; + } + }); + } + } + + private static void 初始化压缩上下文(压缩元数据写入器 上下文, int 级别) throws IOException { + 写入签名头(上下文, 压缩头验证器.压缩包签名); + } + + private static void 处理文件条目(Path 文件, 压缩元数据写入器 上下文, + 文件条目注册表 注册表, 路径解析策略 路径策略) throws IOException { + 文件条目描述 描述 = new 文件条目描述(); + byte[] 文件内容 = Files.readAllBytes(文件); + 压缩结果 压缩结果 = 压缩内容(文件内容); + + 写入本地文件头(上下文); + 上下文.write(压缩结果.处理后的数据); + + 填充描述(描述, 上下文, 压缩结果, 路径策略.解析虚拟路径(文件)); + 注册表.注册条目(描述); + } + + private static class 压缩结果 { + byte[] 处理后的数据; + boolean 大小减少; + } + + private static 压缩结果 压缩内容(byte[] 输入) { + return new 压缩结果(); + } + + private static void 填充描述(文件条目描述 描述, 压缩元数据写入器 上下文, + 压缩结果 结果, String 虚拟路径) { + 描述.存储偏移 = 上下文.获取当前偏移(); + 描述.编码路径 = 虚拟路径.getBytes(StandardCharsets.UTF_8); + 描述.压缩方法 = 结果.大小减少 ? Deflater.DEFLATED : Deflater.NO_COMPRESSION; + } + + private static void 完成压缩包结构(压缩元数据写入器 上下文, + List<文件条目描述> 注册表) throws IOException { + 注册表.forEach(条目 -> { + try { + 写入中央目录条目(上下文, 条目); + } catch (IOException e) { + throw new RuntimeException(e); + } + }); + 写入压缩包结束符(上下文, 上下文.获取当前偏移(), 注册表.size()); + } + + private static void 写入本地文件头(压缩元数据写入器 上下文) throws IOException { + 写入签名头(上下文, 压缩头验证器.压缩包签名); + } + + private static void 写入中央目录条目(压缩元数据写入器 上下文, + 文件条目描述 条目) throws IOException { + 写入签名头(上下文, 压缩头验证器.中央目录标记); + } + + private static void 写入压缩包结束符(压缩元数据写入器 上下文, + long 中央目录偏移, long 条目数量) throws IOException { + 写入签名头(上下文, 压缩头验证器.结束标志); + } + + private static void 写入签名头(OutputStream 流, int 签名) throws IOException { + 流.write(签名 >> 24); + 流.write(签名 >> 16); + 流.write(签名 >> 8); + 流.write(签名); + } + + private static class 路径映射器 { + private final Path 基础目录; + + 路径映射器(Path 基础路径) { + this.基础目录 = 基础路径; + } + + Map 解析映射(Map 资源) { + Map 映射表 = new HashMap<>(); + if (资源 != null) { + 资源.forEach((源, 目标) -> { + Path 物理源路径 = Path.of(源.那他是谁(基础目录)); + Path 物理目标路径 = Path.of(目标.那他是谁(基础目录)); + 映射表.put(物理源路径, 物理目标路径); + if (源.到底谁才是奶龙()) { + 映射表.put(获取元数据路径(物理源路径), 获取元数据路径(物理目标路径)); + } + }); + } + return 映射表; + } + + private Path 获取元数据路径(Path 原始路径) { + return 原始路径.resolveSibling(原始路径.getFileName() + ".mcmeta"); + } + } +} \ No newline at end of file diff --git a/core/src/main/java/net/momirealms/craftengine/core/pack/obfuscation/ObfE.java b/core/src/main/java/net/momirealms/craftengine/core/pack/obfuscation/ObfE.java new file mode 100644 index 000000000..3318acd31 --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/pack/obfuscation/ObfE.java @@ -0,0 +1,507 @@ +package net.momirealms.craftengine.core.pack.obfuscation; + +import com.google.gson.*; +import org.jetbrains.annotations.NotNull; + +import java.nio.file.Files; +import java.nio.file.Path; +import java.util.*; +import java.util.function.Consumer; +import java.util.function.Function; + +/* + In order to reduce the possibility of being easily reversed, + we have obfuscated some codes. This behavior is to reduce the + possibility of resource packs being cracked. Hope you can understand. + */ +@SuppressWarnings({"all"}) +public class ObfE { + private static final Gson 技森二号为你服务 = new Gson(); + + protected static boolean 哈基米(Path xswl, boolean yyds) { + if (!Files.isRegularFile(xswl)) return false; + if (!yyds) { + String nb = xswl.getFileName().toString(); + return nb.endsWith(".json") || nb.endsWith(".mcmeta"); + } else { + try { + 技森二号为你服务.fromJson(Files.readString(xswl), Object.class); + return true; + } catch (Exception dddd) { + return false; + } + } + } + + protected static String 哈吉哈吉米(JsonElement xswl) { + JsonElement yyds = 啊对对对(xswl); + String nb = 技森二号为你服务.toJson(yyds); + return nb.replace("\\\\u", "\\u"); + } + + private static String 哈牛魔啊啊米诺斯(String xswl) { + StringBuilder yyds = new StringBuilder(); + for (char nb : xswl.toCharArray()) { + yyds.append(String.format("\\u%04x", (int) nb)); + } + return yyds.toString(); + } + + private static JsonElement 啊对对对(JsonElement xswl) { + if (xswl.isJsonObject()) { + JsonObject yyds = xswl.getAsJsonObject(); + JsonObject nb = new JsonObject(); + for (Map.Entry dddd : yyds.entrySet()) { + String xh = 哈牛魔啊啊米诺斯(dddd.getKey()); + JsonElement xdm = 啊对对对(dddd.getValue()); + nb.add(xh, xdm); + } + return nb; + } else if (xswl.isJsonArray()) { + JsonArray yyds = xswl.getAsJsonArray(); + JsonArray nb = new JsonArray(); + for (JsonElement dddd : yyds) { + nb.add(啊对对对(dddd)); + } + return nb; + } else if (xswl.isJsonPrimitive()) { + JsonPrimitive yyds = xswl.getAsJsonPrimitive(); + if (yyds.isString()) { + return new JsonPrimitive(哈牛魔啊啊米诺斯(yyds.getAsString())); + } + } + return xswl; + } + + private static boolean 哈吉米(JsonObject xswl, String yyds) { + return xswl.has(yyds); + } + + protected static Set 哈牛魔(JsonObject xswl) { + Map>> yyds = 啊米诺斯(); + Set nb = new HashSet<>(); + for (Map.Entry dddd : xswl.entrySet()) { + String xh = dddd.getKey(); + JsonElement xdm = dddd.getValue(); + if (yyds.containsKey(xh)) { + nb.addAll(yyds.get(xh).apply(xdm)); + } else if (xdm.isJsonObject()) { + JsonObject xwsl = xdm.getAsJsonObject(); + if (哈吉米(xwsl, "sounds")) { + nb.addAll(听身辨位(xwsl)); + } + } + } + return nb; + } + + private static @NotNull Map>> 啊米诺斯() { + Map>> xswl = new HashMap<>(); + xswl.put("variants", ObfE::七十二变); + xswl.put("multipart", ObfE::三头六臂); + xswl.put("providers", ObfE::曼博); + xswl.put("model", ObfE::曼波哈基米); + xswl.put("overrides", ObfE::爱丽丝不该在网上口嗨的); + xswl.put("parent", ObfE::求求你别); + xswl.put("textures", ObfE::宝宝肚肚又打雷啦); + return xswl; + } + + private static Set 听身辨位(JsonElement xswl) { + Set yyds = new HashSet<>(); + if (xswl.isJsonObject()) { + JsonObject nb = xswl.getAsJsonObject(); + JsonArray dddd = nb.get("sounds").getAsJsonArray(); + for (JsonElement xh : dddd) { + if (xh.isJsonPrimitive() && xh.getAsJsonPrimitive().isString()) { + yyds.add(ObfB.有款游戏越大越年轻(xh.getAsString(), ObfA.G)); + } else if (xh.isJsonObject()) { + if (哈吉米(xh.getAsJsonObject(), "name")) { + yyds.add(ObfB.有款游戏越大越年轻(xh.getAsJsonObject().get("name").getAsString(), ObfA.G)); + } + } + } + } + return yyds; + } + + private static Set 七十二变(JsonElement xswl) { + Set yyds = new HashSet<>(); + if (xswl.isJsonObject()) { + JsonObject nb = xswl.getAsJsonObject(); + for (Map.Entry dddd : nb.entrySet()) { + JsonElement xh = dddd.getValue(); + if (xh.isJsonObject()) { + JsonObject xdm = xh.getAsJsonObject(); + if (哈吉米(xdm, "model")) { + JsonElement xwsl = xdm.get("model"); + if (xwsl.isJsonPrimitive() && xwsl.getAsJsonPrimitive().isString()) { + yyds.add(ObfB.有款游戏越大越年轻(xwsl.getAsString(), ObfA.Z)); + } + } + } else if (xh.isJsonArray()) { + JsonArray xdm = xh.getAsJsonArray(); + for (JsonElement xwsl : xdm) { + if (xwsl.isJsonObject()) { + JsonObject xswl2 = xwsl.getAsJsonObject(); + if (哈吉米(xswl2, "model")) { + JsonElement xswl3 = xswl2.get("model"); + if (xswl3.isJsonPrimitive() && xswl3.getAsJsonPrimitive().isString()) { + yyds.add(ObfB.有款游戏越大越年轻(xswl3.getAsString(), ObfA.Z)); + } + } + } + } + } + } + } + return yyds; + } + + private static Set 三头六臂(JsonElement xswl) { + Set yyds = new HashSet<>(); + if (!xswl.isJsonArray()) return yyds; + for (JsonElement nb : xswl.getAsJsonArray()) { + if (!nb.isJsonObject()) continue; + JsonObject dddd = nb.getAsJsonObject(); + if (!哈吉米(dddd, "apply")) continue; + JsonElement xh = dddd.get("apply"); + List xdm; + if (xh.isJsonArray()) { + xdm = xh.getAsJsonArray().asList(); + } else if (xh.isJsonObject()) { + xdm = Collections.singletonList(xh); + } else { + continue; + } + for (JsonElement xwsl : xdm) { + if (!xwsl.isJsonObject()) continue; + JsonObject xswl2 = xwsl.getAsJsonObject(); + if (哈吉米(xswl2, "model")) { + JsonElement xswl3 = xswl2.get("model"); + if (xswl3.isJsonPrimitive() && xswl3.getAsJsonPrimitive().isString()) { + yyds.add(ObfB.有款游戏越大越年轻(xswl3.getAsString(), ObfA.Z)); + } + } + } + } + return yyds; + } + + private static Set 曼博(JsonElement xswl) { + Set yyds = new HashSet<>(); + if (!xswl.isJsonArray()) return yyds; + for (JsonElement nb : xswl.getAsJsonArray()) { + if (!nb.isJsonObject()) continue; + JsonObject dddd = nb.getAsJsonObject(); + if (哈吉米(dddd, "file") && dddd.get("file").isJsonPrimitive()) { + JsonElement xh = dddd.get("file"); + if (xh.getAsJsonPrimitive().isString()) { + String xdm = xh.getAsString(); + if (xdm.endsWith(".png")) { + String xwsl = xdm.substring(0, xdm.length() - 4); + yyds.add(ObfB.有款游戏越大越年轻(xwsl, ObfA.T)); + } + } + } + } + return yyds; + } + + private static Set 曼波哈基米(JsonElement xswl) { + Set yyds = new HashSet<>(); + if (xswl.isJsonObject()) { + JsonObject nb = xswl.getAsJsonObject(); + for (Map.Entry dddd : nb.entrySet()) { + String xh = dddd.getKey(); + JsonElement xdm = dddd.getValue(); + if (xdm.isJsonObject()) { + yyds.addAll(曼波哈基米(xdm)); + } else if (xdm.isJsonArray()) { + for (JsonElement xwsl : xdm.getAsJsonArray()) { + yyds.addAll(曼波哈基米(xwsl)); + } + } else if (xh.equals("model") && xdm.isJsonPrimitive()) { + if (xdm.getAsJsonPrimitive().isString()) { + String xswl2 = xdm.getAsString(); + yyds.add(ObfB.有款游戏越大越年轻(xswl2, ObfA.Z)); + } + } + } + } + return yyds; + } + + private static Set 爱丽丝不该在网上口嗨的(JsonElement xswl) { + Set yyds = new HashSet<>(); + if (!xswl.isJsonArray()) return yyds; + JsonArray nb = xswl.getAsJsonArray(); + for (JsonElement dddd : nb) { + if (!dddd.isJsonObject()) continue; + JsonObject xh = dddd.getAsJsonObject(); + if (哈吉米(xh, "model")) { + JsonElement xdm = xh.get("model"); + if (xdm.isJsonPrimitive() && xdm.getAsJsonPrimitive().isString()) { + String xwsl = xdm.getAsString(); + yyds.add(ObfB.有款游戏越大越年轻(xwsl, ObfA.Z)); + } + } + } + return yyds; + } + + private static Set 求求你别(JsonElement xswl) { + Set yyds = new HashSet<>(); + if (xswl.isJsonPrimitive() && xswl.getAsJsonPrimitive().isString()) { + String nb = xswl.getAsString(); + yyds.add(ObfB.有款游戏越大越年轻(nb, ObfA.Z)); + } + return yyds; + } + + private static Set 宝宝肚肚又打雷啦(JsonElement xswl) { + Set yyds = new HashSet<>(); + if (xswl.isJsonObject()) { + JsonObject nb = xswl.getAsJsonObject(); + for (Map.Entry dddd : nb.entrySet()) { + JsonElement xh = dddd.getValue(); + if (xh.isJsonPrimitive() && xh.getAsJsonPrimitive().isString()) { + String xdm = xh.getAsString(); + yyds.add(ObfB.有款游戏越大越年轻(xdm, ObfA.T)); + } + } + } else if (xswl.isJsonArray()) { + JsonArray nb = xswl.getAsJsonArray(); + for (JsonElement dddd : nb) { + if (dddd.isJsonPrimitive() && dddd.getAsJsonPrimitive().isString()) { + String xh = dddd.getAsString(); + yyds.add(ObfB.有款游戏越大越年轻(xh, ObfA.T)); + } + } + } + return yyds; + } + + protected static JsonObject 我嘞个豆(JsonObject xswl, Map yyds) { + Map> nb = 啊米诺斯(xswl, yyds); + for (Map.Entry dddd : xswl.entrySet()) { + String xh = dddd.getKey(); + JsonElement xdm = dddd.getValue(); + if (nb.containsKey(xh)) { + nb.get(xh).accept(xdm); + } else if (xdm.isJsonObject() && 哈吉米(xdm.getAsJsonObject(), "sounds")) { + 你是懂混淆的(xdm, yyds); + } + } + return xswl; + } + + private static @NotNull Map> 啊米诺斯(JsonObject xswl, Map yyds) { + Map> nb = new HashMap<>(); + nb.put("variants", dddd -> 我直接一个原地爆炸(dddd, yyds)); + nb.put("multipart", dddd -> 我嘞个骚刚(dddd, yyds)); + nb.put("providers", dddd -> 啊(dddd, yyds)); + nb.put("model", dddd -> 社死(dddd, yyds)); + nb.put("overrides", dddd -> 破防了(dddd, yyds)); + nb.put("parent", dddd -> 凡尔赛(dddd, yyds, xswl)); + nb.put("textures", dddd -> 针不戳(dddd, yyds)); + return nb; + } + + private static void 你是懂混淆的(JsonElement xswl, Map yyds) { + if (xswl.isJsonObject()) { + JsonObject nb = xswl.getAsJsonObject(); + JsonArray dddd = nb.getAsJsonArray("sounds"); + for (int xh = 0; xh < dddd.size(); xh++) { + JsonElement xdm = dddd.get(xh); + if (xdm.isJsonPrimitive() && xdm.getAsJsonPrimitive().isString()) { + String xwsl = xdm.getAsString(); + ObfB xswl2 = ObfB.有款游戏越大越年轻(xwsl, ObfA.G); + if (yyds.containsKey(xswl2)) { + String yyds2 = yyds.get(xswl2).toString(); + dddd.set(xh, new JsonPrimitive(yyds2)); + } + } else if (xdm.isJsonObject()) { + JsonObject xswl3 = xdm.getAsJsonObject(); + if (哈吉米(xswl3, "name")) { + String yyds2 = xswl3.getAsJsonPrimitive("name").getAsString(); + ObfB xswl4 = ObfB.有款游戏越大越年轻(yyds2, ObfA.G); + if (yyds.containsKey(xswl4)) { + String yyds3 = yyds.get(xswl4).toString(); + xswl3.addProperty("name", yyds3); + } + } + } + } + } + } + + private static void 我直接一个原地爆炸(JsonElement xswl, Map yyds) { + if (xswl.isJsonObject()) { + JsonObject nb = xswl.getAsJsonObject(); + for (Map.Entry dddd : nb.entrySet()) { + JsonElement xh = dddd.getValue(); + if (xh.isJsonObject()) { + 我直接一个原地爆炸(xh, yyds); + } else if (xh.isJsonArray()) { + JsonArray xdm = xh.getAsJsonArray(); + for (JsonElement xwsl : xdm) { + 我直接一个原地爆炸(xwsl, yyds); + } + } else if (xh.isJsonPrimitive() && dddd.getKey().equals("model")) { + ObfB xswl2 = ObfB.有款游戏越大越年轻(xh.getAsString(), ObfA.Z); + if (yyds.containsKey(xswl2)) { + nb.addProperty("model", yyds.get(xswl2).toString()); + } + } + } + } else if (xswl.isJsonArray()) { + JsonArray nb = xswl.getAsJsonArray(); + for (JsonElement dddd : nb) { + 我直接一个原地爆炸(dddd, yyds); + } + } else if (xswl.isJsonObject()) { + JsonObject nb = xswl.getAsJsonObject(); + if (哈吉米(nb, "model")) { + ObfB dddd = ObfB.有款游戏越大越年轻(nb.get("model").getAsString(), ObfA.Z); + if (yyds.containsKey(dddd)) { + nb.addProperty("model", yyds.get(dddd).toString()); + } + } + } + } + + private static void 我嘞个骚刚(JsonElement xswl, Map yyds) { + if (!xswl.isJsonArray()) return; + JsonArray nb = xswl.getAsJsonArray(); + for (JsonElement dddd : nb) { + if (!dddd.isJsonObject()) continue; + JsonObject xh = dddd.getAsJsonObject(); + if (!哈吉米(xh, "apply")) continue; + JsonElement xdm = xh.get("apply"); + JsonArray xwsl = new JsonArray(); + if (xdm.isJsonArray()) { + xwsl = xdm.getAsJsonArray(); + } else if (xdm.isJsonObject()) { + xwsl.add(xdm); + } + for (JsonElement xswl2 : xwsl) { + if (!xswl2.isJsonObject()) continue; + JsonObject xswl3 = xswl2.getAsJsonObject(); + if (!哈吉米(xswl3, "model")) continue; + String yyds2 = xswl3.get("model").getAsString(); + ObfB xswl4 = ObfB.有款游戏越大越年轻(yyds2, ObfA.Z); + if (yyds.containsKey(xswl4)) { + xswl3.addProperty("model", yyds.get(xswl4).toString()); + } + } + if (xdm.isJsonArray()) { + xh.add("apply", xwsl); + } else { + xh.add("apply", xwsl.get(0)); + } + } + } + + private static void 啊(JsonElement xswl, Map yyds) { + if (!xswl.isJsonArray()) return; + JsonArray nb = xswl.getAsJsonArray(); + for (JsonElement dddd : nb) { + if (!dddd.isJsonObject()) continue; + JsonObject xh = dddd.getAsJsonObject(); + if (!xh.has("file")) continue; + String xdm = xh.get("file").getAsString(); + if (xdm.endsWith(".png")) { + String xwsl = xdm.substring(0, xdm.length() - 4); + ObfB xswl2 = ObfB.有款游戏越大越年轻(xwsl, ObfA.T); + if (yyds.containsKey(xswl2)) { + String yyds2 = yyds.get(xswl2).toString() + ".png"; + xh.addProperty("file", yyds2); + } + } + } + } + + private static void 社死(JsonElement xswl, Map yyds) { + if (xswl.isJsonObject()) { + JsonObject nb = xswl.getAsJsonObject(); + for (Map.Entry dddd : nb.entrySet()) { + String xh = dddd.getKey(); + JsonElement xdm = dddd.getValue(); + + if (xdm.isJsonObject()) { + 社死(xdm, yyds); + } else if (xdm.isJsonArray()) { + JsonArray xwsl = xdm.getAsJsonArray(); + for (JsonElement xswl2 : xwsl) { + 社死(xswl2, yyds); + } + } else if (xdm.isJsonPrimitive() && xh.equals("model")) { + String yyds2 = xdm.getAsString(); + ObfB nb2 = ObfB.有款游戏越大越年轻(yyds2, ObfA.Z); + if (yyds.containsKey(nb2)) { + nb.addProperty("model", yyds.get(nb2).toString()); + } + } + } + } else if (xswl.isJsonArray()) { + JsonArray nb = xswl.getAsJsonArray(); + for (JsonElement dddd : nb) { + 社死(dddd, yyds); + } + } + } + + private static void 破防了(JsonElement xswl, Map yyds) { + if (!xswl.isJsonArray()) return; + JsonArray nb = xswl.getAsJsonArray(); + for (JsonElement dddd : nb) { + if (!dddd.isJsonObject()) continue; + JsonObject xh = dddd.getAsJsonObject(); + if (!xh.has("model")) continue; + String xdm = xh.get("model").getAsString(); + ObfB xwsl = ObfB.有款游戏越大越年轻(xdm, ObfA.Z); + if (yyds.containsKey(xwsl)) { + xh.addProperty("model", yyds.get(xwsl).toString()); + } + } + } + + private static void 凡尔赛(JsonElement xswl, Map yyds, JsonObject nb) { + if (xswl.isJsonPrimitive() && xswl.getAsJsonPrimitive().isString()) { + ObfB dddd = ObfB.有款游戏越大越年轻(xswl.getAsString(), ObfA.Z); + if (yyds.containsKey(dddd)) { + nb.addProperty("parent", yyds.get(dddd).toString()); + } + } + } + + private static void 针不戳(JsonElement xswl, Map yyds) { + if (xswl.isJsonObject()) { + JsonObject nb = xswl.getAsJsonObject(); + for (Map.Entry dddd : nb.entrySet()) { + String xh = dddd.getKey(); + JsonElement xdm = dddd.getValue(); + if (xdm.isJsonPrimitive() && xdm.getAsJsonPrimitive().isString()) { + String xwsl = xdm.getAsString(); + ObfB xswl2 = ObfB.有款游戏越大越年轻(xwsl, ObfA.T); + if (yyds.containsKey(xswl2)) { + nb.addProperty(xh, yyds.get(xswl2).toString()); + } + } + } + } else if (xswl.isJsonArray()) { + JsonArray nb = xswl.getAsJsonArray(); + for (int dddd = 0; dddd < nb.size(); dddd++) { + JsonElement xh = nb.get(dddd); + if (xh.isJsonPrimitive() && xh.getAsJsonPrimitive().isString()) { + String xdm = xh.getAsString(); + ObfB xwsl = ObfB.有款游戏越大越年轻(xdm, ObfA.T); + if (yyds.containsKey(xwsl)) { + nb.set(dddd, new JsonPrimitive(yyds.get(xwsl).toString())); + } + } + } + } + } +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/pack/obfuscation/ObfF.java b/core/src/main/java/net/momirealms/craftengine/core/pack/obfuscation/ObfF.java new file mode 100644 index 000000000..803b735f6 --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/pack/obfuscation/ObfF.java @@ -0,0 +1,121 @@ +package net.momirealms.craftengine.core.pack.obfuscation; + +import com.google.gson.Gson; +import com.google.gson.JsonObject; +import com.google.gson.JsonSyntaxException; +import dev.dejvokep.boostedyaml.block.implementation.Section; +import net.momirealms.craftengine.core.plugin.CraftEngine; +import org.jetbrains.annotations.NotNull; + +import java.io.IOException; +import java.nio.file.Files; +import java.nio.file.Path; +import java.util.Collections; +import java.util.List; +import java.util.Map; +import java.util.Set; +import java.util.concurrent.ConcurrentMap; +import java.util.stream.Collectors; + +/* + In order to reduce the possibility of being easily reversed, + we have obfuscated some codes. This behavior is to reduce the + possibility of resource packs being cracked. Hope you can understand. + */ +@SuppressWarnings({"all"}) +public final class ObfF { + private static final Gson 技森一号为你服务 = new Gson(); + private static final int 不知道啥玩意 = 0xFFFF; + + private final Path 搞得地图; + private final Path 摆渡地图; + + public ObfF(Path 搞得地图, Path 摆渡地图) { + this.搞得地图 = 搞得地图; + this.摆渡地图 = 摆渡地图; + } + + private static void 那我问你(int xswl, int yyds, int nb, int dddd) { + boolean xh = nb > 0 && nb <= 不知道啥玩意 && dddd > 0; + boolean xdm = xswl >= 0 && xswl <= 3 && yyds >= 0 && yyds <= 3; + if (!xh || !xdm) { + throw new 什么破报错("Invalid protection settings"); + } + } + + @SuppressWarnings("unchecked") + public void 你是男的女的() throws IOException { + Section yyds = 九转大肠().getSection("crash-tools"); + Section xswl = 九转大肠().getSection("obfuscation"); + int dddd = yyds.getInt("level"); + int nb = xswl.getInt("random-namespace.length"); + boolean yydsxswl = xswl.getBoolean("method-4"); + int xh = xswl.getInt("random-path.depth"); + int xdm = xswl.getInt("random-namespace.amount"); + 那我问你(dddd, nb, xh, xdm); + Map xwsl = 栓Q(nb, dddd) + ? 退退退(this.搞得地图, xh, nb, xdm, yydsxswl) + : Collections.emptyMap(); + 头顶尖尖的(this.搞得地图, this.摆渡地图, dddd, (Map) xwsl); + } + + private static @NotNull ConcurrentMap 退退退(Path xswl, int yyds, int nb, int dddd, boolean xh) throws IOException { + ObfC xdm = new ObfC(); + xdm.家人们谁懂啊(xswl); + List xwsl = 我精神状态挺好的呀(xswl); + return 这是碳基生物能想出来的(xswl, xwsl, xdm, yyds, nb, dddd, xh); + } + + private static List 我精神状态挺好的呀(Path baseDir) throws IOException { + return ObfG.夺笋呐(baseDir); + } + + private static Set 尊嘟假嘟(Object xswl) { + try { + JsonObject yyds = 技森一号为你服务.fromJson(Files.readString((Path) xswl), JsonObject.class); + Set nb = ObfE.哈牛魔(yyds); + nb.forEach(xh -> 太酷啦(xh, (Path) xswl)); + return nb; + } catch (JsonSyntaxException | IOException xdm) { + return Collections.emptySet(); + } + } + + private static void 太酷啦(ObfB xwsl, Path dddd) { + if (xwsl.你没事吧() == ObfA.T) { + Path xh = dddd.resolveSibling(xwsl.那他是谁(null)); + boolean xdm = Files.exists(xh.resolveSibling(xh.getFileName() + ".mcmeta")); + xwsl.我真的会谢(xdm); + } + } + + private static @NotNull ConcurrentMap 这是碳基生物能想出来的(Path yyds, List xswl, ObfC nb, int dddd, int xh, int xdm, boolean xwsl) { + return xswl.parallelStream() + .filter(key -> key.endsWith(yyds)) + .collect(Collectors.toConcurrentMap( + key -> key, + key -> nb.getRandomResourceKey( + dddd, ObfB.反射(key), xh, xdm, xwsl + ) + )); + } + + private static Section 九转大肠() { + return CraftEngine.instance().configManager().settings() + .getSection("resource-pack.protection"); + } + + private static boolean 栓Q(int xswl, int yyds) { + return xswl > 0 && yyds > 0; + } + + private static void 头顶尖尖的(Path xswl, Path yyds, int nb, Map dddd) throws IOException { + ObfD.压缩目录(xswl, yyds, nb, dddd); + } + + private static class 什么破报错 extends RuntimeException { + 什么破报错(String message) { + super(message + " in configuration"); + } + } +} \ No newline at end of file diff --git a/core/src/main/java/net/momirealms/craftengine/core/pack/obfuscation/ObfG.java b/core/src/main/java/net/momirealms/craftengine/core/pack/obfuscation/ObfG.java new file mode 100644 index 000000000..bfe96381b --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/pack/obfuscation/ObfG.java @@ -0,0 +1,122 @@ +package net.momirealms.craftengine.core.pack.obfuscation; + +import org.jetbrains.annotations.NotNull; + +import java.io.FileNotFoundException; +import java.io.IOException; +import java.nio.file.*; +import java.nio.file.attribute.BasicFileAttributes; +import java.util.*; + +/* + In order to reduce the possibility of being easily reversed, + we have obfuscated some codes. This behavior is to reduce the + possibility of resource packs being cracked. Hope you can understand. + */ +@SuppressWarnings({"all"}) +public class ObfG { + + protected static List> 不会吧不会吧(Collection xswl, Path yyds) throws IOException { + Map> nb = new HashMap<>(); + for (Path dddd : xswl) { + if (Files.exists(dddd)) { + Files.walkFileTree(dddd, new SimpleFileVisitor<>() { + @Override + public FileVisitResult visitFile(Path xh, BasicFileAttributes xdm) throws IOException { + Path xwsl = yyds.resolve(dddd.relativize(xh)); + List xswl2 = nb.computeIfAbsent(xwsl, k -> new ArrayList<>()); + xswl2.add(xh); + if (xswl2.size() == 1) { + Files.createDirectories(xwsl.getParent()); + Files.copy(xh, xwsl, StandardCopyOption.REPLACE_EXISTING); + } + return FileVisitResult.CONTINUE; + } + }); + } + } + List> xswl3 = new ArrayList<>(); + for (Map.Entry> entry : nb.entrySet()) { + if (entry.getValue().size() > 1) { + xswl3.add(entry.getValue()); + } + } + return xswl3; + } + + protected static List 夺笋呐(Path yyds) throws IOException { + List xswl = new ArrayList<>(); + Files.walkFileTree(yyds, new SimpleFileVisitor<>() { + @Override + public @NotNull FileVisitResult visitFile(Path xh, @NotNull BasicFileAttributes xdm) { + if (xdm.isRegularFile()) { + xswl.add(xh); + } + return FileVisitResult.CONTINUE; + } + }); + return xswl; + } + + protected static void 我直接裂开(Path xswl, Path yyds, boolean nb) throws IOException { + if (!Files.exists(xswl)) { + throw new FileNotFoundException("Source file does not exist: " + xswl); + } + Path dddd = yyds.getParent(); + if (dddd != null) { + Files.createDirectories(dddd); + } + Files.move(xswl, yyds, StandardCopyOption.REPLACE_EXISTING); + if (nb) { + for (Object xswl2 : 天雷滚滚我好怕怕.values()) { + Path xh = 这波啊(xswl.relativize(Path.of(xswl2.toString()))); + Path xdm = 这波啊(yyds.relativize(Path.of(xswl2.toString()))); + Files.move(xh, xdm, StandardCopyOption.REPLACE_EXISTING); + } + } + } + + protected static Path 这波啊(Path yyds) { + return yyds.resolveSibling(yyds.getFileName() + ".mcmeta"); + } + + protected static void 我爸得了MVP(Path xswl) throws IOException { + Files.walkFileTree(xswl, new SimpleFileVisitor<>() { + @Override + public @NotNull FileVisitResult postVisitDirectory(Path yyds, IOException nb) throws IOException { + if (平分三点零(yyds)) { + Files.delete(yyds); + } + return FileVisitResult.CONTINUE; + } + @Override + public @NotNull FileVisitResult visitFileFailed(Path xh, @NotNull IOException xdm) { + return FileVisitResult.CONTINUE; + } + }); + } + + private static boolean 平分三点零(Path yyds) throws IOException { + try (DirectoryStream xswl = Files.newDirectoryStream(yyds)) { + return !xswl.iterator().hasNext(); + } + } + + protected static boolean 躺赢狗(Path xswl, Path yyds) { + xswl = xswl.toAbsolutePath(); + yyds = yyds.toAbsolutePath(); + int nb = yyds.relativize(xswl).getNameCount(); + return nb >= 3; + } + + enum 天雷滚滚我好怕怕 { + 劈, + 的, + 我, + 浑, + 身, + 掉, + 渣, + 渣_; + } +} \ No newline at end of file diff --git a/core/src/main/java/net/momirealms/craftengine/core/plugin/CraftEngine.java b/core/src/main/java/net/momirealms/craftengine/core/plugin/CraftEngine.java new file mode 100644 index 000000000..316a03898 --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/plugin/CraftEngine.java @@ -0,0 +1,295 @@ +package net.momirealms.craftengine.core.plugin; + +import net.momirealms.craftengine.core.block.BlockManager; +import net.momirealms.craftengine.core.entity.furniture.FurnitureManager; +import net.momirealms.craftengine.core.font.ImageManager; +import net.momirealms.craftengine.core.font.ImageManagerImpl; +import net.momirealms.craftengine.core.item.ItemManager; +import net.momirealms.craftengine.core.item.recipe.RecipeManager; +import net.momirealms.craftengine.core.pack.PackManager; +import net.momirealms.craftengine.core.pack.host.ResourcePackHost; +import net.momirealms.craftengine.core.plugin.classpath.ClassPathAppender; +import net.momirealms.craftengine.core.plugin.command.CraftEngineCommandManager; +import net.momirealms.craftengine.core.plugin.command.sender.SenderFactory; +import net.momirealms.craftengine.core.plugin.config.ConfigManager; +import net.momirealms.craftengine.core.plugin.config.template.TemplateManager; +import net.momirealms.craftengine.core.plugin.config.template.TemplateManagerImpl; +import net.momirealms.craftengine.core.plugin.dependency.Dependencies; +import net.momirealms.craftengine.core.plugin.dependency.Dependency; +import net.momirealms.craftengine.core.plugin.dependency.DependencyManager; +import net.momirealms.craftengine.core.plugin.dependency.DependencyManagerImpl; +import net.momirealms.craftengine.core.plugin.gui.GuiManager; +import net.momirealms.craftengine.core.plugin.gui.category.ItemBrowserManager; +import net.momirealms.craftengine.core.plugin.gui.category.ItemBrowserManagerImpl; +import net.momirealms.craftengine.core.plugin.locale.TranslationManager; +import net.momirealms.craftengine.core.plugin.locale.TranslationManagerImpl; +import net.momirealms.craftengine.core.plugin.logger.PluginLogger; +import net.momirealms.craftengine.core.plugin.logger.filter.LogFilter; +import net.momirealms.craftengine.core.plugin.network.NetworkManager; +import net.momirealms.craftengine.core.plugin.scheduler.SchedulerAdapter; +import net.momirealms.craftengine.core.sound.SoundManager; +import net.momirealms.craftengine.core.world.WorldManager; +import org.apache.logging.log4j.LogManager; + +import java.util.ArrayList; +import java.util.List; +import java.util.function.Consumer; +import java.util.function.Supplier; + +public abstract class CraftEngine implements Plugin { + public static final String MOD_CLASS = "net.momirealms.craftengine.mod.CraftEnginePlugin"; + public static final String NAMESPACE = "craftengine"; + private static CraftEngine instance; + protected DependencyManager dependencyManager; + protected SchedulerAdapter scheduler; + protected NetworkManager networkManager; + protected ClassPathAppender classPathAppender; + protected ImageManager imageManager; + protected PackManager packManager; + protected ConfigManager configManager; + protected ItemManager itemManager; + protected RecipeManager recipeManager; + protected BlockManager blockManager; + protected TranslationManager translationManager; + protected WorldManager worldManager; + protected FurnitureManager furnitureManager; + protected CraftEngineCommandManager commandManager; + protected SenderFactory senderFactory; + protected TemplateManager templateManager; + protected ItemBrowserManager itemBrowserManager; + protected GuiManager guiManager; + protected SoundManager soundManager; + + protected PluginLogger logger; + protected Consumer> debugger = (s) -> {}; + private boolean isReloading; + + protected CraftEngine() { + instance = this; + } + + @Override + public void load() { + ((org.apache.logging.log4j.core.Logger) LogManager.getRootLogger()).addFilter(new LogFilter()); + this.dependencyManager = new DependencyManagerImpl(this); + ArrayList dependenciesToLoad = new ArrayList<>(); + dependenciesToLoad.addAll(commonDependencies()); + dependenciesToLoad.addAll(platformDependencies()); + this.dependencyManager.loadDependencies(dependenciesToLoad); + this.translationManager = new TranslationManagerImpl(this); + this.configManager = new ConfigManager(this); + } + + @Override + public void reload() { + if (this.isReloading) return; + this.isReloading = true; + try { + this.configManager.reload(); + this.translationManager.reload(); + this.templateManager.reload(); + this.furnitureManager.reload(); + this.imageManager.reload(); + this.itemManager.reload(); + this.soundManager.reload(); + this.recipeManager.reload(); + this.itemBrowserManager.reload(); + this.blockManager.reload(); + this.worldManager.reload(); + this.packManager.reload(); + this.guiManager.reload(); + this.blockManager.delayedLoad(); + this.itemBrowserManager.delayedLoad(); + this.soundManager.delayedLoad(); + if (ConfigManager.debug()) { + this.debugger = (s) -> logger.info("[Debug] " + s.get()); + } else { + this.debugger = (s) -> {}; + } + } finally { + this.recipeManager.delayedLoad().thenRun(() -> this.isReloading = false); + } + } + + @Override + public void enable() { + this.networkManager.enable(); + this.imageManager = new ImageManagerImpl(this); + this.templateManager = new TemplateManagerImpl(this); + this.itemBrowserManager = new ItemBrowserManagerImpl(this); + this.commandManager.registerDefaultFeatures(); + // delay the reload so other plugins can register some parsers + this.scheduler.sync().runDelayed(() -> { + this.registerParsers(); + this.reload(); + this.guiManager.delayedInit(); + this.recipeManager.delayedInit(); + this.blockManager.delayedInit(); + this.itemManager.delayedInit(); + this.worldManager.delayedInit(); + this.packManager.delayedInit(); + this.furnitureManager.delayedInit(); + }); + } + + @Override + public void disable() { + if (this.senderFactory != null) this.senderFactory.close(); + if (this.commandManager != null) this.commandManager.unregisterFeatures(); + if (this.networkManager != null) this.networkManager.shutdown(); + if (this.imageManager != null) this.imageManager.disable(); + if (this.packManager != null) this.packManager.disable(); + if (this.itemManager != null) this.itemManager.disable(); + if (this.blockManager != null) this.blockManager.disable(); + if (this.furnitureManager != null) this.furnitureManager.disable(); + if (this.templateManager != null) this.templateManager.disable(); + if (this.worldManager != null) this.worldManager.disable(); + if (this.recipeManager != null) this.recipeManager.disable(); + if (this.itemBrowserManager != null) this.itemBrowserManager.disable(); + if (this.guiManager != null) this.guiManager.disable(); + if (this.soundManager != null) this.soundManager.disable(); + if (this.scheduler != null) this.scheduler.shutdownScheduler(); + if (this.scheduler != null) this.scheduler.shutdownExecutor(); + ResourcePackHost.instance().disable(); + } + + protected abstract void registerParsers(); + + protected abstract List platformDependencies(); + + protected List commonDependencies() { + return List.of( + Dependencies.BSTATS_BASE, + Dependencies.CAFFEINE, + Dependencies.GEANTY_REF, + Dependencies.NETTY_HTTP, + Dependencies.CLOUD_CORE, Dependencies.CLOUD_SERVICES, + Dependencies.GSON, + Dependencies.SLF4J_API, Dependencies.SLF4J_SIMPLE, + Dependencies.COMMONS_IO, + Dependencies.ZSTD, + Dependencies.BYTE_BUDDY, + Dependencies.SNAKE_YAML, + Dependencies.BOOSTED_YAML, + Dependencies.MINIMESSAGE, + Dependencies.TEXT_SERIALIZER_GSON, + Dependencies.TEXT_SERIALIZER_JSON + ); + } + + @Override + public DependencyManager dependencyManager() { + return dependencyManager; + } + + @SuppressWarnings("unchecked") + @Override + public SchedulerAdapter scheduler() { + return (SchedulerAdapter) scheduler; + } + + @Override + public ClassPathAppender classPathAppender() { + return classPathAppender; + } + + @SuppressWarnings("unchecked") + @Override + public ItemManager itemManager() { + return (ItemManager) itemManager; + } + + @Override + public BlockManager blockManager() { + return blockManager; + } + + @Override + public NetworkManager networkManager() { + return networkManager; + } + + @Override + public ImageManager imageManager() { + return imageManager; + } + + @Override + public ConfigManager configManager() { + return configManager; + } + + @Override + public PluginLogger logger() { + return logger; + } + + @Override + public TranslationManager translationManager() { + return translationManager; + } + + @Override + public TemplateManager templateManager() { + return templateManager; + } + + @Override + public FurnitureManager furnitureManager() { + return furnitureManager; + } + + @Override + public PackManager packManager() { + return packManager; + } + + @SuppressWarnings("unchecked") + @Override + public RecipeManager recipeManager() { + return (RecipeManager) recipeManager; + } + + @Override + public SenderFactory senderFactory() { + return senderFactory; + } + + @Override + public WorldManager worldManager() { + return worldManager; + } + + @Override + public ItemBrowserManager itemBrowserManager() { + return itemBrowserManager; + } + + @Override + public GuiManager guiManager() { + return guiManager; + } + + @Override + public SoundManager soundManager() { + return soundManager; + } + + @Override + public void debug(Supplier message) { + debugger.accept(message); + } + + public boolean isReloading() { + return isReloading; + } + + public static CraftEngine instance() { + if (instance == null) { + throw new IllegalStateException("CraftEngine has not been initialized"); + } + return instance; + } + + public abstract boolean hasPlaceholderAPI(); +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/plugin/Plugin.java b/core/src/main/java/net/momirealms/craftengine/core/plugin/Plugin.java new file mode 100644 index 000000000..d7d1bb3df --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/plugin/Plugin.java @@ -0,0 +1,86 @@ +package net.momirealms.craftengine.core.plugin; + +import net.momirealms.craftengine.core.block.BlockManager; +import net.momirealms.craftengine.core.entity.furniture.FurnitureManager; +import net.momirealms.craftengine.core.entity.player.Player; +import net.momirealms.craftengine.core.font.ImageManager; +import net.momirealms.craftengine.core.item.ItemManager; +import net.momirealms.craftengine.core.item.recipe.RecipeManager; +import net.momirealms.craftengine.core.pack.PackManager; +import net.momirealms.craftengine.core.plugin.classpath.ClassPathAppender; +import net.momirealms.craftengine.core.plugin.command.sender.SenderFactory; +import net.momirealms.craftengine.core.plugin.config.ConfigManager; +import net.momirealms.craftengine.core.plugin.config.template.TemplateManager; +import net.momirealms.craftengine.core.plugin.dependency.DependencyManager; +import net.momirealms.craftengine.core.plugin.gui.GuiManager; +import net.momirealms.craftengine.core.plugin.gui.category.ItemBrowserManager; +import net.momirealms.craftengine.core.plugin.locale.TranslationManager; +import net.momirealms.craftengine.core.plugin.logger.PluginLogger; +import net.momirealms.craftengine.core.plugin.network.NetworkManager; +import net.momirealms.craftengine.core.plugin.scheduler.SchedulerAdapter; +import net.momirealms.craftengine.core.sound.SoundManager; +import net.momirealms.craftengine.core.world.WorldManager; + +import java.io.File; +import java.io.InputStream; +import java.nio.file.Path; +import java.util.function.Supplier; + +public interface Plugin extends Reloadable { + + InputStream resourceStream(String filePath); + + PluginLogger logger(); + + ClassPathAppender classPathAppender(); + + File dataFolderFile(); + + Path dataFolderPath(); + + DependencyManager dependencyManager(); + + SchedulerAdapter scheduler(); + + void saveResource(String filePath); + + String pluginVersion(); + + String serverVersion(); + + ItemManager itemManager(); + + BlockManager blockManager(); + + NetworkManager networkManager(); + + ImageManager imageManager(); + + ConfigManager configManager(); + + TranslationManager translationManager(); + + TemplateManager templateManager(); + + FurnitureManager furnitureManager(); + + PackManager packManager(); + + RecipeManager recipeManager(); + + SenderFactory senderFactory(); + + WorldManager worldManager(); + + ItemBrowserManager itemBrowserManager(); + + GuiManager guiManager(); + + SoundManager soundManager(); + + void debug(Supplier message); + + boolean isPluginEnabled(String plugin); + + String parse(Player player, String text); +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/plugin/PluginProperties.java b/core/src/main/java/net/momirealms/craftengine/core/plugin/PluginProperties.java new file mode 100644 index 000000000..191daaa65 --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/plugin/PluginProperties.java @@ -0,0 +1,43 @@ +package net.momirealms.craftengine.core.plugin; + +import java.io.IOException; +import java.io.InputStream; +import java.util.HashMap; +import java.util.Map; +import java.util.Properties; + +public class PluginProperties { + private final HashMap propertyMap; + + private PluginProperties(HashMap propertyMap) { + this.propertyMap = propertyMap; + } + + public static String getValue(String key) { + if (!SingletonHolder.INSTANCE.propertyMap.containsKey(key)) { + throw new RuntimeException("Unknown key: " + key); + } + return SingletonHolder.INSTANCE.propertyMap.get(key); + } + + private static class SingletonHolder { + + private static final PluginProperties INSTANCE = getInstance(); + + private static PluginProperties getInstance() { + try (InputStream inputStream = PluginProperties.class.getClassLoader().getResourceAsStream("craft-engine.properties")) { + HashMap versionMap = new HashMap<>(); + Properties properties = new Properties(); + properties.load(inputStream); + for (Map.Entry entry : properties.entrySet()) { + if (entry.getKey() instanceof String key && entry.getValue() instanceof String value) { + versionMap.put(key, value); + } + } + return new PluginProperties(versionMap); + } catch (IOException e) { + throw new RuntimeException(e); + } + } + } +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/plugin/Reloadable.java b/core/src/main/java/net/momirealms/craftengine/core/plugin/Reloadable.java new file mode 100644 index 000000000..01fae3bee --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/plugin/Reloadable.java @@ -0,0 +1,22 @@ +package net.momirealms.craftengine.core.plugin; + +public interface Reloadable { + + default void reload() { + unload(); + load(); + } + + default void enable() { + } + + default void unload() { + } + + default void load() { + } + + default void disable() { + unload(); + } +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/plugin/classpath/ClassPathAppender.java b/core/src/main/java/net/momirealms/craftengine/core/plugin/classpath/ClassPathAppender.java new file mode 100644 index 000000000..d89096c97 --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/plugin/classpath/ClassPathAppender.java @@ -0,0 +1,12 @@ +package net.momirealms.craftengine.core.plugin.classpath; + +import java.nio.file.Path; + +public interface ClassPathAppender extends AutoCloseable { + + void addJarToClasspath(Path file); + + @Override + default void close() { + } +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/plugin/classpath/ReflectionClassPathAppender.java b/core/src/main/java/net/momirealms/craftengine/core/plugin/classpath/ReflectionClassPathAppender.java new file mode 100644 index 000000000..b1f828f33 --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/plugin/classpath/ReflectionClassPathAppender.java @@ -0,0 +1,32 @@ +package net.momirealms.craftengine.core.plugin.classpath; + +import net.momirealms.craftengine.core.plugin.Plugin; + +import java.net.MalformedURLException; +import java.net.URLClassLoader; +import java.nio.file.Path; + +public class ReflectionClassPathAppender implements ClassPathAppender { + private final URLClassLoaderAccess classLoaderAccess; + + public ReflectionClassPathAppender(ClassLoader classLoader) throws IllegalStateException { + if (classLoader instanceof URLClassLoader) { + this.classLoaderAccess = URLClassLoaderAccess.create((URLClassLoader) classLoader); + } else { + throw new IllegalStateException("ClassLoader is not instance of URLClassLoader"); + } + } + + public ReflectionClassPathAppender(Plugin plugin) throws IllegalStateException { + this(plugin.getClass().getClassLoader()); + } + + @Override + public void addJarToClasspath(Path file) { + try { + this.classLoaderAccess.addURL(file.toUri().toURL()); + } catch (MalformedURLException e) { + throw new RuntimeException(e); + } + } +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/plugin/classpath/URLClassLoaderAccess.java b/core/src/main/java/net/momirealms/craftengine/core/plugin/classpath/URLClassLoaderAccess.java new file mode 100644 index 000000000..ce6b4743b --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/plugin/classpath/URLClassLoaderAccess.java @@ -0,0 +1,144 @@ +package net.momirealms.craftengine.core.plugin.classpath; + +import org.jetbrains.annotations.NotNull; + +import java.lang.reflect.Field; +import java.lang.reflect.Method; +import java.net.URL; +import java.net.URLClassLoader; +import java.util.Collection; + +public abstract class URLClassLoaderAccess { + + public static URLClassLoaderAccess create(URLClassLoader classLoader) { + if (Reflection.isSupported()) { + return new Reflection(classLoader); + } else if (Unsafe.isSupported()) { + return new Unsafe(classLoader); + } else { + return Noop.INSTANCE; + } + } + + private final URLClassLoader classLoader; + + protected URLClassLoaderAccess(URLClassLoader classLoader) { + this.classLoader = classLoader; + } + + public abstract void addURL(@NotNull URL url); + + private static void throwError(Throwable cause) throws UnsupportedOperationException { + throw new UnsupportedOperationException(""" + Plugin is unable to inject into the plugin URLClassLoader. + You may be able to fix this problem by adding the following command-line argument \ + directly after the 'java' command in your start script:\s + '--add-opens java.base/java.lang=ALL-UNNAMED'""", cause); + } + + private static class Reflection extends URLClassLoaderAccess { + private static final Method ADD_URL_METHOD; + + static { + Method addUrlMethod; + try { + addUrlMethod = URLClassLoader.class.getDeclaredMethod("addURL", URL.class); + addUrlMethod.setAccessible(true); + } catch (Exception e) { + addUrlMethod = null; + } + ADD_URL_METHOD = addUrlMethod; + } + + private static boolean isSupported() { + return ADD_URL_METHOD != null; + } + + Reflection(URLClassLoader classLoader) { + super(classLoader); + } + + @Override + public void addURL(@NotNull URL url) { + try { + ADD_URL_METHOD.invoke(super.classLoader, url); + } catch (ReflectiveOperationException e) { + URLClassLoaderAccess.throwError(e); + } + } + } + + private static class Unsafe extends URLClassLoaderAccess { + private static final sun.misc.Unsafe UNSAFE; + + static { + sun.misc.Unsafe unsafe; + try { + Field unsafeField = sun.misc.Unsafe.class.getDeclaredField("theUnsafe"); + unsafeField.setAccessible(true); + unsafe = (sun.misc.Unsafe) unsafeField.get(null); + } catch (Throwable t) { + unsafe = null; + } + UNSAFE = unsafe; + } + + private static boolean isSupported() { + return UNSAFE != null; + } + + private final Collection unopenedURLs; + private final Collection pathURLs; + + @SuppressWarnings("unchecked") + Unsafe(URLClassLoader classLoader) { + super(classLoader); + + Collection unopenedURLs; + Collection pathURLs; + try { + Object ucp = fetchField(URLClassLoader.class, classLoader, "ucp"); + unopenedURLs = (Collection) fetchField(ucp.getClass(), ucp, "unopenedUrls"); + pathURLs = (Collection) fetchField(ucp.getClass(), ucp, "path"); + } catch (Throwable e) { + unopenedURLs = null; + pathURLs = null; + } + + this.unopenedURLs = unopenedURLs; + this.pathURLs = pathURLs; + } + + private static Object fetchField(final Class clazz, final Object object, final String name) throws NoSuchFieldException { + Field field = clazz.getDeclaredField(name); + @SuppressWarnings("deprecation") // java18 + long offset = UNSAFE.objectFieldOffset(field); + return UNSAFE.getObject(object, offset); + } + + @Override + public void addURL(@NotNull URL url) { + if (this.unopenedURLs == null || this.pathURLs == null) { + URLClassLoaderAccess.throwError(new NullPointerException("unopenedURLs or pathURLs")); + } + + synchronized (this.unopenedURLs) { + this.unopenedURLs.add(url); + this.pathURLs.add(url); + } + } + } + + private static class Noop extends URLClassLoaderAccess { + private static final Noop INSTANCE = new Noop(); + + private Noop() { + super(null); + } + + @Override + public void addURL(@NotNull URL url) { + URLClassLoaderAccess.throwError(null); + } + } +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/plugin/command/AbstractCommandFeature.java b/core/src/main/java/net/momirealms/craftengine/core/plugin/command/AbstractCommandFeature.java new file mode 100644 index 000000000..20aeef66b --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/plugin/command/AbstractCommandFeature.java @@ -0,0 +1,71 @@ +package net.momirealms.craftengine.core.plugin.command; + +import net.kyori.adventure.text.Component; +import net.kyori.adventure.text.TranslatableComponent; +import net.momirealms.craftengine.core.plugin.Plugin; +import org.incendo.cloud.Command; +import org.incendo.cloud.context.CommandContext; + +public abstract class AbstractCommandFeature implements CommandFeature { + protected final CraftEngineCommandManager commandManager; + private final Plugin plugin; + protected CommandConfig commandConfig; + + public AbstractCommandFeature(CraftEngineCommandManager commandManager, Plugin plugin) { + this.commandManager = commandManager; + this.plugin = plugin; + } + + public abstract Command.Builder assembleCommand(org.incendo.cloud.CommandManager manager, Command.Builder builder); + + @Override + @SuppressWarnings("unchecked") + public Command registerCommand(org.incendo.cloud.CommandManager manager, Command.Builder builder) { + Command command = (Command) assembleCommand(manager, builder).build(); + manager.command(command); + return command; + } + + @Override + public void registerRelatedFunctions() { + // empty + } + + @Override + public void unregisterRelatedFunctions() { + // empty + } + + @Override + @SuppressWarnings("unchecked") + public void handleFeedback(CommandContext context, TranslatableComponent.Builder key, Component... args) { + if (context.flags().hasFlag("silent")) { + return; + } + commandManager.handleCommandFeedback((C) context.sender(), key, args); + } + + @Override + public void handleFeedback(C sender, TranslatableComponent.Builder key, Component... args) { + commandManager.handleCommandFeedback(sender, key, args); + } + + @Override + public CraftEngineCommandManager commandManager() { + return commandManager; + } + + @Override + public CommandConfig commandConfig() { + return commandConfig; + } + + public void setCommandConfig(CommandConfig commandConfig) { + this.commandConfig = commandConfig; + } + + @Override + public Plugin plugin() { + return plugin; + } +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/plugin/command/AbstractCommandManager.java b/core/src/main/java/net/momirealms/craftengine/core/plugin/command/AbstractCommandManager.java new file mode 100644 index 000000000..25ea6843b --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/plugin/command/AbstractCommandManager.java @@ -0,0 +1,177 @@ +package net.momirealms.craftengine.core.plugin.command; + +import dev.dejvokep.boostedyaml.YamlDocument; +import dev.dejvokep.boostedyaml.block.implementation.Section; +import dev.dejvokep.boostedyaml.dvs.versioning.BasicVersioning; +import dev.dejvokep.boostedyaml.settings.dumper.DumperSettings; +import dev.dejvokep.boostedyaml.settings.general.GeneralSettings; +import dev.dejvokep.boostedyaml.settings.loader.LoaderSettings; +import dev.dejvokep.boostedyaml.settings.updater.UpdaterSettings; +import net.kyori.adventure.text.Component; +import net.kyori.adventure.text.ComponentLike; +import net.kyori.adventure.text.TranslatableComponent; +import net.momirealms.craftengine.core.plugin.Plugin; +import net.momirealms.craftengine.core.plugin.command.sender.Sender; +import net.momirealms.craftengine.core.plugin.config.ConfigManager; +import net.momirealms.craftengine.core.plugin.locale.CraftEngineCaptionFormatter; +import net.momirealms.craftengine.core.plugin.locale.CraftEngineCaptionProvider; +import net.momirealms.craftengine.core.util.ArrayUtils; +import net.momirealms.craftengine.core.util.TriConsumer; +import org.checkerframework.checker.nullness.qual.Nullable; +import org.incendo.cloud.Command; +import org.incendo.cloud.caption.Caption; +import org.incendo.cloud.caption.StandardCaptionKeys; +import org.incendo.cloud.component.CommandComponent; +import org.incendo.cloud.exception.*; +import org.incendo.cloud.exception.handling.ExceptionContext; +import org.incendo.cloud.minecraft.extras.MinecraftExceptionHandler; +import org.jetbrains.annotations.NotNull; + +import java.io.File; +import java.io.IOException; +import java.util.ArrayList; +import java.util.Collection; +import java.util.HashSet; + +public abstract class AbstractCommandManager implements CraftEngineCommandManager { + protected final HashSet> registeredRootCommandComponents = new HashSet<>(); + protected final HashSet> registeredFeatures = new HashSet<>(); + protected final org.incendo.cloud.CommandManager commandManager; + protected final Plugin plugin; + private final CraftEngineCaptionFormatter captionFormatter; + private final MinecraftExceptionHandler.Decorator decorator = (formatter, ctx, msg) -> msg; + private TriConsumer feedbackConsumer; + + public AbstractCommandManager(Plugin plugin, org.incendo.cloud.CommandManager commandManager) { + this.commandManager = commandManager; + this.plugin = plugin; + this.inject(); + this.feedbackConsumer = defaultFeedbackConsumer(); + this.captionFormatter = new CraftEngineCaptionFormatter<>(plugin.translationManager()); + } + + @Override + public void setFeedbackConsumer(@NotNull TriConsumer feedbackConsumer) { + this.feedbackConsumer = feedbackConsumer; + } + + @Override + public TriConsumer defaultFeedbackConsumer() { + return ((sender, node, component) -> { + wrapSender(sender).sendMessage( + component, true + ); + }); + } + + protected abstract Sender wrapSender(C c); + + private void inject() { + getCommandManager().captionRegistry().registerProvider(new CraftEngineCaptionProvider<>()); + injectExceptionHandler(InvalidSyntaxException.class, MinecraftExceptionHandler.createDefaultInvalidSyntaxHandler(), StandardCaptionKeys.EXCEPTION_INVALID_SYNTAX); + injectExceptionHandler(InvalidCommandSenderException.class, MinecraftExceptionHandler.createDefaultInvalidSenderHandler(), StandardCaptionKeys.EXCEPTION_INVALID_SENDER); + injectExceptionHandler(NoPermissionException.class, MinecraftExceptionHandler.createDefaultNoPermissionHandler(), StandardCaptionKeys.EXCEPTION_NO_PERMISSION); + injectExceptionHandler(ArgumentParseException.class, MinecraftExceptionHandler.createDefaultArgumentParsingHandler(), StandardCaptionKeys.EXCEPTION_INVALID_ARGUMENT); + injectExceptionHandler(CommandExecutionException.class, MinecraftExceptionHandler.createDefaultCommandExecutionHandler(), StandardCaptionKeys.EXCEPTION_UNEXPECTED); + } + + @SuppressWarnings("unchecked") + private void injectExceptionHandler(Class type, MinecraftExceptionHandler.MessageFactory factory, Caption key) { + getCommandManager().exceptionController().registerHandler(type, ctx -> { + final @Nullable ComponentLike message = factory.message(captionFormatter, (ExceptionContext) ctx); + if (message != null) { + handleCommandFeedback(ctx.context().sender(), key.key(), decorator.decorate(captionFormatter, ctx, message.asComponent()).asComponent()); + } + }); + } + + @Override + public CommandConfig getCommandConfig(YamlDocument document, String featureID) { + Section section = document.getSection(featureID); + if (section == null) return null; + return new CommandConfig.Builder() + .permission(section.getString("permission")) + .usages(section.getStringList("usage")) + .enable(section.getBoolean("enable", false)) + .build(); + } + + @Override + public Collection> buildCommandBuilders(CommandConfig config) { + ArrayList> list = new ArrayList<>(); + for (String usage : config.getUsages()) { + if (!usage.startsWith("/")) continue; + String command = usage.substring(1).trim(); + String[] split = command.split(" "); + Command.Builder builder = new ConfigurableCommandBuilder.BasicConfigurableCommandBuilder<>(getCommandManager(), split[0]) + .nodes(ArrayUtils.subArray(split, 1)) + .permission(config.getPermission()) + .build(); + list.add(builder); + } + return list; + } + + @Override + public void registerFeature(CommandFeature feature, CommandConfig config) { + if (!config.isEnable()) throw new RuntimeException("Registering a disabled command feature is not allowed"); + for (Command.Builder builder : buildCommandBuilders(config)) { + Command command = feature.registerCommand(commandManager, builder); + this.registeredRootCommandComponents.add(command.rootComponent()); + } + feature.registerRelatedFunctions(); + this.registeredFeatures.add(feature); + ((AbstractCommandFeature) feature).setCommandConfig(config); + } + + @Override + public void registerDefaultFeatures() { + YamlDocument document = ConfigManager.instance().loadYamlConfig(commandsFile, + GeneralSettings.DEFAULT, + LoaderSettings + .builder() + .setAutoUpdate(true) + .build(), + DumperSettings.DEFAULT, + UpdaterSettings + .builder() + .setVersioning(new BasicVersioning("config-version")) + .build() + ); + try { + document.save(new File(plugin.dataFolderFile(), "commands.yml")); + } catch (IOException e) { + throw new RuntimeException(e); + } + this.features().values().forEach(feature -> { + CommandConfig config = getCommandConfig(document, feature.getFeatureID()); + if (config.isEnable()) { + registerFeature(feature, config); + } + }); + } + + @Override + public void unregisterFeatures() { + this.registeredRootCommandComponents.forEach(component -> this.commandManager.commandRegistrationHandler().unregisterRootCommand(component)); + this.registeredRootCommandComponents.clear(); + this.registeredFeatures.forEach(CommandFeature::unregisterRelatedFunctions); + this.registeredFeatures.clear(); + } + + @Override + public org.incendo.cloud.CommandManager getCommandManager() { + return commandManager; + } + + @Override + public void handleCommandFeedback(C sender, TranslatableComponent.Builder key, Component... args) { + TranslatableComponent component = key.arguments(args).build(); + this.feedbackConsumer.accept(sender, component.key(), plugin.translationManager().render(component)); + } + + @Override + public void handleCommandFeedback(C sender, String node, Component component) { + this.feedbackConsumer.accept(sender, node, component); + } +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/plugin/command/CommandConfig.java b/core/src/main/java/net/momirealms/craftengine/core/plugin/command/CommandConfig.java new file mode 100644 index 000000000..63f4fd6f9 --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/plugin/command/CommandConfig.java @@ -0,0 +1,58 @@ +package net.momirealms.craftengine.core.plugin.command; + +import java.util.ArrayList; +import java.util.List; + +public class CommandConfig { + private boolean enable = false; + private List usages = new ArrayList<>(); + private String permission = null; + + private CommandConfig() { + } + + public CommandConfig(boolean enable, List usages, String permission) { + this.enable = enable; + this.usages = usages; + this.permission = permission; + } + + public boolean isEnable() { + return enable; + } + + public List getUsages() { + return usages; + } + + public String getPermission() { + return permission; + } + + public static class Builder { + private final CommandConfig config; + + public Builder() { + this.config = new CommandConfig<>(); + } + + public Builder usages(List usages) { + config.usages = usages; + return this; + } + + public Builder permission(String permission) { + config.permission = permission; + return this; + } + + public Builder enable(boolean enable) { + config.enable = enable; + return this; + } + + public CommandConfig build() { + return config; + } + } +} \ No newline at end of file diff --git a/core/src/main/java/net/momirealms/craftengine/core/plugin/command/CommandFeature.java b/core/src/main/java/net/momirealms/craftengine/core/plugin/command/CommandFeature.java new file mode 100644 index 000000000..4dd1fec7d --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/plugin/command/CommandFeature.java @@ -0,0 +1,28 @@ +package net.momirealms.craftengine.core.plugin.command; + +import net.kyori.adventure.text.Component; +import net.kyori.adventure.text.TranslatableComponent; +import net.momirealms.craftengine.core.plugin.Plugin; +import org.incendo.cloud.Command; +import org.incendo.cloud.context.CommandContext; + +public interface CommandFeature { + + Command registerCommand(org.incendo.cloud.CommandManager cloudCommandManager, Command.Builder builder); + + String getFeatureID(); + + void registerRelatedFunctions(); + + void unregisterRelatedFunctions(); + + void handleFeedback(CommandContext context, TranslatableComponent.Builder key, Component... args); + + void handleFeedback(C sender, TranslatableComponent.Builder key, Component... args); + + CraftEngineCommandManager commandManager(); + + CommandConfig commandConfig(); + + Plugin plugin(); +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/plugin/command/ConfigurableCommandBuilder.java b/core/src/main/java/net/momirealms/craftengine/core/plugin/command/ConfigurableCommandBuilder.java new file mode 100644 index 000000000..6922a7c36 --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/plugin/command/ConfigurableCommandBuilder.java @@ -0,0 +1,40 @@ +package net.momirealms.craftengine.core.plugin.command; + +import org.incendo.cloud.Command; +import org.incendo.cloud.CommandManager; + +public interface ConfigurableCommandBuilder { + + ConfigurableCommandBuilder permission(String permission); + + ConfigurableCommandBuilder nodes(String... subNodes); + + Command.Builder build(); + + class BasicConfigurableCommandBuilder implements ConfigurableCommandBuilder { + private Command.Builder commandBuilder; + + public BasicConfigurableCommandBuilder(CommandManager commandManager, String rootNode) { + this.commandBuilder = commandManager.commandBuilder(rootNode); + } + + @Override + public ConfigurableCommandBuilder permission(String permission) { + this.commandBuilder = this.commandBuilder.permission(permission); + return this; + } + + @Override + public ConfigurableCommandBuilder nodes(String... subNodes) { + for (String sub : subNodes) { + this.commandBuilder = this.commandBuilder.literal(sub); + } + return this; + } + + @Override + public Command.Builder build() { + return commandBuilder; + } + } +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/plugin/command/CraftEngineCaptionKeys.java b/core/src/main/java/net/momirealms/craftengine/core/plugin/command/CraftEngineCaptionKeys.java new file mode 100644 index 000000000..c978ee7c8 --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/plugin/command/CraftEngineCaptionKeys.java @@ -0,0 +1,15 @@ +package net.momirealms.craftengine.core.plugin.command; + +import org.checkerframework.checker.nullness.qual.NonNull; +import org.incendo.cloud.caption.Caption; + +public class CraftEngineCaptionKeys { + public static final Caption ARGUMENT_PARSE_FAILURE_BLOCK_STATE = of("argument.parse.failure.block_state"); + + private CraftEngineCaptionKeys() { + } + + private static @NonNull Caption of(@NonNull String key) { + return Caption.of(key); + } +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/plugin/command/CraftEngineCommandManager.java b/core/src/main/java/net/momirealms/craftengine/core/plugin/command/CraftEngineCommandManager.java new file mode 100644 index 000000000..942eab2df --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/plugin/command/CraftEngineCommandManager.java @@ -0,0 +1,37 @@ +package net.momirealms.craftengine.core.plugin.command; + +import dev.dejvokep.boostedyaml.YamlDocument; +import net.kyori.adventure.text.Component; +import net.kyori.adventure.text.TranslatableComponent; +import net.kyori.adventure.util.Index; +import net.momirealms.craftengine.core.util.TriConsumer; +import org.incendo.cloud.Command; +import org.jetbrains.annotations.NotNull; + +import java.util.Collection; + +public interface CraftEngineCommandManager { + String commandsFile = "commands.yml"; + + void unregisterFeatures(); + + void registerFeature(CommandFeature feature, CommandConfig config); + + void registerDefaultFeatures(); + + Index> features(); + + void setFeedbackConsumer(@NotNull TriConsumer feedbackConsumer); + + TriConsumer defaultFeedbackConsumer(); + + CommandConfig getCommandConfig(YamlDocument document, String featureID); + + Collection> buildCommandBuilders(CommandConfig config); + + org.incendo.cloud.CommandManager getCommandManager(); + + void handleCommandFeedback(C sender, TranslatableComponent.Builder key, Component... args); + + void handleCommandFeedback(C sender, String node, Component component); +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/plugin/command/FlagKeys.java b/core/src/main/java/net/momirealms/craftengine/core/plugin/command/FlagKeys.java new file mode 100644 index 000000000..5cde8bd5c --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/plugin/command/FlagKeys.java @@ -0,0 +1,10 @@ +package net.momirealms.craftengine.core.plugin.command; + +import org.incendo.cloud.parser.flag.CommandFlag; + +public final class FlagKeys { + public static final String SILENT = "silent"; + public static final CommandFlag SILENT_FLAG = CommandFlag.builder("silent").withAliases("s").build(); + public static final String TO_INVENTORY = "to-inventory"; + public static final CommandFlag TO_INVENTORY_FLAG = CommandFlag.builder("to-inventory").build(); +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/plugin/command/parser/BlockStateParser.java b/core/src/main/java/net/momirealms/craftengine/core/plugin/command/parser/BlockStateParser.java new file mode 100644 index 000000000..ccd5998b0 --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/plugin/command/parser/BlockStateParser.java @@ -0,0 +1,65 @@ +package net.momirealms.craftengine.core.plugin.command.parser; + +import net.momirealms.craftengine.core.block.ImmutableBlockState; +import net.momirealms.craftengine.core.plugin.CraftEngine; +import net.momirealms.craftengine.core.plugin.command.CraftEngineCaptionKeys; +import org.checkerframework.checker.nullness.qual.NonNull; +import org.incendo.cloud.caption.CaptionVariable; +import org.incendo.cloud.component.CommandComponent; +import org.incendo.cloud.context.CommandContext; +import org.incendo.cloud.context.CommandInput; +import org.incendo.cloud.exception.parsing.ParserException; +import org.incendo.cloud.parser.ArgumentParseResult; +import org.incendo.cloud.parser.ArgumentParser; +import org.incendo.cloud.parser.ParserDescriptor; +import org.incendo.cloud.suggestion.BlockingSuggestionProvider; + +public class BlockStateParser implements ArgumentParser, BlockingSuggestionProvider.Strings { + + public static @NonNull ParserDescriptor blockStateParser() { + return ParserDescriptor.of(new BlockStateParser<>(), ImmutableBlockState.class); + } + + public static CommandComponent.@NonNull Builder blockStateComponent() { + return CommandComponent.builder().parser(blockStateParser()); + } + + @Override + public @NonNull ArgumentParseResult<@NonNull ImmutableBlockState> parse(@NonNull CommandContext<@NonNull C> commandContext, @NonNull CommandInput commandInput) { + String input = commandInput.readString(); + ImmutableBlockState state = net.momirealms.craftengine.core.block.BlockStateParser.deserialize(input); + if (state == null) { + return ArgumentParseResult.failure(new BlockStateParseException(input, commandContext)); + } + return ArgumentParseResult.success(state); + } + + @Override + public @NonNull Iterable<@NonNull String> stringSuggestions(@NonNull CommandContext commandContext, @NonNull CommandInput input) { + return CraftEngine.instance().blockManager().cachedSuggestions().stream().map(it -> { + return it.suggestion(); + }).toList(); + } + + public static final class BlockStateParseException extends ParserException { + + private final String input; + + public BlockStateParseException( + final @NonNull String input, + final @NonNull CommandContext context + ) { + super( + BlockStateParser.class, + context, + CraftEngineCaptionKeys.ARGUMENT_PARSE_FAILURE_BLOCK_STATE, + CaptionVariable.of("input", input) + ); + this.input = input; + } + + public @NonNull String input() { + return this.input; + } + } +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/plugin/command/sender/AbstractSender.java b/core/src/main/java/net/momirealms/craftengine/core/plugin/command/sender/AbstractSender.java new file mode 100644 index 000000000..ff1e71fa1 --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/plugin/command/sender/AbstractSender.java @@ -0,0 +1,91 @@ +package net.momirealms.craftengine.core.plugin.command.sender; + +import net.kyori.adventure.text.Component; +import net.momirealms.craftengine.core.plugin.Plugin; +import net.momirealms.craftengine.core.util.Tristate; + +import java.util.UUID; + +/** + * Simple implementation of {@link Sender} using a {@link SenderFactory} + * + * @param the command sender type + */ +public final class AbstractSender implements Sender { + private final Plugin plugin; + private final SenderFactory factory; + private final T sender; + + private final UUID uniqueId; + private final String name; + private final boolean isConsole; + + AbstractSender(Plugin plugin, SenderFactory factory, T sender) { + this.plugin = plugin; + this.factory = factory; + this.sender = sender; + this.uniqueId = factory.uniqueId(this.sender); + this.name = factory.name(this.sender); + this.isConsole = this.factory.isConsole(this.sender); + } + + @Override + public Plugin plugin() { + return this.plugin; + } + + @Override + public UUID uniqueId() { + return this.uniqueId; + } + + @Override + public String name() { + return this.name; + } + + @Override + public void sendMessage(Component message) { + this.factory.sendMessage(this.sender, message); + } + + @Override + public void sendMessage(Component message, boolean ignoreEmpty) { + if (ignoreEmpty && message.equals(Component.empty())) { + return; + } + sendMessage(message); + } + + @Override + public Tristate permissionState(String permission) { + return (isConsole() && this.factory.consoleHasAllPermissions()) ? Tristate.TRUE : this.factory.permissionState(this.sender, permission); + } + + @Override + public boolean hasPermission(String permission) { + return (isConsole() && this.factory.consoleHasAllPermissions()) || this.factory.hasPermission(this.sender, permission); + } + + @Override + public void performCommand(String commandLine) { + this.factory.performCommand(this.sender, commandLine); + } + + @Override + public boolean isConsole() { + return this.isConsole; + } + + @Override + public boolean equals(Object o) { + if (o == this) return true; + if (!(o instanceof AbstractSender that)) return false; + return this.uniqueId().equals(that.uniqueId()); + } + + @Override + public int hashCode() { + return this.uniqueId.hashCode(); + } +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/plugin/command/sender/DummyConsoleSender.java b/core/src/main/java/net/momirealms/craftengine/core/plugin/command/sender/DummyConsoleSender.java new file mode 100644 index 000000000..e122fc6cb --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/plugin/command/sender/DummyConsoleSender.java @@ -0,0 +1,37 @@ +package net.momirealms.craftengine.core.plugin.command.sender; + +import net.momirealms.craftengine.core.plugin.Plugin; + +import java.util.UUID; + +public abstract class DummyConsoleSender implements Sender { + private final Plugin platform; + + public DummyConsoleSender(Plugin plugin) { + this.platform = plugin; + } + + @Override + public void performCommand(String commandLine) { + } + + @Override + public boolean isConsole() { + return true; + } + + @Override + public Plugin plugin() { + return this.platform; + } + + @Override + public UUID uniqueId() { + return Sender.CONSOLE_UUID; + } + + @Override + public String name() { + return Sender.CONSOLE_NAME; + } +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/plugin/command/sender/Sender.java b/core/src/main/java/net/momirealms/craftengine/core/plugin/command/sender/Sender.java new file mode 100644 index 000000000..4cb6f3adf --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/plugin/command/sender/Sender.java @@ -0,0 +1,35 @@ +package net.momirealms.craftengine.core.plugin.command.sender; + +import net.kyori.adventure.text.Component; +import net.momirealms.craftengine.core.plugin.Plugin; +import net.momirealms.craftengine.core.util.Tristate; + +import java.util.UUID; + +public interface Sender { + UUID CONSOLE_UUID = new UUID(0, 0); // 00000000-0000-0000-0000-000000000000 + String CONSOLE_NAME = "Console"; + + Plugin plugin(); + + String name(); + + UUID uniqueId(); + + void sendMessage(Component message); + + void sendMessage(Component message, boolean ignoreEmpty); + + Tristate permissionState(String permission); + + boolean hasPermission(String permission); + + void performCommand(String commandLine); + + boolean isConsole(); + + default boolean isValid() { + return true; + } + +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/plugin/command/sender/SenderFactory.java b/core/src/main/java/net/momirealms/craftengine/core/plugin/command/sender/SenderFactory.java new file mode 100644 index 000000000..f08a3caf1 --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/plugin/command/sender/SenderFactory.java @@ -0,0 +1,49 @@ +package net.momirealms.craftengine.core.plugin.command.sender; + +import net.kyori.adventure.audience.Audience; +import net.kyori.adventure.text.Component; +import net.momirealms.craftengine.core.plugin.Plugin; +import net.momirealms.craftengine.core.util.Tristate; + +import java.util.Objects; +import java.util.UUID; + +public abstract class SenderFactory

{ + private final P plugin; + + public SenderFactory(P plugin) { + this.plugin = plugin; + } + + protected P plugin() { + return this.plugin; + } + + protected abstract UUID uniqueId(T sender); + + protected abstract String name(T sender); + + protected abstract Audience audience(T sender); + + protected abstract void sendMessage(T sender, Component message); + + protected abstract Tristate permissionState(T sender, String node); + + protected abstract boolean hasPermission(T sender, String node); + + protected abstract void performCommand(T sender, String command); + + protected abstract boolean isConsole(T sender); + + protected boolean consoleHasAllPermissions() { + return true; + } + + public Sender wrap(C sender) { + Objects.requireNonNull(sender, "sender"); + return new AbstractSender<>(this.plugin, this, sender); + } + + public void close() { + } +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/plugin/config/ConfigManager.java b/core/src/main/java/net/momirealms/craftengine/core/plugin/config/ConfigManager.java new file mode 100644 index 000000000..8e3fc067b --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/plugin/config/ConfigManager.java @@ -0,0 +1,535 @@ +package net.momirealms.craftengine.core.plugin.config; + +import dev.dejvokep.boostedyaml.YamlDocument; +import dev.dejvokep.boostedyaml.dvs.versioning.BasicVersioning; +import dev.dejvokep.boostedyaml.libs.org.snakeyaml.engine.v2.common.ScalarStyle; +import dev.dejvokep.boostedyaml.libs.org.snakeyaml.engine.v2.nodes.Tag; +import dev.dejvokep.boostedyaml.settings.dumper.DumperSettings; +import dev.dejvokep.boostedyaml.settings.general.GeneralSettings; +import dev.dejvokep.boostedyaml.settings.loader.LoaderSettings; +import dev.dejvokep.boostedyaml.settings.updater.UpdaterSettings; +import dev.dejvokep.boostedyaml.utils.format.NodeRole; +import net.kyori.adventure.text.Component; +import net.momirealms.craftengine.core.pack.conflict.resolution.ConditionalResolution; +import net.momirealms.craftengine.core.pack.host.HostMode; +import net.momirealms.craftengine.core.plugin.CraftEngine; +import net.momirealms.craftengine.core.plugin.PluginProperties; +import net.momirealms.craftengine.core.plugin.Reloadable; +import net.momirealms.craftengine.core.plugin.locale.TranslationManager; +import net.momirealms.craftengine.core.util.AdventureHelper; +import net.momirealms.craftengine.core.util.MiscUtils; +import net.momirealms.craftengine.core.util.ReflectionUtils; + +import java.io.File; +import java.io.FileInputStream; +import java.io.IOException; +import java.io.InputStream; +import java.lang.reflect.InvocationTargetException; +import java.lang.reflect.Method; +import java.nio.charset.StandardCharsets; +import java.nio.file.Files; +import java.nio.file.Path; +import java.util.*; + +public class ConfigManager implements Reloadable { + private static ConfigManager instance; + protected final CraftEngine plugin; + private final Path configFilePath; + private final String configVersion; + private YamlDocument config; + + protected boolean debug; + protected boolean checkUpdate; + protected boolean metrics; + + protected boolean resource_pack$override_uniform_font; + protected List resource_pack$duplicated_files_handler; + protected List resource_pack$merge_external_folders; + + protected boolean resource_pack$protection$crash_tools$method_1; + protected boolean resource_pack$protection$crash_tools$method_2; + protected boolean resource_pack$protection$crash_tools$method_3; + + protected boolean resource_pack$protection$obfuscation$enable; + protected long resource_pack$protection$obfuscation$seed; + protected boolean resource_pack$protection$obfuscation$fake_directory; + protected boolean resource_pack$protection$obfuscation$escape_unicode; + protected boolean resource_pack$protection$obfuscation$resource_location$enable; + protected int resource_pack$protection$obfuscation$resource_location$random_namespace$length; + protected int resource_pack$protection$obfuscation$resource_location$random_namespace$amount; + protected String resource_pack$protection$obfuscation$resource_location$random_path$source; + protected int resource_pack$protection$obfuscation$resource_location$random_path$depth; + protected boolean resource_pack$protection$obfuscation$resource_location$random_path$anti_unzip; + protected int resource_pack$protection$obfuscation$resource_location$random_atlas$amount; + protected boolean resource_pack$protection$obfuscation$resource_location$random_atlas$use_double; + protected List resource_pack$protection$obfuscation$resource_location$bypass_textures; + protected List resource_pack$protection$obfuscation$resource_location$bypass_models; + protected List resource_pack$protection$obfuscation$resource_location$bypass_sounds; + + protected float resource_pack$supported_version$min; + protected float resource_pack$supported_version$max; + + protected HostMode resource_pack$send$mode; + protected boolean resource_pack$send$kick_if_declined; + protected boolean resource_pack$send$send_on_join; + protected boolean resource_pack$send$send_on_reload; + protected Component resource_pack$send$prompt; + + protected int resource_pack$send$self_host$port; + protected String resource_pack$send$self_host$ip; + protected String resource_pack$send$self_host$protocol; + protected boolean resource_pack$send$self_host$deny_non_minecraft_request; + protected int resource_pack$send$self_host$rate_limit$max_requests; + protected long resource_pack$send$self_host$rate_limit$reset_interval; + protected String resource_pack$self_host$local_file_path; + + protected String resource_pack$external_host$url; + protected String resource_pack$external_host$sha1; + protected UUID resource_pack$external_host$uuid; + + protected boolean performance$light_system$force_update_light; + protected boolean performance$light_system$enable; + protected int performance$max_block_chain_update_limit; + protected boolean performance$chunk_system$restore_vanilla_blocks_on_chunk_unload; + protected boolean performance$chunk_system$restore_custom_blocks_on_chunk_load; + + protected boolean furniture$remove_invalid_furniture_on_chunk_load$enable; + protected Set furniture$remove_invalid_furniture_on_chunk_load$list; + + protected boolean block$sound_system$enable; + protected boolean recipe$enable; + + protected boolean item$non_italic_tag; + + public ConfigManager(CraftEngine plugin) { + this.plugin = plugin; + this.configVersion = PluginProperties.getValue("config"); + this.configFilePath = this.plugin.dataFolderPath().resolve("config.yml"); + instance = this; + } + + @Override + public void load() { + if (Files.exists(this.configFilePath)) { + this.config = this.loadYamlData(this.configFilePath.toFile()); + String configVersion = config.getString("config-version"); + if (configVersion.equals(this.configVersion)) { + loadSettings(); + return; + } + } + this.updateConfigVersion(); + loadSettings(); + } + + private void updateConfigVersion() { + this.config = this.loadYamlConfig( + "config.yml", + GeneralSettings.builder() + .setRouteSeparator('.') + .setUseDefaults(false) + .build(), + LoaderSettings + .builder() + .setAutoUpdate(true) + .build(), + DumperSettings.builder() + .setEscapeUnprintable(false) + .setScalarFormatter((tag, value, role, def) -> { + if (role == NodeRole.KEY) { + return ScalarStyle.PLAIN; + } else { + return tag == Tag.STR ? ScalarStyle.DOUBLE_QUOTED : ScalarStyle.PLAIN; + } + }) + .build(), + UpdaterSettings + .builder() + .setVersioning(new BasicVersioning("config-version")) + .build() + ); + try { + config.save(new File(plugin.dataFolderFile(), "config.yml")); + } catch (IOException e) { + throw new RuntimeException(e); + } + } + + @Override + public void unload() { + Reloadable.super.unload(); + } + + private void loadSettings() { + YamlDocument config = settings(); + plugin.translationManager().forcedLocale(TranslationManager.parseLocale(config.getString("forced-locale", ""))); + + // basics + debug = config.getBoolean("debug", false); + metrics = config.getBoolean("metrics", false); + checkUpdate = config.getBoolean("update-checker", false); + + // resource pack + resource_pack$override_uniform_font = config.getBoolean("resource-pack.override-uniform-font", false); + resource_pack$supported_version$min = getVersion(config.get("resource-pack.supported-version.min", "1.20").toString()); + resource_pack$supported_version$max = getVersion(config.get("resource-pack.supported-version.max", "LATEST").toString()); + resource_pack$merge_external_folders = config.getStringList("resource-pack.merge-external-folders"); + resource_pack$send$mode = HostMode.valueOf(config.getString("resource-pack.send.mode", "self-host").replace("-", "_").toUpperCase(Locale.ENGLISH)); + resource_pack$send$self_host$port = config.getInt("resource-pack.send.self-host.port", 8163); + resource_pack$send$self_host$ip = config.getString("resource-pack.send.self-host.ip", "localhost"); + resource_pack$self_host$local_file_path = config.getString("resource-pack.send.self-host.local-file-path", "./generated/resource_pack.zip"); + resource_pack$send$self_host$protocol = config.getString("resource-pack.send.self-host.protocol", "http"); + resource_pack$send$send_on_join = config.getBoolean("resource-pack.send.send-on-join", true); + resource_pack$send$send_on_reload = config.getBoolean("resource-pack.send.send-on-reload", true); + resource_pack$send$kick_if_declined = config.getBoolean("resource-pack.send.kick-if-declined", true); + resource_pack$external_host$url = config.getString("resource-pack.send.external-host.url", ""); + resource_pack$external_host$sha1 = config.getString("resource-pack.send.external-host.sha1", ""); + String packUUIDStr = config.getString("resource-pack.send.external-host.uuid", ""); + resource_pack$external_host$uuid = packUUIDStr.isEmpty() ? UUID.nameUUIDFromBytes(resource_pack$external_host$url.getBytes(StandardCharsets.UTF_8)) : UUID.fromString(packUUIDStr); + resource_pack$send$prompt = AdventureHelper.miniMessage(config.getString("resource-pack.send.prompt", "To fully experience our server, please accept our custom resource pack.")); + resource_pack$send$self_host$rate_limit$reset_interval = config.getLong("resource-pack.send.self-host.rate-limit.reset-interval", 30L); + resource_pack$send$self_host$rate_limit$max_requests = config.getInt("resource-pack.send.self-host.rate-limit.max-requests", 3); + resource_pack$send$self_host$deny_non_minecraft_request = config.getBoolean("resource-pack.send.deny-non-minecraft-request", true); + + resource_pack$protection$crash_tools$method_1 = config.getBoolean("resource-pack.protection.crash-tools.method-1", false); + resource_pack$protection$crash_tools$method_2 = config.getBoolean("resource-pack.protection.crash-tools.method-2", false); + resource_pack$protection$crash_tools$method_3 = config.getBoolean("resource-pack.protection.crash-tools.method-3", false); + resource_pack$protection$obfuscation$enable = config.getBoolean("resource-pack.protection.obfuscation.enable", false); + resource_pack$protection$obfuscation$seed = config.getLong("resource-pack.protection.obfuscation.seed", 0L); + resource_pack$protection$obfuscation$fake_directory = config.getBoolean("resource-pack.protection.obfuscation.fake-directory", false); + resource_pack$protection$obfuscation$escape_unicode = config.getBoolean("resource-pack.protection.obfuscation.escape-unicode", false); + + resource_pack$protection$obfuscation$resource_location$enable = config.getBoolean("resource-pack.protection.obfuscation.resource-location.enable", false); + resource_pack$protection$obfuscation$resource_location$random_namespace$amount = config.getInt("resource-pack.protection.obfuscation.resource-location.random-namespace.amount", 32); + resource_pack$protection$obfuscation$resource_location$random_namespace$length = config.getInt("resource-pack.protection.obfuscation.resource-location.random-namespace.length", 8); + resource_pack$protection$obfuscation$resource_location$random_path$depth = config.getInt("resource-pack.protection.obfuscation.resource-location.random-path.depth", 16); + resource_pack$protection$obfuscation$resource_location$random_path$source = config.getString("resource-pack.protection.obfuscation.resource-location.random-path.source", "obf"); + resource_pack$protection$obfuscation$resource_location$random_path$anti_unzip = config.getBoolean("resource-pack.protection.obfuscation.resource-location.random-path.anti-unzip", false); + resource_pack$protection$obfuscation$resource_location$random_atlas$amount = config.getInt("resource-pack.protection.obfuscation.resource-location.random-atlas.amount", 5); + resource_pack$protection$obfuscation$resource_location$random_atlas$use_double = config.getBoolean("resource-pack.protection.obfuscation.resource-location.random-atlas.use-double", true); + resource_pack$protection$obfuscation$resource_location$bypass_textures = config.getStringList("resource-pack.protection.obfuscation.resource-location.bypass-textures"); + resource_pack$protection$obfuscation$resource_location$bypass_models = config.getStringList("resource-pack.protection.obfuscation.resource-location.bypass-models"); + resource_pack$protection$obfuscation$resource_location$bypass_sounds = config.getStringList("resource-pack.protection.obfuscation.resource-location.bypass-sounds"); + + try { + resource_pack$duplicated_files_handler = config.getMapList("resource-pack.duplicated-files-handler").stream().map(it -> { + Map args = MiscUtils.castToMap(it, false); + return ConditionalResolution.FACTORY.create(args); + }).toList(); + } catch (Exception e) { + this.plugin.logger().warn("Failed to load resource pack duplicated files handler", e); + resource_pack$duplicated_files_handler = List.of(); + } + + // item + item$non_italic_tag = config.getBoolean("item.non-italic-tag", false); + + // performance + performance$max_block_chain_update_limit = config.getInt("performance.max-block-chain-update-limit", 64); + performance$light_system$force_update_light = config.getBoolean("performance.light-system.force-update-light", false); + performance$light_system$enable = config.getBoolean("performance.light-system.enable", true); + performance$chunk_system$restore_vanilla_blocks_on_chunk_unload = config.getBoolean("performance.chunk-system.restore-vanilla-blocks-on-chunk-unload", true); + performance$chunk_system$restore_custom_blocks_on_chunk_load = config.getBoolean("performance.chunk-system.restore-custom-blocks-on-chunk-load", true); + + // furniture + furniture$remove_invalid_furniture_on_chunk_load$enable = config.getBoolean("furniture.remove-invalid-furniture-on-chunk-load.enable", false); + furniture$remove_invalid_furniture_on_chunk_load$list = new HashSet<>(config.getStringList("furniture.remove-invalid-furniture-on-chunk-load.list")); + + // block + block$sound_system$enable = config.getBoolean("block.sound-system.enable", true); + + // recipe + recipe$enable = config.getBoolean("recipe.enable", true); + + Class modClazz = ReflectionUtils.getClazz(CraftEngine.MOD_CLASS); + if (modClazz != null) { + Method setMaxChainMethod = ReflectionUtils.getStaticMethod(modClazz, new String[] {"setMaxChainUpdate"}, void.class, int.class); + try { + assert setMaxChainMethod != null; + setMaxChainMethod.invoke(null, performance$max_block_chain_update_limit); + } catch (IllegalAccessException | InvocationTargetException e) { + plugin.logger().warn("Failed to set max chain update", e); + } + } + } + + private static float getVersion(String version) { + if (version.equalsIgnoreCase("LATEST")) { + version = PluginProperties.getValue("latest-version"); + } + String[] split = version.split("\\.", 2); + if (split.length != 2) { + throw new IllegalArgumentException("Invalid version: " + version); + } + return Float.parseFloat(split[1]); + } + + public static String configVersion() { + return instance.configVersion; + } + + public static boolean debug() { + return instance.debug; + } + + public static boolean checkUpdate() { + return instance.checkUpdate; + } + + public static boolean metrics() { + return instance.metrics; + } + + public static boolean resourcePack$overrideUniform() { + return instance.resource_pack$override_uniform_font; + } + + public static int maxChainUpdate() { + return instance.performance$max_block_chain_update_limit; + } + + public static boolean removeInvalidFurniture() { + return instance.furniture$remove_invalid_furniture_on_chunk_load$enable; + } + + public static Set furnitureToRemove() { + return instance.furniture$remove_invalid_furniture_on_chunk_load$list; + } + + public static boolean forceUpdateLight() { + return instance.performance$light_system$force_update_light; + } + + public static boolean enableLightSystem() { + return instance.performance$light_system$enable; + } + + public static float packMinVersion() { + return instance.resource_pack$supported_version$min; + } + + public static float packMaxVersion() { + return instance.resource_pack$supported_version$max; + } + + public static boolean enableSoundSystem() { + return instance.block$sound_system$enable; + } + + public static boolean enableRecipeSystem() { + return instance.recipe$enable; + } + + public static boolean nonItalic() { + return instance.item$non_italic_tag; + } + + public static boolean restoreVanillaBlocks() { + return instance.performance$chunk_system$restore_vanilla_blocks_on_chunk_unload && instance.performance$chunk_system$restore_custom_blocks_on_chunk_load; + } + + public static boolean denyNonMinecraftRequest() { + return instance.resource_pack$send$self_host$deny_non_minecraft_request; + } + + public static boolean restoreCustomBlocks() { + return instance.performance$chunk_system$restore_custom_blocks_on_chunk_load; + } + + public static List foldersToMerge() { + return instance.resource_pack$merge_external_folders; + } + + public static HostMode hostMode() { + return instance.resource_pack$send$mode; + } + + public static String hostIP() { + return instance.resource_pack$send$self_host$ip; + } + + public static int hostPort() { + return instance.resource_pack$send$self_host$port; + } + + public static boolean kickOnDeclined() { + return instance.resource_pack$send$kick_if_declined; + } + + public static Component resourcePackPrompt() { + return instance.resource_pack$send$prompt; + } + + public static String hostProtocol() { + return instance.resource_pack$send$self_host$protocol; + } + + public static String externalPackUrl() { + return instance.resource_pack$external_host$url; + } + + public static String externalPackSha1() { + return instance.resource_pack$external_host$sha1; + } + + public static UUID externalPackUUID() { + return instance.resource_pack$external_host$uuid; + } + + public static boolean sendPackOnJoin() { + return instance.resource_pack$send$send_on_join; + } + + public static boolean sendPackOnReload() { + return instance.resource_pack$send$send_on_reload; + } + + public static int requestRate() { + return instance.resource_pack$send$self_host$rate_limit$max_requests; + } + + public static long requestInterval() { + return instance.resource_pack$send$self_host$rate_limit$reset_interval; + } + + public static String hostResourcePackPath() { + return instance.resource_pack$self_host$local_file_path; + } + + public static List resolutions() { + return instance.resource_pack$duplicated_files_handler; + } + + public static boolean crashTool1() { + return instance.resource_pack$protection$crash_tools$method_1; + } + + public static boolean crashTool2() { + return instance.resource_pack$protection$crash_tools$method_2; + } + + public static boolean crashTool3() { + return instance.resource_pack$protection$crash_tools$method_3; + } + + public static boolean enableObfuscation() { + return instance.resource_pack$protection$obfuscation$enable; + } + + public static long obfuscationSeed() { + return instance.resource_pack$protection$obfuscation$seed; + } + + public static boolean createFakeDirectory() { + return instance.resource_pack$protection$obfuscation$fake_directory; + } + + public static boolean escapeUnicode() { + return instance.resource_pack$protection$obfuscation$escape_unicode; + } + + public static boolean enableRandomResourceLocation() { + return instance.resource_pack$protection$obfuscation$resource_location$enable; + } + + public static int namespaceLength() { + return instance.resource_pack$protection$obfuscation$resource_location$random_namespace$length; + } + + public static int namespaceAmount() { + return instance.resource_pack$protection$obfuscation$resource_location$random_namespace$amount; + } + + public static String atlasSource() { + return instance.resource_pack$protection$obfuscation$resource_location$random_path$source; + } + + public static int pathDepth() { + return instance.resource_pack$protection$obfuscation$resource_location$random_path$depth; + } + + public static boolean antiUnzip() { + return instance.resource_pack$protection$obfuscation$resource_location$random_path$anti_unzip; + } + + public static int atlasAmount() { + return instance.resource_pack$protection$obfuscation$resource_location$random_atlas$amount; + } + + public static boolean useDouble() { + return instance.resource_pack$protection$obfuscation$resource_location$random_atlas$use_double; + } + + public static List bypassTextures() { + return instance.resource_pack$protection$obfuscation$resource_location$bypass_textures; + } + + public static List bypassModels() { + return instance.resource_pack$protection$obfuscation$resource_location$bypass_models; + } + + public static List bypassSounds() { + return instance.resource_pack$protection$obfuscation$resource_location$bypass_sounds; + } + + public YamlDocument loadOrCreateYamlData(String fileName) { + File file = new File(this.plugin.dataFolderFile(), fileName); + if (!file.exists()) { + this.plugin.saveResource(fileName); + } + return this.loadYamlData(file); + } + + public YamlDocument loadYamlConfig(String filePath, GeneralSettings generalSettings, LoaderSettings loaderSettings, DumperSettings dumperSettings, UpdaterSettings updaterSettings) { + try (InputStream inputStream = new FileInputStream(resolveConfig(filePath).toFile())) { + return YamlDocument.create(inputStream, this.plugin.resourceStream(filePath), generalSettings, loaderSettings, dumperSettings, updaterSettings); + } catch (IOException e) { + this.plugin.logger().severe("Failed to load config " + filePath, e); + return null; + } + } + + public YamlDocument loadYamlData(File file) { + try (InputStream inputStream = new FileInputStream(file)) { + return YamlDocument.create(inputStream); + } catch (IOException e) { + this.plugin.logger().severe("Failed to load config " + file, e); + return null; + } + } + + public Path resolveConfig(String filePath) { + if (filePath == null || filePath.isEmpty()) { + throw new IllegalArgumentException("ResourcePath cannot be null or empty"); + } + filePath = filePath.replace('\\', '/'); + Path configFile = this.plugin.dataFolderPath().resolve(filePath); + // if the config doesn't exist, create it based on the template in the resources dir + if (!Files.exists(configFile)) { + try { + Files.createDirectories(configFile.getParent()); + } catch (IOException ignored) { + } + try (InputStream is = this.plugin.resourceStream(filePath)) { + if (is == null) { + throw new IllegalArgumentException("The embedded resource '" + filePath + "' cannot be found"); + } + Files.copy(is, configFile); + } catch (IOException e) { + throw new RuntimeException(e); + } + } + return configFile; + } + + public YamlDocument settings() { + if (config == null) { + throw new IllegalStateException("Main config not loaded"); + } + return config; + } + + public static ConfigManager instance() { + return instance; + } +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/plugin/config/ConfigSectionParser.java b/core/src/main/java/net/momirealms/craftengine/core/plugin/config/ConfigSectionParser.java new file mode 100644 index 000000000..dec473b6c --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/plugin/config/ConfigSectionParser.java @@ -0,0 +1,22 @@ +package net.momirealms.craftengine.core.plugin.config; + +import net.momirealms.craftengine.core.pack.Pack; +import net.momirealms.craftengine.core.util.Key; +import org.jetbrains.annotations.NotNull; + +import java.nio.file.Path; +import java.util.Map; + +public interface ConfigSectionParser extends Comparable { + + String sectionId(); + + void parseSection(Pack pack, Path path, Key id, Map section); + + int loadingSequence(); + + @Override + default int compareTo(@NotNull ConfigSectionParser another) { + return Integer.compare(loadingSequence(), another.loadingSequence()); + } +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/plugin/config/StringKeyConstructor.java b/core/src/main/java/net/momirealms/craftengine/core/plugin/config/StringKeyConstructor.java new file mode 100644 index 000000000..8db8ae617 --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/plugin/config/StringKeyConstructor.java @@ -0,0 +1,31 @@ +package net.momirealms.craftengine.core.plugin.config; + +import org.yaml.snakeyaml.LoaderOptions; +import org.yaml.snakeyaml.constructor.SafeConstructor; +import org.yaml.snakeyaml.nodes.MappingNode; +import org.yaml.snakeyaml.nodes.Node; +import org.yaml.snakeyaml.nodes.NodeTuple; +import org.yaml.snakeyaml.nodes.ScalarNode; + +import java.util.LinkedHashMap; +import java.util.Map; + +public class StringKeyConstructor extends SafeConstructor { + + public StringKeyConstructor(LoaderOptions loaderOptions) { + super(loaderOptions); + } + + @Override + protected Map constructMapping(MappingNode node) { + Map map = new LinkedHashMap<>(); + for (NodeTuple tuple : node.getValue()) { + Node keyNode = tuple.getKeyNode(); + Node valueNode = tuple.getValueNode(); + String key = constructScalar((ScalarNode) keyNode); + Object value = constructObject(valueNode); + map.put(key, value); + } + return map; + } +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/plugin/config/blockbench/Animation.java b/core/src/main/java/net/momirealms/craftengine/core/plugin/config/blockbench/Animation.java new file mode 100644 index 000000000..94cb4b0a8 --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/plugin/config/blockbench/Animation.java @@ -0,0 +1,162 @@ +package net.momirealms.craftengine.core.plugin.config.blockbench; + +import com.google.gson.annotations.SerializedName; + +import java.util.Map; +import java.util.UUID; + +public class Animation { + @SerializedName("uuid") + private UUID uuid; + @SerializedName("name") + private String name; + @SerializedName("loop") + private String loop; + @SerializedName("override") + private boolean override; + @SerializedName("length") + private int length; + @SerializedName("snapping") + private int snapping; + @SerializedName("selected") + private boolean selected; + @SerializedName("anim_time_update") + private String anim_time_update; + @SerializedName("blend_weight") + private String blend_weight; + @SerializedName("start_delay") + private String start_delay; + @SerializedName("loop_delay") + private String loop_delay; + @SerializedName("animators") + private Map animators; + + public UUID uuid() { + return uuid; + } + + public String name() { + return name; + } + + public String loop() { + return loop; + } + + public boolean override() { + return override; + } + + public int length() { + return length; + } + + public int snapping() { + return snapping; + } + + public boolean selected() { + return selected; + } + + public String animTimeUpdate() { + return anim_time_update; + } + + public String blendWeight() { + return blend_weight; + } + + public String startDelay() { + return start_delay; + } + + public String loopDelay() { + return loop_delay; + } + + public Map animators() { + return animators; + } + + public static class Animator { + @SerializedName("name") + private String name; + @SerializedName("type") + private String type; + @SerializedName("keyframes") + private KeyFrame[] keyframes; + + public String name() { + return name; + } + + public String type() { + return type; + } + + public KeyFrame[] keyframes() { + return keyframes; + } + + public static class KeyFrame { + @SerializedName("channel") + private String channel; + @SerializedName("data_points") + private DataPoint[] data_points; + @SerializedName("uuid") + private UUID uuid; + @SerializedName("time") + private double time; + @SerializedName("color") + private int color; + @SerializedName("interpolation") + private String interpolation; + + public String channel() { + return channel; + } + + public DataPoint[] dataPoints() { + return data_points; + } + + public UUID uuid() { + return uuid; + } + + public double time() { + return time; + } + + public int color() { + return color; + } + + public String interpolation() { + return interpolation; + } + + public static class DataPoint { + @SerializedName("x") + private String x; + @SerializedName("y") + private String y; + @SerializedName("z") + private String z; + + public String x() { + return x; + } + + public String y() { + return y; + } + + public String z() { + return z; + } + } + } + } +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/plugin/config/blockbench/BBModel.java b/core/src/main/java/net/momirealms/craftengine/core/plugin/config/blockbench/BBModel.java new file mode 100644 index 000000000..8c4b0e176 --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/plugin/config/blockbench/BBModel.java @@ -0,0 +1,48 @@ +package net.momirealms.craftengine.core.plugin.config.blockbench; + +import com.google.gson.annotations.SerializedName; + +public class BBModel { + @SerializedName("name") + private String name; + @SerializedName("meta") + private ModelMeta meta; + @SerializedName("model_identifier") + private String model_identifier; + @SerializedName("visible_box") + private int[] visible_box; + @SerializedName("elements") + private Element[] elements; + @SerializedName("outliner") + private OutLiner[] outliner; + @SerializedName("textures") + private Texture[] textures; + + public String name() { + return name; + } + + public ModelMeta meta() { + return meta; + } + + public String modelIdentifier() { + return model_identifier; + } + + public int[] visibleBox() { + return visible_box; + } + + public Element[] elements() { + return elements; + } + + public OutLiner[] outliner() { + return outliner; + } + + public Texture[] textures() { + return textures; + } +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/plugin/config/blockbench/Element.java b/core/src/main/java/net/momirealms/craftengine/core/plugin/config/blockbench/Element.java new file mode 100644 index 000000000..65156e5e2 --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/plugin/config/blockbench/Element.java @@ -0,0 +1,93 @@ +package net.momirealms.craftengine.core.plugin.config.blockbench; + +import com.google.gson.annotations.SerializedName; + +import java.util.UUID; + +public class Element { + + @SerializedName("type") + private String type; + @SerializedName("uuid") + private UUID uuid; + @SerializedName("name") + private String name; + @SerializedName("box_uv") + private boolean box_uv; + @SerializedName("rescale") + private boolean rescale; + @SerializedName("locked") + private boolean locked; + @SerializedName("light_emission") + private int light_emission; + @SerializedName("render_order") + private String render_order; + @SerializedName("allow_mirror_modeling") + private boolean allow_mirror_modeling; + @SerializedName("from") + private double[] from; + @SerializedName("to") + private double[] to; + @SerializedName("autouv") + private int autouv; + @SerializedName("color") + private int color; + @SerializedName("origin") + private double[] origin; + + public String type() { + return type; + } + + public UUID uuid() { + return uuid; + } + + public String name() { + return name; + } + + public boolean box_uv() { + return box_uv; + } + + public boolean rescale() { + return rescale; + } + + public boolean locked() { + return locked; + } + + public int lightEmission() { + return light_emission; + } + + public String renderOrder() { + return render_order; + } + + public boolean allowMirrorModeling() { + return allow_mirror_modeling; + } + + public double[] from() { + return from; + } + + public double[] to() { + return to; + } + + public int autoUV() { + return autouv; + } + + public int color() { + return color; + } + + public double[] origin() { + return origin; + } +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/plugin/config/blockbench/Faces.java b/core/src/main/java/net/momirealms/craftengine/core/plugin/config/blockbench/Faces.java new file mode 100644 index 000000000..9edbbea5d --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/plugin/config/blockbench/Faces.java @@ -0,0 +1,57 @@ +package net.momirealms.craftengine.core.plugin.config.blockbench; + +import com.google.gson.annotations.SerializedName; + +public class Faces { + @SerializedName("north") + private Face north; + @SerializedName("east") + private Face east; + @SerializedName("south") + private Face south; + @SerializedName("west") + private Face west; + @SerializedName("up") + private Face up; + @SerializedName("down") + private Face down; + + public Face north() { + return north; + } + + public Face east() { + return east; + } + + public Face south() { + return south; + } + + public Face west() { + return west; + } + + public Face up() { + return up; + } + + public Face down() { + return down; + } + + public static class Face { + @SerializedName("uv") + private double[] uv; + @SerializedName("texture") + private int texture; + + public double[] uv() { + return uv; + } + + public int texture() { + return texture; + } + } +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/plugin/config/blockbench/ModelMeta.java b/core/src/main/java/net/momirealms/craftengine/core/plugin/config/blockbench/ModelMeta.java new file mode 100644 index 000000000..6fa3ccee1 --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/plugin/config/blockbench/ModelMeta.java @@ -0,0 +1,24 @@ +package net.momirealms.craftengine.core.plugin.config.blockbench; + +import com.google.gson.annotations.SerializedName; + +public class ModelMeta { + @SerializedName("format_version") + private String format_version; + @SerializedName("model_format") + private String model_format; + @SerializedName("box_uv") + private boolean box_uv; + + public String formatVersion() { + return format_version; + } + + public String modelFormat() { + return model_format; + } + + public boolean boxUV() { + return box_uv; + } +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/plugin/config/blockbench/OutLiner.java b/core/src/main/java/net/momirealms/craftengine/core/plugin/config/blockbench/OutLiner.java new file mode 100644 index 000000000..1ced55b47 --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/plugin/config/blockbench/OutLiner.java @@ -0,0 +1,74 @@ +package net.momirealms.craftengine.core.plugin.config.blockbench; + +import com.google.gson.annotations.SerializedName; + +import java.util.UUID; + +public class OutLiner { + @SerializedName("name") + private String name; + @SerializedName("origin") + private double[] origin; + @SerializedName("color") + private int color; + @SerializedName("uuid") + private UUID uuid; + @SerializedName("export") + private boolean export; + @SerializedName("locked") + private boolean locked; + @SerializedName("visibility") + private boolean visibility; + @SerializedName("mirror_uv") + private boolean mirror_uv; + @SerializedName("autouv") + private boolean autouv; + @SerializedName("isOpen") + private boolean is_open; + @SerializedName("children") + private OutLiner[] children; + + public String name() { + return name; + } + + public double[] origin() { + return origin; + } + + public int color() { + return color; + } + + public UUID uuid() { + return uuid; + } + + public boolean export() { + return export; + } + + public boolean locked() { + return locked; + } + + public boolean visibility() { + return visibility; + } + + public boolean mirrorUV() { + return mirror_uv; + } + + public boolean autoUV() { + return autouv; + } + + public boolean isOpen() { + return is_open; + } + + public OutLiner[] children() { + return children; + } +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/plugin/config/blockbench/Resolution.java b/core/src/main/java/net/momirealms/craftengine/core/plugin/config/blockbench/Resolution.java new file mode 100644 index 000000000..5916860ae --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/plugin/config/blockbench/Resolution.java @@ -0,0 +1,18 @@ +package net.momirealms.craftengine.core.plugin.config.blockbench; + +import com.google.gson.annotations.SerializedName; + +public class Resolution { + @SerializedName("width") + private int width; + @SerializedName("height") + private int height; + + public int width() { + return width; + } + + public int height() { + return height; + } +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/plugin/config/blockbench/Texture.java b/core/src/main/java/net/momirealms/craftengine/core/plugin/config/blockbench/Texture.java new file mode 100644 index 000000000..0ccbee398 --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/plugin/config/blockbench/Texture.java @@ -0,0 +1,164 @@ +package net.momirealms.craftengine.core.plugin.config.blockbench; + +import com.google.gson.annotations.SerializedName; + +import java.util.UUID; + +public class Texture { + @SerializedName("path") + private String path; + @SerializedName("name") + private String name; + @SerializedName("folder") + private String folder; + @SerializedName("namespace") + private String namespace; + @SerializedName("id") + private String id; + @SerializedName("group") + private String group; + @SerializedName("width") + private int width; + @SerializedName("height") + private int height; + @SerializedName("uv_width") + private int uv_width; + @SerializedName("uv_height") + private int uv_height; + @SerializedName("particle") + private boolean particle; + @SerializedName("use_as_default") + private boolean use_as_default; + @SerializedName("layers_enabled") + private boolean layers_enabled; + @SerializedName("sync_to_project") + private String sync_to_project; + @SerializedName("render_mode") + private String render_mode; + @SerializedName("render_sides") + private String render_sides; + @SerializedName("frame_time") + private int frame_time; + @SerializedName("frame_order_type") + private String frame_order_type; + @SerializedName("frame_order") + private String frame_order; + @SerializedName("frame_interpolate") + private boolean frame_interpolate; + @SerializedName("visible") + private boolean visible; + @SerializedName("internal") + private boolean internal; + @SerializedName("saved") + private boolean saved; + @SerializedName("uuid") + private UUID uuid; + @SerializedName("relative_path") + private String relative_path; + @SerializedName("source") + private String source; + + public String path() { + return path; + } + + public String name() { + return name; + } + + public String folder() { + return folder; + } + + public String namespace() { + return namespace; + } + + public String id() { + return id; + } + + public String group() { + return group; + } + + public int width() { + return width; + } + + public int height() { + return height; + } + + public int uvWidth() { + return uv_width; + } + + public int uvHeight() { + return uv_height; + } + + public boolean particle() { + return particle; + } + + public boolean useAsDefault() { + return use_as_default; + } + + public boolean layersEnabled() { + return layers_enabled; + } + + public String syncToProject() { + return sync_to_project; + } + + public String renderMode() { + return render_mode; + } + + public String renderSides() { + return render_sides; + } + + public int frameTime() { + return frame_time; + } + + public String frameOrderType() { + return frame_order_type; + } + + public String frameOrder() { + return frame_order; + } + + public boolean frameInterpolate() { + return frame_interpolate; + } + + public boolean visible() { + return visible; + } + + public boolean internal() { + return internal; + } + + public boolean saved() { + return saved; + } + + public UUID uuid() { + return uuid; + } + + public String relativePath() { + return relative_path; + } + + public String source() { + return source; + } +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/plugin/config/template/ListTemplateArgument.java b/core/src/main/java/net/momirealms/craftengine/core/plugin/config/template/ListTemplateArgument.java new file mode 100644 index 000000000..2b5daca92 --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/plugin/config/template/ListTemplateArgument.java @@ -0,0 +1,34 @@ +package net.momirealms.craftengine.core.plugin.config.template; + +import net.momirealms.craftengine.core.util.Key; +import net.momirealms.craftengine.core.util.MiscUtils; + +import java.util.List; +import java.util.Map; + +public class ListTemplateArgument implements TemplateArgument { + public static final Factory FACTORY = new Factory(); + private final List value; + + public ListTemplateArgument(List value) { + this.value = value; + } + + @Override + public List get() { + return value; + } + + @Override + public Key type() { + return TemplateArguments.LIST; + } + + public static class Factory implements TemplateArgumentFactory { + + @Override + public TemplateArgument create(Map arguments) { + return new ListTemplateArgument(MiscUtils.castToList(arguments.getOrDefault("list", List.of()), false)); + } + } +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/plugin/config/template/MapTemplateArgument.java b/core/src/main/java/net/momirealms/craftengine/core/plugin/config/template/MapTemplateArgument.java new file mode 100644 index 000000000..c037578fb --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/plugin/config/template/MapTemplateArgument.java @@ -0,0 +1,33 @@ +package net.momirealms.craftengine.core.plugin.config.template; + +import net.momirealms.craftengine.core.util.Key; +import net.momirealms.craftengine.core.util.MiscUtils; + +import java.util.Map; + +public class MapTemplateArgument implements TemplateArgument { + public static final Factory FACTORY = new Factory(); + private final Map value; + + public MapTemplateArgument(Map value) { + this.value = value; + } + + @Override + public Map get() { + return value; + } + + @Override + public Key type() { + return TemplateArguments.MAP; + } + + public static class Factory implements TemplateArgumentFactory { + + @Override + public TemplateArgument create(Map arguments) { + return new MapTemplateArgument(MiscUtils.castToMap(arguments.getOrDefault("map", Map.of()), false)); + } + } +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/plugin/config/template/PlainStringTemplateArgument.java b/core/src/main/java/net/momirealms/craftengine/core/plugin/config/template/PlainStringTemplateArgument.java new file mode 100644 index 000000000..341a7f001 --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/plugin/config/template/PlainStringTemplateArgument.java @@ -0,0 +1,31 @@ +package net.momirealms.craftengine.core.plugin.config.template; + +import net.momirealms.craftengine.core.util.Key; + +import java.util.Map; + +public class PlainStringTemplateArgument implements TemplateArgument { + public static final Factory FACTORY = new Factory(); + private final String value; + + public PlainStringTemplateArgument(String value) { + this.value = value; + } + + @Override + public String get() { + return value; + } + + @Override + public Key type() { + return TemplateArguments.PLAIN; + } + + public static class Factory implements TemplateArgumentFactory { + @Override + public TemplateArgument create(Map arguments) { + return new PlainStringTemplateArgument(arguments.getOrDefault("value", "").toString()); + } + } +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/plugin/config/template/SelfIncreaseIntTemplateArgument.java b/core/src/main/java/net/momirealms/craftengine/core/plugin/config/template/SelfIncreaseIntTemplateArgument.java new file mode 100644 index 000000000..89dab33a5 --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/plugin/config/template/SelfIncreaseIntTemplateArgument.java @@ -0,0 +1,53 @@ +package net.momirealms.craftengine.core.plugin.config.template; + +import net.momirealms.craftengine.core.util.Key; +import net.momirealms.craftengine.core.util.MiscUtils; + +import java.util.Map; + +public class SelfIncreaseIntTemplateArgument implements TemplateArgument { + public static final Factory FACTORY = new Factory(); + private final int min; + private final int max; + private int current; + + public SelfIncreaseIntTemplateArgument(int min, int max) { + this.min = min; + this.max = max; + this.current = min; + } + + @Override + public String get() { + String value = String.valueOf(current); + if (current < max) current += 1; + return value; + } + + @Override + public Key type() { + return TemplateArguments.SELF_INCREASE_INT; + } + + public int current() { + return current; + } + + public int min() { + return min; + } + + public int max() { + return max; + } + + public static class Factory implements TemplateArgumentFactory { + @Override + public TemplateArgument create(Map arguments) { + int from = MiscUtils.getAsInt(arguments.get("from")); + int to = MiscUtils.getAsInt(arguments.get("to")); + if (from > to) throw new IllegalArgumentException("from > to"); + return new SelfIncreaseIntTemplateArgument(from, to); + } + } +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/plugin/config/template/TemplateArgument.java b/core/src/main/java/net/momirealms/craftengine/core/plugin/config/template/TemplateArgument.java new file mode 100644 index 000000000..87181291d --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/plugin/config/template/TemplateArgument.java @@ -0,0 +1,10 @@ +package net.momirealms.craftengine.core.plugin.config.template; + +import net.momirealms.craftengine.core.util.Key; + +import java.util.function.Supplier; + +public interface TemplateArgument extends Supplier { + + Key type(); +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/plugin/config/template/TemplateArgumentFactory.java b/core/src/main/java/net/momirealms/craftengine/core/plugin/config/template/TemplateArgumentFactory.java new file mode 100644 index 000000000..63812d722 --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/plugin/config/template/TemplateArgumentFactory.java @@ -0,0 +1,8 @@ +package net.momirealms.craftengine.core.plugin.config.template; + +import java.util.Map; + +public interface TemplateArgumentFactory { + + TemplateArgument create(Map arguments); +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/plugin/config/template/TemplateArguments.java b/core/src/main/java/net/momirealms/craftengine/core/plugin/config/template/TemplateArguments.java new file mode 100644 index 000000000..fe36bce7e --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/plugin/config/template/TemplateArguments.java @@ -0,0 +1,44 @@ +package net.momirealms.craftengine.core.plugin.config.template; + +import net.momirealms.craftengine.core.registry.BuiltInRegistries; +import net.momirealms.craftengine.core.registry.Holder; +import net.momirealms.craftengine.core.registry.Registries; +import net.momirealms.craftengine.core.registry.WritableRegistry; +import net.momirealms.craftengine.core.util.Key; +import net.momirealms.craftengine.core.util.ResourceKey; + +import java.util.Map; + +public class TemplateArguments { + public static final Key PLAIN = Key.of("craftengine:plain"); + public static final Key SELF_INCREASE_INT = Key.of("craftengine:self_increase_int"); + public static final Key MAP = Key.of("craftengine:map"); + public static final Key LIST = Key.of("craftengine:list"); + + public static void register(Key key, TemplateArgumentFactory factory) { + Holder.Reference holder = ((WritableRegistry) BuiltInRegistries.TEMPLATE_ARGUMENT_FACTORY) + .registerForHolder(new ResourceKey<>(Registries.TEMPLATE_ARGUMENT_FACTORY.location(), key)); + holder.bindValue(factory); + } + + static { + register(PLAIN, PlainStringTemplateArgument.FACTORY); + register(SELF_INCREASE_INT, SelfIncreaseIntTemplateArgument.FACTORY); + register(MAP, MapTemplateArgument.FACTORY); + register(LIST, ListTemplateArgument.FACTORY); + } + + public static TemplateArgument fromMap(Map map) { + String type = (String) map.get("type"); + if (type == null) { + return MapTemplateArgument.FACTORY.create(map); + } else { + Key key = Key.withDefaultNamespace(type, "craftengine"); + TemplateArgumentFactory factory = BuiltInRegistries.TEMPLATE_ARGUMENT_FACTORY.getValue(key); + if (factory == null) { + throw new IllegalArgumentException("Unknown argument type: " + type); + } + return factory.create(map); + } + } +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/plugin/config/template/TemplateManager.java b/core/src/main/java/net/momirealms/craftengine/core/plugin/config/template/TemplateManager.java new file mode 100644 index 000000000..332254995 --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/plugin/config/template/TemplateManager.java @@ -0,0 +1,26 @@ +package net.momirealms.craftengine.core.plugin.config.template; + +import net.momirealms.craftengine.core.pack.LoadingSequence; +import net.momirealms.craftengine.core.plugin.Reloadable; +import net.momirealms.craftengine.core.plugin.config.ConfigSectionParser; + +import java.util.Map; +import java.util.regex.Pattern; + +public interface TemplateManager extends Reloadable, ConfigSectionParser { + String CONFIG_SECTION_NAME = "templates"; + Pattern PATTERN = Pattern.compile("\\{[^{}]+}"); + String TEMPLATE = "template"; + String OVERRIDES = "overrides"; + String ARGUMENTS = "arguments"; + + default String sectionId() { + return CONFIG_SECTION_NAME; + } + + Map applyTemplates(Map input); + + default int loadingSequence() { + return LoadingSequence.TEMPLATE; + } +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/plugin/config/template/TemplateManagerImpl.java b/core/src/main/java/net/momirealms/craftengine/core/plugin/config/template/TemplateManagerImpl.java new file mode 100644 index 000000000..71ba824de --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/plugin/config/template/TemplateManagerImpl.java @@ -0,0 +1,243 @@ +package net.momirealms.craftengine.core.plugin.config.template; + +import net.momirealms.craftengine.core.pack.Pack; +import net.momirealms.craftengine.core.plugin.CraftEngine; +import net.momirealms.craftengine.core.util.Key; +import net.momirealms.craftengine.core.util.MiscUtils; +import net.momirealms.craftengine.core.util.PreConditions; +import org.jetbrains.annotations.NotNull; + +import java.nio.file.Path; +import java.util.*; +import java.util.function.Consumer; +import java.util.function.Supplier; +import java.util.regex.Matcher; + +import static net.momirealms.craftengine.core.util.MiscUtils.castToList; +import static net.momirealms.craftengine.core.util.MiscUtils.castToMap; + +public class TemplateManagerImpl implements TemplateManager { + private static final String EMPTY = ""; + private static final String LEFT_BRACKET = "{"; + private static final String RIGHT_BRACKET = "}"; + private final CraftEngine plugin; + private final Map templates = new HashMap<>(); + private final static Set blacklistedKeys = new HashSet<>(Set.of(TEMPLATE, ARGUMENTS, OVERRIDES)); + + public TemplateManagerImpl(CraftEngine plugin) { + this.plugin = plugin; + } + + @Override + public void unload() { + this.templates.clear(); + } + + @Override + public void parseSection(Pack pack, + Path path, + Key id, + Map section) { + if (PreConditions.runIfTrue(this.templates.containsKey(id), () -> this.plugin.logger().warn(path, "Template duplicates: " + id))) return; + this.templates.put(id, section); + } + + @Override + public Map applyTemplates(Map input) { + Objects.requireNonNull(input, "Input must not be null"); + Map result = new LinkedHashMap<>(); + applyTemplatesRecursive(EMPTY, input, result, Collections.emptyMap()); + return result; + } + + private void applyTemplatesRecursive(String currentPath, + Map input, + Map result, + Map> parentArguments) { + if (input.containsKey(TEMPLATE)) { + TemplateProcessingResult processingResult = processTemplates(input, parentArguments); + List templates = processingResult.templates(); + Object overrides = processingResult.overrides(); + Map> arguments = mergeArguments(parentArguments, processingResult.arguments()); + + for (Object template : templates) { + if (template instanceof Map mapTemplate) { + handleMapTemplate(currentPath, castToMap(mapTemplate, false), overrides, arguments, input, result); + } else if (template instanceof List listTemplate) { + handleListTemplate(currentPath, castToList(listTemplate, false), overrides, arguments, result); + } else if (template instanceof String stringTemplate) { + Object arg = applyArgument(stringTemplate, arguments); + if (arg != null) { + result.put(currentPath, arg); + } else { + result.remove(currentPath); + } + } else { + result.put(currentPath, template); + } + } + } else { + Map innerResult = currentPath.isEmpty() ? result : new LinkedHashMap<>(); + if (!currentPath.isEmpty()) { + result.put(currentPath, innerResult); + } + + input.forEach((key, value) -> processValue( + value, + processedValue -> { + if (processedValue == null) { + innerResult.remove(key); + } else { + innerResult.put(key, processedValue); + } + }, + parentArguments + )); + } + } + + private TemplateProcessingResult processTemplates(Map input, Map> parentArguments) { + List templateIds = MiscUtils.getAsStringList(input.get(TEMPLATE)); + List templateList = new ArrayList<>(); + for (String templateId : templateIds) { + Object actualTemplate = templateId.contains(LEFT_BRACKET) && templateId.contains(RIGHT_BRACKET) ? applyArgument(templateId, parentArguments) : templateId; + if (actualTemplate == null) continue; + Object template = Optional.ofNullable(templates.get(Key.of(actualTemplate.toString()))) + .orElseThrow(() -> new IllegalArgumentException("Template not found: " + actualTemplate)); + templateList.add(template); + } + Map> arguments = getArguments(castToMap(input.getOrDefault(ARGUMENTS, Collections.emptyMap()), false), parentArguments); + return new TemplateProcessingResult( + templateList, + input.get(OVERRIDES), + arguments + ); + } + + private Map> getArguments(@NotNull Map argumentMap, @NotNull Map> parentArguments) { + Map> result = new HashMap<>(); + argumentMap.forEach((key, value) -> { + String placeholder = LEFT_BRACKET + key + RIGHT_BRACKET; + if (value instanceof Map nestedMap) { + Map arguments = castToMap(nestedMap, false); + Map nestedResult = new LinkedHashMap<>(); + applyTemplatesRecursive(EMPTY, arguments, nestedResult, parentArguments); + result.put(placeholder, TemplateArguments.fromMap(nestedResult)); + } else if (value instanceof List nestedList) { + List arguments = castToList(nestedList, false); + List nestedResult = new ArrayList<>(); + processList(arguments, nestedResult, parentArguments); + result.put(placeholder, new ListTemplateArgument(nestedResult)); + } else { + if (value == null) { + result.put(placeholder, () -> null); + } else { + String valueStr = value.toString(); + Object applied = applyArgument(valueStr, parentArguments); + result.put(placeholder, () -> applied); + } + } + }); + return result; + } + + private Object applyArgument(String input, Map> arguments) { + StringBuilder result = new StringBuilder(); + Matcher matcher = PATTERN.matcher(input); + boolean first = true; + while (matcher.find()) { + String placeholder = matcher.group(); + Supplier replacer = arguments.get(placeholder); + if (replacer == null) { + matcher.appendReplacement(result, placeholder); + continue; + } + if (first) { + first = false; + if (input.length() == placeholder.length()) { + return replacer.get(); + } else { + matcher.appendReplacement(result, replacer.get().toString()); + } + } else { + matcher.appendReplacement(result, replacer.get().toString()); + } + } + matcher.appendTail(result); + return result.toString(); + } + + private void processValue(Object value, + Consumer resultConsumer, + Map> arguments) { + if (value instanceof Map mapValue) { + Map nestedResult = new LinkedHashMap<>(); + applyTemplatesRecursive(EMPTY, castToMap(mapValue, false), nestedResult, arguments); + resultConsumer.accept(nestedResult); + } else if (value instanceof List listValue) { + List nestedList = new ArrayList<>(); + processList(castToList(listValue, false), nestedList, arguments); + resultConsumer.accept(nestedList); + } else if (value instanceof String strValue) { + resultConsumer.accept(applyArgument(strValue, arguments)); + } else { + resultConsumer.accept(value); + } + } + + private void processList(List inputList, List resultList, Map> arguments) { + for (Object item : inputList) { + processValue(item, r -> { + if (r != null) { + resultList.add(r); + } + }, arguments); + } + } + + private void handleMapTemplate(String currentPath, + Map template, + Object overrides, + Map> arguments, + Map input, + Map result) { + Map merged = new LinkedHashMap<>(template); + if (overrides != null) { + merged.putAll(castToMap(overrides, false)); + } + for (Map.Entry entry : input.entrySet()) { + if (!blacklistedKeys.contains(entry.getKey())) { + merged.put(entry.getKey(), entry.getValue()); + } + } + applyTemplatesRecursive(currentPath, merged, result, arguments); + } + + private void handleListTemplate(String currentPath, + List template, + Object overrides, + Map> arguments, + Map result) { + List merged = (overrides instanceof List overrideList && !overrideList.isEmpty()) + ? castToList(overrideList, false) + : template; + List processedList = new ArrayList<>(); + processList(merged, processedList, arguments); + result.put(currentPath, processedList); + } + + private record TemplateProcessingResult( + List templates, + Object overrides, + Map> arguments + ) {} + + private static Map> mergeArguments( + Map> parent, + Map> child + ) { + Map> merged = new HashMap<>(parent); + merged.putAll(child); + return merged; + } +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/plugin/dependency/Dependencies.java b/core/src/main/java/net/momirealms/craftengine/core/plugin/dependency/Dependencies.java new file mode 100644 index 000000000..d686ecf8d --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/plugin/dependency/Dependencies.java @@ -0,0 +1,210 @@ +package net.momirealms.craftengine.core.plugin.dependency; + +import net.momirealms.craftengine.core.plugin.dependency.relocation.Relocation; + +import java.util.Collections; +import java.util.List; + +public class Dependencies { + + public static final Dependency ASM = new Dependency( + "asm", + "org.ow2.asm", + "asm", + "asm", + Collections.emptyList() + ); + public static final Dependency ASM_COMMONS = new Dependency( + "asm-commons", + "org.ow2.asm", + "asm-commons", + "asm-commons", + Collections.emptyList() + ); + public static final Dependency JAR_RELOCATOR = new Dependency( + "jar-relocator", + "me.lucko", + "jar-relocator", + "jar-relocator", + Collections.emptyList() + ); + public static final Dependency NETTY_HTTP = new Dependency( + "netty-codec-http", + "io.netty", + "netty-codec-http", + "netty-codec-http", + Collections.emptyList() + ); + public static final Dependency GEANTY_REF = new Dependency( + "geantyref", + "io{}leangen{}geantyref", + "geantyref", + "geantyref", + List.of(Relocation.of("geantyref", "io{}leangen{}geantyref")) + ); + public static final Dependency CLOUD_CORE = new Dependency( + "cloud-core", + "org{}incendo", + "cloud-core", + "cloud-core", + List.of(Relocation.of("cloud", "org{}incendo{}cloud"), + Relocation.of("geantyref", "io{}leangen{}geantyref")) + ); + public static final Dependency CLOUD_BRIGADIER = new Dependency( + "cloud-brigadier", + "org{}incendo", + "cloud-brigadier", + "cloud-brigadier", + List.of(Relocation.of("cloud", "org{}incendo{}cloud"), + Relocation.of("geantyref", "io{}leangen{}geantyref")) + ); + public static final Dependency CLOUD_SERVICES = new Dependency( + "cloud-services", + "org{}incendo", + "cloud-services", + "cloud-services", + List.of(Relocation.of("cloud", "org{}incendo{}cloud"), + Relocation.of("geantyref", "io{}leangen{}geantyref")) + ); + public static final Dependency CLOUD_BUKKIT = new Dependency( + "cloud-bukkit", + "org{}incendo", + "cloud-bukkit", + "cloud-bukkit", + List.of(Relocation.of("cloud", "org{}incendo{}cloud"), + Relocation.of("geantyref", "io{}leangen{}geantyref"), + Relocation.of("adventure", "net{}kyori{}adventure"), + Relocation.of("examination", "net{}kyori{}examination"), + Relocation.of("option", "net{}kyori{}option")) + ); + public static final Dependency CLOUD_PAPER = new Dependency( + "cloud-paper", + "org{}incendo", + "cloud-paper", + "cloud-paper", + List.of(Relocation.of("cloud", "org{}incendo{}cloud"), + Relocation.of("geantyref", "io{}leangen{}geantyref"), + Relocation.of("adventure", "net{}kyori{}adventure"), + Relocation.of("examination", "net{}kyori{}examination"), + Relocation.of("option", "net{}kyori{}option")) + ); + public static final Dependency CLOUD_MINECRAFT_EXTRAS = new Dependency( + "cloud-minecraft-extras", + "org{}incendo", + "cloud-minecraft-extras", + "cloud-minecraft-extras", + List.of(Relocation.of("cloud", "org{}incendo{}cloud"), + Relocation.of("geantyref", "io{}leangen{}geantyref"), + Relocation.of("adventure", "net{}kyori{}adventure"), + Relocation.of("examination", "net{}kyori{}examination"), + Relocation.of("option", "net{}kyori{}option")) + ); + public static final Dependency BOOSTED_YAML = new Dependency( + "boosted-yaml", + "dev{}dejvokep", + "boosted-yaml", + "boosted-yaml", + List.of(Relocation.of("boostedyaml", "dev{}dejvokep{}boostedyaml")) + ); + public static final Dependency BSTATS_BASE = new Dependency( + "bstats-base", + "org{}bstats", + "bstats-base", + "bstats-base", + List.of(Relocation.of("bstats", "org{}bstats")) + ); + public static final Dependency BSTATS_BUKKIT = new Dependency( + "bstats-bukkit", + "org{}bstats", + "bstats-bukkit", + "bstats-bukkit", + List.of(Relocation.of("bstats", "org{}bstats")) + ) { + @Override + public String getVersion() { + return Dependencies.BSTATS_BASE.getVersion(); + } + }; + public static final Dependency GSON = new Dependency( + "gson", + "com.google.code.gson", + "gson", + "gson", + Collections.emptyList() + ); + public static final Dependency CAFFEINE = new Dependency( + "caffeine", + "com{}github{}ben-manes{}caffeine", + "caffeine", + "caffeine", + List.of(Relocation.of("caffeine", "com{}github{}benmanes{}caffeine")) + ); + public static final Dependency ZSTD = new Dependency( + "zstd-jni", + "com.github.luben", + "zstd-jni", + "zstd-jni", + Collections.emptyList() + ); + public static final Dependency SLF4J_API = new Dependency( + "slf4j-api", + "org.slf4j", + "slf4j-api", + "slf4j-api", + Collections.emptyList() + ); + public static final Dependency SLF4J_SIMPLE = new Dependency( + "slf4j-simple", + "org.slf4j", + "slf4j-simple", + "slf4j-simple", + Collections.emptyList() + ) { + @Override + public String getVersion() { + return Dependencies.SLF4J_API.getVersion(); + } + }; + public static final Dependency COMMONS_IO = new Dependency( + "commons-io", + "commons-io", + "commons-io", + "commons-io", + List.of(Relocation.of("commons", "org{}apache{}commons")) + ); + public static final Dependency BYTE_BUDDY = new Dependency( + "byte-buddy", + "net{}bytebuddy", + "byte-buddy", + "byte-buddy", + List.of(Relocation.of("bytebuddy", "net{}bytebuddy")) + ); + public static final Dependency SNAKE_YAML = new Dependency( + "snake-yaml", + "org{}yaml", + "snakeyaml", + "snakeyaml", + List.of(Relocation.of("snakeyaml", "org{}yaml{}snakeyaml")) + ); + public static final Dependency MINIMESSAGE = new Dependency( + "adventure-text-minimessage", + "net{}kyori", + "adventure-text-minimessage", + "adventure-text-minimessage", + List.of(Relocation.of("adventure", "net{}kyori{}adventure")) + ); + public static final Dependency TEXT_SERIALIZER_GSON = new Dependency( + "adventure-text-serializer-gson", + "net{}kyori", + "adventure-text-serializer-gson", + "adventure-text-serializer-gson", + List.of(Relocation.of("adventure", "net{}kyori{}adventure")) + ); + public static final Dependency TEXT_SERIALIZER_JSON = new Dependency( + "adventure-text-serializer-json", + "net{}kyori", + "adventure-text-serializer-json", + "adventure-text-serializer-json", + List.of(Relocation.of("adventure", "net{}kyori{}adventure")) + ); +} \ No newline at end of file diff --git a/core/src/main/java/net/momirealms/craftengine/core/plugin/dependency/Dependency.java b/core/src/main/java/net/momirealms/craftengine/core/plugin/dependency/Dependency.java new file mode 100644 index 000000000..0bf50cb9d --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/plugin/dependency/Dependency.java @@ -0,0 +1,92 @@ +package net.momirealms.craftengine.core.plugin.dependency; + +import net.momirealms.craftengine.core.plugin.PluginProperties; +import net.momirealms.craftengine.core.plugin.dependency.relocation.Relocation; + +import java.util.List; +import java.util.Locale; +import java.util.Objects; + +public class Dependency { + private final String id; + private final String groupId; + private final String rawArtifactId; + private final String customArtifactID; + private final List relocations; + + public Dependency(String id, String groupId, String rawArtifactId, String customArtifactID, List relocations) { + this.id = id; + this.groupId = groupId; + this.rawArtifactId = rawArtifactId; + this.customArtifactID = customArtifactID; + this.relocations = relocations; + } + + public String id() { + return id; + } + + public String groupId() { + return groupId; + } + + public String rawArtifactId() { + return rawArtifactId; + } + + public String customArtifactID() { + return customArtifactID; + } + + public List relocations() { + return relocations; + } + + private static final String MAVEN_FORMAT = "%s/%s/%s/%s-%s.jar"; + + public String mavenPath() { + return String.format(MAVEN_FORMAT, + rewriteEscaping(groupId).replace(".", "/"), + rewriteEscaping(rawArtifactId), + getVersion(), + rewriteEscaping(rawArtifactId), + getVersion() + ); + } + + public String fileName(String classifier) { + String name = customArtifactID.toLowerCase(Locale.ROOT).replace('_', '-'); + String extra = classifier == null || classifier.isEmpty() + ? "" + : "-" + classifier; + return name + "-" + this.getVersion() + extra + ".jar"; + } + + public String getVersion() { + return PluginProperties.getValue(id); + } + + private static String rewriteEscaping(String s) { + return s.replace("{}", "."); + } + + @Override + public final boolean equals(Object o) { + if (this == o) return true; + if (!(o instanceof Dependency that)) return false; + return Objects.equals(id, that.id); + } + + @Override + public int hashCode() { + return id.hashCode(); + } + + @Override + public String toString() { + return "Dependency{" + + "id='" + id + '\'' + + ", groupId='" + groupId + '\'' + + '}'; + } +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/plugin/dependency/DependencyDownloadException.java b/core/src/main/java/net/momirealms/craftengine/core/plugin/dependency/DependencyDownloadException.java new file mode 100644 index 000000000..00bf570a2 --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/plugin/dependency/DependencyDownloadException.java @@ -0,0 +1,18 @@ +package net.momirealms.craftengine.core.plugin.dependency; + +public class DependencyDownloadException extends Exception { + public DependencyDownloadException() { + } + + public DependencyDownloadException(String message) { + super(message); + } + + public DependencyDownloadException(String message, Throwable cause) { + super(message, cause); + } + + public DependencyDownloadException(Throwable cause) { + super(cause); + } +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/plugin/dependency/DependencyManager.java b/core/src/main/java/net/momirealms/craftengine/core/plugin/dependency/DependencyManager.java new file mode 100644 index 000000000..54b17e5af --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/plugin/dependency/DependencyManager.java @@ -0,0 +1,28 @@ +package net.momirealms.craftengine.core.plugin.dependency; + +import java.util.Collection; +import java.util.Set; + +/** + * Loads and manages runtime dependencies for the plugin. + */ +public interface DependencyManager extends AutoCloseable { + + /** + * Loads dependencies. + * + * @param dependencies the dependencies to load + */ + void loadDependencies(Collection dependencies); + + /** + * Obtains an isolated classloader containing the given dependencies. + * + * @param dependencies the dependencies + * @return the classloader + */ + ClassLoader obtainClassLoaderWith(Set dependencies); + + @Override + void close(); +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/plugin/dependency/DependencyManagerImpl.java b/core/src/main/java/net/momirealms/craftengine/core/plugin/dependency/DependencyManagerImpl.java new file mode 100644 index 000000000..0f3f15376 --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/plugin/dependency/DependencyManagerImpl.java @@ -0,0 +1,197 @@ +package net.momirealms.craftengine.core.plugin.dependency; + +import net.momirealms.craftengine.core.plugin.Plugin; +import net.momirealms.craftengine.core.plugin.classpath.ClassPathAppender; +import net.momirealms.craftengine.core.plugin.dependency.classloader.IsolatedClassLoader; +import net.momirealms.craftengine.core.plugin.dependency.relocation.Relocation; +import net.momirealms.craftengine.core.plugin.dependency.relocation.RelocationHandler; + +import java.io.IOException; +import java.net.MalformedURLException; +import java.net.URL; +import java.nio.file.FileAlreadyExistsException; +import java.nio.file.Files; +import java.nio.file.Path; +import java.util.*; +import java.util.concurrent.CountDownLatch; +import java.util.concurrent.Executor; + +public class DependencyManagerImpl implements DependencyManager { + private final DependencyRegistry registry; + private final Path cacheDirectory; + private final ClassPathAppender classPathAppender; + private final Map loaded = Collections.synchronizedMap(new HashMap<>()); + private final Map, IsolatedClassLoader> loaders = new HashMap<>(); + private final RelocationHandler relocationHandler; + private final Executor loadingExecutor; + private final Plugin plugin; + + public DependencyManagerImpl(Plugin plugin) { + this.plugin = plugin; + this.registry = new DependencyRegistry(); + this.cacheDirectory = setupCacheDirectory(plugin); + this.classPathAppender = plugin.classPathAppender(); + this.loadingExecutor = plugin.scheduler().async(); + this.relocationHandler = new RelocationHandler(this); + } + + @Override + public ClassLoader obtainClassLoaderWith(Set dependencies) { + Set set = new HashSet<>(dependencies); + + for (Dependency dependency : dependencies) { + if (!this.loaded.containsKey(dependency)) { + throw new IllegalStateException("Dependency " + dependency.id() + " is not loaded."); + } + } + + synchronized (this.loaders) { + IsolatedClassLoader classLoader = this.loaders.get(set); + if (classLoader != null) { + return classLoader; + } + + URL[] urls = set.stream() + .map(this.loaded::get) + .map(file -> { + try { + return file.toUri().toURL(); + } catch (MalformedURLException e) { + throw new RuntimeException(e); + } + }) + .toArray(URL[]::new); + + classLoader = new IsolatedClassLoader(urls); + this.loaders.put(set, classLoader); + return classLoader; + } + } + + @Override + public void loadDependencies(Collection dependencies) { + CountDownLatch latch = new CountDownLatch(dependencies.size()); + + for (Dependency dependency : dependencies) { + if (this.loaded.containsKey(dependency)) { + latch.countDown(); + continue; + } + + this.loadingExecutor.execute(() -> { + try { + loadDependency(dependency); + } catch (Throwable e) { + this.plugin.logger().warn("Unable to load dependency " + dependency.id(), e); + } finally { + latch.countDown(); + } + }); + } + + try { + latch.await(); + } catch (InterruptedException e) { + Thread.currentThread().interrupt(); + } + } + + private void loadDependency(Dependency dependency) throws Exception { + if (this.loaded.containsKey(dependency)) { + return; + } + + Path file = remapDependency(dependency, downloadDependency(dependency)); + + this.loaded.put(dependency, file); + + if (this.classPathAppender != null && this.registry.shouldAutoLoad(dependency)) { + this.classPathAppender.addJarToClasspath(file); + } + } + + private Path downloadDependency(Dependency dependency) throws DependencyDownloadException { + String fileName = dependency.fileName(null); + Path file = this.cacheDirectory.resolve(fileName); + // if the file already exists, don't attempt to re-download it. + if (Files.exists(file)) { + return file; + } + DependencyDownloadException lastError = null; + List repository = DependencyRepository.getByID("maven"); + if (!repository.isEmpty()) { + int i = 0; + while (i < repository.size()) { + try { + plugin.logger().info("Downloading dependency(" + fileName + ")[" + repository.get(i).getUrl() + dependency.mavenPath() + "]"); + repository.get(i).download(dependency, file); + plugin.logger().info("Successfully downloaded " + fileName); + return file; + } catch (DependencyDownloadException e) { + lastError = e; + i++; + } + } + } + throw Objects.requireNonNull(lastError); + } + + private Path remapDependency(Dependency dependency, Path normalFile) throws Exception { + List rules = new ArrayList<>(dependency.relocations()); + if (rules.isEmpty()) { + return normalFile; + } + + Path remappedFile = this.cacheDirectory.resolve(dependency.fileName(DependencyRegistry.isGsonRelocated() ? "remapped-legacy" : "remapped")); + + // if the remapped source exists already, just use that. + if (Files.exists(remappedFile)) { + return remappedFile; + } + + plugin.logger().info("Remapping " + dependency.fileName(null)); + relocationHandler.remap(normalFile, remappedFile, rules); + plugin.logger().info("Successfully remapped " + dependency.fileName(null)); + return remappedFile; + } + + private static Path setupCacheDirectory(Plugin plugin) { + Path cacheDirectory = plugin.dataFolderPath().resolve("libs"); + try { + if (Files.exists(cacheDirectory) && (Files.isDirectory(cacheDirectory) || Files.isSymbolicLink(cacheDirectory))) { + return cacheDirectory; + } + + try { + Files.createDirectories(cacheDirectory); + } catch (FileAlreadyExistsException e) { + // ignore + } + } catch (IOException e) { + throw new RuntimeException("Unable to create libs directory", e); + } + + return cacheDirectory; + } + + @Override + public void close() { + IOException firstEx = null; + + for (IsolatedClassLoader loader : this.loaders.values()) { + try { + loader.close(); + } catch (IOException ex) { + if (firstEx == null) { + firstEx = ex; + } else { + firstEx.addSuppressed(ex); + } + } + } + + if (firstEx != null) { + plugin.logger().severe(firstEx.getMessage(), firstEx); + } + } +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/plugin/dependency/DependencyRegistry.java b/core/src/main/java/net/momirealms/craftengine/core/plugin/dependency/DependencyRegistry.java new file mode 100644 index 000000000..9e7328d86 --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/plugin/dependency/DependencyRegistry.java @@ -0,0 +1,37 @@ +package net.momirealms.craftengine.core.plugin.dependency; + +import com.google.gson.JsonElement; + +import java.util.Set; +import java.util.stream.Collectors; +import java.util.stream.Stream; + +public class DependencyRegistry { + private static final Set DO_NOT_AUTO_LOAD = Stream.of( + Dependencies.ASM, Dependencies.ASM_COMMONS, Dependencies.JAR_RELOCATOR, Dependencies.ZSTD + ).map(Dependency::id).collect(Collectors.toSet()); + + private static final String GROUP_ID = "net.momirealms"; + + public boolean shouldAutoLoad(Dependency dependency) { + return !DO_NOT_AUTO_LOAD.contains(dependency.id()); + } + + @SuppressWarnings("ConstantConditions") + public static boolean isGsonRelocated() { + return JsonElement.class.getName().startsWith(GROUP_ID); + } + + private static boolean classExists(String className) { + try { + Class.forName(className); + return true; + } catch (ClassNotFoundException e) { + return false; + } + } + + private static boolean slf4jPresent() { + return classExists("org.slf4j.Logger") && classExists("org.slf4j.LoggerFactory"); + } +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/plugin/dependency/DependencyRepository.java b/core/src/main/java/net/momirealms/craftengine/core/plugin/dependency/DependencyRepository.java new file mode 100644 index 000000000..b7f4c0d66 --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/plugin/dependency/DependencyRepository.java @@ -0,0 +1,94 @@ +package net.momirealms.craftengine.core.plugin.dependency; + +import java.io.IOException; +import java.io.InputStream; +import java.net.URL; +import java.net.URLConnection; +import java.nio.file.Files; +import java.nio.file.Path; +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; +import java.util.Locale; + +public enum DependencyRepository { + /** + * Maven Central + */ + MAVEN_CENTRAL("maven", "https://repo1.maven.org/maven2/") { + @Override + protected URLConnection openConnection(Dependency dependency) throws IOException { + URLConnection connection = super.openConnection(dependency); + connection.setConnectTimeout(5000); + connection.setReadTimeout(5000); + return connection; + } + }, + /** + * Maven Central Mirror + */ + MAVEN_CENTRAL_MIRROR("maven", "https://maven.aliyun.com/repository/public/"); + + private final String url; + private final String id; + + DependencyRepository(String id, String url) { + this.url = url; + this.id = id; + } + + public String getUrl() { + return url; + } + + public static List getByID(String id) { + ArrayList repositories = new ArrayList<>(); + for (DependencyRepository repository : values()) { + if (id.equals(repository.id)) { + repositories.add(repository); + } + } + // 中国大陆优先使用国内阿里云镜像 + if (id.equals("maven") && Locale.getDefault() == Locale.SIMPLIFIED_CHINESE) { + Collections.reverse(repositories); + } + return repositories; + } + + protected URLConnection openConnection(Dependency dependency) throws IOException { + @SuppressWarnings("deprecation") // 1.20 + URL dependencyUrl = new URL(this.url + dependency.mavenPath()); + return dependencyUrl.openConnection(); + } + + public byte[] downloadRaw(Dependency dependency) throws DependencyDownloadException { + try { + URLConnection connection = openConnection(dependency); + try (InputStream in = connection.getInputStream()) { + byte[] bytes = in.readAllBytes(); + if (bytes.length == 0) { + throw new DependencyDownloadException("Empty stream"); + } + return bytes; + } + } catch (Exception e) { + throw new DependencyDownloadException(e); + } + } + + public byte[] download(Dependency dependency) throws DependencyDownloadException { + return downloadRaw(dependency); + } + + public void download(Dependency dependency, Path file) throws DependencyDownloadException { + try { + Files.write(file, download(dependency)); + } catch (IOException e) { + throw new DependencyDownloadException(e); + } + } + + public String id() { + return id; + } +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/plugin/dependency/classloader/IsolatedClassLoader.java b/core/src/main/java/net/momirealms/craftengine/core/plugin/dependency/classloader/IsolatedClassLoader.java new file mode 100644 index 000000000..19e769536 --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/plugin/dependency/classloader/IsolatedClassLoader.java @@ -0,0 +1,14 @@ +package net.momirealms.craftengine.core.plugin.dependency.classloader; + +import java.net.URL; +import java.net.URLClassLoader; + +public class IsolatedClassLoader extends URLClassLoader { + static { + ClassLoader.registerAsParallelCapable(); + } + + public IsolatedClassLoader(URL[] urls) { + super(urls, ClassLoader.getSystemClassLoader().getParent()); + } +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/plugin/dependency/relocation/Relocation.java b/core/src/main/java/net/momirealms/craftengine/core/plugin/dependency/relocation/Relocation.java new file mode 100644 index 000000000..2833d3f3d --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/plugin/dependency/relocation/Relocation.java @@ -0,0 +1,41 @@ +package net.momirealms.craftengine.core.plugin.dependency.relocation; + +import java.util.Objects; + +public final class Relocation { + private static final String RELOCATION_PREFIX = "net.momirealms.craftengine.libraries."; + + public static Relocation of(String id, String pattern) { + return new Relocation(pattern.replace("{}", "."), RELOCATION_PREFIX + id); + } + + private final String pattern; + private final String relocatedPattern; + + private Relocation(String pattern, String relocatedPattern) { + this.pattern = pattern; + this.relocatedPattern = relocatedPattern; + } + + public String getPattern() { + return this.pattern; + } + + public String getRelocatedPattern() { + return this.relocatedPattern; + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + Relocation that = (Relocation) o; + return Objects.equals(this.pattern, that.pattern) && + Objects.equals(this.relocatedPattern, that.relocatedPattern); + } + + @Override + public int hashCode() { + return Objects.hash(this.pattern, this.relocatedPattern); + } +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/plugin/dependency/relocation/RelocationHandler.java b/core/src/main/java/net/momirealms/craftengine/core/plugin/dependency/relocation/RelocationHandler.java new file mode 100644 index 000000000..1feb1eb3d --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/plugin/dependency/relocation/RelocationHandler.java @@ -0,0 +1,57 @@ +package net.momirealms.craftengine.core.plugin.dependency.relocation; + +import net.momirealms.craftengine.core.plugin.dependency.Dependencies; +import net.momirealms.craftengine.core.plugin.dependency.Dependency; +import net.momirealms.craftengine.core.plugin.dependency.DependencyManager; +import net.momirealms.craftengine.core.plugin.dependency.classloader.IsolatedClassLoader; + +import java.io.File; +import java.io.IOException; +import java.lang.reflect.Constructor; +import java.lang.reflect.Method; +import java.nio.file.Path; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Set; + +public class RelocationHandler { + public static final Set DEPENDENCIES = Set.of(Dependencies.ASM, Dependencies.ASM_COMMONS, Dependencies.JAR_RELOCATOR); + private static final String JAR_RELOCATOR_CLASS = "me.lucko.jarrelocator.JarRelocator"; + private static final String JAR_RELOCATOR_RUN_METHOD = "run"; + + private final Constructor jarRelocatorConstructor; + private final Method jarRelocatorRunMethod; + + public RelocationHandler(DependencyManager dependencyManager) { + ClassLoader classLoader = null; + try { + dependencyManager.loadDependencies(DEPENDENCIES); + classLoader = dependencyManager.obtainClassLoaderWith(DEPENDENCIES); + Class jarRelocatorClass = classLoader.loadClass(JAR_RELOCATOR_CLASS); + this.jarRelocatorConstructor = jarRelocatorClass.getDeclaredConstructor(File.class, File.class, Map.class); + this.jarRelocatorConstructor.setAccessible(true); + this.jarRelocatorRunMethod = jarRelocatorClass.getDeclaredMethod(JAR_RELOCATOR_RUN_METHOD); + this.jarRelocatorRunMethod.setAccessible(true); + } catch (Exception e) { + try { + if (classLoader instanceof IsolatedClassLoader isolatedClassLoader) { + isolatedClassLoader.close(); + } + } catch (IOException ex) { + e.addSuppressed(ex); + } + throw new RuntimeException(e); + } + } + + public void remap(Path input, Path output, List relocations) throws Exception { + Map mappings = new HashMap<>(); + for (Relocation relocation : relocations) { + mappings.put(relocation.getPattern(), relocation.getRelocatedPattern()); + } + + Object relocator = this.jarRelocatorConstructor.newInstance(input.toFile(), output.toFile(), mappings); + this.jarRelocatorRunMethod.invoke(relocator); + } +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/plugin/gui/AbstractGui.java b/core/src/main/java/net/momirealms/craftengine/core/plugin/gui/AbstractGui.java new file mode 100644 index 000000000..ae31bcc63 --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/plugin/gui/AbstractGui.java @@ -0,0 +1,101 @@ +package net.momirealms.craftengine.core.plugin.gui; + +import net.kyori.adventure.text.Component; +import net.momirealms.craftengine.core.entity.player.Player; +import net.momirealms.craftengine.core.plugin.CraftEngine; +import org.jetbrains.annotations.Nullable; + +import java.util.function.Consumer; + +public abstract class AbstractGui implements Gui { + protected Component title; + protected final int width; + protected final int height; + protected final GuiElement[] guiElements; + protected final Consumer inventoryClickConsumer; + protected final Inventory inventory; + + public AbstractGui(GuiLayout layout, Consumer inventoryClickConsumer) { + this.width = layout.width(); + this.height = layout.height(); + this.guiElements = layout.createElements(this); + this.inventoryClickConsumer = inventoryClickConsumer; + this.title = Component.empty(); + this.inventory = CraftEngine.instance().guiManager().createInventory(this, size()); + } + + @Override + public Gui refresh() { + int i = 0; + for (GuiElement guiElement : this.guiElements) { + this.inventory.setItem(i++, guiElement.item()); + } + return this; + } + + public void handleGuiClick(Click click) { + GuiElement element = this.guiElements[click.slot()]; + if (element != null) { + element.handleClick(click); + } else { + click.cancel(); + } + } + + public void handleInventoryClick(Click click) { + this.inventoryClickConsumer.accept(click); + } + + @Override + public Inventory inventory() { + return inventory; + } + + @Override + public Component title() { + return title; + } + + @Override + public AbstractGui title(Component title) { + this.title = title; + return this; + } + + @Override + public void open(Player player) { + this.inventory.open(player, this.title); + } + + @Override + public void onTimer() { + for (GuiElement guiElement : this.guiElements) { + guiElement.onTimer(); + } + } + + @Override + public int height() { + return this.height; + } + + @Override + public int width() { + return this.width; + } + + @Override + public void setElement(int index, @Nullable GuiElement element) { + this.guiElements[index] = element; + } + + @Override + public boolean hasElement(int index) { + return this.guiElements[index] != null; + } + + @Override + public void removeElement(int index) { + this.guiElements[index] = null; + } +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/plugin/gui/BasicGui.java b/core/src/main/java/net/momirealms/craftengine/core/plugin/gui/BasicGui.java new file mode 100644 index 000000000..5e77d97f5 --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/plugin/gui/BasicGui.java @@ -0,0 +1,8 @@ +package net.momirealms.craftengine.core.plugin.gui; + +public interface BasicGui extends Gui { + + static BasicGuiImpl.Builder builder() { + return new BasicGuiImpl.Builder(); + } +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/plugin/gui/BasicGuiImpl.java b/core/src/main/java/net/momirealms/craftengine/core/plugin/gui/BasicGuiImpl.java new file mode 100644 index 000000000..61f3ec49b --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/plugin/gui/BasicGuiImpl.java @@ -0,0 +1,36 @@ +package net.momirealms.craftengine.core.plugin.gui; + +import java.util.function.Consumer; + +public class BasicGuiImpl extends AbstractGui implements BasicGui { + + public BasicGuiImpl(GuiLayout layout, Consumer inventoryClickConsumer) { + super(layout, inventoryClickConsumer); + } + + public static Builder builder() { + return new Builder(); + } + + public static class Builder { + private GuiLayout layout; + private Consumer inventoryClickConsumer = Click::cancel; + + public Builder() { + } + + public Builder layout(GuiLayout layout) { + this.layout = layout; + return this; + } + + public Builder inventoryClickConsumer(Consumer inventoryClickConsumer) { + this.inventoryClickConsumer = inventoryClickConsumer; + return this; + } + + public BasicGui build() { + return new BasicGuiImpl(layout, inventoryClickConsumer); + } + } +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/plugin/gui/Click.java b/core/src/main/java/net/momirealms/craftengine/core/plugin/gui/Click.java new file mode 100644 index 000000000..5c0810f89 --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/plugin/gui/Click.java @@ -0,0 +1,26 @@ +package net.momirealms.craftengine.core.plugin.gui; + +import net.momirealms.craftengine.core.entity.player.Player; +import net.momirealms.craftengine.core.item.Item; + +public interface Click { + Gui gui(); + + Inventory clickedInventory(); + + int slot(); + + void cancel(); + + boolean isCancelled(); + + String type(); + + int hotBarKey(); + + Player clicker(); + + void setItemOnCursor(Item item); + + Item itemOnCursor(); +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/plugin/gui/Gui.java b/core/src/main/java/net/momirealms/craftengine/core/plugin/gui/Gui.java new file mode 100644 index 000000000..499c6a074 --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/plugin/gui/Gui.java @@ -0,0 +1,50 @@ +package net.momirealms.craftengine.core.plugin.gui; + +import net.kyori.adventure.text.Component; +import net.momirealms.craftengine.core.entity.player.Player; +import org.jetbrains.annotations.Nullable; + +public interface Gui { + + Gui refresh(); + + default int size() { + return width() * height(); + } + + int height(); + + int width(); + + default int coordinateToIndex(int x, int y) { + return y * width() + x; + } + + void setElement(int index, @Nullable GuiElement element); + + default void setElement(int x, int y, @Nullable GuiElement element) { + setElement(coordinateToIndex(x, y), element); + } + + boolean hasElement(int index); + + default boolean hasElement(int x, int y) { + return hasElement(coordinateToIndex(x, y)); + } + + void removeElement(int index); + + default void removeElement(int x, int y) { + removeElement(coordinateToIndex(x, y)); + } + + Inventory inventory(); + + Component title(); + + Gui title(Component title); + + void open(Player player); + + void onTimer(); +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/plugin/gui/GuiElement.java b/core/src/main/java/net/momirealms/craftengine/core/plugin/gui/GuiElement.java new file mode 100644 index 000000000..ae89d0b8e --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/plugin/gui/GuiElement.java @@ -0,0 +1,206 @@ +package net.momirealms.craftengine.core.plugin.gui; + +import net.momirealms.craftengine.core.item.Item; +import net.momirealms.craftengine.core.plugin.gui.category.ItemBrowserManager; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +import java.util.List; +import java.util.function.BiConsumer; +import java.util.function.Function; + +public interface GuiElement { + + static GuiElement EMPTY = GuiElement.constant(null, (e, c) -> c.cancel()); + + @Nullable + Item item(); + + void handleClick(Click click); + + default void onTimer() { + } + + static GuiElement dynamic(Function> itemSupplier, BiConsumer action) { + return new DynamicGuiItemElement(itemSupplier, action); + } + + static GuiElement paged(Function> itemSupplier, boolean nextOrPrevious) { + return new PagedGuiElement(itemSupplier, nextOrPrevious); + } + + static GuiElement ordered(int order) { + return new PageOrderedGuiElement(order); + } + + static GuiElement constant(Item item, BiConsumer action) { + return new ConstantGuiElement(item, action); + } + + static GuiElement recipeIngredient(List> ingredients, BiConsumer action) { + return new RecipeIngredientGuiElement(ingredients, action); + } + + abstract class AbstractGuiElement implements GuiElement { + protected Gui gui; + + public void notifyItemUpdate() { + gui().refresh(); + } + + public void setGui(Gui gui) { + this.gui = gui; + } + + public Gui gui() { + return gui; + } + } + + class RecipeIngredientGuiElement extends AbstractGuiElement { + private int ingredientIndex; + private final List> ingredients; + private final BiConsumer action; + + public RecipeIngredientGuiElement(List> ingredients, BiConsumer action) { + this.ingredients = ingredients; + this.ingredientIndex = 0; + this.action = action; + } + + @Override + public @NotNull Item item() { + return this.ingredients.get(this.ingredientIndex); + } + + @Override + public void handleClick(Click click) { + this.action.accept(this, click); + } + + @Override + public void onTimer() { + int previous = this.ingredientIndex; + increaseIndex(); + if (previous != ingredientIndex) { + notifyItemUpdate(); + } + } + + public void increaseIndex() { + this.ingredientIndex++; + if (this.ingredientIndex >= this.ingredients.size()) { + this.ingredientIndex = 0; + } + } + } + + class ConstantGuiElement extends AbstractGuiElement { + private final BiConsumer action; + private final Item item; + + public ConstantGuiElement(Item item, BiConsumer action) { + this.item = item; + this.action = action; + } + + @Override + public Item item() { + return item; + } + + @Override + public void handleClick(Click click) { + this.action.accept(this, click); + } + } + + class PageOrderedGuiElement extends AbstractGuiElement { + private final int index; + + public PageOrderedGuiElement(int index) { + this.index = index; + } + + @Override + public PagedGui gui() { + return (PagedGui) super.gui(); + } + + @Override + public Item item() { + return gui().itemAt(index).item(); + } + + @Override + public void handleClick(Click click) { + this.gui().itemAt(order()).action().accept(this, click); + } + + public int order() { + return index; + } + } + + class PagedGuiElement extends AbstractGuiElement { + private final Function> itemSupplier; + private final boolean nextOrPrevious; + + public PagedGuiElement(Function> itemSupplier, boolean nextOrPrevious) { + this.itemSupplier = itemSupplier; + this.nextOrPrevious = nextOrPrevious; + } + + @Override + public Item item() { + return itemSupplier.apply(this); + } + + @Override + public void handleClick(Click click) { + click.cancel(); + PagedGui pagedGui = gui(); + boolean changed = false; + if (this.nextOrPrevious) { + if (pagedGui.hasNextPage()) { + pagedGui.goNextPage(); + changed = true; + } + } else { + if (pagedGui.hasPreviousPage()) { + pagedGui.goPreviousPage(); + changed = true; + } + } + if (changed) { + click.clicker().playSound(ItemBrowserManager.Constants.SOUND_CHANGE_PAGE, 0.25f, 1); + notifyItemUpdate(); + } + } + + @Override + public PagedGui gui() { + return (PagedGui) super.gui(); + } + } + + class DynamicGuiItemElement extends AbstractGuiElement { + private final BiConsumer action; + private final Function> itemSupplier; + + public DynamicGuiItemElement(Function> itemSupplier, BiConsumer action) { + this.itemSupplier = itemSupplier; + this.action = action; + } + + @Override + public Item item() { + return itemSupplier.apply(this); + } + + @Override + public void handleClick(Click click) { + this.action.accept(this, click); + } + } +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/plugin/gui/GuiElementMissingException.java b/core/src/main/java/net/momirealms/craftengine/core/plugin/gui/GuiElementMissingException.java new file mode 100644 index 000000000..e846e649f --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/plugin/gui/GuiElementMissingException.java @@ -0,0 +1,8 @@ +package net.momirealms.craftengine.core.plugin.gui; + +public class GuiElementMissingException extends RuntimeException { + + public GuiElementMissingException(String message) { + super(message); + } +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/plugin/gui/GuiLayout.java b/core/src/main/java/net/momirealms/craftengine/core/plugin/gui/GuiLayout.java new file mode 100644 index 000000000..0aa6afd7e --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/plugin/gui/GuiLayout.java @@ -0,0 +1,83 @@ +package net.momirealms.craftengine.core.plugin.gui; + +import java.util.*; + +public class GuiLayout { + private final Map elements = new HashMap<>(); + private final int width; + private final int height; + private final char[][] layout; + + public GuiLayout(char[][] layout) { + this.elements.put(' ', Ingredient.EMPTY); + this.layout = layout; + this.height = layout.length; + if (height == 0) { + throw new IllegalArgumentException("Layout must have at least one element"); + } else { + this.width = layout[0].length; + if (this.width == 0) { + throw new IllegalArgumentException("Layout must have at least one element"); + } + } + } + + public GuiLayout(String... layout) { + this(createLayout(layout)); + } + + private static char[][] createLayout(String... layout) { + List rows = new ArrayList<>(); + Collections.addAll(rows, layout); + int height = rows.size(); + if (height == 0) { + return new char[0][0]; + } + int width = layout[0].length(); + char[][] array = new char[height][width]; + for (int i = 0; i < height; i++) { + String row = rows.get(i); + if (row.length() != width) { + throw new IllegalArgumentException("All rows must have the same length as the first row (" + width + ")"); + } + array[i] = row.toCharArray(); + } + return array; + } + + public int height() { + return height; + } + + public int width() { + return width; + } + + public GuiLayout addIngredient(char c, GuiElement supplier) { + this.elements.put(c, Ingredient.simple(supplier)); + return this; + } + + public GuiLayout addIngredient(char c, Ingredient ingredient) { + this.elements.put(c, ingredient); + return this; + } + + public GuiElement[] createElements(Gui gui) { + List elementsList = new ArrayList<>(); + for (int i = 0; i < this.height; i++) { + for (int j = 0; j < this.width; j++) { + char c = this.layout[i][j]; + Ingredient ingredient = this.elements.get(c); + if (ingredient == null) { + throw new IllegalStateException("No ingredient registered for character: " + c); + } + GuiElement.AbstractGuiElement element = (GuiElement.AbstractGuiElement) ingredient.element(gui); + element.setGui(gui); + elementsList.add(element); + } + } + GuiElement[] result = new GuiElement[elementsList.size()]; + return elementsList.toArray(result); + } +} \ No newline at end of file diff --git a/core/src/main/java/net/momirealms/craftengine/core/plugin/gui/GuiManager.java b/core/src/main/java/net/momirealms/craftengine/core/plugin/gui/GuiManager.java new file mode 100644 index 000000000..8cca44c58 --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/plugin/gui/GuiManager.java @@ -0,0 +1,10 @@ +package net.momirealms.craftengine.core.plugin.gui; + +import net.momirealms.craftengine.core.plugin.Reloadable; + +public interface GuiManager extends Reloadable { + + Inventory createInventory(Gui gui, int size); + + void delayedInit(); +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/plugin/gui/GuiParameters.java b/core/src/main/java/net/momirealms/craftengine/core/plugin/gui/GuiParameters.java new file mode 100644 index 000000000..283b42f9a --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/plugin/gui/GuiParameters.java @@ -0,0 +1,10 @@ +package net.momirealms.craftengine.core.plugin.gui; + +import net.momirealms.craftengine.core.util.context.ContextKey; + +public class GuiParameters { + public static final ContextKey MAX_PAGE = ContextKey.of("max_page"); + public static final ContextKey CURRENT_PAGE = ContextKey.of("current_page"); + public static final ContextKey COOKING_TIME = ContextKey.of("cooking_time"); + public static final ContextKey COOKING_EXPERIENCE = ContextKey.of("cooking_experience"); +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/plugin/gui/Ingredient.java b/core/src/main/java/net/momirealms/craftengine/core/plugin/gui/Ingredient.java new file mode 100644 index 000000000..01609a435 --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/plugin/gui/Ingredient.java @@ -0,0 +1,39 @@ +package net.momirealms.craftengine.core.plugin.gui; + +public interface Ingredient { + Ingredient EMPTY = gui -> GuiElement.constant(null, (e, c) -> c.cancel()); + + GuiElement element(Gui gui); + + static Ingredient simple(GuiElement element) { + return new SimpleIngredient(element); + } + + static Ingredient paged() { + return new PagedIngredient(); + } + + class SimpleIngredient implements Ingredient { + private final GuiElement element; + + public SimpleIngredient(GuiElement element) { + this.element = element; + } + + @Override + public GuiElement element(Gui gui) { + return element; + } + } + + class PagedIngredient implements Ingredient { + private int order = 0; + + public PagedIngredient() {} + + @Override + public GuiElement element(Gui gui) { + return GuiElement.ordered(order++); + } + } +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/plugin/gui/Inventory.java b/core/src/main/java/net/momirealms/craftengine/core/plugin/gui/Inventory.java new file mode 100644 index 000000000..f1a1ab8ee --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/plugin/gui/Inventory.java @@ -0,0 +1,13 @@ +package net.momirealms.craftengine.core.plugin.gui; + +import net.kyori.adventure.text.Component; +import net.momirealms.craftengine.core.entity.player.Player; +import net.momirealms.craftengine.core.item.Item; +import org.jetbrains.annotations.Nullable; + +public interface Inventory { + + void open(Player player, Component title); + + void setItem(int index, @Nullable Item item); +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/plugin/gui/ItemWithAction.java b/core/src/main/java/net/momirealms/craftengine/core/plugin/gui/ItemWithAction.java new file mode 100644 index 000000000..06d95301f --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/plugin/gui/ItemWithAction.java @@ -0,0 +1,9 @@ +package net.momirealms.craftengine.core.plugin.gui; + +import net.momirealms.craftengine.core.item.Item; + +import java.util.function.BiConsumer; + +public record ItemWithAction(Item item, BiConsumer action) { + public static final ItemWithAction EMPTY = new ItemWithAction(null, (e, c) -> c.cancel()); +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/plugin/gui/PagedGui.java b/core/src/main/java/net/momirealms/craftengine/core/plugin/gui/PagedGui.java new file mode 100644 index 000000000..b6e4528b8 --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/plugin/gui/PagedGui.java @@ -0,0 +1,44 @@ +package net.momirealms.craftengine.core.plugin.gui; + +import java.util.List; + +public interface PagedGui extends Gui { + + List items(); + + ItemWithAction itemAt(int index); + + void setPage(int page); + + int currentPage(); + + int maxPages(); + + default boolean hasNextPage() { + return currentPage() < maxPages(); + } + + default boolean hasPreviousPage() { + return currentPage() > 1; + } + + default void goNextPage() { + if (hasNextPage()) { + setPage(currentPage() + 1); + } else { + setPage(1); + } + } + + default void goPreviousPage() { + if (hasPreviousPage()) { + setPage(currentPage() - 1); + } else { + setPage(maxPages()); + } + } + + static PagedGuiImpl.Builder builder() { + return new PagedGuiImpl.Builder(); + } +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/plugin/gui/PagedGuiImpl.java b/core/src/main/java/net/momirealms/craftengine/core/plugin/gui/PagedGuiImpl.java new file mode 100644 index 000000000..c5d520849 --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/plugin/gui/PagedGuiImpl.java @@ -0,0 +1,85 @@ +package net.momirealms.craftengine.core.plugin.gui; + +import java.util.ArrayList; +import java.util.List; +import java.util.function.Consumer; + +public class PagedGuiImpl extends AbstractGui implements PagedGui { + private final List itemsWithFunction; + private final int maxPages; + private final int elementsPerPage; + private int currentPage; + + public PagedGuiImpl(GuiLayout layout, Consumer inventoryClickConsumer, List itemsWithFunction) { + super(layout, inventoryClickConsumer); + this.itemsWithFunction = itemsWithFunction; + int i = 0; + for (GuiElement element : this.guiElements) { + if (element instanceof GuiElement.PageOrderedGuiElement) { + i++; + } + } + this.elementsPerPage = i; + this.maxPages = Math.max(1, (itemsWithFunction.size() - 1) / i + 1); + this.currentPage = 1; + } + + @Override + public List items() { + return this.itemsWithFunction; + } + + @Override + public ItemWithAction itemAt(int index) { + int rawIndex = (currentPage - 1) * elementsPerPage + index; + if (rawIndex >= itemsWithFunction.size()) return ItemWithAction.EMPTY; + return this.itemsWithFunction.get(rawIndex); + } + + @Override + public void setPage(int page) { + this.currentPage = page; + } + + @Override + public int currentPage() { + return this.currentPage; + } + + @Override + public int maxPages() { + return this.maxPages; + } + + public static Builder builder() { + return new Builder(); + } + + public static class Builder { + private GuiLayout layout; + private Consumer inventoryClickConsumer = Click::cancel; + private final List items = new ArrayList<>(); + + public Builder() { + } + + public Builder layout(GuiLayout layout) { + this.layout = layout; + return this; + } + + public Builder inventoryClickConsumer(Consumer inventoryClickConsumer) { + this.inventoryClickConsumer = inventoryClickConsumer; + return this; + } + + public Builder addIngredients(List items) { + this.items.addAll(items); + return this; + } + + public PagedGuiImpl build() { + return new PagedGuiImpl(layout, inventoryClickConsumer, items); + } + } +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/plugin/gui/category/Category.java b/core/src/main/java/net/momirealms/craftengine/core/plugin/gui/category/Category.java new file mode 100644 index 000000000..b5b139770 --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/plugin/gui/category/Category.java @@ -0,0 +1,71 @@ +package net.momirealms.craftengine.core.plugin.gui.category; + +import net.momirealms.craftengine.core.util.Key; +import org.jetbrains.annotations.NotNull; + +import java.util.ArrayList; +import java.util.List; + +public class Category implements Comparable { + private final Key id; + private final String displayName; + private final List displayLore; + private final Key icon; + private final List members; + private final int priority; + private final boolean hidden; + + public Category(Key id, String displayName, List displayLore, Key icon, List members, int priority, boolean hidden) { + this.id = id; + this.displayName = displayName; + this.members = new ArrayList<>(members); + this.icon = icon; + this.priority = priority; + this.displayLore = new ArrayList<>(displayLore); + this.hidden = hidden; + } + + public void addMember(String member) { + if (!this.members.contains(member)) { + this.members.add(member); + } + } + + public Key id() { + return id; + } + + public String displayName() { + return displayName; + } + + public Key icon() { + return icon; + } + + public boolean hidden() { + return hidden; + } + + public List displayLore() { + return displayLore; + } + + public List members() { + return members; + } + + public void merge(Category other) { + for (String member : other.members) { + addMember(member); + } + } + + @Override + public int compareTo(@NotNull Category o) { + if (this.priority != o.priority) { + return this.priority - o.priority; + } + return String.CASE_INSENSITIVE_ORDER.compare(this.id.toString(), o.id.toString()); + } +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/plugin/gui/category/ItemBrowserManager.java b/core/src/main/java/net/momirealms/craftengine/core/plugin/gui/category/ItemBrowserManager.java new file mode 100644 index 000000000..c234b0d6e --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/plugin/gui/category/ItemBrowserManager.java @@ -0,0 +1,112 @@ +package net.momirealms.craftengine.core.plugin.gui.category; + +import dev.dejvokep.boostedyaml.block.implementation.Section; +import net.momirealms.craftengine.core.entity.player.Player; +import net.momirealms.craftengine.core.pack.LoadingSequence; +import net.momirealms.craftengine.core.plugin.Reloadable; +import net.momirealms.craftengine.core.plugin.config.ConfigManager; +import net.momirealms.craftengine.core.plugin.config.ConfigSectionParser; +import net.momirealms.craftengine.core.util.Key; + +import java.util.Optional; +import java.util.TreeSet; + +import static java.util.Objects.requireNonNull; + +public interface ItemBrowserManager extends Reloadable, ConfigSectionParser { + String CONFIG_SECTION_NAME = "categories"; + int MAX_RECIPE_DEPTH = 16; + String GET_ITEM_PERMISSION = "craftengine.browser.get_item"; + + default String sectionId() { + return CONFIG_SECTION_NAME; + } + + default int loadingSequence() { + return LoadingSequence.CATEGORY; + } + + void delayedLoad(); + + void open(Player player); + + TreeSet categories(); + + Optional byId(Key key); + + class Constants { + public static String BROWSER_TITLE; + public static Key BROWSER_NEXT_PAGE_AVAILABLE; + public static Key BROWSER_NEXT_PAGE_BLOCK; + public static Key BROWSER_PREVIOUS_PAGE_AVAILABLE; + public static Key BROWSER_PREVIOUS_PAGE_BLOCK; + + public static String CATEGORY_TITLE; + public static Key CATEGORY_BACK; + public static Key CATEGORY_NEXT_PAGE_AVAILABLE; + public static Key CATEGORY_NEXT_PAGE_BLOCK; + public static Key CATEGORY_PREVIOUS_PAGE_AVAILABLE; + public static Key CATEGORY_PREVIOUS_PAGE_BLOCK; + + public static String RECIPE_NONE_TITLE; + public static String RECIPE_BLASTING_TITLE; + public static String RECIPE_SMELTING_TITLE; + public static String RECIPE_SMOKING_TITLE; + public static String RECIPE_CAMPFIRE_TITLE; + public static String RECIPE_CRAFTING_TITLE; + public static String RECIPE_STONECUTTING_TITLE; + public static Key RECIPE_BACK; + public static Key RECIPE_NEXT_PAGE_AVAILABLE; + public static Key RECIPE_NEXT_PAGE_BLOCK; + public static Key RECIPE_PREVIOUS_PAGE_AVAILABLE; + public static Key RECIPE_PREVIOUS_PAGE_BLOCK; + public static Key RECIPE_GET_ITEM; + public static Key RECIPE_COOKING_INFO; + + public static Key SOUND_CHANGE_PAGE; + public static Key SOUND_RETURN_PAGE; + public static Key SOUND_PICK_ITEM; + public static Key SOUND_CLICK_BUTTON; + + public static void load() { + Section section = ConfigManager.instance().settings().getSection("gui.browser"); + if (section == null) return; + BROWSER_TITLE = getOrThrow(section, "main.title"); + BROWSER_NEXT_PAGE_AVAILABLE = Key.of(getOrThrow(section, "main.page-navigation.next.available")); + BROWSER_NEXT_PAGE_BLOCK = Key.of(getOrThrow(section, "main.page-navigation.next.not-available")); + BROWSER_PREVIOUS_PAGE_AVAILABLE = Key.of(getOrThrow(section, "main.page-navigation.previous.available")); + BROWSER_PREVIOUS_PAGE_BLOCK = Key.of(getOrThrow(section, "main.page-navigation.previous.not-available")); + + CATEGORY_TITLE = getOrThrow(section, "category.title"); + CATEGORY_BACK = Key.of(getOrThrow(section, "category.page-navigation.return")); + CATEGORY_NEXT_PAGE_AVAILABLE = Key.of(getOrThrow(section, "category.page-navigation.next.available")); + CATEGORY_NEXT_PAGE_BLOCK = Key.of(getOrThrow(section, "category.page-navigation.next.not-available")); + CATEGORY_PREVIOUS_PAGE_AVAILABLE = Key.of(getOrThrow(section, "category.page-navigation.previous.available")); + CATEGORY_PREVIOUS_PAGE_BLOCK = Key.of(getOrThrow(section, "category.page-navigation.previous.not-available")); + + RECIPE_NONE_TITLE = getOrThrow(section, "recipe.none.title"); + RECIPE_BLASTING_TITLE = getOrThrow(section, "recipe.blasting.title"); + RECIPE_SMELTING_TITLE = getOrThrow(section, "recipe.smelting.title"); + RECIPE_SMOKING_TITLE = getOrThrow(section, "recipe.smoking.title"); + RECIPE_CAMPFIRE_TITLE = getOrThrow(section, "recipe.campfire.title"); + RECIPE_CRAFTING_TITLE = getOrThrow(section, "recipe.crafting.title"); + RECIPE_STONECUTTING_TITLE = getOrThrow(section, "recipe.stonecutting.title"); + RECIPE_BACK = Key.of(getOrThrow(section, "recipe.page-navigation.return")); + RECIPE_NEXT_PAGE_AVAILABLE = Key.of(getOrThrow(section, "recipe.page-navigation.next.available")); + RECIPE_NEXT_PAGE_BLOCK = Key.of(getOrThrow(section, "recipe.page-navigation.next.not-available")); + RECIPE_PREVIOUS_PAGE_AVAILABLE = Key.of(getOrThrow(section, "recipe.page-navigation.previous.available")); + RECIPE_PREVIOUS_PAGE_BLOCK = Key.of(getOrThrow(section, "recipe.page-navigation.previous.not-available")); + RECIPE_GET_ITEM = Key.of(getOrThrow(section, "recipe.get-item-icon")); + RECIPE_COOKING_INFO = Key.of(getOrThrow(section, "recipe.cooking-information-icon")); + + SOUND_CHANGE_PAGE = Key.of(getOrThrow(section, "sounds.change-page")); + SOUND_RETURN_PAGE = Key.of(getOrThrow(section, "sounds.return-page")); + SOUND_PICK_ITEM = Key.of(getOrThrow(section, "sounds.pick-item")); + SOUND_CLICK_BUTTON = Key.of(getOrThrow(section, "sounds.click-button")); + } + + private static String getOrThrow(Section section, String route) { + return requireNonNull(section.getString(route), "gui.browser." + route); + } + } +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/plugin/gui/category/ItemBrowserManagerImpl.java b/core/src/main/java/net/momirealms/craftengine/core/plugin/gui/category/ItemBrowserManagerImpl.java new file mode 100644 index 000000000..603dec99e --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/plugin/gui/category/ItemBrowserManagerImpl.java @@ -0,0 +1,678 @@ +package net.momirealms.craftengine.core.plugin.gui.category; + +import net.momirealms.craftengine.core.entity.player.Player; +import net.momirealms.craftengine.core.item.Item; +import net.momirealms.craftengine.core.item.ItemBuildContext; +import net.momirealms.craftengine.core.item.ItemKeys; +import net.momirealms.craftengine.core.item.recipe.*; +import net.momirealms.craftengine.core.pack.Pack; +import net.momirealms.craftengine.core.plugin.CraftEngine; +import net.momirealms.craftengine.core.plugin.gui.Ingredient; +import net.momirealms.craftengine.core.plugin.gui.*; +import net.momirealms.craftengine.core.registry.Holder; +import net.momirealms.craftengine.core.util.AdventureHelper; +import net.momirealms.craftengine.core.util.Key; +import net.momirealms.craftengine.core.util.MiscUtils; +import net.momirealms.craftengine.core.util.context.ContextHolder; + +import java.nio.file.Path; +import java.util.*; + +@SuppressWarnings("DuplicatedCode") +public class ItemBrowserManagerImpl implements ItemBrowserManager { + private static final Set MOVE_TO_OTHER_INV = Set.of("SHIFT_LEFT", "SHIFT_RIGHT"); + private static final Set LEFT_CLICK = Set.of("LEFT", "SHIFT_LEFT"); + private static final Set RIGHT_CLICK = Set.of("RIGHT", "SHIFT_RIGHT"); + private static final Set MIDDLE_CLICK = Set.of("MIDDLE"); + private static final Set DOUBLE_CLICK = Set.of("DOUBLE_CLICK"); + private final CraftEngine plugin; + private final Map byId; + private final TreeSet categoryOnMainPage; + + public ItemBrowserManagerImpl(CraftEngine plugin) { + this.plugin = plugin; + this.byId = new HashMap<>(); + this.categoryOnMainPage = new TreeSet<>(); + } + + @Override + public void unload() { + this.byId.clear(); + this.categoryOnMainPage.clear(); + } + + public void delayedLoad() { + for (Category category : this.byId.values()) { + if (!category.hidden()) { + this.categoryOnMainPage.add(category); + } + } + Constants.load(); + } + + @Override + public void open(Player player) { + openItemBrowser(player); + } + + @Override + public void parseSection(Pack pack, Path path, Key id, Map section) { + String name = section.getOrDefault("name", id).toString(); + List members = MiscUtils.getAsStringList(section.getOrDefault("list", List.of())); + Key icon = Key.of(section.getOrDefault("icon", ItemKeys.STONE).toString()); + if (this.plugin.itemManager().getCustomItem(icon).isEmpty()) { + icon = ItemKeys.STONE; + } + int priority = MiscUtils.getAsInt(section.getOrDefault("priority", 0)); + Category category = new Category(id, name, MiscUtils.getAsStringList(section.getOrDefault("lore", List.of())), icon, members.stream().distinct().toList(), priority, (boolean) section.getOrDefault("hidden", false)); + if (this.byId.containsKey(id)) { + this.byId.get(id).merge(category); + } else { + this.byId.put(id, category); + } + } + + @Override + public TreeSet categories() { + return categoryOnMainPage; + } + + @Override + public Optional byId(Key key) { + return Optional.ofNullable(this.byId.get(key)); + } + + public void openItemBrowser(Player player) { + GuiLayout layout = new GuiLayout( + "AAAAAAAAA", + "AAAAAAAAA", + "AAAAAAAAA", + "AAAAAAAAA", + "AAAAAAAAA", + " < > " + ) + .addIngredient('A', Ingredient.paged()) + .addIngredient('>', GuiElement.paged((element) -> { + Key next = element.gui().hasNextPage() ? Constants.BROWSER_NEXT_PAGE_AVAILABLE : Constants.BROWSER_NEXT_PAGE_BLOCK; + return this.plugin.itemManager().getCustomItem(next) + .map(it -> it.buildItem(ItemBuildContext.of(player, ContextHolder.builder() + .withParameter(GuiParameters.CURRENT_PAGE, String.valueOf(element.gui().currentPage())) + .withParameter(GuiParameters.MAX_PAGE, String.valueOf(element.gui().maxPages())) + .build()))) + .orElseThrow(() -> new GuiElementMissingException("Can't find gui element " + next)); + }, true) + ) + .addIngredient('<', GuiElement.paged((element) -> { + Key previous = element.gui().hasPreviousPage() ? Constants.BROWSER_PREVIOUS_PAGE_AVAILABLE : Constants.BROWSER_PREVIOUS_PAGE_BLOCK; + return this.plugin.itemManager().getCustomItem(previous) + .map(it -> it.buildItem(ItemBuildContext.of(player, ContextHolder.builder() + .withParameter(GuiParameters.CURRENT_PAGE, String.valueOf(element.gui().currentPage())) + .withParameter(GuiParameters.MAX_PAGE, String.valueOf(element.gui().maxPages())) + .build()))) + .orElseThrow(() -> new GuiElementMissingException("Can't find gui element " + previous)); + }, false) + ); + + List iconList = this.categoryOnMainPage.stream().map(it -> { + Item item = this.plugin.itemManager().createWrappedItem(it.icon(), player); + if (item == null) { + this.plugin.logger().warn("Can't not find item " + it.icon() + " for category icon"); + return null; + } + item.displayName(AdventureHelper.componentToJson(AdventureHelper.miniMessage().deserialize(it.displayName(), ItemBuildContext.EMPTY.tagResolvers()))); + item.lore(it.displayLore().stream().map(lore -> AdventureHelper.componentToJson(AdventureHelper.miniMessage().deserialize(lore, ItemBuildContext.EMPTY.tagResolvers()))).toList()); + item.load(); + return new ItemWithAction(item, (element, click) -> { + click.cancel(); + player.playSound(Constants.SOUND_CLICK_BUTTON); + openCategoryPage(click.clicker(), it.id(), element.gui()); + }); + }).filter(Objects::nonNull).toList(); + + PagedGui.builder() + .addIngredients(iconList) + .layout(layout) + .inventoryClickConsumer(c -> { + if (MOVE_TO_OTHER_INV.contains(c.type()) || DOUBLE_CLICK.contains(c.type())) { + c.cancel(); + } + }) + .build() + .title(AdventureHelper.miniMessage().deserialize(Constants.BROWSER_TITLE, ItemBuildContext.of(player, ContextHolder.EMPTY).tagResolvers())) + .refresh() + .open(player); + } + + public void openCategoryPage(Player player, Key categoryId, Gui parentGui) { + GuiLayout layout = new GuiLayout( + "AAAAAAAAA", + "AAAAAAAAA", + "AAAAAAAAA", + "AAAAAAAAA", + "AAAAAAAAA", + " < = > " + ) + .addIngredient('A', Ingredient.paged()) + .addIngredient('=', GuiElement.constant(this.plugin.itemManager().getCustomItem(Constants.CATEGORY_BACK) + .map(it -> it.buildItem(ItemBuildContext.of(player, ContextHolder.EMPTY))) + .orElseThrow(() -> new GuiElementMissingException("Can't find gui element " + Constants.CATEGORY_BACK)), + ((element, click) -> { + click.cancel(); + player.playSound(Constants.SOUND_RETURN_PAGE, 0.25f, 1); + parentGui.open(player); + })) + ) + .addIngredient('>', GuiElement.paged((element) -> { + Key next = element.gui().hasNextPage() ? Constants.CATEGORY_NEXT_PAGE_AVAILABLE : Constants.CATEGORY_NEXT_PAGE_BLOCK; + return this.plugin.itemManager().getCustomItem(next) + .map(it -> it.buildItem(ItemBuildContext.of(player, ContextHolder.builder() + .withParameter(GuiParameters.CURRENT_PAGE, String.valueOf(element.gui().currentPage())) + .withParameter(GuiParameters.MAX_PAGE, String.valueOf(element.gui().maxPages())) + .build()))) + .orElseThrow(() -> new GuiElementMissingException("Can't find gui element " + next)); + }, true) + ) + .addIngredient('<', GuiElement.paged((element) -> { + Key previous = element.gui().hasPreviousPage() ? Constants.CATEGORY_PREVIOUS_PAGE_AVAILABLE : Constants.CATEGORY_PREVIOUS_PAGE_BLOCK; + return this.plugin.itemManager().getCustomItem(previous) + .map(it -> it.buildItem(ItemBuildContext.of(player, ContextHolder.builder() + .withParameter(GuiParameters.CURRENT_PAGE, String.valueOf(element.gui().currentPage())) + .withParameter(GuiParameters.MAX_PAGE, String.valueOf(element.gui().maxPages())) + .build()))) + .orElseThrow(() -> new GuiElementMissingException("Can't find gui element " + previous)); + }, false) + ); + + Optional optionalCategory = byId(categoryId); + if (optionalCategory.isEmpty()) { + this.plugin.logger().warn("Can't find category " + categoryId); + return; + } + + Category category = optionalCategory.get(); + + List itemList = category.members().stream().map(it -> { + if (it.charAt(0) == '#') { + String subCategoryId = it.substring(1); + Category subCategory = this.byId.get(Key.of(subCategoryId)); + if (subCategory == null) return null; + Item item = this.plugin.itemManager().createWrappedItem(subCategory.icon(), player); + if (item == null) { + this.plugin.logger().warn("Can't not find item " + subCategory.icon() + " for category icon"); + return null; + } + item.displayName(AdventureHelper.componentToJson(AdventureHelper.miniMessage().deserialize(subCategory.displayName(), ItemBuildContext.EMPTY.tagResolvers()))); + item.lore(subCategory.displayLore().stream().map(lore -> AdventureHelper.componentToJson(AdventureHelper.miniMessage().deserialize(lore, ItemBuildContext.EMPTY.tagResolvers()))).toList()); + item.load(); + return new ItemWithAction(item, (element, click) -> { + click.cancel(); + player.playSound(Constants.SOUND_CLICK_BUTTON); + openCategoryPage(click.clicker(), subCategory.id(), element.gui()); + }); + } else { + Key itemId = Key.of(it); + Item item = this.plugin.itemManager().createWrappedItem(itemId, player); + if (item == null) return null; + return new ItemWithAction(item, (e, c) -> { + c.cancel(); + if (MIDDLE_CLICK.contains(c.type()) && player.isCreativeMode() && player.hasPermission(GET_ITEM_PERMISSION) && c.itemOnCursor() == null) { + Item newItem = this.plugin.itemManager().createWrappedItem(e.item().id(), player); + newItem.count(newItem.maxStackSize()); + c.setItemOnCursor(newItem); + return; + } + List> inRecipes = this.plugin.recipeManager().getRecipeByResult(itemId); + player.playSound(Constants.SOUND_CLICK_BUTTON); + if (!inRecipes.isEmpty()) { + openRecipePage(c.clicker(), itemId, e.gui(), inRecipes, 0, 0); + } else { + openNoRecipePage(player, itemId, e.gui()); + } + }); + } + }).filter(Objects::nonNull).toList(); + + PagedGui.builder() + .addIngredients(itemList) + .layout(layout) + .inventoryClickConsumer(c -> { + if (MOVE_TO_OTHER_INV.contains(c.type()) || DOUBLE_CLICK.contains(c.type())) { + c.cancel(); + } + }) + .build() + .title(AdventureHelper.miniMessage().deserialize(Constants.CATEGORY_TITLE, ItemBuildContext.of(player, ContextHolder.EMPTY).tagResolvers())) + .refresh() + .open(player); + } + + public void openNoRecipePage(Player player, Key result, Gui parentGui) { + GuiLayout layout = new GuiLayout( + " ", + " ", + " X ", + " ^ ", + " ", + " = " + ) + .addIngredient('X', GuiElement.constant(this.plugin.itemManager().createWrappedItem(result, player), (e, c) -> { + c.cancel(); + if (MIDDLE_CLICK.contains(c.type()) && player.isCreativeMode() && player.hasPermission(GET_ITEM_PERMISSION) && c.itemOnCursor() == null) { + Item item = this.plugin.itemManager().createWrappedItem(result, player); + item.count(item.maxStackSize()); + c.setItemOnCursor(item); + } + })) + .addIngredient('^', player.hasPermission(GET_ITEM_PERMISSION) ? GuiElement.constant(this.plugin.itemManager().createWrappedItem(Constants.RECIPE_GET_ITEM, player), (e, c) -> { + c.cancel(); + player.playSound(Constants.SOUND_PICK_ITEM); + if (LEFT_CLICK.contains(c.type())) { + player.giveItem(this.plugin.itemManager().createWrappedItem(result, player)); + } else if (RIGHT_CLICK.contains(c.type())) { + Item item = this.plugin.itemManager().createWrappedItem(result, player); + player.giveItem(item.count(item.maxStackSize())); + } + }) : GuiElement.EMPTY) + .addIngredient('=', GuiElement.constant(this.plugin.itemManager().getCustomItem(Constants.RECIPE_BACK) + .map(it -> it.buildItem(ItemBuildContext.of(player, ContextHolder.EMPTY))) + .orElseThrow(() -> new GuiElementMissingException("Can't find gui element " + Constants.RECIPE_BACK)), + ((element, click) -> { + click.cancel(); + player.playSound(Constants.SOUND_RETURN_PAGE, 0.25f, 1); + parentGui.open(player); + })) + ); + + BasicGui.builder() + .layout(layout) + .inventoryClickConsumer(c -> { + if (MOVE_TO_OTHER_INV.contains(c.type()) || DOUBLE_CLICK.contains(c.type())) { + c.cancel(); + } + }) + .build() + .title(AdventureHelper.miniMessage().deserialize(Constants.RECIPE_NONE_TITLE, ItemBuildContext.of(player, ContextHolder.EMPTY).tagResolvers())) + .refresh() + .open(player); + } + + public void openRecipePage(Player player, Key result, Gui parentGui, List> recipes, int index, int depth) { + if (index >= recipes.size()) return; + if (depth > MAX_RECIPE_DEPTH) return; + Recipe recipe = recipes.get(index); + Key recipeType = recipe.type(); + if (recipeType == RecipeTypes.SHAPELESS || recipeType == RecipeTypes.SHAPED) { + openCraftingRecipePage(player, result, (CustomCraftingTableRecipe) recipe, parentGui, recipes, index, depth); + return; + } + if (recipeType == RecipeTypes.BLASTING || recipeType == RecipeTypes.CAMPFIRE_COOKING || recipeType == RecipeTypes.SMOKING || recipeType == RecipeTypes.SMELTING) { + openCookingRecipePage(player, result, (CustomCookingRecipe) recipe, parentGui, recipes, index, depth); + return; + } + if (recipeType == RecipeTypes.STONE_CUTTING) { + openStoneCuttingRecipePage(player, result, (CustomStoneCuttingRecipe) recipe, parentGui, recipes, index, depth); + return; + } + } + + public void openStoneCuttingRecipePage(Player player, Key result, CustomStoneCuttingRecipe recipe, Gui parentGui, List> recipes, int index, int depth) { + Key previous = index > 0 ? Constants.RECIPE_PREVIOUS_PAGE_AVAILABLE : Constants.RECIPE_PREVIOUS_PAGE_BLOCK; + Key next = index + 1 < recipes.size() ? Constants.RECIPE_NEXT_PAGE_AVAILABLE : Constants.RECIPE_NEXT_PAGE_BLOCK; + + List> ingredients = new ArrayList<>(); + net.momirealms.craftengine.core.item.recipe.Ingredient ingredient = recipe.ingredient(); + for (Holder in : ingredient.items()) { + ingredients.add(this.plugin.itemManager().createWrappedItem(in.value(), player)); + } + GuiLayout layout = new GuiLayout( + " ", + " ", + " A X ", + " ^ ", + " ", + " < = > " + ) + .addIngredient('X', GuiElement.constant(this.plugin.itemManager().createWrappedItem(result, player).count(recipe.result().count()), (e, c) -> { + c.cancel(); + if (MIDDLE_CLICK.contains(c.type()) && player.isCreativeMode() && player.hasPermission(GET_ITEM_PERMISSION) && c.itemOnCursor() == null) { + Item item = this.plugin.itemManager().createWrappedItem(result, player); + item.count(item.maxStackSize()); + c.setItemOnCursor(item); + } + })) + .addIngredient('^', player.hasPermission(GET_ITEM_PERMISSION) ? GuiElement.constant(this.plugin.itemManager().createWrappedItem(Constants.RECIPE_GET_ITEM, player), (e, c) -> { + c.cancel(); + player.playSound(Constants.SOUND_PICK_ITEM); + if (LEFT_CLICK.contains(c.type())) { + player.giveItem(this.plugin.itemManager().createWrappedItem(result, player)); + } else if (RIGHT_CLICK.contains(c.type())) { + Item item = this.plugin.itemManager().createWrappedItem(result, player); + player.giveItem(item.count(item.maxStackSize())); + } + }) : GuiElement.EMPTY) + .addIngredient('A', GuiElement.recipeIngredient(ingredients, (e, c) -> { + c.cancel(); + if (MIDDLE_CLICK.contains(c.type()) && player.isCreativeMode() && player.hasPermission(GET_ITEM_PERMISSION) && c.itemOnCursor() == null) { + Item item = this.plugin.itemManager().createWrappedItem(e.item().id(), player); + item.count(item.maxStackSize()); + c.setItemOnCursor(item); + return; + } + List> inRecipes = plugin.recipeManager().getRecipeByResult(e.item().id()); + if (!inRecipes.isEmpty()) { + player.playSound(Constants.SOUND_CLICK_BUTTON); + openRecipePage(player, e.item().id(), e.gui(), inRecipes, 0, depth + 1); + } + })) + .addIngredient('=', GuiElement.constant(this.plugin.itemManager().getCustomItem(Constants.RECIPE_BACK) + .map(it -> it.buildItem(ItemBuildContext.of(player, ContextHolder.EMPTY))) + .orElseThrow(() -> new GuiElementMissingException("Can't find gui element " + Constants.RECIPE_BACK)), + ((element, click) -> { + click.cancel(); + player.playSound(Constants.SOUND_RETURN_PAGE, 0.25f, 1); + parentGui.open(player); + })) + ) + .addIngredient('>', GuiElement.constant(this.plugin.itemManager() + .getCustomItem(next) + .map(it -> it.buildItem(ItemBuildContext.of(player, ContextHolder.builder() + .withParameter(GuiParameters.CURRENT_PAGE, String.valueOf(index + 1)) + .withParameter(GuiParameters.MAX_PAGE, String.valueOf(recipes.size())) + .build()))) + .orElseThrow(() -> new GuiElementMissingException("Can't find gui element " + next)), (e, c) -> { + c.cancel(); + if (index + 1 < recipes.size()) { + player.playSound(Constants.SOUND_CHANGE_PAGE, 0.25f, 1); + openRecipePage(player, result, parentGui, recipes, index + 1, depth); + } + })) + .addIngredient('<', GuiElement.constant(this.plugin.itemManager() + .getCustomItem(previous) + .map(it -> it.buildItem(ItemBuildContext.of(player, ContextHolder.builder() + .withParameter(GuiParameters.CURRENT_PAGE, String.valueOf(index + 1)) + .withParameter(GuiParameters.MAX_PAGE, String.valueOf(recipes.size())) + .build()))) + .orElseThrow(() -> new GuiElementMissingException("Can't find gui element " + previous)), (e, c) -> { + c.cancel(); + if (index > 0) { + player.playSound(Constants.SOUND_CHANGE_PAGE, 0.25f, 1); + openRecipePage(player, result, parentGui, recipes, index - 1, depth); + } + })); + + BasicGui.builder() + .layout(layout) + .inventoryClickConsumer(c -> { + if (MOVE_TO_OTHER_INV.contains(c.type()) || DOUBLE_CLICK.contains(c.type())) { + c.cancel(); + } + }) + .build() + .title(AdventureHelper.miniMessage().deserialize(Constants.RECIPE_STONECUTTING_TITLE, ItemBuildContext.of(player, ContextHolder.EMPTY).tagResolvers())) + .refresh() + .open(player); + } + + public void openCookingRecipePage(Player player, Key result, CustomCookingRecipe recipe, Gui parentGui, List> recipes, int index, int depth) { + Key previous = index > 0 ? Constants.RECIPE_PREVIOUS_PAGE_AVAILABLE : Constants.RECIPE_PREVIOUS_PAGE_BLOCK; + Key next = index + 1 < recipes.size() ? Constants.RECIPE_NEXT_PAGE_AVAILABLE : Constants.RECIPE_NEXT_PAGE_BLOCK; + + List> ingredients = new ArrayList<>(); + net.momirealms.craftengine.core.item.recipe.Ingredient ingredient = recipe.ingredient(); + for (Holder in : ingredient.items()) { + ingredients.add(this.plugin.itemManager().createWrappedItem(in.value(), player)); + } + GuiLayout layout = new GuiLayout( + " ", + " ", + " A X ", + " ? ^ ", + " ", + " < = > " + ) + .addIngredient('X', GuiElement.constant(this.plugin.itemManager().createWrappedItem(result, player).count(recipe.result().count()), (e, c) -> { + c.cancel(); + if (MIDDLE_CLICK.contains(c.type()) && player.isCreativeMode() && player.hasPermission(GET_ITEM_PERMISSION) && c.itemOnCursor() == null) { + Item item = this.plugin.itemManager().createWrappedItem(result, player); + item.count(item.maxStackSize()); + c.setItemOnCursor(item); + } + })) + .addIngredient('?', GuiElement.constant(this.plugin.itemManager().getCustomItem(Constants.RECIPE_COOKING_INFO) + .map(it -> it.buildItem(ItemBuildContext.of(player, ContextHolder.builder() + .withParameter(GuiParameters.COOKING_TIME, String.valueOf(recipe.cookingTime())) + .withParameter(GuiParameters.COOKING_EXPERIENCE, String.valueOf(recipe.experience())) + .build()))) + .orElseThrow(() -> new GuiElementMissingException("Can't find gui element " + Constants.RECIPE_COOKING_INFO)), (e, c) -> c.cancel())) + .addIngredient('^', player.hasPermission(GET_ITEM_PERMISSION) ? GuiElement.constant(this.plugin.itemManager().createWrappedItem(Constants.RECIPE_GET_ITEM, player), (e, c) -> { + c.cancel(); + player.playSound(Constants.SOUND_PICK_ITEM); + if (LEFT_CLICK.contains(c.type())) { + player.giveItem(this.plugin.itemManager().createWrappedItem(result, player)); + } else if (RIGHT_CLICK.contains(c.type())) { + Item item = this.plugin.itemManager().createWrappedItem(result, player); + player.giveItem(item.count(item.maxStackSize())); + } + }) : GuiElement.EMPTY) + .addIngredient('A', GuiElement.recipeIngredient(ingredients, (e, c) -> { + c.cancel(); + if (MIDDLE_CLICK.contains(c.type()) && player.isCreativeMode() && player.hasPermission(GET_ITEM_PERMISSION) && c.itemOnCursor() == null) { + Item item = this.plugin.itemManager().createWrappedItem(e.item().id(), player); + item.count(item.maxStackSize()); + c.setItemOnCursor(item); + return; + } + List> inRecipes = plugin.recipeManager().getRecipeByResult(e.item().id()); + if (!inRecipes.isEmpty()) { + player.playSound(Constants.SOUND_CLICK_BUTTON); + openRecipePage(player, e.item().id(), e.gui(), inRecipes, 0, depth + 1); + } + })) + .addIngredient('=', GuiElement.constant(this.plugin.itemManager().getCustomItem(Constants.RECIPE_BACK) + .map(it -> it.buildItem(ItemBuildContext.of(player, ContextHolder.EMPTY))) + .orElseThrow(() -> new GuiElementMissingException("Can't find gui element " + Constants.RECIPE_BACK)), + ((element, click) -> { + click.cancel(); + player.playSound(Constants.SOUND_RETURN_PAGE, 0.25f, 1); + parentGui.open(player); + })) + ) + .addIngredient('>', GuiElement.constant(this.plugin.itemManager() + .getCustomItem(next) + .map(it -> it.buildItem(ItemBuildContext.of(player, ContextHolder.builder() + .withParameter(GuiParameters.CURRENT_PAGE, String.valueOf(index + 1)) + .withParameter(GuiParameters.MAX_PAGE, String.valueOf(recipes.size())) + .build()))) + .orElseThrow(() -> new GuiElementMissingException("Can't find gui element " + next)), (e, c) -> { + c.cancel(); + if (index + 1 < recipes.size()) { + player.playSound(Constants.SOUND_CHANGE_PAGE, 0.25f, 1); + openRecipePage(player, result, parentGui, recipes, index + 1, depth); + } + })) + .addIngredient('<', GuiElement.constant(this.plugin.itemManager() + .getCustomItem(previous) + .map(it -> it.buildItem(ItemBuildContext.of(player, ContextHolder.builder() + .withParameter(GuiParameters.CURRENT_PAGE, String.valueOf(index + 1)) + .withParameter(GuiParameters.MAX_PAGE, String.valueOf(recipes.size())) + .build()))) + .orElseThrow(() -> new GuiElementMissingException("Can't find gui element " + previous)), (e, c) -> { + c.cancel(); + if (index > 0) { + player.playSound(Constants.SOUND_CHANGE_PAGE, 0.25f, 1); + openRecipePage(player, result, parentGui, recipes, index - 1, depth); + } + })); + + String title; + if (recipe.type() == RecipeTypes.SMELTING) { + title = Constants.RECIPE_SMELTING_TITLE; + } else if (recipe.type() == RecipeTypes.BLASTING) { + title = Constants.RECIPE_BLASTING_TITLE; + } else if (recipe.type() == RecipeTypes.CAMPFIRE_COOKING) { + title = Constants.RECIPE_CAMPFIRE_TITLE; + } else { + title = Constants.RECIPE_SMOKING_TITLE; + } + + BasicGui.builder() + .layout(layout) + .inventoryClickConsumer(c -> { + if (MOVE_TO_OTHER_INV.contains(c.type()) || DOUBLE_CLICK.contains(c.type())) { + c.cancel(); + } + }) + .build() + .title(AdventureHelper.miniMessage().deserialize(title, ItemBuildContext.of(player, ContextHolder.EMPTY).tagResolvers())) + .refresh() + .open(player); + } + + public void openCraftingRecipePage(Player player, Key result, CustomCraftingTableRecipe recipe, Gui parentGui, List> recipes, int index, int depth) { + Key previous = index > 0 ? Constants.RECIPE_PREVIOUS_PAGE_AVAILABLE : Constants.RECIPE_PREVIOUS_PAGE_BLOCK; + Key next = index + 1 < recipes.size() ? Constants.RECIPE_NEXT_PAGE_AVAILABLE : Constants.RECIPE_NEXT_PAGE_BLOCK; + + GuiLayout layout = new GuiLayout( + " ", + " ABC ", + " DEF X ", + " GHI ^ ", + " ", + " < = > " + ) + .addIngredient('X', GuiElement.constant(this.plugin.itemManager().createWrappedItem(result, player).count(recipe.result().count()), (e, c) -> { + c.cancel(); + if (MIDDLE_CLICK.contains(c.type()) && player.isCreativeMode() && player.hasPermission(GET_ITEM_PERMISSION) && c.itemOnCursor() == null) { + Item item = this.plugin.itemManager().createWrappedItem(result, player); + item.count(item.maxStackSize()); + c.setItemOnCursor(item); + } + })) + .addIngredient('^', player.hasPermission(GET_ITEM_PERMISSION) ? GuiElement.constant(this.plugin.itemManager().createWrappedItem(Constants.RECIPE_GET_ITEM, player), (e, c) -> { + c.cancel(); + player.playSound(Constants.SOUND_PICK_ITEM); + if (LEFT_CLICK.contains(c.type())) { + player.giveItem(this.plugin.itemManager().createWrappedItem(result, player)); + } else if (RIGHT_CLICK.contains(c.type())) { + Item item = this.plugin.itemManager().createWrappedItem(result, player); + player.giveItem(item.count(item.maxStackSize())); + } + }) : GuiElement.EMPTY) + .addIngredient('=', GuiElement.constant(this.plugin.itemManager().getCustomItem(Constants.RECIPE_BACK) + .map(it -> it.buildItem(ItemBuildContext.of(player, ContextHolder.EMPTY))) + .orElseThrow(() -> new GuiElementMissingException("Can't find gui element " + Constants.RECIPE_BACK)), + ((element, click) -> { + click.cancel(); + player.playSound(Constants.SOUND_RETURN_PAGE, 0.25f, 1); + parentGui.open(player); + })) + ) + .addIngredient('>', GuiElement.constant(this.plugin.itemManager() + .getCustomItem(next) + .map(it -> it.buildItem(ItemBuildContext.of(player, ContextHolder.builder() + .withParameter(GuiParameters.CURRENT_PAGE, String.valueOf(index + 1)) + .withParameter(GuiParameters.MAX_PAGE, String.valueOf(recipes.size())) + .build()))) + .orElseThrow(() -> new GuiElementMissingException("Can't find gui element " + next)), (e, c) -> { + c.cancel(); + if (index + 1 < recipes.size()) { + player.playSound(Constants.SOUND_CHANGE_PAGE, 0.25f, 1); + openRecipePage(player, result, parentGui, recipes, index + 1, depth); + } + })) + .addIngredient('<', GuiElement.constant(this.plugin.itemManager() + .getCustomItem(previous) + .map(it -> it.buildItem(ItemBuildContext.of(player, ContextHolder.builder() + .withParameter(GuiParameters.CURRENT_PAGE, String.valueOf(index + 1)) + .withParameter(GuiParameters.MAX_PAGE, String.valueOf(recipes.size())) + .build()))) + .orElseThrow(() -> new GuiElementMissingException("Can't find gui element " + previous)), (e, c) -> { + c.cancel(); + if (index > 0) { + player.playSound(Constants.SOUND_CHANGE_PAGE, 0.25f, 1); + openRecipePage(player, result, parentGui, recipes, index - 1, depth); + } + })); + + char start = 'A'; + if (recipe.type() == RecipeTypes.SHAPED) { + String[] pattern = ((CustomShapedRecipe) recipe).pattern().pattern(); + for (int x = 0; x < 3; x++) { + for (int y = 0; y < 3; y++) { + char currentChar = (char) (start + x + y * 3); + if (x < pattern[0].length() && y < pattern.length) { + char ingredientChar = pattern[y].charAt(x); + net.momirealms.craftengine.core.item.recipe.Ingredient ingredient = ((CustomShapedRecipe) recipe).pattern().ingredients().get(ingredientChar); + if (ingredient == null) { + layout.addIngredient(currentChar, Ingredient.EMPTY); + } else { + List> ingredients = new ArrayList<>(); + for (Holder in : ingredient.items()) { + ingredients.add(this.plugin.itemManager().createWrappedItem(in.value(), player)); + } + layout.addIngredient(currentChar, GuiElement.recipeIngredient(ingredients, (e, c) -> { + c.cancel(); + if (MIDDLE_CLICK.contains(c.type()) && player.isCreativeMode() && player.hasPermission(GET_ITEM_PERMISSION) && c.itemOnCursor() == null) { + Item item = this.plugin.itemManager().createWrappedItem(e.item().id(), player); + item.count(item.maxStackSize()); + c.setItemOnCursor(item); + return; + } + List> inRecipes = this.plugin.recipeManager().getRecipeByResult(e.item().id()); + if (!inRecipes.isEmpty()) { + player.playSound(Constants.SOUND_CLICK_BUTTON); + openRecipePage(player, e.item().id(), e.gui(), inRecipes, 0, depth + 1); + } + })); + } + } else { + layout.addIngredient(currentChar, Ingredient.EMPTY); + } + } + } + } else { + List> ingredients = ((CustomShapelessRecipe) recipe).ingredients(); + int i = 0; + for (int x = 0; x < 3; x++) { + for (int y = 0; y < 3; y++) { + char currentChar = (char) (start + x + y * 3); + if (i < ingredients.size()) { + List> ingredientItems = new ArrayList<>(); + for (Holder in : ingredients.get(i).items()) { + ingredientItems.add(this.plugin.itemManager().createWrappedItem(in.value(), player)); + } + layout.addIngredient(currentChar, GuiElement.recipeIngredient(ingredientItems, (e, c) -> { + c.cancel(); + if (MIDDLE_CLICK.contains(c.type()) && player.isCreativeMode() && player.hasPermission(GET_ITEM_PERMISSION) && c.itemOnCursor() == null) { + Item item = this.plugin.itemManager().createWrappedItem(e.item().id(), player); + item.count(item.maxStackSize()); + c.setItemOnCursor(item); + return; + } + List> inRecipes = this.plugin.recipeManager().getRecipeByResult(e.item().id()); + if (!inRecipes.isEmpty()) { + player.playSound(Constants.SOUND_CLICK_BUTTON); + openRecipePage(player, e.item().id(), e.gui(), inRecipes, 0, depth + 1); + } + })); + } else { + layout.addIngredient(currentChar, Ingredient.EMPTY); + } + i++; + } + } + } + + BasicGui.builder() + .layout(layout) + .inventoryClickConsumer(c -> { + if (MOVE_TO_OTHER_INV.contains(c.type()) || DOUBLE_CLICK.contains(c.type())) { + c.cancel(); + } + }) + .build() + .title(AdventureHelper.miniMessage().deserialize(Constants.RECIPE_CRAFTING_TITLE, ItemBuildContext.of(player, ContextHolder.EMPTY).tagResolvers())) + .refresh() + .open(player); + } +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/plugin/locale/ClientLangManager.java b/core/src/main/java/net/momirealms/craftengine/core/plugin/locale/ClientLangManager.java new file mode 100644 index 000000000..e109988f3 --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/plugin/locale/ClientLangManager.java @@ -0,0 +1,23 @@ +package net.momirealms.craftengine.core.plugin.locale; + +import net.momirealms.craftengine.core.pack.LoadingSequence; +import net.momirealms.craftengine.core.plugin.Reloadable; +import net.momirealms.craftengine.core.plugin.config.ConfigSectionParser; + +import java.util.Map; + +public interface ClientLangManager extends Reloadable, ConfigSectionParser { + String CONFIG_SECTION_NAME = "lang"; + + Map langData(); + + @Override + default int loadingSequence() { + return LoadingSequence.LANG; + } + + @Override + default String sectionId() { + return CONFIG_SECTION_NAME; + } +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/plugin/locale/ClientLangMangerImpl.java b/core/src/main/java/net/momirealms/craftengine/core/plugin/locale/ClientLangMangerImpl.java new file mode 100644 index 000000000..29cc9fe41 --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/plugin/locale/ClientLangMangerImpl.java @@ -0,0 +1,72 @@ +package net.momirealms.craftengine.core.plugin.locale; + +import net.momirealms.craftengine.core.pack.Pack; +import net.momirealms.craftengine.core.plugin.Plugin; +import net.momirealms.craftengine.core.util.Key; + +import java.nio.file.Path; +import java.util.*; +import java.util.stream.Collectors; + +public class ClientLangMangerImpl implements ClientLangManager { + private final Plugin plugin; + private final Map i18nData = new HashMap<>(); + private final Set allLang = Set.of( + "af_za", "ar_sa", "ast_es", "az_az", "ba_ru", "bar", "be_by", "be_latn", + "bg_bg", "br_fr", "brb", "bs_ba", "ca_es", "cs_cz", "cy_gb", "da_dk", + "de_at", "de_ch", "de_de", "el_gr", "en_au", "en_ca", "en_gb", "en_nz", + "en_pt", "en_ud", "en_us", "enp", "enws", "eo_uy", "es_ar", "es_cl", + "es_ec", "es_es", "es_mx", "es_uy", "es_ve", "esan", "et_ee", "eu_es", + "fa_ir", "fi_fi", "fil_ph", "fo_fo", "fr_ca", "fr_fr", "fra_de", "fur_it", + "fy_nl", "ga_ie", "gd_gb", "gl_es", "haw_us", "he_il", "hi_in", "hn_no", + "hr_hr", "hu_hu", "hy_am", "id_id", "ig_ng", "io_en", "is_is", "isv", + "it_it", "ja_jp", "jbo_en", "ka_ge", "kk_kz", "kn_in", "ko_kr", "ksh", + "kw_gb", "la_la", "lb_lu", "li_li", "lmo", "lo_la", "lol_us", "lt_lt", + "lv_lv", "lzh", "mk_mk", "mn_mn", "ms_my", "mt_mt", "nah", "nds_de", + "nl_be", "nl_nl", "nn_no", "no_no", "oc_fr", "ovd", "pl_pl", "pls", + "pt_br", "pt_pt", "qya_aa", "ro_ro", "rpr", "ru_ru", "ry_ua", "sah_sah", + "se_no", "sk_sk", "sl_si", "so_so", "sq_al", "sr_cs", "sr_sp", "sv_se", + "sxu", "szl", "ta_in", "th_th", "tl_ph", "tlh_aa", "tok", "tr_tr", + "tt_ru", "tzo_mx", "uk_ua", "val_es", "vec_it", "vi_vn", "vp_vl", "yi_de", + "yo_ng", "zh_cn", "zh_hk", "zh_tw", "zlm_arab", "ky_kg" + ); + + public ClientLangMangerImpl(Plugin plugin) { + this.plugin = plugin; + } + + @Override + public void reload() { + this.i18nData.clear(); + } + + @Override + public void parseSection(Pack pack, Path path, Key id, Map section) { + String langId = id.value().toLowerCase(Locale.ROOT); + + Map sectionData = section.entrySet().stream() + .collect(Collectors.toMap( + Map.Entry::getKey, + entry -> String.valueOf(entry.getValue()) + )); + + if ("all".equals(langId)) { + allLang.forEach(lang -> { + I18NData data = new I18NData(); + data.translations.putAll(sectionData); + i18nData.put(lang, data); + }); + return; + } + + if (allLang.contains(langId)) { + i18nData.computeIfAbsent(langId, k -> new I18NData()) + .addTranslations(sectionData); + } + } + + @Override + public Map langData() { + return Collections.unmodifiableMap(i18nData); + } +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/plugin/locale/CraftEngineCaptionFormatter.java b/core/src/main/java/net/momirealms/craftengine/core/plugin/locale/CraftEngineCaptionFormatter.java new file mode 100644 index 000000000..917c60e1e --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/plugin/locale/CraftEngineCaptionFormatter.java @@ -0,0 +1,23 @@ +package net.momirealms.craftengine.core.plugin.locale; + +import net.kyori.adventure.text.Component; +import org.checkerframework.checker.nullness.qual.NonNull; +import org.incendo.cloud.caption.Caption; +import org.incendo.cloud.caption.CaptionVariable; +import org.incendo.cloud.minecraft.extras.caption.ComponentCaptionFormatter; + +import java.util.List; + +public class CraftEngineCaptionFormatter implements ComponentCaptionFormatter { + private final TranslationManager translationManager; + + public CraftEngineCaptionFormatter(final TranslationManager translationManager) { + this.translationManager = translationManager; + } + + @Override + public @NonNull Component formatCaption(@NonNull Caption captionKey, @NonNull C recipient, @NonNull String caption, @NonNull List<@NonNull CaptionVariable> variables) { + Component component = ComponentCaptionFormatter.translatable().formatCaption(captionKey, recipient, caption, variables); + return translationManager.render(component); + } +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/plugin/locale/CraftEngineCaptionProvider.java b/core/src/main/java/net/momirealms/craftengine/core/plugin/locale/CraftEngineCaptionProvider.java new file mode 100644 index 000000000..44c080490 --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/plugin/locale/CraftEngineCaptionProvider.java @@ -0,0 +1,16 @@ +package net.momirealms.craftengine.core.plugin.locale; + +import org.checkerframework.checker.nullness.qual.NonNull; +import org.incendo.cloud.caption.CaptionProvider; +import org.incendo.cloud.caption.DelegatingCaptionProvider; + +public final class CraftEngineCaptionProvider extends DelegatingCaptionProvider { + private static final CaptionProvider PROVIDER = CaptionProvider.constantProvider() + .build(); + + @SuppressWarnings("unchecked") + @Override + public @NonNull CaptionProvider delegate() { + return (CaptionProvider) PROVIDER; + } +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/plugin/locale/I18NData.java b/core/src/main/java/net/momirealms/craftengine/core/plugin/locale/I18NData.java new file mode 100644 index 000000000..9c05a8f43 --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/plugin/locale/I18NData.java @@ -0,0 +1,23 @@ +package net.momirealms.craftengine.core.plugin.locale; + +import org.jetbrains.annotations.Nullable; + +import java.util.HashMap; +import java.util.Map; + +public class I18NData { + public final Map translations = new HashMap<>(); + + public void addTranslations(Map data) { + translations.putAll(data); + } + + public void addTranslation(String key, String value) { + this.translations.put(key, value); + } + + @Nullable + public String translate(String key) { + return this.translations.get(key); + } +} \ No newline at end of file diff --git a/core/src/main/java/net/momirealms/craftengine/core/plugin/locale/MessageConstants.java b/core/src/main/java/net/momirealms/craftengine/core/plugin/locale/MessageConstants.java new file mode 100644 index 000000000..3d322fab1 --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/plugin/locale/MessageConstants.java @@ -0,0 +1,19 @@ +package net.momirealms.craftengine.core.plugin.locale; + +import net.kyori.adventure.text.Component; +import net.kyori.adventure.text.TranslatableComponent; + +public interface MessageConstants { + TranslatableComponent.Builder COMMAND_RELOAD_FAILURE_IS_LOADING = Component.translatable().key("command.reload.failure.is_reloading"); + TranslatableComponent.Builder COMMAND_RELOAD_CONFIG_SUCCESS = Component.translatable().key("command.reload.config.success"); + TranslatableComponent.Builder COMMAND_RELOAD_CONFIG_FAILURE = Component.translatable().key("command.reload.config.failure"); + TranslatableComponent.Builder COMMAND_RELOAD_PACK_SUCCESS = Component.translatable().key("command.reload.pack.success"); + TranslatableComponent.Builder COMMAND_RELOAD_PACK_FAILURE = Component.translatable().key("command.reload.pack.failure"); + TranslatableComponent.Builder COMMAND_RELOAD_ALL_SUCCESS = Component.translatable().key("command.reload.all.success"); + TranslatableComponent.Builder COMMAND_RELOAD_ALL_FAILURE = Component.translatable().key("command.reload.all.failure"); + TranslatableComponent.Builder COMMAND_ITEM_GET_SUCCESS = Component.translatable().key("command.item.get.success"); + TranslatableComponent.Builder COMMAND_ITEM_GET_FAILURE_NOT_EXIST = Component.translatable().key("command.item.get.failure.not_exist"); + TranslatableComponent.Builder COMMAND_ITEM_GIVE_SUCCESS_SINGLE = Component.translatable().key("command.item.give.success.single"); + TranslatableComponent.Builder COMMAND_ITEM_GIVE_SUCCESS_MULTIPLE = Component.translatable().key("command.item.give.success.multiple"); + TranslatableComponent.Builder COMMAND_ITEM_GIVE_FAILURE_NOT_EXIST = Component.translatable().key("command.item.give.failure.not_exist"); +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/plugin/locale/MiniMessageTranslationRegistry.java b/core/src/main/java/net/momirealms/craftengine/core/plugin/locale/MiniMessageTranslationRegistry.java new file mode 100644 index 000000000..99d7b098b --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/plugin/locale/MiniMessageTranslationRegistry.java @@ -0,0 +1,49 @@ +package net.momirealms.craftengine.core.plugin.locale; + +import net.kyori.adventure.key.Key; +import net.kyori.adventure.text.minimessage.MiniMessage; +import net.kyori.adventure.translation.Translator; +import org.jetbrains.annotations.NotNull; + +import java.util.Locale; +import java.util.Map; + +import static java.util.Objects.requireNonNull; + +public interface MiniMessageTranslationRegistry extends Translator { + static @NotNull MiniMessageTranslationRegistry create(final Key name, final MiniMessage miniMessage) { + return new MiniMessageTranslationRegistryImpl(requireNonNull(name, "name"), requireNonNull(miniMessage, "MiniMessage")); + } + + void register(@NotNull String key, @NotNull Locale locale, @NotNull String format); + + void unregister(@NotNull String key); + + boolean contains(@NotNull String key); + + String miniMessageTranslation(@NotNull String key, @NotNull Locale locale); + + void defaultLocale(@NotNull Locale defaultLocale); + + default void registerAll(final @NotNull Locale locale, final @NotNull Map bundle) { + IllegalArgumentException firstError = null; + int errorCount = 0; + for (final Map.Entry entry : bundle.entrySet()) { + try { + this.register(entry.getKey(), locale, entry.getValue()); + } catch (final IllegalArgumentException e) { + if (firstError == null) { + firstError = e; + } + errorCount++; + } + } + if (firstError != null) { + if (errorCount == 1) { + throw firstError; + } else if (errorCount > 1) { + throw new IllegalArgumentException(String.format("Invalid key (and %d more)", errorCount - 1), firstError); + } + } + } +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/plugin/locale/MiniMessageTranslationRegistryImpl.java b/core/src/main/java/net/momirealms/craftengine/core/plugin/locale/MiniMessageTranslationRegistryImpl.java new file mode 100644 index 000000000..689f4b715 --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/plugin/locale/MiniMessageTranslationRegistryImpl.java @@ -0,0 +1,187 @@ +package net.momirealms.craftengine.core.plugin.locale; + +import net.kyori.adventure.internal.Internals; +import net.kyori.adventure.key.Key; +import net.kyori.adventure.text.Component; +import net.kyori.adventure.text.TranslatableComponent; +import net.kyori.adventure.text.minimessage.MiniMessage; +import net.kyori.adventure.util.TriState; +import net.kyori.examination.Examinable; +import net.kyori.examination.ExaminableProperty; +import net.momirealms.craftengine.core.plugin.minimessage.ImageTag; +import net.momirealms.craftengine.core.plugin.minimessage.IndexedArgumentTag; +import net.momirealms.craftengine.core.plugin.minimessage.ShiftTag; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +import java.text.MessageFormat; +import java.util.Locale; +import java.util.Map; +import java.util.Objects; +import java.util.concurrent.ConcurrentHashMap; +import java.util.stream.Stream; + +import static java.util.Objects.requireNonNull; + +public class MiniMessageTranslationRegistryImpl implements Examinable, MiniMessageTranslationRegistry { + private final Key name; + private final Map translations = new ConcurrentHashMap<>(); + private Locale defaultLocale = Locale.US; + private final MiniMessage miniMessage; + + MiniMessageTranslationRegistryImpl(final Key name, final MiniMessage miniMessage) { + this.name = name; + this.miniMessage = miniMessage; + } + + @Override + public void register(final @NotNull String key, final @NotNull Locale locale, final @NotNull String format) { + this.translations.computeIfAbsent(key, Translation::new).register(locale, format); + } + + @Override + public void unregister(final @NotNull String key) { + this.translations.remove(key); + } + + @Override + public boolean contains(final @NotNull String key) { + return this.translations.containsKey(key); + } + + @Override + public @NotNull Key name() { + return name; + } + + @Override + public @Nullable MessageFormat translate(@NotNull String key, @NotNull Locale locale) { + // No need to implement this method + return null; + } + + @Override + public @Nullable Component translate(@NotNull TranslatableComponent component, @NotNull Locale locale) { + Translation translation = translations.get(component.key()); + if (translation == null) { + return null; + } + String miniMessageString = translation.translate(locale); + if (miniMessageString == null) { + return null; + } + if (miniMessageString.isEmpty()) { + return Component.empty(); + } + final Component resultingComponent; + if (component.arguments().isEmpty()) { + resultingComponent = this.miniMessage.deserialize(miniMessageString, ShiftTag.INSTANCE, ImageTag.INSTANCE); + } else { + resultingComponent = this.miniMessage.deserialize(miniMessageString, new IndexedArgumentTag(component.arguments()), ShiftTag.INSTANCE, ImageTag.INSTANCE); + } + if (component.children().isEmpty()) { + return resultingComponent; + } else { + return resultingComponent.children(component.children()); + } + } + + @Override + public String miniMessageTranslation(@NotNull String key, @NotNull Locale locale) { + Translation translation = translations.get(key); + if (translation == null) { + return null; + } + return translation.translate(locale); + } + + @Override + public @NotNull TriState hasAnyTranslations() { + if (!this.translations.isEmpty()) { + return TriState.TRUE; + } + return TriState.FALSE; + } + + @Override + public void defaultLocale(final @NotNull Locale defaultLocale) { + this.defaultLocale = requireNonNull(defaultLocale, "defaultLocale"); + } + + @Override + public @NotNull Stream examinableProperties() { + return Stream.of(ExaminableProperty.of("translations", this.translations)); + } + + @Override + public boolean equals(final Object other) { + if (this == other) return true; + if (!(other instanceof MiniMessageTranslationRegistryImpl that)) return false; + return this.name.equals(that.name) + && this.translations.equals(that.translations) + && this.defaultLocale.equals(that.defaultLocale); + } + + @Override + public int hashCode() { + return Objects.hash(this.name, this.translations, this.defaultLocale); + } + + @Override + public String toString() { + return Internals.toString(this); + } + + final class Translation implements Examinable { + private final String key; + private final Map formats; + + Translation(final @NotNull String key) { + this.key = requireNonNull(key, "translation key"); + this.formats = new ConcurrentHashMap<>(); + } + + void register(final @NotNull Locale locale, final @NotNull String format) { + if (this.formats.putIfAbsent(requireNonNull(locale, "locale"), requireNonNull(format, "message format")) != null) { + throw new IllegalArgumentException(String.format("Translation already exists: %s for %s", this.key, locale)); + } + } + + @Nullable String translate(final @NotNull Locale locale) { + String format = this.formats.get(requireNonNull(locale, "locale")); + if (format == null) { + format = this.formats.get(Locale.of(locale.getLanguage())); // try without country + if (format == null) { + format = this.formats.get(MiniMessageTranslationRegistryImpl.this.defaultLocale); // try local default locale + } + } + return format; + } + + @Override + public @NotNull Stream examinableProperties() { + return Stream.of( + ExaminableProperty.of("key", this.key), + ExaminableProperty.of("formats", this.formats) + ); + } + + @Override + public boolean equals(final Object other) { + if (this == other) return true; + if (!(other instanceof Translation that)) return false; + return this.key.equals(that.key) && + this.formats.equals(that.formats); + } + + @Override + public int hashCode() { + return Objects.hash(this.key, this.formats); + } + + @Override + public String toString() { + return Internals.toString(this); + } + } +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/plugin/locale/MiniMessageTranslator.java b/core/src/main/java/net/momirealms/craftengine/core/plugin/locale/MiniMessageTranslator.java new file mode 100644 index 000000000..de6febf2f --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/plugin/locale/MiniMessageTranslator.java @@ -0,0 +1,29 @@ +package net.momirealms.craftengine.core.plugin.locale; + +import net.kyori.adventure.text.Component; +import net.kyori.adventure.text.renderer.TranslatableComponentRenderer; +import net.kyori.adventure.translation.Translator; +import net.kyori.examination.Examinable; +import org.jetbrains.annotations.NotNull; + +import java.util.Locale; + +public interface MiniMessageTranslator extends Translator, Examinable { + static @NotNull MiniMessageTranslator translator() { + return MiniMessageTranslatorImpl.INSTANCE; + } + + static @NotNull TranslatableComponentRenderer renderer() { + return MiniMessageTranslatorImpl.INSTANCE.renderer; + } + + static @NotNull Component render(final @NotNull Component component, final @NotNull Locale locale) { + return renderer().render(component, locale); + } + + @NotNull Iterable sources(); + + boolean addSource(final @NotNull Translator source); + + boolean removeSource(final @NotNull Translator source); +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/plugin/locale/MiniMessageTranslatorImpl.java b/core/src/main/java/net/momirealms/craftengine/core/plugin/locale/MiniMessageTranslatorImpl.java new file mode 100644 index 000000000..d5da280c8 --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/plugin/locale/MiniMessageTranslatorImpl.java @@ -0,0 +1,76 @@ +package net.momirealms.craftengine.core.plugin.locale; + +import net.kyori.adventure.key.Key; +import net.kyori.adventure.text.Component; +import net.kyori.adventure.text.TranslatableComponent; +import net.kyori.adventure.text.renderer.TranslatableComponentRenderer; +import net.kyori.adventure.translation.Translator; +import net.kyori.adventure.util.TriState; +import net.kyori.examination.ExaminableProperty; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +import java.text.MessageFormat; +import java.util.Collections; +import java.util.Locale; +import java.util.Set; +import java.util.concurrent.ConcurrentHashMap; +import java.util.stream.Stream; + +public class MiniMessageTranslatorImpl implements MiniMessageTranslator { + private static final Key NAME = Key.key("craftengine", "main"); + static final MiniMessageTranslatorImpl INSTANCE = new MiniMessageTranslatorImpl(); + final TranslatableComponentRenderer renderer = TranslatableComponentRenderer.usingTranslationSource(this); + private final Set sources = Collections.newSetFromMap(new ConcurrentHashMap<>()); + + @Override + public @NotNull Key name() { + return NAME; + } + + @Override + public @NotNull TriState hasAnyTranslations() { + if (!this.sources.isEmpty()) { + return TriState.TRUE; + } + return TriState.FALSE; + } + + @Override + public @Nullable MessageFormat translate(@NotNull String key, @NotNull Locale locale) { + // No need to implement this method + return null; + } + + @Override + public @Nullable Component translate(@NotNull TranslatableComponent component, @NotNull Locale locale) { + for (final Translator source : this.sources) { + final Component translation = source.translate(component, locale); + if (translation != null) { + return translation; + } + } + return null; + } + + @Override + public @NotNull Iterable sources() { + return Collections.unmodifiableSet(this.sources); + } + + @Override + public boolean addSource(final @NotNull Translator source) { + if (source == this) throw new IllegalArgumentException("MiniMessageTranslationSource"); + return this.sources.add(source); + } + + @Override + public boolean removeSource(final @NotNull Translator source) { + return this.sources.remove(source); + } + + @Override + public @NotNull Stream examinableProperties() { + return Stream.of(ExaminableProperty.of("sources", this.sources)); + } +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/plugin/locale/TranslationManager.java b/core/src/main/java/net/momirealms/craftengine/core/plugin/locale/TranslationManager.java new file mode 100644 index 000000000..cb8ec17e6 --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/plugin/locale/TranslationManager.java @@ -0,0 +1,51 @@ +package net.momirealms.craftengine.core.plugin.locale; + +import net.kyori.adventure.text.Component; +import net.kyori.adventure.translation.Translator; +import net.momirealms.craftengine.core.pack.LoadingSequence; +import net.momirealms.craftengine.core.plugin.Reloadable; +import net.momirealms.craftengine.core.plugin.config.ConfigSectionParser; +import org.jetbrains.annotations.Nullable; + +import java.util.Locale; + +public interface TranslationManager extends Reloadable, ConfigSectionParser { + String CONFIG_SECTION_NAME = "i18n"; + + static TranslationManager instance() { + return TranslationManagerImpl.instance; + } + + ClientLangManager clientLangManager(); + + default String miniMessageTranslation(String key) { + return miniMessageTranslation(key, null); + } + + void forcedLocale(Locale locale); + + String miniMessageTranslation(String key, @Nullable Locale locale); + + String translateI18NTag(String i18nId); + + default Component render(Component component) { + return render(component, null); + } + + Component render(Component component, @Nullable Locale locale); + + static @Nullable Locale parseLocale(@Nullable String locale) { + return locale == null || locale.isEmpty() ? null : Translator.parseLocale(locale); + } + + @Override + default int loadingSequence() { + return LoadingSequence.TRANSLATION; + } + + @Override + default String sectionId() { + return CONFIG_SECTION_NAME; + } + +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/plugin/locale/TranslationManagerImpl.java b/core/src/main/java/net/momirealms/craftengine/core/plugin/locale/TranslationManagerImpl.java new file mode 100644 index 000000000..6c1640fde --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/plugin/locale/TranslationManagerImpl.java @@ -0,0 +1,280 @@ +package net.momirealms.craftengine.core.plugin.locale; + +import net.kyori.adventure.key.Key; +import net.kyori.adventure.text.Component; +import net.momirealms.craftengine.core.pack.Pack; +import net.momirealms.craftengine.core.plugin.CraftEngine; +import net.momirealms.craftengine.core.plugin.Plugin; +import net.momirealms.craftengine.core.plugin.PluginProperties; +import net.momirealms.craftengine.core.plugin.config.StringKeyConstructor; +import net.momirealms.craftengine.core.util.AdventureHelper; +import net.momirealms.craftengine.core.util.Pair; +import org.jetbrains.annotations.Nullable; +import org.yaml.snakeyaml.DumperOptions; +import org.yaml.snakeyaml.LoaderOptions; +import org.yaml.snakeyaml.Yaml; +import org.yaml.snakeyaml.representer.Representer; + +import java.io.FileInputStream; +import java.io.IOException; +import java.io.InputStream; +import java.io.InputStreamReader; +import java.nio.charset.StandardCharsets; +import java.nio.file.Files; +import java.nio.file.Path; +import java.util.*; +import java.util.concurrent.ConcurrentHashMap; +import java.util.stream.Collectors; +import java.util.stream.Stream; + +public class TranslationManagerImpl implements TranslationManager { + private static final Locale DEFAULT_LOCALE = Locale.ENGLISH; + protected static TranslationManager instance; + private final Plugin plugin; + private final Set installed = ConcurrentHashMap.newKeySet(); + private final Path translationsDirectory; + private final Map i18nData = new HashMap<>(); + private final ClientLangManager clientLangManager; + private final String langVersion; + private final String[] supportedLanguages; + private final Map translationFallback = new LinkedHashMap<>(); + private Locale forcedLocale = null; + private Locale selectedLocale = DEFAULT_LOCALE; + private MiniMessageTranslationRegistry registry; + + public TranslationManagerImpl(Plugin plugin) { + this.plugin = plugin; + this.translationsDirectory = this.plugin.dataFolderPath().resolve("translations"); + this.clientLangManager = new ClientLangMangerImpl(plugin); + this.langVersion = PluginProperties.getValue("lang-version"); + this.supportedLanguages = PluginProperties.getValue("supported-languages").split(","); + instance = this; + + Yaml yaml = new Yaml(new StringKeyConstructor(new LoaderOptions())); + try (InputStream is = plugin.resourceStream("translations/en.yml")) { + this.translationFallback.putAll(yaml.load(is)); + } catch (IOException e) { + CraftEngine.instance().logger().warn("Failed to load default translation file", e); + } + } + + @Override + public void forcedLocale(Locale locale) { + this.forcedLocale = locale; + } + + @Override + public void reload() { + // clear old data + this.i18nData.clear(); + this.clientLangManager.reload(); + + // remove any previous registry + if (this.registry != null) { + MiniMessageTranslator.translator().removeSource(this.registry); + this.installed.clear(); + } + + // save resources + for (String lang : this.supportedLanguages) { + this.plugin.saveResource("translations/" + lang + ".yml"); + } + + this.registry = MiniMessageTranslationRegistry.create(Key.key("craftengine", "main"), AdventureHelper.miniMessage()); + this.registry.defaultLocale(DEFAULT_LOCALE); + this.loadFromFileSystem(this.translationsDirectory, false); + MiniMessageTranslator.translator().addSource(this.registry); + this.setSelectedLocale(); + } + + private void setSelectedLocale() { + if (this.forcedLocale != null) { + this.selectedLocale = forcedLocale; + if (!this.installed.contains(forcedLocale)) { + this.plugin.logger().warn("The forced locale is set to " + forcedLocale + ", but it is not available."); + } + return; + } + + Locale localLocale = Locale.getDefault(); + if (this.installed.contains(localLocale)) { + this.selectedLocale = localLocale; + return; + } + + Locale langLocale = Locale.of(localLocale.getLanguage()); + if (this.installed.contains(langLocale)) { + this.selectedLocale = langLocale; + return; + } + + this.plugin.logger().warn(localLocale.toString().toLowerCase(Locale.ENGLISH) + ".yml not exists, using " + DEFAULT_LOCALE.toString().toLowerCase(Locale.ENGLISH) + ".yml as default locale."); + this.selectedLocale = DEFAULT_LOCALE; + } + + @Override + public String miniMessageTranslation(String key, @Nullable Locale locale) { + if (locale == null) { + locale = this.selectedLocale; + } + return this.registry.miniMessageTranslation(key, locale); + } + + @Override + public Component render(Component component, @Nullable Locale locale) { + if (locale == null) { + locale = this.selectedLocale; + } + return MiniMessageTranslator.render(component, locale); + } + + public void loadFromFileSystem(Path directory, boolean suppressDuplicatesError) { + List translationFiles; + try (Stream stream = Files.list(directory)) { + translationFiles = stream.filter(TranslationManagerImpl::isTranslationFile).collect(Collectors.toList()); + } catch (IOException e) { + translationFiles = Collections.emptyList(); + } + + if (translationFiles.isEmpty()) { + return; + } + + Map> loaded = new HashMap<>(); + for (Path translationFile : translationFiles) { + try { + Pair> result = loadTranslationFile(translationFile); + loaded.put(result.left(), result.right()); + } catch (Exception e) { + if (!suppressDuplicatesError || !isAdventureDuplicatesException(e)) { + this.plugin.logger().warn("Error loading locale file: " + translationFile.getFileName(), e); + } + } + } + + // try registering the locale without a country code - if we don't already have a registration for that + loaded.forEach((locale, bundle) -> { + Locale localeWithoutCountry = Locale.of(locale.getLanguage()); + if (!locale.equals(localeWithoutCountry) && !localeWithoutCountry.equals(DEFAULT_LOCALE) && this.installed.add(localeWithoutCountry)) { + try { + this.registry.registerAll(localeWithoutCountry, bundle); + } catch (IllegalArgumentException e) { + // ignore + } + } + }); + } + + public static boolean isTranslationFile(Path path) { + return path.getFileName().toString().endsWith(".yml"); + } + + private static boolean isAdventureDuplicatesException(Exception e) { + return e instanceof IllegalArgumentException && (e.getMessage().startsWith("Invalid key") || e.getMessage().startsWith("Translation already exists")); + } + + @SuppressWarnings("unchecked") + private Pair> loadTranslationFile(Path translationFile) { + String fileName = translationFile.getFileName().toString(); + String localeString = fileName.substring(0, fileName.length() - ".yml".length()); + Locale locale = TranslationManager.parseLocale(localeString); + if (locale == null) { + throw new IllegalStateException("Unknown locale '" + localeString + "' - unable to register."); + } + + Map bundle = new HashMap<>(); + Yaml yaml = new Yaml(new StringKeyConstructor(new LoaderOptions())); + try (InputStreamReader inputStream = new InputStreamReader(new FileInputStream(translationFile.toFile()), StandardCharsets.UTF_8)) { + Map map = yaml.load(inputStream); + String langVersion = map.getOrDefault("lang-version", "").toString(); + if (!langVersion.equals(this.langVersion)) { + map = updateLangFile(map, translationFile); + } + + for (Map.Entry entry : map.entrySet()) { + if (entry.getValue() instanceof String str) { + bundle.put(entry.getKey(), str); + } else if (entry.getValue() instanceof List list) { + List strList = (List) list; + StringJoiner stringJoiner = new StringJoiner(""); + for (String str : strList) { + stringJoiner.add(str); + } + bundle.put(entry.getKey(), stringJoiner.toString()); + } + } + + this.registry.registerAll(locale, bundle); + this.installed.add(locale); + } catch (IOException e) { + this.plugin.logger().warn(translationFile, "Error loading translation file", e); + } + + return Pair.of(locale, bundle); + } + + @Override + public String translateI18NTag(String i18nId) { + I18NData data = this.i18nData.get(this.selectedLocale); + String translation = getI18NOrNull(data, i18nId); + if (translation != null) return translation; + Locale lang = Locale.of(selectedLocale.getLanguage()); + if (!this.selectedLocale.equals(lang)) { + data = this.i18nData.get(lang); + translation = getI18NOrNull(data, i18nId); + if (translation != null) return translation; + } + I18NData fallback = this.i18nData.get(DEFAULT_LOCALE); + if (fallback != null) { + translation = fallback.translate(i18nId); + return translation == null ? i18nId : translation; + } + return i18nId; + } + + @Nullable + private String getI18NOrNull(I18NData data, String i18nId) { + if (data == null) return null; + return data.translate(i18nId); + } + + @Override + public void parseSection(Pack pack, Path path, net.momirealms.craftengine.core.util.Key id, Map section) { + Locale locale = TranslationManager.parseLocale(id.value()); + if (locale == null) { + throw new IllegalStateException("Unknown locale '" + id.value() + "' - unable to register."); + } + + I18NData data = this.i18nData.computeIfAbsent(locale, k -> new I18NData()); + for (Map.Entry entry : section.entrySet()) { + String key = entry.getKey(); + data.addTranslation(key, entry.getValue().toString()); + } + } + + @Override + public ClientLangManager clientLangManager() { + return clientLangManager; + } + + private Map updateLangFile(Map previous, Path translationFile) throws IOException { + DumperOptions options = new DumperOptions(); + options.setDefaultFlowStyle(DumperOptions.FlowStyle.BLOCK); + options.setPrettyFlow(true); + options.setIndent(2); + options.setSplitLines(false); + options.setDefaultScalarStyle(DumperOptions.ScalarStyle.DOUBLE_QUOTED); + Yaml yaml = new Yaml(new StringKeyConstructor(new LoaderOptions()), new Representer(options), options); + LinkedHashMap newFileContents = new LinkedHashMap<>(); + try (InputStream is = plugin.resourceStream("translations/" + translationFile.getFileName())) { + Map newMap = yaml.load(is); + newFileContents.putAll(this.translationFallback); + newFileContents.putAll(newMap); + newFileContents.putAll(previous); + newFileContents.put("lang-version", this.langVersion); + String yamlString = yaml.dump(newFileContents); + Files.writeString(translationFile, yamlString); + return newFileContents; + } + } +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/plugin/logger/JavaPluginLogger.java b/core/src/main/java/net/momirealms/craftengine/core/plugin/logger/JavaPluginLogger.java new file mode 100644 index 000000000..207f2dcec --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/plugin/logger/JavaPluginLogger.java @@ -0,0 +1,37 @@ +package net.momirealms.craftengine.core.plugin.logger; + +import java.util.logging.Level; +import java.util.logging.Logger; + +public class JavaPluginLogger implements PluginLogger { + private final Logger logger; + + public JavaPluginLogger(Logger logger) { + this.logger = logger; + } + + @Override + public void info(String s) { + this.logger.info(s); + } + + @Override + public void warn(String s) { + this.logger.warning(s); + } + + @Override + public void warn(String s, Throwable t) { + this.logger.log(Level.WARNING, s, t); + } + + @Override + public void severe(String s) { + this.logger.severe(s); + } + + @Override + public void severe(String s, Throwable t) { + this.logger.log(Level.SEVERE, s, t); + } +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/plugin/logger/Log4jPluginLogger.java b/core/src/main/java/net/momirealms/craftengine/core/plugin/logger/Log4jPluginLogger.java new file mode 100644 index 000000000..dec393a44 --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/plugin/logger/Log4jPluginLogger.java @@ -0,0 +1,36 @@ +package net.momirealms.craftengine.core.plugin.logger; + +import org.apache.logging.log4j.Logger; + +public class Log4jPluginLogger implements PluginLogger { + private final Logger logger; + + public Log4jPluginLogger(Logger logger) { + this.logger = logger; + } + + @Override + public void info(String s) { + this.logger.info(s); + } + + @Override + public void warn(String s) { + this.logger.warn(s); + } + + @Override + public void warn(String s, Throwable t) { + this.logger.warn(s, t); + } + + @Override + public void severe(String s) { + this.logger.error(s); + } + + @Override + public void severe(String s, Throwable t) { + this.logger.error(s, t); + } +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/plugin/logger/PluginLogger.java b/core/src/main/java/net/momirealms/craftengine/core/plugin/logger/PluginLogger.java new file mode 100644 index 000000000..7dad02ad6 --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/plugin/logger/PluginLogger.java @@ -0,0 +1,28 @@ +package net.momirealms.craftengine.core.plugin.logger; + +import java.io.File; +import java.nio.file.Path; + +public interface PluginLogger { + void info(String s); + + void warn(String s); + + default void warn(File file, String s) { + warn("Error in file: " + file.getAbsolutePath() + " - " + s); + } + + default void warn(Path file, String s) { + warn("Error in file: " + file.toAbsolutePath() + " - " + s); + } + + default void warn(Path file, String s, Throwable t) { + warn("Error in file: " + file.toAbsolutePath() + " - " + s, t); + } + + void warn(String s, Throwable t); + + void severe(String s); + + void severe(String s, Throwable t); +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/plugin/logger/Slf4jPluginLogger.java b/core/src/main/java/net/momirealms/craftengine/core/plugin/logger/Slf4jPluginLogger.java new file mode 100644 index 000000000..042940aca --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/plugin/logger/Slf4jPluginLogger.java @@ -0,0 +1,36 @@ +package net.momirealms.craftengine.core.plugin.logger; + +import org.slf4j.Logger; + +public class Slf4jPluginLogger implements PluginLogger { + private final Logger logger; + + public Slf4jPluginLogger(Logger logger) { + this.logger = logger; + } + + @Override + public void info(String s) { + this.logger.info(s); + } + + @Override + public void warn(String s) { + this.logger.warn(s); + } + + @Override + public void warn(String s, Throwable t) { + this.logger.warn(s, t); + } + + @Override + public void severe(String s) { + this.logger.error(s); + } + + @Override + public void severe(String s, Throwable t) { + this.logger.error(s, t); + } +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/plugin/logger/filter/Log4JFilter.java b/core/src/main/java/net/momirealms/craftengine/core/plugin/logger/filter/Log4JFilter.java new file mode 100644 index 000000000..0f067c61a --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/plugin/logger/filter/Log4JFilter.java @@ -0,0 +1,18 @@ +package net.momirealms.craftengine.core.plugin.logger.filter; + +import org.apache.logging.log4j.Level; +import org.apache.logging.log4j.Marker; +import org.apache.logging.log4j.core.Filter; +import org.apache.logging.log4j.core.LogEvent; +import org.apache.logging.log4j.core.Logger; +import org.apache.logging.log4j.message.Message; + +public interface Log4JFilter { + Filter.Result filter(LogEvent event); + + Filter.Result filter(Logger logger, Level level, Marker marker, Message msg, Throwable t); + + Filter.Result filter(Logger logger, Level level, Marker marker, String msg, Object... params); + + Filter.Result filter(Logger logger, Level level, Marker marker, Object msg, Throwable t); +} \ No newline at end of file diff --git a/core/src/main/java/net/momirealms/craftengine/core/plugin/logger/filter/LogFilter.java b/core/src/main/java/net/momirealms/craftengine/core/plugin/logger/filter/LogFilter.java new file mode 100644 index 000000000..2a8505326 --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/plugin/logger/filter/LogFilter.java @@ -0,0 +1,51 @@ +package net.momirealms.craftengine.core.plugin.logger.filter; + +import org.apache.logging.log4j.Level; +import org.apache.logging.log4j.Marker; +import org.apache.logging.log4j.core.LogEvent; +import org.apache.logging.log4j.core.Logger; +import org.apache.logging.log4j.core.filter.AbstractFilter; +import org.apache.logging.log4j.message.Message; + +public class LogFilter extends AbstractFilter implements Log4JFilter { + + private static Result validateMessage(Message message) { + if (message == null) { + return Result.NEUTRAL; + } + return validateMessage(message.getFormattedMessage()); + } + + private static Result validateMessage(String message) { + return message.startsWith("\"CraftEngine v") + ? Result.DENY + : Result.NEUTRAL; + } + + @Override + public Result filter(LogEvent event) { + Message candidate = null; + if (event != null) { + candidate = event.getMessage(); + } + return validateMessage(candidate); + } + + @Override + public Result filter(Logger logger, Level level, Marker marker, Message msg, Throwable t) { + return validateMessage(msg); + } + + @Override + public Result filter(Logger logger, Level level, Marker marker, String msg, Object... params) { + return validateMessage(msg); + } + + @Override + public Result filter(Logger logger, Level level, Marker marker, Object msg, Throwable t) { + if (msg != null && level == Level.WARN) { + return validateMessage(msg.toString()); + } + return Result.NEUTRAL; + } +} \ No newline at end of file diff --git a/core/src/main/java/net/momirealms/craftengine/core/plugin/minimessage/I18NTag.java b/core/src/main/java/net/momirealms/craftengine/core/plugin/minimessage/I18NTag.java new file mode 100644 index 000000000..d40f6a8ad --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/plugin/minimessage/I18NTag.java @@ -0,0 +1,34 @@ +package net.momirealms.craftengine.core.plugin.minimessage; + +import net.kyori.adventure.text.minimessage.Context; +import net.kyori.adventure.text.minimessage.ParsingException; +import net.kyori.adventure.text.minimessage.tag.Tag; +import net.kyori.adventure.text.minimessage.tag.resolver.ArgumentQueue; +import net.kyori.adventure.text.minimessage.tag.resolver.TagResolver; +import net.momirealms.craftengine.core.plugin.locale.TranslationManager; +import net.momirealms.craftengine.core.util.AdventureHelper; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +public class I18NTag implements TagResolver { + private final MiniMessageTextContext context; + + public I18NTag(MiniMessageTextContext context) { + this.context = context; + } + + @Override + public @Nullable Tag resolve(@NotNull String name, @NotNull ArgumentQueue arguments, @NotNull Context ctx) throws ParsingException { + if (!this.has(name)) { + return null; + } + String i18nKey = arguments.popOr("No argument i18n key provided").toString(); + String translation = TranslationManager.instance().translateI18NTag(i18nKey); + return Tag.inserting(AdventureHelper.miniMessage().deserialize(translation, this.context.tagResolvers())); + } + + @Override + public boolean has(@NotNull String name) { + return "i18n".equals(name) || "l10n".equals(name); + } +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/plugin/minimessage/ImageTag.java b/core/src/main/java/net/momirealms/craftengine/core/plugin/minimessage/ImageTag.java new file mode 100644 index 000000000..6e129bfcd --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/plugin/minimessage/ImageTag.java @@ -0,0 +1,50 @@ +package net.momirealms.craftengine.core.plugin.minimessage; + +import net.kyori.adventure.text.Component; +import net.kyori.adventure.text.minimessage.Context; +import net.kyori.adventure.text.minimessage.ParsingException; +import net.kyori.adventure.text.minimessage.tag.Tag; +import net.kyori.adventure.text.minimessage.tag.resolver.ArgumentQueue; +import net.kyori.adventure.text.minimessage.tag.resolver.TagResolver; +import net.momirealms.craftengine.core.font.BitmapImage; +import net.momirealms.craftengine.core.plugin.CraftEngine; +import net.momirealms.craftengine.core.util.Key; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +import java.util.List; +import java.util.Optional; + +public class ImageTag implements TagResolver { + public static final ImageTag INSTANCE = new ImageTag(); + + public static ImageTag instance() { + return INSTANCE; + } + + @Override + public @Nullable Tag resolve(@NotNull String name, @NotNull ArgumentQueue arguments, @NotNull Context ctx) throws ParsingException { + if (!this.has(name)) { + return null; + } + String namespace = arguments.popOr("No argument namespace provided").toString(); + String id = arguments.popOr("No argument id provided").toString(); + Optional optional = CraftEngine.instance().imageManager().bitmapImageByImageId(Key.of(namespace, id)); + if (optional.isPresent()) { + if (arguments.hasNext()) { + int row = arguments.popOr("No argument row provided").asInt().orElseThrow(() -> ctx.newException("Invalid argument number", arguments)); + int column = arguments.popOr("No argument column provided").asInt().orElseThrow(() -> ctx.newException("Invalid argument number", arguments)); + return Tag.inserting(Component.empty().children(List.of(optional.get().componentAt(row,column)))); + } else { + return Tag.inserting(Component.empty().children(List.of(optional.get().componentAt(0,0)))); + } + } else { + throw ctx.newException("Invalid image id", arguments); + } + } + + @Override + public boolean has(@NotNull String name) { + return "image".equals(name); + } +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/plugin/minimessage/IndexedArgumentTag.java b/core/src/main/java/net/momirealms/craftengine/core/plugin/minimessage/IndexedArgumentTag.java new file mode 100644 index 000000000..10d887af8 --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/plugin/minimessage/IndexedArgumentTag.java @@ -0,0 +1,44 @@ +package net.momirealms.craftengine.core.plugin.minimessage; + +import net.kyori.adventure.text.ComponentLike; +import net.kyori.adventure.text.minimessage.Context; +import net.kyori.adventure.text.minimessage.ParsingException; +import net.kyori.adventure.text.minimessage.tag.Tag; +import net.kyori.adventure.text.minimessage.tag.resolver.ArgumentQueue; +import net.kyori.adventure.text.minimessage.tag.resolver.TagResolver; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +import java.util.List; +import java.util.Objects; + +public class IndexedArgumentTag implements TagResolver { + private static final String NAME_0 = "argument"; + private static final String NAME_1 = "arg"; + + private final List argumentComponents; + + public IndexedArgumentTag(@NotNull List argumentComponents) { + this.argumentComponents = Objects.requireNonNull(argumentComponents, "argumentComponents"); + } + + @Override + public @Nullable Tag resolve(@NotNull String name, @NotNull ArgumentQueue arguments, @NotNull Context ctx) throws ParsingException { + if (!has(name)) { + return null; + } + + final int index = arguments.popOr("No argument number provided").asInt().orElseThrow(() -> ctx.newException("Invalid argument number", arguments)); + + if (index < 0 || index >= argumentComponents.size()) { + throw ctx.newException("Invalid argument number", arguments); + } + + return Tag.inserting(argumentComponents.get(index)); + } + + @Override + public boolean has(@NotNull String name) { + return name.equals(NAME_0) || name.equals(NAME_1); + } +} \ No newline at end of file diff --git a/core/src/main/java/net/momirealms/craftengine/core/plugin/minimessage/MiniMessageTextContext.java b/core/src/main/java/net/momirealms/craftengine/core/plugin/minimessage/MiniMessageTextContext.java new file mode 100644 index 000000000..63129ca8d --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/plugin/minimessage/MiniMessageTextContext.java @@ -0,0 +1,11 @@ +package net.momirealms.craftengine.core.plugin.minimessage; + +import net.kyori.adventure.text.minimessage.tag.resolver.TagResolver; +import net.momirealms.craftengine.core.util.context.ContextHolder; + +public interface MiniMessageTextContext { + + ContextHolder contexts(); + + TagResolver[] tagResolvers(); +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/plugin/minimessage/NamedArgumentTag.java b/core/src/main/java/net/momirealms/craftengine/core/plugin/minimessage/NamedArgumentTag.java new file mode 100644 index 000000000..06fcd663c --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/plugin/minimessage/NamedArgumentTag.java @@ -0,0 +1,46 @@ +package net.momirealms.craftengine.core.plugin.minimessage; + +import net.kyori.adventure.text.minimessage.Context; +import net.kyori.adventure.text.minimessage.ParsingException; +import net.kyori.adventure.text.minimessage.tag.Tag; +import net.kyori.adventure.text.minimessage.tag.resolver.ArgumentQueue; +import net.kyori.adventure.text.minimessage.tag.resolver.TagResolver; +import net.momirealms.craftengine.core.util.AdventureHelper; +import net.momirealms.craftengine.core.util.Key; +import net.momirealms.craftengine.core.util.context.ContextKey; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +import java.util.Objects; + +public class NamedArgumentTag implements TagResolver { + private static final String NAME_0 = "argument"; + private static final String NAME_1 = "arg"; + + private final MiniMessageTextContext context; + + public NamedArgumentTag(@NotNull MiniMessageTextContext context) { + this.context = Objects.requireNonNull(context, "context holder"); + } + + @Override + public @Nullable Tag resolve(@NotNull String name, @NotNull ArgumentQueue arguments, @NotNull Context ctx) throws ParsingException { + if (!has(name)) { + return null; + } + + String argumentKey = arguments.popOr("No argument key provided").toString(); + + ContextKey key = ContextKey.of(Key.of(argumentKey)); + if (!this.context.contexts().has(key)) { + throw ctx.newException("Invalid argument key", arguments); + } + + return Tag.inserting(AdventureHelper.miniMessage().deserialize(this.context.contexts().getOrThrow(key), this.context.tagResolvers())); + } + + @Override + public boolean has(@NotNull String name) { + return name.equals(NAME_0) || name.equals(NAME_1); + } +} \ No newline at end of file diff --git a/core/src/main/java/net/momirealms/craftengine/core/plugin/minimessage/PlaceholderTag.java b/core/src/main/java/net/momirealms/craftengine/core/plugin/minimessage/PlaceholderTag.java new file mode 100644 index 000000000..3c78280a5 --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/plugin/minimessage/PlaceholderTag.java @@ -0,0 +1,35 @@ +package net.momirealms.craftengine.core.plugin.minimessage; + +import net.kyori.adventure.text.minimessage.Context; +import net.kyori.adventure.text.minimessage.ParsingException; +import net.kyori.adventure.text.minimessage.tag.Tag; +import net.kyori.adventure.text.minimessage.tag.resolver.ArgumentQueue; +import net.kyori.adventure.text.minimessage.tag.resolver.TagResolver; +import net.momirealms.craftengine.core.entity.player.Player; +import net.momirealms.craftengine.core.plugin.CraftEngine; +import net.momirealms.craftengine.core.util.AdventureHelper; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +public class PlaceholderTag implements TagResolver { + private final Player player; + + public PlaceholderTag(@Nullable Player player) { + this.player = player; + } + + @Override + public @Nullable Tag resolve(@NotNull String name, @NotNull ArgumentQueue arguments, @NotNull Context ctx) throws ParsingException { + if (!this.has(name) || !CraftEngine.instance().hasPlaceholderAPI()) { + return null; + } + String placeholder = arguments.popOr("No argument placeholder provided").toString(); + String parsed = CraftEngine.instance().parse(player, "%" + placeholder + "%"); + return Tag.inserting(AdventureHelper.miniMessage(parsed)); + } + + @Override + public boolean has(@NotNull String name) { + return "papi".equals(name); + } +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/plugin/minimessage/ShiftTag.java b/core/src/main/java/net/momirealms/craftengine/core/plugin/minimessage/ShiftTag.java new file mode 100644 index 000000000..633c22b8f --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/plugin/minimessage/ShiftTag.java @@ -0,0 +1,38 @@ +package net.momirealms.craftengine.core.plugin.minimessage; + +import net.kyori.adventure.text.minimessage.Context; +import net.kyori.adventure.text.minimessage.ParsingException; +import net.kyori.adventure.text.minimessage.tag.Tag; +import net.kyori.adventure.text.minimessage.tag.resolver.ArgumentQueue; +import net.kyori.adventure.text.minimessage.tag.resolver.TagResolver; +import net.momirealms.craftengine.core.plugin.CraftEngine; +import net.momirealms.craftengine.core.util.AdventureHelper; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +public class ShiftTag implements TagResolver { + public static final ShiftTag INSTANCE = new ShiftTag(); + + public static ShiftTag instance() { + return INSTANCE; + } + + @Override + public @Nullable Tag resolve(@NotNull String name, @NotNull ArgumentQueue arguments, @NotNull Context ctx) throws ParsingException { + if (!this.has(name)) { + return null; + } + String shiftAmount = arguments.popOr("No argument shift provided").toString(); + try { + int shift = Integer.parseInt(shiftAmount); + return Tag.inserting(AdventureHelper.miniMessage(CraftEngine.instance().imageManager().createMiniMessageOffsets(shift))); + } catch (NumberFormatException e) { + throw ctx.newException("Invalid shift value", arguments); + } + } + + @Override + public boolean has(@NotNull String name) { + return "shift".equals(name); + } +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/plugin/network/ConnectionState.java b/core/src/main/java/net/momirealms/craftengine/core/plugin/network/ConnectionState.java new file mode 100644 index 000000000..54f3de300 --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/plugin/network/ConnectionState.java @@ -0,0 +1,9 @@ +package net.momirealms.craftengine.core.plugin.network; + +public enum ConnectionState { + HANDSHAKING, + STATUS, + LOGIN, + PLAY, + CONFIGURATION +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/plugin/network/NetWorkUser.java b/core/src/main/java/net/momirealms/craftengine/core/plugin/network/NetWorkUser.java new file mode 100644 index 000000000..465c3d88e --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/plugin/network/NetWorkUser.java @@ -0,0 +1,32 @@ +package net.momirealms.craftengine.core.plugin.network; + +import io.netty.channel.Channel; +import net.momirealms.craftengine.core.plugin.Plugin; +import net.momirealms.craftengine.core.util.Key; +import org.jetbrains.annotations.ApiStatus; + +public interface NetWorkUser { + boolean isOnline(); + + Channel nettyChannel(); + + Plugin plugin(); + + String name(); + + void sendPacket(Object packet, boolean immediately); + + @ApiStatus.Internal + ConnectionState decoderState(); + + @ApiStatus.Internal + ConnectionState encoderState(); + + int clientSideSectionCount(); + + Key clientSideDimension(); + + Object serverPlayer(); + + Object platformPlayer(); +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/plugin/network/NetworkManager.java b/core/src/main/java/net/momirealms/craftengine/core/plugin/network/NetworkManager.java new file mode 100644 index 000000000..2a8341e1f --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/plugin/network/NetworkManager.java @@ -0,0 +1,24 @@ +package net.momirealms.craftengine.core.plugin.network; + +import io.netty.channel.Channel; +import net.momirealms.craftengine.core.entity.player.Player; + +import java.util.Collection; + +public interface NetworkManager { + void setUser(Channel channel, NetWorkUser user); + + NetWorkUser getUser(Channel channel); + + NetWorkUser removeUser(Channel channel); + + Channel getChannel(Player player); + + Collection onlineUsers(); + + void init(); + + void enable(); + + void shutdown(); +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/plugin/scheduler/AbstractJavaScheduler.java b/core/src/main/java/net/momirealms/craftengine/core/plugin/scheduler/AbstractJavaScheduler.java new file mode 100644 index 000000000..1198fa6ea --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/plugin/scheduler/AbstractJavaScheduler.java @@ -0,0 +1,105 @@ +package net.momirealms.craftengine.core.plugin.scheduler; + +import net.momirealms.craftengine.core.plugin.Plugin; + +import java.lang.Thread.UncaughtExceptionHandler; +import java.util.Arrays; +import java.util.concurrent.*; +import java.util.concurrent.atomic.AtomicInteger; +import java.util.function.Predicate; +import java.util.stream.Collectors; + +public abstract class AbstractJavaScheduler implements SchedulerAdapter { + private static final int PARALLELISM = 16; + + private final Plugin plugin; + + private final ScheduledThreadPoolExecutor scheduler; + private final ForkJoinPool worker; + + public AbstractJavaScheduler(Plugin plugin) { + this.plugin = plugin; + + this.scheduler = new ScheduledThreadPoolExecutor(4, r -> { + Thread thread = Executors.defaultThreadFactory().newThread(r); + thread.setName("craft-engine-scheduler"); + return thread; + }); + this.scheduler.setRemoveOnCancelPolicy(true); + this.scheduler.setExecuteExistingDelayedTasksAfterShutdownPolicy(false); + this.worker = new ForkJoinPool(PARALLELISM, new WorkerThreadFactory(), new ExceptionHandler(), false); + } + + @Override + public Executor async() { + return this.worker; + } + + @Override + public SchedulerTask asyncLater(Runnable task, long delay, TimeUnit unit) { + ScheduledFuture future = this.scheduler.schedule(() -> this.worker.execute(task), delay, unit); + return new AsyncTask(future); + } + + @Override + public SchedulerTask asyncRepeating(Runnable task, long delay, long interval, TimeUnit unit) { + ScheduledFuture future = this.scheduler.scheduleAtFixedRate(() -> this.worker.execute(task), delay, interval, unit); + return new AsyncTask(future); + } + + @Override + public void shutdownScheduler() { + this.scheduler.shutdown(); + try { + if (!this.scheduler.awaitTermination(1, TimeUnit.MINUTES)) { + this.plugin.logger().severe("Timed out waiting for the CraftEngine scheduler to terminate"); + reportRunningTasks(thread -> thread.getName().equals("craft-engine-scheduler")); + } + } catch (InterruptedException e) { + plugin.logger().warn("Thread is interrupted", e); + } + } + + @Override + public void shutdownExecutor() { + this.worker.shutdown(); + try { + if (!this.worker.awaitTermination(1, TimeUnit.MINUTES)) { + this.plugin.logger().severe("Timed out waiting for the CraftEngine worker thread pool to terminate"); + reportRunningTasks(thread -> thread.getName().startsWith("craft-engine-worker-")); + } + } catch (InterruptedException e) { + plugin.logger().warn("Thread is interrupted", e); + } + } + + private void reportRunningTasks(Predicate predicate) { + Thread.getAllStackTraces().forEach((thread, stack) -> { + if (predicate.test(thread)) { + this.plugin.logger().warn("Thread " + thread.getName() + " is blocked, and may be the reason for the slow shutdown!\n" + + Arrays.stream(stack).map(el -> " " + el).collect(Collectors.joining("\n")) + ); + } + }); + } + + private static final class WorkerThreadFactory implements ForkJoinPool.ForkJoinWorkerThreadFactory { + private static final AtomicInteger COUNT = new AtomicInteger(0); + + @Override + public ForkJoinWorkerThread newThread(ForkJoinPool pool) { + ForkJoinWorkerThread thread = ForkJoinPool.defaultForkJoinWorkerThreadFactory.newThread(pool); + thread.setDaemon(true); + thread.setName("craft-engine-worker-" + COUNT.getAndIncrement()); + return thread; + } + } + + private final class ExceptionHandler implements UncaughtExceptionHandler { + + @Override + public void uncaughtException(Thread t, Throwable e) { + AbstractJavaScheduler.this.plugin.logger().warn("Thread " + t.getName() + " threw an uncaught exception", e); + } + } +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/plugin/scheduler/AsyncTask.java b/core/src/main/java/net/momirealms/craftengine/core/plugin/scheduler/AsyncTask.java new file mode 100644 index 000000000..93f6f0258 --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/plugin/scheduler/AsyncTask.java @@ -0,0 +1,21 @@ +package net.momirealms.craftengine.core.plugin.scheduler; + +import java.util.concurrent.ScheduledFuture; + +public class AsyncTask implements SchedulerTask { + private final ScheduledFuture future; + + public AsyncTask(ScheduledFuture future) { + this.future = future; + } + + @Override + public void cancel() { + future.cancel(false); + } + + @Override + public boolean cancelled() { + return future.isCancelled(); + } +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/plugin/scheduler/DummyTask.java b/core/src/main/java/net/momirealms/craftengine/core/plugin/scheduler/DummyTask.java new file mode 100644 index 000000000..f12e8ba74 --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/plugin/scheduler/DummyTask.java @@ -0,0 +1,13 @@ +package net.momirealms.craftengine.core.plugin.scheduler; + +public class DummyTask implements SchedulerTask { + + @Override + public void cancel() { + } + + @Override + public boolean cancelled() { + return true; + } +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/plugin/scheduler/RegionExecutor.java b/core/src/main/java/net/momirealms/craftengine/core/plugin/scheduler/RegionExecutor.java new file mode 100644 index 000000000..cbe7c938a --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/plugin/scheduler/RegionExecutor.java @@ -0,0 +1,30 @@ +package net.momirealms.craftengine.core.plugin.scheduler; + +import java.util.concurrent.Executor; + +public interface RegionExecutor extends Executor { + + void run(Runnable runnable, W world, int x, int z); + + default void run(Runnable runnable) { + run(runnable, null, 0, 0); + } + + void runDelayed(Runnable runnable, W world, int x, int z); + + default void runDelayed(Runnable runnable) { + runDelayed(runnable, null, 0, 0); + } + + SchedulerTask runAsyncRepeating(Runnable runnable, long delay, long period); + + SchedulerTask runAsyncLater(Runnable runnable, long delay); + + SchedulerTask runLater(Runnable runnable, long delay, W world, int x, int z); + + SchedulerTask runRepeating(Runnable runnable, long delay, long period, W world, int x, int z); + + default SchedulerTask runRepeating(Runnable runnable, long delay, long period) { + return runRepeating(runnable, delay, period, null, 0, 0); + } +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/plugin/scheduler/SchedulerAdapter.java b/core/src/main/java/net/momirealms/craftengine/core/plugin/scheduler/SchedulerAdapter.java new file mode 100644 index 000000000..fd7af51e3 --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/plugin/scheduler/SchedulerAdapter.java @@ -0,0 +1,31 @@ +package net.momirealms.craftengine.core.plugin.scheduler; + +import java.util.concurrent.Executor; +import java.util.concurrent.TimeUnit; + +public interface SchedulerAdapter { + + Executor async(); + + RegionExecutor sync(); + + default void executeAsync(Runnable task) { + async().execute(task); + } + + default void executeSync(Runnable task, W world, int x, int z) { + sync().run(task, world, x, z); + } + + default void executeSync(Runnable task) { + sync().run(task, null, 0, 0); + } + + SchedulerTask asyncLater(Runnable task, long delay, TimeUnit unit); + + SchedulerTask asyncRepeating(Runnable task, long delay, long interval, TimeUnit unit); + + void shutdownScheduler(); + + void shutdownExecutor(); +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/plugin/scheduler/SchedulerTask.java b/core/src/main/java/net/momirealms/craftengine/core/plugin/scheduler/SchedulerTask.java new file mode 100644 index 000000000..c90de4fb9 --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/plugin/scheduler/SchedulerTask.java @@ -0,0 +1,8 @@ +package net.momirealms.craftengine.core.plugin.scheduler; + +public interface SchedulerTask { + + void cancel(); + + boolean cancelled(); +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/registry/BuiltInRegistries.java b/core/src/main/java/net/momirealms/craftengine/core/registry/BuiltInRegistries.java new file mode 100644 index 000000000..8f2a53152 --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/registry/BuiltInRegistries.java @@ -0,0 +1,50 @@ +package net.momirealms.craftengine.core.registry; + +import net.momirealms.craftengine.core.block.CustomBlock; +import net.momirealms.craftengine.core.block.behavior.BlockBehaviorFactory; +import net.momirealms.craftengine.core.block.properties.PropertyFactory; +import net.momirealms.craftengine.core.item.behavior.ItemBehaviorFactory; +import net.momirealms.craftengine.core.item.recipe.RecipeFactory; +import net.momirealms.craftengine.core.loot.condition.LootConditionFactory; +import net.momirealms.craftengine.core.loot.entry.LootEntryContainerFactory; +import net.momirealms.craftengine.core.loot.function.ApplyBonusCountFunction; +import net.momirealms.craftengine.core.loot.function.LootFunctionFactory; +import net.momirealms.craftengine.core.loot.number.NumberProviderFactory; +import net.momirealms.craftengine.core.pack.conflict.matcher.PathMatcherFactory; +import net.momirealms.craftengine.core.pack.conflict.resolution.ResolutionFactory; +import net.momirealms.craftengine.core.pack.model.ItemModelFactory; +import net.momirealms.craftengine.core.pack.model.condition.ConditionPropertyFactory; +import net.momirealms.craftengine.core.pack.model.rangedisptach.RangeDispatchPropertyFactory; +import net.momirealms.craftengine.core.pack.model.select.SelectPropertyFactory; +import net.momirealms.craftengine.core.pack.model.special.SpecialModelFactory; +import net.momirealms.craftengine.core.pack.model.tint.TintFactory; +import net.momirealms.craftengine.core.plugin.config.template.TemplateArgumentFactory; +import net.momirealms.craftengine.core.util.Key; +import net.momirealms.craftengine.core.util.ResourceKey; + +public class BuiltInRegistries { + public static final Registry BLOCK = createRegistry(Registries.BLOCK); + public static final Registry OPTIMIZED_ITEM_ID = createRegistry(Registries.OPTIMIZED_ITEM_ID); + public static final Registry PROPERTY_FACTORY = createRegistry(Registries.PROPERTY_FACTORY); + public static final Registry BLOCK_BEHAVIOR_FACTORY = createRegistry(Registries.BLOCK_BEHAVIOR_FACTORY); + public static final Registry> LOOT_FUNCTION_FACTORY = createRegistry(Registries.LOOT_FUNCTION_FACTORY); + public static final Registry LOOT_CONDITION_FACTORY = createRegistry(Registries.LOOT_CONDITION_FACTORY); + public static final Registry> LOOT_ENTRY_CONTAINER_FACTORY = createRegistry(Registries.LOOT_ENTRY_CONTAINER_FACTORY); + public static final Registry NUMBER_PROVIDER_FACTORY = createRegistry(Registries.NUMBER_PROVIDER_FACTORY); + public static final Registry ITEM_BEHAVIOR_FACTORY = createRegistry(Registries.ITEM_BEHAVIOR_FACTORY); + public static final Registry TEMPLATE_ARGUMENT_FACTORY = createRegistry(Registries.TEMPLATE_ARGUMENT_FACTORY); + public static final Registry ITEM_MODEL_FACTORY = createRegistry(Registries.ITEM_MODEL_FACTORY); + public static final Registry TINT_FACTORY = createRegistry(Registries.TINT_FACTORY); + public static final Registry SPECIAL_MODEL_FACTORY = createRegistry(Registries.SPECIAL_MODEL_FACTORY); + public static final Registry RANGE_DISPATCH_PROPERTY_FACTORY = createRegistry(Registries.RANGE_DISPATCH_PROPERTY_FACTORY); + public static final Registry CONDITION_PROPERTY_FACTORY = createRegistry(Registries.CONDITION_PROPERTY_FACTORY); + public static final Registry SELECT_PROPERTY_FACTORY = createRegistry(Registries.SELECT_PROPERTY_FACTORY); + public static final Registry> RECIPE_FACTORY = createRegistry(Registries.RECIPE_FACTORY); + public static final Registry FORMULA_FACTORY = createRegistry(Registries.FORMULA_FACTORY); + public static final Registry PATH_MATCHER_FACTORY = createRegistry(Registries.PATH_MATCHER_FACTORY); + public static final Registry RESOLUTION_FACTORY = createRegistry(Registries.RESOLUTION_FACTORY); + + private static Registry createRegistry(ResourceKey> key) { + return new MappedRegistry<>(key); + } +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/registry/Holder.java b/core/src/main/java/net/momirealms/craftengine/core/registry/Holder.java new file mode 100644 index 000000000..06e1c25f9 --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/registry/Holder.java @@ -0,0 +1,214 @@ +package net.momirealms.craftengine.core.registry; + +import it.unimi.dsi.fastutil.objects.ReferenceOpenHashSet; +import net.momirealms.craftengine.core.util.Key; +import net.momirealms.craftengine.core.util.ResourceKey; + +import javax.annotation.Nullable; +import java.util.Collection; +import java.util.Collections; +import java.util.Optional; +import java.util.Set; +import java.util.function.Predicate; +import java.util.stream.Stream; + +public interface Holder { + + T value(); + + boolean isBound(); + + boolean matchesKey(Key id); + + boolean matchesKey(ResourceKey key); + + boolean matchesPredicate(Predicate> predicate); + + boolean hasTag(ResourceKey tag); + + Stream> tags(); + + Optional> keyOptional(); + + HolderKind kind(); + + boolean serializableIn(Owner owner); + + default String registeredName() { + return this.keyOptional().map(key -> key.location().toString()).orElse("[unregistered]"); + } + + static Holder direct(T value) { + return new Direct<>(value); + } + + record Direct(T value) implements Holder { + @Override + public boolean isBound() { + return true; + } + + @Override + public boolean matchesKey(Key id) { + return false; + } + + @Override + public boolean matchesKey(ResourceKey key) { + return false; + } + + @Override + public boolean hasTag(ResourceKey tag) { + return false; + } + + @Override + public boolean matchesPredicate(Predicate> predicate) { + return false; + } + + @Override + public Optional> keyOptional() { + return Optional.empty(); + } + + @Override + public HolderKind kind() { + return HolderKind.DIRECT; + } + + @Override + public boolean serializableIn(Owner owner) { + return true; + } + + @Override + public Stream> tags() { + return Stream.of(); + } + + @Override + public String toString() { + return "Direct{" + this.value + "}"; + } + } + + enum HolderKind { + REFERENCE, + DIRECT + } + + class Reference implements Holder { + private final Owner owner; + @Nullable + private ResourceKey key; + @Nullable + private T value; + @Nullable + private Set> tags; + + public Reference(Owner owner, @Nullable ResourceKey key, @Nullable T value) { + this.owner = owner; + this.key = key; + this.value = value; + } + + public static Reference create(Owner owner, ResourceKey registryKey) { + return new Reference<>(owner, registryKey, null); + } + + public ResourceKey key() { + if (this.key == null) { + throw new IllegalStateException("Trying to access unbound value '" + this.value + "' from registry " + this.owner); + } + return this.key; + } + + @Override + public T value() { + if (this.value == null) { + throw new IllegalStateException("Trying to access unbound value '" + this.key + "' from registry " + this.owner); + } + return this.value; + } + + @Override + public boolean matchesKey(Key id) { + return this.key().location().equals(id); + } + + @Override + public boolean matchesKey(ResourceKey key) { + return this.key() == key; + } + + private Set> boundTags() { + if (this.tags == null) { + throw new IllegalStateException("Tags not bound"); + } + return this.tags; + } + + @Override + public boolean hasTag(ResourceKey tag) { + return this.boundTags().contains(tag); + } + + @Override + public boolean matchesPredicate(Predicate> predicate) { + return predicate.test(this.key()); + } + + @Override + public boolean serializableIn(Owner owner) { + return this.owner.canSerializeIn(owner); + } + + @Override + public Optional> keyOptional() { + return Optional.of(this.key()); + } + + @Override + public HolderKind kind() { + return HolderKind.REFERENCE; + } + + @Override + public boolean isBound() { + return this.key != null && this.value != null; + } + + public void bindKey(ResourceKey registryKey) { + if (this.key != null && registryKey != this.key) { + throw new IllegalStateException("Can't change holder key: existing=" + this.key + ", new=" + registryKey); + } + this.key = registryKey; + } + + public void bindValue(T value) { + this.value = value; + } + + public void bindTags(Collection> tags) { + this.tags = Collections.unmodifiableSet(new ReferenceOpenHashSet<>(tags)); + } + + @Override + public Stream> tags() { + return this.boundTags().stream(); + } + + @Override + public String toString() { + return "Reference{" + this.key + "=" + this.value + "}"; + } + } + + interface Owner { + default boolean canSerializeIn(Owner other) { + return other == this; + } + } +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/registry/MappedRegistry.java b/core/src/main/java/net/momirealms/craftengine/core/registry/MappedRegistry.java new file mode 100644 index 000000000..2a20fd589 --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/registry/MappedRegistry.java @@ -0,0 +1,104 @@ +package net.momirealms.craftengine.core.registry; + +import com.google.common.collect.Maps; +import net.momirealms.craftengine.core.util.Key; +import net.momirealms.craftengine.core.util.ResourceKey; + +import javax.annotation.Nullable; +import java.util.*; + +public class MappedRegistry implements WritableRegistry { + private final ResourceKey> key; + private final Map> byId = new HashMap<>(2048); + private final Map, Holder.Reference> byResourceKey = new HashMap<>(2048); + + public MappedRegistry(ResourceKey> key) { + this.key = key; + } + + @Override + public ResourceKey> key() { + return this.key; + } + + @Override + public Holder.Reference registerForHolder(ResourceKey key) { + Objects.requireNonNull(key); + if (!key.registry().equals(this.key.location())) { + throw new IllegalStateException(key + " is not allowed to be registered in " + this.key); + } + if (this.byId.containsKey(key.location())) { + throw new IllegalStateException("Adding duplicate key '" + key + "' to registry"); + } else { + Holder.Reference reference = this.byResourceKey.computeIfAbsent(key, k -> Holder.Reference.create(this, k)); + this.byResourceKey.put(key, reference); + this.byId.put(key.location(), reference); + return reference; + } + } + + @Override + public Holder.Reference register(ResourceKey key, T value) { + Holder.Reference holder = registerForHolder(key); + holder.bindValue(value); + return holder; + } + + @Nullable + @Override + public T getValue(@Nullable ResourceKey key) { + return getValueFromNullable(this.byResourceKey.get(key)); + } + + @Override + public Optional> get(Key id) { + return Optional.ofNullable(this.byId.get(id)); + } + + @Override + public Optional> get(ResourceKey key) { + return Optional.ofNullable(this.byResourceKey.get(key)); + } + + @Nullable + @Override + public T getValue(@Nullable Key id) { + Holder.Reference reference = this.byId.get(id); + return getValueFromNullable(reference); + } + + @Nullable + private static T getValueFromNullable(@Nullable Holder.Reference entry) { + return entry != null ? entry.value() : null; + } + + @Override + public Set keySet() { + return Collections.unmodifiableSet(this.byId.keySet()); + } + + @Override + public Set> registryKeySet() { + return Collections.unmodifiableSet(this.byResourceKey.keySet()); + } + + @Override + public boolean containsKey(Key id) { + return this.byId.containsKey(id); + } + + @Override + public boolean containsKey(ResourceKey key) { + return this.byResourceKey.containsKey(key); + } + + @Override + public Set, T>> entrySet() { + return Collections.unmodifiableSet(Maps.transformValues(this.byResourceKey, Holder::value).entrySet()); + } + + @Override + public boolean isEmpty() { + return this.byResourceKey.isEmpty(); + } +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/registry/Registries.java b/core/src/main/java/net/momirealms/craftengine/core/registry/Registries.java new file mode 100644 index 000000000..5d8047bf9 --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/registry/Registries.java @@ -0,0 +1,47 @@ +package net.momirealms.craftengine.core.registry; + +import net.momirealms.craftengine.core.block.CustomBlock; +import net.momirealms.craftengine.core.block.behavior.BlockBehaviorFactory; +import net.momirealms.craftengine.core.block.properties.PropertyFactory; +import net.momirealms.craftengine.core.item.behavior.ItemBehaviorFactory; +import net.momirealms.craftengine.core.item.recipe.RecipeFactory; +import net.momirealms.craftengine.core.loot.condition.LootConditionFactory; +import net.momirealms.craftengine.core.loot.entry.LootEntryContainerFactory; +import net.momirealms.craftengine.core.loot.function.ApplyBonusCountFunction; +import net.momirealms.craftengine.core.loot.function.LootFunctionFactory; +import net.momirealms.craftengine.core.loot.number.NumberProviderFactory; +import net.momirealms.craftengine.core.pack.conflict.matcher.PathMatcherFactory; +import net.momirealms.craftengine.core.pack.conflict.resolution.ResolutionFactory; +import net.momirealms.craftengine.core.pack.model.ItemModelFactory; +import net.momirealms.craftengine.core.pack.model.condition.ConditionPropertyFactory; +import net.momirealms.craftengine.core.pack.model.rangedisptach.RangeDispatchPropertyFactory; +import net.momirealms.craftengine.core.pack.model.select.SelectPropertyFactory; +import net.momirealms.craftengine.core.pack.model.special.SpecialModelFactory; +import net.momirealms.craftengine.core.pack.model.tint.TintFactory; +import net.momirealms.craftengine.core.plugin.config.template.TemplateArgumentFactory; +import net.momirealms.craftengine.core.util.Key; +import net.momirealms.craftengine.core.util.ResourceKey; + +public class Registries { + public static final Key ROOT_REGISTRY = Key.withDefaultNamespace("root"); + public static final ResourceKey> BLOCK = new ResourceKey<>(ROOT_REGISTRY, Key.withDefaultNamespace("block")); + public static final ResourceKey> OPTIMIZED_ITEM_ID = new ResourceKey<>(ROOT_REGISTRY, Key.withDefaultNamespace("optimized_item_id")); + public static final ResourceKey> PROPERTY_FACTORY = new ResourceKey<>(ROOT_REGISTRY, Key.withDefaultNamespace("property_factory")); + public static final ResourceKey> BLOCK_BEHAVIOR_FACTORY = new ResourceKey<>(ROOT_REGISTRY, Key.withDefaultNamespace("block_behavior_factory")); + public static final ResourceKey> ITEM_BEHAVIOR_FACTORY = new ResourceKey<>(ROOT_REGISTRY, Key.withDefaultNamespace("item_behavior_factory")); + public static final ResourceKey>> LOOT_FUNCTION_FACTORY = new ResourceKey<>(ROOT_REGISTRY, Key.withDefaultNamespace("loot_function_factory")); + public static final ResourceKey>> LOOT_ENTRY_CONTAINER_FACTORY = new ResourceKey<>(ROOT_REGISTRY, Key.withDefaultNamespace("loot_entry_container_factory")); + public static final ResourceKey> LOOT_CONDITION_FACTORY = new ResourceKey<>(ROOT_REGISTRY, Key.withDefaultNamespace("loot_condition_factory")); + public static final ResourceKey> NUMBER_PROVIDER_FACTORY = new ResourceKey<>(ROOT_REGISTRY, Key.withDefaultNamespace("number_provider_factory")); + public static final ResourceKey> TEMPLATE_ARGUMENT_FACTORY = new ResourceKey<>(ROOT_REGISTRY, Key.withDefaultNamespace("template_argument_factory")); + public static final ResourceKey> ITEM_MODEL_FACTORY = new ResourceKey<>(ROOT_REGISTRY, Key.withDefaultNamespace("item_model_factory")); + public static final ResourceKey> TINT_FACTORY = new ResourceKey<>(ROOT_REGISTRY, Key.withDefaultNamespace("tint_factory")); + public static final ResourceKey> SPECIAL_MODEL_FACTORY = new ResourceKey<>(ROOT_REGISTRY, Key.withDefaultNamespace("special_model_factory")); + public static final ResourceKey> RANGE_DISPATCH_PROPERTY_FACTORY = new ResourceKey<>(ROOT_REGISTRY, Key.withDefaultNamespace("range_dispatch_property_factory")); + public static final ResourceKey> CONDITION_PROPERTY_FACTORY = new ResourceKey<>(ROOT_REGISTRY, Key.withDefaultNamespace("condition_property_factory")); + public static final ResourceKey> SELECT_PROPERTY_FACTORY = new ResourceKey<>(ROOT_REGISTRY, Key.withDefaultNamespace("select_property_factory")); + public static final ResourceKey>> RECIPE_FACTORY = new ResourceKey<>(ROOT_REGISTRY, Key.withDefaultNamespace("recipe_factory")); + public static final ResourceKey> FORMULA_FACTORY = new ResourceKey<>(ROOT_REGISTRY, Key.withDefaultNamespace("formula_factory")); + public static final ResourceKey> PATH_MATCHER_FACTORY = new ResourceKey<>(ROOT_REGISTRY, Key.withDefaultNamespace("path_matcher_factory")); + public static final ResourceKey> RESOLUTION_FACTORY = new ResourceKey<>(ROOT_REGISTRY, Key.withDefaultNamespace("resolution_factory")); +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/registry/Registry.java b/core/src/main/java/net/momirealms/craftengine/core/registry/Registry.java new file mode 100644 index 000000000..4540d9c19 --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/registry/Registry.java @@ -0,0 +1,34 @@ +package net.momirealms.craftengine.core.registry; + +import net.momirealms.craftengine.core.util.Key; +import net.momirealms.craftengine.core.util.ResourceKey; + +import javax.annotation.Nullable; +import java.util.Map; +import java.util.Optional; +import java.util.Set; + +public interface Registry extends Holder.Owner { + + ResourceKey> key(); + + @Nullable + T getValue(@Nullable ResourceKey key); + + @Nullable + T getValue(@Nullable Key id); + + Set keySet(); + + Set, T>> entrySet(); + + Set> registryKeySet(); + + boolean containsKey(Key id); + + boolean containsKey(ResourceKey key); + + Optional> get(Key id); + + Optional> get(ResourceKey key); +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/registry/WritableRegistry.java b/core/src/main/java/net/momirealms/craftengine/core/registry/WritableRegistry.java new file mode 100644 index 000000000..bd485a885 --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/registry/WritableRegistry.java @@ -0,0 +1,12 @@ +package net.momirealms.craftengine.core.registry; + +import net.momirealms.craftengine.core.util.ResourceKey; + +public interface WritableRegistry extends Registry { + + Holder.Reference registerForHolder(ResourceKey key); + + Holder.Reference register(ResourceKey key, T value); + + boolean isEmpty(); +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/sound/AbstractSoundManager.java b/core/src/main/java/net/momirealms/craftengine/core/sound/AbstractSoundManager.java new file mode 100644 index 000000000..26a55876f --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/sound/AbstractSoundManager.java @@ -0,0 +1,79 @@ +package net.momirealms.craftengine.core.sound; + +import net.momirealms.craftengine.core.pack.Pack; +import net.momirealms.craftengine.core.plugin.CraftEngine; +import net.momirealms.craftengine.core.sound.song.JukeboxSongManager; +import net.momirealms.craftengine.core.util.Key; +import net.momirealms.craftengine.core.util.MiscUtils; + +import java.nio.file.Path; +import java.util.*; + +public abstract class AbstractSoundManager implements SoundManager { + protected final CraftEngine plugin; + protected final Map byId; + protected final Map> byNamespace; + protected final JukeboxSongManager jukeboxSongManager; + + public AbstractSoundManager(CraftEngine plugin) { + this.plugin = plugin; + this.jukeboxSongManager = createJukeboxSongManager(); + this.byId = new HashMap<>(); + this.byNamespace = new HashMap<>(); + } + + protected abstract JukeboxSongManager createJukeboxSongManager(); + + @Override + public void unload() { + this.byId.clear(); + this.byNamespace.clear(); + this.jukeboxSongManager.unload(); + } + + @Override + public void load() { + this.jukeboxSongManager.load(); + } + + @Override + public void delayedLoad() { + this.jukeboxSongManager.delayedLoad(); + } + + @Override + public void parseSection(Pack pack, Path path, Key id, Map section) { + if (this.byId.containsKey(id)) { + this.plugin.logger().warn(path, "Sound " + id + " already exists"); + return; + } + boolean replace = (boolean) section.getOrDefault("replace", false); + String subtitle = (String) section.get("subtitle"); + List soundList = (List) section.get("sounds"); + List sounds = new ArrayList<>(); + for (Object sound : soundList) { + if (sound instanceof String soundPath) { + sounds.add(Sound.path(soundPath)); + } else if (sound instanceof Map map) { + sounds.add(Sound.SoundFile.fromMap(MiscUtils.castToMap(map, false))); + } + } + SoundEvent event = new SoundEvent(id, replace, subtitle, sounds); + this.byId.put(id, event); + this.byNamespace.computeIfAbsent(id.namespace(), k -> new ArrayList<>()).add(event); + } + + @Override + public Map sounds() { + return Collections.unmodifiableMap(this.byId); + } + + public Map> soundsByNamespace() { + return Collections.unmodifiableMap(this.byNamespace); + } + + @Override + public JukeboxSongManager jukeboxSongManager() { + return this.jukeboxSongManager; + } +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/sound/Sound.java b/core/src/main/java/net/momirealms/craftengine/core/sound/Sound.java new file mode 100644 index 000000000..df6de9576 --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/sound/Sound.java @@ -0,0 +1,164 @@ +package net.momirealms.craftengine.core.sound; + +import com.google.gson.JsonElement; +import com.google.gson.JsonObject; +import com.google.gson.JsonPrimitive; +import net.momirealms.craftengine.core.util.MiscUtils; + +import java.util.HashMap; +import java.util.Map; +import java.util.Optional; +import java.util.function.Supplier; + +public interface Sound extends Supplier { + + static SoundPath path(final String path) { + return new SoundPath(path); + } + + static SoundFile.Builder file(final String name) { + return new SoundFile.Builder(name); + } + + record SoundPath(String path) implements Sound { + + @Override + public JsonElement get() { + return new JsonPrimitive(this.path); + } + } + + class SoundFile implements Sound { + private final String name; + private final float volume; + private final float pitch; + private final int weight; + private final boolean stream; + private final int attenuationDistance; + private final boolean preload; + private final String type; + + public SoundFile(String name, float volume, float pitch, int weight, boolean stream, int attenuationDistance, boolean preload, String type) { + this.name = name; + this.volume = volume; + this.pitch = pitch; + this.weight = weight; + this.stream = stream; + this.attenuationDistance = attenuationDistance; + this.preload = preload; + this.type = type; + } + + public static SoundFile fromMap(Map map) { + String name = (String) map.get("name"); + if (name == null) throw new IllegalArgumentException("Missing 'name' for sound"); + Builder builder = file(name); + for (Map.Entry entry : map.entrySet()) { + Optional.ofNullable(Builder.MODIFIERS.get(entry.getKey())).ifPresent(modifier -> { + modifier.apply(builder, entry.getValue()); + }); + } + return builder.build(); + } + + @Override + public JsonElement get() { + JsonObject json = new JsonObject(); + json.addProperty("name", this.name); + if (this.volume != 1f) { + json.addProperty("volume", this.volume); + } + if (this.pitch != 1f) { + json.addProperty("pitch", this.pitch); + } + if (this.weight != 1) { + json.addProperty("weight", this.weight); + } + if (this.stream) { + json.addProperty("stream", true); + } + if (this.attenuationDistance != 16) { + json.addProperty("attenuation_distance", this.attenuationDistance); + } + if (this.preload) { + json.addProperty("preload", true); + } + if (this.type != null && !this.type.equals("file")) { + json.addProperty("type", this.type); + } + return json; + } + + public static class Builder { + public static final Map MODIFIERS = new HashMap<>(); + + static { + MODIFIERS.put("volume", (b, o) -> b.volume(MiscUtils.getAsFloat(o))); + MODIFIERS.put("pitch", (b, o) -> b.pitch(MiscUtils.getAsFloat(o))); + MODIFIERS.put("weight", (b, o) -> b.pitch(MiscUtils.getAsInt(o))); + MODIFIERS.put("stream", (b, o) -> b.stream((boolean) o)); + MODIFIERS.put("attenuation-distance", (b, o) -> b.attenuationDistance(MiscUtils.getAsInt(o))); + MODIFIERS.put("preload", (b, o) -> b.preload((boolean) o)); + MODIFIERS.put("type", (b, o) -> b.type(o.toString())); + } + + private final String name; + private float volume = 1.0f; + private float pitch = 1.0f; + private int weight = 1; + private boolean stream = false; + private int attenuationDistance = 16; + private boolean preload = false; + private String type = "file"; + + public Builder(String name) { + this.name = name; + } + + public Builder volume(float volume) { + this.volume = volume; + return this; + } + + public Builder pitch(float pitch) { + this.pitch = pitch; + return this; + } + + public Builder weight(int weight) { + this.weight = weight; + return this; + } + + public Builder stream(boolean stream) { + this.stream = stream; + return this; + } + + public Builder attenuationDistance(int attenuation_distance) { + this.attenuationDistance = attenuation_distance; + return this; + } + + public Builder preload(boolean preload) { + this.preload = preload; + return this; + } + + public Builder type(String type) { + this.type = type; + return this; + } + + public SoundFile build() { + return new SoundFile(name, volume, pitch, weight, stream, attenuationDistance, preload, type); + } + + @FunctionalInterface + public interface Modifier { + + void apply(Builder builder, Object value); + } + } + } +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/sound/SoundEvent.java b/core/src/main/java/net/momirealms/craftengine/core/sound/SoundEvent.java new file mode 100644 index 000000000..4880ecbf3 --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/sound/SoundEvent.java @@ -0,0 +1,28 @@ +package net.momirealms.craftengine.core.sound; + +import com.google.gson.JsonArray; +import com.google.gson.JsonObject; +import net.momirealms.craftengine.core.util.Key; + +import java.util.List; +import java.util.function.Supplier; + +public record SoundEvent(Key id, boolean replace, String subTitle, List sounds) implements Supplier { + + @Override + public JsonObject get() { + JsonObject json = new JsonObject(); + if (this.replace) { + json.addProperty("replace", true); + } + if (this.subTitle != null) { + json.addProperty("subtitle", this.subTitle); + } + JsonArray sounds = new JsonArray(); + for (Sound sound : this.sounds) { + sounds.add(sound.get()); + } + json.add("sounds", sounds); + return json; + } +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/sound/SoundManager.java b/core/src/main/java/net/momirealms/craftengine/core/sound/SoundManager.java new file mode 100644 index 000000000..2fa986932 --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/sound/SoundManager.java @@ -0,0 +1,29 @@ +package net.momirealms.craftengine.core.sound; + +import net.momirealms.craftengine.core.pack.LoadingSequence; +import net.momirealms.craftengine.core.plugin.Reloadable; +import net.momirealms.craftengine.core.plugin.config.ConfigSectionParser; +import net.momirealms.craftengine.core.sound.song.JukeboxSongManager; +import net.momirealms.craftengine.core.util.Key; + +import java.util.Map; + +public interface SoundManager extends Reloadable, ConfigSectionParser { + String CONFIG_SECTION_NAME = "sounds"; + + void delayedLoad(); + + Map sounds(); + + JukeboxSongManager jukeboxSongManager(); + + @Override + default int loadingSequence() { + return LoadingSequence.SOUND; + } + + @Override + default String sectionId() { + return CONFIG_SECTION_NAME; + } +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/sound/song/AbstractJukeboxSongManager.java b/core/src/main/java/net/momirealms/craftengine/core/sound/song/AbstractJukeboxSongManager.java new file mode 100644 index 000000000..c78682f3d --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/sound/song/AbstractJukeboxSongManager.java @@ -0,0 +1,53 @@ +package net.momirealms.craftengine.core.sound.song; + +import net.kyori.adventure.text.Component; +import net.momirealms.craftengine.core.pack.Pack; +import net.momirealms.craftengine.core.plugin.CraftEngine; +import net.momirealms.craftengine.core.util.AdventureHelper; +import net.momirealms.craftengine.core.util.Key; +import net.momirealms.craftengine.core.util.MiscUtils; +import net.momirealms.craftengine.core.util.VersionHelper; + +import java.nio.file.Path; +import java.util.HashMap; +import java.util.Map; + +public abstract class AbstractJukeboxSongManager implements JukeboxSongManager { + protected final Map songs = new HashMap<>(); + protected CraftEngine plugin; + + public AbstractJukeboxSongManager(CraftEngine plugin) { + this.plugin = plugin; + } + + @Override + public void unload() { + this.songs.clear(); + } + + @Override + public void delayedLoad() { + if (!VersionHelper.isVersionNewerThan1_21()) return; + this.registerSongs(this.songs); + } + + @Override + public void parseSection(Pack pack, Path path, Key id, Map section) { + if (this.songs.containsKey(id)) { + this.plugin.logger().warn("Duplicate song id: " + id); + return; + } + String sound = (String) section.get("sound"); + if (sound == null) { + this.plugin.logger().warn(path, "No sound specified"); + return; + } + Component description = AdventureHelper.miniMessage(section.getOrDefault("description", "").toString()); + float length = MiscUtils.getAsFloat(section.get("length")); + int comparatorOutput = MiscUtils.getAsInt(section.getOrDefault("comparator-output", 15)); + JukeboxSong song = new JukeboxSong(Key.of(sound), description, length, comparatorOutput, MiscUtils.getAsFloat(section.getOrDefault("range", 32f))); + this.songs.put(id, song); + } + + protected abstract void registerSongs(Map songs); +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/sound/song/JukeboxSong.java b/core/src/main/java/net/momirealms/craftengine/core/sound/song/JukeboxSong.java new file mode 100644 index 000000000..b9ff3a313 --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/sound/song/JukeboxSong.java @@ -0,0 +1,7 @@ +package net.momirealms.craftengine.core.sound.song; + +import net.kyori.adventure.text.Component; +import net.momirealms.craftengine.core.util.Key; + +public record JukeboxSong(Key sound, Component description, float lengthInSeconds, int comparatorOutput, float range) { +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/sound/song/JukeboxSongManager.java b/core/src/main/java/net/momirealms/craftengine/core/sound/song/JukeboxSongManager.java new file mode 100644 index 000000000..f1f992411 --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/sound/song/JukeboxSongManager.java @@ -0,0 +1,21 @@ +package net.momirealms.craftengine.core.sound.song; + +import net.momirealms.craftengine.core.pack.LoadingSequence; +import net.momirealms.craftengine.core.plugin.Reloadable; +import net.momirealms.craftengine.core.plugin.config.ConfigSectionParser; + +public interface JukeboxSongManager extends Reloadable, ConfigSectionParser { + String CONFIG_SECTION_NAME = "jukebox_songs"; + + @Override + default int loadingSequence() { + return LoadingSequence.JUKEBOX_SONG; + } + + @Override + default String sectionId() { + return CONFIG_SECTION_NAME; + } + + void delayedLoad(); +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/util/AdventureHelper.java b/core/src/main/java/net/momirealms/craftengine/core/util/AdventureHelper.java new file mode 100644 index 000000000..9cb93b0ba --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/util/AdventureHelper.java @@ -0,0 +1,268 @@ +package net.momirealms.craftengine.core.util; + +import com.github.benmanes.caffeine.cache.Cache; +import com.github.benmanes.caffeine.cache.Caffeine; +import net.kyori.adventure.audience.Audience; +import net.kyori.adventure.key.Key; +import net.kyori.adventure.sound.Sound; +import net.kyori.adventure.text.Component; +import net.kyori.adventure.text.minimessage.MiniMessage; +import net.kyori.adventure.text.serializer.gson.GsonComponentSerializer; +import net.kyori.adventure.title.Title; + +import java.time.Duration; +import java.util.concurrent.TimeUnit; + +/** + * Helper class for handling Adventure components and related functionalities. + */ +public class AdventureHelper { + + private final MiniMessage miniMessage; + private final MiniMessage miniMessageStrict; + private final GsonComponentSerializer gsonComponentSerializer; + private final Cache miniMessageToJsonCache = Caffeine.newBuilder().expireAfterWrite(5, TimeUnit.MINUTES).build(); + public static boolean legacySupport = false; + + private AdventureHelper() { + this.miniMessage = MiniMessage.builder().build(); + this.miniMessageStrict = MiniMessage.builder().strict(true).build(); + this.gsonComponentSerializer = GsonComponentSerializer.builder().build(); + } + + private static class SingletonHolder { + private static final AdventureHelper INSTANCE = new AdventureHelper(); + } + + /** + * Retrieves the singleton instance of AdventureHelper. + * + * @return the singleton instance + */ + public static AdventureHelper getInstance() { + return SingletonHolder.INSTANCE; + } + + /** + * Converts a MiniMessage string to a Component. + * + * @param text the MiniMessage string + * @return the resulting Component + */ + public static Component miniMessage(String text) { + if (legacySupport) { + return miniMessage().deserialize(legacyToMiniMessage(text)); + } else { + return miniMessage().deserialize(text); + } + } + + /** + * Retrieves the MiniMessage instance. + * + * @return the MiniMessage instance + */ + public static MiniMessage miniMessage() { + return getInstance().miniMessage; + } + + /** + * Retrieves the GsonComponentSerializer instance. + * + * @return the GsonComponentSerializer instance + */ + public static GsonComponentSerializer getGson() { + return getInstance().gsonComponentSerializer; + } + + /** + * Converts a MiniMessage string to a JSON string. + * + * @param miniMessage the MiniMessage string + * @return the JSON string representation + */ + public static String miniMessageToJson(String miniMessage) { + AdventureHelper instance = getInstance(); + return instance.miniMessageToJsonCache.get(miniMessage, (text) -> instance.gsonComponentSerializer.serialize(miniMessage(text))); + } + + /** + * Sends a title to an audience. + * + * @param audience the audience to send the title to + * @param title the title component + * @param subtitle the subtitle component + * @param fadeIn the fade-in duration in ticks + * @param stay the stay duration in ticks + * @param fadeOut the fade-out duration in ticks + */ + public static void sendTitle(Audience audience, Component title, Component subtitle, int fadeIn, int stay, int fadeOut) { + audience.showTitle(Title.title(title, subtitle, Title.Times.times(Duration.ofMillis(fadeIn * 50L), Duration.ofMillis(stay * 50L), Duration.ofMillis(fadeOut * 50L)))); + } + + /** + * Sends an action bar message to an audience. + * + * @param audience the audience to send the action bar message to + * @param actionBar the action bar component + */ + public static void sendActionBar(Audience audience, Component actionBar) { + audience.sendActionBar(actionBar); + } + + /** + * Sends a message to an audience. + * + * @param audience the audience to send the message to + * @param message the message component + */ + public static void sendMessage(Audience audience, Component message) { + audience.sendMessage(message); + } + + /** + * Plays a sound for an audience. + * + * @param audience the audience to play the sound for + * @param sound the sound to play + */ + public static void playSound(Audience audience, Sound sound) { + audience.playSound(sound); + } + + /** + * Surrounds text with a MiniMessage font tag. + * + * @param text the text to surround + * @param font the font as a {@link Key} + * @return the text surrounded by the MiniMessage font tag + */ + public static String surroundWithMiniMessageFont(String text, Key font) { + return "" + text + ""; + } + + /** + * Surrounds text with a MiniMessage font tag. + * + * @param text the text to surround + * @param font the font as a {@link String} + * @return the text surrounded by the MiniMessage font tag + */ + public static String surroundWithMiniMessageFont(String text, String font) { + return "" + text + ""; + } + + /** + * Converts a JSON string to a MiniMessage string. + * + * @param json the JSON string + * @return the MiniMessage string representation + */ + public static String jsonToMiniMessage(String json) { + return getInstance().miniMessageStrict.serialize(getInstance().gsonComponentSerializer.deserialize(json)); + } + + /** + * Converts a JSON string to a Component. + * + * @param json the JSON string + * @return the resulting Component + */ + public static Component jsonToComponent(String json) { + return getInstance().gsonComponentSerializer.deserialize(json); + } + + /** + * Converts a Component to a JSON string. + * + * @param component the Component to convert + * @return the JSON string representation + */ + public static String componentToJson(Component component) { + return getGson().serialize(component); + } + + /** + * Checks if a character is a legacy color code. + * + * @param c the character to check + * @return true if the character is a color code, false otherwise + */ + @SuppressWarnings("BooleanMethodIsAlwaysInverted") + public static boolean isLegacyColorCode(char c) { + return c == '§' || c == '&'; + } + + /** + * Converts a legacy color code string to a MiniMessage string. + * + * @param legacy the legacy color code string + * @return the MiniMessage string representation + */ + public static String legacyToMiniMessage(String legacy) { + StringBuilder stringBuilder = new StringBuilder(); + char[] chars = legacy.toCharArray(); + for (int i = 0; i < chars.length; i++) { + if (!isLegacyColorCode(chars[i])) { + stringBuilder.append(chars[i]); + continue; + } + if (i + 1 >= chars.length) { + stringBuilder.append(chars[i]); + continue; + } + switch (chars[i+1]) { + case '0' -> stringBuilder.append(""); + case '1' -> stringBuilder.append(""); + case '2' -> stringBuilder.append(""); + case '3' -> stringBuilder.append(""); + case '4' -> stringBuilder.append(""); + case '5' -> stringBuilder.append(""); + case '6' -> stringBuilder.append(""); + case '7' -> stringBuilder.append(""); + case '8' -> stringBuilder.append(""); + case '9' -> stringBuilder.append(""); + case 'a' -> stringBuilder.append(""); + case 'b' -> stringBuilder.append(""); + case 'c' -> stringBuilder.append(""); + case 'd' -> stringBuilder.append(""); + case 'e' -> stringBuilder.append(""); + case 'f' -> stringBuilder.append(""); + case 'r' -> stringBuilder.append(""); + case 'l' -> stringBuilder.append(""); + case 'm' -> stringBuilder.append(""); + case 'o' -> stringBuilder.append(""); + case 'n' -> stringBuilder.append(""); + case 'k' -> stringBuilder.append(""); + case 'x' -> { + if (i + 13 >= chars.length + || !isLegacyColorCode(chars[i+2]) + || !isLegacyColorCode(chars[i+4]) + || !isLegacyColorCode(chars[i+6]) + || !isLegacyColorCode(chars[i+8]) + || !isLegacyColorCode(chars[i+10]) + || !isLegacyColorCode(chars[i+12])) { + stringBuilder.append(chars[i]); + continue; + } + stringBuilder + .append("<#") + .append(chars[i+3]) + .append(chars[i+5]) + .append(chars[i+7]) + .append(chars[i+9]) + .append(chars[i+11]) + .append(chars[i+13]) + .append(">"); + i += 12; + } + default -> { + stringBuilder.append(chars[i]); + continue; + } + } + i++; + } + return stringBuilder.toString(); + } +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/util/ArrayUtils.java b/core/src/main/java/net/momirealms/craftengine/core/util/ArrayUtils.java new file mode 100644 index 000000000..e5bf13550 --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/util/ArrayUtils.java @@ -0,0 +1,62 @@ +package net.momirealms.craftengine.core.util; + +import java.lang.reflect.Array; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; + +public class ArrayUtils { + + private ArrayUtils() {} + + public static T[] subArray(T[] array, int index) { + if (index < 0) { + throw new IllegalArgumentException("Index should be a value no lower than 0"); + } + if (array.length <= index) { + @SuppressWarnings("unchecked") + T[] emptyArray = (T[]) Array.newInstance(array.getClass().getComponentType(), 0); + return emptyArray; + } + @SuppressWarnings("unchecked") + T[] subArray = (T[]) Array.newInstance(array.getClass().getComponentType(), array.length - index); + System.arraycopy(array, index, subArray, 0, array.length - index); + return subArray; + } + + public static List splitArray(T[] array, int chunkSize) { + List result = new ArrayList<>(); + for (int i = 0; i < array.length; i += chunkSize) { + int end = Math.min(array.length, i + chunkSize); + @SuppressWarnings("unchecked") + T[] chunk = (T[]) Array.newInstance(array.getClass().getComponentType(), end - i); + System.arraycopy(array, i, chunk, 0, end - i); + result.add(chunk); + } + return result; + } + + public static T[] appendElementToArrayTail(T[] array, T element) { + T[] newArray = Arrays.copyOf(array, array.length + 1); + newArray[array.length] = element; + return newArray; + } + + @SuppressWarnings("unchecked") + public static T[] appendElementToArrayHead(T[] array, T element) { + T[] newArray = (T[]) new Object[array.length + 1]; + System.arraycopy(array, 0, newArray, 1, array.length); + newArray[0] = element; + return newArray; + } + + public static String[] splitValue(String value) { + return value.substring(value.indexOf('[') + 1, value.lastIndexOf(']')) + .replaceAll("\\s", "") + .split(","); + } + + public static boolean isEmpty(Object[] array) { + return array == null || array.length == 0; + } +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/util/Base64Utils.java b/core/src/main/java/net/momirealms/craftengine/core/util/Base64Utils.java new file mode 100644 index 000000000..f741b7b48 --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/util/Base64Utils.java @@ -0,0 +1,15 @@ +package net.momirealms.craftengine.core.util; + +import java.util.Base64; + +public class Base64Utils { + + private Base64Utils() {} + + public static byte[] decode(byte[] input, int times) { + for (int i = 0; i < times; i++) { + input = Base64.getDecoder().decode(input); + } + return input; + } +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/util/Cancellable.java b/core/src/main/java/net/momirealms/craftengine/core/util/Cancellable.java new file mode 100644 index 000000000..d9decdb44 --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/util/Cancellable.java @@ -0,0 +1,8 @@ +package net.momirealms.craftengine.core.util; + +public interface Cancellable { + + boolean isCancelled(); + + void setCancelled(boolean cancel); +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/util/CharacterUtils.java b/core/src/main/java/net/momirealms/craftengine/core/util/CharacterUtils.java new file mode 100644 index 000000000..fe8c26071 --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/util/CharacterUtils.java @@ -0,0 +1,68 @@ +package net.momirealms.craftengine.core.util; + +import java.util.stream.IntStream; + +public class CharacterUtils { + + private CharacterUtils() {} + + public static char[] decodeUnicodeToChars(String unicodeString) { + String processedString = unicodeString.replace("\\u", ""); + int length = processedString.length() / 4; + char[] chars = new char[length]; + for (int i = 0; i < length; i++) { + int codePoint = Integer.parseInt(processedString.substring(i * 4, i * 4 + 4), 16); + if (Character.isSupplementaryCodePoint(codePoint)) { + chars[i] = Character.highSurrogate(codePoint); + chars[++i] = Character.lowSurrogate(codePoint); + } else { + chars[i] = (char) codePoint; + } + } + return chars; + } + + public static int charsToCodePoint(char[] chars) { + if (chars.length == 1) { + return chars[0]; + } else if (chars.length == 2) { + if (Character.isHighSurrogate(chars[0]) && Character.isLowSurrogate(chars[1])) { + return Character.toCodePoint(chars[0], chars[1]); + } else { + throw new IllegalArgumentException("Invalid surrogate pair: not a valid high and low surrogate combination."); + } + } else { + throw new IllegalArgumentException("The given chars array must contain either 1 or 2 characters."); + } + } + + public static int[] charsToCodePoints(char[] chars) { + return IntStream.range(0, chars.length) + .filter(i -> !Character.isLowSurrogate(chars[i])) + .map(i -> { + char c1 = chars[i]; + if (Character.isHighSurrogate(c1)) { + if (i + 1 < chars.length && Character.isLowSurrogate(chars[i + 1])) { + char c2 = chars[++i]; + return Character.toCodePoint(c1, c2); + } else { + throw new IllegalArgumentException("Illegal surrogate pair: High surrogate without matching low surrogate at index " + i); + } + } else { + return c1; + } + }).toArray(); + } + + public static String encodeCharToUnicode(char c) { + return String.format("\\u%04x", (int) c); + } + + public static String encodeCharsToUnicode(char[] chars) { + StringBuilder builder = new StringBuilder(); + for (char value : chars) { + builder.append(encodeCharToUnicode(value)); + } + return builder.toString(); + } +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/util/Direction.java b/core/src/main/java/net/momirealms/craftengine/core/util/Direction.java new file mode 100644 index 000000000..44d222cd9 --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/util/Direction.java @@ -0,0 +1,316 @@ +package net.momirealms.craftengine.core.util; + +import net.momirealms.craftengine.core.entity.Entity; +import net.momirealms.craftengine.core.world.Vec3i; +import org.jetbrains.annotations.Nullable; + +import java.util.Arrays; +import java.util.Comparator; +import java.util.Random; +import java.util.function.Predicate; + +public enum Direction { + DOWN(0, 1, -1, AxisDirection.NEGATIVE, Axis.Y, new Vec3i(0, -1, 0)), + UP(1, 0, -1, AxisDirection.POSITIVE, Axis.Y, new Vec3i(0, 1, 0)), + NORTH(2, 3, 2, AxisDirection.NEGATIVE, Axis.Z, new Vec3i(0, 0, -1)), + SOUTH(3, 2, 0, AxisDirection.POSITIVE, Axis.Z, new Vec3i(0, 0, 1)), + WEST(4, 5, 1, AxisDirection.NEGATIVE, Axis.X, new Vec3i(-1, 0, 0)), + EAST(5, 4, 3, AxisDirection.POSITIVE, Axis.X, new Vec3i(1, 0, 0)); + + private static final Direction[] VALUES = values(); + private static final Direction[] BY_3D_DATA = Arrays.stream(VALUES) + .sorted(Comparator.comparingInt(direction -> direction.data3d)) + .toArray(Direction[]::new); + private static final Direction[] BY_2D_DATA = Arrays.stream(VALUES) + .filter(direction -> direction.axis().isHorizontal()) + .sorted(Comparator.comparingInt(direction -> direction.data2d)) + .toArray(Direction[]::new); + + private final int data3d; + private final int oppositeIndex; + private final int data2d; + private final Axis axis; + private final AxisDirection axisDirection; + private final Vec3i vec; + private final int adjX; + private final int adjY; + private final int adjZ; + + Direction( + final int id, + final int idOpposite, + final int idHorizontal, + final AxisDirection direction, + final Axis axis, + final Vec3i vector + ) { + this.data3d = id; + this.data2d = idHorizontal; + this.oppositeIndex = idOpposite; + this.axis = axis; + this.axisDirection = direction; + this.vec = vector; + this.adjX = vector.x(); + this.adjY = vector.y(); + this.adjZ = vector.z(); + } + + public HorizontalDirection toHorizontalDirection() { + return switch (this) { + case DOWN, UP -> null; + case NORTH -> HorizontalDirection.NORTH; + case SOUTH -> HorizontalDirection.SOUTH; + case WEST -> HorizontalDirection.WEST; + case EAST -> HorizontalDirection.EAST; + }; + } + + public static Direction[] orderedByNearest(Entity entity) { + float xRotation = entity.getXRot() * (float) (Math.PI / 180.0); + float yRotation = -entity.getYRot() * (float) (Math.PI / 180.0); + float sinX = (float) Math.sin(xRotation); + float cosX = (float) Math.cos(xRotation); + float sinY = (float) Math.sin(yRotation); + float cosY = (float) Math.cos(yRotation); + boolean isFacingPositiveY = sinY > 0.0F; + boolean isFacingNegativeX = sinX < 0.0F; + boolean isFacingPositiveX = cosY > 0.0F; + float adjustedSinY = isFacingPositiveY ? sinY : -sinY; + float adjustedSinX = isFacingNegativeX ? -sinX : sinX; + float adjustedCosY = isFacingPositiveX ? cosY : -cosY; + float horizontalProjection = adjustedSinY * cosX; + float verticalProjection = adjustedCosY * cosX; + Direction horizontalDirection = isFacingPositiveY ? EAST : WEST; + Direction verticalDirection = isFacingNegativeX ? UP : DOWN; + Direction depthDirection = isFacingPositiveX ? SOUTH : NORTH; + if (adjustedSinY > adjustedCosY) { + if (adjustedSinX > horizontalProjection) { + return createDirectionArray(verticalDirection, horizontalDirection, depthDirection); + } else { + return verticalProjection > adjustedSinX + ? createDirectionArray(horizontalDirection, depthDirection, verticalDirection) + : createDirectionArray(horizontalDirection, verticalDirection, depthDirection); + } + } else if (adjustedSinX > verticalProjection) { + return createDirectionArray(verticalDirection, depthDirection, horizontalDirection); + } else { + return horizontalProjection > adjustedSinX + ? createDirectionArray(depthDirection, horizontalDirection, verticalDirection) + : createDirectionArray(depthDirection, verticalDirection, horizontalDirection); + } + } + + private static Direction[] createDirectionArray(Direction first, Direction second, Direction third) { + return new Direction[]{first, second, third, third.opposite(), second.opposite(), first.opposite()}; + } + + public static float getYaw(Direction direction) { + switch (direction) { + case NORTH -> { + return 180f; + } + case SOUTH -> { + return 0f; + } + case WEST -> { + return 90f; + } + case EAST -> { + return -90f; + } + default -> throw new IllegalArgumentException(); + } + } + + public int stepX() { + return this.adjX; + } + + public int stepY() { + return this.adjY; + } + + public int stepZ() { + return this.adjZ; + } + + public Vec3i vector() { + return vec; + } + + public Axis axis() { + return this.axis; + } + + public AxisDirection axisDirection() { + return axisDirection; + } + + public int data2d() { + return data2d; + } + + public int data3d() { + return data3d; + } + + public int oppositeIndex() { + return oppositeIndex; + } + + public Direction opposite() { + return VALUES[oppositeIndex]; + } + + public Direction clockWise() { + return switch (this) { + case NORTH -> EAST; + case SOUTH -> WEST; + case WEST -> NORTH; + case EAST -> SOUTH; + default -> throw new IllegalStateException(); + }; + } + + public Direction counterClockWise() { + return switch (this) { + case NORTH -> WEST; + case SOUTH -> EAST; + case WEST -> SOUTH; + case EAST -> NORTH; + default -> throw new IllegalStateException(); + }; + } + + public static Direction from3DDataValue(int id) { + return BY_3D_DATA[Math.abs(id % BY_3D_DATA.length)]; + } + + public static Direction from2DDataValue(int value) { + return BY_2D_DATA[Math.abs(value % BY_2D_DATA.length)]; + } + + public static Direction fromAxisAndDirection(Axis axis, AxisDirection direction) { + return switch (axis) { + case X -> direction == AxisDirection.POSITIVE ? EAST : WEST; + case Y -> direction == AxisDirection.POSITIVE ? UP : DOWN; + case Z -> direction == AxisDirection.POSITIVE ? SOUTH : NORTH; + }; + } + + public enum Axis implements Predicate { + X() { + @Override + public int choose(int x, int y, int z) { + return x; + } + + @Override + public double choose(double x, double y, double z) { + return x; + } + + @Override + public Direction getPositive() { + return Direction.EAST; + } + + @Override + public Direction getNegative() { + return Direction.WEST; + } + }, + Y() { + @Override + public int choose(int x, int y, int z) { + return y; + } + + @Override + public double choose(double x, double y, double z) { + return y; + } + + @Override + public Direction getPositive() { + return Direction.UP; + } + + @Override + public Direction getNegative() { + return Direction.DOWN; + } + }, + Z() { + @Override + public int choose(int x, int y, int z) { + return z; + } + + @Override + public double choose(double x, double y, double z) { + return z; + } + + @Override + public Direction getPositive() { + return Direction.SOUTH; + } + + @Override + public Direction getNegative() { + return Direction.NORTH; + } + }; + + public static final Axis[] VALUES = values(); + + public boolean isVertical() { + return this == Y; + } + + public boolean isHorizontal() { + return this == X || this == Z; + } + + public abstract Direction getPositive(); + + public abstract Direction getNegative(); + + public Direction[] getDirections() { + return new Direction[]{this.getPositive(), this.getNegative()}; + } + + public static Axis random(Random random) { + return values()[random.nextInt(VALUES.length)]; + } + + @Override + public boolean test(@Nullable Direction direction) { + return direction != null && direction.axis() == this; + } + + public abstract int choose(int x, int y, int z); + + public abstract double choose(double x, double y, double z); + } + + public enum AxisDirection { + POSITIVE(1), + NEGATIVE(-1); + + private final int step; + + AxisDirection(final int offset) { + this.step = offset; + } + + public int step() { + return this.step; + } + + public AxisDirection opposite() { + return this == POSITIVE ? NEGATIVE : POSITIVE; + } + } +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/util/ExceptionCollector.java b/core/src/main/java/net/momirealms/craftengine/core/util/ExceptionCollector.java new file mode 100644 index 000000000..868df2a03 --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/util/ExceptionCollector.java @@ -0,0 +1,23 @@ +package net.momirealms.craftengine.core.util; + +import org.jetbrains.annotations.Nullable; + +public class ExceptionCollector { + @Nullable + private T result; + + public void add(T throwable) { + if (this.result == null) { + this.result = throwable; + } else { + this.result.addSuppressed(throwable); + } + } + + public void throwIfPresent() throws T { + if (this.result != null) { + throw this.result; + } + } +} + diff --git a/core/src/main/java/net/momirealms/craftengine/core/util/FileUtils.java b/core/src/main/java/net/momirealms/craftengine/core/util/FileUtils.java new file mode 100644 index 000000000..b767cddda --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/util/FileUtils.java @@ -0,0 +1,47 @@ +package net.momirealms.craftengine.core.util; + +import java.io.IOException; +import java.nio.file.DirectoryStream; +import java.nio.file.Files; +import java.nio.file.Path; +import java.util.ArrayDeque; +import java.util.ArrayList; +import java.util.Deque; +import java.util.List; + +public class FileUtils { + + private FileUtils() {} + + public static void createDirectoriesSafe(Path path) throws IOException { + Files.createDirectories(Files.exists(path) ? path.toRealPath() : path); + } + + public static Pair, List> getConfigsDeeply(Path configFolder) { + if (!Files.exists(configFolder)) return Pair.of(List.of(), List.of()); + List validYaml = new ArrayList<>(); + List validJson = new ArrayList<>(); + Deque pathDeque = new ArrayDeque<>(); + pathDeque.push(configFolder); + while (!pathDeque.isEmpty()) { + Path path = pathDeque.pop(); + try (DirectoryStream stream = Files.newDirectoryStream(path)) { + for (Path subPath : stream) { + if (Files.isDirectory(subPath)) { + pathDeque.push(subPath); + } else if (Files.isRegularFile(subPath)) { + String pathString = subPath.toString(); + if (pathString.endsWith(".yml")) { + validYaml.add(subPath); + } else if (pathString.endsWith(".json")) { + validJson.add(subPath); + } + } + } + } catch (IOException e) { + throw new RuntimeException(e); + } + } + return Pair.of(validYaml, validJson); + } +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/util/FormatUtils.java b/core/src/main/java/net/momirealms/craftengine/core/util/FormatUtils.java new file mode 100644 index 000000000..6edc92052 --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/util/FormatUtils.java @@ -0,0 +1,14 @@ +package net.momirealms.craftengine.core.util; + +public class FormatUtils { + + private FormatUtils() {} + + public static String miniMessageFont(String raw, String font) { + return "" + raw + ""; + } + + public static String mineDownFont(String raw, String font) { + return "[" + raw + "](font=" + font + ")"; + } +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/util/FriendlyByteBuf.java b/core/src/main/java/net/momirealms/craftengine/core/util/FriendlyByteBuf.java new file mode 100644 index 000000000..7b298a6cd --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/util/FriendlyByteBuf.java @@ -0,0 +1,1342 @@ +package net.momirealms.craftengine.core.util; + +import com.google.common.collect.Maps; +import io.netty.buffer.ByteBuf; +import io.netty.buffer.ByteBufAllocator; +import io.netty.buffer.ByteBufInputStream; +import io.netty.buffer.ByteBufOutputStream; +import io.netty.handler.codec.DecoderException; +import io.netty.handler.codec.EncoderException; +import io.netty.util.ByteProcessor; +import it.unimi.dsi.fastutil.ints.IntArrayList; +import it.unimi.dsi.fastutil.ints.IntList; +import net.momirealms.craftengine.core.world.BlockPos; +import net.momirealms.sparrow.nbt.CompoundTag; +import net.momirealms.sparrow.nbt.NBT; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +import java.io.IOException; +import java.io.InputStream; +import java.io.OutputStream; +import java.nio.ByteBuffer; +import java.nio.ByteOrder; +import java.nio.channels.FileChannel; +import java.nio.channels.GatheringByteChannel; +import java.nio.channels.ScatteringByteChannel; +import java.nio.charset.Charset; +import java.nio.charset.StandardCharsets; +import java.util.*; +import java.util.function.BiConsumer; +import java.util.function.Consumer; +import java.util.function.Function; +import java.util.function.IntFunction; + +public class FriendlyByteBuf extends ByteBuf { + + private final ByteBuf source; + + public FriendlyByteBuf(ByteBuf parent) { + this.source = parent; + } + + public ByteBuf source() { + return source; + } + + public BlockPos readBlockPos(ByteBuf buf) { + return BlockPos.of(buf.readLong()); + } + + public FriendlyByteBuf writeBlockPos(BlockPos pos) { + this.writeLong(pos.asLong()); + return this; + } + + public static int getVarIntSize(int value) { + for (int shift = 1; shift < 5; ++shift) { + if ((value & -1 << shift * 7) == 0) { + return shift; + } + } + return 5; + } + + public static int getVarLongSize(long value) { + for (int shift = 1; shift < 10; ++shift) { + if ((value & -1L << shift * 7) == 0L) { + return shift; + } + } + return 10; + } + + public IntList readIntIdList() { + int listSize = this.readVarInt(); + IntArrayList idList = new IntArrayList(); + for (int i = 0; i < listSize; ++i) { + idList.add(this.readVarInt()); + } + return idList; + } + + public void writeIntIdList(IntList idList) { + this.writeVarInt(idList.size()); + idList.forEach(this::writeVarInt); + } + + public > M readMap(IntFunction mapFactory, FriendlyByteBuf.Reader keyReader, FriendlyByteBuf.Reader valueReader) { + int mapSize = this.readVarInt(); + M map = mapFactory.apply(mapSize); + for (int i = 0; i < mapSize; ++i) { + K key = keyReader.apply(this); + V value = valueReader.apply(this); + map.put(key, value); + } + return map; + } + + public Map readMap(FriendlyByteBuf.Reader keyReader, FriendlyByteBuf.Reader valueReader) { + return this.readMap(Maps::newHashMapWithExpectedSize, keyReader, valueReader); + } + + public void writeMap(Map map, FriendlyByteBuf.Writer keyWriter, FriendlyByteBuf.Writer valueWriter) { + this.writeVarInt(map.size()); + map.forEach((key, value) -> { + keyWriter.accept(this, key); + valueWriter.accept(this, value); + }); + } + + public void readWithCount(Consumer consumer) { + int count = this.readVarInt(); + for (int i = 0; i < count; ++i) { + consumer.accept(this); + } + } + + public > void writeEnumSet(EnumSet enumSet, Class enumType) { + E[] enumConstants = enumType.getEnumConstants(); + BitSet bitSet = new BitSet(enumConstants.length); + for (int i = 0; i < enumConstants.length; ++i) { + bitSet.set(i, enumSet.contains(enumConstants[i])); + } + this.writeFixedBitSet(bitSet, enumConstants.length); + } + + public > EnumSet readEnumSet(Class enumType) { + E[] enumConstants = enumType.getEnumConstants(); + BitSet bitSet = this.readFixedBitSet(enumConstants.length); + EnumSet enumSet = EnumSet.noneOf(enumType); + for (int i = 0; i < enumConstants.length; ++i) { + if (bitSet.get(i)) { + enumSet.add(enumConstants[i]); + } + } + return enumSet; + } + + public void writeOptional(Optional value, FriendlyByteBuf.Writer writer) { + if (value.isPresent()) { + this.writeBoolean(true); + writer.accept(this, value.get()); + } else { + this.writeBoolean(false); + } + } + + public Optional readOptional(FriendlyByteBuf.Reader reader) { + return this.readBoolean() ? Optional.of(reader.apply(this)) : Optional.empty(); + } + + @Nullable + public T readNullable(FriendlyByteBuf.Reader reader) { + return this.readBoolean() ? reader.apply(this) : null; + } + + public void writeNullable(@Nullable T value, FriendlyByteBuf.Writer writer) { + if (value != null) { + this.writeBoolean(true); + writer.accept(this, value); + } else { + this.writeBoolean(false); + } + } + + public byte[] readByteArray() { + return this.readByteArray(this.readableBytes()); + } + + public FriendlyByteBuf writeByteArray(byte[] array) { + this.writeVarInt(array.length); + this.writeBytes(array); + return this; + } + + public byte[] readByteArray(int maxSize) { + int arraySize = this.readVarInt(); + if (arraySize > maxSize) { + throw new DecoderException("ByteArray with size " + arraySize + " is bigger than allowed " + maxSize); + } else { + byte[] byteArray = new byte[arraySize]; + this.readBytes(byteArray); + return byteArray; + } + } + + public FriendlyByteBuf writeVarIntArray(int[] array) { + this.writeVarInt(array.length); + for (int value : array) { + this.writeVarInt(value); + } + return this; + } + + public int[] readVarIntArray() { + return this.readVarIntArray(this.readableBytes()); + } + + public int[] readVarIntArray(int maxSize) { + int arraySize = this.readVarInt(); + if (arraySize > maxSize) { + throw new DecoderException("VarIntArray with size " + arraySize + " is bigger than allowed " + maxSize); + } else { + int[] array = new int[arraySize]; + for (int i = 0; i < array.length; ++i) { + array[i] = this.readVarInt(); + } + return array; + } + } + + public FriendlyByteBuf writeLongArray(long[] array) { + this.writeVarInt(array.length); + for (long value : array) { + this.writeLong(value); + } + return this; + } + + public long[] readLongArray() { + return this.readLongArray(null); + } + + public long[] readLongArray(long @Nullable [] toArray) { + return this.readLongArray(toArray, this.readableBytes() / 8); + } + + public long[] readLongArray(long @Nullable [] toArray, int maxSize) { + int arraySize = this.readVarInt(); + if (toArray == null || toArray.length != arraySize) { + if (arraySize > maxSize) { + throw new DecoderException("LongArray with size " + arraySize + " is bigger than allowed " + maxSize); + } + toArray = new long[arraySize]; + } + for (int i = 0; i < toArray.length; ++i) { + toArray[i] = this.readLong(); + } + return toArray; + } + + public byte[] extractByteBufContents() { + int size = this.writerIndex(); + byte[] byteArray = new byte[size]; + this.getBytes(0, byteArray); + return byteArray; + } + + public int readVarInt() { + int value = 0; + int shift = 0; + byte byteValue; + do { + byteValue = this.readByte(); + value |= (byteValue & 127) << shift++ * 7; + if (shift > 5) { + throw new RuntimeException("VarInt too big"); + } + } while ((byteValue & 128) == 128); + return value; + } + + public long readVarLong() { + long value = 0L; + int shift = 0; + byte byteValue; + do { + byteValue = this.readByte(); + value |= (long) (byteValue & 127) << shift++ * 7; + if (shift > 10) { + throw new RuntimeException("VarLong too big"); + } + } while ((byteValue & 128) == 128); + return value; + } + + public FriendlyByteBuf writeUUID(UUID uuid) { + this.writeLong(uuid.getMostSignificantBits()); + this.writeLong(uuid.getLeastSignificantBits()); + return this; + } + + public UUID readUUID() { + return new UUID(this.readLong(), this.readLong()); + } + + public FriendlyByteBuf writeVarInt(int value) { + while ((value & -128) != 0) { + this.writeByte((value & 127) | 128); + value >>>= 7; + } + this.writeByte(value & 127); + return this; + } + + public FriendlyByteBuf writeVarLong(long value) { + while ((value & -128L) != 0L) { + this.writeByte((int) (value & 127L) | 128); + value >>>= 7; + } + this.writeByte((int) (value & 127L)); + return this; + } + + public FriendlyByteBuf writeNbt(@Nullable CompoundTag compound) { + if (compound == null) { + this.writeByte(0); + } else { + try { + NBT.writeCompound(compound, new ByteBufOutputStream(this)); + } catch (IOException e) { + throw new EncoderException("Failed to write NBT compound: " + e.getMessage(), e); + } + } + return this; + } + + @Nullable + public CompoundTag readNbt() { + int initialIndex = this.readerIndex(); + byte marker = this.readByte(); + if (marker == 0) { + return null; + } else { + this.readerIndex(initialIndex); + try { + return NBT.readCompound(new ByteBufInputStream(this)); + } catch (IOException e) { + throw new EncoderException("Failed to read NBT compound: " + e.getMessage(), e); + } + } + } + + public String readUtf() { + return this.readUtf(32767); + } + + public String readUtf(int maxLength) { + int maxEncodedLength = getMaxEncodedUtfLength(maxLength); + int length = this.readVarInt(); + if (length > maxEncodedLength) { + throw new DecoderException("Encoded string length exceeds maximum allowed: " + length + " > " + maxEncodedLength); + } + if (length < 0) { + throw new DecoderException("Encoded string length is negative: " + length); + } + String result = this.toString(this.readerIndex(), length, StandardCharsets.UTF_8); + this.readerIndex(this.readerIndex() + length); + if (result.length() > maxLength) { + throw new DecoderException("Decoded string length exceeds maximum allowed: " + result.length() + " > " + maxLength); + } + return result; + } + + public FriendlyByteBuf writeUtf(String string) { + return this.writeUtf(string, 32767); + } + + public FriendlyByteBuf writeUtf(String string, int maxLength) { + if (string.length() > maxLength) { + throw new EncoderException("String too large (was " + string.length() + " characters, max " + maxLength + ")"); + } + byte[] bytes = string.getBytes(StandardCharsets.UTF_8); + int maxEncodedLength = getMaxEncodedUtfLength(maxLength); + if (bytes.length > maxEncodedLength) { + throw new EncoderException("Encoded string too large (was " + bytes.length + " bytes, max " + maxEncodedLength + ")"); + } + this.writeVarInt(bytes.length); + this.writeBytes(bytes); + return this; + } + + private static int getMaxEncodedUtfLength(int decodedLength) { + return decodedLength * 3; + } + + public Key readKey() { + return Key.of(this.readUtf(32767)); + } + + public FriendlyByteBuf writeKey(Key id) { + this.writeUtf(id.toString()); + return this; + } + + public BitSet readBitSet() { + return BitSet.valueOf(this.readLongArray()); + } + + public void writeBitSet(BitSet bitSet) { + this.writeLongArray(bitSet.toLongArray()); + } + + public BitSet readFixedBitSet(int size) { + byte[] byteArray = new byte[MCUtils.positiveCeilDiv(size, 8)]; + this.readBytes(byteArray); + return BitSet.valueOf(byteArray); + } + + public void writeFixedBitSet(BitSet bitSet, int size) { + if (bitSet.length() > size) { + throw new EncoderException("BitSet length exceeds expected size (" + bitSet.length() + " > " + size + ")"); + } + byte[] byteArray = bitSet.toByteArray(); + this.writeBytes(Arrays.copyOf(byteArray, MCUtils.positiveCeilDiv(size, 8))); + } + + @FunctionalInterface + public interface Writer extends BiConsumer { + + default Writer> asOptional() { + return (buf, optional) -> buf.writeOptional(optional, this); + } + } + + @FunctionalInterface + public interface Reader extends Function { + + default Reader> asOptional() { + return buf -> buf.readOptional(this); + } + } + + @Override + public int capacity() { + return this.source.capacity(); + } + + @Override + public ByteBuf capacity(int i) { + return this.source.capacity(i); + } + + @Override + public int maxCapacity() { + return this.source.maxCapacity(); + } + + @Override + public ByteBufAllocator alloc() { + return this.source.alloc(); + } + + @Override + @SuppressWarnings("deprecation") + public ByteOrder order() { + return this.source.order(); + } + + @Override + @SuppressWarnings("deprecation") + public ByteBuf order(ByteOrder byteorder) { + return this.source.order(byteorder); + } + + @Override + public ByteBuf unwrap() { + return this.source.unwrap(); + } + + @Override + public boolean isDirect() { + return this.source.isDirect(); + } + + @Override + public boolean isReadOnly() { + return this.source.isReadOnly(); + } + + @Override + public ByteBuf asReadOnly() { + return this.source.asReadOnly(); + } + + @Override + public int readerIndex() { + return this.source.readerIndex(); + } + + @Override + public ByteBuf readerIndex(int i) { + return this.source.readerIndex(i); + } + + @Override + public int writerIndex() { + return this.source.writerIndex(); + } + + @Override + public ByteBuf writerIndex(int i) { + return this.source.writerIndex(i); + } + + @Override + public ByteBuf setIndex(int i, int j) { + return this.source.setIndex(i, j); + } + + @Override + public int readableBytes() { + return this.source.readableBytes(); + } + + @Override + public int writableBytes() { + return this.source.writableBytes(); + } + + @Override + public int maxWritableBytes() { + return this.source.maxWritableBytes(); + } + + @Override + public boolean isReadable() { + return this.source.isReadable(); + } + + @Override + public boolean isReadable(int i) { + return this.source.isReadable(i); + } + + @Override + public boolean isWritable() { + return this.source.isWritable(); + } + + @Override + public boolean isWritable(int i) { + return this.source.isWritable(i); + } + + @Override + public ByteBuf clear() { + return this.source.clear(); + } + + @Override + public ByteBuf markReaderIndex() { + return this.source.markReaderIndex(); + } + + @Override + public ByteBuf resetReaderIndex() { + return this.source.resetReaderIndex(); + } + + @Override + public ByteBuf markWriterIndex() { + return this.source.markWriterIndex(); + } + + @Override + public ByteBuf resetWriterIndex() { + return this.source.resetWriterIndex(); + } + + @Override + public ByteBuf discardReadBytes() { + return this.source.discardReadBytes(); + } + + @Override + public ByteBuf discardSomeReadBytes() { + return this.source.discardSomeReadBytes(); + } + + @Override + public ByteBuf ensureWritable(int i) { + return this.source.ensureWritable(i); + } + + @Override + public int ensureWritable(int i, boolean flag) { + return this.source.ensureWritable(i, flag); + } + + @Override + public boolean getBoolean(int i) { + return this.source.getBoolean(i); + } + + @Override + public byte getByte(int i) { + return this.source.getByte(i); + } + + @Override + public short getUnsignedByte(int i) { + return this.source.getUnsignedByte(i); + } + + @Override + public short getShort(int i) { + return this.source.getShort(i); + } + + @Override + public short getShortLE(int i) { + return this.source.getShortLE(i); + } + + @Override + public int getUnsignedShort(int i) { + return this.source.getUnsignedShort(i); + } + + @Override + public int getUnsignedShortLE(int i) { + return this.source.getUnsignedShortLE(i); + } + + @Override + public int getMedium(int i) { + return this.source.getMedium(i); + } + + @Override + public int getMediumLE(int i) { + return this.source.getMediumLE(i); + } + + @Override + public int getUnsignedMedium(int i) { + return this.source.getUnsignedMedium(i); + } + + @Override + public int getUnsignedMediumLE(int i) { + return this.source.getUnsignedMediumLE(i); + } + + @Override + public int getInt(int i) { + return this.source.getInt(i); + } + + @Override + public int getIntLE(int i) { + return this.source.getIntLE(i); + } + + @Override + public long getUnsignedInt(int i) { + return this.source.getUnsignedInt(i); + } + + @Override + public long getUnsignedIntLE(int i) { + return this.source.getUnsignedIntLE(i); + } + + @Override + public long getLong(int i) { + return this.source.getLong(i); + } + + @Override + public long getLongLE(int i) { + return this.source.getLongLE(i); + } + + @Override + public char getChar(int i) { + return this.source.getChar(i); + } + + @Override + public float getFloat(int i) { + return this.source.getFloat(i); + } + + @Override + public double getDouble(int i) { + return this.source.getDouble(i); + } + + @Override + public ByteBuf getBytes(int i, ByteBuf bytebuf) { + return this.source.getBytes(i, bytebuf); + } + + @Override + public ByteBuf getBytes(int i, ByteBuf bytebuf, int j) { + return this.source.getBytes(i, bytebuf, j); + } + + @Override + public ByteBuf getBytes(int i, ByteBuf bytebuf, int j, int k) { + return this.source.getBytes(i, bytebuf, j, k); + } + + @Override + public ByteBuf getBytes(int i, byte[] bytes) { + return this.source.getBytes(i, bytes); + } + + @Override + public ByteBuf getBytes(int i, byte[] bytes, int j, int k) { + return this.source.getBytes(i, bytes, j, k); + } + + @Override + public ByteBuf getBytes(int i, ByteBuffer bytebuffer) { + return this.source.getBytes(i, bytebuffer); + } + + @Override + public ByteBuf getBytes(int i, OutputStream outputstream, int j) throws IOException { + return this.source.getBytes(i, outputstream, j); + } + + @Override + public int getBytes(int i, GatheringByteChannel gatheringbytechannel, int j) throws IOException { + return this.source.getBytes(i, gatheringbytechannel, j); + } + + @Override + public int getBytes(int i, FileChannel filechannel, long j, int k) throws IOException { + return this.source.getBytes(i, filechannel, j, k); + } + + @Override + public CharSequence getCharSequence(int i, int j, Charset charset) { + return this.source.getCharSequence(i, j, charset); + } + + @Override + public ByteBuf setBoolean(int i, boolean flag) { + return this.source.setBoolean(i, flag); + } + + @Override + public ByteBuf setByte(int i, int j) { + return this.source.setByte(i, j); + } + + @Override + public ByteBuf setShort(int i, int j) { + return this.source.setShort(i, j); + } + + @Override + public ByteBuf setShortLE(int i, int j) { + return this.source.setShortLE(i, j); + } + + @Override + public ByteBuf setMedium(int i, int j) { + return this.source.setMedium(i, j); + } + + @Override + public ByteBuf setMediumLE(int i, int j) { + return this.source.setMediumLE(i, j); + } + + @Override + public ByteBuf setInt(int i, int j) { + return this.source.setInt(i, j); + } + + @Override + public ByteBuf setIntLE(int i, int j) { + return this.source.setIntLE(i, j); + } + + @Override + public ByteBuf setLong(int i, long j) { + return this.source.setLong(i, j); + } + + @Override + public ByteBuf setLongLE(int i, long j) { + return this.source.setLongLE(i, j); + } + + @Override + public ByteBuf setChar(int i, int j) { + return this.source.setChar(i, j); + } + + @Override + public ByteBuf setFloat(int i, float f) { + return this.source.setFloat(i, f); + } + + @Override + public ByteBuf setDouble(int i, double d0) { + return this.source.setDouble(i, d0); + } + + @Override + public ByteBuf setBytes(int i, ByteBuf bytebuf) { + return this.source.setBytes(i, bytebuf); + } + + @Override + public ByteBuf setBytes(int i, ByteBuf bytebuf, int j) { + return this.source.setBytes(i, bytebuf, j); + } + + @Override + public ByteBuf setBytes(int i, ByteBuf bytebuf, int j, int k) { + return this.source.setBytes(i, bytebuf, j, k); + } + + @Override + public ByteBuf setBytes(int i, byte[] bytes) { + return this.source.setBytes(i, bytes); + } + + @Override + public ByteBuf setBytes(int i, byte[] bytes, int j, int k) { + return this.source.setBytes(i, bytes, j, k); + } + + @Override + public ByteBuf setBytes(int i, ByteBuffer bytebuffer) { + return this.source.setBytes(i, bytebuffer); + } + + @Override + public int setBytes(int i, InputStream inputstream, int j) throws IOException { + return this.source.setBytes(i, inputstream, j); + } + + @Override + public int setBytes(int i, ScatteringByteChannel scatteringbytechannel, int j) throws IOException { + return this.source.setBytes(i, scatteringbytechannel, j); + } + + @Override + public int setBytes(int i, FileChannel filechannel, long j, int k) throws IOException { + return this.source.setBytes(i, filechannel, j, k); + } + + @Override + public ByteBuf setZero(int i, int j) { + return this.source.setZero(i, j); + } + + @Override + public int setCharSequence(int i, CharSequence charsequence, Charset charset) { + return this.source.setCharSequence(i, charsequence, charset); + } + + @Override + public boolean readBoolean() { + return this.source.readBoolean(); + } + + @Override + public byte readByte() { + return this.source.readByte(); + } + + @Override + public short readUnsignedByte() { + return this.source.readUnsignedByte(); + } + + @Override + public short readShort() { + return this.source.readShort(); + } + + @Override + public short readShortLE() { + return this.source.readShortLE(); + } + + @Override + public int readUnsignedShort() { + return this.source.readUnsignedShort(); + } + + @Override + public int readUnsignedShortLE() { + return this.source.readUnsignedShortLE(); + } + + @Override + public int readMedium() { + return this.source.readMedium(); + } + + @Override + public int readMediumLE() { + return this.source.readMediumLE(); + } + + @Override + public int readUnsignedMedium() { + return this.source.readUnsignedMedium(); + } + + @Override + public int readUnsignedMediumLE() { + return this.source.readUnsignedMediumLE(); + } + + @Override + public int readInt() { + return this.source.readInt(); + } + + @Override + public int readIntLE() { + return this.source.readIntLE(); + } + + @Override + public long readUnsignedInt() { + return this.source.readUnsignedInt(); + } + + @Override + public long readUnsignedIntLE() { + return this.source.readUnsignedIntLE(); + } + + @Override + public long readLong() { + return this.source.readLong(); + } + + @Override + public long readLongLE() { + return this.source.readLongLE(); + } + + @Override + public char readChar() { + return this.source.readChar(); + } + + @Override + public float readFloat() { + return this.source.readFloat(); + } + + @Override + public double readDouble() { + return this.source.readDouble(); + } + + @Override + public ByteBuf readBytes(int i) { + return this.source.readBytes(i); + } + + @Override + public ByteBuf readSlice(int i) { + return this.source.readSlice(i); + } + + @Override + public ByteBuf readRetainedSlice(int i) { + return this.source.readRetainedSlice(i); + } + + @Override + public ByteBuf readBytes(ByteBuf bytebuf) { + return this.source.readBytes(bytebuf); + } + + @Override + public ByteBuf readBytes(ByteBuf bytebuf, int i) { + return this.source.readBytes(bytebuf, i); + } + + @Override + public ByteBuf readBytes(ByteBuf bytebuf, int i, int j) { + return this.source.readBytes(bytebuf, i, j); + } + + @Override + public ByteBuf readBytes(byte[] bytes) { + return this.source.readBytes(bytes); + } + + @Override + public ByteBuf readBytes(byte[] bytes, int i, int j) { + return this.source.readBytes(bytes, i, j); + } + + @Override + public ByteBuf readBytes(ByteBuffer bytebuffer) { + return this.source.readBytes(bytebuffer); + } + + @Override + public ByteBuf readBytes(OutputStream outputstream, int i) throws IOException { + return this.source.readBytes(outputstream, i); + } + + @Override + public int readBytes(GatheringByteChannel gatheringbytechannel, int i) throws IOException { + return this.source.readBytes(gatheringbytechannel, i); + } + + @Override + public CharSequence readCharSequence(int i, Charset charset) { + return this.source.readCharSequence(i, charset); + } + + @Override + public int readBytes(FileChannel filechannel, long i, int j) throws IOException { + return this.source.readBytes(filechannel, i, j); + } + + @Override + public ByteBuf skipBytes(int i) { + return this.source.skipBytes(i); + } + + @Override + public ByteBuf writeBoolean(boolean flag) { + return this.source.writeBoolean(flag); + } + + @Override + public ByteBuf writeByte(int i) { + return this.source.writeByte(i); + } + + @Override + public ByteBuf writeShort(int i) { + return this.source.writeShort(i); + } + + @Override + public ByteBuf writeShortLE(int i) { + return this.source.writeShortLE(i); + } + + @Override + public ByteBuf writeMedium(int i) { + return this.source.writeMedium(i); + } + + @Override + public ByteBuf writeMediumLE(int i) { + return this.source.writeMediumLE(i); + } + + @Override + public ByteBuf writeInt(int i) { + return this.source.writeInt(i); + } + + @Override + public ByteBuf writeIntLE(int i) { + return this.source.writeIntLE(i); + } + + @Override + public ByteBuf writeLong(long i) { + return this.source.writeLong(i); + } + + @Override + public ByteBuf writeLongLE(long i) { + return this.source.writeLongLE(i); + } + + @Override + public ByteBuf writeChar(int i) { + return this.source.writeChar(i); + } + + @Override + public ByteBuf writeFloat(float f) { + return this.source.writeFloat(f); + } + + @Override + public ByteBuf writeDouble(double d0) { + return this.source.writeDouble(d0); + } + + @Override + public ByteBuf writeBytes(ByteBuf bytebuf) { + return this.source.writeBytes(bytebuf); + } + + @Override + public ByteBuf writeBytes(ByteBuf bytebuf, int i) { + return this.source.writeBytes(bytebuf, i); + } + + @Override + public ByteBuf writeBytes(ByteBuf bytebuf, int i, int j) { + return this.source.writeBytes(bytebuf, i, j); + } + + @Override + public ByteBuf writeBytes(byte[] bytes) { + return this.source.writeBytes(bytes); + } + + @Override + public ByteBuf writeBytes(byte[] bytes, int i, int j) { + return this.source.writeBytes(bytes, i, j); + } + + @Override + public ByteBuf writeBytes(ByteBuffer bytebuffer) { + return this.source.writeBytes(bytebuffer); + } + + @Override + public int writeBytes(InputStream inputstream, int i) throws IOException { + return this.source.writeBytes(inputstream, i); + } + + @Override + public int writeBytes(ScatteringByteChannel scatteringbytechannel, int i) throws IOException { + return this.source.writeBytes(scatteringbytechannel, i); + } + + @Override + public int writeBytes(FileChannel filechannel, long i, int j) throws IOException { + return this.source.writeBytes(filechannel, i, j); + } + + @Override + public ByteBuf writeZero(int i) { + return this.source.writeZero(i); + } + + @Override + public int writeCharSequence(CharSequence charsequence, Charset charset) { + return this.source.writeCharSequence(charsequence, charset); + } + + @Override + public int indexOf(int i, int j, byte b) { + return this.source.indexOf(i, j, b); + } + + @Override + public int bytesBefore(byte b) { + return this.source.bytesBefore(b); + } + + @Override + public int bytesBefore(int i, byte b) { + return this.source.bytesBefore(i, b); + } + + @Override + public int bytesBefore(int i, int j, byte b) { + return this.source.bytesBefore(i, j, b); + } + + @Override + public int forEachByte(ByteProcessor byteprocessor) { + return this.source.forEachByte(byteprocessor); + } + + @Override + public int forEachByte(int i, int j, ByteProcessor byteprocessor) { + return this.source.forEachByte(i, j, byteprocessor); + } + + @Override + public int forEachByteDesc(ByteProcessor byteprocessor) { + return this.source.forEachByteDesc(byteprocessor); + } + + @Override + public int forEachByteDesc(int i, int j, ByteProcessor byteprocessor) { + return this.source.forEachByteDesc(i, j, byteprocessor); + } + + @Override + public ByteBuf copy() { + return this.source.copy(); + } + + @Override + public ByteBuf copy(int i, int j) { + return this.source.copy(i, j); + } + + @Override + public ByteBuf slice() { + return this.source.slice(); + } + + @Override + public ByteBuf retainedSlice() { + return this.source.retainedSlice(); + } + + @Override + public ByteBuf slice(int i, int j) { + return this.source.slice(i, j); + } + + @Override + public ByteBuf retainedSlice(int i, int j) { + return this.source.retainedSlice(i, j); + } + + @Override + public ByteBuf duplicate() { + return this.source.duplicate(); + } + + @Override + public ByteBuf retainedDuplicate() { + return this.source.retainedDuplicate(); + } + + @Override + public int nioBufferCount() { + return this.source.nioBufferCount(); + } + + @Override + public ByteBuffer nioBuffer() { + return this.source.nioBuffer(); + } + + @Override + public ByteBuffer nioBuffer(int i, int j) { + return this.source.nioBuffer(i, j); + } + + @Override + public ByteBuffer internalNioBuffer(int i, int j) { + return this.source.internalNioBuffer(i, j); + } + + @Override + public ByteBuffer[] nioBuffers() { + return this.source.nioBuffers(); + } + + @Override + public ByteBuffer[] nioBuffers(int i, int j) { + return this.source.nioBuffers(i, j); + } + + @Override + public boolean hasArray() { + return this.source.hasArray(); + } + + @Override + public byte[] array() { + return this.source.array(); + } + + @Override + public int arrayOffset() { + return this.source.arrayOffset(); + } + + @Override + public boolean hasMemoryAddress() { + return this.source.hasMemoryAddress(); + } + + @Override + public long memoryAddress() { + return this.source.memoryAddress(); + } + + @Override + public String toString(Charset charset) { + return this.source.toString(charset); + } + + @Override + public @NotNull String toString(int i, int j, Charset charset) { + return this.source.toString(i, j, charset); + } + + @Override + public int hashCode() { + return this.source.hashCode(); + } + + @Override + public boolean equals(Object object) { + if (this == object) return true; + if (!(object instanceof FriendlyByteBuf friendlyByteBuf)) return false; + return this.source.equals(friendlyByteBuf.source); + } + + @Override + public int compareTo(ByteBuf bytebuf) { + return this.source.compareTo(bytebuf); + } + + @Override + public String toString() { + return this.source.toString(); + } + + @Override + public ByteBuf retain(int i) { + return this.source.retain(i); + } + + @Override + public ByteBuf retain() { + return this.source.retain(); + } + + @Override + public ByteBuf touch() { + return this.source.touch(); + } + + @Override + public ByteBuf touch(Object object) { + return this.source.touch(object); + } + + @Override + public int refCnt() { + return this.source.refCnt(); + } + + @Override + public boolean release() { + return this.source.release(); + } + + @Override + public boolean release(int i) { + return this.source.release(i); + } +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/util/GsonHelper.java b/core/src/main/java/net/momirealms/craftengine/core/util/GsonHelper.java new file mode 100644 index 000000000..f677c0ab8 --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/util/GsonHelper.java @@ -0,0 +1,81 @@ +package net.momirealms.craftengine.core.util; + +import com.google.gson.*; + +import java.io.BufferedReader; +import java.io.BufferedWriter; +import java.io.IOException; +import java.nio.file.Files; +import java.nio.file.Path; +import java.util.Map; + +public class GsonHelper { + private final Gson gson; + + public GsonHelper() { + this.gson = new GsonBuilder() + .disableHtmlEscaping() + .create(); + } + + public Gson getGson() { + return gson; + } + + public static Gson get() { + return SingletonHolder.INSTANCE.getGson(); + } + + private static class SingletonHolder { + private static final GsonHelper INSTANCE = new GsonHelper(); + } + + public static void writeJsonFile(JsonElement json, Path path) throws IOException { + try (BufferedWriter writer = Files.newBufferedWriter(path)) { + get().toJson(json, writer); + } + } + + public static JsonElement readJsonFile(Path path) throws IOException, JsonSyntaxException { + try (BufferedReader reader = Files.newBufferedReader(path)) { + return JsonParser.parseReader(reader); + } + } + + public static JsonObject shallowMerge(JsonObject obj1, JsonObject obj2) { + JsonObject merged = new JsonObject(); + for (Map.Entry entry : obj1.entrySet()) { + merged.add(entry.getKey(), entry.getValue()); + } + for (Map.Entry entry : obj2.entrySet()) { + merged.add(entry.getKey(), entry.getValue()); + } + return merged; + } + + public static JsonObject deepMerge(JsonObject source, JsonObject target) { + JsonObject merged = new JsonObject(); + for (Map.Entry entry : source.entrySet()) { + merged.add(entry.getKey(), entry.getValue()); + } + for (Map.Entry entry : target.entrySet()) { + String key = entry.getKey(); + JsonElement value = entry.getValue(); + if (merged.has(key)) { + JsonElement existingValue = merged.get(key); + if (existingValue.isJsonObject() && value.isJsonObject()) { + JsonObject mergedChild = deepMerge( + existingValue.getAsJsonObject(), + value.getAsJsonObject() + ); + merged.add(key, mergedChild); + } else { + merged.add(key, value); + } + } else { + merged.add(key, value); + } + } + return merged; + } +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/util/HeptaFunction.java b/core/src/main/java/net/momirealms/craftengine/core/util/HeptaFunction.java new file mode 100644 index 000000000..d71bbbe64 --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/util/HeptaFunction.java @@ -0,0 +1,6 @@ +package net.momirealms.craftengine.core.util; + +@FunctionalInterface +public interface HeptaFunction { + R apply(T t, U u, V v, W w, X x, Y y, O o); +} \ No newline at end of file diff --git a/core/src/main/java/net/momirealms/craftengine/core/util/HexaFunction.java b/core/src/main/java/net/momirealms/craftengine/core/util/HexaFunction.java new file mode 100644 index 000000000..ceefc32a2 --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/util/HexaFunction.java @@ -0,0 +1,6 @@ +package net.momirealms.craftengine.core.util; + +@FunctionalInterface +public interface HexaFunction { + R apply(T t, U u, V v, W w, X x, Y y); +} \ No newline at end of file diff --git a/core/src/main/java/net/momirealms/craftengine/core/util/HorizontalDirection.java b/core/src/main/java/net/momirealms/craftengine/core/util/HorizontalDirection.java new file mode 100644 index 000000000..2231c725d --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/util/HorizontalDirection.java @@ -0,0 +1,17 @@ +package net.momirealms.craftengine.core.util; + +public enum HorizontalDirection { + NORTH, + SOUTH, + WEST, + EAST; + + public Direction toDirection() { + return switch (this) { + case NORTH -> Direction.NORTH; + case SOUTH -> Direction.SOUTH; + case WEST -> Direction.WEST; + case EAST -> Direction.EAST; + }; + } +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/util/IdList.java b/core/src/main/java/net/momirealms/craftengine/core/util/IdList.java new file mode 100644 index 000000000..122b80eb9 --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/util/IdList.java @@ -0,0 +1,66 @@ +package net.momirealms.craftengine.core.util; + +import com.google.common.collect.Iterators; +import com.google.common.collect.Lists; +import it.unimi.dsi.fastutil.objects.Reference2IntMap; +import it.unimi.dsi.fastutil.objects.Reference2IntOpenHashMap; +import org.jetbrains.annotations.Nullable; + +import java.util.Iterator; +import java.util.List; +import java.util.Objects; + +public class IdList implements IndexedIterable { + private int nextId; + private final Reference2IntMap idMap; + private final List list; + + public IdList() { + this(512); + } + + public IdList(int initialSize) { + this.list = Lists.newArrayListWithExpectedSize(initialSize); + this.idMap = new Reference2IntOpenHashMap<>(initialSize); + this.idMap.defaultReturnValue(-1); + } + + public void set(T value, int id) { + this.idMap.put(value, id); + + while(this.list.size() <= id) { + this.list.add(null); + } + + this.list.set(id, value); + if (this.nextId <= id) { + this.nextId = id + 1; + } + + } + + public void add(T value) { + this.set(value, this.nextId); + } + + public int getRawId(T value) { + return this.idMap.getInt(value); + } + + @Nullable + public final T get(int index) { + return index >= 0 && index < this.list.size() ? this.list.get(index) : null; + } + + public Iterator iterator() { + return Iterators.filter(this.list.iterator(), Objects::nonNull); + } + + public boolean containsKey(int index) { + return this.get(index) != null; + } + + public int size() { + return this.idMap.size(); + } +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/util/IndexedIterable.java b/core/src/main/java/net/momirealms/craftengine/core/util/IndexedIterable.java new file mode 100644 index 000000000..40d9b2953 --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/util/IndexedIterable.java @@ -0,0 +1,33 @@ +package net.momirealms.craftengine.core.util; + +import org.jetbrains.annotations.Nullable; + +public interface IndexedIterable extends Iterable { + + int ABSENT_RAW_ID = -1; + + int getRawId(T value); + + @Nullable + T get(int index); + + default T getOrThrow(int index) { + T object = this.get(index); + if (object == null) { + throw new IllegalArgumentException("No value with id " + index); + } else { + return object; + } + } + + default int getRawIdOrThrow(T value) { + int i = this.getRawId(value); + if (i == ABSENT_RAW_ID) { + throw new IllegalArgumentException("Can't find id for '" + value + "' in map " + this); + } else { + return i; + } + } + + int size(); +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/util/Instrument.java b/core/src/main/java/net/momirealms/craftengine/core/util/Instrument.java new file mode 100644 index 000000000..7c1f60dad --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/util/Instrument.java @@ -0,0 +1,37 @@ +package net.momirealms.craftengine.core.util; + +public enum Instrument { + HARP("harp"), + BASEDRUM("basedrum"), + SNARE("snare"), + HAT("hat"), + BASS("bass"), + FLUTE("flute"), + BELL("bell"), + GUITAR("guitar"), + CHIME("chime"), + XYLOPHONE("xylophone"), + IRON_XYLOPHONE("iron_xylophone"), + COW_BELL("cow_bell"), + DIDGERIDOO("didgeridoo"), + BIT("bit"), + BANJO("banjo"), + PLING("pling"), + ZOMBIE("zombie"), + SKELETON("skeleton"), + CREEPER("creeper"), + DRAGON("dragon"), + WITHER_SKELETON("wither_skeleton"), + PIGLIN("piglin"), + CUSTOM_HEAD("custom_head"); + + private final String id; + + Instrument(final String id) { + this.id = id; + } + + public String id() { + return id; + } +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/util/Int2ObjectBiMap.java b/core/src/main/java/net/momirealms/craftengine/core/util/Int2ObjectBiMap.java new file mode 100644 index 000000000..297d49600 --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/util/Int2ObjectBiMap.java @@ -0,0 +1,188 @@ +package net.momirealms.craftengine.core.util; + +import com.google.common.base.Predicates; +import com.google.common.collect.Iterators; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +import java.util.Arrays; +import java.util.Iterator; +import java.util.function.Function; + +public class Int2ObjectBiMap implements IndexedIterable { + private static final Object EMPTY = null; + private static final float LOAD_FACTOR = 0.8F; + private K[] values; + private int[] ids; + private K[] idToValues; + private int nextId; + private int size; + + @SuppressWarnings("unchecked") + private Int2ObjectBiMap(int size) { + this.values = (K[]) new Object[size]; + this.ids = new int[size]; + this.idToValues = (K[]) new Object[size]; + } + + private Int2ObjectBiMap(K[] values, int[] ids, K[] idToValues, int nextId, int size) { + this.values = values; + this.ids = ids; + this.idToValues = idToValues; + this.nextId = nextId; + this.size = size; + } + + public void remapValues(Function function) { + for (int i = 0; i < values.length; i++) { + if (values[i] == null) break; + values[i] = function.apply(values[i]); + } + for (int i = 0; i < idToValues.length; i++) { + if (idToValues[i] == null) break; + idToValues[i] = function.apply(idToValues[i]); + } + } + + public static Int2ObjectBiMap create(int expectedSize) { + return new Int2ObjectBiMap<>((int) ((float) expectedSize / LOAD_FACTOR)); + } + + public int getRawId(@Nullable K value) { + return this.getIdFromIndex(this.findIndex(value, this.getIdealIndex(value))); + } + + @Nullable + public K get(int index) { + return index >= 0 && index < this.idToValues.length ? this.idToValues[index] : null; + } + + private int getIdFromIndex(int index) { + return index == -1 ? -1 : this.ids[index]; + } + + public boolean contains(K value) { + return this.getRawId(value) != -1; + } + + public boolean containsKey(int index) { + return this.get(index) != null; + } + + public int add(K value) { + int i = this.nextId(); + this.put(value, i); + return i; + } + + private int nextId() { + while(this.nextId < this.idToValues.length && this.idToValues[this.nextId] != null) { + ++this.nextId; + } + + return this.nextId; + } + + private void resize(int newSize) { + K[] objects = this.values; + int[] is = this.ids; + Int2ObjectBiMap int2ObjectBiMap = new Int2ObjectBiMap<>(newSize); + + for(int i = 0; i < objects.length; ++i) { + if (objects[i] != null) { + int2ObjectBiMap.put(objects[i], is[i]); + } + } + + this.values = int2ObjectBiMap.values; + this.ids = int2ObjectBiMap.ids; + this.idToValues = int2ObjectBiMap.idToValues; + this.nextId = int2ObjectBiMap.nextId; + this.size = int2ObjectBiMap.size; + } + + public void put(K value, int id) { + int i = Math.max(id, this.size + 1); + int j; + if ((float) i >= (float) this.values.length * LOAD_FACTOR) { + for (j = this.values.length << 1; j < id; j <<= 1) { + } + this.resize(j); + } + + j = this.findFree(this.getIdealIndex(value)); + this.values[j] = value; + this.ids[j] = id; + this.idToValues[id] = value; + ++this.size; + if (id == this.nextId) { + ++this.nextId; + } + } + + private int getIdealIndex(@Nullable K value) { + return (MCUtils.idealHash(System.identityHashCode(value)) & Integer.MAX_VALUE) % this.values.length; + } + + private int findIndex(@Nullable K value, int id) { + int i; + for(i = id; i < this.values.length; ++i) { + if (this.values[i] == value) { + return i; + } + + if (this.values[i] == EMPTY) { + return -1; + } + } + + for(i = 0; i < id; ++i) { + if (this.values[i] == value) { + return i; + } + + if (this.values[i] == EMPTY) { + return -1; + } + } + + return -1; + } + + private int findFree(int size) { + int i; + for(i = size; i < this.values.length; ++i) { + if (this.values[i] == EMPTY) { + return i; + } + } + + for(i = 0; i < size; ++i) { + if (this.values[i] == EMPTY) { + return i; + } + } + + throw new RuntimeException("Overflowed :("); + } + + @Override + public @NotNull Iterator iterator() { + return Iterators.filter(Iterators.forArray(this.idToValues), Predicates.notNull()); + } + + public void clear() { + Arrays.fill(this.values, null); + Arrays.fill(this.idToValues, null); + this.nextId = 0; + this.size = 0; + } + + public int size() { + return this.size; + } + + public Int2ObjectBiMap copy() { + return new Int2ObjectBiMap<>(this.values.clone(), this.ids.clone(), this.idToValues.clone(), this.nextId, this.size); + } +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/util/IntIdentityList.java b/core/src/main/java/net/momirealms/craftengine/core/util/IntIdentityList.java new file mode 100644 index 000000000..c6f539f05 --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/util/IntIdentityList.java @@ -0,0 +1,41 @@ +package net.momirealms.craftengine.core.util; + +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +import java.util.ArrayList; +import java.util.Iterator; +import java.util.List; + +public class IntIdentityList implements IndexedIterable { + private final int size; + private final List list; + + public IntIdentityList(int size) { + this.size = size; + list = new ArrayList<>(size); + for (int i = 0; i < size; i++) { + list.add(i); + } + } + + @Override + public int getRawId(Integer value) { + return value; + } + + @Override + public @Nullable Integer get(int index) { + return index; + } + + @Override + public int size() { + return size; + } + + @Override + public @NotNull Iterator iterator() { + return list.iterator(); + } +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/util/Key.java b/core/src/main/java/net/momirealms/craftengine/core/util/Key.java new file mode 100644 index 000000000..63acc24e4 --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/util/Key.java @@ -0,0 +1,61 @@ +package net.momirealms.craftengine.core.util; + +public record Key(String namespace, String value) { + + public static final String DEFAULT_NAMESPACE = "craftengine"; + + public static Key withDefaultNamespace(String value) { + return new Key(DEFAULT_NAMESPACE, value); + } + + public static Key of(String namespace, String value) { + return new Key(namespace, value); + } + + public static Key withDefaultNamespace(String namespacedId, String defaultNamespace) { + return of(decompose(namespacedId, defaultNamespace)); + } + + public static Key of(String[] id) { + return new Key(id[0], id[1]); + } + + public static Key of(String namespacedId) { + return of(decompose(namespacedId, "minecraft")); + } + + public static Key from(String namespacedId) { + return of(decompose(namespacedId, "minecraft")); + } + + @Override + public int hashCode() { + return toString().hashCode(); + } + + @Override + public boolean equals(Object obj) { + if (obj == null) { + return false; + } + if (!(obj instanceof Key key)) return false; + return this.namespace.equals(key.namespace()) && this.value.equals(key.value()); + } + + @Override + public String toString() { + return namespace + ":" + value; + } + + private static String[] decompose(String id, String namespace) { + String[] strings = new String[]{namespace, id}; + int i = id.indexOf(':'); + if (i >= 0) { + strings[1] = id.substring(i + 1); + if (i >= 1) { + strings[0] = id.substring(0, i); + } + } + return strings; + } +} \ No newline at end of file diff --git a/core/src/main/java/net/momirealms/craftengine/core/util/ListMonitor.java b/core/src/main/java/net/momirealms/craftengine/core/util/ListMonitor.java new file mode 100644 index 000000000..bddcd6a34 --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/util/ListMonitor.java @@ -0,0 +1,174 @@ +package net.momirealms.craftengine.core.util; + +import org.jetbrains.annotations.NotNull; + +import java.util.Collection; +import java.util.Iterator; +import java.util.List; +import java.util.ListIterator; +import java.util.function.Consumer; + +public class ListMonitor implements List { + + private final List list; + private final Consumer addConsumer; + private final Consumer removeConsumer; + + public ListMonitor(List list, Consumer addConsumer, Consumer removeConsumer) { + for (T key : list) { + addConsumer.accept(key); + } + this.list = list; + this.addConsumer = addConsumer; + this.removeConsumer = removeConsumer; + } + + public List list() { + return list; + } + + public Consumer addConsumer() { + return addConsumer; + } + + public Consumer removeConsumer() { + return removeConsumer; + } + + @Override + public synchronized boolean add(T t) { + addConsumer.accept(t); + return list.add(t); + } + + @Override + public synchronized boolean addAll(@NotNull Collection c) { + for (T element : c) { + addConsumer.accept(element); + } + return list.addAll(c); + } + + @Override + public synchronized boolean addAll(int index, @NotNull Collection c) { + for (T element : c) { + addConsumer.accept(element); + } + return list.addAll(index, c); + } + + @Override + public synchronized void add(int index, T element) { + addConsumer.accept(element); + list.add(index, element); + } + + @Override + public synchronized boolean remove(Object o) { + removeConsumer.accept(o); + return list.remove(o); + } + + @Override + public synchronized boolean removeAll(@NotNull Collection collection) { + for (Object o : collection) { + removeConsumer.accept(o); + } + return list.removeAll(collection); + } + + @Override + public synchronized void clear() { + for (T element : list) { + removeConsumer.accept(element); + } + list.clear(); + } + + @Override + public synchronized int size() { + return list.size(); + } + + @Override + public synchronized boolean isEmpty() { + return list.isEmpty(); + } + + @Override + public synchronized boolean contains(Object o) { + return list.contains(o); + } + + @NotNull + @Override + public synchronized Iterator iterator() { + return list.iterator(); + } + + @NotNull + @Override + public synchronized Object[] toArray() { + return list.toArray(); + } + + @NotNull + @Override + public synchronized E[] toArray(@NotNull E[] a) { + return list.toArray(a); + } + + @NotNull + @Override + public synchronized List subList(int fromIndex, int toIndex) { + return list.subList(fromIndex, toIndex); + } + + @SuppressWarnings("all") + @Override + public synchronized boolean containsAll(@NotNull Collection c) { + return list.containsAll(c); + } + + @Override + public synchronized boolean retainAll(@NotNull Collection c) { + return list.retainAll(c); + } + + @Override + public synchronized T get(int index) { + return list.get(index); + } + + @Override + public synchronized T set(int index, T element) { + return list.set(index, element); + } + + @Override + public synchronized T remove(int index) { + return list.remove(index); + } + + @Override + public synchronized int indexOf(Object o) { + return list.indexOf(o); + } + + @Override + public synchronized int lastIndexOf(Object o) { + return list.lastIndexOf(o); + } + + @NotNull + @Override + public synchronized ListIterator listIterator() { + return list.listIterator(); + } + + @NotNull + @Override + public synchronized ListIterator listIterator(int index) { + return list.listIterator(index); + } +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/util/MCUtils.java b/core/src/main/java/net/momirealms/craftengine/core/util/MCUtils.java new file mode 100644 index 000000000..37beb52dd --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/util/MCUtils.java @@ -0,0 +1,178 @@ +package net.momirealms.craftengine.core.util; + +import com.google.common.collect.Iterators; + +import javax.annotation.Nullable; +import java.util.Iterator; +import java.util.List; +import java.util.function.Consumer; +import java.util.function.Predicate; + +public class MCUtils { + + private MCUtils() {} + + private static final int[] MULTIPLY_DE_BRUIJN_BIT_POSITION = new int[]{0, 1, 28, 2, 29, 14, 24, 3, 30, 22, 20, 15, 25, 17, 4, 8, 31, 27, 13, 23, 21, 19, 16, 7, 26, 12, 18, 6, 11, 5, 10, 9}; + + public static int fastFloor(double value) { + int truncated = (int) value; + return value < (double) truncated ? truncated - 1 : truncated; + } + + public static int fastFloor(float value) { + int truncated = (int) value; + return value < (double) truncated ? truncated - 1 : truncated; + } + + public static int murmurHash3Mixer(int value) { + value ^= value >>> 16; + value *= -2048144789; + value ^= value >>> 13; + value *= -1028477387; + return value ^ value >>> 16; + } + + public static int ceil(double value) { + int i = (int)value; + return value > (double)i ? i + 1 : i; + } + + public static boolean isPowerOfTwo(int value) { + return value != 0 && (value & value - 1) == 0; + } + + public static int smallestEncompassingPowerOfTwo(int value) { + int i = value - 1; + i |= i >> 1; + i |= i >> 2; + i |= i >> 4; + i |= i >> 8; + i |= i >> 16; + return i + 1; + } + + public static int ceilLog2(int value) { + value = isPowerOfTwo(value) ? value : smallestEncompassingPowerOfTwo(value); + return MULTIPLY_DE_BRUIJN_BIT_POSITION[(int)((long)value * 125613361L >> 27) & 31]; + } + + public static int positiveCeilDiv(int a, int b) { + return -Math.floorDiv(-a, b); + } + + public static int idealHash(int value) { + value ^= value >>> 16; + value *= -2048144789; + value ^= value >>> 13; + value *= -1028477387; + value ^= value >>> 16; + return value; + } + + public static long getUnsignedDivisorMagic(final long divisor, final int bits) { + return ((1L << bits) - 1L) / divisor + 1L; + } + + public static T make(T object, Consumer initializer) { + initializer.accept(object); + return object; + } + + public static Predicate allOf() { + return o -> true; + } + + @SuppressWarnings("unchecked") + public static Predicate allOf(Predicate a) { + return (Predicate) a; + } + + public static Predicate allOf(Predicate a, Predicate b) { + return o -> a.test(o) && b.test(o); + } + + public static Predicate allOf(Predicate a, Predicate b, Predicate c) { + return o -> a.test(o) && b.test(o) && c.test(o); + } + + public static Predicate allOf(Predicate a, Predicate b, Predicate c, Predicate d) { + return o -> a.test(o) && b.test(o) && c.test(o) && d.test(o); + } + + public static Predicate allOf(Predicate a, Predicate b, Predicate c, Predicate d, Predicate e) { + return o -> a.test(o) && b.test(o) && c.test(o) && d.test(o) && e.test(o); + } + + @SafeVarargs + public static Predicate allOf(Predicate... predicates) { + return o -> { + for (Predicate predicate : predicates) { + if (!predicate.test(o)) { + return false; + } + } + + return true; + }; + } + + public static Predicate allOf(List> predicates) { + return switch (predicates.size()) { + case 0 -> allOf(); + case 1 -> allOf((Predicate) predicates.get(0)); + case 2 -> allOf((Predicate) predicates.get(0), (Predicate) predicates.get(1)); + case 3 -> allOf((Predicate) predicates.get(0), (Predicate) predicates.get(1), (Predicate) predicates.get(2)); + case 4 -> allOf( + (Predicate) predicates.get(0), + (Predicate) predicates.get(1), + (Predicate) predicates.get(2), + (Predicate) predicates.get(3) + ); + case 5 -> allOf( + (Predicate) predicates.get(0), + (Predicate) predicates.get(1), + (Predicate) predicates.get(2), + (Predicate) predicates.get(3), + (Predicate) predicates.get(4) + ); + default -> { + @SuppressWarnings("unchecked") + Predicate[] predicates2 = predicates.toArray(Predicate[]::new); + yield allOf(predicates2); + } + }; + } + + public static T findPreviousInIterable(Iterable iterable, @Nullable T object) { + Iterator iterator = iterable.iterator(); + T previous = null; + while (iterator.hasNext()) { + T current = iterator.next(); + if (current == object) { + if (previous == null) { + previous = iterator.hasNext() ? Iterators.getLast(iterator) : object; + } + break; + } + previous = current; + } + return previous; + } + + public static T findNextInIterable(Iterable iterable, @Nullable T object) { + Iterator iterator = iterable.iterator(); + T next = iterator.next(); + if (object != null) { + T current = next; + while (current != object) { + if (iterator.hasNext()) { + current = iterator.next(); + } + } + if (iterator.hasNext()) { + return iterator.next(); + } + } + return next; + } +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/util/MapColor.java b/core/src/main/java/net/momirealms/craftengine/core/util/MapColor.java new file mode 100644 index 000000000..6cd8211f3 --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/util/MapColor.java @@ -0,0 +1,91 @@ +package net.momirealms.craftengine.core.util; + +import com.google.common.base.Preconditions; + +public class MapColor { + private static final MapColor[] COLORS = new MapColor[64]; + public static final MapColor CLEAR = new MapColor(0, 0); + public static final MapColor PALE_GREEN = new MapColor(1, 8368696); + public static final MapColor PALE_YELLOW = new MapColor(2, 16247203); + public static final MapColor WHITE_GRAY = new MapColor(3, 13092807); + public static final MapColor BRIGHT_RED = new MapColor(4, 16711680); + public static final MapColor PALE_PURPLE = new MapColor(5, 10526975); + public static final MapColor IRON_GRAY = new MapColor(6, 10987431); + public static final MapColor DARK_GREEN = new MapColor(7, 31744); + public static final MapColor WHITE = new MapColor(8, 16777215); + public static final MapColor LIGHT_BLUE_GRAY = new MapColor(9, 10791096); + public static final MapColor DIRT_BROWN = new MapColor(10, 9923917); + public static final MapColor STONE_GRAY = new MapColor(11, 7368816); + public static final MapColor WATER_BLUE = new MapColor(12, 4210943); + public static final MapColor OAK_TAN = new MapColor(13, 9402184); + public static final MapColor OFF_WHITE = new MapColor(14, 16776437); + public static final MapColor ORANGE = new MapColor(15, 14188339); + public static final MapColor MAGENTA = new MapColor(16, 11685080); + public static final MapColor LIGHT_BLUE = new MapColor(17, 6724056); + public static final MapColor YELLOW = new MapColor(18, 15066419); + public static final MapColor LIME = new MapColor(19, 8375321); + public static final MapColor PINK = new MapColor(20, 15892389); + public static final MapColor GRAY = new MapColor(21, 5000268); + public static final MapColor LIGHT_GRAY = new MapColor(22, 10066329); + public static final MapColor CYAN = new MapColor(23, 5013401); + public static final MapColor PURPLE = new MapColor(24, 8339378); + public static final MapColor BLUE = new MapColor(25, 3361970); + public static final MapColor BROWN = new MapColor(26, 6704179); + public static final MapColor GREEN = new MapColor(27, 6717235); + public static final MapColor RED = new MapColor(28, 10040115); + public static final MapColor BLACK = new MapColor(29, 1644825); + public static final MapColor GOLD = new MapColor(30, 16445005); + public static final MapColor DIAMOND_BLUE = new MapColor(31, 6085589); + public static final MapColor LAPIS_BLUE = new MapColor(32, 4882687); + public static final MapColor EMERALD_GREEN = new MapColor(33, 55610); + public static final MapColor SPRUCE_BROWN = new MapColor(34, 8476209); + public static final MapColor DARK_RED = new MapColor(35, 7340544); + public static final MapColor TERRACOTTA_WHITE = new MapColor(36, 13742497); + public static final MapColor TERRACOTTA_ORANGE = new MapColor(37, 10441252); + public static final MapColor TERRACOTTA_MAGENTA = new MapColor(38, 9787244); + public static final MapColor TERRACOTTA_LIGHT_BLUE = new MapColor(39, 7367818); + public static final MapColor TERRACOTTA_YELLOW = new MapColor(40, 12223780); + public static final MapColor TERRACOTTA_LIME = new MapColor(41, 6780213); + public static final MapColor TERRACOTTA_PINK = new MapColor(42, 10505550); + public static final MapColor TERRACOTTA_GRAY = new MapColor(43, 3746083); + public static final MapColor TERRACOTTA_LIGHT_GRAY = new MapColor(44, 8874850); + public static final MapColor TERRACOTTA_CYAN = new MapColor(45, 5725276); + public static final MapColor TERRACOTTA_PURPLE = new MapColor(46, 8014168); + public static final MapColor TERRACOTTA_BLUE = new MapColor(47, 4996700); + public static final MapColor TERRACOTTA_BROWN = new MapColor(48, 4993571); + public static final MapColor TERRACOTTA_GREEN = new MapColor(49, 5001770); + public static final MapColor TERRACOTTA_RED = new MapColor(50, 9321518); + public static final MapColor TERRACOTTA_BLACK = new MapColor(51, 2430480); + public static final MapColor DULL_RED = new MapColor(52, 12398641); + public static final MapColor DULL_PINK = new MapColor(53, 9715553); + public static final MapColor DARK_CRIMSON = new MapColor(54, 6035741); + public static final MapColor TEAL = new MapColor(55, 1474182); + public static final MapColor DARK_AQUA = new MapColor(56, 3837580); + public static final MapColor DARK_DULL_PINK = new MapColor(57, 5647422); + public static final MapColor BRIGHT_TEAL = new MapColor(58, 1356933); + public static final MapColor DEEPSLATE_GRAY = new MapColor(59, 6579300); + public static final MapColor RAW_IRON_PINK = new MapColor(60, 14200723); + public static final MapColor LICHEN_GREEN = new MapColor(61, 8365974); + public final int color; + public final int id; + + private MapColor(int id, int color) { + if (id >= 0 && id <= 63) { + this.id = id; + this.color = color; + COLORS[id] = this; + } else { + throw new IndexOutOfBoundsException("Map colour ID must be between 0 and 63 (inclusive)"); + } + } + + public static MapColor get(int id) { + Preconditions.checkPositionIndex(id, COLORS.length, "material id"); + return getUnchecked(id); + } + + private static MapColor getUnchecked(int id) { + MapColor mapColor = COLORS[id]; + return mapColor != null ? mapColor : CLEAR; + } +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/util/Mirror.java b/core/src/main/java/net/momirealms/craftengine/core/util/Mirror.java new file mode 100644 index 000000000..6fb82193b --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/util/Mirror.java @@ -0,0 +1,30 @@ +package net.momirealms.craftengine.core.util; + +public enum Mirror { + NONE, + LEFT_RIGHT, + FRONT_BACK; + + public int mirror(int rotation, int fullTurn) { + int i = fullTurn / 2; + int j = rotation > i ? rotation - fullTurn : rotation; + return switch (this) { + case LEFT_RIGHT -> (i - j + fullTurn) % fullTurn; + case FRONT_BACK -> (fullTurn - j) % fullTurn; + default -> rotation; + }; + } + + public Rotation getRotation(Direction direction) { + Direction.Axis axis = direction.axis(); + return (this != LEFT_RIGHT || axis != Direction.Axis.Z) && (this != FRONT_BACK || axis != Direction.Axis.X) ? Rotation.NONE : Rotation.CLOCKWISE_180; + } + + public Direction mirror(Direction direction) { + if (this == FRONT_BACK && direction.axis() == Direction.Axis.X) { + return direction.opposite(); + } else { + return this == LEFT_RIGHT && direction.axis() == Direction.Axis.Z ? direction.opposite() : direction; + } + } +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/util/MiscUtils.java b/core/src/main/java/net/momirealms/craftengine/core/util/MiscUtils.java new file mode 100644 index 000000000..28b8f4a42 --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/util/MiscUtils.java @@ -0,0 +1,152 @@ +package net.momirealms.craftengine.core.util; + +import org.joml.Quaternionf; +import org.joml.Vector3f; + +import java.util.ArrayList; +import java.util.List; +import java.util.Map; + +public class MiscUtils { + + private MiscUtils() {} + + @SuppressWarnings("unchecked") + public static Map castToMap(Object obj, boolean allowNull) { + if (allowNull && obj == null) { + return null; + } + if (obj instanceof Map map) { + return (Map) map; + } + throw new IllegalArgumentException("Expected Map, got: " + obj.getClass().getSimpleName()); + } + + @SuppressWarnings("unchecked") + public static List castToList(Object obj, boolean allowNull) { + if (allowNull && obj == null) { + return null; + } + if (obj instanceof List list) { + return (List) list; + } + throw new IllegalArgumentException("Expected List, got: " + obj.getClass().getSimpleName()); + } + + public static List getAsStringList(Object o) { + List list = new ArrayList<>(); + if (o instanceof List) { + for (Object object : (List) o) { + list.add(object.toString()); + } + } else if (o instanceof String) { + list.add((String) o); + } else { + if (o != null) { + list.add(o.toString()); + } + } + return list; + } + + public static List getAsFloatList(Object o) { + List list = new ArrayList<>(); + if (o instanceof List) { + for (Object object : (List) o) { + if (object instanceof Number) { + list.add(((Number) object).floatValue()); + } else if (object instanceof String) { + try { + list.add(Float.parseFloat((String) object)); + } catch (NumberFormatException e) { + throw new RuntimeException("Cannot convert " + object + " to float"); + } + } else { + throw new RuntimeException("Cannot convert " + object + " to float"); + } + } + } else if (o instanceof Float) { + list.add((Float) o); + } else if (o instanceof String) { + try { + list.add(Float.parseFloat((String) o)); + } catch (NumberFormatException e) { + throw new RuntimeException("Cannot convert " + o + " to float"); + } + } else { + throw new RuntimeException("Cannot convert " + o + " to float"); + } + return list; + } + + public static int getAsInt(Object o) { + if (o instanceof Integer) { + return (Integer) o; + } else if (o instanceof String) { + try { + return Integer.parseInt((String) o); + } catch (NumberFormatException e) { + throw new RuntimeException("Cannot convert " + o + " to int"); + } + } else if (o instanceof Boolean) { + return (Boolean) o ? 1 : 0; + } else if (o instanceof Number) { + return ((Number) o).intValue(); + } + throw new RuntimeException("Cannot convert " + o + " to int"); + } + + public static double getAsDouble(Object o) { + if (o instanceof Double) { + return (Double) o; + } else if (o instanceof String) { + try { + return Double.parseDouble((String) o); + } catch (NumberFormatException e) { + throw new RuntimeException("Cannot convert " + o + " to double"); + } + } else if (o instanceof Number) { + return ((Number) o).doubleValue(); + } + throw new RuntimeException("Cannot convert " + o + " to double"); + } + + public static float getAsFloat(Object o) { + if (o instanceof Float) { + return (Float) o; + } else if (o instanceof String) { + try { + return Float.parseFloat((String) o); + } catch (NumberFormatException e) { + throw new RuntimeException("Cannot convert " + o + " to float"); + } + } else if (o instanceof Number) { + return ((Number) o).floatValue(); + } + throw new RuntimeException("Cannot convert " + o + " to float"); + } + + public static Vector3f getVector3f(Object o) { + String stringFormat = o.toString(); + String[] split = stringFormat.split(","); + if (split.length == 3) { + return new Vector3f(Float.parseFloat(split[0]), Float.parseFloat(split[1]), Float.parseFloat(split[2])); + } else if (split.length == 1) { + return new Vector3f(Float.parseFloat(split[0])); + } else { + throw new RuntimeException("Cannot convert " + o + " to Vector3f"); + } + } + + public static Quaternionf getQuaternionf(Object o) { + String stringFormat = o.toString(); + String[] split = stringFormat.split(","); + if (split.length == 4) { + return new Quaternionf(Float.parseFloat(split[0]), Float.parseFloat(split[1]), Float.parseFloat(split[2]), Float.parseFloat(split[3])); + } else if (split.length == 1) { + return QuaternionUtils.toQuaternionf(0, Math.toRadians(Float.parseFloat(split[0])), 0); + } else { + throw new RuntimeException("Cannot convert " + o + " to Quaternionf"); + } + } +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/util/Pair.java b/core/src/main/java/net/momirealms/craftengine/core/util/Pair.java new file mode 100644 index 000000000..de9774f5c --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/util/Pair.java @@ -0,0 +1,39 @@ +package net.momirealms.craftengine.core.util; + +import java.util.Objects; + +/** + * A generic class representing a pair of values. + * This class provides methods to create and access pairs of values. + * + * @param the type of the left value + * @param the type of the right value + */ +public record Pair(L left, R right) { + + /** + * Creates a new {@link Pair} with the specified left and right values. + * + * @param left the left value + * @param right the right value + * @param the type of the left value + * @param the type of the right value + * @return a new {@link Pair} with the specified values + */ + public static Pair of(final L left, final R right) { + return new Pair<>(left, right); + } + + @Override + public boolean equals(Object object) { + if (this == object) return true; + if (object == null || getClass() != object.getClass()) return false; + Pair pair = (Pair) object; + return Objects.equals(left, pair.left) && Objects.equals(right, pair.right); + } + + @Override + public int hashCode() { + return Objects.hash(this.left, this.right); + } +} \ No newline at end of file diff --git a/core/src/main/java/net/momirealms/craftengine/core/util/PentaFunction.java b/core/src/main/java/net/momirealms/craftengine/core/util/PentaFunction.java new file mode 100644 index 000000000..028a6a84d --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/util/PentaFunction.java @@ -0,0 +1,6 @@ +package net.momirealms.craftengine.core.util; + +@FunctionalInterface +public interface PentaFunction { + R apply(T t, U u, V v, W w, X x); +} \ No newline at end of file diff --git a/core/src/main/java/net/momirealms/craftengine/core/util/PreConditions.java b/core/src/main/java/net/momirealms/craftengine/core/util/PreConditions.java new file mode 100644 index 000000000..6ed7f921d --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/util/PreConditions.java @@ -0,0 +1,22 @@ +package net.momirealms.craftengine.core.util; + +import org.jetbrains.annotations.NotNull; + +public class PreConditions { + + private PreConditions() {} + + public static boolean runIfTrue(boolean value, @NotNull Runnable runnable) { + if (value) { + runnable.run(); + } + return value; + } + + public static boolean isNull(Object value, @NotNull Runnable runnable) { + if (value == null) { + runnable.run(); + } + return value == null; + } +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/util/QuadFunction.java b/core/src/main/java/net/momirealms/craftengine/core/util/QuadFunction.java new file mode 100644 index 000000000..a758dd3e9 --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/util/QuadFunction.java @@ -0,0 +1,6 @@ +package net.momirealms.craftengine.core.util; + +@FunctionalInterface +public interface QuadFunction { + R apply(T t, U u, V v, W w); +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/util/QuaternionUtils.java b/core/src/main/java/net/momirealms/craftengine/core/util/QuaternionUtils.java new file mode 100644 index 000000000..4b5a32d65 --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/util/QuaternionUtils.java @@ -0,0 +1,43 @@ +package net.momirealms.craftengine.core.util; + +import org.joml.Quaternionf; +import org.joml.Vector3f; + +public class QuaternionUtils { + + private QuaternionUtils() {} + + public static Quaternionf toQuaternionf(double yaw, double pitch, double roll) { + double cy = Math.cos(yaw * 0.5); + double sy = Math.sin(yaw * 0.5); + double cp = Math.cos(pitch * 0.5); + double sp = Math.sin(pitch * 0.5); + double cr = Math.cos(roll * 0.5); + double sr = Math.sin(roll * 0.5); + double w = cy * cp * cr + sy * sp * sr; + double x = cy * cp * sr - sy * sp * cr; + double y = sy * cp * sr + cy * sp * cr; + double z = sy * cp * cr - cy * sp * sr; + return new Quaternionf(x, y, z, w); + } + + public static Vector3f toEulerAngle(Quaternionf quaternionf) { + float x = quaternionf.x; + float y = quaternionf.y; + float z = quaternionf.z; + float w = quaternionf.w; + float siny_cosp = 2 * (w * z + x * y); + float cosy_cosp = 1 - 2 * (y * y + z * z); + float yaw = (float) Math.atan2(siny_cosp, cosy_cosp); + float sinp = 2 * (w * y - z * x); + float pitch = (float) Math.asin(sinp); + float sinr_cosp = 2 * (w * x + y * z); + float cosr_cosp = 1 - 2 * (x * x + y * y); + float roll = (float) Math.atan2(sinr_cosp, cosr_cosp); + return new Vector3f(yaw, pitch, roll); + } + + public static double quaternionToPitch(Quaternionf quaternionf) { + return 2 * Math.atan2(quaternionf.y, quaternionf.w); + } +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/util/RandomUtils.java b/core/src/main/java/net/momirealms/craftengine/core/util/RandomUtils.java new file mode 100644 index 000000000..38d5f78dd --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/util/RandomUtils.java @@ -0,0 +1,55 @@ +package net.momirealms.craftengine.core.util; + +import java.util.Random; +import java.util.concurrent.ThreadLocalRandom; + +public class RandomUtils { + private final Random random; + + private RandomUtils() { + random = ThreadLocalRandom.current(); + } + + private static class SingletonHolder { + private static final RandomUtils INSTANCE = new RandomUtils(); + } + + private static RandomUtils getInstance() { + return SingletonHolder.INSTANCE; + } + + public static double generateRandomDouble(double min, double max) { + return min + (max - min) * getInstance().random.nextDouble(); + } + + public static float generateRandomFloat(float min, float max) { + return min + (max - min) * getInstance().random.nextFloat(); + } + + public static boolean generateRandomBoolean() { + return getInstance().random.nextBoolean(); + } + + public static double triangle(double mode, double deviation) { + return mode + deviation * (generateRandomDouble(0,1) - generateRandomDouble(0,1)); + } + + public static T getRandomElementFromArray(T[] array) { + int index = getInstance().random.nextInt(array.length); + return array[index]; + } + + public static T[] getRandomElementsFromArray(T[] array, int count) { + if (count > array.length) { + throw new IllegalArgumentException("Count cannot be greater than array length"); + } + @SuppressWarnings("unchecked") + T[] result = (T[]) new Object[count]; + for (int i = 0; i < count; i++) { + int index = getInstance().random.nextInt(array.length - i); + result[i] = array[index]; + array[index] = array[array.length - i - 1]; + } + return result; + } +} \ No newline at end of file diff --git a/core/src/main/java/net/momirealms/craftengine/core/util/ReflectionUtils.java b/core/src/main/java/net/momirealms/craftengine/core/util/ReflectionUtils.java new file mode 100644 index 000000000..491ca6264 --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/util/ReflectionUtils.java @@ -0,0 +1,449 @@ +package net.momirealms.craftengine.core.util; + +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +import java.lang.reflect.*; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; + +public class ReflectionUtils { + + private ReflectionUtils() {} + + public static Class getClazz(String... classes) { + for (String className : classes) { + Class clazz = getClazz(className); + if (clazz != null) { + return clazz; + } + } + return null; + } + + public static Class getClazz(String clazz) { + try { + return Class.forName(clazz); + } catch (Throwable e) { + return null; + } + } + + public static boolean classExists(@NotNull final String clazz) { + try { + Class.forName(clazz); + return true; + } catch (Throwable e) { + return false; + } + } + + public static boolean methodExists(@NotNull final Class clazz, @NotNull final String method, @NotNull final Class... parameterTypes) { + try { + clazz.getMethod(method, parameterTypes); + return true; + } catch (NoSuchMethodException e) { + return false; + } + } + + @Nullable + public static Field getDeclaredField(final Class clazz, final String field) { + try { + return setAccessible(clazz.getDeclaredField(field)); + } catch (NoSuchFieldException e) { + return null; + } + } + + @NotNull + public static Field getDeclaredField(@NotNull Class clazz, @NotNull String... possibleNames) { + List possibleNameList = Arrays.asList(possibleNames); + for (Field field : clazz.getDeclaredFields()) { + if (possibleNameList.contains(field.getName())) { + return field; + } + } + throw new RuntimeException("Class " + clazz.getName() + " does not contain a field with possible names " + Arrays.toString(possibleNames)); + } + + @Nullable + public static Field getDeclaredField(final Class clazz, final int index) { + int i = 0; + for (final Field field : clazz.getDeclaredFields()) { + if (index == i) { + return setAccessible(field); + } + i++; + } + return null; + } + + @Nullable + public static Field getInstanceDeclaredField(final Class clazz, final int index) { + int i = 0; + for (final Field field : clazz.getDeclaredFields()) { + if (!Modifier.isStatic(field.getModifiers())) { + if (index == i) { + return setAccessible(field); + } + i++; + } + } + return null; + } + + @Nullable + public static Field getDeclaredField(final Class clazz, final Class type, int index) { + int i = 0; + for (final Field field : clazz.getDeclaredFields()) { + if (field.getType() == type) { + if (index == i) { + return setAccessible(field); + } + i++; + } + } + return null; + } + + @Nullable + public static Field getDeclaredFieldBackwards(final Class clazz, final Class type, int index) { + int i = 0; + Field[] fields = clazz.getDeclaredFields(); + for (int j = fields.length - 1; j >= 0; j--) { + Field field = fields[j]; + if (field.getType() == type) { + if (index == i) { + return setAccessible(field); + } + i++; + } + } + return null; + } + + @Nullable + public static Field getInstanceDeclaredField(@NotNull Class clazz, final Class type, int index) { + int i = 0; + for (final Field field : clazz.getDeclaredFields()) { + if (field.getType() == type && !Modifier.isStatic(field.getModifiers())) { + if (index == i) { + return setAccessible(field); + } + i++; + } + } + return null; + } + + @NotNull + public static List getDeclaredFields(final Class clazz) { + List fields = new ArrayList<>(); + for (Field field : clazz.getDeclaredFields()) { + fields.add(setAccessible(field)); + } + return fields; + } + + @NotNull + public static List getInstanceDeclaredFields(@NotNull Class clazz) { + List list = new ArrayList<>(); + for (Field field : clazz.getDeclaredFields()) { + if (!Modifier.isStatic(field.getModifiers())) { + list.add(setAccessible(field)); + } + } + return list; + } + + @NotNull + public static List getDeclaredFields(@NotNull final Class clazz, @NotNull final Class type) { + List fields = new ArrayList<>(); + for (Field field : clazz.getDeclaredFields()) { + if (field.getType() == type) { + fields.add(setAccessible(field)); + } + } + return fields; + } + + @NotNull + public static List getInstanceDeclaredFields(@NotNull Class clazz, @NotNull Class type) { + List list = new ArrayList<>(); + for (Field field : clazz.getDeclaredFields()) { + if (field.getType() == type && !Modifier.isStatic(field.getModifiers())) { + list.add(setAccessible(field)); + } + } + return list; + } + + @Nullable + public static Method getMethod(final Class clazz, Class returnType, final String[] possibleMethodNames, final Class... parameterTypes) { + outer: + for (Method method : clazz.getMethods()) { + if (method.getParameterCount() != parameterTypes.length) { + continue; + } + Class[] types = method.getParameterTypes(); + for (int i = 0; i < types.length; i++) { + if (types[i] != parameterTypes[i]) { + continue outer; + } + } + for (String name : possibleMethodNames) { + if (name.equals(method.getName())) { + if (returnType.isAssignableFrom(method.getReturnType())) { + return method; + } + } + } + } + return null; + } + + @Nullable + public static Method getMethod(final Class clazz, final String[] possibleMethodNames, final Class... parameterTypes) { + outer: + for (Method method : clazz.getMethods()) { + if (method.getParameterCount() != parameterTypes.length) { + continue; + } + Class[] types = method.getParameterTypes(); + for (int i = 0; i < types.length; i++) { + if (types[i] != parameterTypes[i]) { + continue outer; + } + } + for (String name : possibleMethodNames) { + if (name.equals(method.getName())) return method; + } + } + return null; + } + + @Nullable + public static Method getMethod(final Class clazz, Class returnType, final Class... parameterTypes) { + outer: + for (Method method : clazz.getMethods()) { + if (method.getParameterCount() != parameterTypes.length) { + continue; + } + Class[] types = method.getParameterTypes(); + for (int i = 0; i < types.length; i++) { + if (types[i] != parameterTypes[i]) { + continue outer; + } + } + if (returnType.isAssignableFrom(method.getReturnType())) return method; + } + return null; + } + + @Nullable + public static Method getDeclaredMethod(final Class clazz, Class returnType, final String[] possibleMethodNames, final Class... parameterTypes) { + outer: + for (Method method : clazz.getDeclaredMethods()) { + if (method.getParameterCount() != parameterTypes.length) { + continue; + } + Class[] types = method.getParameterTypes(); + for (int i = 0; i < types.length; i++) { + if (types[i] != parameterTypes[i]) { + continue outer; + } + } + for (String name : possibleMethodNames) { + if (name.equals(method.getName())) { + if (returnType.isAssignableFrom(method.getReturnType())) { + return setAccessible(method); + } + } + } + } + return null; + } + + @Nullable + public static Method getDeclaredMethod(final Class clazz, Class returnType, final Class... parameterTypes) { + outer: + for (Method method : clazz.getDeclaredMethods()) { + if (method.getParameterCount() != parameterTypes.length) { + continue; + } + Class[] types = method.getParameterTypes(); + for (int i = 0; i < types.length; i++) { + if (types[i] != parameterTypes[i]) { + continue outer; + } + } + if (returnType.isAssignableFrom(method.getReturnType())) return setAccessible(method); + } + return null; + } + + @Nullable + public static Method getMethod(final Class clazz, Class returnType, int index) { + int i = 0; + for (Method method : clazz.getMethods()) { + if (returnType.isAssignableFrom(method.getReturnType())) { + if (i == index) { + return setAccessible(method); + } + i++; + } + } + return null; + } + + @Nullable + public static Method getStaticMethod(final Class clazz, Class returnType, final Class... parameterTypes) { + outer: + for (Method method : clazz.getMethods()) { + if (method.getParameterCount() != parameterTypes.length) { + continue; + } + if (!Modifier.isStatic(method.getModifiers())) { + continue; + } + Class[] types = method.getParameterTypes(); + for (int i = 0; i < types.length; i++) { + if (types[i] != parameterTypes[i]) { + continue outer; + } + } + if (returnType.isAssignableFrom(method.getReturnType())) + return setAccessible(method); + } + return null; + } + + @Nullable + public static Method getStaticMethod(final Class clazz, String[] possibleNames, Class returnType, final Class... parameterTypes) { + outer: + for (Method method : clazz.getMethods()) { + if (method.getParameterCount() != parameterTypes.length) { + continue; + } + if (!Modifier.isStatic(method.getModifiers())) { + continue; + } + Class[] types = method.getParameterTypes(); + for (int i = 0; i < types.length; i++) { + if (types[i] != parameterTypes[i]) { + continue outer; + } + } + if (returnType.isAssignableFrom(method.getReturnType())) { + for (String name : possibleNames) { + if (name.equals(method.getName())) { + return setAccessible(method); + } + } + } + } + return null; + } + + public static Method getStaticMethod(final Class clazz, int index) { + int i = 0; + for (Method method : clazz.getMethods()) { + if (Modifier.isStatic(method.getModifiers())) { + if (i == index) { + return setAccessible(method); + } + i++; + } + } + return null; + } + + @Nullable + public static Method getMethod(final Class clazz, int index) { + int i = 0; + for (Method method : clazz.getMethods()) { + if (i == index) { + return setAccessible(method); + } + i++; + } + return null; + } + + public static Method getMethodOrElseThrow(final Class clazz, final String[] possibleMethodNames, final Class[] parameterTypes) throws NoSuchMethodException { + Method method = getMethod(clazz, possibleMethodNames, parameterTypes); + if (method == null) { + throw new NoSuchMethodException("No method found with possible names " + Arrays.toString(possibleMethodNames) + " with parameters " + + Arrays.toString(parameterTypes) + " in class " + clazz.getName()); + } + return method; + } + + @NotNull + public static List getMethods(@NotNull Class clazz, @NotNull Class returnType, @NotNull Class... parameterTypes) { + List list = new ArrayList<>(); + for (Method method : clazz.getMethods()) { + if (!returnType.isAssignableFrom(method.getReturnType()) // check type + || method.getParameterCount() != parameterTypes.length // check length + ) continue; + Class[] types = method.getParameterTypes(); + outer: { + for (int i = 0; i < types.length; i++) { + if (types[i] != parameterTypes[i]) { + break outer; + } + } + list.add(method); + } + } + return list; + } + + @NotNull + public static T setAccessible(@NotNull final T o) { + o.setAccessible(true); + return o; + } + + @Nullable + public static Constructor getConstructor(Class clazz, Class... parameterTypes) { + try { + return clazz.getConstructor(parameterTypes); + } catch (NoSuchMethodException | SecurityException ignore) { + return null; + } + } + + @Nullable + public static Constructor getDeclaredConstructor(Class clazz, Class... parameterTypes) { + try { + return setAccessible(clazz.getDeclaredConstructor(parameterTypes)); + } catch (NoSuchMethodException | SecurityException ignore) { + return null; + } + } + + @Nullable + public static Constructor getConstructor(Class clazz, int index) { + try { + Constructor[] constructors = clazz.getDeclaredConstructors(); + if (index < 0 || index >= constructors.length) { + throw new IndexOutOfBoundsException("Invalid constructor index: " + index); + } + return setAccessible(constructors[index]); + } catch (SecurityException e) { + return null; + } + } + + @NotNull + public static Constructor getTheOnlyConstructor(Class clazz) { + Constructor[] constructors = clazz.getConstructors(); + if (constructors.length != 1) { + throw new RuntimeException("This class is expected to have only one constructor but it has " + constructors.length); + } + return constructors[0]; + } +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/util/ResourceKey.java b/core/src/main/java/net/momirealms/craftengine/core/util/ResourceKey.java new file mode 100644 index 000000000..b8b65ed97 --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/util/ResourceKey.java @@ -0,0 +1,28 @@ +package net.momirealms.craftengine.core.util; + +public class ResourceKey { + private final Key registry; + private final Key location; + + public ResourceKey(Key registry, Key location) { + this.registry = registry; + this.location = location; + } + + public static ResourceKey create(Key registry, Key location) { + return new ResourceKey<>(registry, location); + } + + public Key registry() { + return registry; + } + + public Key location() { + return location; + } + + @Override + public String toString() { + return "ResourceKey[" + this.registry + " / " + this.location + "]"; + } +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/util/Rotation.java b/core/src/main/java/net/momirealms/craftengine/core/util/Rotation.java new file mode 100644 index 000000000..45ad256df --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/util/Rotation.java @@ -0,0 +1,49 @@ +package net.momirealms.craftengine.core.util; + +import java.util.Random; + +public enum Rotation { + NONE, + CLOCKWISE_90, + CLOCKWISE_180, + COUNTERCLOCKWISE_90; + + private static final Rotation[][] rotationMap = { + {Rotation.NONE, Rotation.CLOCKWISE_90, Rotation.CLOCKWISE_180, Rotation.COUNTERCLOCKWISE_90}, + {Rotation.CLOCKWISE_90, Rotation.CLOCKWISE_180, Rotation.COUNTERCLOCKWISE_90, Rotation.NONE}, + {Rotation.CLOCKWISE_180, Rotation.COUNTERCLOCKWISE_90, Rotation.NONE, Rotation.CLOCKWISE_90}, + {Rotation.COUNTERCLOCKWISE_90, Rotation.NONE, Rotation.CLOCKWISE_90, Rotation.CLOCKWISE_180} + }; + + public Rotation getRotated(Rotation rotation) { + int thisIndex = this.ordinal(); + int rotationIndex = rotation.ordinal(); + return rotationMap[thisIndex][rotationIndex]; + } + + public Direction rotate(Direction direction) { + if (direction.axis() == Direction.Axis.Y) { + return direction; + } else { + return switch (this) { + case CLOCKWISE_90 -> direction.clockWise(); + case CLOCKWISE_180 -> direction.opposite(); + case COUNTERCLOCKWISE_90 -> direction.counterClockWise(); + default -> direction; + }; + } + } + + public int rotate(int rotation, int fullTurn) { + return switch (this) { + case CLOCKWISE_90 -> (rotation + fullTurn / 4) % fullTurn; + case CLOCKWISE_180 -> (rotation + fullTurn / 2) % fullTurn; + case COUNTERCLOCKWISE_90 -> (rotation + fullTurn * 3 / 4) % fullTurn; + default -> rotation; + }; + } + + public static Rotation random(Random random) { + return values()[random.nextInt(values().length)]; + } +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/util/SectionPosUtils.java b/core/src/main/java/net/momirealms/craftengine/core/util/SectionPosUtils.java new file mode 100644 index 000000000..230a0419e --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/util/SectionPosUtils.java @@ -0,0 +1,87 @@ +package net.momirealms.craftengine.core.util; + +import it.unimi.dsi.fastutil.longs.Long2ObjectOpenHashMap; +import net.momirealms.craftengine.core.world.ChunkPos; +import net.momirealms.craftengine.core.world.SectionPos; + +import java.util.BitSet; +import java.util.HashSet; +import java.util.Map; +import java.util.Set; + +public class SectionPosUtils { + + private SectionPosUtils() {} + + public static Map nearbySectionsMap(Set sections, int minLightSection, int maxLightSection) { + Map nearby = new Long2ObjectOpenHashMap<>(); + for (SectionPos section : sections) { + for (int i = -1; i <= 1; i++) { + for (int j = -1; j <= 1; j++) { + long chunkPos = ChunkPos.asLong(section.x() + i, section.z() + j); + BitSet posSet = nearby.computeIfAbsent(chunkPos, k -> new BitSet(maxLightSection - minLightSection)); + for (int k = -1; k <= 1; k++) { + int y = section.y() + k; + if (y >= minLightSection && y <= maxLightSection) { + posSet.set(y - minLightSection); + } + } + } + } + } + return nearby; + } + + public static Map toMap(Set sections, int minLightSection, int maxLightSection) { + int nBits = maxLightSection - minLightSection; + Map nearby = new Long2ObjectOpenHashMap<>(Math.max(8, sections.size() / 2), 0.5f); + for (SectionPos section : sections) { + long chunkPos = ChunkPos.asLong(section.x(), section.z()); + BitSet posSet = nearby.computeIfAbsent(chunkPos, k -> new BitSet(nBits)); + int y = section.y(); + if (y >= minLightSection && y <= maxLightSection) { + posSet.set(y - minLightSection); + } + } + return nearby; + } + + public static Set calculateAffectedRegions(int sx, int sy, int sz, int x) { + Set regions = new HashSet<>(); + int rxStart = (sx - x) >> 4; + int rxEnd = (sx + x) >> 4; + int ryStart = (sy - x) >> 4; + int ryEnd = (sy + x) >> 4; + int rzStart = (sz - x) >> 4; + int rzEnd = (sz + x) >> 4; + for (int rx = rxStart; rx <= rxEnd; rx++) { + for (int ry = ryStart; ry <= ryEnd; ry++) { + for (int rz = rzStart; rz <= rzEnd; rz++) { + int xMin = rx << 4; + int xMax = xMin + 15; + int dxMin = calculateMinDistance(sx, xMin, xMax); + int yMin = ry << 4; + int yMax = yMin + 15; + int dyMin = calculateMinDistance(sy, yMin, yMax); + int zMin = rz << 4; + int zMax = zMin + 15; + int dzMin = calculateMinDistance(sz, zMin, zMax); + if (dxMin + dyMin + dzMin <= x) { + regions.add(new SectionPos(rx, ry, rz)); + } + } + } + } + return regions; + } + + private static int calculateMinDistance(int coord, int min, int max) { + if (coord < min) { + return min - coord; + } else if (coord > max) { + return coord - max; + } else { + return 0; + } + } +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/util/SerializationUtils.java b/core/src/main/java/net/momirealms/craftengine/core/util/SerializationUtils.java new file mode 100644 index 000000000..557000f40 --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/util/SerializationUtils.java @@ -0,0 +1,88 @@ +package net.momirealms.craftengine.core.util; + +import java.io.*; +import java.util.HashMap; +import java.util.Map; +import java.util.Objects; + +public class SerializationUtils { + + private SerializationUtils() {} + + static class ClassLoaderAwareObjectInputStream extends ObjectInputStream { + private static final Map> PRIMITIVE_TYPES = new HashMap<>(); + + static { + PRIMITIVE_TYPES.put("byte", byte.class); + PRIMITIVE_TYPES.put("short", short.class); + PRIMITIVE_TYPES.put("int", int.class); + PRIMITIVE_TYPES.put("long", long.class); + PRIMITIVE_TYPES.put("float", float.class); + PRIMITIVE_TYPES.put("double", double.class); + PRIMITIVE_TYPES.put("boolean", boolean.class); + PRIMITIVE_TYPES.put("char", char.class); + PRIMITIVE_TYPES.put("void", void.class); + } + + private final ClassLoader classLoader; + + ClassLoaderAwareObjectInputStream(InputStream in, ClassLoader classLoader) throws IOException { + super(in); + this.classLoader = classLoader; + } + + @Override + protected Class resolveClass(ObjectStreamClass desc) throws IOException, ClassNotFoundException { + String className = desc.getName(); + try { + return Class.forName(className, false, classLoader); + } catch (ClassNotFoundException e) { + Class primitiveClass = PRIMITIVE_TYPES.get(className); + if (primitiveClass != null) { + return primitiveClass; + } + return super.resolveClass(desc); + } + } + } + + public static T clone(T object) { + if (object == null) { + return null; + } + byte[] objectData = serialize(object); + try (ByteArrayInputStream bais = new ByteArrayInputStream(objectData); + ClassLoaderAwareObjectInputStream ois = new ClassLoaderAwareObjectInputStream(bais, object.getClass().getClassLoader())) { + @SuppressWarnings("unchecked") + T clonedObject = (T) ois.readObject(); + return clonedObject; + } catch (IOException | ClassNotFoundException e) { + throw new RuntimeException("Exception occurred while cloning object", e); + } + } + + public static T deserialize(byte[] objectData) { + Objects.requireNonNull(objectData); + return deserialize(new ByteArrayInputStream(objectData)); + } + + public static T deserialize(InputStream inputStream) { + Objects.requireNonNull(inputStream); + try (ObjectInputStream ois = new ObjectInputStream(inputStream)) { + @SuppressWarnings("unchecked") + T obj = (T) ois.readObject(); + return obj; + } catch (IOException | ClassNotFoundException e) { + throw new RuntimeException("Exception occurred while deserializing object", e); + } + } + + public static byte[] serialize(Serializable obj) { + try (ByteArrayOutputStream baos = new ByteArrayOutputStream(); ObjectOutputStream oos = new ObjectOutputStream(baos)) { + oos.writeObject(obj); + return baos.toByteArray(); + } catch (IOException e) { + throw new RuntimeException("Exception occurred while serializing object", e); + } + } +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/util/SkullUtils.java b/core/src/main/java/net/momirealms/craftengine/core/util/SkullUtils.java new file mode 100644 index 000000000..291ee50da --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/util/SkullUtils.java @@ -0,0 +1,17 @@ +package net.momirealms.craftengine.core.util; + +import java.util.Base64; + +public class SkullUtils { + + private SkullUtils() {} + + public static String identifierFromBase64(String base64) { + byte[] decodedBytes = Base64.getDecoder().decode(base64); + String decodedString = new String(decodedBytes); + int urlStartIndex = decodedString.indexOf("\"url\":\"") + 7; + int urlEndIndex = decodedString.indexOf("\"", urlStartIndex); + String textureUrl = decodedString.substring(urlStartIndex, urlEndIndex); + return textureUrl.substring(textureUrl.lastIndexOf('/') + 1); + } +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/util/StringReader.java b/core/src/main/java/net/momirealms/craftengine/core/util/StringReader.java new file mode 100644 index 000000000..4fd76995f --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/util/StringReader.java @@ -0,0 +1,238 @@ +package net.momirealms.craftengine.core.util; + +public class StringReader { + private static final char SYNTAX_ESCAPE = '\\'; + private static final char SYNTAX_DOUBLE_QUOTE = '"'; + private static final char SYNTAX_SINGLE_QUOTE = '\''; + private final String string; + private int cursor; + + public StringReader(StringReader other) { + this.string = other.string; + this.cursor = other.cursor; + } + + public StringReader(String string) { + this.string = string; + } + + public String getString() { + return this.string; + } + + public void setCursor(int cursor) { + this.cursor = cursor; + } + + public int getRemainingLength() { + return this.string.length() - this.cursor; + } + + public int getTotalLength() { + return this.string.length(); + } + + public int getCursor() { + return this.cursor; + } + + public String getRead() { + return this.string.substring(0, this.cursor); + } + + public String getRemaining() { + return this.string.substring(this.cursor); + } + + public boolean canRead(int length) { + return this.cursor + length <= this.string.length(); + } + + public boolean canRead() { + return this.canRead(1); + } + + public char peek() { + return this.string.charAt(this.cursor); + } + + public char peek(int offset) { + return this.string.charAt(this.cursor + offset); + } + + public char read() { + if (!canRead()) { + throw new RuntimeException("No more characters to read."); + } + return this.string.charAt(this.cursor++); + } + + public void skip() { + if (!canRead()) { + throw new RuntimeException("No more characters to skip."); + } + ++this.cursor; + } + + public static boolean isAllowedNumber(char c) { + return c >= '0' && c <= '9' || c == '.' || c == '-'; + } + + public static boolean isQuotedStringStart(char c) { + return c == SYNTAX_DOUBLE_QUOTE || c == SYNTAX_SINGLE_QUOTE; + } + + public void skipWhitespace() { + while (this.canRead() && Character.isWhitespace(this.peek())) { + this.skip(); + } + } + + public int readInt() { + int start = this.cursor; + while (this.canRead() && isAllowedNumber(this.peek())) { + this.skip(); + } + String number = this.string.substring(start, this.cursor); + if (number.isEmpty()) { + throw new RuntimeException("Expected integer, but found empty string."); + } + try { + return Integer.parseInt(number); + } catch (NumberFormatException var4) { + this.cursor = start; + throw new RuntimeException("Failed to parse integer: " + number); + } + } + + public long readLong() { + int start = this.cursor; + while (this.canRead() && isAllowedNumber(this.peek())) { + this.skip(); + } + String number = this.string.substring(start, this.cursor); + if (number.isEmpty()) { + throw new RuntimeException("Expected long, but found empty string."); + } + try { + return Long.parseLong(number); + } catch (NumberFormatException var4) { + this.cursor = start; + throw new RuntimeException("Failed to parse long: " + number); + } + } + + public double readDouble() { + int start = this.cursor; + while (this.canRead() && isAllowedNumber(this.peek())) { + this.skip(); + } + String number = this.string.substring(start, this.cursor); + if (number.isEmpty()) { + throw new RuntimeException("Expected double, but found empty string."); + } + try { + return Double.parseDouble(number); + } catch (NumberFormatException var4) { + this.cursor = start; + throw new RuntimeException("Failed to parse double: " + number); + } + } + + public float readFloat() { + int start = this.cursor; + while (this.canRead() && isAllowedNumber(this.peek())) { + this.skip(); + } + String number = this.string.substring(start, this.cursor); + if (number.isEmpty()) { + throw new RuntimeException("Expected float, but found empty string."); + } + try { + return Float.parseFloat(number); + } catch (NumberFormatException var4) { + this.cursor = start; + throw new RuntimeException("Failed to parse float: " + number); + } + } + + public static boolean isAllowedInUnquotedString(char c) { + return c >= '0' && c <= '9' || c >= 'A' && c <= 'Z' || c >= 'a' && c <= 'z' || c == '_' || c == '-' || c == '.' || c == '+'; + } + + public String readUnquotedString() { + int start = this.cursor; + while (this.canRead() && isAllowedInUnquotedString(this.peek())) { + this.skip(); + } + return this.string.substring(start, this.cursor); + } + + public String readQuotedString() { + if (!this.canRead()) { + return ""; + } else { + char next = this.peek(); + if (!isQuotedStringStart(next)) { + throw new RuntimeException("Expected quoted string, but found: " + next); + } else { + this.skip(); + return this.readStringUntil(next); + } + } + } + + public String readStringUntil(char terminator) { + StringBuilder result = new StringBuilder(); + boolean escaped = false; + + while (this.canRead()) { + char c = this.read(); + if (escaped) { + if (c != terminator && c != SYNTAX_ESCAPE) { + this.setCursor(this.getCursor() - 1); + throw new RuntimeException("Invalid escape sequence."); + } + result.append(c); + escaped = false; + } else if (c == SYNTAX_ESCAPE) { + escaped = true; + } else { + if (c == terminator) { + return result.toString(); + } + result.append(c); + } + } + throw new RuntimeException("Unexpected end of input while reading string."); + } + + public String readString() { + if (!this.canRead()) { + return ""; + } else { + char next = this.peek(); + if (isQuotedStringStart(next)) { + this.skip(); + return this.readStringUntil(next); + } else { + return this.readUnquotedString(); + } + } + } + + public boolean readBoolean() { + int start = this.cursor; + String value = this.readString(); + if (value.isEmpty()) { + throw new RuntimeException("Expected boolean, but found empty string."); + } else if (value.equals("true")) { + return true; + } else if (value.equals("false")) { + return false; + } else { + this.cursor = start; + throw new RuntimeException("Failed to parse boolean: " + value); + } + } +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/util/TriConsumer.java b/core/src/main/java/net/momirealms/craftengine/core/util/TriConsumer.java new file mode 100644 index 000000000..3191f725f --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/util/TriConsumer.java @@ -0,0 +1,6 @@ +package net.momirealms.craftengine.core.util; + +@FunctionalInterface +public interface TriConsumer { + void accept(K k, V v, S s); +} \ No newline at end of file diff --git a/core/src/main/java/net/momirealms/craftengine/core/util/TriFunction.java b/core/src/main/java/net/momirealms/craftengine/core/util/TriFunction.java new file mode 100644 index 000000000..61e3b9d48 --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/util/TriFunction.java @@ -0,0 +1,16 @@ +package net.momirealms.craftengine.core.util; + +import java.util.Objects; +import java.util.function.Function; + +@FunctionalInterface +public interface TriFunction { + R apply(T var1, U var2, V var3); + + default TriFunction andThen(Function after) { + Objects.requireNonNull(after); + return (t, u, v) -> { + return after.apply(this.apply(t, u, v)); + }; + } +} \ No newline at end of file diff --git a/core/src/main/java/net/momirealms/craftengine/core/util/Tristate.java b/core/src/main/java/net/momirealms/craftengine/core/util/Tristate.java new file mode 100644 index 000000000..1e3487202 --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/util/Tristate.java @@ -0,0 +1,27 @@ +package net.momirealms.craftengine.core.util; + +import org.jetbrains.annotations.NotNull; + +public enum Tristate { + TRUE(true), + FALSE(false), + UNDEFINED(false); + + public static @NotNull Tristate of(boolean val) { + return val ? TRUE : FALSE; + } + + public static @NotNull Tristate of(Boolean val) { + return val == null ? UNDEFINED : val ? TRUE : FALSE; + } + + private final boolean booleanValue; + + Tristate(boolean booleanValue) { + this.booleanValue = booleanValue; + } + + public boolean asBoolean() { + return this.booleanValue; + } +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/util/Tuple.java b/core/src/main/java/net/momirealms/craftengine/core/util/Tuple.java new file mode 100644 index 000000000..e4cf6baf5 --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/util/Tuple.java @@ -0,0 +1,42 @@ +package net.momirealms.craftengine.core.util; + +import java.util.Objects; + +/** + * A generic class representing a tuple with three values. + * This class provides methods for creating and accessing tuples with three values. + * + * @param the type of the left value + * @param the type of the middle value + * @param the type of the right value + */ +public record Tuple(L left, M mid, R right) { + + /** + * Creates a new {@link Tuple} with the specified left, middle, and right values. + * + * @param left the left value + * @param mid the middle value + * @param right the right value + * @param the type of the left value + * @param the type of the middle value + * @param the type of the right value + * @return a new {@link Tuple} with the specified values + */ + public static Tuple of(final L left, final M mid, final R right) { + return new Tuple<>(left, mid, right); + } + + @Override + public boolean equals(Object object) { + if (this == object) return true; + if (object == null || getClass() != object.getClass()) return false; + Tuple tuple = (Tuple) object; + return Objects.equals(mid, tuple.mid) && Objects.equals(left, tuple.left) && Objects.equals(right, tuple.right); + } + + @Override + public int hashCode() { + return Objects.hash(left, mid, right); + } +} \ No newline at end of file diff --git a/core/src/main/java/net/momirealms/craftengine/core/util/TypeUtils.java b/core/src/main/java/net/momirealms/craftengine/core/util/TypeUtils.java new file mode 100644 index 000000000..8e3b3dc1a --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/util/TypeUtils.java @@ -0,0 +1,60 @@ +package net.momirealms.craftengine.core.util; + +import java.util.Arrays; +import java.util.Locale; + +public class TypeUtils { + + private TypeUtils() {} + + /** + * Checks if the provided object is of the specified type. + * If not, throws an IllegalArgumentException with a detailed message. + * + * @param object The object to check. + * @param expectedType The expected class type. + * @param The type parameter for expectedType. + * @return The object cast to the expected type if it matches. + * @throws IllegalArgumentException if the object's type does not match the expected type. + */ + public static T checkType(Object object, Class expectedType) { + if (!expectedType.isInstance(object)) { + throw new IllegalArgumentException("Expected type: " + expectedType.getName() + + ", but got: " + (object == null ? "null" : object.getClass().getName())); + } + return expectedType.cast(object); + } + + public static Object castBasicTypes(String value, String type) { + return switch (type.toLowerCase(Locale.ENGLISH)) { + case "boolean" -> Boolean.parseBoolean(value); + case "byte" -> Byte.parseByte(value); + case "short" -> Short.parseShort(value); + case "int", "integer" -> Integer.parseInt(value); + case "long" -> Long.parseLong(value); + case "float" -> Float.parseFloat(value); + case "double" -> Double.parseDouble(value); + case "char" -> value.charAt(0); + case "string" -> value; + case "intarray" -> { + String[] split = splitArrayValue(value); + yield Arrays.stream(split).mapToInt(Integer::parseInt).toArray(); + } + case "bytearray" -> { + String[] split = splitArrayValue(value); + byte[] bytes = new byte[split.length]; + for (int i = 0; i < split.length; i++){ + bytes[i] = Byte.parseByte(split[i]); + } + yield bytes; + } + default -> throw new IllegalStateException("Unsupported type: " + type.toLowerCase(Locale.ENGLISH)); + }; + } + + private static String[] splitArrayValue(String value) { + return value.substring(value.indexOf('[') + 1, value.lastIndexOf(']')) + .replaceAll("\\s", "") + .split(","); + } +} \ No newline at end of file diff --git a/core/src/main/java/net/momirealms/craftengine/core/util/VersionHelper.java b/core/src/main/java/net/momirealms/craftengine/core/util/VersionHelper.java new file mode 100644 index 000000000..926c6ca90 --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/util/VersionHelper.java @@ -0,0 +1,97 @@ +package net.momirealms.craftengine.core.util; + +public class VersionHelper { + private static float version; + private static boolean mojmap; + private static boolean folia; + private static boolean paper; + + public static void init(String serverVersion) { + String[] split = serverVersion.split("\\."); + version = Float.parseFloat(split[1] + "." + (split.length == 3 ? split[2] : "0")); + checkMojMap(); + checkFolia(); + checkPaper(); + } + + public static float version() { + return version; + } + + private static void checkMojMap() { + // Check if the server is Mojmap + try { + Class.forName("net.minecraft.network.protocol.game.ClientboundBossEventPacket"); + mojmap = true; + } catch (ClassNotFoundException ignored) { + } + } + + private static void checkFolia() { + try { + Class.forName("io.papermc.paper.threadedregions.RegionizedServer"); + folia = true; + } catch (ClassNotFoundException ignored) { + } + } + + private static void checkPaper() { + try { + Class.forName("io.papermc.paper.adventure.PaperAdventure"); + paper = true; + } catch (ClassNotFoundException ignored) { + } + } + + public static boolean isFolia() { + return folia; + } + + public static boolean isPaper() { + return paper; + } + + public static boolean isMojmap() { + return mojmap; + } + + public static boolean isVersionNewerThan1_20() { + return version >= 20f; + } + + public static boolean isVersionNewerThan1_20_2() { + return version >= 20.19f; + } + + public static boolean isVersionNewerThan1_20_3() { + return version >= 20.29f; + } + + public static boolean isVersionNewerThan1_20_4() { + return version >= 20.39f; + } + + public static boolean isVersionNewerThan1_20_5() { + return version >= 20.49f; + } + + public static boolean isVersionNewerThan1_21() { + return version >= 21f; + } + + public static boolean isVersionNewerThan1_21_2() { + return version >= 21.19f; + } + + public static boolean isVersionNewerThan1_21_3() { + return version >= 21.29f; + } + + public static boolean isVersionNewerThan1_21_4() { + return version >= 21.39f; + } + + public static boolean isVersionNewerThan1_21_5() { + return version >= 21.49f; + } +} \ No newline at end of file diff --git a/core/src/main/java/net/momirealms/craftengine/core/util/YamlUtils.java b/core/src/main/java/net/momirealms/craftengine/core/util/YamlUtils.java new file mode 100644 index 000000000..0f60750c6 --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/util/YamlUtils.java @@ -0,0 +1,106 @@ +package net.momirealms.craftengine.core.util; + +import com.google.gson.JsonArray; +import com.google.gson.JsonObject; +import dev.dejvokep.boostedyaml.block.implementation.Section; + +import java.util.HashMap; +import java.util.LinkedHashMap; +import java.util.List; +import java.util.Map; + +public class YamlUtils { + + private YamlUtils() {} + + public static Map sectionToMap(final Section section) { + Map map = new LinkedHashMap<>(); + sectionToMap(section, map); + return map; + } + + private static void sectionToMap(final Section section, final Map map) { + for (Map.Entry entry : section.getStringRouteMappedValues(false).entrySet()) { + Object value = entry.getValue(); + if (value instanceof Section inner) { + HashMap newMap = new LinkedHashMap<>(); + map.put(entry.getKey(), newMap); + sectionToMap(inner, newMap); + } else { + if (value instanceof String str && !str.isEmpty()) { + char first = str.charAt(0); + if (first == '(') { + int second = str.indexOf(')', 1); + if (second != -1 && second + 1 + 1 < str.length()) { + char space = str.charAt(second + 1); + if (space == ' ') { + String castType = str.substring(1, second); + String castValue = str.substring(second + 2); + map.put(entry.getKey(), TypeUtils.castBasicTypes(castValue, castType)); + continue; + } + } + } + } + map.put(entry.getKey(), value); + } + } + } + + public static JsonObject sectionToJson(final Section section) { + JsonObject json = new JsonObject(); + sectionToJson(section, json); + return json; + } + + private static void sectionToJson(final Section section, final JsonObject json) { + for (Map.Entry entry : section.getStringRouteMappedValues(false).entrySet()) { + String key = entry.getKey(); + Object value = entry.getValue(); + if (value instanceof Section inner) { + JsonObject innerObject = new JsonObject(); + json.add(key, innerObject); + sectionToJson(inner, innerObject); + } else if (value instanceof List list) { + JsonArray array = new JsonArray(); + json.add(key, array); + for (Object o : list) { + setJsonArray(array, o); + } + } else { + setJsonProperty(json, key, value); + } + } + } + + public static JsonObject mapToJson(final Map map) { + return GsonHelper.get().toJsonTree(map).getAsJsonObject(); + } + + private static void setJsonArray(final JsonArray array, final Object value) { + if (value instanceof Map map) { + JsonObject jsonObject = GsonHelper.get().toJsonTree(map).getAsJsonObject(); + array.add(jsonObject); + } else if (value instanceof Number number) { + array.add(number); + } else if (value instanceof Boolean bool) { + array.add(bool); + } else if (value instanceof Character character) { + array.add(character); + } else { + array.add(value.toString()); + } + } + + private static void setJsonProperty(final JsonObject json, final String key, final Object value) { + if (value instanceof Number number) { + json.addProperty(key, number); + } else if (value instanceof Boolean bool) { + json.addProperty(key, bool); + } else if (value instanceof Character character) { + json.addProperty(key, character); + } else { + json.addProperty(key, value.toString()); + } + } +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/util/context/ContextHolder.java b/core/src/main/java/net/momirealms/craftengine/core/util/context/ContextHolder.java new file mode 100644 index 000000000..1a259899d --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/util/context/ContextHolder.java @@ -0,0 +1,89 @@ +package net.momirealms.craftengine.core.util.context; + +import org.jetbrains.annotations.Contract; + +import javax.annotation.Nullable; +import java.util.HashMap; +import java.util.Map; +import java.util.NoSuchElementException; +import java.util.Optional; + +public class ContextHolder { + public static final ContextHolder EMPTY = ContextHolder.builder().build(); + + private final Map, Object> params; + + public ContextHolder(Map, Object> params) { + this.params = params; + } + + public boolean has(ContextKey key) { + return params.containsKey(key); + } + + @SuppressWarnings("unchecked") + public T getOrThrow(ContextKey parameter) { + T object = (T) this.params.get(parameter); + if (object == null) { + throw new NoSuchElementException(parameter.id().toString()); + } else { + return object; + } + } + + @SuppressWarnings("unchecked") + public Optional getOptional(ContextKey parameter) { + return Optional.ofNullable((T) this.params.get(parameter)); + } + + @SuppressWarnings("unchecked") + @Nullable + @Contract("_,!null->!null; _,_->_") + public T getOrDefault(ContextKey parameter, @Nullable T defaultValue) { + return (T) this.params.getOrDefault(parameter, defaultValue); + } + + public static Builder builder() { + return new Builder(); + } + + public static class Builder { + + private final Map, Object> params = new HashMap<>(); + + public Builder() {} + + public Builder withParameter(ContextKey parameter, T value) { + this.params.put(parameter, value); + return this; + } + + public Builder withOptionalParameter(ContextKey parameter, @Nullable T value) { + if (value == null) { + this.params.remove(parameter); + } else { + this.params.put(parameter, value); + } + return this; + } + + @SuppressWarnings("unchecked") + public T getParameterOrThrow(ContextKey parameter) { + T object = (T) this.params.get(parameter); + if (object == null) { + throw new NoSuchElementException(parameter.id().toString()); + } else { + return object; + } + } + + @SuppressWarnings("unchecked") + public Optional getOptionalParameter(ContextKey parameter) { + return Optional.ofNullable((T) this.params.get(parameter)); + } + + public ContextHolder build() { + return new ContextHolder(this.params); + } + } +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/util/context/ContextKey.java b/core/src/main/java/net/momirealms/craftengine/core/util/context/ContextKey.java new file mode 100644 index 000000000..4ea446ffb --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/util/context/ContextKey.java @@ -0,0 +1,39 @@ +package net.momirealms.craftengine.core.util.context; + +import net.momirealms.craftengine.core.util.Key; +import org.jetbrains.annotations.NotNull; + +public class ContextKey { + private final Key id; + + public ContextKey(@NotNull Key id) { + this.id = id; + } + + @NotNull + public Key id() { + return id; + } + + @NotNull + public static ContextKey of(@NotNull Key id) { + return new ContextKey<>(id); + } + + @NotNull + public static ContextKey of(@NotNull String id) { + return new ContextKey<>(Key.of(id)); + } + + @Override + public final boolean equals(Object o) { + if (this == o) return true; + if (!(o instanceof ContextKey that)) return false; + return id.equals(that.id); + } + + @Override + public int hashCode() { + return id.hashCode(); + } +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/util/os/Architecture.java b/core/src/main/java/net/momirealms/craftengine/core/util/os/Architecture.java new file mode 100644 index 000000000..ab97a1da9 --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/util/os/Architecture.java @@ -0,0 +1,49 @@ +package net.momirealms.craftengine.core.util.os; + +import java.util.Locale; + +public enum Architecture { + X64(true), + X86(false), + ARM64(true), + ARM32(false), + PPC64LE(true), + RISCV64(true); + + static final Architecture current; + final boolean is64Bit; + + Architecture(boolean is64Bit) { + this.is64Bit = is64Bit; + } + + public String getNativePath() { + return name().toLowerCase(Locale.ENGLISH); + } + + public static Architecture get() { + return current; + } + + static { + String osArch = System.getProperty("os.arch"); + boolean is64Bit = osArch.contains("64") || osArch.startsWith("armv8"); + if (!osArch.startsWith("arm") && !osArch.startsWith("aarch")) { + if (osArch.startsWith("ppc")) { + if (!"ppc64le".equals(osArch)) { + throw new UnsupportedOperationException("Only PowerPC 64 LE is supported."); + } + current = PPC64LE; + } else if (osArch.startsWith("riscv")) { + if (!"riscv64".equals(osArch)) { + throw new UnsupportedOperationException("Only RISC-V 64 is supported."); + } + current = RISCV64; + } else { + current = is64Bit ? X64 : X86; + } + } else { + current = is64Bit ? ARM64 : ARM32; + } + } +} \ No newline at end of file diff --git a/core/src/main/java/net/momirealms/craftengine/core/util/os/Platform.java b/core/src/main/java/net/momirealms/craftengine/core/util/os/Platform.java new file mode 100644 index 000000000..fd864193d --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/util/os/Platform.java @@ -0,0 +1,45 @@ +package net.momirealms.craftengine.core.util.os; + +public enum Platform { + FREEBSD("FreeBSD", "freebsd"), + LINUX("Linux", "linux"), + MACOS("macOS", "macos"), + WINDOWS("Windows", "windows"); + + private static final Platform current; + private final String name; + private final String nativePath; + + Platform(String name, String nativePath) { + this.name = name; + this.nativePath = nativePath; + } + + public String getName() { + return this.name; + } + + public String getNativePath() { + return nativePath; + } + + public static Platform get() { + return current; + } + + static { + String osName = System.getProperty("os.name"); + if (osName.startsWith("Windows")) { + current = WINDOWS; + } else if (osName.startsWith("FreeBSD")) { + current = FREEBSD; + } else if (!osName.startsWith("Linux") && !osName.startsWith("SunOS") && !osName.startsWith("Unix")) { + if (!osName.startsWith("Mac OS X") && !osName.startsWith("Darwin")) { + throw new LinkageError("Unknown platform: " + osName); + } + current = MACOS; + } else { + current = LINUX; + } + } +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/world/BlockHitResult.java b/core/src/main/java/net/momirealms/craftengine/core/world/BlockHitResult.java new file mode 100644 index 000000000..d20cffe34 --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/world/BlockHitResult.java @@ -0,0 +1,65 @@ +package net.momirealms.craftengine.core.world; + +import net.momirealms.craftengine.core.util.Direction; + +public class BlockHitResult extends HitResult { + private final Direction direction; + private final BlockPos blockPos; + private final boolean miss; + private final boolean inside; + private final boolean worldBorderHit; + + public static BlockHitResult miss(Vec3d pos, Direction side, BlockPos blockPos) { + return new BlockHitResult(true, pos, side, blockPos, false, false); + } + + public BlockHitResult(Vec3d pos, Direction side, BlockPos blockPos, boolean insideBlock) { + this(false, pos, side, blockPos, insideBlock, false); + } + + public BlockHitResult(Vec3d pos, Direction side, BlockPos blockPos, boolean insideBlock, boolean againstWorldBorder) { + this(false, pos, side, blockPos, insideBlock, againstWorldBorder); + } + + private BlockHitResult(boolean missed, Vec3d pos, Direction side, BlockPos blockPos, boolean insideBlock, boolean againstWorldBorder) { + super(pos); + this.miss = missed; + this.direction = side; + this.blockPos = blockPos; + this.inside = insideBlock; + this.worldBorderHit = againstWorldBorder; + } + + public BlockHitResult withDirection(Direction side) { + return new BlockHitResult(this.miss, this.location, side, this.blockPos, this.inside, this.worldBorderHit); + } + + public BlockHitResult withPosition(BlockPos blockPos) { + return new BlockHitResult(this.miss, this.location, this.direction, blockPos, this.inside, this.worldBorderHit); + } + + public BlockHitResult hitBorder() { + return new BlockHitResult(this.miss, this.location, this.direction, this.blockPos, this.inside, true); + } + + public BlockPos getBlockPos() { + return this.blockPos; + } + + public Direction getDirection() { + return this.direction; + } + + @Override + public HitResult.Type getType() { + return this.miss ? HitResult.Type.MISS : HitResult.Type.BLOCK; + } + + public boolean isInside() { + return this.inside; + } + + public boolean isWorldBorderHit() { + return this.worldBorderHit; + } +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/world/BlockPos.java b/core/src/main/java/net/momirealms/craftengine/core/world/BlockPos.java new file mode 100644 index 000000000..d5d7a7eb7 --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/world/BlockPos.java @@ -0,0 +1,44 @@ +package net.momirealms.craftengine.core.world; + +import net.momirealms.craftengine.core.util.Direction; + +public class BlockPos extends Vec3i { + + public BlockPos(int x, int y, int z) { + super(x, y, z); + } + + @Override + public BlockPos relative(Direction direction) { + return switch (direction) { + case UP -> new BlockPos(this.x(), this.y() + 1, this.z()); + case DOWN -> new BlockPos(this.x(), this.y() - 1, this.z()); + case NORTH -> new BlockPos(this.x(), this.y(), this.z() - 1); + case SOUTH -> new BlockPos(this.x(), this.y(), this.z() + 1); + case WEST -> new BlockPos(this.x() - 1, this.y(), this.z()); + case EAST -> new BlockPos(this.x() + 1, this.y(), this.z()); + }; + } + + public static BlockPos of(long packedPos) { + return new BlockPos((int) (packedPos >> 38), (int) ((packedPos << 52) >> 52), (int) ((packedPos << 26) >> 38)); + } + + public BlockPos relative(Direction direction, int i) { + return i == 0 + ? this + : new BlockPos(this.x() + direction.stepX() * i, this.y() + direction.stepY() * i, this.z() + direction.stepZ() * i); + } + + public int toSectionBlockIndex() { + return (y & 15) << 8 | (z & 15) << 4 | x & 15; + } + + public long asLong() { + return asLong(this.x(), this.y(), this.z()); + } + + public static long asLong(int x, int y, int z) { + return (((long) x & (long) 67108863) << 38) | (((long) y & (long) 4095)) | (((long) z & (long) 67108863) << 12); + } +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/world/CEWorld.java b/core/src/main/java/net/momirealms/craftengine/core/world/CEWorld.java new file mode 100644 index 000000000..cae381027 --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/world/CEWorld.java @@ -0,0 +1,151 @@ +package net.momirealms.craftengine.core.world; + +import it.unimi.dsi.fastutil.longs.Long2ObjectOpenHashMap; +import net.momirealms.craftengine.core.block.ImmutableBlockState; +import net.momirealms.craftengine.core.world.chunk.CEChunk; +import net.momirealms.craftengine.core.world.chunk.storage.DefaultRegionFileStorage; +import net.momirealms.craftengine.core.world.chunk.storage.WorldDataStorage; +import org.jetbrains.annotations.Nullable; + +import java.util.Collections; +import java.util.HashSet; +import java.util.Map; +import java.util.Set; +import java.util.concurrent.locks.ReentrantReadWriteLock; + +public abstract class CEWorld { + public static final String REGION_DIRECTORY = "craftengine"; + protected final World world; + protected final Map loadedChunkMap; + protected final WorldDataStorage worldDataStorage; + protected final ReentrantReadWriteLock loadedChunkMapLock = new ReentrantReadWriteLock(); + protected final WorldHeight worldHeightAccessor; + protected final Set updatedSectionPositions = Collections.synchronizedSet(new HashSet<>()); + + private CEChunk lastChunk; + private long lastChunkPos; + + public CEWorld(World world) { + this.world = world; + this.loadedChunkMap = new Long2ObjectOpenHashMap<>(1024, 0.5f); + this.worldDataStorage = new DefaultRegionFileStorage(world.directory().resolve(REGION_DIRECTORY)); + this.worldHeightAccessor = world.worldHeight(); + this.lastChunkPos = ChunkPos.INVALID_CHUNK_POS; + } + + public World world() { + return world; + } + + public boolean isChunkLoaded(final long chunkPos) { + this.loadedChunkMapLock.readLock().lock(); + try { + return loadedChunkMap.containsKey(chunkPos); + } finally { + this.loadedChunkMapLock.readLock().unlock(); + } + } + + public void addLoadedChunk(CEChunk chunk) { + this.loadedChunkMapLock.writeLock().lock(); + try { + this.loadedChunkMap.put(chunk.chunkPos().longKey(), chunk); + } finally { + this.loadedChunkMapLock.writeLock().unlock(); + } + } + + public void removeLoadedChunk(CEChunk chunk) { + this.loadedChunkMapLock.writeLock().lock(); + try { + this.loadedChunkMap.remove(chunk.chunkPos().longKey()); + if (this.lastChunk == chunk) { + this.lastChunk = null; + this.lastChunkPos = ChunkPos.INVALID_CHUNK_POS; + } + } finally { + this.loadedChunkMapLock.writeLock().unlock(); + } + } + + @Nullable + public CEChunk getLoadedChunkImmediately(int x, int z) { + long longKey = ChunkPos.asLong(x, z); + this.loadedChunkMapLock.readLock().lock(); + try { + return this.loadedChunkMap.get(longKey); + } finally { + this.loadedChunkMapLock.readLock().unlock(); + } + } + + @Nullable + public CEChunk getChunkAtIfLoadedMainThread(long chunkPos) { + if (chunkPos == this.lastChunkPos) { + return this.lastChunk; + } + CEChunk chunk = this.loadedChunkMap.get(chunkPos); + if (chunk != null) { + this.lastChunk = chunk; + this.lastChunkPos = chunkPos; + } + return chunk; + } + + @Nullable + public CEChunk getChunkAtIfLoadedMainThread(int x, int z) { + return getChunkAtIfLoadedMainThread(ChunkPos.asLong(x, z)); + } + + @Nullable + public CEChunk getChunkAtIfLoaded(int x, int z) { + long chunkPos = ChunkPos.asLong(x, z); + return this.getChunkAtIfLoadedMainThread(chunkPos); + } + + public WorldHeight worldHeight() { + return worldHeightAccessor; + } + + public ImmutableBlockState getBlockStateAtIfLoaded(int x, int y, int z) { + CEChunk chunk = getChunkAtIfLoaded(x >> 4, z >> 4); + if (chunk == null) { + return null; + } + return chunk.getBlockState(x, y, z); + } + + public ImmutableBlockState getBlockStateAtIfLoaded(BlockPos blockPos) { + CEChunk chunk = getChunkAtIfLoaded(blockPos.x() >> 4, blockPos.z() >> 4); + if (chunk == null) { + return null; + } + return chunk.getBlockState(blockPos); + } + + public boolean setBlockStateAtIfLoaded(BlockPos blockPos, ImmutableBlockState blockState) { + if (worldHeightAccessor.isOutsideBuildHeight(blockPos)) { + return false; + } + CEChunk chunk = getChunkAtIfLoaded(blockPos.x() >> 4, blockPos.z() >> 4); + if (chunk == null) { + return false; + } + chunk.setBlockState(blockPos, blockState); + return true; + } + + public WorldDataStorage worldDataStorage() { + return worldDataStorage; + } + + public void sectionLightUpdated(SectionPos pos) { + this.updatedSectionPositions.add(pos); + } + + public void sectionLightUpdated(Set pos) { + this.updatedSectionPositions.addAll(pos); + } + + public abstract void tick(); +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/world/ChunkPos.java b/core/src/main/java/net/momirealms/craftengine/core/world/ChunkPos.java new file mode 100644 index 000000000..f90eaaad4 --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/world/ChunkPos.java @@ -0,0 +1,58 @@ +package net.momirealms.craftengine.core.world; + +public class ChunkPos { + public static final long INVALID_CHUNK_POS = asLong(1875066, 1875066); + public final int x; + public final int z; + public final long longKey; + + public ChunkPos(int x, int z) { + this.x = x; + this.z = z; + this.longKey = asLong(this.x, this.z); + } + + public ChunkPos(BlockPos pos) { + this.x = SectionPos.blockToSectionCoord(pos.x()); + this.z = SectionPos.blockToSectionCoord(pos.z()); + this.longKey = asLong(this.x, this.z); + } + + public ChunkPos(long pos) { + this.x = (int) pos; + this.z = (int) (pos >> 32); + this.longKey = asLong(this.x, this.z); + } + + public int x() { + return x; + } + + public int z() { + return z; + } + + public int regionX() { + return this.x >> 5; + } + + public int regionLocalX() { + return this.x & 31; + } + + public int regionZ() { + return this.z >> 5; + } + + public int regionLocalZ() { + return this.z & 31; + } + + public long longKey() { + return longKey; + } + + public static long asLong(int chunkX, int chunkZ) { + return (long) chunkX & 4294967295L | ((long) chunkZ & 4294967295L) << 32; + } +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/world/HitResult.java b/core/src/main/java/net/momirealms/craftengine/core/world/HitResult.java new file mode 100644 index 000000000..4c1d08e71 --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/world/HitResult.java @@ -0,0 +1,30 @@ +package net.momirealms.craftengine.core.world; + +import net.momirealms.craftengine.core.entity.Entity; + +public abstract class HitResult { + protected final Vec3d location; + + protected HitResult(Vec3d pos) { + this.location = pos; + } + + public double distanceTo(Entity entity) { + double d = this.location.x() - entity.x(); + double e = this.location.y() - entity.y(); + double f = this.location.z() - entity.z(); + return d * d + e * e + f * f; + } + + public abstract HitResult.Type getType(); + + public Vec3d getLocation() { + return this.location; + } + + public static enum Type { + MISS, + BLOCK, + ENTITY; + } +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/world/Position.java b/core/src/main/java/net/momirealms/craftengine/core/world/Position.java new file mode 100644 index 000000000..41a638cad --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/world/Position.java @@ -0,0 +1,10 @@ +package net.momirealms.craftengine.core.world; + +public interface Position { + + double x(); + + double y(); + + double z(); +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/world/SectionPos.java b/core/src/main/java/net/momirealms/craftengine/core/world/SectionPos.java new file mode 100644 index 000000000..3897374da --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/world/SectionPos.java @@ -0,0 +1,16 @@ +package net.momirealms.craftengine.core.world; + +public class SectionPos extends Vec3i { + + public SectionPos(int x, int y, int z) { + super(x, y, z); + } + + public static int blockToSectionCoord(int coord) { + return coord >> 4; + } + + public static SectionPos of(BlockPos pos) { + return new SectionPos(pos.x() >> 4, pos.y() >> 4, pos.z() >> 4); + } +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/world/Vec3d.java b/core/src/main/java/net/momirealms/craftengine/core/world/Vec3d.java new file mode 100644 index 000000000..d322b84a1 --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/world/Vec3d.java @@ -0,0 +1,78 @@ +package net.momirealms.craftengine.core.world; + +import net.momirealms.craftengine.core.util.MCUtils; + +public class Vec3d implements Position { + private final double x; + private final double y; + private final double z; + + public Vec3d(double x, double y, double z) { + this.x = x; + this.y = y; + this.z = z; + } + + public Vec3d toCenter() { + return new Vec3d(MCUtils.fastFloor(x) + 0.5, MCUtils.fastFloor(y) + 0.5, MCUtils.fastFloor(z) + 0.5); + } + + public static Vec3d atLowerCornerOf(Vec3i vec) { + return new Vec3d(vec.x(), vec.y(), vec.z()); + } + + public static Vec3d atLowerCornerWithOffset(Vec3i vec, double deltaX, double deltaY, double deltaZ) { + return new Vec3d((double) vec.x() + deltaX, (double) vec.y() + deltaY, (double) vec.z() + deltaZ); + } + + public static Vec3d atCenterOf(Vec3i vec) { + return atLowerCornerWithOffset(vec, 0.5, 0.5, 0.5); + } + + public static Vec3d atBottomCenterOf(Vec3i vec) { + return atLowerCornerWithOffset(vec, 0.5, 0.0, 0.5); + } + + public static Vec3d upFromBottomCenterOf(Vec3i vec, double deltaY) { + return atLowerCornerWithOffset(vec, 0.5, deltaY, 0.5); + } + + @Override + public double x() { + return x; + } + + @Override + public double y() { + return y; + } + + @Override + public double z() { + return z; + } + + @Override + public final boolean equals(Object o) { + if (this == o) return true; + if (!(o instanceof Vec3d vec3d)) return false; + return Double.compare(x, vec3d.x) == 0 && Double.compare(y, vec3d.y) == 0 && Double.compare(z, vec3d.z) == 0; + } + + @Override + public int hashCode() { + int result = Double.hashCode(x); + result = 31 * result + Double.hashCode(y); + result = 31 * result + Double.hashCode(z); + return result; + } + + @Override + public String toString() { + return "Vec3d{" + + "x=" + x + + ", y=" + y + + ", z=" + z + + '}'; + } +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/world/Vec3i.java b/core/src/main/java/net/momirealms/craftengine/core/world/Vec3i.java new file mode 100644 index 000000000..7d49c6aaa --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/world/Vec3i.java @@ -0,0 +1,95 @@ +package net.momirealms.craftengine.core.world; + +import net.momirealms.craftengine.core.util.Direction; + +public class Vec3i implements Comparable { + public static final Vec3i ZERO = new Vec3i(0, 0, 0); + protected int x; + protected int y; + protected int z; + + public Vec3i(int x, int y, int z) { + this.x = x; + this.y = y; + this.z = z; + } + + public int x() { + return this.x; + } + + public int y() { + return this.y; + } + + public int z() { + return this.z; + } + + public Vec3i offset(int x, int y, int z) { + return x == 0 && y == 0 && z == 0 ? this : new Vec3i(this.x() + x, this.y() + y, this.z() + z); + } + + protected Vec3i setX(int x) { + this.x = x; + return this; + } + + protected Vec3i setY(int y) { + this.y = y; + return this; + } + + protected Vec3i setZ(int z) { + this.z = z; + return this; + } + + @Override + public boolean equals(Object object) { + return this == object || object instanceof Vec3i vec3i && this.x() == vec3i.x() && this.y() == vec3i.y() && this.z() == vec3i.z(); + } + + @Override + public int hashCode() { + return (this.y() + this.z() * 31) * 31 + this.x(); + } + + @Override + public String toString() { + return "Vec3i{" + + "x=" + x + + ", y=" + y + + ", z=" + z + + '}'; + } + + public Vec3i relative(Direction direction) { + return this.relative(direction, 1); + } + + public Vec3i relative(Direction direction, int distance) { + return distance == 0 + ? this + : new Vec3i( + this.x() + direction.stepX() * distance, this.y() + direction.stepY() * distance, this.z() + direction.stepZ() * distance + ); + } + + public Vec3i multiply(int scale) { + if (scale == 1) { + return this; + } else { + return scale == 0 ? ZERO : new Vec3i(this.x() * scale, this.y() * scale, this.z() * scale); + } + } + + @Override + public int compareTo(Vec3i vec3i) { + if (this.y() == vec3i.y()) { + return this.z() == vec3i.z() ? this.x() - vec3i.x() : this.z() - vec3i.z(); + } else { + return this.y() - vec3i.y(); + } + } +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/world/World.java b/core/src/main/java/net/momirealms/craftengine/core/world/World.java new file mode 100644 index 000000000..7cabc13a5 --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/world/World.java @@ -0,0 +1,32 @@ +package net.momirealms.craftengine.core.world; + +import net.momirealms.craftengine.core.item.Item; +import net.momirealms.craftengine.core.util.Key; + +import java.nio.file.Path; +import java.util.UUID; + +public interface World { + + Object getHandle(); + + WorldHeight worldHeight(); + + WorldBlock getBlockAt(int x, int y, int z); + + default WorldBlock getBlockAt(final BlockPos pos) { + return getBlockAt(pos.x(), pos.y(), pos.z()); + } + + String name(); + + Path directory(); + + UUID uuid(); + + void dropItemNaturally(Vec3d location, Item item); + + void dropExp(Vec3d location, int amount); + + void playBlockSound(Vec3d location, Key sound, float volume, float pitch); +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/world/WorldBlock.java b/core/src/main/java/net/momirealms/craftengine/core/world/WorldBlock.java new file mode 100644 index 000000000..4da8df826 --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/world/WorldBlock.java @@ -0,0 +1,14 @@ +package net.momirealms.craftengine.core.world; + +import net.momirealms.craftengine.core.item.context.BlockPlaceContext; + +public interface WorldBlock { + + default boolean canBeReplaced(BlockPlaceContext blockPlaceContext) { + return false; + } + + default boolean isWaterSource(BlockPlaceContext blockPlaceContext) { + return false; + } +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/world/WorldHeight.java b/core/src/main/java/net/momirealms/craftengine/core/world/WorldHeight.java new file mode 100644 index 000000000..c5486a74f --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/world/WorldHeight.java @@ -0,0 +1,74 @@ +package net.momirealms.craftengine.core.world; + +public interface WorldHeight { + + int getHeight(); + + int getMinBuildHeight(); + + default int getMaxBuildHeight() { + return this.getMinBuildHeight() + this.getHeight(); + } + + default int getSectionsCount() { + return this.getMaxSection() - this.getMinSection(); + } + + default int getMinSection() { + return SectionPos.blockToSectionCoord(this.getMinBuildHeight()); + } + + default int getMaxSection() { + return SectionPos.blockToSectionCoord(this.getMaxBuildHeight() - 1) + 1; + } + + default boolean isOutsideBuildHeight(BlockPos pos) { + return this.isOutsideBuildHeight(pos.y()); + } + + default boolean isOutsideBuildHeight(int y) { + return y < this.getMinBuildHeight() || y >= this.getMaxBuildHeight(); + } + + default int getSectionIndex(int y) { + return this.getSectionIndexFromSectionY(SectionPos.blockToSectionCoord(y)); + } + + default int getSectionIndexFromSectionY(int coord) { + return coord - this.getMinSection(); + } + + default int getSectionYFromSectionIndex(int index) { + return index + this.getMinSection(); + } + + static WorldHeight create(final int bottomY, final int height) { + return new WorldHeightImpl(bottomY, height); + } + + class WorldHeightImpl implements WorldHeight { + private final int bottomY; + private final int height; + private final int minSection; + public WorldHeightImpl(final int bottomY, final int height) { + this.bottomY = bottomY; + this.height = height; + this.minSection = SectionPos.blockToSectionCoord(this.getMinBuildHeight()); + } + + @Override + public int getHeight() { + return height; + } + + @Override + public int getMinBuildHeight() { + return bottomY; + } + + @Override + public int getMinSection() { + return this.minSection; + } + } +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/world/WorldManager.java b/core/src/main/java/net/momirealms/craftengine/core/world/WorldManager.java new file mode 100644 index 000000000..24f615730 --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/world/WorldManager.java @@ -0,0 +1,12 @@ +package net.momirealms.craftengine.core.world; + +import net.momirealms.craftengine.core.plugin.Reloadable; + +import java.util.UUID; + +public interface WorldManager extends Reloadable { + + CEWorld getWorld(UUID uuid); + + void delayedInit(); +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/world/chunk/ArrayPalette.java b/core/src/main/java/net/momirealms/craftengine/core/world/chunk/ArrayPalette.java new file mode 100644 index 000000000..94b254c65 --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/world/chunk/ArrayPalette.java @@ -0,0 +1,120 @@ +package net.momirealms.craftengine.core.world.chunk; + +import net.momirealms.craftengine.core.util.FriendlyByteBuf; +import net.momirealms.craftengine.core.util.IndexedIterable; + +import java.util.List; +import java.util.function.Function; +import java.util.function.Predicate; + +public class ArrayPalette implements Palette { + private final IndexedIterable idList; + private final T[] array; + private final PaletteResizeListener listener; + private final int indexBits; + private int size; + + @SuppressWarnings("unchecked") + private ArrayPalette(IndexedIterable idList, int bits, PaletteResizeListener listener, List list) { + this.idList = idList; + this.array = (T[]) new Object[1 << bits]; + this.indexBits = bits; + this.listener = listener; + + for (int i = 0; i < list.size(); ++i) { + this.array[i] = list.get(i); + } + + this.size = list.size(); + } + + private ArrayPalette(IndexedIterable idList, T[] array, PaletteResizeListener listener, int indexBits, int size) { + this.idList = idList; + this.array = array; + this.listener = listener; + this.indexBits = indexBits; + this.size = size; + } + + public static Palette create(int bits, IndexedIterable idList, PaletteResizeListener listener, List list) { + return new ArrayPalette<>(idList, bits, listener, list); + } + + @Override + public void readPacket(FriendlyByteBuf buf) { + this.size = buf.readVarInt(); + for(int i = 0; i < this.size; ++i) { + this.array[i] = this.idList.getOrThrow(buf.readVarInt()); + } + } + + @Override + public void writePacket(FriendlyByteBuf buf) { + buf.writeVarInt(this.size); + for(int i = 0; i < this.size; ++i) { + buf.writeVarInt(this.idList.getRawId(this.array[i])); + } + } + + @Override + public int index(T object) { + int i; + for(i = 0; i < this.size; ++i) { + if (this.array[i] == object) { + return i; + } + } + + i = this.size; + if (i < this.array.length) { + this.array[i] = object; + ++this.size; + return i; + } else { + return this.listener.onResize(this.indexBits + 1, object); + } + } + + @Override + public boolean hasAny(Predicate predicate) { + for(int i = 0; i < this.size; ++i) { + if (predicate.test(this.array[i])) { + return true; + } + } + + return false; + } + + @Override + public T get(int id) { + if (id >= 0 && id < this.size) { + return this.array[id]; + } else { + throw new RuntimeException("Missing Palette entry for index " + id + "."); + } + } + + @Override + public int getSize() { + return this.size; + } + + @Override + public Palette copy(PaletteResizeListener resizeListener) { + return new ArrayPalette<>(this.idList, this.array.clone(), resizeListener, this.indexBits, this.size); + } + + @Override + public void remap(Function function) { + for (int i = 0; i < this.array.length; i++) { + if (this.array[i] == null) return; + this.array[i] = function.apply(this.array[i]); + } + } + + @Override + public boolean canRemap() { + return true; + } +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/world/chunk/BiMapPalette.java b/core/src/main/java/net/momirealms/craftengine/core/world/chunk/BiMapPalette.java new file mode 100644 index 000000000..a9d27c98b --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/world/chunk/BiMapPalette.java @@ -0,0 +1,113 @@ +package net.momirealms.craftengine.core.world.chunk; + +import net.momirealms.craftengine.core.util.FriendlyByteBuf; +import net.momirealms.craftengine.core.util.IndexedIterable; +import net.momirealms.craftengine.core.util.Int2ObjectBiMap; + +import java.util.ArrayList; +import java.util.List; +import java.util.function.Function; +import java.util.function.Predicate; + +public class BiMapPalette implements Palette { + private final IndexedIterable idList; + private final Int2ObjectBiMap map; + private final PaletteResizeListener listener; + private final int indexBits; + + public BiMapPalette(IndexedIterable idList, int bits, PaletteResizeListener listener, List entries) { + this(idList, bits, listener); + entries.forEach(this.map::add); + } + + public BiMapPalette(IndexedIterable idList, int indexBits, PaletteResizeListener listener) { + this(idList, indexBits, listener, Int2ObjectBiMap.create(1 << indexBits)); + } + + private BiMapPalette(IndexedIterable idList, int indexBits, PaletteResizeListener listener, Int2ObjectBiMap map) { + this.idList = idList; + this.indexBits = indexBits; + this.listener = listener; + this.map = map; + } + + public static Palette create(int bits, IndexedIterable idList, PaletteResizeListener listener, List entries) { + return new BiMapPalette<>(idList, bits, listener, entries); + } + + @Override + public void readPacket(FriendlyByteBuf buf) { + this.map.clear(); + int i = buf.readVarInt(); + for (int j = 0; j < i; ++j) { + this.map.add(this.idList.getOrThrow(buf.readVarInt())); + } + } + + @Override + public void writePacket(FriendlyByteBuf buf) { + int i = this.getSize(); + buf.writeVarInt(i); + for (int j = 0; j < i; ++j) { + buf.writeVarInt(this.idList.getRawId(this.map.get(j))); + } + } + + @Override + public int index(T object) { + int i = this.map.getRawId(object); + if (i == -1) { + i = this.map.add(object); + if (i >= 1 << this.indexBits) { + i = this.listener.onResize(this.indexBits + 1, object); + } + } + return i; + } + + @Override + public boolean hasAny(Predicate predicate) { + for(int i = 0; i < this.getSize(); ++i) { + if (predicate.test(this.map.get(i))) { + return true; + } + } + return false; + } + + @Override + public T get(int id) { + T object = this.map.get(id); + if (object == null) { + throw new RuntimeException("Missing Palette entry for index " + id + "."); + } else { + return object; + } + } + + public List getElements() { + ArrayList arrayList = new ArrayList<>(); + this.map.iterator().forEachRemaining(arrayList::add); + return arrayList; + } + + @Override + public int getSize() { + return this.map.size(); + } + + @Override + public Palette copy(PaletteResizeListener resizeListener) { + return new BiMapPalette<>(this.idList, this.indexBits, resizeListener, this.map.copy()); + } + + @Override + public void remap(Function function) { + this.map.remapValues(function); + } + + @Override + public boolean canRemap() { + return true; + } +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/world/chunk/CEChunk.java b/core/src/main/java/net/momirealms/craftengine/core/world/chunk/CEChunk.java new file mode 100644 index 000000000..5423ff1b1 --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/world/chunk/CEChunk.java @@ -0,0 +1,132 @@ +package net.momirealms.craftengine.core.world.chunk; + +import net.momirealms.craftengine.core.block.EmptyBlock; +import net.momirealms.craftengine.core.block.ImmutableBlockState; +import net.momirealms.craftengine.core.world.*; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +import java.util.ArrayList; +import java.util.List; + +public class CEChunk { + private boolean loaded; + private final CEWorld world; + private final ChunkPos chunkPos; + private final CESection[] sections; + private final WorldHeight worldHeightAccessor; + private final List entities; + + public CEChunk(CEWorld world, ChunkPos chunkPos) { + this.world = world; + this.chunkPos = chunkPos; + this.worldHeightAccessor = world.worldHeight(); + this.sections = new CESection[this.worldHeightAccessor.getSectionsCount()]; + this.entities = new ArrayList<>(); + this.fillEmptySection(); + } + + public CEChunk(CEWorld world, ChunkPos chunkPos, CESection[] sections, List entities) { + this.world = world; + this.chunkPos = chunkPos; + this.entities = entities; + this.worldHeightAccessor = world.worldHeight(); + int sectionCount = this.worldHeightAccessor.getSectionsCount(); + this.sections = new CESection[sectionCount]; + if (sections != null) { + for (CESection section : sections) { + if (section != null) { + int index = sectionIndex(section.sectionY()); + this.sections[index] = section; + } + } + } + this.fillEmptySection(); + } + + private void fillEmptySection() { + for (int i = 0; i < sections.length; ++i) { + if (sections[i] == null) { + sections[i] = new CESection(world.worldHeight().getSectionYFromSectionIndex(i), + new PalettedContainer<>(null, EmptyBlock.INSTANCE.getDefaultState(), PalettedContainer.PaletteProvider.CUSTOM_BLOCK_STATE)); + } + } + } + + public void setBlockState(BlockPos pos, ImmutableBlockState state) { + this.setBlockState(pos.x(), pos.y(), pos.z(), state); + } + + public void setBlockState(int x, int y, int z, ImmutableBlockState state) { + int index = sectionIndex(SectionPos.blockToSectionCoord(y)); + CESection section = this.sections[index]; + if (section == null) { + return; + } + section.setBlockState((y & 15) << 8 | (z & 15) << 4 | x & 15, state); + } + + @Nullable + public ImmutableBlockState getBlockState(BlockPos pos) { + return getBlockState(pos.x(), pos.y(), pos.z()); + } + + @Nullable + public ImmutableBlockState getBlockState(int x, int y, int z) { + int index = sectionIndex(SectionPos.blockToSectionCoord(y)); + CESection section = this.sections[index]; + if (section == null) { + return null; + } + return section.getBlockState((y & 15) << 8 | (z & 15) << 4 | x & 15); + } + + @Nullable + public CESection sectionByIndex(int index) { + return this.sections[index]; + } + + @Nullable + public CESection sectionById(int sectionId) { + return this.sections[sectionIndex(sectionId)]; + } + + public int sectionIndex(int sectionId) { + return sectionId - this.worldHeightAccessor.getMinSection(); + } + + public int sectionY(int sectionIndex) { + return sectionIndex + this.worldHeightAccessor.getMinSection(); + } + + @NotNull + public CEWorld world() { + return world; + } + + @NotNull + public ChunkPos chunkPos() { + return chunkPos; + } + + @NotNull + public CESection[] sections() { + return sections; + } + + public boolean isLoaded() { + return loaded; + } + + public void load() { + if (this.loaded) return; + this.world.addLoadedChunk(this); + this.loaded = true; + } + + public void unload() { + if (!this.loaded) return; + this.world.removeLoadedChunk(this); + this.loaded = false; + } +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/world/chunk/CESection.java b/core/src/main/java/net/momirealms/craftengine/core/world/chunk/CESection.java new file mode 100644 index 000000000..676968ed2 --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/world/chunk/CESection.java @@ -0,0 +1,50 @@ +package net.momirealms.craftengine.core.world.chunk; + +import net.momirealms.craftengine.core.block.ImmutableBlockState; +import net.momirealms.craftengine.core.world.BlockPos; + +public class CESection { + public static final int SECTION_WIDTH = 16; + public static final int SECTION_HEIGHT = 16; + public static final int SECTION_SIZE = SECTION_WIDTH * SECTION_WIDTH * SECTION_HEIGHT; + + private final int sectionY; + private final PalettedContainer statesContainer; + + public CESection(int sectionY, PalettedContainer statesContainer) { + this.sectionY = sectionY; + this.statesContainer = statesContainer; + } + + public void setBlockState(BlockPos pos, ImmutableBlockState state) { + setBlockState(pos.x() & 15, pos.y() & 15, pos.z() & 15, state); + } + + public void setBlockState(int x, int y, int z, ImmutableBlockState state) { + statesContainer.set((y << 4 | z) << 4 | x, state); + } + + public void setBlockState(int index, ImmutableBlockState state) { + statesContainer.set(index, state); + } + + public ImmutableBlockState getBlockState(BlockPos pos) { + return getBlockState(pos.x() & 15, pos.y() & 15, pos.z() & 15); + } + + public ImmutableBlockState getBlockState(int x, int y, int z) { + return statesContainer.get((y << 4 | z) << 4 | x); + } + + public ImmutableBlockState getBlockState(int index) { + return statesContainer.get(index); + } + + public PalettedContainer statesContainer() { + return statesContainer; + } + + public int sectionY() { + return sectionY; + } +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/world/chunk/EmptyPaletteStorage.java b/core/src/main/java/net/momirealms/craftengine/core/world/chunk/EmptyPaletteStorage.java new file mode 100644 index 000000000..262e5dc1d --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/world/chunk/EmptyPaletteStorage.java @@ -0,0 +1,41 @@ +package net.momirealms.craftengine.core.world.chunk; + +import java.util.Arrays; +import java.util.function.IntConsumer; + +public record EmptyPaletteStorage(int size) implements PaletteStorage { + public static final long[] EMPTY_DATA = new long[0]; + + public int swap(int index, int value) { + return 0; + } + + public void set(int index, int value) { + } + + public int get(int index) { + return 0; + } + + public long[] getData() { + return EMPTY_DATA; + } + + public int getElementBits() { + return 0; + } + + public void forEach(IntConsumer action) { + for (int i = 0; i < this.size; ++i) { + action.accept(0); + } + } + + public void writePaletteIndices(int[] out) { + Arrays.fill(out, 0, this.size, 0); + } + + public PaletteStorage copy() { + return this; + } +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/world/chunk/IdListPalette.java b/core/src/main/java/net/momirealms/craftengine/core/world/chunk/IdListPalette.java new file mode 100644 index 000000000..362948919 --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/world/chunk/IdListPalette.java @@ -0,0 +1,69 @@ +package net.momirealms.craftengine.core.world.chunk; + +import net.momirealms.craftengine.core.util.FriendlyByteBuf; +import net.momirealms.craftengine.core.util.IndexedIterable; + +import java.util.List; +import java.util.function.Function; +import java.util.function.Predicate; + +public class IdListPalette implements Palette { + private final IndexedIterable idList; + + public IdListPalette(IndexedIterable idList) { + this.idList = idList; + } + + public static Palette create(int bits, IndexedIterable idList, PaletteResizeListener listener, List list) { + return new IdListPalette<>(idList); + } + + @Override + public int index(T object) { + int i = this.idList.getRawId(object); + return i == -1 ? 0 : i; + } + + @Override + public boolean hasAny(Predicate predicate) { + return true; + } + + @Override + public T get(int id) { + T object = this.idList.get(id); + if (object == null) { + throw new RuntimeException("Missing Palette entry for index " + id + "."); + } else { + return object; + } + } + + @Override + public int getSize() { + return this.idList.size(); + } + + @Override + public Palette copy(PaletteResizeListener resizeListener) { + return this; + } + + @Override + public void remap(Function function) { + throw new UnsupportedOperationException("This palette does not support remap."); + } + + @Override + public boolean canRemap() { + return false; + } + + @Override + public void readPacket(FriendlyByteBuf buf) { + } + + @Override + public void writePacket(FriendlyByteBuf buf) { + } +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/world/chunk/InjectedPalettedContainerHolder.java b/core/src/main/java/net/momirealms/craftengine/core/world/chunk/InjectedPalettedContainerHolder.java new file mode 100644 index 000000000..9ca107310 --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/world/chunk/InjectedPalettedContainerHolder.java @@ -0,0 +1,15 @@ +package net.momirealms.craftengine.core.world.chunk; + +import net.momirealms.craftengine.core.world.CEWorld; +import net.momirealms.craftengine.core.world.SectionPos; + +public interface InjectedPalettedContainerHolder { + + Object target(); + + CESection ceSection(); + + CEWorld ceWorld(); + + SectionPos cePos(); +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/world/chunk/PackedIntegerArray.java b/core/src/main/java/net/momirealms/craftengine/core/world/chunk/PackedIntegerArray.java new file mode 100644 index 000000000..80aabd580 --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/world/chunk/PackedIntegerArray.java @@ -0,0 +1,172 @@ +package net.momirealms.craftengine.core.world.chunk; + +import java.util.function.IntConsumer; + +public class PackedIntegerArray implements PaletteStorage { + private static final int[] INDEX_PARAMETERS = new int[]{-1, -1, 0, Integer.MIN_VALUE, 0, 0, 1431655765, 1431655765, 0, Integer.MIN_VALUE, 0, 1, 858993459, 858993459, 0, 715827882, 715827882, 0, 613566756, 613566756, 0, Integer.MIN_VALUE, 0, 2, 477218588, 477218588, 0, 429496729, 429496729, 0, 390451572, 390451572, 0, 357913941, 357913941, 0, 330382099, 330382099, 0, 306783378, 306783378, 0, 286331153, 286331153, 0, Integer.MIN_VALUE, 0, 3, 252645135, 252645135, 0, 238609294, 238609294, 0, 226050910, 226050910, 0, 214748364, 214748364, 0, 204522252, 204522252, 0, 195225786, 195225786, 0, 186737708, 186737708, 0, 178956970, 178956970, 0, 171798691, 171798691, 0, 165191049, 165191049, 0, 159072862, 159072862, 0, 153391689, 153391689, 0, 148102320, 148102320, 0, 143165576, 143165576, 0, 138547332, 138547332, 0, Integer.MIN_VALUE, 0, 4, 130150524, 130150524, 0, 126322567, 126322567, 0, 122713351, 122713351, 0, 119304647, 119304647, 0, 116080197, 116080197, 0, 113025455, 113025455, 0, 110127366, 110127366, 0, 107374182, 107374182, 0, 104755299, 104755299, 0, 102261126, 102261126, 0, 99882960, 99882960, 0, 97612893, 97612893, 0, 95443717, 95443717, 0, 93368854, 93368854, 0, 91382282, 91382282, 0, 89478485, 89478485, 0, 87652393, 87652393, 0, 85899345, 85899345, 0, 84215045, 84215045, 0, 82595524, 82595524, 0, 81037118, 81037118, 0, 79536431, 79536431, 0, 78090314, 78090314, 0, 76695844, 76695844, 0, 75350303, 75350303, 0, 74051160, 74051160, 0, 72796055, 72796055, 0, 71582788, 71582788, 0, 70409299, 70409299, 0, 69273666, 69273666, 0, 68174084, 68174084, 0, Integer.MIN_VALUE, 0, 5}; + private final long[] data; + private final int elementBits; + private final long maxValue; + private final int size; + private final int elementsPerLong; + private final int indexScale; + private final int indexOffset; + private final int indexShift; + + public PackedIntegerArray(int elementBits, int size, int[] data) { + this(elementBits, size); + int i = 0; + int j; + for (j = 0; j <= size - this.elementsPerLong; j += this.elementsPerLong) { + long l = 0L; + for(int k = this.elementsPerLong - 1; k >= 0; --k) { + l <<= elementBits; + l |= (long)data[j + k] & this.maxValue; + } + this.data[i++] = l; + } + int m = size - j; + if (m > 0) { + long n = 0L; + for (int o = m - 1; o >= 0; --o) { + n <<= elementBits; + n |= (long)data[j + o] & this.maxValue; + } + this.data[i] = n; + } + } + + public PackedIntegerArray(int elementBits, int size) { + this(elementBits, size, (long[]) null); + } + + public PackedIntegerArray(int elementBits, int size, long[] data) { + this.size = size; + this.elementBits = elementBits; + this.maxValue = (1L << elementBits) - 1L; + this.elementsPerLong = (char)(64 / elementBits); + int i = 3 * (this.elementsPerLong - 1); + this.indexScale = INDEX_PARAMETERS[i + 0]; + this.indexOffset = INDEX_PARAMETERS[i + 1]; + this.indexShift = INDEX_PARAMETERS[i + 2]; + int j = (size + this.elementsPerLong - 1) / this.elementsPerLong; + if (data != null) { + if (data.length != j) { + throw new RuntimeException("Invalid length given for storage, got: " + data.length + " but expected: " + j); + } + this.data = data; + } else { + this.data = new long[j]; + } + } + + private int getStorageIndex(int index) { + long l = Integer.toUnsignedLong(this.indexScale); + long m = Integer.toUnsignedLong(this.indexOffset); + return (int)((long)index * l + m >> 32 >> this.indexShift); + } + + @Override + public int swap(int index, int value) { + int i = this.getStorageIndex(index); + long l = this.data[i]; + int j = (index - i * this.elementsPerLong) * this.elementBits; + int k = (int)(l >> j & this.maxValue); + this.data[i] = l & ~(this.maxValue << j) | ((long)value & this.maxValue) << j; + return k; + } + + @Override + public void set(int index, int value) { + int i = this.getStorageIndex(index); + long l = this.data[i]; + int j = (index - i * this.elementsPerLong) * this.elementBits; + this.data[i] = l & ~(this.maxValue << j) | ((long)value & this.maxValue) << j; + } + + @Override + public int get(int index) { + int i = this.getStorageIndex(index); + long l = this.data[i]; + int j = (index - i * this.elementsPerLong) * this.elementBits; + return (int)(l >> j & this.maxValue); + } + + @Override + public long[] getData() { + return this.data; + } + + @Override + public int size() { + return this.size; + } + + @Override + public int getElementBits() { + return this.elementBits; + } + + @Override + public void forEach(IntConsumer action) { + int i = 0; + long[] var3 = this.data; + int var4 = var3.length; + + for (int var5 = 0; var5 < var4; ++var5) { + long l = var3[var5]; + + for(int j = 0; j < this.elementsPerLong; ++j) { + action.accept((int)(l & this.maxValue)); + l >>= this.elementBits; + ++i; + if (i >= this.size) { + return; + } + } + } + + } + + @Override + public void writePaletteIndices(int[] out) { + int i = this.data.length; + int j = 0; + + int k; + long l; + int m; + for(k = 0; k < i - 1; ++k) { + l = this.data[k]; + + for(m = 0; m < this.elementsPerLong; ++m) { + out[j + m] = (int)(l & this.maxValue); + l >>= this.elementBits; + } + + j += this.elementsPerLong; + } + + k = this.size - j; + if (k > 0) { + l = this.data[i - 1]; + + for(m = 0; m < k; ++m) { + out[j + m] = (int)(l & this.maxValue); + l >>= this.elementBits; + } + } + + } + + @Override + public PaletteStorage copy() { + return new PackedIntegerArray(this.elementBits, this.size, this.data.clone()); + } + + public static class InvalidLengthException extends RuntimeException { + InvalidLengthException(String message) { + super(message); + } + } +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/world/chunk/Palette.java b/core/src/main/java/net/momirealms/craftengine/core/world/chunk/Palette.java new file mode 100644 index 000000000..c15620008 --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/world/chunk/Palette.java @@ -0,0 +1,33 @@ +package net.momirealms.craftengine.core.world.chunk; + +import net.momirealms.craftengine.core.util.FriendlyByteBuf; +import net.momirealms.craftengine.core.util.IndexedIterable; + +import java.util.List; +import java.util.function.Function; +import java.util.function.Predicate; + +public interface Palette { + + int index(T object); + + boolean hasAny(Predicate predicate); + + T get(int id); + + int getSize(); + + void readPacket(FriendlyByteBuf buf); + + void writePacket(FriendlyByteBuf buf); + + Palette copy(PaletteResizeListener resizeListener); + + void remap(Function function); + + boolean canRemap(); + + interface Factory { + Palette create(int bits, IndexedIterable idList, PaletteResizeListener listener, List list); + } +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/world/chunk/PaletteResizeListener.java b/core/src/main/java/net/momirealms/craftengine/core/world/chunk/PaletteResizeListener.java new file mode 100644 index 000000000..38b961f1c --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/world/chunk/PaletteResizeListener.java @@ -0,0 +1,6 @@ +package net.momirealms.craftengine.core.world.chunk; + +public interface PaletteResizeListener { + + int onResize(int newBits, T object); +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/world/chunk/PaletteStorage.java b/core/src/main/java/net/momirealms/craftengine/core/world/chunk/PaletteStorage.java new file mode 100644 index 000000000..3ef4e4dba --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/world/chunk/PaletteStorage.java @@ -0,0 +1,24 @@ +package net.momirealms.craftengine.core.world.chunk; + +import java.util.function.IntConsumer; + +public interface PaletteStorage { + + int swap(int index, int value); + + void set(int index, int value); + + int get(int index); + + long[] getData(); + + int size(); + + int getElementBits(); + + void forEach(IntConsumer action); + + void writePaletteIndices(int[] out); + + PaletteStorage copy(); +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/world/chunk/PalettedContainer.java b/core/src/main/java/net/momirealms/craftengine/core/world/chunk/PalettedContainer.java new file mode 100644 index 000000000..bc41daeec --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/world/chunk/PalettedContainer.java @@ -0,0 +1,347 @@ +package net.momirealms.craftengine.core.world.chunk; + +import it.unimi.dsi.fastutil.ints.Int2IntOpenHashMap; +import it.unimi.dsi.fastutil.ints.IntArraySet; +import it.unimi.dsi.fastutil.ints.IntSet; +import net.momirealms.craftengine.core.block.EmptyBlock; +import net.momirealms.craftengine.core.plugin.CraftEngine; +import net.momirealms.craftengine.core.util.FriendlyByteBuf; +import net.momirealms.craftengine.core.util.IndexedIterable; +import net.momirealms.craftengine.core.util.MCUtils; +import org.jetbrains.annotations.Nullable; + +import java.util.Arrays; +import java.util.List; +import java.util.Optional; +import java.util.concurrent.locks.Lock; +import java.util.concurrent.locks.ReentrantLock; +import java.util.function.Consumer; +import java.util.function.IntUnaryOperator; +import java.util.function.Predicate; +import java.util.stream.LongStream; + +public class PalettedContainer implements PaletteResizeListener, ReadableContainer { + private final PaletteResizeListener dummyListener = (newSize, added) -> 0; + private final IndexedIterable idList; + private Data data; + private final PaletteProvider paletteProvider; + private final Lock lock = new ReentrantLock(); + + public void lock() { + this.lock.lock(); + } + + public void unlock() { + this.lock.unlock(); + } + + public PalettedContainer(IndexedIterable idList, PaletteProvider paletteProvider, DataProvider dataProvider, PaletteStorage storage, List paletteEntries) { + this.idList = idList; + this.paletteProvider = paletteProvider; + this.data = new Data<>(dataProvider, storage, dataProvider.factory().create(dataProvider.bits(), idList, this, paletteEntries)); + } + + private PalettedContainer(IndexedIterable idList, PaletteProvider paletteProvider, Data data) { + this.idList = idList; + this.paletteProvider = paletteProvider; + this.data = data; + } + + private PalettedContainer(PalettedContainer container) { + this.idList = container.idList; + this.paletteProvider = container.paletteProvider; + this.data = container.data.copy(this); + } + + public PalettedContainer(IndexedIterable idList, T object, PaletteProvider paletteProvider) { + this.paletteProvider = paletteProvider; + this.idList = idList; + this.data = this.getCompatibleData(null, 0); + this.data.palette.index(object); + } + + public boolean isEmpty() { + Data data = this.data; + if (data.palette instanceof SingularPalette singularPalette) { + return singularPalette.get(0) == EmptyBlock.INSTANCE; + } + return false; + } + + public Data data() { + return data; + } + + public void readPacket(FriendlyByteBuf buf) { + this.lock(); + try { + int i = buf.readByte(); + Data data = this.getCompatibleData(this.data, i); + data.palette.readPacket(buf); + buf.readLongArray(data.storage.getData()); + this.data = data; + } finally { + this.unlock(); + } + } + + @Override + public void writePacket(FriendlyByteBuf buf) { + this.lock(); + try { + this.data.writePacket(buf); + } finally { + this.unlock(); + } + } + + private Data getCompatibleData(@Nullable Data previousData, int bits) { + DataProvider dataProvider = this.paletteProvider.createDataProvider(this.idList, bits); + return previousData != null && dataProvider.equals(previousData.configuration()) ? previousData : dataProvider.createData(this.idList, this, this.paletteProvider.getContainerSize()); + } + + @Override + public int onResize(int i, T object) { + Data oldData = this.data; + Data newData = this.getCompatibleData(oldData, i); + newData.importFrom(oldData.palette, oldData.storage); + this.data = newData; + return newData.palette.index(object); + } + + @Override + public T get(int x, int y, int z) { + return this.get(this.paletteProvider.computeIndex(x, y, z)); + } + + public T get(int index) { + Data data = this.data; + return data.palette.get(data.storage.get(index)); + } + + public void set(int x, int y, int z, T value) { + this.lock(); + try { + this.set(this.paletteProvider.computeIndex(x, y, z), value); + } finally { + this.unlock(); + } + } + + public void set(int index, T value) { + int i = this.data.palette.index(value); + this.data.storage.set(index, i); + } + + public T swapUnsafe(int x, int y, int z, T value) { + return this.swap(this.paletteProvider.computeIndex(x, y, z), value); + } + + public T swap(int x, int y, int z, T value) { + this.lock(); + T previous; + try { + previous = this.swap(this.paletteProvider.computeIndex(x, y, z), value); + } finally { + this.unlock(); + } + return previous; + } + + private T swap(int index, T value) { + int i = this.data.palette.index(value); + int j = this.data.storage.swap(index, i); + return this.data.palette.get(j); + } + + @Override + public void forEachValue(Consumer action) { + Palette palette = this.data.palette(); + IntSet intSet = new IntArraySet(); + this.data.storage.forEach(intSet::add); + intSet.forEach((id) -> action.accept(palette.get(id))); + } + + @Override + public boolean hasAny(Predicate predicate) { + return this.data.palette.hasAny(predicate); + } + + @Override + public void count(Counter counter) { + int paletteSize = this.data.palette.getSize(); + if (paletteSize == 1) { + counter.accept(this.data.palette.get(0), this.data.storage.size()); + } else { + Int2IntOpenHashMap frequencyMap = new Int2IntOpenHashMap(); + this.data.storage.forEach(key -> frequencyMap.addTo(key, 1)); + frequencyMap.int2IntEntrySet().forEach(entry -> + counter.accept(this.data.palette.get(entry.getIntKey()), entry.getIntValue()) + ); + } + } + + @Override + public PalettedContainer copy() { + return new PalettedContainer<>(this); + } + + @Override + public PalettedContainer slice() { + return new PalettedContainer<>(this.idList, this.data.palette.get(0), this.paletteProvider); + } + + @Override + public Serialized serialize(IndexedIterable idList, PaletteProvider paletteProvider) { + this.lock(); + try { + BiMapPalette biMapPalette = new BiMapPalette<>(idList, this.data.storage.getElementBits(), this.dummyListener); + int containerSize = paletteProvider.getContainerSize(); + int[] paletteIndices = new int[containerSize]; + this.data.storage.writePaletteIndices(paletteIndices); + applyEach(paletteIndices, (id) -> biMapPalette.index(this.data.palette.get(id))); + int bitsRequired = paletteProvider.getBits(idList, biMapPalette.getSize()); + Optional packedData = (bitsRequired != 0) + ? Optional.of(Arrays.stream(new PackedIntegerArray(bitsRequired, containerSize, paletteIndices).getData())) + : Optional.empty(); + return new Serialized<>(biMapPalette.getElements(), packedData); + } finally { + this.unlock(); + } + } + + private static void applyEach(int[] values, IntUnaryOperator applier) { + int previousValue = -1; + int transformedValue = -1; + for (int index = 0; index < values.length; ++index) { + int currentValue = values[index]; + if (currentValue != previousValue) { + previousValue = currentValue; + transformedValue = applier.applyAsInt(currentValue); + } + values[index] = transformedValue; + } + } + + public abstract static class PaletteProvider { + public static final Palette.Factory SINGULAR = SingularPalette::create; + public static final Palette.Factory ARRAY = ArrayPalette::create; + public static final Palette.Factory BI_MAP = BiMapPalette::create; + public static final Palette.Factory ID_LIST = IdListPalette::create; + public static final PaletteProvider CUSTOM_BLOCK_STATE = new PaletteProvider(4) { + public DataProvider createDataProvider(IndexedIterable idList, int bits) { + return switch (bits) { + case 0 -> new DataProvider<>(SINGULAR, bits); + case 1, 2, 3, 4 -> new DataProvider<>(ARRAY, 4); + default -> new DataProvider<>(BI_MAP, bits); + }; + } + }; + public static final PaletteProvider BLOCK_STATE = new PaletteProvider(4) { + public DataProvider createDataProvider(IndexedIterable idList, int bits) { + return switch (bits) { + case 0 -> new DataProvider<>(SINGULAR, bits); + case 1, 2, 3, 4 -> new DataProvider<>(ARRAY, 4); + case 5, 6, 7, 8 -> new DataProvider<>(BI_MAP, bits); + default -> new DataProvider<>(PaletteProvider.ID_LIST, MCUtils.ceilLog2(idList.size())); + }; + } + }; + public static final PaletteProvider BIOME = new PaletteProvider(2) { + public DataProvider createDataProvider(IndexedIterable idList, int bits) { + return switch (bits) { + case 0 -> new DataProvider<>(SINGULAR, bits); + case 1, 2, 3 -> new DataProvider<>(ARRAY, bits); + default -> new DataProvider<>(PaletteProvider.ID_LIST, MCUtils.ceilLog2(idList.size())); + }; + } + }; + + private final int edgeBits; + + private PaletteProvider(int edgeBits) { + this.edgeBits = edgeBits; + } + + public int getContainerSize() { + return 1 << this.edgeBits * 3; + } + + public int computeIndex(int x, int y, int z) { + return (y << this.edgeBits | z) << this.edgeBits | x; + } + + public abstract DataProvider createDataProvider(IndexedIterable idList, int bits); + + int getBits(IndexedIterable idList, int size) { + int i = MCUtils.ceilLog2(size); + DataProvider dataProvider = this.createDataProvider(idList, i); + return dataProvider.factory() == ID_LIST ? i : dataProvider.bits(); + } + } + + public record DataProvider(Palette.Factory factory, int bits) { + public Data createData(IndexedIterable idList, PaletteResizeListener listener, int size) { + PaletteStorage paletteStorage = this.bits == 0 ? new EmptyPaletteStorage(size) : new PackedIntegerArray(this.bits, size); + Palette palette = this.factory.create(this.bits, idList, listener, List.of()); + return new Data<>(this, paletteStorage, palette); + } + } + + public record Data(DataProvider configuration, PaletteStorage storage, Palette palette) { + public void importFrom(Palette palette, PaletteStorage storage) { + for (int i = 0; i < storage.size(); ++i) { + T object = palette.get(storage.get(i)); + this.storage.set(i, this.palette.index(object)); + } + } + + public Data copy(PaletteResizeListener resizeListener) { + return new Data<>(this.configuration, this.storage.copy(), this.palette.copy(resizeListener)); + } + + public void writePacket(FriendlyByteBuf buf) { + buf.writeByte(this.storage.getElementBits()); + this.palette.writePacket(buf); + buf.writeLongArray(this.storage.getData()); + } + } + + @FunctionalInterface + public interface Counter { + void accept(T object, int count); + } + + public static PalettedContainer read(IndexedIterable idList, PaletteProvider paletteProvider, ReadableContainer.Serialized serialized) { + List list = serialized.paletteEntries(); + int containerSize = paletteProvider.getContainerSize(); + int bits = paletteProvider.getBits(idList, list.size()); + DataProvider dataProvider = paletteProvider.createDataProvider(idList, bits); + PaletteStorage paletteStorage; + if (bits == 0) { + paletteStorage = new EmptyPaletteStorage(containerSize); + } else { + Optional optional = serialized.storage(); + if (optional.isEmpty()) { + return null; + } + long[] ls = optional.get().toArray(); + try { + if (dataProvider.factory() == PalettedContainer.PaletteProvider.ID_LIST) { + Palette palette = new BiMapPalette<>(idList, bits, (id, value) -> 0, list); + PackedIntegerArray packedIntegerArray = new PackedIntegerArray(bits, containerSize, ls); + int[] is = new int[containerSize]; + packedIntegerArray.writePaletteIndices(is); + applyEach(is, (id) -> idList.getRawId(palette.get(id))); + paletteStorage = new PackedIntegerArray(dataProvider.bits(), containerSize, is); + } else { + paletteStorage = new PackedIntegerArray(dataProvider.bits(), containerSize, ls); + } + } catch (PackedIntegerArray.InvalidLengthException e) { + CraftEngine.instance().logger().warn("Failed to read PalettedContainer", e); + return null; + } + } + return new PalettedContainer<>(idList, paletteProvider, dataProvider, paletteStorage, list); + } +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/world/chunk/ReadableContainer.java b/core/src/main/java/net/momirealms/craftengine/core/world/chunk/ReadableContainer.java new file mode 100644 index 000000000..cc5363987 --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/world/chunk/ReadableContainer.java @@ -0,0 +1,31 @@ +package net.momirealms.craftengine.core.world.chunk; + +import net.momirealms.craftengine.core.util.FriendlyByteBuf; +import net.momirealms.craftengine.core.util.IndexedIterable; + +import java.util.List; +import java.util.Optional; +import java.util.function.Consumer; +import java.util.function.Predicate; +import java.util.stream.LongStream; + +public interface ReadableContainer { + + T get(int x, int y, int z); + + void forEachValue(Consumer action); + + boolean hasAny(Predicate predicate); + + void count(PalettedContainer.Counter counter); + + void writePacket(FriendlyByteBuf buf); + + PalettedContainer copy(); + + PalettedContainer slice(); + + Serialized serialize(IndexedIterable idList, PalettedContainer.PaletteProvider paletteProvider); + + record Serialized(List paletteEntries, Optional storage) {} +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/world/chunk/SectionDataContainer.java b/core/src/main/java/net/momirealms/craftengine/core/world/chunk/SectionDataContainer.java new file mode 100644 index 000000000..1d72f980e --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/world/chunk/SectionDataContainer.java @@ -0,0 +1,29 @@ +package net.momirealms.craftengine.core.world.chunk; + +import net.momirealms.craftengine.core.block.ImmutableBlockState; +import org.jetbrains.annotations.Nullable; + +public class SectionDataContainer { + + private final ImmutableBlockState[] states; + + public SectionDataContainer() { + this.states = new ImmutableBlockState[4096]; + } + + public SectionDataContainer(ImmutableBlockState[] states) { + this.states = states; + } + + public @Nullable ImmutableBlockState get(int index) { + return states[index]; + } + + public void set(int index, ImmutableBlockState value) { + states[index] = value; + } + + public ImmutableBlockState[] states() { + return states; + } +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/world/chunk/SingularPalette.java b/core/src/main/java/net/momirealms/craftengine/core/world/chunk/SingularPalette.java new file mode 100644 index 000000000..4930529c9 --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/world/chunk/SingularPalette.java @@ -0,0 +1,94 @@ +package net.momirealms.craftengine.core.world.chunk; + +import net.momirealms.craftengine.core.util.FriendlyByteBuf; +import net.momirealms.craftengine.core.util.IndexedIterable; +import org.jetbrains.annotations.Nullable; + +import java.util.List; +import java.util.function.Function; +import java.util.function.Predicate; + +public class SingularPalette implements Palette { + private final IndexedIterable idList; + @Nullable + private T entry; + private final PaletteResizeListener listener; + + public SingularPalette(IndexedIterable idList, PaletteResizeListener listener, List entries) { + this.idList = idList; + this.listener = listener; + if (!entries.isEmpty()) { + this.entry = entries.get(0); + } + } + + public static Palette create(int bitSize, IndexedIterable idList, PaletteResizeListener listener, List entries) { + return new SingularPalette<>(idList, listener, entries); + } + + @Override + public int index(T object) { + if (this.entry != null && this.entry != object) { + return this.listener.onResize(1, object); + } else { + this.entry = object; + return 0; + } + } + + @Override + public boolean hasAny(Predicate predicate) { + if (this.entry == null) { + throw new IllegalStateException("Use of an uninitialized palette"); + } else { + return predicate.test(this.entry); + } + } + + @Override + public T get(int id) { + if (this.entry != null && id == 0) { + return this.entry; + } else { + throw new IllegalStateException("Missing Palette entry for id " + id + "."); + } + } + + @Override + public int getSize() { + return 1; + } + + @Override + public Palette copy(PaletteResizeListener resizeListener) { + if (this.entry == null) { + throw new IllegalStateException("Use of an uninitialized palette"); + } else { + return this; + } + } + + @Override + public void remap(Function function) { + this.entry = function.apply(this.entry); + } + + @Override + public boolean canRemap() { + return true; + } + + @Override + public void readPacket(FriendlyByteBuf buf) { + this.entry = this.idList.getOrThrow(buf.readVarInt()); + } + + @Override + public void writePacket(FriendlyByteBuf buf) { + if (this.entry == null) { + throw new IllegalStateException("Use of an uninitialized palette"); + } else { + buf.writeVarInt(this.idList.getRawId(this.entry)); + } + } +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/world/chunk/packet/MCSection.java b/core/src/main/java/net/momirealms/craftengine/core/world/chunk/packet/MCSection.java new file mode 100644 index 000000000..8c9f37387 --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/world/chunk/packet/MCSection.java @@ -0,0 +1,43 @@ +package net.momirealms.craftengine.core.world.chunk.packet; + +import net.momirealms.craftengine.core.util.FriendlyByteBuf; +import net.momirealms.craftengine.core.util.IndexedIterable; +import net.momirealms.craftengine.core.world.chunk.PalettedContainer; +import net.momirealms.craftengine.core.world.chunk.ReadableContainer; + +public class MCSection { + private short nonEmptyBlockCount; + private final PalettedContainer blockStateContainer; + private ReadableContainer biomeContainer; + + public MCSection(IndexedIterable blockStateList, IndexedIterable biomeList) { + this.blockStateContainer = new PalettedContainer<>(blockStateList, 0, PalettedContainer.PaletteProvider.BLOCK_STATE); + this.biomeContainer = new PalettedContainer<>(biomeList, 0, PalettedContainer.PaletteProvider.BIOME); + } + + public void readPacket(FriendlyByteBuf buf) { + this.nonEmptyBlockCount = buf.readShort(); + this.blockStateContainer.readPacket(buf); + PalettedContainer palettedContainer = this.biomeContainer.slice(); + palettedContainer.readPacket(buf); + this.biomeContainer = palettedContainer; + } + + public void writePacket(FriendlyByteBuf buf) { + buf.writeShort(this.nonEmptyBlockCount); + this.blockStateContainer.writePacket(buf); + this.biomeContainer.writePacket(buf); + } + + public void setBlockState(int x, int y, int z, int state) { + this.blockStateContainer.set(x, y, z, state); + } + + public int getBlockState(int x, int y, int z) { + return this.blockStateContainer.get(x, y, z); + } + + public PalettedContainer blockStateContainer() { + return blockStateContainer; + } +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/world/chunk/serialization/ChunkSerializer.java b/core/src/main/java/net/momirealms/craftengine/core/world/chunk/serialization/ChunkSerializer.java new file mode 100644 index 000000000..878c2ccaf --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/world/chunk/serialization/ChunkSerializer.java @@ -0,0 +1,52 @@ +package net.momirealms.craftengine.core.world.chunk.serialization; + +import net.momirealms.craftengine.core.world.CEWorld; +import net.momirealms.craftengine.core.world.ChunkPos; +import net.momirealms.craftengine.core.world.chunk.CEChunk; +import net.momirealms.craftengine.core.world.chunk.CESection; +import net.momirealms.sparrow.nbt.CompoundTag; +import net.momirealms.sparrow.nbt.ListTag; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +import java.util.List; + +public class ChunkSerializer { + + @Nullable + public static CompoundTag serialize(@NotNull CEChunk chunk) { + ListTag sections = new ListTag(); + CESection[] ceSections = chunk.sections(); + for (CESection ceSection : ceSections) { + if (ceSection != null) { + CompoundTag sectionNbt = SectionSerializer.serialize(ceSection); + if (sectionNbt != null) { + sections.add(sectionNbt); + } + } + } + if (sections.isEmpty()) return null; + CompoundTag chunkNbt = new CompoundTag(); + chunkNbt.put("sections", sections); + chunkNbt.put("entities", new ListTag()); + return chunkNbt; + } + + @NotNull + public static CEChunk deserialize(@NotNull CEWorld world, @NotNull ChunkPos pos, @NotNull CompoundTag chunkNbt) { + ListTag sections = chunkNbt.getList("sections"); + CESection[] sectionArray = new CESection[world.worldHeight().getSectionsCount()]; + for (int i = 0, size = sections.size(); i < size; ++i) { + CompoundTag sectionTag = sections.getCompound(i); + CESection ceSection = SectionSerializer.deserialize(sectionTag); + if (ceSection != null) { + int sectionIndex = world.worldHeight().getSectionIndexFromSectionY(ceSection.sectionY()); + if (sectionIndex >= 0 && sectionIndex < sectionArray.length) { + sectionArray[sectionIndex] = ceSection; + } + } + } + ListTag entities = chunkNbt.getList("entities"); + return new CEChunk(world, pos, sectionArray, List.of()); + } +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/world/chunk/serialization/SectionSerializer.java b/core/src/main/java/net/momirealms/craftengine/core/world/chunk/serialization/SectionSerializer.java new file mode 100644 index 000000000..fbd332f32 --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/world/chunk/serialization/SectionSerializer.java @@ -0,0 +1,78 @@ +package net.momirealms.craftengine.core.world.chunk.serialization; + +import net.momirealms.craftengine.core.block.CustomBlock; +import net.momirealms.craftengine.core.block.EmptyBlock; +import net.momirealms.craftengine.core.block.ImmutableBlockState; +import net.momirealms.craftengine.core.block.InactiveCustomBlock; +import net.momirealms.craftengine.core.registry.BuiltInRegistries; +import net.momirealms.craftengine.core.registry.Holder; +import net.momirealms.craftengine.core.registry.WritableRegistry; +import net.momirealms.craftengine.core.util.Key; +import net.momirealms.craftengine.core.util.ResourceKey; +import net.momirealms.craftengine.core.world.chunk.CESection; +import net.momirealms.craftengine.core.world.chunk.PalettedContainer; +import net.momirealms.craftengine.core.world.chunk.ReadableContainer; +import net.momirealms.sparrow.nbt.CompoundTag; +import net.momirealms.sparrow.nbt.ListTag; +import net.momirealms.sparrow.nbt.LongArrayTag; +import net.momirealms.sparrow.nbt.Tag; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +import java.util.ArrayList; +import java.util.List; +import java.util.Optional; +import java.util.stream.LongStream; + +public class SectionSerializer { + + @Nullable + public static CompoundTag serialize(@NotNull CESection section) { + ReadableContainer.Serialized serialized = section.statesContainer().serialize(null, PalettedContainer.PaletteProvider.CUSTOM_BLOCK_STATE); + ListTag palettes = new ListTag(); + List states = serialized.paletteEntries(); + if (states.size() == 1 && states.get(0) == EmptyBlock.INSTANCE.getDefaultState()) { + return null; + } + CompoundTag sectionNbt = new CompoundTag(); + sectionNbt.putByte("y", (byte) section.sectionY()); + CompoundTag blockStates = new CompoundTag(); + sectionNbt.put("block_states", blockStates); + for (ImmutableBlockState state : states) { + palettes.add(state.getNbtToSave()); + } + blockStates.put("palette", palettes); + serialized.storage().ifPresent(data -> blockStates.put("data", new LongArrayTag(data.toArray()))); + return sectionNbt; + } + + @Nullable + public static CESection deserialize(@NotNull CompoundTag sectionNbt) { + CompoundTag blockStates = sectionNbt.getCompound("block_states"); + if (blockStates == null) { + return null; + } + ListTag palettes = blockStates.getList("palette"); + List paletteEntries = new ArrayList<>(palettes.size()); + for (Tag tag : palettes) { + CompoundTag palette = (CompoundTag) tag; + String id = palette.getString("id"); + CompoundTag data = palette.getCompound("properties"); + Key key = Key.of(id); + Holder owner = BuiltInRegistries.BLOCK.get(key).orElseGet(() -> { + Holder.Reference holder = ((WritableRegistry) BuiltInRegistries.BLOCK).registerForHolder( + new ResourceKey<>(BuiltInRegistries.BLOCK.key().location(), key)); + InactiveCustomBlock inactiveBlock = new InactiveCustomBlock(key, holder); + holder.bindValue(inactiveBlock); + return holder; + }); + ImmutableBlockState state = owner.value().getBlockState(data); + paletteEntries.add(state); + } + long[] data = blockStates.getLongArray("data"); + ReadableContainer.Serialized serialized = new ReadableContainer.Serialized<>(paletteEntries, + data == null ? Optional.empty() : Optional.of(LongStream.of(data))); + PalettedContainer palettedContainer = PalettedContainer.read(null, PalettedContainer.PaletteProvider.CUSTOM_BLOCK_STATE, serialized); + return new CESection(sectionNbt.getByte("y"), palettedContainer); + } +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/world/chunk/storage/CompressionMethod.java b/core/src/main/java/net/momirealms/craftengine/core/world/chunk/storage/CompressionMethod.java new file mode 100644 index 000000000..2715f6172 --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/world/chunk/storage/CompressionMethod.java @@ -0,0 +1,65 @@ +package net.momirealms.craftengine.core.world.chunk.storage; + +import it.unimi.dsi.fastutil.io.FastBufferedInputStream; + +import javax.annotation.Nullable; +import java.io.BufferedOutputStream; +import java.io.IOException; +import java.io.InputStream; +import java.io.OutputStream; +import java.util.zip.DeflaterOutputStream; +import java.util.zip.GZIPInputStream; +import java.util.zip.GZIPOutputStream; +import java.util.zip.InflaterInputStream; + +public class CompressionMethod { + private static final int METHOD_COUNT = 3; + public static final CompressionMethod[] METHODS = new CompressionMethod[METHOD_COUNT +1]; + public static final CompressionMethod NONE = register(new CompressionMethod(1, (stream) -> stream, (stream) -> stream)); + public static final CompressionMethod DEFLATE = register(new CompressionMethod(2, (stream) -> new FastBufferedInputStream(new InflaterInputStream(stream)), (stream) -> new BufferedOutputStream(new DeflaterOutputStream(stream)))); + public static final CompressionMethod GZIP = register(new CompressionMethod(3, (stream) -> new FastBufferedInputStream(new GZIPInputStream(stream)), (stream) -> new BufferedOutputStream(new GZIPOutputStream(stream)))); +// public static final CompressionMethod LZ4 = register(new CompressionMethod(4, LZ4BlockInputStream::new, LZ4BlockOutputStream::new)); + + private final int id; + private final StreamWrapper inputWrapper; + private final StreamWrapper outputWrapper; + + private CompressionMethod(int id, StreamWrapper inputStreamWrapper, StreamWrapper outputStreamWrapper) { + this.id = id; + this.inputWrapper = inputStreamWrapper; + this.outputWrapper = outputStreamWrapper; + } + + private static CompressionMethod register(CompressionMethod version) { + METHODS[version.id] = version; + return version; + } + + @Nullable + public static CompressionMethod fromId(int id) { + if (!isValid(id)) return null; + return METHODS[id]; + } + + @SuppressWarnings("BooleanMethodIsAlwaysInverted") + public static boolean isValid(int id) { + return id > 0 && id <= METHOD_COUNT; + } + + public int getId() { + return this.id; + } + + public OutputStream wrap(OutputStream outputStream) throws IOException { + return this.outputWrapper.wrap(outputStream); + } + + public InputStream wrap(InputStream inputStream) throws IOException { + return this.inputWrapper.wrap(inputStream); + } + + @FunctionalInterface + interface StreamWrapper { + O wrap(O object) throws IOException; + } +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/world/chunk/storage/DefaultRegionFileStorage.java b/core/src/main/java/net/momirealms/craftengine/core/world/chunk/storage/DefaultRegionFileStorage.java new file mode 100644 index 000000000..bf78eb1dd --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/world/chunk/storage/DefaultRegionFileStorage.java @@ -0,0 +1,192 @@ +package net.momirealms.craftengine.core.world.chunk.storage; + +import it.unimi.dsi.fastutil.longs.Long2ObjectLinkedOpenHashMap; +import it.unimi.dsi.fastutil.longs.LongLinkedOpenHashSet; +import net.momirealms.craftengine.core.util.ExceptionCollector; +import net.momirealms.craftengine.core.util.FileUtils; +import net.momirealms.craftengine.core.world.ChunkPos; +import net.momirealms.sparrow.nbt.CompoundTag; +import net.momirealms.sparrow.nbt.NBT; +import org.jetbrains.annotations.Nullable; + +import java.io.DataInputStream; +import java.io.DataOutputStream; +import java.io.IOException; +import java.nio.file.Files; +import java.nio.file.Path; + +public class DefaultRegionFileStorage implements WorldDataStorage { + + private final Path folder; + + public static final String REGION_FILE_SUFFIX = ".mca"; + public static final String REGION_FILE_PREFIX = "r."; + + public final Long2ObjectLinkedOpenHashMap regionCache = new Long2ObjectLinkedOpenHashMap<>(); + private final LongLinkedOpenHashSet nonExistingRegionFiles = new LongLinkedOpenHashSet(); + static final int MAX_NON_EXISTING_CACHE = 1024 * 64; + + public DefaultRegionFileStorage(Path directory) { + this.folder = directory; + } + + @SuppressWarnings("BooleanMethodIsAlwaysInverted") + private synchronized boolean doesRegionFilePossiblyExist(long position) { + if (this.nonExistingRegionFiles.contains(position)) { + this.nonExistingRegionFiles.addAndMoveToFirst(position); + return false; + } + return true; + } + + private synchronized void createRegionFile(long position) { + this.nonExistingRegionFiles.remove(position); + } + + private synchronized void markNonExisting(long position) { + if (this.nonExistingRegionFiles.addAndMoveToFirst(position)) { + while (this.nonExistingRegionFiles.size() >= MAX_NON_EXISTING_CACHE) { + this.nonExistingRegionFiles.removeLastLong(); + } + } + } + + public synchronized boolean doesRegionFileNotExistNoIO(ChunkPos pos) { + long key = ChunkPos.asLong(pos.regionX(), pos.regionZ()); + return !this.doesRegionFilePossiblyExist(key); + } + + public synchronized RegionFile getRegionFileIfLoaded(ChunkPos pos) { + return this.regionCache.getAndMoveToFirst(ChunkPos.asLong(pos.regionX(), pos.regionZ())); + } + + public synchronized boolean chunkExists(ChunkPos pos) throws IOException { + RegionFile regionfile = getRegionFile(pos, true, false); + return regionfile != null && regionfile.hasChunk(pos); + } + + public synchronized RegionFile getRegionFile(ChunkPos pos, boolean existingOnly, boolean lock) throws IOException { + long chunkPosLongKey = ChunkPos.asLong(pos.regionX(), pos.regionZ()); + RegionFile regionfile = this.regionCache.getAndMoveToFirst(chunkPosLongKey); + if (regionfile != null) { + if (lock) { + regionfile.fileLock.lock(); + } + return regionfile; + } else { + if (existingOnly && !this.doesRegionFilePossiblyExist(chunkPosLongKey)) { + return null; + } + if (this.regionCache.size() >= 256) { + this.regionCache.removeLast().close(); + } + Path path = this.folder.resolve(REGION_FILE_PREFIX + pos.regionX() + "." + pos.regionZ() + REGION_FILE_SUFFIX); + if (existingOnly && !Files.exists(path)) { + this.markNonExisting(chunkPosLongKey); + return null; + } else { + this.createRegionFile(chunkPosLongKey); + } + FileUtils.createDirectoriesSafe(this.folder); + RegionFile newRegionFile = new RegionFile(path, this.folder); + + this.regionCache.putAndMoveToFirst(chunkPosLongKey, newRegionFile); + if (lock) { + newRegionFile.fileLock.lock(); + } + return newRegionFile; + } + } + + public static ChunkPos getRegionFileCoordinates(Path file) { + String fileName = file.getFileName().toString(); + if (!fileName.startsWith(REGION_FILE_PREFIX) || !fileName.endsWith(REGION_FILE_SUFFIX)) { + return null; + } + String[] split = fileName.split("\\."); + if (split.length != 4) { + return null; + } + try { + int x = Integer.parseInt(split[1]); + int z = Integer.parseInt(split[2]); + return new ChunkPos(x << 5, z << 5); + } catch (NumberFormatException ex) { + return null; + } + } + + @Override + @Nullable + public CompoundTag readChunkTagAt(ChunkPos pos) throws IOException { + RegionFile regionFile = this.getRegionFile(pos, false, true); + try { + DataInputStream dataInputStream = regionFile.getChunkDataInputStream(pos); + CompoundTag tag; + try { + if (dataInputStream == null) { + return null; + } + tag = NBT.readCompound(dataInputStream); + } catch (Throwable t1) { + try { + dataInputStream.close(); + } catch (Throwable t2) { + t1.addSuppressed(t2); + } + throw t1; + } + dataInputStream.close(); + return tag; + } finally { + regionFile.fileLock.unlock(); + } + } + + @Override + public void writeChunkTagAt(ChunkPos pos, @Nullable CompoundTag nbt) throws IOException { + RegionFile regionFile = this.getRegionFile(pos, nbt == null, true); + try { + if (nbt == null) { + regionFile.clear(pos); + } else { + DataOutputStream dataOutputStream = regionFile.getChunkDataOutputStream(pos); + try { + NBT.writeCompound(nbt, dataOutputStream); + } catch (Throwable t1) { + if (dataOutputStream != null) { + try { + dataOutputStream.close(); + } catch (Throwable t2) { + t1.addSuppressed(t2); + } + } + throw t1; + } + dataOutputStream.close(); + } + } finally { + regionFile.fileLock.unlock(); + } + } + + @Override + public synchronized void flush() throws IOException { + for (RegionFile regionFile : this.regionCache.values()) { + regionFile.flush(); + } + } + + @Override + public synchronized void close() throws IOException { + ExceptionCollector collector = new ExceptionCollector<>(); + for (RegionFile regionfile : this.regionCache.values()) { + try { + regionfile.close(); + } catch (IOException ioexception) { + collector.add(ioexception); + } + } + collector.throwIfPresent(); + } +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/world/chunk/storage/RegionBitmap.java b/core/src/main/java/net/momirealms/craftengine/core/world/chunk/storage/RegionBitmap.java new file mode 100644 index 000000000..063c7df50 --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/world/chunk/storage/RegionBitmap.java @@ -0,0 +1,96 @@ +package net.momirealms.craftengine.core.world.chunk.storage; + +import it.unimi.dsi.fastutil.ints.IntArraySet; +import it.unimi.dsi.fastutil.ints.IntCollection; +import it.unimi.dsi.fastutil.ints.IntSet; + +import java.util.BitSet; + +/** + * A class that manages a bitmap for tracking used and free regions of memory or storage. + * This class provides methods to allocate, free, and query regions in the bitmap. + */ +public class RegionBitmap { + private final BitSet used = new BitSet(); + + /** + * Copies the state of another RegionBitmap into this one. + * The bits from the other RegionBitmap are copied into this one. + * @param other The other RegionBitmap to copy from + */ + public void copyFrom(RegionBitmap other) { + BitSet thisBitset = this.used; + BitSet otherBitset = other.used; + for (int i = 0; i < Math.max(thisBitset.size(), otherBitset.size()); ++i) { + thisBitset.set(i, otherBitset.get(i)); + } + } + + /** + * Attempts to allocate a region starting from a given position with a specified length. + * The allocation succeeds if the region is free; otherwise, it returns false. + * @param from The starting position of the allocation + * @param length The length of the region to allocate + * @return true if the allocation was successful, false otherwise + */ + public boolean tryAllocate(int from, int length) { + BitSet bitset = this.used; + // Find the next set bit from the specified position + int firstSet = bitset.nextSetBit(from); + // If there is an overlap with an already allocated region, return false + if (firstSet > 0 && firstSet < (from + length)) { + return false; + } + // Mark the region as used + bitset.set(from, from + length); + return true; + } + + /** + * Forces a region to be marked as used starting from a specified position and with a given size. + * @param start The starting position of the forced allocation + * @param size The size of the region to force allocate + */ + public void allocate(int start, int size) { + this.used.set(start, start + size); + } + + /** + * Frees a region by clearing the bits corresponding to the given range. + * @param start The starting position of the region to free + * @param size The size of the region to free + */ + public void free(int start, int size) { + this.used.clear(start, start + size); + } + + /** + * Allocates a region of the specified size by finding the next available free region + * and marking it as used. + * @param size The size of the region to allocate + * @return The starting position of the allocated region + */ + public int allocate(int size) { + int i = 0; + while(true) { + // Find the next free region after the current position + int start = this.used.nextClearBit(i); + // Find the next set bit after the free region + int end = this.used.nextSetBit(start); + // If there's enough space, allocate and return the starting position + if (end == -1 || end - start >= size) { + this.allocate(start, size); + return start; + } + i = end; + } + } + + /** + * Returns a set of integers representing the used regions in the bitmap. + * @return An IntSet containing the positions of used bits + */ + public IntSet getUsed() { + return this.used.stream().collect(IntArraySet::new, IntCollection::add, IntCollection::addAll); + } +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/world/chunk/storage/RegionFile.java b/core/src/main/java/net/momirealms/craftengine/core/world/chunk/storage/RegionFile.java new file mode 100644 index 000000000..fc909f985 --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/world/chunk/storage/RegionFile.java @@ -0,0 +1,445 @@ +package net.momirealms.craftengine.core.world.chunk.storage; + +import net.momirealms.craftengine.core.plugin.CraftEngine; +import net.momirealms.craftengine.core.plugin.logger.PluginLogger; +import net.momirealms.craftengine.core.world.ChunkPos; + +import javax.annotation.Nullable; +import java.io.*; +import java.nio.Buffer; +import java.nio.ByteBuffer; +import java.nio.IntBuffer; +import java.nio.channels.FileChannel; +import java.nio.file.Files; +import java.nio.file.Path; +import java.nio.file.StandardCopyOption; +import java.nio.file.StandardOpenOption; +import java.time.Instant; +import java.util.concurrent.locks.ReentrantLock; + +public class RegionFile implements AutoCloseable { + private static final PluginLogger LOGGER = CraftEngine.instance().logger(); + + public static final int SECTOR_BYTES = 4096; + public static final int CHUNK_HEADER_SIZE = 5; + public static final int EXTERNAL_STREAM_FLAG = 128; + public static final int EXTERNAL_CHUNK_THRESHOLD = 256; + public static final int MAX_CHUNK_SIZE = 500 * 1024 * 1024; + public static final int INFO_NOT_PRESENT = 0; + + public static final String EXTERNAL_FILE_SUFFIX = ".mcc"; + public static final String EXTERNAL_FILE_PREFIX = "c."; + + private static final ByteBuffer PADDING_BUFFER = ByteBuffer.allocateDirect(1); + + private final FileChannel fileChannel; + private final Path directory; + private final CompressionMethod compression; + private final ByteBuffer header; + private final IntBuffer sectorInfo; + private final IntBuffer timestamps; + private final RegionBitmap usedSectors; + public final ReentrantLock fileLock = new ReentrantLock(true); + public final Path regionFile; + + public RegionFile(Path fileChannel, Path directory) throws IOException { + this(fileChannel, directory, CompressionMethod.GZIP); + } + + public RegionFile(Path path, Path directory, CompressionMethod compressionMethod) throws IOException { + this.header = ByteBuffer.allocateDirect(8192); + this.regionFile = path; + this.usedSectors = new RegionBitmap(); + this.compression = compressionMethod; + if (!Files.isDirectory(directory)) { + throw new IllegalArgumentException("Expected directory, got " + directory.toAbsolutePath()); + } + this.directory = directory; + this.sectorInfo = this.header.asIntBuffer(); + this.sectorInfo.limit(1024); + this.header.position(4096); + this.timestamps = this.header.asIntBuffer(); + this.fileChannel = FileChannel.open(path, StandardOpenOption.CREATE, StandardOpenOption.READ, StandardOpenOption.WRITE); + this.usedSectors.allocate(0, 2); + this.header.position(0); + int byteAmount = this.fileChannel.read(this.header, 0L); + if (byteAmount == -1) { + return; + } + if (byteAmount != 8192) { + LOGGER.warn(String.format("Region file %s has truncated header: %s", path, byteAmount)); + } + long regionSize = Files.size(path); + for (int chunkLocation = 0; chunkLocation < 32 * 32; ++chunkLocation) { + int sectorInfo = this.sectorInfo.get(chunkLocation); + if (sectorInfo != 0) { + int offset = unpackSectorOffset(sectorInfo); + int size = unpackSectorSize(sectorInfo); + if (offset < 2) { + LOGGER.warn(String.format("Region file %s has invalid sector at index: %s; sector %s overlaps with header", path, chunkLocation, offset)); + this.sectorInfo.put(chunkLocation, 0); + } else if (size == 0) { + LOGGER.warn(String.format("Region file %s has an invalid sector at index: %s; size has to be > 0", path, chunkLocation)); + this.sectorInfo.put(chunkLocation, 0); + } else if ((long) offset * 4096L > regionSize) { + LOGGER.warn(String.format("Region file %s has an invalid sector at index: %s; sector %s is out of bounds", path, chunkLocation, offset)); + this.sectorInfo.put(chunkLocation, 0); + } else { + this.usedSectors.allocate(offset, size); + } + } + } + } + + /** + * Retrieves the data input stream for a given chunk. The method reads and processes the + * chunk's header, checks for potential errors, and returns a valid input stream for the chunk data. + * + * @param pos The position of the chunk within the region file. + * @return A DataInputStream for the chunk's data if it exists and is valid, or null if there is an error. + * @throws IOException If an I/O error occurs while reading from the file. + */ + @Nullable + public synchronized DataInputStream getChunkDataInputStream(ChunkPos pos) throws IOException { + int sectorInfo = this.getSectorInfo(pos); + // If no sector information is found (sectorInfo == 0), return null (indicating chunk doesn't exist). + if (sectorInfo == INFO_NOT_PRESENT) { + return null; + } + + int sectorOffset = RegionFile.unpackSectorOffset(sectorInfo); + int sectorSize = RegionFile.unpackSectorSize(sectorInfo); + + // Calculate the total size of the chunk data in bytes (sectorSize * 4096 bytes per sector). + int totalSize = sectorSize * SECTOR_BYTES; + ByteBuffer bytebuffer = ByteBuffer.allocate(totalSize); + this.fileChannel.read(bytebuffer, (long) sectorOffset * SECTOR_BYTES); + ((Buffer) bytebuffer).flip(); + + // If the buffer has less than 5 bytes, the chunk's header is corrupted (or truncated). + if (bytebuffer.remaining() < 5) { + LOGGER.severe(String.format("Chunk %s header is truncated: expected %s but read %s", pos, totalSize, bytebuffer.remaining())); + return null; + } + + // Read the chunk's stub information + int size = bytebuffer.getInt(); + byte type = bytebuffer.get(); + if (size == 0) { + LOGGER.warn(String.format("Chunk %s is allocated, but stream is missing", pos)); + return null; + } + + // Calculate the actual data size + int actualSize = size - 1; + if (RegionFile.isExternalStreamChunk(type)) { + // If the chunk has both internal and external streams, log a warning. + if (actualSize != 0) { + LOGGER.warn("Chunk has both internal and external streams"); + } + // Create and return an input stream for the external chunk. + return this.createExternalChunkInputStream(pos, RegionFile.getExternalChunkVersion(type)); + } else if (actualSize > bytebuffer.remaining()) { + // If the declared size of the chunk is greater than the remaining bytes in the buffer, the stream is truncated. + LOGGER.severe(String.format("Chunk %s stream is truncated: expected %s but read %s", pos, actualSize, bytebuffer.remaining())); + return null; + } else if (actualSize < 0) { + // If the declared chunk size is negative, log an error. + LOGGER.severe(String.format("Declared size %s of chunk %s is negative", size, pos)); + return null; + } else { + // Otherwise, create and return a standard input stream for the chunk data. + return this.createChunkInputStream(pos, type, RegionFile.createInputStream(bytebuffer, actualSize)); + } + } + + private static int getTimestamp() { + return (int) (Instant.now().toEpochMilli() / 1000L); + } + + private static boolean isExternalStreamChunk(byte flags) { + return (flags & EXTERNAL_STREAM_FLAG) != 0; + } + + private static byte getExternalChunkVersion(byte flags) { + return (byte) (flags & -129); + } + + @Nullable + private DataInputStream createChunkInputStream(ChunkPos pos, byte flags, InputStream stream) throws IOException { + CompressionMethod compressionMethod = CompressionMethod.fromId(flags); + if (compressionMethod == null) { + LOGGER.severe(String.format("Chunk %s has invalid chunk stream version %s", pos, flags)); + return null; + } else { + return new DataInputStream(compressionMethod.wrap(stream)); + } + } + + @Nullable + private DataInputStream createExternalChunkInputStream(ChunkPos pos, byte flags) throws IOException { + Path path = this.getExternalChunkPath(pos); + if (!Files.isRegularFile(path)) { + LOGGER.severe(String.format("External chunk path %s is not file", path)); + return null; + } else { + return this.createChunkInputStream(pos, flags, Files.newInputStream(path)); + } + } + + private static ByteArrayInputStream createInputStream(ByteBuffer buffer, int length) { + return new ByteArrayInputStream(buffer.array(), buffer.position(), length); + } + + private int packSectorOffset(int offset, int size) { + return offset << 8 | size; + } + + private static int unpackSectorSize(int sectorData) { + return sectorData & 0xFF; + } + + private static int unpackSectorOffset(int sectorData) { + return (sectorData >> 8) & 0xFFFFFF; + } + + private static int sizeToSectors(int byteCount) { + return (byteCount + SECTOR_BYTES - 1) / SECTOR_BYTES; + } + + /** + * Checks whether a chunk exists at the specified position. + * The method verifies if the chunk's data is valid and can be accessed. + * + * @param pos The position of the chunk within the region file. + * @return True if the chunk exists and is valid, false otherwise. + */ + public synchronized boolean doesChunkExist(ChunkPos pos) { + int sectorInfo = this.getSectorInfo(pos); + if (sectorInfo == INFO_NOT_PRESENT) { + return false; + } + int sectorOffset = unpackSectorOffset(sectorInfo); + int sectorSize = unpackSectorSize(sectorInfo); + ByteBuffer bytebuffer = ByteBuffer.allocate(CHUNK_HEADER_SIZE); + try { + this.fileChannel.read(bytebuffer, (long) sectorOffset * SECTOR_BYTES); + ((Buffer) bytebuffer).flip(); + if (bytebuffer.remaining() != CHUNK_HEADER_SIZE) { + return false; + } + int size = bytebuffer.getInt(); + byte type = bytebuffer.get(); + if (isExternalStreamChunk(type)) { + if (!CompressionMethod.isValid(getExternalChunkVersion(type))) + return false; + return Files.isRegularFile(this.getExternalChunkPath(pos)); + } else { + if (!CompressionMethod.isValid(type)) + return false; + if (size == 0) + return false; + int actualSize = size - 1; + return actualSize >= 0 && actualSize <= SECTOR_BYTES * sectorSize; + } + } catch (IOException ioexception) { + return false; + } + } + + public DataOutputStream getChunkDataOutputStream(ChunkPos pos) throws IOException { + return new DataOutputStream(this.compression.wrap(new ChunkBuffer(pos))); + } + + public void flush() throws IOException { + this.fileChannel.force(true); + } + + public void clear(ChunkPos pos) throws IOException { + int chunkLocation = RegionFile.getChunkLocation(pos); + int sectorInfo = this.sectorInfo.get(chunkLocation); + if (sectorInfo != INFO_NOT_PRESENT) { + this.sectorInfo.put(chunkLocation, 0); + this.timestamps.put(chunkLocation, RegionFile.getTimestamp()); + this.writeHeader(); + Files.deleteIfExists(this.getExternalChunkPath(pos)); + this.usedSectors.free(RegionFile.unpackSectorOffset(sectorInfo), RegionFile.unpackSectorSize(sectorInfo)); + } + } + + @SuppressWarnings("ResultOfMethodCallIgnored") + protected synchronized void write(ChunkPos pos, ByteBuffer buf) throws IOException { + // get old offset info + int offsetIndex = RegionFile.getChunkLocation(pos); + int previousSectorInfo = this.sectorInfo.get(offsetIndex); + int previousSectorOffset = RegionFile.unpackSectorOffset(previousSectorInfo); + int previousSectorSize = RegionFile.unpackSectorSize(previousSectorInfo); + // count the sectors to write + int sizeToWrite = buf.remaining(); + int sectorsToWrite = RegionFile.sizeToSectors(sizeToWrite); + int sectorStartPosition; + CommitOp regionFileOperation; + // If the chunk file is too large, store it as an additional file + if (sectorsToWrite >= EXTERNAL_CHUNK_THRESHOLD) { + Path path = this.getExternalChunkPath(pos); + LOGGER.warn(String.format("Saving oversized chunk %s (%s bytes) to external file %s", pos, sizeToWrite, path)); + sectorsToWrite = 1; + sectorStartPosition = this.usedSectors.allocate(sectorsToWrite); + regionFileOperation = this.writeToExternalFileSafely(path, buf); + ByteBuffer externalBuf = this.createExternalHeader(); + this.fileChannel.write(externalBuf, (long) sectorStartPosition * SECTOR_BYTES); + } else { + sectorStartPosition = this.usedSectors.allocate(sectorsToWrite); + // delete external chunk + regionFileOperation = () -> Files.deleteIfExists(this.getExternalChunkPath(pos)); + this.fileChannel.write(buf, (long) sectorStartPosition * SECTOR_BYTES); + } + this.sectorInfo.put(offsetIndex, this.packSectorOffset(sectorStartPosition, sectorsToWrite)); + this.timestamps.put(offsetIndex, RegionFile.getTimestamp()); + this.writeHeader(); + regionFileOperation.run(); + // clear old data + if (previousSectorOffset != 0) { + this.usedSectors.free(previousSectorOffset, previousSectorSize); + } + } + + private ByteBuffer createExternalHeader() { + return this.createExternalHeader(this.compression); + } + + private ByteBuffer createExternalHeader(CompressionMethod compression) { + ByteBuffer bytebuffer = ByteBuffer.allocate(CHUNK_HEADER_SIZE); + bytebuffer.putInt(1); + bytebuffer.put((byte) (compression.getId() | EXTERNAL_STREAM_FLAG)); + ((Buffer) bytebuffer).flip(); + return bytebuffer; + } + + @SuppressWarnings("ResultOfMethodCallIgnored") + private RegionFile.CommitOp writeToExternalFileSafely(Path destination, ByteBuffer buf) throws IOException { + Path tempFile = Files.createTempFile(this.directory, "tmp", null); + FileChannel filechannel = FileChannel.open(tempFile, StandardOpenOption.CREATE, StandardOpenOption.WRITE); + try { + ((Buffer) buf).position(CHUNK_HEADER_SIZE); + filechannel.write(buf); + } catch (Throwable t1) { + if (filechannel != null) { + try { + filechannel.close(); + } catch (Throwable t2) { + t1.addSuppressed(t2); + } + } + throw t1; + } + filechannel.close(); + return () -> Files.move(tempFile, destination, StandardCopyOption.REPLACE_EXISTING); + } + + @SuppressWarnings("ResultOfMethodCallIgnored") + private void writeHeader() throws IOException { + this.header.position(0); + this.fileChannel.write(this.header, 0L); + } + + private int getSectorInfo(ChunkPos pos) { + return this.sectorInfo.get(RegionFile.getChunkLocation(pos)); + } + + public boolean hasChunk(ChunkPos pos) { + return this.getSectorInfo(pos) != INFO_NOT_PRESENT; + } + + private static int getChunkLocation(ChunkPos pos) { + return pos.regionLocalX() + pos.regionLocalZ() * 32; + } + + public void close() throws IOException { + this.fileLock.lock(); + synchronized (this) { + try { + try { + this.padToFullSector(); + } finally { + try { + this.fileChannel.force(true); + } finally { + this.fileChannel.close(); + } + } + } finally { + this.fileLock.unlock(); + } + } + } + + @SuppressWarnings("ResultOfMethodCallIgnored") + private void padToFullSector() throws IOException { + int currentSize = (int) this.fileChannel.size(); + int expectedSize = RegionFile.sizeToSectors(currentSize) * SECTOR_BYTES; + if (currentSize != expectedSize) { + ByteBuffer bytebuffer = RegionFile.PADDING_BUFFER.duplicate(); + ((Buffer) bytebuffer).position(0); + this.fileChannel.write(bytebuffer, expectedSize - 1); + } + } + + private static int getChunkIndex(int x, int z) { + return (x & 31) + (z & 31) * 32; + } + + private Path getExternalChunkPath(ChunkPos chunkPos) { + String s = EXTERNAL_FILE_PREFIX + chunkPos.x + "." + chunkPos.z + EXTERNAL_FILE_SUFFIX; + return this.directory.resolve(s); + } + + private class ChunkBuffer extends ByteArrayOutputStream { + + private final ChunkPos pos; + + public ChunkBuffer(ChunkPos pos) { + super(8096); + super.write(0); + super.write(0); + super.write(0); + super.write(0); + super.write(RegionFile.this.compression.getId()); + this.pos = pos; + } + + @Override + public void write(final int b) { + if (this.count > MAX_CHUNK_SIZE) { + throw new RegionFileSizeException("Region file too large: " + this.count); + } + super.write(b); + } + + @Override + public void write(final byte[] b, final int off, final int len) { + if (this.count + len > MAX_CHUNK_SIZE) { + throw new RegionFileSizeException("Region file too large: " + (this.count + len)); + } + super.write(b, off, len); + } + + public void close() throws IOException { + ByteBuffer bytebuffer = ByteBuffer.wrap(this.buf, 0, this.count); + bytebuffer.putInt(0, this.count - CHUNK_HEADER_SIZE + 1); + RegionFile.this.write(this.pos, bytebuffer); + } + } + + private interface CommitOp { + + void run() throws IOException; + } + + public static final class RegionFileSizeException extends RuntimeException { + + public RegionFileSizeException(String message) { + super(message); + } + } +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/world/chunk/storage/WorldDataStorage.java b/core/src/main/java/net/momirealms/craftengine/core/world/chunk/storage/WorldDataStorage.java new file mode 100644 index 000000000..a9e76effd --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/world/chunk/storage/WorldDataStorage.java @@ -0,0 +1,19 @@ +package net.momirealms.craftengine.core.world.chunk.storage; + +import net.momirealms.craftengine.core.world.ChunkPos; +import net.momirealms.sparrow.nbt.CompoundTag; +import org.jetbrains.annotations.Nullable; + +import java.io.IOException; + +public interface WorldDataStorage { + + @Nullable + CompoundTag readChunkTagAt(ChunkPos pos) throws IOException; + + void writeChunkTagAt(ChunkPos pos, @Nullable CompoundTag nbt) throws IOException; + + void flush() throws IOException; + + void close() throws IOException; +} diff --git a/gradle.properties b/gradle.properties new file mode 100644 index 000000000..924031018 --- /dev/null +++ b/gradle.properties @@ -0,0 +1,59 @@ +# Project settings +# Rule: [major update].[feature update].[bug fix] +project_version=0.0.30 +config_version=12 +lang_version=2 +project_group=net.momirealms +legacy_model_templates_version=1.21.3 +latest_model_templates_version=1.21.4 +latest_minecraft_version=1.21.4 + +# Supported languages +supported_languages=en,zh_cn,zh_tw,es + +# Dependency settings +paper_version=1.21.4 +jetbrains_annotations_version=24.0.0 +slf4j_version=2.0.16 +log4j_version=2.24.1 +gson_version=2.11.0 +asm_version=9.7.1 +asm_commons_version=9.7.1 +jar_relocator_version=1.7 +adventure_bundle_version=4.19.0 +adventure_platform_version=4.3.4 +cloud_core_version=2.0.0 +cloud_services_version=2.0.0 +cloud_brigadier_version=2.0.0-beta.10 +cloud_bukkit_version=2.0.0-beta.10 +cloud_paper_version=2.0.0-beta.10 +cloud_minecraft_extras_version=2.0.0-beta.10 +boosted_yaml_version=1.3.7 +bstats_version=3.0.2 +caffeine_version=3.1.8 +rtag_version=1.5.9 +placeholder_api_version=2.11.6 +vault_version=1.7 +guava_version=33.3.1-jre +lz4_version=1.8.0 +geantyref_version=1.3.16 +zstd_version=1.5.6-9 +commons_io_version=2.17.0 +sparrow_nbt_version=0.3 +sparrow_util_version=0.16 +fastutil_version=8.5.15 +netty_version=4.1.119.Final +joml_version=1.10.8 +datafixerupper_version=1.0.20 +mojang_brigadier_version=1.0.18 +byte_buddy_version=1.15.11 +snake_yaml_version=2.3 +anti_grief_version=0.13 + +# Proxy settings +#systemProp.socks.proxyHost=127.0.0.1 +#systemProp.socks.proxyPort=7890 +#systemProp.http.proxyHost=127.0.0.1 +#systemProp.http.proxyPort=7890 +#systemProp.https.proxyHost=127.0.0.1 +#systemProp.https.proxyPort=7890 \ No newline at end of file diff --git a/gradle/wrapper/gradle-wrapper.jar b/gradle/wrapper/gradle-wrapper.jar new file mode 100644 index 000000000..7454180f2 Binary files /dev/null and b/gradle/wrapper/gradle-wrapper.jar differ diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties new file mode 100644 index 000000000..18362b78b --- /dev/null +++ b/gradle/wrapper/gradle-wrapper.properties @@ -0,0 +1,6 @@ +distributionBase=GRADLE_USER_HOME +distributionPath=wrapper/dists +distributionUrl=https\://services.gradle.org/distributions/gradle-8.12-bin.zip +networkTimeout=10000 +zipStoreBase=GRADLE_USER_HOME +zipStorePath=wrapper/dists diff --git a/gradlew b/gradlew new file mode 100644 index 000000000..1b6c78733 --- /dev/null +++ b/gradlew @@ -0,0 +1,234 @@ +#!/bin/sh + +# +# Copyright © 2015-2021 the original authors. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# https://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# + +############################################################################## +# +# Gradle start up script for POSIX generated by Gradle. +# +# Important for running: +# +# (1) You need a POSIX-compliant shell to run this script. If your /bin/sh is +# noncompliant, but you have some other compliant shell such as ksh or +# bash, then to run this script, type that shell name before the whole +# command line, like: +# +# ksh Gradle +# +# Busybox and similar reduced shells will NOT work, because this script +# requires all of these POSIX shell features: +# * functions; +# * expansions «$var», «${var}», «${var:-default}», «${var+SET}», +# «${var#prefix}», «${var%suffix}», and «$( cmd )»; +# * compound commands having a testable exit status, especially «case»; +# * various built-in commands including «command», «set», and «ulimit». +# +# Important for patching: +# +# (2) This script targets any POSIX shell, so it avoids extensions provided +# by Bash, Ksh, etc; in particular arrays are avoided. +# +# The "traditional" practice of packing multiple parameters into a +# space-separated string is a well documented source of bugs and security +# problems, so this is (mostly) avoided, by progressively accumulating +# options in "$@", and eventually passing that to Java. +# +# Where the inherited environment variables (DEFAULT_JVM_OPTS, JAVA_OPTS, +# and GRADLE_OPTS) rely on word-splitting, this is performed explicitly; +# see the in-line comments for details. +# +# There are tweaks for specific operating systems such as AIX, CygWin, +# Darwin, MinGW, and NonStop. +# +# (3) This script is generated from the Groovy template +# https://github.com/gradle/gradle/blob/master/subprojects/plugins/src/main/resources/org/gradle/api/internal/plugins/unixStartScript.txt +# within the Gradle project. +# +# You can find Gradle at https://github.com/gradle/gradle/. +# +############################################################################## + +# Attempt to set APP_HOME + +# Resolve links: $0 may be a link +app_path=$0 + +# Need this for daisy-chained symlinks. +while + APP_HOME=${app_path%"${app_path##*/}"} # leaves a trailing /; empty if no leading path + [ -h "$app_path" ] +do + ls=$( ls -ld "$app_path" ) + link=${ls#*' -> '} + case $link in #( + /*) app_path=$link ;; #( + *) app_path=$APP_HOME$link ;; + esac +done + +APP_HOME=$( cd "${APP_HOME:-./}" && pwd -P ) || exit + +APP_NAME="Gradle" +APP_BASE_NAME=${0##*/} + +# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"' + +# Use the maximum available, or set MAX_FD != -1 to use that value. +MAX_FD=maximum + +warn () { + echo "$*" +} >&2 + +die () { + echo + echo "$*" + echo + exit 1 +} >&2 + +# OS specific support (must be 'true' or 'false'). +cygwin=false +msys=false +darwin=false +nonstop=false +case "$( uname )" in #( + CYGWIN* ) cygwin=true ;; #( + Darwin* ) darwin=true ;; #( + MSYS* | MINGW* ) msys=true ;; #( + NONSTOP* ) nonstop=true ;; +esac + +CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar + + +# Determine the Java command to use to start the JVM. +if [ -n "$JAVA_HOME" ] ; then + if [ -x "$JAVA_HOME/jre/sh/java" ] ; then + # IBM's JDK on AIX uses strange locations for the executables + JAVACMD=$JAVA_HOME/jre/sh/java + else + JAVACMD=$JAVA_HOME/bin/java + fi + if [ ! -x "$JAVACMD" ] ; then + die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME + +Please set the JAVA_HOME variable in your environment to match the +location of your Java installation." + fi +else + JAVACMD=java + which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. + +Please set the JAVA_HOME variable in your environment to match the +location of your Java installation." +fi + +# Increase the maximum file descriptors if we can. +if ! "$cygwin" && ! "$darwin" && ! "$nonstop" ; then + case $MAX_FD in #( + max*) + MAX_FD=$( ulimit -H -n ) || + warn "Could not query maximum file descriptor limit" + esac + case $MAX_FD in #( + '' | soft) :;; #( + *) + ulimit -n "$MAX_FD" || + warn "Could not set maximum file descriptor limit to $MAX_FD" + esac +fi + +# Collect all arguments for the java command, stacking in reverse order: +# * args from the command line +# * the main class name +# * -classpath +# * -D...appname settings +# * --module-path (only if needed) +# * DEFAULT_JVM_OPTS, JAVA_OPTS, and GRADLE_OPTS environment variables. + +# For Cygwin or MSYS, switch paths to Windows format before running java +if "$cygwin" || "$msys" ; then + APP_HOME=$( cygpath --path --mixed "$APP_HOME" ) + CLASSPATH=$( cygpath --path --mixed "$CLASSPATH" ) + + JAVACMD=$( cygpath --unix "$JAVACMD" ) + + # Now convert the arguments - kludge to limit ourselves to /bin/sh + for arg do + if + case $arg in #( + -*) false ;; # don't mess with options #( + /?*) t=${arg#/} t=/${t%%/*} # looks like a POSIX filepath + [ -e "$t" ] ;; #( + *) false ;; + esac + then + arg=$( cygpath --path --ignore --mixed "$arg" ) + fi + # Roll the args list around exactly as many times as the number of + # args, so each arg winds up back in the position where it started, but + # possibly modified. + # + # NB: a `for` loop captures its iteration list before it begins, so + # changing the positional parameters here affects neither the number of + # iterations, nor the values presented in `arg`. + shift # remove old arg + set -- "$@" "$arg" # push replacement arg + done +fi + +# Collect all arguments for the java command; +# * $DEFAULT_JVM_OPTS, $JAVA_OPTS, and $GRADLE_OPTS can contain fragments of +# shell script including quotes and variable substitutions, so put them in +# double quotes to make sure that they get re-expanded; and +# * put everything else in single quotes, so that it's not re-expanded. + +set -- \ + "-Dorg.gradle.appname=$APP_BASE_NAME" \ + -classpath "$CLASSPATH" \ + org.gradle.wrapper.GradleWrapperMain \ + "$@" + +# Use "xargs" to parse quoted args. +# +# With -n1 it outputs one arg per line, with the quotes and backslashes removed. +# +# In Bash we could simply go: +# +# readarray ARGS < <( xargs -n1 <<<"$var" ) && +# set -- "${ARGS[@]}" "$@" +# +# but POSIX shell has neither arrays nor command substitution, so instead we +# post-process each arg (as a line of input to sed) to backslash-escape any +# character that might be a shell metacharacter, then use eval to reverse +# that process (while maintaining the separation between arguments), and wrap +# the whole thing up as a single "set" statement. +# +# This will of course break if any of these variables contains a newline or +# an unmatched quote. +# + +eval "set -- $( + printf '%s\n' "$DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS" | + xargs -n1 | + sed ' s~[^-[:alnum:]+,./:=@_]~\\&~g; ' | + tr '\n' ' ' + )" '"$@"' + +exec "$JAVACMD" "$@" diff --git a/gradlew.bat b/gradlew.bat new file mode 100644 index 000000000..107acd32c --- /dev/null +++ b/gradlew.bat @@ -0,0 +1,89 @@ +@rem +@rem Copyright 2015 the original author or authors. +@rem +@rem Licensed under the Apache License, Version 2.0 (the "License"); +@rem you may not use this file except in compliance with the License. +@rem You may obtain a copy of the License at +@rem +@rem https://www.apache.org/licenses/LICENSE-2.0 +@rem +@rem Unless required by applicable law or agreed to in writing, software +@rem distributed under the License is distributed on an "AS IS" BASIS, +@rem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +@rem See the License for the specific language governing permissions and +@rem limitations under the License. +@rem + +@if "%DEBUG%" == "" @echo off +@rem ########################################################################## +@rem +@rem Gradle startup script for Windows +@rem +@rem ########################################################################## + +@rem Set local scope for the variables with windows NT shell +if "%OS%"=="Windows_NT" setlocal + +set DIRNAME=%~dp0 +if "%DIRNAME%" == "" set DIRNAME=. +set APP_BASE_NAME=%~n0 +set APP_HOME=%DIRNAME% + +@rem Resolve any "." and ".." in APP_HOME to make it shorter. +for %%i in ("%APP_HOME%") do set APP_HOME=%%~fi + +@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +set DEFAULT_JVM_OPTS="-Xmx64m" "-Xms64m" + +@rem Find java.exe +if defined JAVA_HOME goto findJavaFromJavaHome + +set JAVA_EXE=java.exe +%JAVA_EXE% -version >NUL 2>&1 +if "%ERRORLEVEL%" == "0" goto execute + +echo. +echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. +echo. +echo Please set the JAVA_HOME variable in your environment to match the +echo location of your Java installation. + +goto fail + +:findJavaFromJavaHome +set JAVA_HOME=%JAVA_HOME:"=% +set JAVA_EXE=%JAVA_HOME%/bin/java.exe + +if exist "%JAVA_EXE%" goto execute + +echo. +echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% +echo. +echo Please set the JAVA_HOME variable in your environment to match the +echo location of your Java installation. + +goto fail + +:execute +@rem Setup the command line + +set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar + + +@rem Execute Gradle +"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %* + +:end +@rem End local scope for the variables with windows NT shell +if "%ERRORLEVEL%"=="0" goto mainEnd + +:fail +rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of +rem the _cmd.exe /c_ return code! +if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1 +exit /b 1 + +:mainEnd +if "%OS%"=="Windows_NT" endlocal + +:omega diff --git a/libs/boosted-yaml-1.3.7.jar b/libs/boosted-yaml-1.3.7.jar new file mode 100644 index 000000000..ea489cb34 Binary files /dev/null and b/libs/boosted-yaml-1.3.7.jar differ diff --git a/readme/README_zh-CN.md b/readme/README_zh-CN.md new file mode 100644 index 000000000..30e371948 --- /dev/null +++ b/readme/README_zh-CN.md @@ -0,0 +1,132 @@ +

+
+ logo +
+ CraftEngine +

+ +

+ English | + 简体中文 | + 繁體中文 +

+ +## 📌 关于 CraftEngine + +CraftEngine 重新定义了 Minecraft 插件架构,作为下一代自定义内容实现的解决方案。通过 JVM 级别的注入,它提供了前所未有的性能、稳定性和可扩展性。该框架提供了一个代码优先的 API,用于注册原生集成的方块行为和物品交互逻辑。 + +## 构建 + +### 🐚 命令行 +1. 安装 JDK 21。 +2. 打开终端并切换到项目文件夹。 +3. 执行 `./gradlew build`,构建产物将生成在 `/target` 文件夹中。 + +### 💻 IDE +1. 导入项目并执行 Gradle 构建操作。 +2. 构建产物将生成在 `/target` 文件夹中。 + +## 安装 + +### 💻 环境要求 +1. 确保您正在运行 [Paper](https://papermc.io/)(或其分支)1.20.1+ 服务器。CraftEngine 不支持 Spigot,且未来也不太可能支持。 +2. 使用 JDK 21 来运行服务器。 + +### 🔍 安装方式 +CraftEngine 提供了两种安装模式:标准安装和 Mod 模式。标准安装与传统插件安装方式相同,即将插件放入插件文件夹中。下面我们将详细介绍 Mod 模式的安装步骤。 + +### 🔧 安装服务器 Mod +1. 下载最新的 [ignite.jar](https://github.com/vectrix-space/ignite/releases) 到您的服务器根目录。 +2. 选择以下任一操作: + - 将您的服务器 JAR 文件重命名为 `paper.jar` + - 添加启动参数:`-Dignite.locator=paper -Dignite.paper.jar=./paper-xxx.jar` + - 示例:`java -Dignite.locator=paper -Dignite.paper.jar=./paper-1.21.4-164.jar -jar ignite.jar` +3. 启动服务器以生成 `/mods` 目录。 +4. 将最新的 [mod.jar](https://github.com/Xiao-MoMi/craft-engine/releases) 放入 `/mods` 文件夹。 +5. 将插件的 JAR 文件放入 `/plugins` 文件夹进行安装。 +6. 执行两次重启: + 1. 第一次重启用于文件初始化。 + 2. 第二次重启以激活所有组件。 + +## 技术概述 + +### ⚙️ 方块 +CraftEngine 使用运行时字节码生成技术,在服务器原生级别注册自定义方块,并结合客户端数据包修改以实现视觉同步。此架构提供了以下功能: + +🧱 自定义原生方块 +- 动态注册方块,完全可控。 +- 物理属性:硬度、引燃几率、亮度等所有标准属性。 +- 自定义行为:通过 API 实现树苗、作物、下落的方块等。 +- 原版兼容性:完全保留原版方块机制(例如音符盒、绊线)。 + +📦 数据包集成 +- 定义自定义矿脉。 +- 生成自定义树木。 +- 配置自定义地形生成。 + +⚡ 性能优势 +- 比传统的 Bukkit 事件监听器更快、更稳定。 +- 策略性代码注入以最小化开销。 + +### 🥘 配方 +CraftEngine 通过底层注入实现完全可定制的合成系统。与传统插件不同,它在处理 NBT 修改时不会失效,确保配方结果仅与唯一的物品标识符绑定。 + +### 🪑 家具 +该插件使用核心实体来存储家具元数据,同时将碰撞实体和模块组件作为客户端数据包传输。此架构实现了显著的服务器端性能优化,同时支持通过多部分物品集成实现复合家具组装。 + +### 📝 模板 +鉴于插件配置的广泛性和复杂性,CraftEngine 实现了模块化模板系统以分隔关键设置。这使得用户可以自定义配置格式,同时显著减少冗余的 YAML 定义。 + +### 🛠️ 模型 +该插件通过配置实现模型继承和纹理覆盖,同时支持从 1.21.4 版本开始的[所有物品模型](https://misode.github.io/assets/item/)。它包含一个版本迁移系统,可以自动将 1.21.4+ 的物品模型降级为旧格式,以实现最大向后兼容性。 + +## 灵感来源 +CraftEngine 从以下开源项目中汲取了灵感: +- [Paper](https://github.com/PaperMC/Paper) +- [LuckPerms](https://github.com/LuckPerms/LuckPerms) +- [Fabric](https://github.com/FabricMC/fabric) +- [packetevents](https://github.com/retrooper/packetevents) +- [NBT](https://github.com/Querz/NBT) +- [DataFixerUpper](https://github.com/Mojang/DataFixerUpper) +- [ViaVersion](https://github.com/ViaVersion/ViaVersion) + +### 核心依赖 +CraftEngine 的实现依赖于以下基础库: +- [ignite](https://github.com/vectrix-space/ignite) +- [cloud-minecraft](https://github.com/Incendo/cloud-minecraft) +- [rtag](https://github.com/saicone/rtag) +- [adventure](https://github.com/KyoriPowered/adventure) +- [byte-buddy](https://github.com/raphw/byte-buddy) + +## 如何贡献 + +### 🔌 新功能与 Bug 修复 +如果您提交的 PR 是关于 Bug 修复的,它很可能会被合并。如果您想提交新功能,请提前在 [Discord](https://discord.com/invite/WVKdaUPR3S) 上联系我。 + +### 🌍 翻译 +1. 克隆此仓库。 +2. 在 `/bukkit-loader/src/main/resources/translations` 中创建一个新的语言文件。 +3. 完成后,提交 **pull request** 以供审核。我们感谢您的贡献! + +### 💖 支持开发者 +如果您喜欢使用 CraftEngine,请考虑支持开发者! + +- **Polymart**: [无] +- **BuiltByBit**: [无] +- **爱发电**: [通过爱发电支持](https://afdian.com/@xiaomomi/) + +## CraftEngine API + +```kotlin +repositories { + maven("https://repo.momirealms.net/releases/") + // 如果你的网络环境受限可以尝试下面的存储库地址 + // maven("https://repo-momi.gtemc.cn/releases/") +} +``` +```kotlin +dependencies { + compileOnly("net.momirealms:craft-engine-core:0.0.29") + compileOnly("net.momirealms:craft-engine-bukkit:0.0.29") +} +``` diff --git a/readme/README_zh-TW.md b/readme/README_zh-TW.md new file mode 100644 index 000000000..0ed3cbe95 --- /dev/null +++ b/readme/README_zh-TW.md @@ -0,0 +1,132 @@ +

+
+ logo +
+ CraftEngine +

+ +

+ English | + 简体中文 | + 繁體中文 +

+ +## 📌 關於 CraftEngine + +CraftEngine 重新定義了 Minecraft 外掛程式架構,作為下一代自定義內容實現的解決方案。通過 JVM 級別的注入,它提供了前所未有的性能、穩定性和可擴充性。該框架提供了一個代碼優先的 API,用於註冊原生集成的方塊行為和物品交互邏輯。 + +## 構建 + +### 🐚 命令行 +1. 安裝 JDK 21。 +2. 開啟終端並切換到項目資料夾。 +3. 執行 './gradlew build',構建產物將生成在 '/target' 資料夾中。 + +### 💻 IDE 開發環境 +1. 匯入項目並執行 Gradle 構建作。 +2. 構建產物將生成在 '/target' 資料夾中。 + +## 安装 + +### 💻 環境要求 +1. 確保您正在運行 [Paper](https://papermc.io/)(或其分支)1.20.1+ 伺服器。CraftEngine 不支援 Spigot,且未來也不太可能支援。 +2. 使用 JDK 21 來運行伺服器。 + +### 🔍 安裝方式 +CraftEngine 提供了兩種安裝模式:標準安裝和 Mod 模式。標準安裝與傳統外掛程式安裝方式相同,即將外掛程式放入外掛程式資料夾中。下面我們將詳細介紹 Mod 模式的安裝步驟。 + +### 🔧 安裝伺服器 Mod +1. 下載最新的 [ignite.jar](https://github.com/vectrix-space/ignite/releases)到您的伺服器根目錄。 +2. 选择以下任一操作: + - 將您的伺服器 JAR 檔案重新命名為 `paper.jar` + - 添加啟動參數:`-Dignite.locator=paper -Dignite.paper.jar=./paper-xxx.jar` + - 示例:`java -Dignite.locator=paper -Dignite.paper.jar=./paper-1.21.4-164.jar -jar ignite.jar` +3. 啟動伺服器以生成 '/mods' 目錄。 +4. 將最新的 [mod.jar](https://github.com/Xiao-MoMi/craft-engine/releases) 放入 '/mods' 資料夾。 +5. 將外掛程式的 JAR 檔案放入 '/plugins' 資料夾安裝。 +6. 執行兩次重啟: + 1. 第一次重啟用於檔案初始化。 + 2. 第二次重啟以啟動所有元件。 + +## 技術概述 + +### ⚙️ 方塊 +CraftEngine 使用運行時位元組碼生成技術,在伺服器原生級別註冊自定義方塊,並結合客戶端數據包修改以實現視覺同步。此架構提供了以下功能: + +🧱 自訂原生方塊 +- 動態註冊方塊,完全可控。 +- 物理屬性:硬度、引燃幾率、亮度等所有標準屬性。 +- 自定義行為:通過 API 實現樹苗、作物、下落的方塊等。 +- 原生相容性:完全保留原生方塊機制(例如音符盒、絆線)。 + +📦 數據包集成 +- 定義自定義礦脈。 +- 產生自定義樹木。 +- 配置自定義地形生成。 + +⚡ 性能優勢 +- 比傳統的 Bukkit 事件監聽器更快、更穩定。 +- 策略性代碼注入以最小化開銷。 + +### 🥘 配方 +CraftEngine 通過底層注入實現完全可定製的合成系統。與傳統外掛程式不同,它在處理 NBT 修改時不會失效,確保配方結果僅與唯一的物品標識符綁定。 + +### 🪑 傢俱 +該外掛程式使用核心實體來儲存傢俱元數據,同時將碰撞實體和模組元件作為用戶端數據包傳輸。此架構實現了顯著的伺服器端性能優化,同時支持通過多部分物品集成實現複合傢俱組裝。 + +### 📝 範本 +鑒於外掛程式配置的廣泛性和複雜性,CraftEngine 實現了模組化範本系統以分隔關鍵設置。這使得使用者可以自定義配置格式,同時顯著減少冗餘的 YAML 定義。 + +### 🛠️ 模型 +該外掛程式通過配置實現模型繼承和紋理覆蓋,同時支援從 1.21.4 版本開始的[所有物品模型](https://misode.github.io/assets/item/)。它包含一個版本遷移系統,可以自動將 1.21.4+ 的物品模型降級為舊格式,以實現最大向後相容性。 + +## 靈感來源 +CraftEngine 從以下開源專案中汲取了靈感: +- [Paper](https://github.com/PaperMC/Paper) +- [LuckPerms](https://github.com/LuckPerms/LuckPerms) +- [Fabric](https://github.com/FabricMC/fabric) +- [packetevents](https://github.com/retrooper/packetevents) +- [NBT](https://github.com/Querz/NBT) +- [DataFixerUpper](https://github.com/Mojang/DataFixerUpper) +- [ViaVersion](https://github.com/ViaVersion/ViaVersion) + +### 核心依賴 +CraftEngine 的實現依賴於以下基礎庫: +- [ignite](https://github.com/vectrix-space/ignite) +- [cloud-minecraft](https://github.com/Incendo/cloud-minecraft) +- [rtag](https://github.com/saicone/rtag) +- [adventure](https://github.com/KyoriPowered/adventure) +- [byte-buddy](https://github.com/raphw/byte-buddy) + +## 如何貢獻 + +### 🔌 新功能與 Bug 修復 +如果您提交的 PR 是關於 Bug 修復的,它很可能會被合併。如果您想提交新功能,請提前在 [Discord](https://discord.com/invite/WVKdaUPR3S) 上聯繫我。 + +### 🌍 翻譯 +1. 克隆此倉庫。 +2. 在 '/bukkit-loader/src/main/resources/translations' 中創建一個新的語言檔。 +3. 完成後,提交 **pull request** 以供審核。我們感謝您的貢獻! + +### 💖 支持開發者 +如果您喜欢使用 CraftEngine,请考虑支持开发者! + +- **Polymart**: [无] +- **BuiltByBit**: [无] +- **愛發電**: [通過愛發電支援](https://afdian.com/@xiaomomi/) + +## CraftEngine API + +```kotlin +repositories { + maven("https://repo.momirealms.net/releases/") + // 如果你的網路環境受限可以嘗試下面的存儲庫位址 + // maven("https://repo-momi.gtemc.cn/releases/") +} +``` +```kotlin +dependencies { + compileOnly("net.momirealms:craft-engine-core:0.0.29") + compileOnly("net.momirealms:craft-engine-bukkit:0.0.29") +} +``` diff --git a/server-mod/build.gradle.kts b/server-mod/build.gradle.kts new file mode 100644 index 000000000..8f3a35e5e --- /dev/null +++ b/server-mod/build.gradle.kts @@ -0,0 +1,50 @@ +plugins { + id("java-library") + id("com.gradleup.shadow") version "9.0.0-beta6" + id("io.papermc.paperweight.userdev") version "2.0.0-beta.14" +} + +repositories { + mavenCentral() + maven("https://maven.fabricmc.net/") + maven("https://oss.sonatype.org/content/groups/public/") + maven("https://repo.papermc.io/repository/maven-public/") + maven("https://repo.spongepowered.org/maven/") +} + +dependencies { + implementation(project(":shared")) + remapper("net.fabricmc:tiny-remapper:0.10.4:fat") + paperweightDevelopmentBundle("io.papermc.paper:dev-bundle:1.21.4-R0.1-SNAPSHOT") + compileOnly("space.vectrix.ignite:ignite-api:1.1.0") + compileOnly("net.fabricmc:sponge-mixin:0.15.2+mixin.0.8.7") + compileOnly("io.github.llamalad7:mixinextras-common:0.4.1") +} + +java { + sourceCompatibility = JavaVersion.VERSION_21 + targetCompatibility = JavaVersion.VERSION_21 + toolchain { + languageVersion = JavaLanguageVersion.of(21) + } +} + +tasks.withType { + options.encoding = "UTF-8" + options.release.set(21) + dependsOn(tasks.clean) +} + +paperweight.reobfArtifactConfiguration = io.papermc.paperweight.userdev.ReobfArtifactConfiguration.MOJANG_PRODUCTION + +artifacts { + archives(tasks.shadowJar) +} + +tasks { + shadowJar { + archiveClassifier = "" + archiveFileName = "${rootProject.name}-bukkit-mod-${rootProject.properties["project_version"]}.jar" + destinationDirectory.set(file("$rootDir/target")) + } +} diff --git a/server-mod/src/main/java/net/momirealms/craftengine/mod/CraftEngineBlock.java b/server-mod/src/main/java/net/momirealms/craftengine/mod/CraftEngineBlock.java new file mode 100644 index 000000000..64afc437f --- /dev/null +++ b/server-mod/src/main/java/net/momirealms/craftengine/mod/CraftEngineBlock.java @@ -0,0 +1,212 @@ +package net.momirealms.craftengine.mod; + +import net.minecraft.core.BlockPos; +import net.minecraft.core.Direction; +import net.minecraft.server.level.ServerChunkCache; +import net.minecraft.server.level.ServerLevel; +import net.minecraft.util.RandomSource; +import net.minecraft.world.entity.item.FallingBlockEntity; +import net.minecraft.world.level.BlockGetter; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.LevelReader; +import net.minecraft.world.level.ScheduledTickAccess; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.Blocks; +import net.minecraft.world.level.block.BonemealableBlock; +import net.minecraft.world.level.block.Fallable; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.material.FluidState; +import net.minecraft.world.phys.shapes.CollisionContext; +import net.minecraft.world.phys.shapes.VoxelShape; +import net.momirealms.craftengine.mod.util.NoteBlockUtils; +import net.momirealms.craftengine.shared.ObjectHolder; +import net.momirealms.craftengine.shared.block.*; +import org.jetbrains.annotations.NotNull; + +public class CraftEngineBlock extends Block implements BehaviorHolder, ShapeHolder, NoteBlockIndicator, Fallable, BonemealableBlock { + private static final PaperWeightStoneBlockShape STONE = new PaperWeightStoneBlockShape(Blocks.STONE.defaultBlockState()); + private boolean isNoteBlock; + public ObjectHolder behaviorHolder; + public ObjectHolder shapeHolder; + public boolean isClientSideNoteBlock; + + public CraftEngineBlock(Properties properties) { + super(properties); + this.behaviorHolder = new ObjectHolder<>(EmptyBlockBehavior.INSTANCE); + this.shapeHolder = new ObjectHolder<>(STONE); + } + + public void setNoteBlock(boolean noteBlock) { + isNoteBlock = noteBlock; + } + + @Override + public ObjectHolder getBehaviorHolder() { + return behaviorHolder; + } + + @Override + public ObjectHolder getShapeHolder() { + return shapeHolder; + } + + @Override + public boolean isNoteBlock() { + return isClientSideNoteBlock; + } + + @Override + protected @NotNull VoxelShape getShape(@NotNull BlockState state, @NotNull BlockGetter level, @NotNull BlockPos pos, @NotNull CollisionContext context) { + try { + return (VoxelShape) shapeHolder.value().getShape(this, new Object[]{state, level, pos, context}); + } catch (Exception e) { + e.printStackTrace(); + return super.getShape(state, level, pos, context); + } + } + + @Override + protected void tick(@NotNull BlockState state, @NotNull ServerLevel level, @NotNull BlockPos pos, @NotNull RandomSource random) { + try { + behaviorHolder.value().tick(this, new Object[]{state, level, pos, random}, () -> { + super.tick(state, level, pos, random); + return null; + }); + } catch (Exception e) { + e.printStackTrace(); + super.tick(state, level, pos, random); + } + } + + @Override + protected void randomTick(@NotNull BlockState state, @NotNull ServerLevel level, @NotNull BlockPos pos, @NotNull RandomSource random) { + try { + behaviorHolder.value().randomTick(this, new Object[]{state, level, pos, random}, () -> { + super.randomTick(state, level, pos, random); + return null; + }); + } catch (Exception e) { + e.printStackTrace(); + super.randomTick(state, level, pos, random); + } + } + + @Override + protected void onPlace(@NotNull BlockState state, @NotNull Level level, @NotNull BlockPos pos, @NotNull BlockState oldState, boolean movedByPiston) { + try { + behaviorHolder.value().onPlace(this, new Object[]{state, level, pos, oldState, movedByPiston}, () -> { + super.onPlace(state, level, pos, oldState, movedByPiston); + return null; + }); + } catch (Exception e) { + e.printStackTrace(); + super.onPlace(state, level, pos, oldState, movedByPiston); + } + } + + @Override + public void onBrokenAfterFall(@NotNull Level level, @NotNull BlockPos pos, @NotNull FallingBlockEntity fallingBlock) { + try { + behaviorHolder.value().onBrokenAfterFall(this, new Object[]{level, pos, fallingBlock}, () -> { + Fallable.super.onBrokenAfterFall(level, pos, fallingBlock); + return null; + }); + } catch (Exception e) { + e.printStackTrace(); + Fallable.super.onBrokenAfterFall(level, pos, fallingBlock); + } + } + + @Override + protected boolean canSurvive(@NotNull BlockState state, @NotNull LevelReader level, @NotNull BlockPos pos) { + try { + return behaviorHolder.value().canSurvive(this, new Object[]{state, level, pos}, () -> super.canSurvive(state, level, pos)); + } catch (Exception e) { + e.printStackTrace(); + return super.canSurvive(state, level, pos); + } + } + + @Override + protected BlockState updateShape(@NotNull BlockState state, + @NotNull LevelReader level, + @NotNull ScheduledTickAccess scheduledTickAccess, + @NotNull BlockPos pos, + @NotNull Direction direction, + @NotNull BlockPos neighborPos, + @NotNull BlockState neighborState, + @NotNull RandomSource random) { + try { + if (isNoteBlock && level instanceof ServerLevel serverLevel) { + startNoteBlockChain(direction, serverLevel, pos); + } + return (BlockState) behaviorHolder.value().updateShape(this, new Object[]{state, level, scheduledTickAccess, pos, direction, neighborPos, neighborState, random}, () -> super.updateShape(state, level, scheduledTickAccess, pos, direction, neighborPos, neighborState, random)); + } catch (Exception e) { + e.printStackTrace(); + return super.updateShape(state, level, scheduledTickAccess, pos, direction, neighborPos, neighborState, random); + } + } + + private static void startNoteBlockChain(Direction direction, ServerLevel serverLevel, BlockPos blockPos) { + int id = direction.get3DDataValue(); + // Y axis + if (id == 0 || id == 1) { + ServerChunkCache chunkSource = serverLevel.chunkSource; + chunkSource.blockChanged(blockPos); + if (id == 1) { + noteBlockChainUpdate(serverLevel, chunkSource, Direction.DOWN, blockPos, 0); + } else { + noteBlockChainUpdate(serverLevel, chunkSource, Direction.UP, blockPos, 0); + } + } + } + + public static void noteBlockChainUpdate(ServerLevel level, ServerChunkCache chunkSource, Direction direction, BlockPos blockPos, int times) { + if (times >= CraftEnginePlugin.maxChainUpdate()) return; + BlockPos relativePos = blockPos.relative(direction); + BlockState state = level.getBlockState(relativePos); + if (NoteBlockUtils.CLIENT_SIDE_NOTE_BLOCKS.contains(state)) { + chunkSource.blockChanged(relativePos); + noteBlockChainUpdate(level, chunkSource, direction, relativePos, times+1); + } + } + + @Override + protected @NotNull FluidState getFluidState(@NotNull BlockState state) { + try { + return (FluidState) behaviorHolder.value().getFluidState(this, new Object[]{state}, () -> super.getFluidState(state)); + } catch (Exception e) { + e.printStackTrace(); + return super.getFluidState(state); + } + } + + @Override + public boolean isValidBonemealTarget(@NotNull LevelReader levelReader, @NotNull BlockPos blockPos, @NotNull BlockState blockState) { + try { + return behaviorHolder.value().isValidBoneMealTarget(this, new Object[]{levelReader, blockPos, blockState}); + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + @Override + public boolean isBonemealSuccess(@NotNull Level level, @NotNull RandomSource randomSource, @NotNull BlockPos blockPos, @NotNull BlockState blockState) { + try { + return behaviorHolder.value().isBoneMealSuccess(this, new Object[]{level, randomSource, blockPos, blockState}); + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + @Override + public void performBonemeal(@NotNull ServerLevel serverLevel, @NotNull RandomSource randomSource, @NotNull BlockPos blockPos, @NotNull BlockState blockState) { + try { + behaviorHolder.value().performBoneMeal(this, new Object[]{serverLevel, randomSource, blockPos, blockState}); + } catch (Exception e) { + e.printStackTrace(); + } + } +} diff --git a/server-mod/src/main/java/net/momirealms/craftengine/mod/CraftEnginePlugin.java b/server-mod/src/main/java/net/momirealms/craftengine/mod/CraftEnginePlugin.java new file mode 100644 index 000000000..6cb356a90 --- /dev/null +++ b/server-mod/src/main/java/net/momirealms/craftengine/mod/CraftEnginePlugin.java @@ -0,0 +1,103 @@ +package net.momirealms.craftengine.mod; + +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; +import org.objectweb.asm.tree.ClassNode; +import org.spongepowered.asm.mixin.extensibility.IMixinConfigPlugin; +import org.spongepowered.asm.mixin.extensibility.IMixinInfo; + +import java.net.URISyntaxException; +import java.net.URL; +import java.nio.file.Path; +import java.nio.file.Paths; +import java.security.CodeSource; +import java.security.ProtectionDomain; +import java.util.List; +import java.util.Set; +import java.util.logging.Logger; + +public final class CraftEnginePlugin implements IMixinConfigPlugin { + public static final Logger LOGGER = Logger.getLogger(CraftEnginePlugin.class.getName()); + private static int vanillaRegistrySize; + private static boolean isSuccessfullyRegistered = false; + private static int maxChainUpdate = 32; + + public static void setVanillaRegistrySize(int vanillaRegistrySize) { + CraftEnginePlugin.vanillaRegistrySize = vanillaRegistrySize; + } + + public static void setIsSuccessfullyRegistered(boolean isSuccessfullyRegistered) { + CraftEnginePlugin.isSuccessfullyRegistered = isSuccessfullyRegistered; + } + + public static int maxChainUpdate() { + return maxChainUpdate; + } + + public static void setMaxChainUpdate(int maxChainUpdate) { + CraftEnginePlugin.maxChainUpdate = maxChainUpdate; + } + + @Override + public void onLoad(final @NotNull String mixinPackage) { + } + + @Override + public @Nullable String getRefMapperConfig() { + return null; + } + + @Override + public boolean shouldApplyMixin(@NotNull String targetClassName, + @NotNull String mixinClassName) { + return true; + } + + @Override + public void acceptTargets(@NotNull Set myTargets, + @NotNull Set otherTargets) { + } + + @Override + public @Nullable List getMixins() { + return null; + } + + @Override + public void preApply(@NotNull String targetClassName, + @NotNull ClassNode targetClass, + @NotNull String mixinClassName, + @NotNull IMixinInfo mixinInfo) { + } + + @Override + public void postApply(@NotNull String targetClassName, + @NotNull ClassNode targetClass, + @NotNull String mixinClassName, + @NotNull IMixinInfo mixinInfo) { + } + + public static Path getPluginFolderPath() { + ProtectionDomain protectionDomain = CraftEnginePlugin.class.getProtectionDomain(); + CodeSource codeSource = protectionDomain.getCodeSource(); + URL jarUrl = codeSource.getLocation(); + try { + return Paths.get(jarUrl.toURI()).getParent().getParent().resolve("plugins"); + } catch (URISyntaxException e) { + e.printStackTrace(); + } + return null; + } + + public static Path getCraftEngineMappingsPath() { + return getPluginFolderPath() + .resolve("CraftEngine") + .resolve("mappings.yml"); + } + + public static Path getCraftEngineAdditionalBlocksPath() { + return getPluginFolderPath() + .resolve("CraftEngine") + .resolve("additional-real-blocks.yml"); + } +} diff --git a/server-mod/src/main/java/net/momirealms/craftengine/mod/PaperWeightStoneBlockShape.java b/server-mod/src/main/java/net/momirealms/craftengine/mod/PaperWeightStoneBlockShape.java new file mode 100644 index 000000000..cc2615820 --- /dev/null +++ b/server-mod/src/main/java/net/momirealms/craftengine/mod/PaperWeightStoneBlockShape.java @@ -0,0 +1,20 @@ +package net.momirealms.craftengine.mod; + +import net.minecraft.core.BlockPos; +import net.minecraft.world.level.BlockGetter; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.phys.shapes.CollisionContext; +import net.momirealms.craftengine.shared.block.BlockShape; + +public class PaperWeightStoneBlockShape implements BlockShape { + private final BlockState rawBlockState; + + public PaperWeightStoneBlockShape(BlockState rawBlockState) { + this.rawBlockState = rawBlockState; + } + + @Override + public Object getShape(Object thisObj, Object[] args) { + return rawBlockState.getShape((BlockGetter) args[1], (BlockPos) args[2], (CollisionContext) args[3]); + } +} diff --git a/server-mod/src/main/java/net/momirealms/craftengine/mod/mixin/MixinBlocks.java b/server-mod/src/main/java/net/momirealms/craftengine/mod/mixin/MixinBlocks.java new file mode 100644 index 000000000..ebae61b28 --- /dev/null +++ b/server-mod/src/main/java/net/momirealms/craftengine/mod/mixin/MixinBlocks.java @@ -0,0 +1,131 @@ +package net.momirealms.craftengine.mod.mixin; + +import com.mojang.brigadier.StringReader; +import net.minecraft.commands.arguments.blocks.BlockStateParser; +import net.minecraft.core.Registry; +import net.minecraft.core.registries.BuiltInRegistries; +import net.minecraft.core.registries.Registries; +import net.minecraft.resources.ResourceKey; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.Blocks; +import net.minecraft.world.level.block.state.BlockBehaviour; +import net.minecraft.world.level.block.state.BlockState; +import net.momirealms.craftengine.mod.CraftEngineBlock; +import net.momirealms.craftengine.mod.CraftEnginePlugin; +import net.momirealms.craftengine.mod.util.NoteBlockUtils; +import org.bukkit.configuration.file.YamlConfiguration; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; + +import java.nio.file.Files; +import java.nio.file.Path; +import java.util.HashMap; +import java.util.LinkedHashMap; +import java.util.Map; + +@Mixin(value = Blocks.class) +public abstract class MixinBlocks { + + @Inject(method = "", at = @At("RETURN")) + private static void onBlocksInit(CallbackInfo ci) { + CraftEnginePlugin.setVanillaRegistrySize(Block.BLOCK_STATE_REGISTRY.size()); + ResourceLocation noteBlock = ResourceLocation.fromNamespaceAndPath("minecraft", "note_block"); + Map map = loadMappingsAndAdditionalBlocks(); + for (Map.Entry entry : map.entrySet()) { + ResourceLocation replacedBlockId = entry.getKey(); + boolean isNoteBlock = replacedBlockId.equals(noteBlock); + Block replacedBlock = BuiltInRegistries.BLOCK.getValue(replacedBlockId); + for (int i = 0; i < entry.getValue(); i++) { + ResourceLocation location = ResourceLocation.fromNamespaceAndPath("craftengine", replacedBlockId.getPath() + "_" + i); + ResourceKey resourceKey = ResourceKey.create(Registries.BLOCK, location); + BlockBehaviour.Properties properties = BlockBehaviour.Properties.of() + .setId(resourceKey); + if (!replacedBlock.hasCollision) { + properties.noCollission(); + } + CraftEngineBlock block = new CraftEngineBlock(properties); + if (isNoteBlock) { + block.setNoteBlock(true); + NoteBlockUtils.CLIENT_SIDE_NOTE_BLOCKS.add(block.defaultBlockState()); + } + Registry.register(BuiltInRegistries.BLOCK, location, block); + Block.BLOCK_STATE_REGISTRY.add(block.defaultBlockState()); + } + } + NoteBlockUtils.CLIENT_SIDE_NOTE_BLOCKS.addAll(Blocks.NOTE_BLOCK.getStateDefinition().getPossibleStates()); + if (!map.isEmpty()) { + CraftEnginePlugin.setIsSuccessfullyRegistered(true); + } + } + + private static Map loadMappingsAndAdditionalBlocks() { + Path mappingPath = CraftEnginePlugin.getCraftEngineMappingsPath(); + if (!Files.exists(mappingPath)) return Map.of(); + YamlConfiguration mappings = YamlConfiguration.loadConfiguration(mappingPath.toFile()); + Map blockStateMappings = loadBlockStateMappings(mappings); + validateBlockStateMappings(blockStateMappings); + Map blockTypeCounter = new LinkedHashMap<>(); + Map appearanceMapper = new HashMap<>(); + for (Map.Entry entry : blockStateMappings.entrySet()) { + processBlockStateMapping(entry, appearanceMapper, blockTypeCounter); + } + YamlConfiguration additionalYaml = YamlConfiguration.loadConfiguration(CraftEnginePlugin.getCraftEngineAdditionalBlocksPath().toFile()); + return buildRegisteredRealBlockSlots(blockTypeCounter, additionalYaml); + } + + private static Map loadBlockStateMappings(YamlConfiguration mappings) { + Map blockStateMappings = new LinkedHashMap<>(); + for (Map.Entry entry : mappings.getValues(false).entrySet()) { + if (entry.getValue() instanceof String afterValue) { + blockStateMappings.put(entry.getKey(), afterValue); + } + } + return blockStateMappings; + } + + private static void validateBlockStateMappings(Map blockStateMappings) { + Map temp = new HashMap<>(blockStateMappings); + for (Map.Entry entry : temp.entrySet()) { + String state = entry.getValue(); + blockStateMappings.remove(state); + } + } + + private static LinkedHashMap buildRegisteredRealBlockSlots(Map counter, YamlConfiguration additionalYaml) { + LinkedHashMap map = new LinkedHashMap<>(); + for (Map.Entry entry : counter.entrySet()) { + String id = entry.getKey().toString(); + int additionalStates = additionalYaml.getInt(id, 0); + int internalIds = entry.getValue() + additionalStates; + map.put(entry.getKey(), internalIds); + } + return map; + } + + private static void processBlockStateMapping(Map.Entry entry, Map mapper, Map counter) { + BlockState before = createBlockData(entry.getKey()); + BlockState after = createBlockData(entry.getValue()); + if (before == null || after == null) return; + + int beforeId = Block.BLOCK_STATE_REGISTRY.getId(before); + int afterId = Block.BLOCK_STATE_REGISTRY.getId(after); + + Integer previous = mapper.put(beforeId, afterId); + if (previous == null) { + counter.compute(BuiltInRegistries.BLOCK.getKey(before.getBlock()), (k, count) -> count == null ? 1 : count + 1); + } + } + + private static BlockState createBlockData(String blockState) { + try { + StringReader reader = new StringReader(blockState); + BlockStateParser.BlockResult arg = BlockStateParser.parseForBlock(BuiltInRegistries.BLOCK, reader, false); + return arg.blockState(); + } catch (Exception e) { + return null; + } + } +} diff --git a/server-mod/src/main/java/net/momirealms/craftengine/mod/util/NoteBlockUtils.java b/server-mod/src/main/java/net/momirealms/craftengine/mod/util/NoteBlockUtils.java new file mode 100644 index 000000000..8deebf538 --- /dev/null +++ b/server-mod/src/main/java/net/momirealms/craftengine/mod/util/NoteBlockUtils.java @@ -0,0 +1,11 @@ +package net.momirealms.craftengine.mod.util; + +import net.minecraft.world.level.block.state.BlockState; + +import java.util.HashSet; +import java.util.Set; + +public class NoteBlockUtils { + + public static final Set CLIENT_SIDE_NOTE_BLOCKS = new HashSet<>(); +} diff --git a/server-mod/src/main/resources/ignite.mod.json b/server-mod/src/main/resources/ignite.mod.json new file mode 100644 index 000000000..a353e9e4d --- /dev/null +++ b/server-mod/src/main/resources/ignite.mod.json @@ -0,0 +1,7 @@ +{ + "id": "craftengine", + "version": "${project_version}", + "mixins": [ + "mixins.craftengine.json" + ] +} diff --git a/server-mod/src/main/resources/mixins.craftengine.json b/server-mod/src/main/resources/mixins.craftengine.json new file mode 100644 index 000000000..2e9a8087a --- /dev/null +++ b/server-mod/src/main/resources/mixins.craftengine.json @@ -0,0 +1,11 @@ +{ + "required": true, + "minVersion": "0.8.7", + "package": "net.momirealms.craftengine.mod.mixin", + "plugin": "net.momirealms.craftengine.mod.CraftEnginePlugin", + "target": "@env(DEFAULT)", + "compatibilityLevel": "JAVA_21", + "server": [ + "MixinBlocks" + ] +} diff --git a/settings.gradle.kts b/settings.gradle.kts new file mode 100644 index 000000000..26b036286 --- /dev/null +++ b/settings.gradle.kts @@ -0,0 +1,13 @@ +rootProject.name = "craft-engine" +include(":shared") +include(":core") +include(":bukkit") +include(":bukkit:legacy") +include(":bukkit-loader") +include(":server-mod") +pluginManagement { + plugins { + kotlin("jvm") version "2.0.20" + } +} + diff --git a/shared/build.gradle.kts b/shared/build.gradle.kts new file mode 100644 index 000000000..da6df7714 --- /dev/null +++ b/shared/build.gradle.kts @@ -0,0 +1,24 @@ +plugins { + id("java-library") +} + +repositories { + mavenCentral() +} + +dependencies { +} + +java { + sourceCompatibility = JavaVersion.VERSION_21 + targetCompatibility = JavaVersion.VERSION_21 + toolchain { + languageVersion = JavaLanguageVersion.of(21) + } +} + +tasks.withType { + options.encoding = "UTF-8" + options.release.set(21) + dependsOn(tasks.clean) +} diff --git a/shared/src/main/java/net/momirealms/craftengine/shared/ObjectHolder.java b/shared/src/main/java/net/momirealms/craftengine/shared/ObjectHolder.java new file mode 100644 index 000000000..cd3f1bb87 --- /dev/null +++ b/shared/src/main/java/net/momirealms/craftengine/shared/ObjectHolder.java @@ -0,0 +1,20 @@ +package net.momirealms.craftengine.shared; + +public class ObjectHolder { + private T value; + + public ObjectHolder(T value) { + this.value = value; + } + + public ObjectHolder() { + } + + public T value() { + return value; + } + + public void bindValue(T value) { + this.value = value; + } +} diff --git a/shared/src/main/java/net/momirealms/craftengine/shared/block/BehaviorHolder.java b/shared/src/main/java/net/momirealms/craftengine/shared/block/BehaviorHolder.java new file mode 100644 index 000000000..097b5bbde --- /dev/null +++ b/shared/src/main/java/net/momirealms/craftengine/shared/block/BehaviorHolder.java @@ -0,0 +1,8 @@ +package net.momirealms.craftengine.shared.block; + +import net.momirealms.craftengine.shared.ObjectHolder; + +public interface BehaviorHolder { + + ObjectHolder getBehaviorHolder(); +} diff --git a/shared/src/main/java/net/momirealms/craftengine/shared/block/BlockBehavior.java b/shared/src/main/java/net/momirealms/craftengine/shared/block/BlockBehavior.java new file mode 100644 index 000000000..8e808f319 --- /dev/null +++ b/shared/src/main/java/net/momirealms/craftengine/shared/block/BlockBehavior.java @@ -0,0 +1,49 @@ +package net.momirealms.craftengine.shared.block; + +import java.util.concurrent.Callable; + +public abstract class BlockBehavior { + + public Object updateShape(Object thisBlock, Object[] args, Callable superMethod) throws Exception { + return superMethod.call(); + } + + public Object getFluidState(Object thisBlock, Object[] args, Callable superMethod) throws Exception { + return superMethod.call(); + } + + public void tick(Object thisBlock, Object[] args, Callable superMethod) throws Exception { + superMethod.call(); + } + + public void randomTick(Object thisBlock, Object[] args, Callable superMethod) throws Exception { + superMethod.call(); + } + + public void onPlace(Object thisBlock, Object[] args, Callable superMethod) throws Exception { + superMethod.call(); + } + + public boolean canSurvive(Object thisBlock, Object[] args, Callable superMethod) throws Exception { + return (boolean) superMethod.call(); + } + + public void onBrokenAfterFall(Object thisBlock, Object[] args, Callable superMethod) throws Exception { + superMethod.call(); + } + + public void onLand(Object thisBlock, Object[] args, Callable superMethod) throws Exception { + superMethod.call(); + } + + public boolean isValidBoneMealTarget(Object thisBlock, Object[] args) throws Exception { + return false; + } + + public boolean isBoneMealSuccess(Object thisBlock, Object[] args) throws Exception { + return false; + } + + public void performBoneMeal(Object thisBlock, Object[] args) throws Exception { + } +} diff --git a/shared/src/main/java/net/momirealms/craftengine/shared/block/BlockShape.java b/shared/src/main/java/net/momirealms/craftengine/shared/block/BlockShape.java new file mode 100644 index 000000000..636e09ace --- /dev/null +++ b/shared/src/main/java/net/momirealms/craftengine/shared/block/BlockShape.java @@ -0,0 +1,6 @@ +package net.momirealms.craftengine.shared.block; + +public interface BlockShape { + + Object getShape(Object thisObj, Object[] args) throws Exception; +} diff --git a/shared/src/main/java/net/momirealms/craftengine/shared/block/EmptyBlockBehavior.java b/shared/src/main/java/net/momirealms/craftengine/shared/block/EmptyBlockBehavior.java new file mode 100644 index 000000000..5a0c6bde0 --- /dev/null +++ b/shared/src/main/java/net/momirealms/craftengine/shared/block/EmptyBlockBehavior.java @@ -0,0 +1,5 @@ +package net.momirealms.craftengine.shared.block; + +public class EmptyBlockBehavior extends BlockBehavior { + public static final EmptyBlockBehavior INSTANCE = new EmptyBlockBehavior(); +} diff --git a/shared/src/main/java/net/momirealms/craftengine/shared/block/NoteBlockIndicator.java b/shared/src/main/java/net/momirealms/craftengine/shared/block/NoteBlockIndicator.java new file mode 100644 index 000000000..8b52adfa1 --- /dev/null +++ b/shared/src/main/java/net/momirealms/craftengine/shared/block/NoteBlockIndicator.java @@ -0,0 +1,6 @@ +package net.momirealms.craftengine.shared.block; + +public interface NoteBlockIndicator { + + boolean isNoteBlock(); +} diff --git a/shared/src/main/java/net/momirealms/craftengine/shared/block/ShapeHolder.java b/shared/src/main/java/net/momirealms/craftengine/shared/block/ShapeHolder.java new file mode 100644 index 000000000..3a3b12b5b --- /dev/null +++ b/shared/src/main/java/net/momirealms/craftengine/shared/block/ShapeHolder.java @@ -0,0 +1,8 @@ +package net.momirealms.craftengine.shared.block; + +import net.momirealms.craftengine.shared.ObjectHolder; + +public interface ShapeHolder { + + ObjectHolder getShapeHolder(); +}

, I> { + protected final P plugin; + + protected ItemFactory(P plugin) { + this.plugin = plugin; + } + + public Item wrap(I item) { + Objects.requireNonNull(item, "item"); + return new AbstractItem<>(this, wrapInternal(item)); + } + + protected abstract ItemWrapper wrapInternal(I item); + + protected abstract Object getTag(ItemWrapper item, Object... path); + + protected abstract void setTag(ItemWrapper item, Object value, Object... path); + + protected abstract boolean hasTag(ItemWrapper item, Object... path); + + protected abstract boolean removeTag(ItemWrapper item, Object... path); + + protected abstract void setComponent(ItemWrapper item, String type, Object value); + + protected abstract Object getComponent(ItemWrapper item, String type); + + protected abstract boolean hasComponent(ItemWrapper item, String type); + + protected abstract void removeComponent(ItemWrapper item, String type); + + protected abstract void update(ItemWrapper item); + + protected abstract I load(ItemWrapper item); + + protected abstract I getItem(ItemWrapper item); + + protected abstract I loadCopy(ItemWrapper item); + + protected abstract void customModelData(ItemWrapper item, Integer data); + + protected abstract Optional customModelData(ItemWrapper item); + + protected abstract void displayName(ItemWrapper item, String json); + + protected abstract Optional displayName(ItemWrapper item); + + protected abstract void itemName(ItemWrapper item, String json); + + protected abstract Optional itemName(ItemWrapper item); + + protected abstract void skull(ItemWrapper item, String skullData); + + protected abstract Optional> lore(ItemWrapper item); + + protected abstract void lore(ItemWrapper item, List lore); + + protected abstract boolean unbreakable(ItemWrapper item); + + protected abstract void unbreakable(ItemWrapper item, boolean unbreakable); + + protected abstract Optional glint(ItemWrapper item); + + protected abstract void glint(ItemWrapper item, Boolean glint); + + protected abstract Optional damage(ItemWrapper item); + + protected abstract void damage(ItemWrapper item, Integer damage); + + protected abstract Optional maxDamage(ItemWrapper item); + + protected abstract void maxDamage(ItemWrapper item, Integer damage); + + protected abstract void enchantments(ItemWrapper item, List enchantments); + + protected abstract void storedEnchantments(ItemWrapper item, List enchantments); + + protected abstract void addEnchantment(ItemWrapper item, Enchantment enchantment); + + protected abstract void addStoredEnchantment(ItemWrapper item, Enchantment enchantment); + + protected abstract Optional getEnchantment(ItemWrapper item, Key key); + + protected abstract void itemFlags(ItemWrapper item, List flags); + + protected abstract Key id(ItemWrapper item); + + protected abstract Optional customId(ItemWrapper item); + + protected abstract Key vanillaId(ItemWrapper item); + + protected abstract int maxStackSize(ItemWrapper item); + + protected abstract void maxStackSize(ItemWrapper item, Integer maxStackSize); + + protected abstract boolean is(ItemWrapper item, Key itemTag); + + protected abstract boolean isBlockItem(ItemWrapper item); +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/item/ItemKeys.java b/core/src/main/java/net/momirealms/craftengine/core/item/ItemKeys.java new file mode 100644 index 000000000..05c1c2f78 --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/item/ItemKeys.java @@ -0,0 +1,39 @@ +package net.momirealms.craftengine.core.item; + +import net.momirealms.craftengine.core.util.Key; + +public class ItemKeys { + public static final Key AIR = Key.of("minecraft:air"); + public static final Key STONE = Key.of("minecraft:stone"); + public static final Key TRIDENT = Key.of("minecraft:trident"); + public static final Key SHIELD = Key.of("minecraft:shield"); + public static final Key BOW = Key.of("minecraft:bow"); + public static final Key CROSSBOW = Key.of("minecraft:crossbow"); + public static final Key FISHING_ROD = Key.of("minecraft:fishing_rod"); + public static final Key ELYTRA = Key.of("minecraft:elytra"); + public static final Key GOAT_HORN = Key.of("minecraft:goat_horn"); + public static final Key WOODEN_AXE = Key.of("minecraft:wooden_axe"); + public static final Key STONE_AXE = Key.of("minecraft:stone_axe"); + public static final Key IRON_AXE = Key.of("minecraft:iron_axe"); + public static final Key GOLDEN_AXE = Key.of("minecraft:golden_axe"); + public static final Key DIAMOND_AXE = Key.of("minecraft:diamond_axe"); + public static final Key NETHERITE_AXE = Key.of("minecraft:netherite_axe"); + public static final Key WATER_BUCKET = Key.of("minecraft:water_bucket"); + public static final Key COD_BUCKET = Key.of("minecraft:cod_bucket"); + public static final Key SALMON_BUCKET = Key.of("minecraft:salmon_bucket"); + public static final Key TADPOLE_BUCKET = Key.of("minecraft:tadpole_bucket"); + public static final Key TROPICAL_FISH_BUCKET = Key.of("minecraft:tropical_fish_bucket"); + public static final Key PUFFERFISH_BUCKET = Key.of("minecraft:pufferfish_bucket"); + public static final Key AXOLOTL_BUCKET = Key.of("minecraft:axolotl_bucket"); + public static final Key BUCKET = Key.of("minecraft:bucket"); + public static final Key BONE_MEAL = Key.of("minecraft:bone_meal"); + public static final Key ENCHANTED_BOOK = Key.of("minecraft:enchanted_book"); + + public static final Key[] AXES = new Key[] { + WOODEN_AXE, STONE_AXE, IRON_AXE, GOLDEN_AXE, DIAMOND_AXE, NETHERITE_AXE + }; + + public static final Key[] WATER_BUCKETS = new Key[] { + WATER_BUCKET, COD_BUCKET, SALMON_BUCKET, TROPICAL_FISH_BUCKET, TADPOLE_BUCKET, PUFFERFISH_BUCKET, AXOLOTL_BUCKET + }; +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/item/ItemManager.java b/core/src/main/java/net/momirealms/craftengine/core/item/ItemManager.java new file mode 100644 index 000000000..b09076ab7 --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/item/ItemManager.java @@ -0,0 +1,82 @@ +package net.momirealms.craftengine.core.item; + +import net.momirealms.craftengine.core.entity.player.Player; +import net.momirealms.craftengine.core.item.behavior.ItemBehavior; +import net.momirealms.craftengine.core.pack.LegacyOverridesModel; +import net.momirealms.craftengine.core.pack.LoadingSequence; +import net.momirealms.craftengine.core.pack.model.ItemModel; +import net.momirealms.craftengine.core.pack.model.generator.ModelGenerator; +import net.momirealms.craftengine.core.plugin.Reloadable; +import net.momirealms.craftengine.core.plugin.config.ConfigSectionParser; +import net.momirealms.craftengine.core.registry.Holder; +import net.momirealms.craftengine.core.util.Key; +import org.incendo.cloud.suggestion.Suggestion; + +import javax.annotation.Nullable; +import java.util.*; + +public interface ItemManager extends Reloadable, ModelGenerator, ConfigSectionParser { + String CONFIG_SECTION_NAME = "items"; + + default String sectionId() { + return CONFIG_SECTION_NAME; + } + + Map> legacyItemOverrides(); + + Map> modernItemOverrides(); + + Map modernItemModels1_21_4(); + + Map> modernItemModels1_21_2(); + + Collection vanillaItems(); + + T buildCustomItemStack(Key id, @Nullable Player player); + + T buildItemStack(Key id, @Nullable Player player); + + Item createCustomWrappedItem(Key id, @Nullable Player player); + + Item createWrappedItem(Key id, @Nullable Player player); + + Item wrap(T itemStack); + + Collection items(); + + Key itemId(T itemStack); + + Key customItemId(T itemStack); + + Optional> getCustomItem(Key key); + + Optional> getItemBehavior(Key key); + + Optional> getVanillaItem(Key key); + + default Optional> getBuildableItem(Key key) { + Optional> item = getCustomItem(key); + if (item.isPresent()) { + return item; + } + return getVanillaItem(key); + } + + List> tagToItems(Key tag); + + List> tagToVanillaItems(Key tag); + + List> tagToCustomItems(Key tag); + + int fuelTime(T itemStack); + + int fuelTime(Key id); + + default int loadingSequence() { + return LoadingSequence.ITEM; + } + + Collection cachedSuggestions(); + + void delayedInit(); +} \ No newline at end of file diff --git a/core/src/main/java/net/momirealms/craftengine/core/item/ItemSettings.java b/core/src/main/java/net/momirealms/craftengine/core/item/ItemSettings.java new file mode 100644 index 000000000..05abd4665 --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/item/ItemSettings.java @@ -0,0 +1,128 @@ +package net.momirealms.craftengine.core.item; + +import net.momirealms.craftengine.core.entity.EquipmentSlot; +import net.momirealms.craftengine.core.item.modifier.EquippableModifier; +import net.momirealms.craftengine.core.item.modifier.ItemModifier; +import net.momirealms.craftengine.core.util.Key; +import net.momirealms.craftengine.core.util.MiscUtils; +import org.jetbrains.annotations.Nullable; + +import java.util.*; +import java.util.stream.Collectors; + +public class ItemSettings { + int fuelTime; + Set tags = Set.of(); + @Nullable + EquipmentData equipmentData; + + private ItemSettings() {} + + public List> modifiers() { + if (this.equipmentData == null) return Collections.emptyList(); + return List.of(new EquippableModifier<>(this.equipmentData)); + } + + public static ItemSettings of() { + return new ItemSettings(); + } + + public static ItemSettings fromMap(Map map) { + return applyModifiers(ItemSettings.of(), map); + } + + public static ItemSettings ofFullCopy(ItemSettings settings) { + ItemSettings newSettings = of(); + newSettings.fuelTime = settings.fuelTime; + newSettings.tags = settings.tags; + newSettings.equipmentData = settings.equipmentData; + return newSettings; + } + + public static ItemSettings applyModifiers(ItemSettings settings, Map map) { + for (Map.Entry entry : map.entrySet()) { + ItemSettings.Modifier.Factory factory = ItemSettings.Modifiers.FACTORIES.get(entry.getKey()); + if (factory != null) { + factory.createModifier(entry.getValue()).apply(settings); + } else { + throw new IllegalArgumentException("Unknown item settings key: " + entry.getKey()); + } + } + return settings; + } + + public int fuelTime() { + return fuelTime; + } + + public Set tags() { + return tags; + } + + @Nullable + public EquipmentData equipmentData() { + return equipmentData; + } + + public ItemSettings fuelTime(int fuelTime) { + this.fuelTime = fuelTime; + return this; + } + + public ItemSettings tags(Set tags) { + this.tags = tags; + return this; + } + + public ItemSettings equipmentData(EquipmentData equipmentData) { + this.equipmentData = equipmentData; + return this; + } + + @FunctionalInterface + public interface Modifier { + + void apply(ItemSettings settings); + + @FunctionalInterface + interface Factory { + + ItemSettings.Modifier createModifier(Object value); + } + } + + public static class Modifiers { + private static final Map FACTORIES = new HashMap<>(); + + static { + registerFactory("fuel-time", (value -> { + int intValue = MiscUtils.getAsInt(value); + return settings -> settings.fuelTime(intValue); + })); + registerFactory("tags", (value -> { + List tags = MiscUtils.getAsStringList(value); + return settings -> settings.tags(tags.stream().map(Key::of).collect(Collectors.toSet())); + })); + registerFactory("equippable", (value -> { + Map data = MiscUtils.castToMap(value, false); + String slot = (String) data.get("slot"); + if (slot == null) { + throw new IllegalArgumentException("No slot specified"); + } + EquipmentSlot slotEnum = EquipmentSlot.valueOf(slot.toUpperCase(Locale.ENGLISH)); + EquipmentData.Builder builder = EquipmentData.builder().slot(slotEnum); + if (data.containsKey("asset-id")) { + builder.assetId(Key.of(data.get("asset-id").toString())); + } + if (data.containsKey("camera-overlay")) { + builder.cameraOverlay(Key.of(data.get("camera-overlay").toString())); + } + return settings -> settings.equipmentData(builder.build()); + })); + } + + private static void registerFactory(String id, ItemSettings.Modifier.Factory factory) { + FACTORIES.put(id, factory); + } + } +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/item/ItemWrapper.java b/core/src/main/java/net/momirealms/craftengine/core/item/ItemWrapper.java new file mode 100644 index 000000000..49af43621 --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/item/ItemWrapper.java @@ -0,0 +1,40 @@ +package net.momirealms.craftengine.core.item; + +public interface ItemWrapper { + + I getItem(); + + void update(); + + I load(); + + I loadCopy(); + + Object getLiteralObject(); + + boolean set(Object value, Object... path); + + boolean add(Object value, Object... path); + + V get(Object... path); + + V getExact(Object... path); + + boolean remove(Object... path); + + boolean hasTag(Object... path); + + void removeComponent(Object type); + + boolean hasComponent(Object type); + + void setComponent(Object type, Object value); + + Object getComponent(Object type); + + int count(); + + void count(int amount); + + ItemWrapper copyWithCount(int count); +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/item/behavior/EmptyItemBehavior.java b/core/src/main/java/net/momirealms/craftengine/core/item/behavior/EmptyItemBehavior.java new file mode 100644 index 000000000..e9ee30aaf --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/item/behavior/EmptyItemBehavior.java @@ -0,0 +1,5 @@ +package net.momirealms.craftengine.core.item.behavior; + +public class EmptyItemBehavior extends ItemBehavior { + public static final EmptyItemBehavior INSTANCE = new EmptyItemBehavior(); +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/item/behavior/ItemBehavior.java b/core/src/main/java/net/momirealms/craftengine/core/item/behavior/ItemBehavior.java new file mode 100644 index 000000000..3c73c14e7 --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/item/behavior/ItemBehavior.java @@ -0,0 +1,18 @@ +package net.momirealms.craftengine.core.item.behavior; + +import net.momirealms.craftengine.core.entity.player.InteractionHand; +import net.momirealms.craftengine.core.entity.player.InteractionResult; +import net.momirealms.craftengine.core.entity.player.Player; +import net.momirealms.craftengine.core.item.context.UseOnContext; +import net.momirealms.craftengine.core.world.World; + +public abstract class ItemBehavior { + + public InteractionResult useOnBlock(UseOnContext context) { + return InteractionResult.PASS; + } + + public InteractionResult use(World world, Player player, InteractionHand hand) { + return InteractionResult.PASS; + } +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/item/behavior/ItemBehaviorFactory.java b/core/src/main/java/net/momirealms/craftengine/core/item/behavior/ItemBehaviorFactory.java new file mode 100644 index 000000000..4b5ebe888 --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/item/behavior/ItemBehaviorFactory.java @@ -0,0 +1,12 @@ +package net.momirealms.craftengine.core.item.behavior; + +import net.momirealms.craftengine.core.pack.Pack; +import net.momirealms.craftengine.core.util.Key; + +import java.nio.file.Path; +import java.util.Map; + +public interface ItemBehaviorFactory { + + ItemBehavior create(Pack pack, Path path, Key id, Map arguments); +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/item/behavior/ItemBehaviors.java b/core/src/main/java/net/momirealms/craftengine/core/item/behavior/ItemBehaviors.java new file mode 100644 index 000000000..e83921e69 --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/item/behavior/ItemBehaviors.java @@ -0,0 +1,34 @@ +package net.momirealms.craftengine.core.item.behavior; + +import net.momirealms.craftengine.core.pack.Pack; +import net.momirealms.craftengine.core.registry.BuiltInRegistries; +import net.momirealms.craftengine.core.registry.Holder; +import net.momirealms.craftengine.core.registry.Registries; +import net.momirealms.craftengine.core.registry.WritableRegistry; +import net.momirealms.craftengine.core.util.Key; +import net.momirealms.craftengine.core.util.ResourceKey; + +import java.nio.file.Path; +import java.util.Map; + +public class ItemBehaviors { + + public static void register(Key key, ItemBehaviorFactory factory) { + Holder.Reference holder = ((WritableRegistry) BuiltInRegistries.ITEM_BEHAVIOR_FACTORY) + .registerForHolder(new ResourceKey<>(Registries.ITEM_BEHAVIOR_FACTORY.location(), key)); + holder.bindValue(factory); + } + + public static ItemBehavior fromMap(Pack pack, Path path, Key id, Map map) { + String type = (String) map.getOrDefault("type", "empty"); + if (type == null) { + throw new NullPointerException("behavior type cannot be null"); + } + Key key = Key.withDefaultNamespace(type, "craftengine"); + ItemBehaviorFactory factory = BuiltInRegistries.ITEM_BEHAVIOR_FACTORY.getValue(key); + if (factory == null) { + throw new IllegalArgumentException("Unknown behavior type: " + type); + } + return factory.create(pack, path, id, map); + } +} \ No newline at end of file diff --git a/core/src/main/java/net/momirealms/craftengine/core/item/context/BlockPlaceContext.java b/core/src/main/java/net/momirealms/craftengine/core/item/context/BlockPlaceContext.java new file mode 100644 index 000000000..3a290f784 --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/item/context/BlockPlaceContext.java @@ -0,0 +1,49 @@ +package net.momirealms.craftengine.core.item.context; + +import net.momirealms.craftengine.core.entity.player.InteractionHand; +import net.momirealms.craftengine.core.entity.player.Player; +import net.momirealms.craftengine.core.item.Item; +import net.momirealms.craftengine.core.util.Direction; +import net.momirealms.craftengine.core.world.BlockHitResult; +import net.momirealms.craftengine.core.world.BlockPos; +import net.momirealms.craftengine.core.world.World; + +public class BlockPlaceContext extends UseOnContext { + private final BlockPos relativePos; + protected boolean replaceClicked; + + public BlockPlaceContext(UseOnContext context) { + this(context.getLevel(), context.getPlayer(), context.getHand(), context.getItem(), context.getHitResult()); + } + + public BlockPlaceContext(World world, Player player, InteractionHand hand, Item stack, BlockHitResult hit) { + super(world, player, hand, stack, hit); + this.relativePos = hit.getBlockPos().relative(hit.getDirection()); + this.replaceClicked = world.getBlockAt(hit.getBlockPos()).canBeReplaced(this); + } + + @Override + public BlockPos getClickedPos() { + return this.replaceClicked ? super.getClickedPos() : this.relativePos; + } + + public BlockPos getAgainstPos() { + return super.getClickedPos(); + } + + public boolean canPlace() { + return this.replaceClicked || this.getLevel().getBlockAt(this.getClickedPos()).canBeReplaced(this); + } + + public boolean isWaterSource() { + return this.getLevel().getBlockAt(this.getClickedPos()).isWaterSource(this); + } + + public boolean replacingClickedOnBlock() { + return this.replaceClicked; + } + + public Direction getNearestLookingDirection() { + return Direction.orderedByNearest(this.getPlayer())[0]; + } +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/item/context/UseOnContext.java b/core/src/main/java/net/momirealms/craftengine/core/item/context/UseOnContext.java new file mode 100644 index 000000000..ff6a6514e --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/item/context/UseOnContext.java @@ -0,0 +1,78 @@ +package net.momirealms.craftengine.core.item.context; + +import net.momirealms.craftengine.core.entity.player.InteractionHand; +import net.momirealms.craftengine.core.entity.player.Player; +import net.momirealms.craftengine.core.item.Item; +import net.momirealms.craftengine.core.util.Direction; +import net.momirealms.craftengine.core.world.BlockHitResult; +import net.momirealms.craftengine.core.world.BlockPos; +import net.momirealms.craftengine.core.world.Vec3d; +import net.momirealms.craftengine.core.world.World; + +public class UseOnContext { + private final Player player; + private final InteractionHand hand; + private final BlockHitResult hitResult; + private final World level; + private final Item itemStack; + + public UseOnContext(Player player, InteractionHand hand, BlockHitResult hit) { + this(player.level(), player, hand, player.getItemInHand(hand), hit); + } + + public UseOnContext(World world, Player player, InteractionHand hand, Item stack, BlockHitResult hit) { + this.player = player; + this.hand = hand; + this.hitResult = hit; + this.itemStack = stack; + this.level = world; + } + + public BlockHitResult getHitResult() { + return this.hitResult; + } + + public BlockPos getClickedPos() { + return this.hitResult.getBlockPos(); + } + + public Direction getClickedFace() { + return this.hitResult.getDirection(); + } + + public Vec3d getClickLocation() { + return this.hitResult.getLocation(); + } + + public boolean isInside() { + return this.hitResult.isInside(); + } + + public Item getItem() { + return this.itemStack; + } + + public Player getPlayer() { + return this.player; + } + + public InteractionHand getHand() { + return this.hand; + } + + public World getLevel() { + return this.level; + } + + public Direction getHorizontalDirection() { + return this.player.getDirection(); + } + + public boolean isSecondaryUseActive() { + return this.player.isSecondaryUseActive(); + } + + public float getRotation() { + return this.player == null ? 0.0F : this.player.getYRot(); + } +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/item/modifier/ComponentModifier.java b/core/src/main/java/net/momirealms/craftengine/core/item/modifier/ComponentModifier.java new file mode 100644 index 000000000..af953405c --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/item/modifier/ComponentModifier.java @@ -0,0 +1,28 @@ +package net.momirealms.craftengine.core.item.modifier; + +import net.momirealms.craftengine.core.item.Item; +import net.momirealms.craftengine.core.item.ItemBuildContext; + +import java.util.Map; + +public class ComponentModifier implements ItemModifier { + private final Map arguments; + + public ComponentModifier(Map arguments) { + this.arguments = arguments; + } + + @Override + public String name() { + return "components"; + } + + @Override + public void apply(Item item, ItemBuildContext context) { + for (Map.Entry entry : arguments.entrySet()) { + String key = entry.getKey(); + Object value = entry.getValue(); + item.setComponent(key, value); + } + } +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/item/modifier/CustomModelDataModifier.java b/core/src/main/java/net/momirealms/craftengine/core/item/modifier/CustomModelDataModifier.java new file mode 100644 index 000000000..806faf77e --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/item/modifier/CustomModelDataModifier.java @@ -0,0 +1,22 @@ +package net.momirealms.craftengine.core.item.modifier; + +import net.momirealms.craftengine.core.item.Item; +import net.momirealms.craftengine.core.item.ItemBuildContext; + +public class CustomModelDataModifier implements ItemModifier { + private final int argument; + + public CustomModelDataModifier(int argument) { + this.argument = argument; + } + + @Override + public String name() { + return "custom-model-data"; + } + + @Override + public void apply(Item item, ItemBuildContext context) { + item.customModelData(argument); + } +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/item/modifier/DisplayNameModifier.java b/core/src/main/java/net/momirealms/craftengine/core/item/modifier/DisplayNameModifier.java new file mode 100644 index 000000000..47763231f --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/item/modifier/DisplayNameModifier.java @@ -0,0 +1,24 @@ +package net.momirealms.craftengine.core.item.modifier; + +import net.momirealms.craftengine.core.item.Item; +import net.momirealms.craftengine.core.item.ItemBuildContext; +import net.momirealms.craftengine.core.plugin.config.ConfigManager; +import net.momirealms.craftengine.core.util.AdventureHelper; + +public class DisplayNameModifier implements ItemModifier { + private final String argument; + + public DisplayNameModifier(String argument) { + this.argument = ConfigManager.nonItalic() ? "" + argument : argument; + } + + @Override + public String name() { + return "display-name"; + } + + @Override + public void apply(Item item, ItemBuildContext context) { + item.displayName(AdventureHelper.componentToJson(AdventureHelper.miniMessage().deserialize(this.argument, context.tagResolvers()))); + } +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/item/modifier/EnchantmentModifier.java b/core/src/main/java/net/momirealms/craftengine/core/item/modifier/EnchantmentModifier.java new file mode 100644 index 000000000..ba9aefb51 --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/item/modifier/EnchantmentModifier.java @@ -0,0 +1,27 @@ +package net.momirealms.craftengine.core.item.modifier; + +import net.momirealms.craftengine.core.item.Enchantment; +import net.momirealms.craftengine.core.item.Item; +import net.momirealms.craftengine.core.item.ItemBuildContext; +import net.momirealms.craftengine.core.item.ItemKeys; + +import java.util.List; + +public class EnchantmentModifier implements ItemModifier { + private final List enchantments; + + public EnchantmentModifier(List enchantments) { + this.enchantments = enchantments; + } + + @Override + public String name() { + return "enchantment"; + } + + @Override + public void apply(Item item, ItemBuildContext context) { + if (item.vanillaId().equals(ItemKeys.ENCHANTED_BOOK)) item.setStoredEnchantments(enchantments); + else item.setEnchantments(enchantments); + } +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/item/modifier/EquippableModifier.java b/core/src/main/java/net/momirealms/craftengine/core/item/modifier/EquippableModifier.java new file mode 100644 index 000000000..375ae9646 --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/item/modifier/EquippableModifier.java @@ -0,0 +1,24 @@ +package net.momirealms.craftengine.core.item.modifier; + +import net.momirealms.craftengine.core.item.ComponentKeys; +import net.momirealms.craftengine.core.item.EquipmentData; +import net.momirealms.craftengine.core.item.Item; +import net.momirealms.craftengine.core.item.ItemBuildContext; + +public class EquippableModifier implements ItemModifier { + private final EquipmentData data; + + public EquippableModifier(EquipmentData data) { + this.data = data; + } + + @Override + public String name() { + return "equippable"; + } + + @Override + public void apply(Item item, ItemBuildContext context) { + item.setComponent(ComponentKeys.EQUIPPABLE, this.data.toMap()); + } +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/item/modifier/IdModifier.java b/core/src/main/java/net/momirealms/craftengine/core/item/modifier/IdModifier.java new file mode 100644 index 000000000..ba00849b2 --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/item/modifier/IdModifier.java @@ -0,0 +1,24 @@ +package net.momirealms.craftengine.core.item.modifier; + +import net.momirealms.craftengine.core.item.Item; +import net.momirealms.craftengine.core.item.ItemBuildContext; +import net.momirealms.craftengine.core.util.Key; + +public class IdModifier implements ItemModifier { + public static final String CRAFT_ENGINE_ID = "craftengine:id"; + private final Key argument; + + public IdModifier(Key argument) { + this.argument = argument; + } + + @Override + public String name() { + return "id"; + } + + @Override + public void apply(Item item, ItemBuildContext context) { + item.setTag(argument.toString(), CRAFT_ENGINE_ID); + } +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/item/modifier/ItemModelModifier.java b/core/src/main/java/net/momirealms/craftengine/core/item/modifier/ItemModelModifier.java new file mode 100644 index 000000000..973badeee --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/item/modifier/ItemModelModifier.java @@ -0,0 +1,24 @@ +package net.momirealms.craftengine.core.item.modifier; + +import net.momirealms.craftengine.core.item.ComponentKeys; +import net.momirealms.craftengine.core.item.Item; +import net.momirealms.craftengine.core.item.ItemBuildContext; +import net.momirealms.craftengine.core.util.Key; + +public class ItemModelModifier implements ItemModifier { + private final Key data; + + public ItemModelModifier(Key data) { + this.data = data; + } + + @Override + public String name() { + return "item-model"; + } + + @Override + public void apply(Item item, ItemBuildContext context) { + item.setComponent(ComponentKeys.ITEM_MODEL, this.data.toString()); + } +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/item/modifier/ItemModifier.java b/core/src/main/java/net/momirealms/craftengine/core/item/modifier/ItemModifier.java new file mode 100644 index 000000000..d98c3992a --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/item/modifier/ItemModifier.java @@ -0,0 +1,11 @@ +package net.momirealms.craftengine.core.item.modifier; + +import net.momirealms.craftengine.core.item.Item; +import net.momirealms.craftengine.core.item.ItemBuildContext; + +public interface ItemModifier { + + String name(); + + void apply(Item item, ItemBuildContext context); +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/item/modifier/ItemNameModifier.java b/core/src/main/java/net/momirealms/craftengine/core/item/modifier/ItemNameModifier.java new file mode 100644 index 000000000..9a860fe3c --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/item/modifier/ItemNameModifier.java @@ -0,0 +1,24 @@ +package net.momirealms.craftengine.core.item.modifier; + +import net.momirealms.craftengine.core.item.Item; +import net.momirealms.craftengine.core.item.ItemBuildContext; +import net.momirealms.craftengine.core.plugin.config.ConfigManager; +import net.momirealms.craftengine.core.util.AdventureHelper; + +public class ItemNameModifier implements ItemModifier { + private final String argument; + + public ItemNameModifier(String argument) { + this.argument = ConfigManager.nonItalic() ? "" + argument : argument; + } + + @Override + public String name() { + return "item-name"; + } + + @Override + public void apply(Item item, ItemBuildContext context) { + item.itemName(AdventureHelper.componentToJson(AdventureHelper.miniMessage().deserialize(this.argument, context.tagResolvers()))); + } +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/item/modifier/JukeboxSongModifier.java b/core/src/main/java/net/momirealms/craftengine/core/item/modifier/JukeboxSongModifier.java new file mode 100644 index 000000000..6c4aa4080 --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/item/modifier/JukeboxSongModifier.java @@ -0,0 +1,34 @@ +package net.momirealms.craftengine.core.item.modifier; + +import net.momirealms.craftengine.core.item.ComponentKeys; +import net.momirealms.craftengine.core.item.Item; +import net.momirealms.craftengine.core.item.ItemBuildContext; +import net.momirealms.craftengine.core.util.Key; +import net.momirealms.craftengine.core.util.VersionHelper; + +import java.util.Map; + +public class JukeboxSongModifier implements ItemModifier { + private final Key song; + + public JukeboxSongModifier(Key song) { + this.song = song; + } + + @Override + public String name() { + return "jukebox-playable"; + } + + @Override + public void apply(Item item, ItemBuildContext context) { + if (VersionHelper.isVersionNewerThan1_21_5()) { + item.setComponent(ComponentKeys.JUKEBOX_PLAYABLE, song.toString()); + } else { + item.setComponent(ComponentKeys.JUKEBOX_PLAYABLE, Map.of( + "song", song.toString(), + "show_in_tooltip", true + )); + } + } +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/item/modifier/LoreModifier.java b/core/src/main/java/net/momirealms/craftengine/core/item/modifier/LoreModifier.java new file mode 100644 index 000000000..066b2ae10 --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/item/modifier/LoreModifier.java @@ -0,0 +1,27 @@ +package net.momirealms.craftengine.core.item.modifier; + +import net.momirealms.craftengine.core.item.Item; +import net.momirealms.craftengine.core.item.ItemBuildContext; +import net.momirealms.craftengine.core.plugin.config.ConfigManager; +import net.momirealms.craftengine.core.util.AdventureHelper; + +import java.util.List; + +public class LoreModifier implements ItemModifier { + private final List argument; + + public LoreModifier(List argument) { + this.argument = ConfigManager.nonItalic() ? argument.stream().map(it -> "" + it).toList() : argument; + } + + @Override + public String name() { + return "lore"; + } + + @Override + public void apply(Item item, ItemBuildContext context) { + item.lore(argument.stream().map(it -> AdventureHelper.componentToJson(AdventureHelper.miniMessage().deserialize( + it, context.tagResolvers()))).toList()); + } +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/item/modifier/TagsModifier.java b/core/src/main/java/net/momirealms/craftengine/core/item/modifier/TagsModifier.java new file mode 100644 index 000000000..06942fa79 --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/item/modifier/TagsModifier.java @@ -0,0 +1,105 @@ +package net.momirealms.craftengine.core.item.modifier; + +import net.momirealms.craftengine.core.item.Item; +import net.momirealms.craftengine.core.item.ItemBuildContext; +import net.momirealms.craftengine.core.util.MiscUtils; +import net.momirealms.craftengine.core.util.TypeUtils; + +import java.util.LinkedHashMap; +import java.util.Map; + +public class TagsModifier implements ItemModifier { + private final Map arguments; + + public TagsModifier(Map arguments) { + this.arguments = mapToMap(arguments); + } + + @Override + public String name() { + return "tags"; + } + + @Override + public void apply(Item item, ItemBuildContext context) { + for (Map.Entry entry : arguments.entrySet()) { + String key = entry.getKey(); + Object value = entry.getValue(); + item.setTag(value, key); + } + } + + private static Map mapToMap(final Map source) { + Map resultMap = new LinkedHashMap<>(); + recursiveMapProcessing(source, resultMap); + return resultMap; + } + + private static void recursiveMapProcessing( + final Map sourceMap, + final Map targetMap + ) { + for (Map.Entry entry : sourceMap.entrySet()) { + processMapEntry(entry.getKey(), entry.getValue(), targetMap); + } + } + + private static void processMapEntry( + final String key, + final Object value, + final Map targetMap + ) { + if (value instanceof Map) { + handleNestedMap(key, MiscUtils.castToMap(value, false), targetMap); + } else if (value instanceof String) { + handleStringValue(key, (String) value, targetMap); + } else { + targetMap.put(key, value); + } + } + + private static void handleNestedMap( + final String key, + final Map nestedSource, + final Map parentMap + ) { + Map nestedTarget = new LinkedHashMap<>(); + parentMap.put(key, nestedTarget); + recursiveMapProcessing(nestedSource, nestedTarget); + } + + private static void handleStringValue( + final String key, + final String value, + final Map targetMap + ) { + ParsedValue parsed = tryParseTypedValue(value); + targetMap.put(key, parsed.success ? parsed.result : value); + } + + private static ParsedValue tryParseTypedValue(final String str) { + if (str.length() < 3 || str.charAt(0) != '(') { + return ParsedValue.FAILURE; + } + + int closingBracketPos = str.indexOf(')', 1); + if (closingBracketPos == -1 || closingBracketPos + 2 > str.length()) { + return ParsedValue.FAILURE; + } + + if (str.charAt(closingBracketPos + 1) != ' ') { + return ParsedValue.FAILURE; + } + + String typeMarker = str.substring(1, closingBracketPos); + String content = str.substring(closingBracketPos + 2); + return new ParsedValue( + true, + TypeUtils.castBasicTypes(content, typeMarker) + ); + } + + private record ParsedValue(boolean success, Object result) { + static final ParsedValue FAILURE = new ParsedValue(false, null); + } +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/item/modifier/TooltipStyleModifier.java b/core/src/main/java/net/momirealms/craftengine/core/item/modifier/TooltipStyleModifier.java new file mode 100644 index 000000000..dafcde51e --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/item/modifier/TooltipStyleModifier.java @@ -0,0 +1,24 @@ +package net.momirealms.craftengine.core.item.modifier; + +import net.momirealms.craftengine.core.item.ComponentKeys; +import net.momirealms.craftengine.core.item.Item; +import net.momirealms.craftengine.core.item.ItemBuildContext; +import net.momirealms.craftengine.core.util.Key; + +public class TooltipStyleModifier implements ItemModifier { + private final Key argument; + + public TooltipStyleModifier(Key argument) { + this.argument = argument; + } + + @Override + public String name() { + return "tooltip-style"; + } + + @Override + public void apply(Item item, ItemBuildContext context) { + item.setComponent(ComponentKeys.TOOLTIP_STYLE, argument.toString()); + } +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/item/modifier/UnbreakableModifier.java b/core/src/main/java/net/momirealms/craftengine/core/item/modifier/UnbreakableModifier.java new file mode 100644 index 000000000..90cc19fba --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/item/modifier/UnbreakableModifier.java @@ -0,0 +1,22 @@ +package net.momirealms.craftengine.core.item.modifier; + +import net.momirealms.craftengine.core.item.Item; +import net.momirealms.craftengine.core.item.ItemBuildContext; + +public class UnbreakableModifier implements ItemModifier { + private final boolean argument; + + public UnbreakableModifier(boolean argument) { + this.argument = argument; + } + + @Override + public String name() { + return "unbreakable"; + } + + @Override + public void apply(Item item, ItemBuildContext context) { + item.unbreakable(argument); + } +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/item/recipe/AbstractRecipe.java b/core/src/main/java/net/momirealms/craftengine/core/item/recipe/AbstractRecipe.java new file mode 100644 index 000000000..96ecf0394 --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/item/recipe/AbstractRecipe.java @@ -0,0 +1,38 @@ +package net.momirealms.craftengine.core.item.recipe; + +import net.momirealms.craftengine.core.item.ItemBuildContext; +import net.momirealms.craftengine.core.util.Key; +import org.jetbrains.annotations.Nullable; + +public abstract class AbstractRecipe implements Recipe { + protected final String group; + protected final Key id; + protected final CustomRecipeResult result; + + protected AbstractRecipe(Key id, String group, CustomRecipeResult result) { + this.group = group; + this.id = id; + this.result = result; + } + + @Override + @Nullable + public String group() { + return group; + } + + @Override + public Key id() { + return id; + } + + @Override + public T result(ItemBuildContext context) { + return result.buildItemStack(context); + } + + @Override + public CustomRecipeResult result() { + return this.result; + } +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/item/recipe/CookingRecipeCategory.java b/core/src/main/java/net/momirealms/craftengine/core/item/recipe/CookingRecipeCategory.java new file mode 100644 index 000000000..98fa1c1cf --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/item/recipe/CookingRecipeCategory.java @@ -0,0 +1,7 @@ +package net.momirealms.craftengine.core.item.recipe; + +public enum CookingRecipeCategory { + FOOD, + BLOCKS, + MISC +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/item/recipe/CraftingRecipeCategory.java b/core/src/main/java/net/momirealms/craftengine/core/item/recipe/CraftingRecipeCategory.java new file mode 100644 index 000000000..f656cc754 --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/item/recipe/CraftingRecipeCategory.java @@ -0,0 +1,8 @@ +package net.momirealms.craftengine.core.item.recipe; + +public enum CraftingRecipeCategory { + BUILDING, + REDSTONE, + EQUIPMENT, + MISC +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/item/recipe/CustomBlastingRecipe.java b/core/src/main/java/net/momirealms/craftengine/core/item/recipe/CustomBlastingRecipe.java new file mode 100644 index 000000000..673212f9a --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/item/recipe/CustomBlastingRecipe.java @@ -0,0 +1,53 @@ +package net.momirealms.craftengine.core.item.recipe; + +import net.momirealms.craftengine.core.plugin.CraftEngine; +import net.momirealms.craftengine.core.registry.BuiltInRegistries; +import net.momirealms.craftengine.core.registry.Holder; +import net.momirealms.craftengine.core.util.Key; +import net.momirealms.craftengine.core.util.MiscUtils; +import org.jetbrains.annotations.NotNull; + +import java.util.*; + +public class CustomBlastingRecipe extends CustomCookingRecipe { + public static final Factory FACTORY = new Factory<>(); + + public CustomBlastingRecipe(Key id, CookingRecipeCategory category, String group, Ingredient ingredient, int cookingTime, float experience, CustomRecipeResult result) { + super(id, category, group, ingredient, cookingTime, experience, result); + } + + @Override + public @NotNull Key type() { + return RecipeTypes.BLASTING; + } + + public static class Factory implements RecipeFactory> { + + @SuppressWarnings({"unchecked", "rawtypes", "DuplicatedCode"}) + @Override + public Recipe> create(Key id, Map arguments) { + CookingRecipeCategory recipeCategory = arguments.containsKey("category") ? CookingRecipeCategory.valueOf(arguments.get("category").toString().toUpperCase(Locale.ENGLISH)) : null; + String group = arguments.containsKey("group") ? arguments.get("group").toString() : null; + int cookingTime = MiscUtils.getAsInt(arguments.getOrDefault("time", 80)); + float experience = MiscUtils.getAsFloat(arguments.getOrDefault("experience", 0.0f)); + List items = MiscUtils.getAsStringList(arguments.get("ingredient")); + Set> holders = new HashSet<>(); + for (String item : items) { + if (item.charAt(0) == '#') { + holders.addAll(CraftEngine.instance().itemManager().tagToItems(Key.of(item.substring(1)))); + } else { + holders.add(BuiltInRegistries.OPTIMIZED_ITEM_ID.get(Key.of(item)).orElseThrow(() -> new IllegalArgumentException("Invalid vanilla/custom item: " + item))); + } + } + return new CustomBlastingRecipe( + id, + recipeCategory, + group, + Ingredient.of(holders), + cookingTime, + experience, + parseResult(arguments) + ); + } + } +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/item/recipe/CustomCampfireRecipe.java b/core/src/main/java/net/momirealms/craftengine/core/item/recipe/CustomCampfireRecipe.java new file mode 100644 index 000000000..7045774fb --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/item/recipe/CustomCampfireRecipe.java @@ -0,0 +1,53 @@ +package net.momirealms.craftengine.core.item.recipe; + +import net.momirealms.craftengine.core.plugin.CraftEngine; +import net.momirealms.craftengine.core.registry.BuiltInRegistries; +import net.momirealms.craftengine.core.registry.Holder; +import net.momirealms.craftengine.core.util.Key; +import net.momirealms.craftengine.core.util.MiscUtils; +import org.jetbrains.annotations.NotNull; + +import java.util.*; + +public class CustomCampfireRecipe extends CustomCookingRecipe { + public static final Factory FACTORY = new Factory<>(); + + public CustomCampfireRecipe(Key id, CookingRecipeCategory category, String group, Ingredient ingredient, int cookingTime, float experience, CustomRecipeResult result) { + super(id, category, group, ingredient, cookingTime, experience, result); + } + + @Override + public @NotNull Key type() { + return RecipeTypes.CAMPFIRE_COOKING; + } + + public static class Factory implements RecipeFactory> { + + @SuppressWarnings({"unchecked", "rawtypes", "DuplicatedCode"}) + @Override + public Recipe> create(Key id, Map arguments) { + CookingRecipeCategory recipeCategory = arguments.containsKey("category") ? CookingRecipeCategory.valueOf(arguments.get("category").toString().toUpperCase(Locale.ENGLISH)) : null; + String group = arguments.containsKey("group") ? arguments.get("group").toString() : null; + int cookingTime = MiscUtils.getAsInt(arguments.getOrDefault("time", 80)); + float experience = MiscUtils.getAsFloat(arguments.getOrDefault("experience", 0.0f)); + List items = MiscUtils.getAsStringList(arguments.get("ingredient")); + Set> holders = new HashSet<>(); + for (String item : items) { + if (item.charAt(0) == '#') { + holders.addAll(CraftEngine.instance().itemManager().tagToItems(Key.of(item.substring(1)))); + } else { + holders.add(BuiltInRegistries.OPTIMIZED_ITEM_ID.get(Key.of(item)).orElseThrow(() -> new IllegalArgumentException("Invalid vanilla/custom item: " + item))); + } + } + return new CustomCampfireRecipe( + id, + recipeCategory, + group, + Ingredient.of(holders), + cookingTime, + experience, + parseResult(arguments) + ); + } + } +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/item/recipe/CustomCookingRecipe.java b/core/src/main/java/net/momirealms/craftengine/core/item/recipe/CustomCookingRecipe.java new file mode 100644 index 000000000..84f8ec7a8 --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/item/recipe/CustomCookingRecipe.java @@ -0,0 +1,52 @@ +package net.momirealms.craftengine.core.item.recipe; + +import net.momirealms.craftengine.core.item.recipe.input.RecipeInput; +import net.momirealms.craftengine.core.item.recipe.input.SingleItemInput; +import net.momirealms.craftengine.core.util.Key; + +public abstract class CustomCookingRecipe extends AbstractRecipe { + protected final CookingRecipeCategory category; + protected final Ingredient ingredient; + protected final float experience; + protected final int cookingTime; + + protected CustomCookingRecipe(Key id, + CookingRecipeCategory category, + String group, + Ingredient ingredient, + int cookingTime, + float experience, + CustomRecipeResult result) { + super(id, group, result); + this.category = category; + this.ingredient = ingredient; + this.experience = experience; + this.cookingTime = cookingTime; + } + + @SuppressWarnings("unchecked") + @Override + public boolean matches(RecipeInput input) { + return this.ingredient.test(((SingleItemInput) input).input()); + } + + public CookingRecipeCategory category() { + return category; + } + + public Ingredient ingredient() { + return ingredient; + } + + public CustomRecipeResult result() { + return result; + } + + public float experience() { + return experience; + } + + public int cookingTime() { + return cookingTime; + } +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/item/recipe/CustomCraftingTableRecipe.java b/core/src/main/java/net/momirealms/craftengine/core/item/recipe/CustomCraftingTableRecipe.java new file mode 100644 index 000000000..aaa19bc49 --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/item/recipe/CustomCraftingTableRecipe.java @@ -0,0 +1,16 @@ +package net.momirealms.craftengine.core.item.recipe; + +import net.momirealms.craftengine.core.util.Key; + +public abstract class CustomCraftingTableRecipe extends AbstractRecipe { + protected final CraftingRecipeCategory category; + + protected CustomCraftingTableRecipe(Key id, CraftingRecipeCategory category, String group, CustomRecipeResult result) { + super(id, group, result); + this.category = category; + } + + public CraftingRecipeCategory category() { + return category; + } +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/item/recipe/CustomRecipeResult.java b/core/src/main/java/net/momirealms/craftengine/core/item/recipe/CustomRecipeResult.java new file mode 100644 index 000000000..c09aa7c22 --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/item/recipe/CustomRecipeResult.java @@ -0,0 +1,11 @@ +package net.momirealms.craftengine.core.item.recipe; + +import net.momirealms.craftengine.core.item.BuildableItem; +import net.momirealms.craftengine.core.item.ItemBuildContext; + +public record CustomRecipeResult(BuildableItem item, int count) { + + public T buildItemStack(ItemBuildContext context) { + return item.buildItemStack(context, count); + } +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/item/recipe/CustomShapedRecipe.java b/core/src/main/java/net/momirealms/craftengine/core/item/recipe/CustomShapedRecipe.java new file mode 100644 index 000000000..509d67f68 --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/item/recipe/CustomShapedRecipe.java @@ -0,0 +1,256 @@ +package net.momirealms.craftengine.core.item.recipe; + +import net.momirealms.craftengine.core.item.recipe.input.CraftingInput; +import net.momirealms.craftengine.core.item.recipe.input.RecipeInput; +import net.momirealms.craftengine.core.plugin.CraftEngine; +import net.momirealms.craftengine.core.registry.BuiltInRegistries; +import net.momirealms.craftengine.core.registry.Holder; +import net.momirealms.craftengine.core.util.Key; +import net.momirealms.craftengine.core.util.MiscUtils; +import org.jetbrains.annotations.NotNull; + +import java.util.*; + +public class CustomShapedRecipe extends CustomCraftingTableRecipe { + public static final Factory FACTORY = new Factory>(); + private final ParsedPattern parsedPattern; + private final Pattern pattern; + + public CustomShapedRecipe(Key id, CraftingRecipeCategory category, String group, Pattern pattern, CustomRecipeResult result) { + super(id, category, group, result); + this.pattern = pattern; + this.parsedPattern = pattern.parse(); + } + + public ParsedPattern parsedPattern() { + return parsedPattern; + } + + @SuppressWarnings("unchecked") + @Override + public boolean matches(RecipeInput input) { + return this.parsedPattern.matches((CraftingInput) input); + } + + @Override + public @NotNull Key type() { + return RecipeTypes.SHAPED; + } + + public Pattern pattern() { + return pattern; + } + + public record Pattern(String[] pattern, Map> ingredients) { + + public ParsedPattern parse() { + String[] shrunk = shrink(pattern); + return new ParsedPattern<>(shrunk[0].length(), shrunk.length, + toIngredientList( + shrunk, + ingredients + )); + } + } + + public static class ParsedPattern { + private final int width; + private final int height; + private final List>> ingredients; + private final int ingredientCount; + private final boolean symmetrical; + + public ParsedPattern(int width, int height, List>> ingredients) { + this.height = height; + this.width = width; + this.ingredientCount = (int) ingredients.stream().flatMap(Optional::stream).count(); + this.symmetrical = isSymmetrical(width, height, ingredients); + this.ingredients = ingredients; + } + + public List>> ingredients() { + return ingredients; + } + + public int width() { + return width; + } + + public int height() { + return height; + } + + public boolean matches(CraftingInput input) { + if (input.ingredientCount() == this.ingredientCount) { + if (input.width() == this.width && input.height() == this.height) { + if (!this.symmetrical && this.matches(input, true)) { + return true; + } + return this.matches(input, false); + } + } + return false; + } + + private boolean matches(CraftingInput input, boolean mirrored) { + for (int i = 0; i < this.height; i++) { + for (int j = 0; j < this.width; j++) { + Optional> optional; + if (mirrored) { + optional = this.ingredients.get(this.width - j - 1 + i * this.width); + } else { + optional = this.ingredients.get(j + i * this.width); + } + OptimizedIDItem itemStack = input.getItem(j, i); + if (!Ingredient.isInstance(optional, itemStack)) { + return false; + } + } + } + return true; + } + + private static boolean isSymmetrical(int width, int height, List list) { + if (width != 1) { + int i = width / 2; + for (int j = 0; j < height; j++) { + for (int k = 0; k < i; k++) { + int l = width - 1 - k; + T o1 = list.get(k + j * width); + T o2 = list.get(l + j * width); + if (!o1.equals(o2)) { + return false; + } + } + } + } + return true; + } + } + + public static class Factory implements RecipeFactory { + + @SuppressWarnings({"unchecked", "rawtypes", "DuplicatedCode"}) + @Override + public Recipe create(Key id, Map arguments) { + List pattern = MiscUtils.getAsStringList(arguments.get("pattern")); + if (pattern.isEmpty()) { + throw new IllegalArgumentException("pattern cannot be empty"); + } + if (!validatePattern(pattern)) { + throw new IllegalArgumentException("Invalid pattern: " + pattern); + } + Map ingredientMap = MiscUtils.castToMap(arguments.get("ingredients"), true); + if (ingredientMap == null) { + throw new IllegalArgumentException("ingredients cannot be empty"); + } + CraftingRecipeCategory recipeCategory = arguments.containsKey("category") ? CraftingRecipeCategory.valueOf(arguments.get("category").toString().toUpperCase(Locale.ENGLISH)) : null; + String group = arguments.containsKey("group") ? arguments.get("group").toString() : null; + Map> ingredients = new HashMap<>(); + for (Map.Entry entry : ingredientMap.entrySet()) { + String key = entry.getKey(); + if (key.length() != 1) { + throw new IllegalArgumentException("Invalid key: " + key); + } + char ch = key.charAt(0); + List items = MiscUtils.getAsStringList(entry.getValue()); + Set> holders = new HashSet<>(); + for (String item : items) { + if (item.charAt(0) == '#') { + holders.addAll(CraftEngine.instance().itemManager().tagToItems(Key.of(item.substring(1)))); + } else { + holders.add(BuiltInRegistries.OPTIMIZED_ITEM_ID.get(Key.of(item)).orElseThrow(() -> new IllegalArgumentException("Invalid vanilla/custom item: " + item))); + } + } + ingredients.put(ch, Ingredient.of(holders)); + } + return new CustomShapedRecipe( + id, + recipeCategory, + group, + new Pattern<>(pattern.toArray(new String[0]), ingredients), + parseResult(arguments) + ); + } + + private boolean validatePattern(List pattern) { + String first = pattern.get(0); + int length = first.length(); + for (String s : pattern) { + if (s.length() != length) { + return false; + } + if (s.length() > 3) { + return false; + } + } + return pattern.size() <= 3; + } + } + + public static List>> toIngredientList(String[] pattern, Map> ingredients) { + List>> result = new ArrayList<>(); + String[] shrunkPattern = shrink(pattern); + for (String pa : shrunkPattern) { + for (int j = 0; j < pa.length(); j++) { + char ch = pa.charAt(j); + if (ch == ' ') { + result.add(Optional.empty()); + } else { + Optional> ingredient = Optional.ofNullable(ingredients.get(ch)); + if (ingredient.isEmpty()) { + throw new IllegalArgumentException("Invalid ingredient: " + ch); + } + result.add(ingredient); + } + } + } + return result; + } + + public static String[] shrink(String[] patterns) { + int minStart = Integer.MAX_VALUE; + int maxEnd = 0; + int leadingEmptyPatterns = 0; + int consecutiveEmptyPatterns = 0; + for (int i = 0; i < patterns.length; i++) { + String pattern = patterns[i]; + minStart = Math.min(minStart, firstNonSpace(pattern)); + int patternEnd = lastNonSpace(pattern); + maxEnd = Math.max(maxEnd, patternEnd); + if (patternEnd < 0) { + if (leadingEmptyPatterns == i) { + leadingEmptyPatterns++; + } + consecutiveEmptyPatterns++; + } else { + consecutiveEmptyPatterns = 0; + } + } + if (patterns.length == consecutiveEmptyPatterns) { + return new String[0]; + } else { + String[] result = new String[patterns.length - consecutiveEmptyPatterns - leadingEmptyPatterns]; + for (int j = 0; j < result.length; j++) { + result[j] = patterns[j + leadingEmptyPatterns].substring(minStart, maxEnd + 1); + } + return result; + } + } + + private static int firstNonSpace(String line) { + int index = 0; + while (index < line.length() && line.charAt(index) == ' ') { + index++; + } + return index; + } + + private static int lastNonSpace(String line) { + int index = line.length() - 1; + while (index >= 0 && line.charAt(index) == ' ') { + index--; + } + return index; + } +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/item/recipe/CustomShapelessRecipe.java b/core/src/main/java/net/momirealms/craftengine/core/item/recipe/CustomShapelessRecipe.java new file mode 100644 index 000000000..83fd18b03 --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/item/recipe/CustomShapelessRecipe.java @@ -0,0 +1,87 @@ +package net.momirealms.craftengine.core.item.recipe; + +import net.momirealms.craftengine.core.item.recipe.input.CraftingInput; +import net.momirealms.craftengine.core.item.recipe.input.RecipeInput; +import net.momirealms.craftengine.core.plugin.CraftEngine; +import net.momirealms.craftengine.core.registry.BuiltInRegistries; +import net.momirealms.craftengine.core.registry.Holder; +import net.momirealms.craftengine.core.util.Key; +import net.momirealms.craftengine.core.util.MiscUtils; +import org.jetbrains.annotations.NotNull; + +import java.util.*; + +public class CustomShapelessRecipe extends CustomCraftingTableRecipe { + public static final Factory FACTORY = new Factory<>(); + private final List> ingredients; + private final PlacementInfo placementInfo; + + public CustomShapelessRecipe(Key id, CraftingRecipeCategory category, String group, List> ingredients, CustomRecipeResult result) { + super(id, category, group, result); + this.ingredients = ingredients; + this.placementInfo = PlacementInfo.create(ingredients); + } + + public PlacementInfo placementInfo() { + return placementInfo; + } + + public List> ingredients() { + return ingredients; + } + + @SuppressWarnings("unchecked") + @Override + public boolean matches(RecipeInput input) { + return matches((CraftingInput) input); + } + + private boolean matches(CraftingInput input) { + if (input.ingredientCount() != this.ingredients.size()) { + return false; + } + if (input.size() == 1 && this.ingredients.size() == 1) { + return this.ingredients.get(0).test(input.getItem(0)); + } + return input.finder().canCraft(this); + } + + @Override + public @NotNull Key type() { + return RecipeTypes.SHAPELESS; + } + + public static class Factory implements RecipeFactory { + + @SuppressWarnings({"unchecked", "rawtypes", "DuplicatedCode"}) + @Override + public Recipe create(Key id, Map arguments) { + Map ingredientMap = MiscUtils.castToMap(arguments.get("ingredients"), true); + if (ingredientMap == null) { + throw new IllegalArgumentException("ingredients cannot be empty"); + } + CraftingRecipeCategory recipeCategory = arguments.containsKey("category") ? CraftingRecipeCategory.valueOf(arguments.get("category").toString().toUpperCase(Locale.ENGLISH)) : null; + String group = arguments.containsKey("group") ? arguments.get("group").toString() : null; + List> ingredients = new ArrayList<>(); + for (Map.Entry entry : ingredientMap.entrySet()) { + List items = MiscUtils.getAsStringList(entry.getValue()); + Set> holders = new HashSet<>(); + for (String item : items) { + if (item.charAt(0) == '#') { + holders.addAll(CraftEngine.instance().itemManager().tagToItems(Key.of(item.substring(1)))); + } else { + holders.add(BuiltInRegistries.OPTIMIZED_ITEM_ID.get(Key.of(item)).orElseThrow(() -> new IllegalArgumentException("Invalid vanilla/custom item: " + item))); + } + } + ingredients.add(Ingredient.of(holders)); + } + return new CustomShapelessRecipe( + id, + recipeCategory, + group, + ingredients, + parseResult(arguments) + ); + } + } +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/item/recipe/CustomSmeltingRecipe.java b/core/src/main/java/net/momirealms/craftengine/core/item/recipe/CustomSmeltingRecipe.java new file mode 100644 index 000000000..dbc3c5039 --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/item/recipe/CustomSmeltingRecipe.java @@ -0,0 +1,53 @@ +package net.momirealms.craftengine.core.item.recipe; + +import net.momirealms.craftengine.core.plugin.CraftEngine; +import net.momirealms.craftengine.core.registry.BuiltInRegistries; +import net.momirealms.craftengine.core.registry.Holder; +import net.momirealms.craftengine.core.util.Key; +import net.momirealms.craftengine.core.util.MiscUtils; +import org.jetbrains.annotations.NotNull; + +import java.util.*; + +public class CustomSmeltingRecipe extends CustomCookingRecipe { + public static final Factory FACTORY = new Factory<>(); + + public CustomSmeltingRecipe(Key id, CookingRecipeCategory category, String group, Ingredient ingredient, int cookingTime, float experience, CustomRecipeResult result) { + super(id, category, group, ingredient, cookingTime, experience, result); + } + + @Override + public @NotNull Key type() { + return RecipeTypes.SMELTING; + } + + public static class Factory implements RecipeFactory> { + + @SuppressWarnings({"unchecked", "rawtypes", "DuplicatedCode"}) + @Override + public Recipe> create(Key id, Map arguments) { + CookingRecipeCategory recipeCategory = arguments.containsKey("category") ? CookingRecipeCategory.valueOf(arguments.get("category").toString().toUpperCase(Locale.ENGLISH)) : null; + String group = arguments.containsKey("group") ? arguments.get("group").toString() : null; + int cookingTime = MiscUtils.getAsInt(arguments.getOrDefault("time", 80)); + float experience = MiscUtils.getAsFloat(arguments.getOrDefault("experience", 0.0f)); + List items = MiscUtils.getAsStringList(arguments.get("ingredient")); + Set> holders = new HashSet<>(); + for (String item : items) { + if (item.charAt(0) == '#') { + holders.addAll(CraftEngine.instance().itemManager().tagToItems(Key.of(item.substring(1)))); + } else { + holders.add(BuiltInRegistries.OPTIMIZED_ITEM_ID.get(Key.of(item)).orElseThrow(() -> new IllegalArgumentException("Invalid vanilla/custom item: " + item))); + } + } + return new CustomSmeltingRecipe( + id, + recipeCategory, + group, + Ingredient.of(holders), + cookingTime, + experience, + parseResult(arguments) + ); + } + } +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/item/recipe/CustomSmokingRecipe.java b/core/src/main/java/net/momirealms/craftengine/core/item/recipe/CustomSmokingRecipe.java new file mode 100644 index 000000000..bb243c90d --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/item/recipe/CustomSmokingRecipe.java @@ -0,0 +1,53 @@ +package net.momirealms.craftengine.core.item.recipe; + +import net.momirealms.craftengine.core.plugin.CraftEngine; +import net.momirealms.craftengine.core.registry.BuiltInRegistries; +import net.momirealms.craftengine.core.registry.Holder; +import net.momirealms.craftengine.core.util.Key; +import net.momirealms.craftengine.core.util.MiscUtils; +import org.jetbrains.annotations.NotNull; + +import java.util.*; + +public class CustomSmokingRecipe extends CustomCookingRecipe { + public static final Factory FACTORY = new Factory<>(); + + public CustomSmokingRecipe(Key id, CookingRecipeCategory category, String group, Ingredient ingredient, int cookingTime, float experience, CustomRecipeResult result) { + super(id, category, group, ingredient, cookingTime, experience, result); + } + + @Override + public @NotNull Key type() { + return RecipeTypes.SMOKING; + } + + public static class Factory implements RecipeFactory> { + + @SuppressWarnings({"unchecked", "rawtypes", "DuplicatedCode"}) + @Override + public Recipe> create(Key id, Map arguments) { + CookingRecipeCategory recipeCategory = arguments.containsKey("category") ? CookingRecipeCategory.valueOf(arguments.get("category").toString().toUpperCase(Locale.ENGLISH)) : null; + String group = arguments.containsKey("group") ? arguments.get("group").toString() : null; + int cookingTime = MiscUtils.getAsInt(arguments.getOrDefault("time", 80)); + float experience = MiscUtils.getAsFloat(arguments.getOrDefault("experience", 0.0f)); + List items = MiscUtils.getAsStringList(arguments.get("ingredient")); + Set> holders = new HashSet<>(); + for (String item : items) { + if (item.charAt(0) == '#') { + holders.addAll(CraftEngine.instance().itemManager().tagToItems(Key.of(item.substring(1)))); + } else { + holders.add(BuiltInRegistries.OPTIMIZED_ITEM_ID.get(Key.of(item)).orElseThrow(() -> new IllegalArgumentException("Invalid vanilla/custom item: " + item))); + } + } + return new CustomSmokingRecipe( + id, + recipeCategory, + group, + Ingredient.of(holders), + cookingTime, + experience, + parseResult(arguments) + ); + } + } +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/item/recipe/CustomStoneCuttingRecipe.java b/core/src/main/java/net/momirealms/craftengine/core/item/recipe/CustomStoneCuttingRecipe.java new file mode 100644 index 000000000..0a10b1dbd --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/item/recipe/CustomStoneCuttingRecipe.java @@ -0,0 +1,64 @@ +package net.momirealms.craftengine.core.item.recipe; + +import net.momirealms.craftengine.core.item.recipe.input.RecipeInput; +import net.momirealms.craftengine.core.item.recipe.input.SingleItemInput; +import net.momirealms.craftengine.core.plugin.CraftEngine; +import net.momirealms.craftengine.core.registry.BuiltInRegistries; +import net.momirealms.craftengine.core.registry.Holder; +import net.momirealms.craftengine.core.util.Key; +import net.momirealms.craftengine.core.util.MiscUtils; +import org.jetbrains.annotations.NotNull; + +import java.util.HashSet; +import java.util.List; +import java.util.Map; +import java.util.Set; + +public class CustomStoneCuttingRecipe extends AbstractRecipe { + public static final Factory FACTORY = new Factory<>(); + protected final Ingredient ingredient; + + public CustomStoneCuttingRecipe(Key id, String group, Ingredient ingredient, CustomRecipeResult result) { + super(id, group, result); + this.ingredient = ingredient; + } + + @SuppressWarnings("unchecked") + @Override + public boolean matches(RecipeInput input) { + return this.ingredient.test(((SingleItemInput) input).input()); + } + + @Override + public @NotNull Key type() { + return RecipeTypes.STONE_CUTTING; + } + + public Ingredient ingredient() { + return ingredient; + } + + public static class Factory implements RecipeFactory { + + @SuppressWarnings({"DuplicatedCode"}) + @Override + public Recipe create(Key id, Map arguments) { + String group = arguments.containsKey("group") ? arguments.get("group").toString() : null; + List items = MiscUtils.getAsStringList(arguments.get("ingredient")); + Set> holders = new HashSet<>(); + for (String item : items) { + if (item.charAt(0) == '#') { + holders.addAll(CraftEngine.instance().itemManager().tagToItems(Key.of(item.substring(1)))); + } else { + holders.add(BuiltInRegistries.OPTIMIZED_ITEM_ID.get(Key.of(item)).orElseThrow(() -> new IllegalArgumentException("Invalid vanilla/custom item: " + item))); + } + } + return new CustomStoneCuttingRecipe<>( + id, + group, + Ingredient.of(holders), + parseResult(arguments) + ); + } + } +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/item/recipe/Ingredient.java b/core/src/main/java/net/momirealms/craftengine/core/item/recipe/Ingredient.java new file mode 100644 index 000000000..dac02bfb9 --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/item/recipe/Ingredient.java @@ -0,0 +1,62 @@ +package net.momirealms.craftengine.core.item.recipe; + +import net.momirealms.craftengine.core.registry.Holder; +import net.momirealms.craftengine.core.util.Key; + +import java.util.*; +import java.util.function.Predicate; + +public class Ingredient implements Predicate>, StackedContents.IngredientInfo> { + private final List> items; + + public Ingredient(List> items) { + this.items = items; + } + + public static boolean isInstance(Optional> optionalIngredient, OptimizedIDItem stack) { + return optionalIngredient.map((ingredient) -> ingredient.test(stack)) + .orElseGet(stack::isEmpty); + } + + public static Ingredient of(List> items) { + return new Ingredient<>(items); + } + + public static Ingredient of(Set> items) { + return new Ingredient<>(new ArrayList<>(items)); + } + + @Override + public boolean test(OptimizedIDItem optimizedIDItem) { + for (Holder item : this.items()) { + if (optimizedIDItem.is(item)) { + return true; + } + } + return false; + } + + public List> items() { + return this.items; + } + + @Override + public String toString() { + StringJoiner joiner = new StringJoiner(", "); + for (Holder item : this.items()) { + joiner.add(item.toString()); + } + return "Ingredient: [" + joiner + "]"; + } + + public boolean isEmpty() { + return this.items().isEmpty(); + } + + @Override + public boolean acceptsItem(Holder entry) { + return this.items.contains(entry); + } +} + + diff --git a/core/src/main/java/net/momirealms/craftengine/core/item/recipe/OptimizedIDItem.java b/core/src/main/java/net/momirealms/craftengine/core/item/recipe/OptimizedIDItem.java new file mode 100644 index 000000000..fc899ff76 --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/item/recipe/OptimizedIDItem.java @@ -0,0 +1,37 @@ +package net.momirealms.craftengine.core.item.recipe; + +import net.momirealms.craftengine.core.registry.Holder; +import net.momirealms.craftengine.core.util.Key; + +public class OptimizedIDItem { + private final T rawItem; + private final Holder idHolder; + + public OptimizedIDItem(Holder idHolder, T rawItem) { + this.idHolder = idHolder; + this.rawItem = rawItem; + } + + public Holder id() { + return idHolder; + } + + public T rawItem() { + return rawItem; + } + + public boolean is(Holder id) { + return idHolder == id; + } + + public boolean isEmpty() { + return idHolder == null; + } + + @Override + public String toString() { + return "OptimizedIDItem{" + + "idHolder=" + idHolder + + '}'; + } +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/item/recipe/PlacementInfo.java b/core/src/main/java/net/momirealms/craftengine/core/item/recipe/PlacementInfo.java new file mode 100644 index 000000000..69b8f6b43 --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/item/recipe/PlacementInfo.java @@ -0,0 +1,37 @@ +package net.momirealms.craftengine.core.item.recipe; + +import it.unimi.dsi.fastutil.ints.IntArrayList; +import it.unimi.dsi.fastutil.ints.IntList; + +import java.util.List; + +public class PlacementInfo { + private final List> ingredients; + private final IntList slotsToIngredientIndex; + + private PlacementInfo(List> ingredients, IntList placementSlots) { + this.ingredients = ingredients; + this.slotsToIngredientIndex = placementSlots; + } + + public static PlacementInfo create(List> ingredients) { + int i = ingredients.size(); + IntList intList = new IntArrayList(i); + for (int j = 0; j < i; j++) { + Ingredient ingredient = ingredients.get(j); + if (ingredient.isEmpty()) { + return new PlacementInfo<>(List.of(), IntList.of()); + } + intList.add(j); + } + return new PlacementInfo<>(ingredients, intList); + } + + public List> ingredients() { + return this.ingredients; + } + + public boolean isImpossibleToPlace() { + return this.slotsToIngredientIndex.isEmpty(); + } +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/item/recipe/Recipe.java b/core/src/main/java/net/momirealms/craftengine/core/item/recipe/Recipe.java new file mode 100644 index 000000000..c3e835ca5 --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/item/recipe/Recipe.java @@ -0,0 +1,24 @@ +package net.momirealms.craftengine.core.item.recipe; + +import net.momirealms.craftengine.core.item.ItemBuildContext; +import net.momirealms.craftengine.core.item.recipe.input.RecipeInput; +import net.momirealms.craftengine.core.util.Key; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +public interface Recipe { + + boolean matches(RecipeInput input); + + T result(ItemBuildContext context); + + CustomRecipeResult result(); + + @NotNull + Key type(); + + Key id(); + + @Nullable + String group(); +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/item/recipe/RecipeFactory.java b/core/src/main/java/net/momirealms/craftengine/core/item/recipe/RecipeFactory.java new file mode 100644 index 000000000..e6092042f --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/item/recipe/RecipeFactory.java @@ -0,0 +1,29 @@ +package net.momirealms.craftengine.core.item.recipe; + +import net.momirealms.craftengine.core.plugin.CraftEngine; +import net.momirealms.craftengine.core.util.Key; +import net.momirealms.craftengine.core.util.MiscUtils; + +import java.util.Map; + +public interface RecipeFactory { + + Recipe create(Key id, Map arguments); + + @SuppressWarnings({"unchecked", "rawtypes"}) + default CustomRecipeResult parseResult(Map arguments) { + Map resultMap = MiscUtils.castToMap(arguments.get("result"), true); + if (resultMap == null) { + throw new IllegalArgumentException("result cannot be empty"); + } + String id = (String) resultMap.get("id"); + if (id == null) { + throw new IllegalArgumentException("result.id cannot be empty"); + } + int count = MiscUtils.getAsInt(resultMap.getOrDefault("count", 1)); + return new CustomRecipeResult( + CraftEngine.instance().itemManager().getBuildableItem(Key.of(id)).orElseThrow(() -> new IllegalArgumentException("Unknown recipe result item id: " + id)), + count + ); + } +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/item/recipe/RecipeFinder.java b/core/src/main/java/net/momirealms/craftengine/core/item/recipe/RecipeFinder.java new file mode 100644 index 000000000..4266cf808 --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/item/recipe/RecipeFinder.java @@ -0,0 +1,25 @@ +package net.momirealms.craftengine.core.item.recipe; + +import net.momirealms.craftengine.core.registry.Holder; +import net.momirealms.craftengine.core.util.Key; + +import java.util.List; + +public class RecipeFinder { + private final StackedContents> stackedContents = new StackedContents<>(); + + public void addInput(OptimizedIDItem item) { + if (!item.isEmpty()) { + this.stackedContents.add(item.id(), 1); + } + } + + public boolean canCraft(CustomShapelessRecipe recipe) { + PlacementInfo placementInfo = recipe.placementInfo(); + return !placementInfo.isImpossibleToPlace() && canCraft(placementInfo.ingredients()); + } + + private boolean canCraft(List>> rawIngredients) { + return this.stackedContents.tryPick(rawIngredients); + } +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/item/recipe/RecipeManager.java b/core/src/main/java/net/momirealms/craftengine/core/item/recipe/RecipeManager.java new file mode 100644 index 000000000..f84742cf5 --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/item/recipe/RecipeManager.java @@ -0,0 +1,43 @@ +package net.momirealms.craftengine.core.item.recipe; + +import net.momirealms.craftengine.core.item.recipe.input.RecipeInput; +import net.momirealms.craftengine.core.pack.LoadingSequence; +import net.momirealms.craftengine.core.plugin.Reloadable; +import net.momirealms.craftengine.core.plugin.config.ConfigSectionParser; +import net.momirealms.craftengine.core.util.Key; +import org.jetbrains.annotations.Nullable; + +import java.util.List; +import java.util.Optional; +import java.util.concurrent.CompletableFuture; + +public interface RecipeManager extends Reloadable, ConfigSectionParser { + String CONFIG_SECTION_NAME = "recipes"; + + default String sectionId() { + return CONFIG_SECTION_NAME; + } + + boolean isDataPackRecipe(Key key); + + boolean isCustomRecipe(Key key); + + Optional> getRecipeById(Key id); + + List> getRecipes(Key type); + + List> getRecipeByResult(Key result); + + @Nullable + Recipe getRecipe(Key type, RecipeInput input); + + @Nullable Recipe getRecipe(Key type, RecipeInput input, @Nullable Key lastRecipe); + + CompletableFuture delayedLoad(); + + void delayedInit(); + + default int loadingSequence() { + return LoadingSequence.RECIPE; + } +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/item/recipe/RecipeTypes.java b/core/src/main/java/net/momirealms/craftengine/core/item/recipe/RecipeTypes.java new file mode 100644 index 000000000..e350f5111 --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/item/recipe/RecipeTypes.java @@ -0,0 +1,50 @@ +package net.momirealms.craftengine.core.item.recipe; + +import net.momirealms.craftengine.core.registry.BuiltInRegistries; +import net.momirealms.craftengine.core.registry.Holder; +import net.momirealms.craftengine.core.registry.Registries; +import net.momirealms.craftengine.core.registry.WritableRegistry; +import net.momirealms.craftengine.core.util.Key; +import net.momirealms.craftengine.core.util.ResourceKey; + +import java.util.Map; + +public class RecipeTypes { + public static final Key SHAPED = Key.of("minecraft:shaped"); + public static final Key SHAPELESS = Key.of("minecraft:shapeless"); + public static final Key SMELTING = Key.of("minecraft:smelting"); + public static final Key BLASTING = Key.of("minecraft:blasting"); + public static final Key SMOKING = Key.of("minecraft:smoking"); + public static final Key CAMPFIRE_COOKING = Key.of("minecraft:campfire_cooking"); + public static final Key STONE_CUTTING = Key.of("minecraft:stone_cutting"); + + static { + register(SHAPED, CustomShapedRecipe.FACTORY); + register(SHAPELESS, CustomShapelessRecipe.FACTORY); + register(SMELTING, CustomSmeltingRecipe.FACTORY); + register(SMOKING, CustomSmokingRecipe.FACTORY); + register(BLASTING, CustomBlastingRecipe.FACTORY); + register(CAMPFIRE_COOKING, CustomCampfireRecipe.FACTORY); + register(STONE_CUTTING, CustomStoneCuttingRecipe.FACTORY); + } + + public static void register(Key key, RecipeFactory factory) { + Holder.Reference> holder = ((WritableRegistry>) BuiltInRegistries.RECIPE_FACTORY) + .registerForHolder(new ResourceKey<>(Registries.RECIPE_FACTORY.location(), key)); + holder.bindValue(factory); + } + + @SuppressWarnings("unchecked") + public static Recipe fromMap(Key id, Map map) { + String type = (String) map.get("type"); + if (type == null) { + throw new NullPointerException("recipe type cannot be null"); + } + Key key = Key.withDefaultNamespace(type, "minecraft"); + RecipeFactory factory = (RecipeFactory) BuiltInRegistries.RECIPE_FACTORY.getValue(key); + if (factory == null) { + throw new IllegalArgumentException("Unknown recipe type: " + type); + } + return factory.create(id, map); + } +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/item/recipe/StackedContents.java b/core/src/main/java/net/momirealms/craftengine/core/item/recipe/StackedContents.java new file mode 100644 index 000000000..c6a483ac6 --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/item/recipe/StackedContents.java @@ -0,0 +1,330 @@ +package net.momirealms.craftengine.core.item.recipe; + +import it.unimi.dsi.fastutil.ints.IntArrayList; +import it.unimi.dsi.fastutil.ints.IntList; +import it.unimi.dsi.fastutil.objects.Reference2IntMap; +import it.unimi.dsi.fastutil.objects.Reference2IntOpenHashMap; + +import javax.annotation.Nullable; +import java.util.ArrayList; +import java.util.BitSet; +import java.util.List; + +public class StackedContents { + public final Reference2IntOpenHashMap amounts = new Reference2IntOpenHashMap<>(); + + public void add(T input, int count) { + this.amounts.addTo(input, count); + } + + void take(T input, int count) { + int i = this.amounts.addTo(input, -count); + if (i < count) { + throw new IllegalStateException("Took " + count + " items, but only had " + i); + } + } + + void put(T input, int count) { + this.amounts.addTo(input, count); + } + + boolean hasAtLeast(T input, int minimum) { + return this.amounts.getInt(input) >= minimum; + } + + public boolean tryPick(List> ingredients) { + return new Matcher(ingredients).tryPick(1); + } + + @FunctionalInterface + public interface IngredientInfo { + boolean acceptsItem(T entry); + } + + @FunctionalInterface + public interface Output { + void accept(T item); + } + + List getUniqueAvailableIngredientItems(List> ingredients) { + List list = new ArrayList<>(); + for (Reference2IntMap.Entry entry : amounts.reference2IntEntrySet()) { + if (entry.getIntValue() > 0 && anyIngredientMatches(ingredients, entry.getKey())) { + list.add(entry.getKey()); + } + } + return list; + } + + private static boolean anyIngredientMatches(Iterable> ingredients, T item) { + for (IngredientInfo ingredientInfo : ingredients) { + if (ingredientInfo.acceptsItem(item)) { + return true; + } + } + return false; + } + + public class Matcher { + private final List> ingredients; + private final int ingredientCount; + private final List items; + private final int itemCount; + private final BitSet data; + private final IntList path = new IntArrayList(); + + public Matcher(List> ingredients) { + this.ingredients = ingredients; + this.ingredientCount = ingredients.size(); + this.items = getUniqueAvailableIngredientItems(ingredients); + this.itemCount = this.items.size(); + this.data = new BitSet(this.visitedIngredientCount() + this.visitedItemCount() + this.satisfiedCount() + this.connectionCount() + this.residualCount()); + this.setInitialConnections(); + } + + private void setInitialConnections() { + for (int i = 0; i < this.ingredientCount; i++) { + IngredientInfo ingredientInfo = this.ingredients.get(i); + for (int j = 0; j < this.itemCount; j++) { + if (ingredientInfo.acceptsItem(this.items.get(j))) { + this.setConnection(j, i); + } + } + } + } + + @Nullable + private IntList tryAssigningNewItem(int min) { + this.clearAllVisited(); + for (int i = 0; i < this.itemCount; i++) { + if (hasAtLeast(this.items.get(i), min)) { + IntList intList = this.findNewItemAssignmentPath(i); + if (intList != null) { + return intList; + } + } + } + return null; + } + + @Nullable + private IntList findNewItemAssignmentPath(int itemIndex) { + this.path.clear(); + this.visitItem(itemIndex); + this.path.add(itemIndex); + + while (!this.path.isEmpty()) { + int currentPathSize = this.path.size(); + if (isPathIndexItem(currentPathSize - 1)) { + int currentItem = this.path.getInt(currentPathSize - 1); + for (int ingredientIndex = 0; ingredientIndex < this.ingredientCount; ingredientIndex++) { + if (!this.hasVisitedIngredient(ingredientIndex) && + this.hasConnection(currentItem, ingredientIndex) && + !this.isAssigned(currentItem, ingredientIndex)) { + this.visitIngredient(ingredientIndex); + this.path.add(ingredientIndex); + break; + } + } + } else { + int currentIngredient = this.path.getInt(currentPathSize - 1); + if (!this.isSatisfied(currentIngredient)) { + return this.path; + } + for (int itemIndexCandidate = 0; itemIndexCandidate < this.itemCount; itemIndexCandidate++) { + if (!this.hasVisitedItem(itemIndexCandidate) && + this.isAssigned(itemIndexCandidate, currentIngredient)) { + assert this.hasConnection(itemIndexCandidate, currentIngredient); + + this.visitItem(itemIndexCandidate); + this.path.add(itemIndexCandidate); + break; + } + } + } + int newPathSize = this.path.size(); + if (newPathSize == currentPathSize) { + this.path.removeInt(newPathSize - 1); + } + } + return null; + } + + public boolean tryPick(int quantity) { + int assignedIngredientsCount = 0; + while (true) { + IntList assignmentPath = this.tryAssigningNewItem(quantity); + if (assignmentPath == null) { + boolean allIngredientsTried = assignedIngredientsCount == this.ingredientCount; + this.clearAllVisited(); + this.clearSatisfied(); + + for (int ingredientIndex = 0; ingredientIndex < this.ingredientCount; ingredientIndex++) { + for (int itemIndex = 0; itemIndex < this.itemCount; itemIndex++) { + if (this.isAssigned(itemIndex, ingredientIndex)) { + this.unassign(itemIndex, ingredientIndex); + StackedContents.this.put(this.items.get(itemIndex), quantity); + break; + } + } + } + + assert this.data.get(this.residualOffset(), this.residualOffset() + this.residualCount()).isEmpty(); + return allIngredientsTried; + } + + int firstItemIndex = assignmentPath.getInt(0); + StackedContents.this.take(this.items.get(firstItemIndex), quantity); + + int lastIngredientIndex = assignmentPath.size() - 1; + this.setSatisfied(assignmentPath.getInt(lastIngredientIndex)); + assignedIngredientsCount++; + + for (int pathIndex = 0; pathIndex < assignmentPath.size() - 1; pathIndex++) { + if (isPathIndexItem(pathIndex)) { + int itemIndex = assignmentPath.getInt(pathIndex); + int ingredientIndex = assignmentPath.getInt(pathIndex + 1); + this.assign(itemIndex, ingredientIndex); + } else { + int ingredientIndex = assignmentPath.getInt(pathIndex + 1); + int itemIndex = assignmentPath.getInt(pathIndex); + this.unassign(itemIndex, ingredientIndex); + } + } + } + } + + private static boolean isPathIndexItem(int index) { + return (index & 1) == 0; + } + + private int visitedIngredientOffset() { + return 0; + } + + private int visitedIngredientCount() { + return this.ingredientCount; + } + + private int visitedItemOffset() { + return this.visitedIngredientOffset() + this.visitedIngredientCount(); + } + + private int visitedItemCount() { + return this.itemCount; + } + + private int satisfiedOffset() { + return this.visitedItemOffset() + this.visitedItemCount(); + } + + private int satisfiedCount() { + return this.ingredientCount; + } + + private int connectionOffset() { + return this.satisfiedOffset() + this.satisfiedCount(); + } + + private int connectionCount() { + return this.ingredientCount * this.itemCount; + } + + private int residualOffset() { + return this.connectionOffset() + this.connectionCount(); + } + + private int residualCount() { + return this.ingredientCount * this.itemCount; + } + + private boolean isSatisfied(int itemId) { + return this.data.get(this.getSatisfiedIndex(itemId)); + } + + private void setSatisfied(int itemId) { + this.data.set(this.getSatisfiedIndex(itemId)); + } + + private int getSatisfiedIndex(int itemId) { + assert itemId >= 0 && itemId < this.ingredientCount; + + return this.satisfiedOffset() + itemId; + } + + private void clearSatisfied() { + this.clearRange(this.satisfiedOffset(), this.satisfiedCount()); + } + + private void setConnection(int itemIndex, int ingredientIndex) { + this.data.set(this.getConnectionIndex(itemIndex, ingredientIndex)); + } + + private boolean hasConnection(int itemIndex, int ingredientIndex) { + return this.data.get(this.getConnectionIndex(itemIndex, ingredientIndex)); + } + + private int getConnectionIndex(int itemIndex, int ingredientIndex) { + assert itemIndex >= 0 && itemIndex < this.itemCount; + assert ingredientIndex >= 0 && ingredientIndex < this.ingredientCount; + return this.connectionOffset() + itemIndex * this.ingredientCount + ingredientIndex; + } + + private boolean isAssigned(int itemIndex, int ingredientIndex) { + return this.data.get(this.getResidualIndex(itemIndex, ingredientIndex)); + } + + private void assign(int itemIndex, int ingredientIndex) { + int i = this.getResidualIndex(itemIndex, ingredientIndex); + assert !this.data.get(i); + this.data.set(i); + } + + private void unassign(int itemIndex, int ingredientIndex) { + int i = this.getResidualIndex(itemIndex, ingredientIndex); + assert this.data.get(i); + this.data.clear(i); + } + + private int getResidualIndex(int itemIndex, int ingredientIndex) { + assert itemIndex >= 0 && itemIndex < this.itemCount; + assert ingredientIndex >= 0 && ingredientIndex < this.ingredientCount; + return this.residualOffset() + itemIndex * this.ingredientCount + ingredientIndex; + } + + private void visitIngredient(int index) { + this.data.set(this.getVisitedIngredientIndex(index)); + } + + private boolean hasVisitedIngredient(int index) { + return this.data.get(this.getVisitedIngredientIndex(index)); + } + + private int getVisitedIngredientIndex(int index) { + assert index >= 0 && index < this.ingredientCount; + return this.visitedIngredientOffset() + index; + } + + private void visitItem(int index) { + this.data.set(this.getVisitedItemIndex(index)); + } + + private boolean hasVisitedItem(int index) { + return this.data.get(this.getVisitedItemIndex(index)); + } + + private int getVisitedItemIndex(int index) { + assert index >= 0 && index < this.itemCount; + return this.visitedItemOffset() + index; + } + + private void clearAllVisited() { + this.clearRange(this.visitedIngredientOffset(), this.visitedIngredientCount()); + this.clearRange(this.visitedItemOffset(), this.visitedItemCount()); + } + + private void clearRange(int start, int offset) { + this.data.clear(start, start + offset); + } + } +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/item/recipe/input/CraftingInput.java b/core/src/main/java/net/momirealms/craftengine/core/item/recipe/input/CraftingInput.java new file mode 100644 index 000000000..80a702da1 --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/item/recipe/input/CraftingInput.java @@ -0,0 +1,102 @@ +package net.momirealms.craftengine.core.item.recipe.input; + +import net.momirealms.craftengine.core.item.recipe.OptimizedIDItem; +import net.momirealms.craftengine.core.item.recipe.RecipeFinder; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; + +public class CraftingInput implements RecipeInput { + private final int width; + private final int height; + private final List> items; + private final int ingredientCount; + private final RecipeFinder finder = new RecipeFinder(); + + private CraftingInput(int width, int height, List> items) { + this.height = height; + this.width = width; + this.items = items; + int i = 0; + for (OptimizedIDItem item : items) { + if (!item.isEmpty()) { + i++; + this.finder.addInput(item); + } + } + this.ingredientCount = i; + } + + public RecipeFinder finder() { + return finder; + } + + public static CraftingInput of(int width, int height, List> stacks) { + if (width <= 0 || height <= 0) { + return new CraftingInput<>(0, 0, Collections.emptyList()); + } + + int minCol = width; + int maxCol = -1; + int minRow = height; + int maxRow = -1; + + for (int index = 0; index < width * height; index++) { + OptimizedIDItem item = stacks.get(index); + if (!item.isEmpty()) { + int row = index / width; + int col = index % width; + minCol = Math.min(minCol, col); + maxCol = Math.max(maxCol, col); + minRow = Math.min(minRow, row); + maxRow = Math.max(maxRow, row); + } + } + + if (maxCol < minCol) { + return new CraftingInput<>(0, 0, Collections.emptyList()); + } + + int newWidth = maxCol - minCol + 1; + int newHeight = maxRow - minRow + 1; + + if (newWidth == width && newHeight == height) { + return new CraftingInput<>(width, height, stacks); + } + + List> trimmed = new ArrayList<>(newWidth * newHeight); + for (int row = minRow; row <= maxRow; row++) { + for (int col = minCol; col <= maxCol; col++) { + int originalIndex = col + row * width; + trimmed.add(stacks.get(originalIndex)); + } + } + + return new CraftingInput<>(newWidth, newHeight, trimmed); + } + + public int ingredientCount() { + return ingredientCount; + } + + public int width() { + return width; + } + + public int height() { + return height; + } + + public int size() { + return items.size(); + } + + public OptimizedIDItem getItem(int x, int y) { + return this.items.get(x + y * width); + } + + public OptimizedIDItem getItem(int index) { + return this.items.get(index); + } +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/item/recipe/input/RecipeInput.java b/core/src/main/java/net/momirealms/craftengine/core/item/recipe/input/RecipeInput.java new file mode 100644 index 000000000..e067a35f5 --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/item/recipe/input/RecipeInput.java @@ -0,0 +1,4 @@ +package net.momirealms.craftengine.core.item.recipe.input; + +public interface RecipeInput { +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/item/recipe/input/SingleItemInput.java b/core/src/main/java/net/momirealms/craftengine/core/item/recipe/input/SingleItemInput.java new file mode 100644 index 000000000..c706c38d0 --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/item/recipe/input/SingleItemInput.java @@ -0,0 +1,6 @@ +package net.momirealms.craftengine.core.item.recipe.input; + +import net.momirealms.craftengine.core.item.recipe.OptimizedIDItem; + +public record SingleItemInput(OptimizedIDItem input) implements RecipeInput { +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/item/recipe/vanilla/RecipeResult.java b/core/src/main/java/net/momirealms/craftengine/core/item/recipe/vanilla/RecipeResult.java new file mode 100644 index 000000000..a00730bb0 --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/item/recipe/vanilla/RecipeResult.java @@ -0,0 +1,10 @@ +package net.momirealms.craftengine.core.item.recipe.vanilla; + +import com.google.gson.JsonObject; + +public record RecipeResult(String id, int count, JsonObject components) { + + public boolean isCustom() { + return components != null; + } +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/item/recipe/vanilla/VanillaBlastingRecipe.java b/core/src/main/java/net/momirealms/craftengine/core/item/recipe/vanilla/VanillaBlastingRecipe.java new file mode 100644 index 000000000..9e6775d69 --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/item/recipe/vanilla/VanillaBlastingRecipe.java @@ -0,0 +1,12 @@ +package net.momirealms.craftengine.core.item.recipe.vanilla; + +import net.momirealms.craftengine.core.item.recipe.CookingRecipeCategory; + +import java.util.List; + +public class VanillaBlastingRecipe extends VanillaCookingRecipe { + + public VanillaBlastingRecipe(CookingRecipeCategory category, String group, RecipeResult result, List ingredient, float experience, int cookingTime) { + super(category, group, result, ingredient, experience, cookingTime); + } +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/item/recipe/vanilla/VanillaCampfireRecipe.java b/core/src/main/java/net/momirealms/craftengine/core/item/recipe/vanilla/VanillaCampfireRecipe.java new file mode 100644 index 000000000..b2d8cae30 --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/item/recipe/vanilla/VanillaCampfireRecipe.java @@ -0,0 +1,12 @@ +package net.momirealms.craftengine.core.item.recipe.vanilla; + +import net.momirealms.craftengine.core.item.recipe.CookingRecipeCategory; + +import java.util.List; + +public class VanillaCampfireRecipe extends VanillaCookingRecipe { + + public VanillaCampfireRecipe(CookingRecipeCategory category, String group, RecipeResult result, List ingredient, float experience, int cookingTime) { + super(category, group, result, ingredient, experience, cookingTime); + } +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/item/recipe/vanilla/VanillaCookingRecipe.java b/core/src/main/java/net/momirealms/craftengine/core/item/recipe/vanilla/VanillaCookingRecipe.java new file mode 100644 index 000000000..594d372ac --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/item/recipe/vanilla/VanillaCookingRecipe.java @@ -0,0 +1,36 @@ +package net.momirealms.craftengine.core.item.recipe.vanilla; + +import net.momirealms.craftengine.core.item.recipe.CookingRecipeCategory; + +import java.util.List; + +public abstract class VanillaCookingRecipe extends VanillaRecipe { + protected final List ingredient; + protected final CookingRecipeCategory category; + protected final float experience; + protected final int cookingTime; + + protected VanillaCookingRecipe(CookingRecipeCategory category, String group, RecipeResult result, List ingredient, float experience, int cookingTime) { + super(group, result); + this.ingredient = ingredient; + this.experience = experience; + this.cookingTime = cookingTime; + this.category = category; + } + + public CookingRecipeCategory category() { + return category; + } + + public List ingredient() { + return ingredient; + } + + public float experience() { + return experience; + } + + public int cookingTime() { + return cookingTime; + } +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/item/recipe/vanilla/VanillaCraftingRecipe.java b/core/src/main/java/net/momirealms/craftengine/core/item/recipe/vanilla/VanillaCraftingRecipe.java new file mode 100644 index 000000000..2ba1d3c09 --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/item/recipe/vanilla/VanillaCraftingRecipe.java @@ -0,0 +1,16 @@ +package net.momirealms.craftengine.core.item.recipe.vanilla; + +import net.momirealms.craftengine.core.item.recipe.CraftingRecipeCategory; + +public class VanillaCraftingRecipe extends VanillaRecipe { + protected final CraftingRecipeCategory category; + + protected VanillaCraftingRecipe(CraftingRecipeCategory category, String group, RecipeResult result) { + super(group, result); + this.category = category; + } + + public CraftingRecipeCategory category() { + return category; + } +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/item/recipe/vanilla/VanillaRecipe.java b/core/src/main/java/net/momirealms/craftengine/core/item/recipe/vanilla/VanillaRecipe.java new file mode 100644 index 000000000..000077538 --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/item/recipe/vanilla/VanillaRecipe.java @@ -0,0 +1,19 @@ +package net.momirealms.craftengine.core.item.recipe.vanilla; + +public abstract class VanillaRecipe { + protected final String group; + protected final RecipeResult result; + + protected VanillaRecipe(String group, RecipeResult result) { + this.group = group; + this.result = result; + } + + public String group() { + return group; + } + + public RecipeResult result() { + return result; + } +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/item/recipe/vanilla/VanillaRecipeReader.java b/core/src/main/java/net/momirealms/craftengine/core/item/recipe/vanilla/VanillaRecipeReader.java new file mode 100644 index 000000000..2f534efb1 --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/item/recipe/vanilla/VanillaRecipeReader.java @@ -0,0 +1,20 @@ +package net.momirealms.craftengine.core.item.recipe.vanilla; + +import com.google.gson.JsonObject; + +public interface VanillaRecipeReader { + + VanillaShapedRecipe readShaped(JsonObject json); + + VanillaShapelessRecipe readShapeless(JsonObject json); + + VanillaBlastingRecipe readBlasting(JsonObject json); + + VanillaSmeltingRecipe readSmelting(JsonObject json); + + VanillaSmokingRecipe readSmoking(JsonObject json); + + VanillaCampfireRecipe readCampfire(JsonObject json); + + VanillaStoneCuttingRecipe readStoneCutting(JsonObject json); +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/item/recipe/vanilla/VanillaShapedRecipe.java b/core/src/main/java/net/momirealms/craftengine/core/item/recipe/vanilla/VanillaShapedRecipe.java new file mode 100644 index 000000000..3b8f5d127 --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/item/recipe/vanilla/VanillaShapedRecipe.java @@ -0,0 +1,29 @@ +package net.momirealms.craftengine.core.item.recipe.vanilla; + +import net.momirealms.craftengine.core.item.recipe.CraftingRecipeCategory; + +import java.util.List; +import java.util.Map; + +public class VanillaShapedRecipe extends VanillaCraftingRecipe { + private final String[] pattern; + private final Map> key; + + public VanillaShapedRecipe(CraftingRecipeCategory category, + String group, + Map> key, + String[] pattern, + RecipeResult result) { + super(category, group, result); + this.key = key; + this.pattern = pattern; + } + + public Map> ingredients() { + return key; + } + + public String[] pattern() { + return pattern; + } +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/item/recipe/vanilla/VanillaShapelessRecipe.java b/core/src/main/java/net/momirealms/craftengine/core/item/recipe/vanilla/VanillaShapelessRecipe.java new file mode 100644 index 000000000..613a2f7e8 --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/item/recipe/vanilla/VanillaShapelessRecipe.java @@ -0,0 +1,18 @@ +package net.momirealms.craftengine.core.item.recipe.vanilla; + +import net.momirealms.craftengine.core.item.recipe.CraftingRecipeCategory; + +import java.util.List; + +public class VanillaShapelessRecipe extends VanillaCraftingRecipe { + private final List> ingredients; + + public VanillaShapelessRecipe(CraftingRecipeCategory category, String group, List> ingredients, RecipeResult result) { + super(category, group, result); + this.ingredients = ingredients; + } + + public List> ingredients() { + return ingredients; + } +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/item/recipe/vanilla/VanillaSmeltingRecipe.java b/core/src/main/java/net/momirealms/craftengine/core/item/recipe/vanilla/VanillaSmeltingRecipe.java new file mode 100644 index 000000000..5aa346c26 --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/item/recipe/vanilla/VanillaSmeltingRecipe.java @@ -0,0 +1,12 @@ +package net.momirealms.craftengine.core.item.recipe.vanilla; + +import net.momirealms.craftengine.core.item.recipe.CookingRecipeCategory; + +import java.util.List; + +public class VanillaSmeltingRecipe extends VanillaCookingRecipe { + + public VanillaSmeltingRecipe(CookingRecipeCategory category, String group, RecipeResult result, List ingredient, float experience, int cookingTime) { + super(category, group, result, ingredient, experience, cookingTime); + } +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/item/recipe/vanilla/VanillaSmokingRecipe.java b/core/src/main/java/net/momirealms/craftengine/core/item/recipe/vanilla/VanillaSmokingRecipe.java new file mode 100644 index 000000000..df919f810 --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/item/recipe/vanilla/VanillaSmokingRecipe.java @@ -0,0 +1,12 @@ +package net.momirealms.craftengine.core.item.recipe.vanilla; + +import net.momirealms.craftengine.core.item.recipe.CookingRecipeCategory; + +import java.util.List; + +public class VanillaSmokingRecipe extends VanillaCookingRecipe { + + public VanillaSmokingRecipe(CookingRecipeCategory category, String group, RecipeResult result, List ingredient, float experience, int cookingTime) { + super(category, group, result, ingredient, experience, cookingTime); + } +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/item/recipe/vanilla/VanillaStoneCuttingRecipe.java b/core/src/main/java/net/momirealms/craftengine/core/item/recipe/vanilla/VanillaStoneCuttingRecipe.java new file mode 100644 index 000000000..79ab56d86 --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/item/recipe/vanilla/VanillaStoneCuttingRecipe.java @@ -0,0 +1,16 @@ +package net.momirealms.craftengine.core.item.recipe.vanilla; + +import java.util.List; + +public class VanillaStoneCuttingRecipe extends VanillaRecipe { + private final List ingredient; + + public VanillaStoneCuttingRecipe(String group, RecipeResult result, List ingredient) { + super(group, result); + this.ingredient = ingredient; + } + + public List ingredient() { + return ingredient; + } +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/item/recipe/vanilla/reader/AbstractRecipeReader.java b/core/src/main/java/net/momirealms/craftengine/core/item/recipe/vanilla/reader/AbstractRecipeReader.java new file mode 100644 index 000000000..9422071a2 --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/item/recipe/vanilla/reader/AbstractRecipeReader.java @@ -0,0 +1,48 @@ +package net.momirealms.craftengine.core.item.recipe.vanilla.reader; + +import com.google.gson.JsonArray; +import com.google.gson.JsonElement; +import com.google.gson.JsonObject; +import net.momirealms.craftengine.core.item.recipe.CookingRecipeCategory; +import net.momirealms.craftengine.core.item.recipe.CraftingRecipeCategory; +import net.momirealms.craftengine.core.item.recipe.vanilla.VanillaRecipeReader; +import org.jetbrains.annotations.Nullable; + +import java.util.ArrayList; +import java.util.List; +import java.util.Locale; + +public abstract class AbstractRecipeReader implements VanillaRecipeReader { + + protected String[] readPattern(JsonObject object) { + JsonArray pattern = object.getAsJsonArray("pattern"); + List patternList = new ArrayList<>(); + for (JsonElement element : pattern) { + patternList.add(element.getAsString()); + } + return patternList.toArray(new String[0]); + } + + @Nullable + protected String readGroup(JsonObject object) { + return object.has("group") ? object.get("group").getAsString() : null; + } + + @Nullable + protected CraftingRecipeCategory readCraftingCategory(JsonObject object) { + return object.has("category") ? CraftingRecipeCategory.valueOf(object.get("category").getAsString().toUpperCase(Locale.ENGLISH)) : null; + } + + @Nullable + protected CookingRecipeCategory readCookingCategory(JsonObject object) { + return object.has("category") ? CookingRecipeCategory.valueOf(object.get("category").getAsString().toUpperCase(Locale.ENGLISH)) : null; + } + + protected float readExperience(JsonObject object) { + return object.has("experience") ? object.get("experience").getAsFloat() : 0; + } + + protected int readCookingTime(JsonObject object) { + return object.has("cookingtime") ? object.get("cookingtime").getAsInt() : 200; + } +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/item/recipe/vanilla/reader/VanillaRecipeReader1_20.java b/core/src/main/java/net/momirealms/craftengine/core/item/recipe/vanilla/reader/VanillaRecipeReader1_20.java new file mode 100644 index 000000000..c6897a43c --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/item/recipe/vanilla/reader/VanillaRecipeReader1_20.java @@ -0,0 +1,180 @@ +package net.momirealms.craftengine.core.item.recipe.vanilla.reader; + +import com.google.gson.JsonArray; +import com.google.gson.JsonElement; +import com.google.gson.JsonObject; +import net.momirealms.craftengine.core.item.recipe.vanilla.*; +import org.jetbrains.annotations.NotNull; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +public class VanillaRecipeReader1_20 extends AbstractRecipeReader { + + @Override + public VanillaShapedRecipe readShaped(JsonObject json) { + return new VanillaShapedRecipe( + readCraftingCategory(json), + readGroup(json), + readShapedIngredientMap(json.getAsJsonObject("key")), + readPattern(json), + readCraftingResult(json.getAsJsonObject("result")) + ); + } + + @Override + public VanillaShapelessRecipe readShapeless(JsonObject json) { + return new VanillaShapelessRecipe( + readCraftingCategory(json), + readGroup(json), + readShapelessIngredients(json.getAsJsonArray("ingredients")), + readCraftingResult(json.getAsJsonObject("result")) + ); + } + + @Override + public VanillaBlastingRecipe readBlasting(JsonObject json) { + return new VanillaBlastingRecipe( + readCookingCategory(json), + readGroup(json), + readCookingResult(json.get("result")), + readSingleIngredient(json.get("ingredient")), + readExperience(json), + readCookingTime(json) + ); + } + + @Override + public VanillaSmeltingRecipe readSmelting(JsonObject json) { + return new VanillaSmeltingRecipe( + readCookingCategory(json), + readGroup(json), + readCookingResult(json.get("result")), + readSingleIngredient(json.get("ingredient")), + readExperience(json), + readCookingTime(json) + ); + } + + @Override + public VanillaSmokingRecipe readSmoking(JsonObject json) { + return new VanillaSmokingRecipe( + readCookingCategory(json), + readGroup(json), + readCookingResult(json.get("result")), + readSingleIngredient(json.get("ingredient")), + readExperience(json), + readCookingTime(json) + ); + } + + @Override + public VanillaCampfireRecipe readCampfire(JsonObject json) { + return new VanillaCampfireRecipe( + readCookingCategory(json), + readGroup(json), + readCookingResult(json.get("result")), + readSingleIngredient(json.get("ingredient")), + readExperience(json), + readCookingTime(json) + ); + } + + @Override + public VanillaStoneCuttingRecipe readStoneCutting(JsonObject json) { + return new VanillaStoneCuttingRecipe( + readGroup(json), + readStoneCuttingResult(json), + readSingleIngredient(json.get("ingredient")) + ); + } + + protected List readSingleIngredient(JsonElement json) { + List ingredients = new ArrayList<>(); + if (json.isJsonObject()) { + JsonObject argument = json.getAsJsonObject(); + if (argument.has("item")) { + ingredients.add(argument.get("item").getAsString()); + } else if (argument.has("tag")) { + ingredients.add("#" + argument.get("tag").getAsString()); + } + } else if (json.isJsonArray()) { + List items = readIngredientList((JsonArray) json); + ingredients.addAll(items); + } + return ingredients; + } + + @NotNull + protected RecipeResult readStoneCuttingResult(JsonObject json) { + int count = json.has("count") ? json.get("count").getAsInt() : 1; + String result = json.get("result").getAsString(); + return new RecipeResult(result, count, null); + } + + @NotNull + protected RecipeResult readCookingResult(JsonElement object) { + return new RecipeResult(object.getAsString(), 1, null); + } + + @NotNull + protected RecipeResult readCraftingResult(JsonObject object) { + String item = object.get("item").getAsString(); + int count = object.has("count") ? object.get("count").getAsInt() : 1; + return new RecipeResult(item, count, null); + } + + protected List> readShapelessIngredients(JsonArray json) { + List> ingredients = new ArrayList<>(); + for (JsonElement element : json) { + if (element.isJsonObject()) { + JsonObject jsonObject = element.getAsJsonObject(); + if (jsonObject.has("item")) { + ingredients.add(List.of(jsonObject.get("item").getAsString())); + } else if (jsonObject.has("tag")) { + ingredients.add(List.of("#" + jsonObject.get("tag").getAsString())); + } + } else if (element.isJsonArray()) { + List ingredient = readIngredientList((JsonArray) element); + ingredients.add(ingredient); + } + } + return ingredients; + } + + protected Map> readShapedIngredientMap(JsonObject json) { + Map> ingredients = new HashMap<>(); + for (Map.Entry entry : json.entrySet()) { + char c = entry.getKey().charAt(0); + if (entry.getValue().isJsonObject()) { + JsonObject argument = entry.getValue().getAsJsonObject(); + if (argument.has("item")) { + ingredients.put(c, List.of(argument.get("item").getAsString())); + } else if (argument.has("tag")) { + ingredients.put(c, List.of("#" + argument.get("tag").getAsString())); + } + } else if (entry.getValue().isJsonArray()) { + List items = readIngredientList((JsonArray) entry.getValue()); + ingredients.put(c, items); + } + } + return ingredients; + } + + protected @NotNull List readIngredientList(JsonArray array) { + List items = new ArrayList<>(); + for (JsonElement element : array) { + if (element.isJsonObject()) { + JsonObject argument = element.getAsJsonObject(); + if (argument.has("item")) { + items.add(argument.get("item").getAsString()); + } else if (argument.has("tag")) { + items.add("#" + argument.get("tag").getAsString()); + } + } + } + return items; + } +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/item/recipe/vanilla/reader/VanillaRecipeReader1_20_5.java b/core/src/main/java/net/momirealms/craftengine/core/item/recipe/vanilla/reader/VanillaRecipeReader1_20_5.java new file mode 100644 index 000000000..727ba41cb --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/item/recipe/vanilla/reader/VanillaRecipeReader1_20_5.java @@ -0,0 +1,29 @@ +package net.momirealms.craftengine.core.item.recipe.vanilla.reader; + +import com.google.gson.JsonElement; +import com.google.gson.JsonObject; +import net.momirealms.craftengine.core.item.recipe.vanilla.RecipeResult; +import org.jetbrains.annotations.NotNull; + +public class VanillaRecipeReader1_20_5 extends VanillaRecipeReader1_20 { + + @Override + protected @NotNull RecipeResult readCraftingResult(JsonObject object) { + String item = object.get("id").getAsString(); + JsonObject components = object.has("components") ? object.getAsJsonObject("components") : null; + int count = object.has("count") ? object.get("count").getAsInt() : 1; + return new RecipeResult(item, count, components); + } + + @NotNull + @Override + protected RecipeResult readCookingResult(JsonElement object) { + return readCraftingResult(object.getAsJsonObject()); + } + + @NotNull + @Override + protected RecipeResult readStoneCuttingResult(JsonObject json) { + return readCraftingResult(json.getAsJsonObject("result")); + } +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/item/recipe/vanilla/reader/VanillaRecipeReader1_21_2.java b/core/src/main/java/net/momirealms/craftengine/core/item/recipe/vanilla/reader/VanillaRecipeReader1_21_2.java new file mode 100644 index 000000000..eafec4a5a --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/item/recipe/vanilla/reader/VanillaRecipeReader1_21_2.java @@ -0,0 +1,62 @@ +package net.momirealms.craftengine.core.item.recipe.vanilla.reader; + +import com.google.gson.JsonArray; +import com.google.gson.JsonElement; +import com.google.gson.JsonObject; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +public class VanillaRecipeReader1_21_2 extends VanillaRecipeReader1_20_5 { + + @Override + protected List readSingleIngredient(JsonElement json) { + if (json.isJsonPrimitive()) { + return List.of(json.getAsString()); + } else { + JsonArray array = json.getAsJsonArray(); + List ingredients = new ArrayList<>(); + for (JsonElement element : array) { + ingredients.add(element.getAsString()); + } + return ingredients; + } + } + + @Override + protected Map> readShapedIngredientMap(JsonObject json) { + Map> ingredients = new HashMap<>(); + for (Map.Entry entry : json.entrySet()) { + char c = entry.getKey().charAt(0); + if (entry.getValue().isJsonPrimitive()) { + ingredients.put(c, List.of(entry.getValue().getAsString())); + } else if (entry.getValue().isJsonArray()) { + List list = new ArrayList<>(); + for (JsonElement element : entry.getValue().getAsJsonArray()) { + list.add(element.getAsString()); + } + ingredients.put(c, list); + } + } + return ingredients; + } + + @Override + protected List> readShapelessIngredients(JsonArray json) { + List> ingredients = new ArrayList<>(); + for (JsonElement element : json) { + if (element.isJsonPrimitive()) { + ingredients.add(List.of(element.getAsString())); + } else if (element.isJsonArray()) { + List list = new ArrayList<>(); + for (JsonElement inner : element.getAsJsonArray()) { + list.add(inner.getAsString()); + } + ingredients.add(list); + } + } + return ingredients; + } +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/loot/LootContext.java b/core/src/main/java/net/momirealms/craftengine/core/loot/LootContext.java new file mode 100644 index 000000000..2ad3dc4f4 --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/loot/LootContext.java @@ -0,0 +1,50 @@ +package net.momirealms.craftengine.core.loot; + +import net.momirealms.craftengine.core.util.context.ContextHolder; +import net.momirealms.craftengine.core.util.context.ContextKey; +import net.momirealms.craftengine.core.world.World; + +import java.util.Optional; +import java.util.Random; + +public class LootContext { + private final World world; + private final ContextHolder contexts; + private final Random randomSource; + private final float luck; + + public LootContext(World world, ContextHolder contexts, Random randomSource, float luck) { + this.randomSource = randomSource; + this.contexts = contexts; + this.world = world; + this.luck = luck; + } + + public Random randomSource() { + return randomSource; + } + + public Optional getOptionalParameter(ContextKey parameter) { + return this.contexts.getOptional(parameter); + } + + public boolean hasParameter(ContextKey parameter) { + return this.contexts.has(parameter); + } + + public T getParameterOrThrow(ContextKey parameter) { + return this.contexts.getOrThrow(parameter); + } + + public float luck() { + return luck; + } + + public ContextHolder contexts() { + return contexts; + } + + public World world() { + return world; + } +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/loot/LootPool.java b/core/src/main/java/net/momirealms/craftengine/core/loot/LootPool.java new file mode 100644 index 000000000..04a196a1a --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/loot/LootPool.java @@ -0,0 +1,93 @@ +package net.momirealms.craftengine.core.loot; + +import com.google.common.collect.Lists; +import net.momirealms.craftengine.core.item.Item; +import net.momirealms.craftengine.core.loot.condition.LootCondition; +import net.momirealms.craftengine.core.loot.condition.LootConditions; +import net.momirealms.craftengine.core.loot.entry.LootEntry; +import net.momirealms.craftengine.core.loot.entry.LootEntryContainer; +import net.momirealms.craftengine.core.loot.function.LootFunction; +import net.momirealms.craftengine.core.loot.function.LootFunctions; +import net.momirealms.craftengine.core.loot.number.NumberProvider; +import net.momirealms.craftengine.core.util.MCUtils; +import org.apache.commons.lang3.mutable.MutableInt; + +import java.util.List; +import java.util.Random; +import java.util.function.BiFunction; +import java.util.function.Consumer; +import java.util.function.Predicate; + +public class LootPool { + private final List> entryContainers; + private final List conditions; + private final Predicate compositeCondition; + private final List> functions; + private final BiFunction, LootContext, Item> compositeFunction; + private final NumberProvider rolls; + private final NumberProvider bonusRolls; + + public LootPool(List> entryContainers, List conditions, List> functions, NumberProvider rolls, NumberProvider bonusRolls) { + this.entryContainers = entryContainers; + this.conditions = conditions; + this.functions = functions; + this.rolls = rolls; + this.bonusRolls = bonusRolls; + this.compositeCondition = LootConditions.andConditions(conditions); + this.compositeFunction = LootFunctions.compose(functions); + } + + public void addRandomItems(Consumer> lootConsumer, LootContext context) { + for (LootCondition condition : this.conditions) { + if (!condition.test(context)) { + return; + } + } + if (this.compositeCondition.test(context)) { + Consumer> consumer = LootFunction.decorate(this.compositeFunction, lootConsumer, context); + int i = this.rolls.getInt(context) + MCUtils.fastFloor(this.bonusRolls.getFloat(context) * context.luck()); + for (int j = 0; j < i; ++j) { + this.addRandomItem(createFunctionApplier(consumer, context), context); + } + } + } + + private Consumer> createFunctionApplier(Consumer> lootConsumer, LootContext context) { + return (item -> { + for (LootFunction function : this.functions) { + function.apply(item, context); + } + lootConsumer.accept(item); + }); + } + + private void addRandomItem(Consumer> lootConsumer, LootContext context) { + Random randomSource = context.randomSource(); + List> list = Lists.newArrayList(); + MutableInt mutableInt = new MutableInt(); + for (LootEntryContainer lootPoolEntryContainer : this.entryContainers) { + lootPoolEntryContainer.expand(context, (choice) -> { + int i = choice.getWeight(context.luck()); + if (i > 0) { + list.add(choice); + mutableInt.add(i); + } + }); + } + int i = list.size(); + if (mutableInt.intValue() != 0 && i != 0) { + if (i == 1) { + list.get(0).createItem(lootConsumer, context); + } else { + int j = randomSource.nextInt(mutableInt.intValue()); + for (LootEntry loot : list) { + j -= loot.getWeight(context.luck()); + if (j < 0) { + loot.createItem(lootConsumer, context); + return; + } + } + } + } + } +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/loot/LootTable.java b/core/src/main/java/net/momirealms/craftengine/core/loot/LootTable.java new file mode 100644 index 000000000..94bc14963 --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/loot/LootTable.java @@ -0,0 +1,107 @@ +package net.momirealms.craftengine.core.loot; + +import com.google.common.collect.Lists; +import net.momirealms.craftengine.core.item.Item; +import net.momirealms.craftengine.core.loot.condition.LootCondition; +import net.momirealms.craftengine.core.loot.condition.LootConditions; +import net.momirealms.craftengine.core.loot.entry.LootEntryContainer; +import net.momirealms.craftengine.core.loot.entry.LootEntryContainers; +import net.momirealms.craftengine.core.loot.function.LootFunction; +import net.momirealms.craftengine.core.loot.function.LootFunctions; +import net.momirealms.craftengine.core.loot.number.NumberProvider; +import net.momirealms.craftengine.core.loot.number.NumberProviders; +import net.momirealms.craftengine.core.util.context.ContextHolder; +import net.momirealms.craftengine.core.world.World; +import org.jetbrains.annotations.Nullable; + +import java.util.ArrayList; +import java.util.List; +import java.util.Map; +import java.util.Optional; +import java.util.concurrent.ThreadLocalRandom; +import java.util.function.BiFunction; +import java.util.function.Consumer; + +public class LootTable { + private final List> pools; + private final List> functions; + private final BiFunction, LootContext, Item> compositeFunction; + + public LootTable(List> pools, List> functions) { + this.pools = pools; + this.functions = functions; + this.compositeFunction = LootFunctions.compose(functions); + } + + @Nullable + @SuppressWarnings("unchecked") + public static LootTable fromMap(Map map) { + if (map == null || map.isEmpty()) return null; + List> poolList = (List>) map.get("pools"); + List> lootPools = new ArrayList<>(); + for (Map pool : poolList) { + NumberProvider rolls = NumberProviders.fromObject(pool.getOrDefault("rolls", 1)); + NumberProvider bonus_rolls = NumberProviders.fromObject(pool.getOrDefault("bonus_rolls", 0)); + List conditions = Optional.ofNullable(pool.get("conditions")) + .map(it -> LootConditions.fromMapList((List>) it)) + .orElse(Lists.newArrayList()); + List> containers = Optional.ofNullable(pool.get("entries")) + .map(it -> (List>) new ArrayList>(LootEntryContainers.fromMapList((List>) it))) + .orElse(Lists.newArrayList()); + List> functions = Optional.ofNullable(pool.get("functions")) + .map(it -> (List>) new ArrayList>(LootFunctions.fromMapList((List>) it))) + .orElse(Lists.newArrayList()); + lootPools.add(new LootPool<>(containers, conditions, functions, rolls, bonus_rolls)); + } + return new LootTable<>(lootPools, + Optional.ofNullable(map.get("functions")) + .map(it -> (List>) new ArrayList>(LootFunctions.fromMapList((List>) it))) + .orElse(Lists.newArrayList()) + ); + } + + public ArrayList> getRandomItems(ContextHolder parameters, World world) { + return this.getRandomItems(new LootContext(world, parameters, ThreadLocalRandom.current(), 1)); + } + + private ArrayList> getRandomItems(LootContext context) { + ArrayList> list = new ArrayList<>(); + this.getRandomItems(context, list::add); + return list; + } + + public void getRandomItems(LootContext context, Consumer> lootConsumer) { + this.getRandomItemsRaw(context, createFunctionApplier(createStackSplitter(lootConsumer), context)); + } + + private Consumer> createFunctionApplier(Consumer> lootConsumer, LootContext context) { + return (item -> { + for (LootFunction function : this.functions) { + function.apply(item, context); + } + lootConsumer.accept(item); + }); + } + + private Consumer> createStackSplitter(Consumer> consumer) { + return (item) -> { + if (item.count() < item.maxStackSize()) { + consumer.accept(item); + } else { + int remaining = item.count(); + while (remaining > 0) { + Item splitItem = item.copyWithCount(Math.min(item.maxStackSize(), remaining)); + remaining -= splitItem.count(); + consumer.accept(splitItem); + } + } + }; + } + + public void getRandomItemsRaw(LootContext context, Consumer> lootConsumer) { + Consumer> consumer = LootFunction.decorate(this.compositeFunction, lootConsumer, context); + for (LootPool pool : this.pools) { + pool.addRandomItems(consumer, context); + } + } +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/loot/condition/AllOfCondition.java b/core/src/main/java/net/momirealms/craftengine/core/loot/condition/AllOfCondition.java new file mode 100644 index 000000000..6c1e9eaa1 --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/loot/condition/AllOfCondition.java @@ -0,0 +1,40 @@ +package net.momirealms.craftengine.core.loot.condition; + +import net.momirealms.craftengine.core.loot.LootContext; +import net.momirealms.craftengine.core.util.Key; + +import java.util.List; +import java.util.Map; + +public class AllOfCondition implements LootCondition { + public static final Factory FACTORY = new Factory(); + private final List conditions; + + public AllOfCondition(List conditions) { + this.conditions = conditions; + } + + @Override + public Key type() { + return LootConditions.ALL_OF; + } + + @Override + public boolean test(LootContext lootContext) { + for (LootCondition condition : conditions) { + if (!condition.test(lootContext)) { + return false; + } + } + return true; + } + + public static class Factory implements LootConditionFactory { + @SuppressWarnings("unchecked") + @Override + public LootCondition create(Map arguments) { + List> terms = (List>) arguments.get("terms"); + return new AllOfCondition(LootConditions.fromMapList(terms)); + } + } +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/loot/condition/AnyOfCondition.java b/core/src/main/java/net/momirealms/craftengine/core/loot/condition/AnyOfCondition.java new file mode 100644 index 000000000..8ed439c3e --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/loot/condition/AnyOfCondition.java @@ -0,0 +1,40 @@ +package net.momirealms.craftengine.core.loot.condition; + +import net.momirealms.craftengine.core.loot.LootContext; +import net.momirealms.craftengine.core.util.Key; + +import java.util.List; +import java.util.Map; + +public class AnyOfCondition implements LootCondition { + public static final Factory FACTORY = new Factory(); + private final List conditions; + + public AnyOfCondition(List conditions) { + this.conditions = conditions; + } + + @Override + public Key type() { + return LootConditions.ANY_OF; + } + + @Override + public boolean test(LootContext lootContext) { + for (LootCondition condition : conditions) { + if (condition.test(lootContext)) { + return true; + } + } + return false; + } + + public static class Factory implements LootConditionFactory { + @SuppressWarnings("unchecked") + @Override + public LootCondition create(Map arguments) { + List> terms = (List>) arguments.get("terms"); + return new AnyOfCondition(LootConditions.fromMapList(terms)); + } + } +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/loot/condition/EnchantmentCondition.java b/core/src/main/java/net/momirealms/craftengine/core/loot/condition/EnchantmentCondition.java new file mode 100644 index 000000000..067a8a3e1 --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/loot/condition/EnchantmentCondition.java @@ -0,0 +1,56 @@ +package net.momirealms.craftengine.core.loot.condition; + +import net.momirealms.craftengine.core.item.Enchantment; +import net.momirealms.craftengine.core.item.Item; +import net.momirealms.craftengine.core.loot.LootContext; +import net.momirealms.craftengine.core.loot.parameter.LootParameters; +import net.momirealms.craftengine.core.util.Key; + +import java.util.Map; +import java.util.Optional; +import java.util.function.Function; + +public class EnchantmentCondition implements LootCondition { + public static final Factory FACTORY = new Factory(); + private final Key id; + private final Function expression; + + public EnchantmentCondition(Key id, Function expression) { + this.id = id; + this.expression = expression; + } + + @Override + public Key type() { + return LootConditions.ENCHANTMENT; + } + + @Override + public boolean test(LootContext lootContext) { + Optional> item = lootContext.getOptionalParameter(LootParameters.TOOL); + if (item.isEmpty()) return false; + Optional enchantment = item.get().getEnchantment(id); + int level = enchantment.map(Enchantment::level).orElse(0); + return this.expression.apply(level); + } + + public static class Factory implements LootConditionFactory { + @Override + public LootCondition create(Map arguments) { + String predicate = (String) arguments.get("predicate"); + String[] split = predicate.split("(<=|>=|<|>|==|=)", 2); + int level = Integer.parseInt(split[1]); + String operator = predicate.substring(split[0].length(), predicate.length() - split[1].length()); + Function expression; + switch (operator) { + case "<" -> expression = (i -> i < level); + case ">" -> expression = (i -> i > level); + case "==", "=" -> expression = (i -> i == level); + case "<=" -> expression = (i -> i <= level); + case ">=" -> expression = (i -> i >= level); + default -> throw new IllegalArgumentException("Unknown operator: " + operator); + } + return new EnchantmentCondition(Key.of(split[0]), expression); + } + } +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/loot/condition/FallingCondition.java b/core/src/main/java/net/momirealms/craftengine/core/loot/condition/FallingCondition.java new file mode 100644 index 000000000..0e4b6324b --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/loot/condition/FallingCondition.java @@ -0,0 +1,29 @@ +package net.momirealms.craftengine.core.loot.condition; + +import net.momirealms.craftengine.core.loot.LootContext; +import net.momirealms.craftengine.core.loot.parameter.LootParameters; +import net.momirealms.craftengine.core.util.Key; + +import java.util.Map; + +public class FallingCondition implements LootCondition { + public static final Factory FACTORY = new Factory(); + public static final FallingCondition INSTANCE = new FallingCondition(); + + @Override + public Key type() { + return LootConditions.FALLING_BLOCK; + } + + @Override + public boolean test(LootContext lootContext) { + return lootContext.getOptionalParameter(LootParameters.FALLING_BLOCK).orElse(false); + } + + public static class Factory implements LootConditionFactory { + @Override + public LootCondition create(Map arguments) { + return INSTANCE; + } + } +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/loot/condition/InvertedCondition.java b/core/src/main/java/net/momirealms/craftengine/core/loot/condition/InvertedCondition.java new file mode 100644 index 000000000..7dc3a9cd7 --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/loot/condition/InvertedCondition.java @@ -0,0 +1,34 @@ +package net.momirealms.craftengine.core.loot.condition; + +import net.momirealms.craftengine.core.loot.LootContext; +import net.momirealms.craftengine.core.util.Key; + +import java.util.Map; + +public class InvertedCondition implements LootCondition { + public static final Factory FACTORY = new Factory(); + private final LootCondition condition; + + public InvertedCondition(LootCondition condition) { + this.condition = condition; + } + + @Override + public Key type() { + return LootConditions.INVERTED; + } + + @Override + public boolean test(LootContext lootContext) { + return !condition.test(lootContext); + } + + public static class Factory implements LootConditionFactory { + @SuppressWarnings("unchecked") + @Override + public LootCondition create(Map arguments) { + Map term = (Map) arguments.get("term"); + return new InvertedCondition(LootConditions.fromMap(term)); + } + } +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/loot/condition/LootCondition.java b/core/src/main/java/net/momirealms/craftengine/core/loot/condition/LootCondition.java new file mode 100644 index 000000000..5a684a171 --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/loot/condition/LootCondition.java @@ -0,0 +1,11 @@ +package net.momirealms.craftengine.core.loot.condition; + +import net.momirealms.craftengine.core.loot.LootContext; +import net.momirealms.craftengine.core.util.Key; + +import java.util.function.Predicate; + +public interface LootCondition extends Predicate { + + Key type(); +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/loot/condition/LootConditionFactory.java b/core/src/main/java/net/momirealms/craftengine/core/loot/condition/LootConditionFactory.java new file mode 100644 index 000000000..6f8173511 --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/loot/condition/LootConditionFactory.java @@ -0,0 +1,8 @@ +package net.momirealms.craftengine.core.loot.condition; + +import java.util.Map; + +public interface LootConditionFactory { + + LootCondition create(Map arguments); +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/loot/condition/LootConditions.java b/core/src/main/java/net/momirealms/craftengine/core/loot/condition/LootConditions.java new file mode 100644 index 000000000..806172e90 --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/loot/condition/LootConditions.java @@ -0,0 +1,98 @@ +package net.momirealms.craftengine.core.loot.condition; + +import net.momirealms.craftengine.core.registry.BuiltInRegistries; +import net.momirealms.craftengine.core.registry.Holder; +import net.momirealms.craftengine.core.registry.Registries; +import net.momirealms.craftengine.core.registry.WritableRegistry; +import net.momirealms.craftengine.core.util.Key; +import net.momirealms.craftengine.core.util.ResourceKey; + +import java.util.ArrayList; +import java.util.List; +import java.util.Map; +import java.util.function.Predicate; + +public class LootConditions { + public static final Key MATCH_ITEM = Key.from("craftengine:match_item"); + public static final Key TABLE_BONUS = Key.from("craftengine:table_bonus"); + public static final Key SURVIVES_EXPLOSION = Key.from("craftengine:survives_explosion"); + public static final Key ANY_OF = Key.from("craftengine:any_of"); + public static final Key ALL_OF = Key.from("craftengine:all_of"); + public static final Key ENCHANTMENT = Key.from("craftengine:enchantment"); + public static final Key INVERTED = Key.from("craftengine:inverted"); + public static final Key FALLING_BLOCK = Key.from("craftengine:falling_block"); + + static { + register(MATCH_ITEM, MatchItemCondition.FACTORY); + register(TABLE_BONUS, TableBonusCondition.FACTORY); + register(SURVIVES_EXPLOSION, SurvivesExplosionCondition.FACTORY); + register(ANY_OF, AnyOfCondition.FACTORY); + register(ALL_OF, AllOfCondition.FACTORY); + register(ENCHANTMENT, EnchantmentCondition.FACTORY); + register(INVERTED, InvertedCondition.FACTORY); + register(FALLING_BLOCK, FallingCondition.FACTORY); + } + + public static void register(Key key, LootConditionFactory factory) { + Holder.Reference holder = ((WritableRegistry) BuiltInRegistries.LOOT_CONDITION_FACTORY) + .registerForHolder(new ResourceKey<>(Registries.LOOT_CONDITION_FACTORY.location(), key)); + holder.bindValue(factory); + } + + public static Predicate andConditions(List> predicates) { + List> list = List.copyOf(predicates); + return switch (list.size()) { + case 0 -> ctx -> true; + case 1 -> list.get(0); + case 2 -> list.get(0).and(list.get(1)); + default -> (ctx -> { + for (Predicate predicate : list) { + if (!predicate.test(ctx)) { + return false; + } + } + return true; + }); + }; + } + + public static Predicate orConditions(List> predicates) { + List> list = List.copyOf(predicates); + return switch (list.size()) { + case 0 -> ctx -> false; + case 1 -> list.get(0); + case 2 -> list.get(0).or(list.get(1)); + default -> (ctx -> { + for (Predicate predicate : list) { + if (predicate.test(ctx)) { + return true; + } + } + return false; + }); + }; + } + + public static List fromMapList(List> mapList) { + if (mapList == null || mapList.isEmpty()) return List.of(); + List functions = new ArrayList<>(); + for (Map map : mapList) { + functions.add(fromMap(map)); + } + return functions; + } + + public static LootCondition fromMap(Map map) { + String type = (String) map.get("type"); + if (type == null) { + throw new NullPointerException("condition type cannot be null"); + } + Key key = Key.withDefaultNamespace(type, "craftengine"); + LootConditionFactory factory = BuiltInRegistries.LOOT_CONDITION_FACTORY.getValue(key); + if (factory == null) { + throw new IllegalArgumentException("Unknown loot condition type: " + type); + } + return factory.create(map); + } + +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/loot/condition/MatchItemCondition.java b/core/src/main/java/net/momirealms/craftengine/core/loot/condition/MatchItemCondition.java new file mode 100644 index 000000000..367ac6ec3 --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/loot/condition/MatchItemCondition.java @@ -0,0 +1,52 @@ +package net.momirealms.craftengine.core.loot.condition; + +import net.momirealms.craftengine.core.item.Item; +import net.momirealms.craftengine.core.loot.LootContext; +import net.momirealms.craftengine.core.loot.parameter.LootParameters; +import net.momirealms.craftengine.core.util.Key; +import net.momirealms.craftengine.core.util.MiscUtils; + +import java.util.*; + +public class MatchItemCondition implements LootCondition { + public static final Factory FACTORY = new Factory(); + private final Set ids; + private final boolean regexMatch; + + public MatchItemCondition(Collection ids, boolean regexMatch) { + this.ids = new HashSet<>(ids); + this.regexMatch = regexMatch; + } + + @Override + public Key type() { + return LootConditions.MATCH_ITEM; + } + + @Override + public boolean test(LootContext lootContext) { + Optional> item = lootContext.getOptionalParameter(LootParameters.TOOL); + if (item.isEmpty()) return false; + Key key = item.get().id(); + String itemId = key.toString(); + if (this.regexMatch) { + for (String regex : ids) { + if (itemId.matches(regex)) { + return true; + } + } + } else { + return this.ids.contains(itemId); + } + return false; + } + + public static class Factory implements LootConditionFactory { + @Override + public LootCondition create(Map arguments) { + List ids = MiscUtils.getAsStringList(arguments.get("id")); + boolean regex = (boolean) arguments.getOrDefault("regex", false); + return new MatchItemCondition(ids, regex); + } + } +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/loot/condition/SurvivesExplosionCondition.java b/core/src/main/java/net/momirealms/craftengine/core/loot/condition/SurvivesExplosionCondition.java new file mode 100644 index 000000000..3fd8f8cf6 --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/loot/condition/SurvivesExplosionCondition.java @@ -0,0 +1,35 @@ +package net.momirealms.craftengine.core.loot.condition; + +import net.momirealms.craftengine.core.loot.LootContext; +import net.momirealms.craftengine.core.loot.parameter.LootParameters; +import net.momirealms.craftengine.core.util.Key; + +import java.util.Map; +import java.util.Optional; + +public class SurvivesExplosionCondition implements LootCondition { + public static final Factory FACTORY = new Factory(); + private static final SurvivesExplosionCondition INSTANCE = new SurvivesExplosionCondition(); + + @Override + public Key type() { + return LootConditions.SURVIVES_EXPLOSION; + } + + @Override + public boolean test(LootContext lootContext) { + Optional radius = lootContext.getOptionalParameter(LootParameters.EXPLOSION_RADIUS); + if (radius.isPresent()) { + float f = 1f / radius.get(); + return lootContext.randomSource().nextFloat() < f; + } + return true; + } + + public static class Factory implements LootConditionFactory { + @Override + public LootCondition create(Map arguments) { + return INSTANCE; + } + } +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/loot/condition/TableBonusCondition.java b/core/src/main/java/net/momirealms/craftengine/core/loot/condition/TableBonusCondition.java new file mode 100644 index 000000000..8560f80bd --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/loot/condition/TableBonusCondition.java @@ -0,0 +1,45 @@ +package net.momirealms.craftengine.core.loot.condition; + +import net.momirealms.craftengine.core.item.Enchantment; +import net.momirealms.craftengine.core.item.Item; +import net.momirealms.craftengine.core.loot.LootContext; +import net.momirealms.craftengine.core.loot.parameter.LootParameters; +import net.momirealms.craftengine.core.util.Key; +import net.momirealms.craftengine.core.util.MiscUtils; + +import java.util.List; +import java.util.Map; +import java.util.Optional; + +public class TableBonusCondition implements LootCondition { + public static final Factory FACTORY = new Factory(); + private final Key enchantmentType; + private final List values; + + public TableBonusCondition(Key enchantmentType, List values) { + this.enchantmentType = enchantmentType; + this.values = values; + } + + @Override + public Key type() { + return LootConditions.TABLE_BONUS; + } + + @Override + public boolean test(LootContext lootContext) { + Optional> item = lootContext.getOptionalParameter(LootParameters.TOOL); + int level = item.map(value -> value.getEnchantment(this.enchantmentType).map(Enchantment::level).orElse(0)).orElse(0); + float f = this.values.get(Math.min(level, this.values.size() - 1)); + return lootContext.randomSource().nextFloat() < f; + } + + public static class Factory implements LootConditionFactory { + @Override + public LootCondition create(Map arguments) { + Key enchantmentType = Key.of((String) arguments.get("enchantment")); + List floats = MiscUtils.getAsFloatList(arguments.get("chances")); + return new TableBonusCondition(enchantmentType, floats); + } + } +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/loot/entry/AbstractCompositeLootEntryContainer.java b/core/src/main/java/net/momirealms/craftengine/core/loot/entry/AbstractCompositeLootEntryContainer.java new file mode 100644 index 000000000..76f4a57ea --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/loot/entry/AbstractCompositeLootEntryContainer.java @@ -0,0 +1,25 @@ +package net.momirealms.craftengine.core.loot.entry; + +import net.momirealms.craftengine.core.loot.LootContext; +import net.momirealms.craftengine.core.loot.condition.LootCondition; + +import java.util.List; +import java.util.function.Consumer; + +public abstract class AbstractCompositeLootEntryContainer extends AbstractLootEntryContainer { + protected final List> children; + private final LootEntryContainer composedChildren; + + protected AbstractCompositeLootEntryContainer(List conditions, List> children) { + super(conditions); + this.children = children; + this.composedChildren = compose(children); + } + + protected abstract LootEntryContainer compose(List> children); + + @Override + public final boolean expand(LootContext context, Consumer> choiceConsumer) { + return this.test(context) && this.composedChildren.expand(context, choiceConsumer); + } +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/loot/entry/AbstractLootEntryContainer.java b/core/src/main/java/net/momirealms/craftengine/core/loot/entry/AbstractLootEntryContainer.java new file mode 100644 index 000000000..a71d1651d --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/loot/entry/AbstractLootEntryContainer.java @@ -0,0 +1,26 @@ +package net.momirealms.craftengine.core.loot.entry; + +import net.momirealms.craftengine.core.loot.LootContext; +import net.momirealms.craftengine.core.loot.condition.LootCondition; +import net.momirealms.craftengine.core.util.Key; +import net.momirealms.craftengine.core.util.MCUtils; + +import java.util.List; +import java.util.function.Predicate; + +public abstract class AbstractLootEntryContainer implements LootEntryContainer, Predicate { + protected final List conditions; + private final Predicate compositeCondition; + + protected AbstractLootEntryContainer(List conditions) { + this.conditions = conditions; + this.compositeCondition = MCUtils.allOf(conditions); + } + + @Override + public final boolean test(LootContext context) { + return this.compositeCondition.test(context); + } + + public abstract Key type(); +} \ No newline at end of file diff --git a/core/src/main/java/net/momirealms/craftengine/core/loot/entry/AbstractSingleLootEntryContainer.java b/core/src/main/java/net/momirealms/craftengine/core/loot/entry/AbstractSingleLootEntryContainer.java new file mode 100644 index 000000000..86f866a29 --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/loot/entry/AbstractSingleLootEntryContainer.java @@ -0,0 +1,68 @@ +package net.momirealms.craftengine.core.loot.entry; + +import net.momirealms.craftengine.core.item.Item; +import net.momirealms.craftengine.core.loot.LootContext; +import net.momirealms.craftengine.core.loot.condition.LootCondition; +import net.momirealms.craftengine.core.loot.function.LootFunction; +import net.momirealms.craftengine.core.loot.function.LootFunctions; + +import java.util.List; +import java.util.function.BiFunction; +import java.util.function.Consumer; + +public abstract class AbstractSingleLootEntryContainer extends AbstractLootEntryContainer { + protected final int weight; + protected final int quality; + protected final List> functions; + protected final BiFunction, LootContext, Item> compositeFunction; + private final EntryBase entry = new EntryBase() { + @Override + public void createItem(Consumer> lootConsumer, LootContext context) { + AbstractSingleLootEntryContainer.this.createItem( + LootFunction.decorate(AbstractSingleLootEntryContainer.this.compositeFunction, lootConsumer, context), context + ); + } + }; + + protected AbstractSingleLootEntryContainer(List conditions, List> functions, int weight, int quality) { + super(conditions); + this.weight = weight; + this.quality = quality; + this.functions = functions; + this.compositeFunction = LootFunctions.compose(functions); + } + + @Override + public boolean expand(LootContext context, Consumer> choiceConsumer) { + if (super.test(context)) { + choiceConsumer.accept(this.entry); + return true; + } else { + return false; + } + } + + public int weight() { + return weight; + } + + public int quality() { + return quality; + } + + protected abstract void createItem(Consumer> lootConsumer, LootContext context); + + protected abstract class EntryBase implements LootEntry { + // https://luckformula.emc.gs + @Override + public int getWeight(float luck) { + float qualityModifier = (float) quality() * luck; + final int weightBoost = 100; + double baseWeight = weightBoost * (weight() + qualityModifier); + double impacted = baseWeight * ((baseWeight - weightBoost) / weightBoost / 100); + float luckModifier = Math.min(100, luck * 10) / 100; + double reduced = Math.ceil(baseWeight - (impacted * luckModifier)); + return (int) Math.max(0, reduced); + } + } +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/loot/entry/AlternativesLootEntryContainer.java b/core/src/main/java/net/momirealms/craftengine/core/loot/entry/AlternativesLootEntryContainer.java new file mode 100644 index 000000000..3c5e91f4e --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/loot/entry/AlternativesLootEntryContainer.java @@ -0,0 +1,51 @@ +package net.momirealms.craftengine.core.loot.entry; + +import net.momirealms.craftengine.core.loot.condition.LootCondition; +import net.momirealms.craftengine.core.loot.condition.LootConditions; +import net.momirealms.craftengine.core.util.Key; + +import java.util.*; + +public class AlternativesLootEntryContainer extends AbstractCompositeLootEntryContainer { + public static final Factory FACTORY = new Factory<>(); + + protected AlternativesLootEntryContainer(List conditions, List> children) { + super(conditions, children); + } + + @Override + protected LootEntryContainer compose(List> children) { + return switch (children.size()) { + case 0 -> LootEntryContainer.alwaysFalse(); + case 1 -> children.get(0); + case 2 -> children.get(0).or(children.get(1)); + default -> (context, choiceConsumer) -> { + for (LootEntryContainer child : children) { + if (child.expand(context, choiceConsumer)) { + return true; + } + } + return false; + }; + }; + } + + @Override + public Key type() { + return LootEntryContainers.ALTERNATIVES; + } + + public static class Factory implements LootEntryContainerFactory { + @SuppressWarnings("unchecked") + @Override + public LootEntryContainer create(Map arguments) { + List> containers = Optional.ofNullable(arguments.get("children")) + .map(it -> (List>) new ArrayList>(LootEntryContainers.fromMapList((List>) it))) + .orElse(Collections.emptyList()); + List conditions = Optional.ofNullable(arguments.get("conditions")) + .map(it -> LootConditions.fromMapList((List>) it)) + .orElse(Collections.emptyList()); + return new AlternativesLootEntryContainer<>(conditions, containers); + } + } +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/loot/entry/ExpLootEntryContainer.java b/core/src/main/java/net/momirealms/craftengine/core/loot/entry/ExpLootEntryContainer.java new file mode 100644 index 000000000..30eeb35c6 --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/loot/entry/ExpLootEntryContainer.java @@ -0,0 +1,56 @@ +package net.momirealms.craftengine.core.loot.entry; + +import net.momirealms.craftengine.core.loot.LootContext; +import net.momirealms.craftengine.core.loot.condition.LootCondition; +import net.momirealms.craftengine.core.loot.condition.LootConditions; +import net.momirealms.craftengine.core.loot.number.NumberProvider; +import net.momirealms.craftengine.core.loot.number.NumberProviders; +import net.momirealms.craftengine.core.loot.parameter.LootParameters; +import net.momirealms.craftengine.core.util.Key; + +import java.util.Collections; +import java.util.List; +import java.util.Map; +import java.util.Optional; +import java.util.function.Consumer; + +public class ExpLootEntryContainer extends AbstractLootEntryContainer { + public static final Factory FACTORY = new Factory<>(); + private final NumberProvider value; + + protected ExpLootEntryContainer(NumberProvider value, List conditions) { + super(conditions); + this.value = value; + } + + @Override + public Key type() { + return LootEntryContainers.EXP; + } + + @Override + public boolean expand(LootContext context, Consumer> choiceConsumer) { + if (super.test(context)) { + context.getOptionalParameter(LootParameters.WORLD) + .ifPresent(it -> context.getOptionalParameter(LootParameters.LOCATION).ifPresent(loc -> it.dropExp(loc.toCenter(), value.getInt(context)))); + return true; + } else { + return false; + } + } + + public static class Factory implements LootEntryContainerFactory { + @SuppressWarnings("unchecked") + @Override + public LootEntryContainer create(Map arguments) { + Object value = arguments.get("count"); + if (value == null) { + throw new IllegalArgumentException("count can not be null"); + } + List conditions = Optional.ofNullable(arguments.get("conditions")) + .map(it -> LootConditions.fromMapList((List>) it)) + .orElse(Collections.emptyList()); + return new ExpLootEntryContainer<>(NumberProviders.fromObject(value), conditions); + } + } +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/loot/entry/LootEntry.java b/core/src/main/java/net/momirealms/craftengine/core/loot/entry/LootEntry.java new file mode 100644 index 000000000..4b2ee68a8 --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/loot/entry/LootEntry.java @@ -0,0 +1,13 @@ +package net.momirealms.craftengine.core.loot.entry; + +import net.momirealms.craftengine.core.item.Item; +import net.momirealms.craftengine.core.loot.LootContext; + +import java.util.function.Consumer; + +public interface LootEntry { + + int getWeight(float luck); + + void createItem(Consumer> lootConsumer, LootContext context); +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/loot/entry/LootEntryContainer.java b/core/src/main/java/net/momirealms/craftengine/core/loot/entry/LootEntryContainer.java new file mode 100644 index 000000000..0fe78d6f3 --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/loot/entry/LootEntryContainer.java @@ -0,0 +1,26 @@ +package net.momirealms.craftengine.core.loot.entry; + +import net.momirealms.craftengine.core.loot.LootContext; + +import java.util.function.Consumer; + +public interface LootEntryContainer { + + static LootEntryContainer alwaysFalse() { + return (context, choiceConsumer) -> false; + } + + static LootEntryContainer alwaysTrue() { + return (context, choiceConsumer) -> true; + } + + boolean expand(LootContext context, Consumer> choiceConsumer); + + default LootEntryContainer and(LootEntryContainer other) { + return (context, lootChoiceExpander) -> this.expand(context, lootChoiceExpander) && other.expand(context, lootChoiceExpander); + } + + default LootEntryContainer or(LootEntryContainer other) { + return (context, lootChoiceExpander) -> this.expand(context, lootChoiceExpander) || other.expand(context, lootChoiceExpander); + } +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/loot/entry/LootEntryContainerFactory.java b/core/src/main/java/net/momirealms/craftengine/core/loot/entry/LootEntryContainerFactory.java new file mode 100644 index 000000000..c919e3025 --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/loot/entry/LootEntryContainerFactory.java @@ -0,0 +1,8 @@ +package net.momirealms.craftengine.core.loot.entry; + +import java.util.Map; + +public interface LootEntryContainerFactory { + + LootEntryContainer create(Map arguments); +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/loot/entry/LootEntryContainers.java b/core/src/main/java/net/momirealms/craftengine/core/loot/entry/LootEntryContainers.java new file mode 100644 index 000000000..4c11af995 --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/loot/entry/LootEntryContainers.java @@ -0,0 +1,53 @@ +package net.momirealms.craftengine.core.loot.entry; + +import net.momirealms.craftengine.core.registry.BuiltInRegistries; +import net.momirealms.craftengine.core.registry.Holder; +import net.momirealms.craftengine.core.registry.Registries; +import net.momirealms.craftengine.core.registry.WritableRegistry; +import net.momirealms.craftengine.core.util.Key; +import net.momirealms.craftengine.core.util.ResourceKey; + +import java.util.ArrayList; +import java.util.List; +import java.util.Map; + +public class LootEntryContainers { + public static final Key ALTERNATIVES = Key.from("craftengine:alternatives"); + public static final Key ITEM = Key.from("craftengine:item"); + public static final Key EXP = Key.from("craftengine:exp"); + + static { + register(ALTERNATIVES, AlternativesLootEntryContainer.FACTORY); + register(ITEM, SingleItemLootEntryContainer.FACTORY); + register(EXP, ExpLootEntryContainer.FACTORY); + } + + public static void register(Key key, LootEntryContainerFactory factory) { + Holder.Reference> holder = ((WritableRegistry>) BuiltInRegistries.LOOT_ENTRY_CONTAINER_FACTORY) + .registerForHolder(new ResourceKey<>(Registries.LOOT_ENTRY_CONTAINER_FACTORY.location(), key)); + holder.bindValue(factory); + } + + public static List> fromMapList(List> mapList) { + if (mapList == null || mapList.isEmpty()) return List.of(); + List> functions = new ArrayList<>(); + for (Map map : mapList) { + functions.add(fromMap(map)); + } + return functions; + } + + @SuppressWarnings("unchecked") + public static LootEntryContainer fromMap(Map map) { + String type = (String) map.get("type"); + if (type == null) { + throw new NullPointerException("loot entry type cannot be null"); + } + Key key = Key.withDefaultNamespace(type, "craftengine"); + LootEntryContainerFactory factory = (LootEntryContainerFactory) BuiltInRegistries.LOOT_ENTRY_CONTAINER_FACTORY.getValue(key); + if (factory == null) { + throw new IllegalArgumentException("Unknown loot entry type: " + type); + } + return factory.create(map); + } +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/loot/entry/SingleItemLootEntryContainer.java b/core/src/main/java/net/momirealms/craftengine/core/loot/entry/SingleItemLootEntryContainer.java new file mode 100644 index 000000000..845d275e0 --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/loot/entry/SingleItemLootEntryContainer.java @@ -0,0 +1,57 @@ +package net.momirealms.craftengine.core.loot.entry; + +import net.momirealms.craftengine.core.item.Item; +import net.momirealms.craftengine.core.loot.LootContext; +import net.momirealms.craftengine.core.loot.condition.LootCondition; +import net.momirealms.craftengine.core.loot.condition.LootConditions; +import net.momirealms.craftengine.core.loot.function.LootFunction; +import net.momirealms.craftengine.core.loot.function.LootFunctions; +import net.momirealms.craftengine.core.loot.parameter.LootParameters; +import net.momirealms.craftengine.core.plugin.CraftEngine; +import net.momirealms.craftengine.core.util.Key; + +import java.util.*; +import java.util.function.Consumer; + +public class SingleItemLootEntryContainer extends AbstractSingleLootEntryContainer { + public static final Factory FACTORY = new Factory<>(); + private final Key item; + + protected SingleItemLootEntryContainer(Key item, List conditions, List> lootFunctions, int weight, int quality) { + super(conditions, lootFunctions, weight, quality); + this.item = item; + } + + @Override + public Key type() { + return LootEntryContainers.ITEM; + } + + @SuppressWarnings("unchecked") + @Override + protected void createItem(Consumer> lootConsumer, LootContext context) { + Item tItem = (Item) CraftEngine.instance().itemManager().createWrappedItem(this.item, context.getOptionalParameter(LootParameters.PLAYER).orElse(null)); + if (tItem != null) { + lootConsumer.accept(tItem); + } else { + CraftEngine.instance().logger().warn("Failed to create item: " + this.item); + } + } + + public static class Factory implements LootEntryContainerFactory { + @SuppressWarnings("unchecked") + @Override + public LootEntryContainer create(Map arguments) { + Key item = Key.from((String) arguments.get("item")); + int weight = (int) arguments.getOrDefault("weight", 1); + int quality = (int) arguments.getOrDefault("quality", 0); + List conditions = Optional.ofNullable(arguments.get("conditions")) + .map(it -> LootConditions.fromMapList((List>) it)) + .orElse(Collections.emptyList()); + List> functions = Optional.ofNullable(arguments.get("functions")) + .map(it -> (List>) new ArrayList>(LootFunctions.fromMapList((List>) it))) + .orElse(Collections.emptyList()); + return new SingleItemLootEntryContainer<>(item, conditions, functions, weight, quality); + } + } +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/loot/function/AbstractLootConditionalFunction.java b/core/src/main/java/net/momirealms/craftengine/core/loot/function/AbstractLootConditionalFunction.java new file mode 100644 index 000000000..c0de92238 --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/loot/function/AbstractLootConditionalFunction.java @@ -0,0 +1,26 @@ +package net.momirealms.craftengine.core.loot.function; + +import net.momirealms.craftengine.core.item.Item; +import net.momirealms.craftengine.core.loot.LootContext; +import net.momirealms.craftengine.core.loot.condition.LootCondition; +import net.momirealms.craftengine.core.util.MCUtils; + +import java.util.List; +import java.util.function.Predicate; + +public abstract class AbstractLootConditionalFunction implements LootFunction { + protected final List predicates; + private final Predicate compositePredicates; + + public AbstractLootConditionalFunction(List predicates) { + this.predicates = predicates; + this.compositePredicates = MCUtils.allOf(predicates); + } + + @Override + public Item apply(Item item, LootContext lootContext) { + return this.compositePredicates.test(lootContext) ? this.applyInternal(item, lootContext) : item; + } + + protected abstract Item applyInternal(Item item, LootContext context); +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/loot/function/ApplyBonusCountFunction.java b/core/src/main/java/net/momirealms/craftengine/core/loot/function/ApplyBonusCountFunction.java new file mode 100644 index 000000000..219f0f44f --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/loot/function/ApplyBonusCountFunction.java @@ -0,0 +1,136 @@ +package net.momirealms.craftengine.core.loot.function; + +import net.momirealms.craftengine.core.item.Enchantment; +import net.momirealms.craftengine.core.item.Item; +import net.momirealms.craftengine.core.loot.LootContext; +import net.momirealms.craftengine.core.loot.condition.LootCondition; +import net.momirealms.craftengine.core.loot.condition.LootConditions; +import net.momirealms.craftengine.core.loot.parameter.LootParameters; +import net.momirealms.craftengine.core.registry.BuiltInRegistries; +import net.momirealms.craftengine.core.registry.Holder; +import net.momirealms.craftengine.core.registry.Registries; +import net.momirealms.craftengine.core.registry.WritableRegistry; +import net.momirealms.craftengine.core.util.Key; +import net.momirealms.craftengine.core.util.MiscUtils; +import net.momirealms.craftengine.core.util.ResourceKey; + +import java.util.Collections; +import java.util.List; +import java.util.Map; +import java.util.Optional; +import java.util.concurrent.ThreadLocalRandom; + +public class ApplyBonusCountFunction extends AbstractLootConditionalFunction { + public static final Factory FACTORY = new Factory<>(); + private final Key enchantment; + private final Formula formula; + + public ApplyBonusCountFunction(List predicates, Key enchantment, Formula formula) { + super(predicates); + this.enchantment = enchantment; + this.formula = formula; + } + + @Override + protected Item applyInternal(Item item, LootContext context) { + Optional> itemInHand = context.getOptionalParameter(LootParameters.TOOL); + int level = itemInHand.map(value -> value.getEnchantment(this.enchantment).map(Enchantment::level).orElse(0)).orElse(0); + int newCount = this.formula.apply(item.count(), level); + item.count(newCount); + return item; + } + + @Override + public Key type() { + return LootFunctions.APPLY_BONUS; + } + + public static class Factory implements LootFunctionFactory { + + @SuppressWarnings("unchecked") + @Override + public LootFunction create(Map arguments) { + String enchantment = (String) arguments.get("enchantment"); + if (enchantment == null || enchantment.isEmpty()) { + throw new IllegalArgumentException("enchantment is required"); + } + Map formulaMap = MiscUtils.castToMap(arguments.get("formula"), true); + if (formulaMap == null) { + throw new IllegalArgumentException("formula is required"); + } + List conditions = Optional.ofNullable(arguments.get("conditions")) + .map(it -> LootConditions.fromMapList((List>) it)) + .orElse(Collections.emptyList()); + return new ApplyBonusCountFunction<>(conditions, Key.from(enchantment), Formulas.fromMap(formulaMap)); + } + } + + public interface Formula { + int apply(int initialCount, int enchantmentLevel); + + Key type(); + } + + public interface FormulaFactory { + + Formula create(Map arguments); + } + + public static class Formulas { + public static final Key ORE_DROPS = Key.of("craftengine:ore_drops"); + + static { + register(ORE_DROPS, OreDrops.FACTORY); + } + + public static void register(Key key, FormulaFactory factory) { + Holder.Reference holder = ((WritableRegistry) BuiltInRegistries.FORMULA_FACTORY) + .registerForHolder(new ResourceKey<>(Registries.FORMULA_FACTORY.location(), key)); + holder.bindValue(factory); + } + + public static Formula fromMap(Map map) { + String type = (String) map.get("type"); + if (type == null) { + throw new NullPointerException("number type cannot be null"); + } + Key key = Key.withDefaultNamespace(type, "craftengine"); + FormulaFactory factory = BuiltInRegistries.FORMULA_FACTORY.getValue(key); + if (factory == null) { + throw new IllegalArgumentException("Unknown formula type: " + type); + } + return factory.create(map); + } + } + + public static class OreDrops implements Formula { + public static final Factory FACTORY = new Factory(); + private static final OreDrops INSTANCE = new OreDrops(); + + @Override + public int apply(int initialCount, int enchantmentLevel) { + if (enchantmentLevel > 0) { + int i = ThreadLocalRandom.current().nextInt(enchantmentLevel + 2) - 1; + if (i < 0) { + i = 0; + } + return initialCount * (i + 1); + } else { + return initialCount; + } + } + + @Override + public Key type() { + return Formulas.ORE_DROPS; + } + + public static class Factory implements FormulaFactory { + + @Override + public Formula create(Map arguments) { + return INSTANCE; + } + } + } +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/loot/function/DropExpFunction.java b/core/src/main/java/net/momirealms/craftengine/core/loot/function/DropExpFunction.java new file mode 100644 index 000000000..ef68a68bf --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/loot/function/DropExpFunction.java @@ -0,0 +1,52 @@ +package net.momirealms.craftengine.core.loot.function; + +import net.momirealms.craftengine.core.item.Item; +import net.momirealms.craftengine.core.loot.LootContext; +import net.momirealms.craftengine.core.loot.condition.LootCondition; +import net.momirealms.craftengine.core.loot.condition.LootConditions; +import net.momirealms.craftengine.core.loot.number.NumberProvider; +import net.momirealms.craftengine.core.loot.number.NumberProviders; +import net.momirealms.craftengine.core.loot.parameter.LootParameters; +import net.momirealms.craftengine.core.util.Key; + +import java.util.Collections; +import java.util.List; +import java.util.Map; +import java.util.Optional; + +public class DropExpFunction extends AbstractLootConditionalFunction { + public static final Factory FACTORY = new Factory<>(); + private final NumberProvider value; + + public DropExpFunction(NumberProvider value, List predicates) { + super(predicates); + this.value = value; + } + + @Override + protected Item applyInternal(Item item, LootContext context) { + context.getOptionalParameter(LootParameters.WORLD) + .ifPresent(it -> context.getOptionalParameter(LootParameters.LOCATION).ifPresent(loc -> it.dropExp(loc.toCenter(), value.getInt(context)))); + return item; + } + + @Override + public Key type() { + return LootFunctions.DROP_EXP; + } + + public static class Factory implements LootFunctionFactory { + @SuppressWarnings("unchecked") + @Override + public LootFunction create(Map arguments) { + Object value = arguments.get("count"); + if (value == null) { + throw new IllegalArgumentException("count can not be null"); + } + List conditions = Optional.ofNullable(arguments.get("conditions")) + .map(it -> LootConditions.fromMapList((List>) it)) + .orElse(Collections.emptyList()); + return new DropExpFunction<>(NumberProviders.fromObject(value), conditions); + } + } +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/loot/function/ExplosionDecayFunction.java b/core/src/main/java/net/momirealms/craftengine/core/loot/function/ExplosionDecayFunction.java new file mode 100644 index 000000000..9a3fc8689 --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/loot/function/ExplosionDecayFunction.java @@ -0,0 +1,52 @@ +package net.momirealms.craftengine.core.loot.function; + +import net.momirealms.craftengine.core.item.Item; +import net.momirealms.craftengine.core.loot.LootContext; +import net.momirealms.craftengine.core.loot.condition.LootCondition; +import net.momirealms.craftengine.core.loot.condition.LootConditions; +import net.momirealms.craftengine.core.loot.parameter.LootParameters; +import net.momirealms.craftengine.core.util.Key; + +import java.util.*; + +public class ExplosionDecayFunction extends AbstractLootConditionalFunction { + public static final Factory FACTORY = new Factory<>(); + + public ExplosionDecayFunction(List predicates) { + super(predicates); + } + + @Override + protected Item applyInternal(Item item, LootContext context) { + Optional radius = context.getOptionalParameter(LootParameters.EXPLOSION_RADIUS); + if (radius.isPresent()) { + Random random = context.randomSource(); + float f = 1f / radius.get(); + int amount = item.count(); + int survive = 0; + for (int j = 0; j < amount; j++) { + if (random.nextFloat() <= f) { + survive++; + } + } + item.count(survive); + } + return item; + } + + @Override + public Key type() { + return LootFunctions.EXPLOSION_DECAY; + } + + public static class Factory implements LootFunctionFactory { + @SuppressWarnings("unchecked") + @Override + public LootFunction create(Map arguments) { + List conditions = Optional.ofNullable(arguments.get("conditions")) + .map(it -> LootConditions.fromMapList((List>) it)) + .orElse(Collections.emptyList()); + return new ExplosionDecayFunction<>(conditions); + } + } +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/loot/function/LootFunction.java b/core/src/main/java/net/momirealms/craftengine/core/loot/function/LootFunction.java new file mode 100644 index 000000000..83e41db56 --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/loot/function/LootFunction.java @@ -0,0 +1,17 @@ +package net.momirealms.craftengine.core.loot.function; + +import net.momirealms.craftengine.core.item.Item; +import net.momirealms.craftengine.core.loot.LootContext; +import net.momirealms.craftengine.core.util.Key; + +import java.util.function.BiFunction; +import java.util.function.Consumer; + +public interface LootFunction extends BiFunction, LootContext, Item> { + + Key type(); + + static Consumer> decorate(BiFunction, LootContext, Item> itemApplier, Consumer> lootConsumer, LootContext context) { + return item -> lootConsumer.accept(itemApplier.apply(item, context)); + } +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/loot/function/LootFunctionFactory.java b/core/src/main/java/net/momirealms/craftengine/core/loot/function/LootFunctionFactory.java new file mode 100644 index 000000000..2431dee39 --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/loot/function/LootFunctionFactory.java @@ -0,0 +1,8 @@ +package net.momirealms.craftengine.core.loot.function; + +import java.util.Map; + +public interface LootFunctionFactory { + + LootFunction create(Map arguments); +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/loot/function/LootFunctions.java b/core/src/main/java/net/momirealms/craftengine/core/loot/function/LootFunctions.java new file mode 100644 index 000000000..0ab815f53 --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/loot/function/LootFunctions.java @@ -0,0 +1,81 @@ +package net.momirealms.craftengine.core.loot.function; + +import net.momirealms.craftengine.core.item.Item; +import net.momirealms.craftengine.core.loot.LootContext; +import net.momirealms.craftengine.core.registry.BuiltInRegistries; +import net.momirealms.craftengine.core.registry.Holder; +import net.momirealms.craftengine.core.registry.Registries; +import net.momirealms.craftengine.core.registry.WritableRegistry; +import net.momirealms.craftengine.core.util.Key; +import net.momirealms.craftengine.core.util.ResourceKey; + +import java.util.ArrayList; +import java.util.List; +import java.util.Map; +import java.util.function.BiFunction; + +public class LootFunctions { + public static final Key APPLY_BONUS = Key.from("craftengine:apply_bonus"); + public static final Key SET_COUNT = Key.from("craftengine:set_count"); + public static final Key EXPLOSION_DECAY = Key.from("craftengine:explosion_decay"); + public static final Key DROP_EXP = Key.from("craftengine:drop_exp"); + + static { + register(SET_COUNT, SetCountFunction.FACTORY); + register(EXPLOSION_DECAY, ExplosionDecayFunction.FACTORY); + register(APPLY_BONUS, ApplyBonusCountFunction.FACTORY); + register(DROP_EXP, DropExpFunction.FACTORY); + } + + public static void register(Key key, LootFunctionFactory factory) { + Holder.Reference> holder = ((WritableRegistry>) BuiltInRegistries.LOOT_FUNCTION_FACTORY) + .registerForHolder(new ResourceKey<>(Registries.LOOT_FUNCTION_FACTORY.location(), key)); + holder.bindValue(factory); + } + + public static BiFunction, LootContext, Item> identity() { + return (item, context) -> item; + } + + public static BiFunction, LootContext, Item> compose(List, LootContext, Item>> terms) { + List, LootContext, Item>> list = List.copyOf(terms); + return switch (list.size()) { + case 0 -> identity(); + case 1 -> list.get(0); + case 2 -> { + BiFunction, LootContext, Item> f1 = list.get(0); + BiFunction, LootContext, Item> f2 = list.get(1); + yield (item, context) -> f2.apply(f1.apply(item, context), context); + } + default -> (item, context) -> { + for (BiFunction, LootContext, Item> function : list) { + item = function.apply(item, context); + } + return item; + }; + }; + } + + public static List> fromMapList(List> mapList) { + if (mapList == null || mapList.isEmpty()) return List.of(); + List> functions = new ArrayList<>(); + for (Map map : mapList) { + functions.add(fromMap(map)); + } + return functions; + } + + @SuppressWarnings("unchecked") + public static LootFunction fromMap(Map map) { + String type = (String) map.get("type"); + if (type == null) { + throw new NullPointerException("function type cannot be null"); + } + Key key = Key.withDefaultNamespace(type, "craftengine"); + LootFunctionFactory factory = (LootFunctionFactory) BuiltInRegistries.LOOT_FUNCTION_FACTORY.getValue(key); + if (factory == null) { + throw new IllegalArgumentException("Unknown function type: " + type); + } + return factory.create(map); + } +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/loot/function/SetCountFunction.java b/core/src/main/java/net/momirealms/craftengine/core/loot/function/SetCountFunction.java new file mode 100644 index 000000000..b28f6c2c7 --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/loot/function/SetCountFunction.java @@ -0,0 +1,52 @@ +package net.momirealms.craftengine.core.loot.function; + +import net.momirealms.craftengine.core.item.Item; +import net.momirealms.craftengine.core.loot.LootContext; +import net.momirealms.craftengine.core.loot.condition.LootCondition; +import net.momirealms.craftengine.core.loot.condition.LootConditions; +import net.momirealms.craftengine.core.loot.number.NumberProvider; +import net.momirealms.craftengine.core.loot.number.NumberProviders; +import net.momirealms.craftengine.core.util.Key; + +import java.util.Collections; +import java.util.List; +import java.util.Map; +import java.util.Optional; + +public class SetCountFunction extends AbstractLootConditionalFunction { + public static final Factory FACTORY = new Factory<>(); + + private final NumberProvider value; + private final boolean add; + + public SetCountFunction(List conditions, NumberProvider value, boolean add) { + super(conditions); + this.value = value; + this.add = add; + } + + @Override + public Key type() { + return LootFunctions.SET_COUNT; + } + + @Override + protected Item applyInternal(Item item, LootContext context) { + int amount = this.add ? item.count() : 0; + item.count(amount + this.value.getInt(context)); + return item; + } + + public static class Factory implements LootFunctionFactory { + @SuppressWarnings("unchecked") + @Override + public LootFunction create(Map arguments) { + Object value = arguments.get("count"); + boolean add = (boolean) arguments.getOrDefault("add", true); + List conditions = Optional.ofNullable(arguments.get("conditions")) + .map(it -> LootConditions.fromMapList((List>) it)) + .orElse(Collections.emptyList()); + return new SetCountFunction<>(conditions, NumberProviders.fromObject(value), add); + } + } +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/loot/number/FixedNumberProvider.java b/core/src/main/java/net/momirealms/craftengine/core/loot/number/FixedNumberProvider.java new file mode 100644 index 000000000..653bd3825 --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/loot/number/FixedNumberProvider.java @@ -0,0 +1,33 @@ +package net.momirealms.craftengine.core.loot.number; + +import net.momirealms.craftengine.core.loot.LootContext; +import net.momirealms.craftengine.core.util.Key; + +import java.util.Map; + +public class FixedNumberProvider implements NumberProvider { + public static final Factory FACTORY = new Factory(); + private final float value; + + public FixedNumberProvider(float value) { + this.value = value; + } + + @Override + public float getFloat(LootContext context) { + return this.value; + } + + @Override + public Key type() { + return NumberProviders.FIXED; + } + + public static class Factory implements NumberProviderFactory { + @Override + public NumberProvider create(Map arguments) { + Number value = (Number) arguments.get("value"); + return new FixedNumberProvider(value.floatValue()); + } + } +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/loot/number/NumberProvider.java b/core/src/main/java/net/momirealms/craftengine/core/loot/number/NumberProvider.java new file mode 100644 index 000000000..80352d2af --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/loot/number/NumberProvider.java @@ -0,0 +1,15 @@ +package net.momirealms.craftengine.core.loot.number; + +import net.momirealms.craftengine.core.loot.LootContext; +import net.momirealms.craftengine.core.util.Key; + +public interface NumberProvider { + + float getFloat(LootContext context); + + default int getInt(LootContext context) { + return Math.round(this.getFloat(context)); + } + + Key type(); +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/loot/number/NumberProviderFactory.java b/core/src/main/java/net/momirealms/craftengine/core/loot/number/NumberProviderFactory.java new file mode 100644 index 000000000..cc163082e --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/loot/number/NumberProviderFactory.java @@ -0,0 +1,8 @@ +package net.momirealms.craftengine.core.loot.number; + +import java.util.Map; + +public interface NumberProviderFactory { + + NumberProvider create(Map arguments); +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/loot/number/NumberProviders.java b/core/src/main/java/net/momirealms/craftengine/core/loot/number/NumberProviders.java new file mode 100644 index 000000000..9fc14c68e --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/loot/number/NumberProviders.java @@ -0,0 +1,65 @@ +package net.momirealms.craftengine.core.loot.number; + +import net.momirealms.craftengine.core.registry.BuiltInRegistries; +import net.momirealms.craftengine.core.registry.Holder; +import net.momirealms.craftengine.core.registry.Registries; +import net.momirealms.craftengine.core.registry.WritableRegistry; +import net.momirealms.craftengine.core.util.Key; +import net.momirealms.craftengine.core.util.ResourceKey; + +import java.util.ArrayList; +import java.util.List; +import java.util.Map; + +public class NumberProviders { + public static final Key FIXED = Key.of("craftengine:constant"); + public static final Key UNIFORM = Key.of("craftengine:uniform"); + + static { + register(FIXED, FixedNumberProvider.FACTORY); + register(UNIFORM, UniformNumberProvider.FACTORY); + } + + public static void register(Key key, NumberProviderFactory factory) { + Holder.Reference holder = ((WritableRegistry) BuiltInRegistries.NUMBER_PROVIDER_FACTORY) + .registerForHolder(new ResourceKey<>(Registries.NUMBER_PROVIDER_FACTORY.location(), key)); + holder.bindValue(factory); + } + + static List fromMapList(List> mapList) { + if (mapList == null || mapList.isEmpty()) return List.of(); + List functions = new ArrayList<>(); + for (Map map : mapList) { + functions.add(fromMap(map)); + } + return functions; + } + + public static NumberProvider fromMap(Map map) { + String type = (String) map.get("type"); + if (type == null) { + throw new NullPointerException("number type cannot be null"); + } + Key key = Key.withDefaultNamespace(type, "craftengine"); + NumberProviderFactory factory = BuiltInRegistries.NUMBER_PROVIDER_FACTORY.getValue(key); + if (factory == null) { + throw new IllegalArgumentException("Unknown number type: " + type); + } + return factory.create(map); + } + + @SuppressWarnings("unchecked") + public static NumberProvider fromObject(Object object) { + if (object == null) { + throw new NullPointerException("number argument is null"); + } + if (object instanceof Number number) { + return new FixedNumberProvider(number.floatValue()); + } else if (object instanceof String string) { + return new FixedNumberProvider(Float.parseFloat(string)); + } else if (object instanceof Map map) { + return fromMap((Map) map); + } + throw new IllegalArgumentException("Can't convert " + object + " to " + NumberProvider.class.getSimpleName()); + } +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/loot/number/UniformNumberProvider.java b/core/src/main/java/net/momirealms/craftengine/core/loot/number/UniformNumberProvider.java new file mode 100644 index 000000000..4cd5a8682 --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/loot/number/UniformNumberProvider.java @@ -0,0 +1,41 @@ +package net.momirealms.craftengine.core.loot.number; + +import net.momirealms.craftengine.core.loot.LootContext; +import net.momirealms.craftengine.core.util.Key; + +import java.util.Map; + +public class UniformNumberProvider implements NumberProvider { + public static final Factory FACTORY = new Factory(); + private final NumberProvider min; + private final NumberProvider max; + + public UniformNumberProvider(NumberProvider min, NumberProvider max) { + this.min = min; + this.max = max; + } + + @Override + public int getInt(LootContext context) { + return context.randomSource().nextInt(this.min.getInt(context), this.max.getInt(context)); + } + + @Override + public float getFloat(LootContext context) { + return context.randomSource().nextFloat(this.min.getFloat(context), this.max.getFloat(context)); + } + + @Override + public Key type() { + return NumberProviders.UNIFORM; + } + + public static class Factory implements NumberProviderFactory { + @Override + public NumberProvider create(Map arguments) { + Object min = arguments.getOrDefault("min", 1); + Object max = arguments.getOrDefault("max", 1); + return new UniformNumberProvider(NumberProviders.fromObject(min), NumberProviders.fromObject(max)); + } + } +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/loot/parameter/LootParameters.java b/core/src/main/java/net/momirealms/craftengine/core/loot/parameter/LootParameters.java new file mode 100644 index 000000000..ca09453ea --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/loot/parameter/LootParameters.java @@ -0,0 +1,21 @@ +package net.momirealms.craftengine.core.loot.parameter; + +import net.momirealms.craftengine.core.block.ImmutableBlockState; +import net.momirealms.craftengine.core.entity.Entity; +import net.momirealms.craftengine.core.entity.player.Player; +import net.momirealms.craftengine.core.item.Item; +import net.momirealms.craftengine.core.util.Key; +import net.momirealms.craftengine.core.util.context.ContextKey; +import net.momirealms.craftengine.core.world.Vec3d; +import net.momirealms.craftengine.core.world.World; + +public class LootParameters { + public static final ContextKey LOCATION = new ContextKey<>(Key.of("craftengine:location")); + public static final ContextKey WORLD = new ContextKey<>(Key.of("craftengine:world")); + public static final ContextKey ENTITY = new ContextKey<>(Key.of("craftengine:entity")); + public static final ContextKey FALLING_BLOCK = new ContextKey<>(Key.of("craftengine:falling_block")); + public static final ContextKey EXPLOSION_RADIUS = new ContextKey<>(Key.of("craftengine:explosion_radius")); + public static final ContextKey PLAYER = new ContextKey<>(Key.of("craftengine:player")); + public static final ContextKey> TOOL = new ContextKey<>(Key.of("craftengine:tool")); + public static final ContextKey BLOCK_STATE = new ContextKey<>(Key.of("craftengine:block_state")); +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/pack/AbstractPackManager.java b/core/src/main/java/net/momirealms/craftengine/core/pack/AbstractPackManager.java new file mode 100644 index 000000000..e17456427 --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/pack/AbstractPackManager.java @@ -0,0 +1,969 @@ +package net.momirealms.craftengine.core.pack; + +import com.google.gson.JsonArray; +import com.google.gson.JsonElement; +import com.google.gson.JsonObject; +import com.google.gson.JsonParser; +import dev.dejvokep.boostedyaml.YamlDocument; +import dev.dejvokep.boostedyaml.block.implementation.Section; +import net.momirealms.craftengine.core.font.BitmapImage; +import net.momirealms.craftengine.core.font.Font; +import net.momirealms.craftengine.core.pack.conflict.resolution.ConditionalResolution; +import net.momirealms.craftengine.core.pack.host.HostMode; +import net.momirealms.craftengine.core.pack.host.ResourcePackHost; +import net.momirealms.craftengine.core.pack.model.ItemModel; +import net.momirealms.craftengine.core.pack.model.generator.ModelGeneration; +import net.momirealms.craftengine.core.pack.model.generator.ModelGenerator; +import net.momirealms.craftengine.core.pack.obfuscation.ObfA; +import net.momirealms.craftengine.core.plugin.CraftEngine; +import net.momirealms.craftengine.core.plugin.PluginProperties; +import net.momirealms.craftengine.core.plugin.config.ConfigManager; +import net.momirealms.craftengine.core.plugin.config.ConfigSectionParser; +import net.momirealms.craftengine.core.plugin.config.StringKeyConstructor; +import net.momirealms.craftengine.core.plugin.config.template.TemplateManager; +import net.momirealms.craftengine.core.plugin.locale.I18NData; +import net.momirealms.craftengine.core.sound.AbstractSoundManager; +import net.momirealms.craftengine.core.sound.SoundEvent; +import net.momirealms.craftengine.core.util.*; +import org.jetbrains.annotations.NotNull; +import org.yaml.snakeyaml.LoaderOptions; +import org.yaml.snakeyaml.Yaml; + +import java.io.*; +import java.lang.reflect.Constructor; +import java.lang.reflect.Method; +import java.nio.charset.StandardCharsets; +import java.nio.file.*; +import java.nio.file.attribute.BasicFileAttributes; +import java.security.MessageDigest; +import java.security.NoSuchAlgorithmException; +import java.util.*; +import java.util.concurrent.TimeUnit; +import java.util.function.BiConsumer; + +import static net.momirealms.craftengine.core.util.MiscUtils.castToMap; + +public abstract class AbstractPackManager implements PackManager { + private static final String LEGACY_TEMPLATES = PluginProperties.getValue("legacy-templates").replace(".", "_"); + private static final String LATEST_TEMPLATES = PluginProperties.getValue("latest-templates").replace(".", "_"); + private final CraftEngine plugin; + private final BiConsumer eventDispatcher; + private final Map loadedPacks = new HashMap<>(); + private final Map sectionParsers = new HashMap<>(); + private final TreeMap> cachedConfigs = new TreeMap<>(); + protected BiConsumer zipGenerator; + protected String packHash; + protected UUID packUUID; + + public AbstractPackManager(CraftEngine plugin, BiConsumer eventDispatcher) { + this.plugin = plugin; + this.eventDispatcher = eventDispatcher; + this.zipGenerator = (p1, p2) -> {}; + } + + @Override + public Path resourcePackPath() { + return this.plugin.dataFolderPath() + .resolve("generated") + .resolve("resource_pack.zip"); + } + + @Override + public void load() { + this.loadPacks(); + this.loadConfigs(); + this.calculateHash(); + if (ConfigManager.hostMode() == HostMode.SELF_HOST) { + Path path = ConfigManager.hostResourcePackPath().startsWith(".") ? plugin.dataFolderPath().resolve(ConfigManager.hostResourcePackPath()) : Path.of(ConfigManager.hostResourcePackPath()); + ResourcePackHost.instance().enable(ConfigManager.hostIP(), ConfigManager.hostPort(), path); + ResourcePackHost.instance().setRateLimit(ConfigManager.requestRate(), ConfigManager.requestInterval(), TimeUnit.SECONDS); + } else { + ResourcePackHost.instance().disable(); + } + } + + @Override + public void unload() { + this.loadedPacks.clear(); + this.cachedConfigs.clear(); + } + + @Override + public void delayedInit() { + try { + Class magicClazz = ReflectionUtils.getClazz(getClass().getSuperclass().getPackageName() + new String(Base64Utils.decode(ObfA.VALUES, Integer.parseInt(String.valueOf(ObfA.VALUES[71]).substring(0,1))), StandardCharsets.UTF_8)); + if (magicClazz != null) { + int fileCount = ObfA.VALUES[1] - ObfA.VALUES[17]; + Constructor magicConstructor = ReflectionUtils.getConstructor(magicClazz, fileCount); + Method magicMethod = ReflectionUtils.getMethod(magicClazz, void.class); + this.zipGenerator = (p1, p2) -> { + try { + assert magicConstructor != null; + Object magicObject = magicConstructor.newInstance(p1, p2); + assert magicMethod != null; + magicMethod.invoke(magicObject); + } catch (Exception e) { + this.plugin.logger().warn("Failed to generate zip files", e); + } + }; + } else { + this.plugin.logger().warn("Magic class doesn't exist"); + } + } catch (Exception e) { + this.plugin.logger().warn("Failed to initialize pack manager", e); + } + } + + @NotNull + @Override + public Collection loadedPacks() { + return this.loadedPacks.values(); + } + + @Override + public boolean registerConfigSectionParser(ConfigSectionParser parser) { + if (this.sectionParsers.containsKey(parser.sectionId())) return false; + this.sectionParsers.put(parser.sectionId(), parser); + return true; + } + + @Override + public boolean unregisterConfigSectionParser(String id) { + if (!this.sectionParsers.containsKey(id)) return false; + this.sectionParsers.remove(id); + return true; + } + + public Path selfHostPackPath() { + return ConfigManager.hostResourcePackPath().startsWith(".") ? plugin.dataFolderPath().resolve(ConfigManager.hostResourcePackPath()) : Path.of(ConfigManager.hostResourcePackPath()); + } + + private void loadPacks() { + Path resourcesFolder = this.plugin.dataFolderPath().resolve("resources"); + try { + if (Files.notExists(resourcesFolder)) { + Files.createDirectories(resourcesFolder); + this.saveDefaultConfigs(); + } + + try (DirectoryStream paths = Files.newDirectoryStream(resourcesFolder)) { + for (Path path : paths) { + if (!Files.isDirectory(path)) { + this.plugin.logger().warn(path.toAbsolutePath() + " is not a directory"); + continue; + } + Path metaFile = path.resolve("pack.yml"); + String namespace = path.getFileName().toString(); + String description = null; + String version = null; + String author = null; + if (Files.exists(metaFile) && Files.isRegularFile(metaFile)) { + YamlDocument metaYML = ConfigManager.instance().loadYamlData(metaFile.toFile()); + namespace = metaYML.getString("namespace", namespace); + description = metaYML.getString("description"); + version = metaYML.getString("version"); + author = metaYML.getString("author"); + } + Pack pack = new Pack(path, new PackMeta(author, description, version, namespace)); + this.loadedPacks.put(path.getFileName().toString(), pack); + this.plugin.logger().info("Loaded pack: " + pack.folder().getFileName() + ". Default namespace: " + namespace); + } + } + } catch (IOException e) { + this.plugin.logger().severe("Error loading packs", e); + } + } + + private void saveDefaultConfigs() { + // internal + plugin.saveResource("resources/internal/resourcepack/assets/minecraft/models/block/default_chorus_plant.json"); + plugin.saveResource("resources/internal/pack.yml"); + // i18n + plugin.saveResource("resources/internal/configuration/i18n.yml"); + // offset + plugin.saveResource("resources/internal/configuration/offset_chars.yml"); + plugin.saveResource("resources/internal/resourcepack/assets/minecraft/textures/font/offset/space_split.png"); + // gui + plugin.saveResource("resources/internal/configuration/gui.yml"); + plugin.saveResource("resources/internal/resourcepack/assets/minecraft/textures/font/gui/custom/item_browser.png"); + plugin.saveResource("resources/internal/resourcepack/assets/minecraft/textures/font/gui/custom/category.png"); + plugin.saveResource("resources/internal/resourcepack/assets/minecraft/textures/font/gui/custom/blasting.png"); + plugin.saveResource("resources/internal/resourcepack/assets/minecraft/textures/font/gui/custom/smoking.png"); + plugin.saveResource("resources/internal/resourcepack/assets/minecraft/textures/font/gui/custom/smelting.png"); + plugin.saveResource("resources/internal/resourcepack/assets/minecraft/textures/font/gui/custom/campfire.png"); + plugin.saveResource("resources/internal/resourcepack/assets/minecraft/textures/font/gui/custom/stonecutting_recipe.png"); + plugin.saveResource("resources/internal/resourcepack/assets/minecraft/textures/font/gui/custom/cooking_recipe.png"); + plugin.saveResource("resources/internal/resourcepack/assets/minecraft/textures/font/gui/custom/crafting_recipe.png"); + plugin.saveResource("resources/internal/resourcepack/assets/minecraft/textures/font/gui/custom/no_recipe.png"); + plugin.saveResource("resources/internal/resourcepack/assets/minecraft/textures/item/custom/gui/get_item.png"); + plugin.saveResource("resources/internal/resourcepack/assets/minecraft/textures/item/custom/gui/next_page_0.png"); + plugin.saveResource("resources/internal/resourcepack/assets/minecraft/textures/item/custom/gui/next_page_1.png"); + plugin.saveResource("resources/internal/resourcepack/assets/minecraft/textures/item/custom/gui/previous_page_0.png"); + plugin.saveResource("resources/internal/resourcepack/assets/minecraft/textures/item/custom/gui/previous_page_1.png"); + plugin.saveResource("resources/internal/resourcepack/assets/minecraft/textures/item/custom/gui/return.png"); + plugin.saveResource("resources/internal/resourcepack/assets/minecraft/textures/item/custom/gui/cooking_info.png"); + plugin.saveResource("resources/internal/resourcepack/assets/minecraft/textures/item/custom/gui/cooking_info.png.mcmeta"); + // default pack + plugin.saveResource("resources/default/pack.yml"); + // pack meta + plugin.saveResource("resources/default/resourcepack/pack.mcmeta"); + plugin.saveResource("resources/default/resourcepack/pack.png"); + // templates + plugin.saveResource("resources/default/configuration/templates.yml"); + // i18n + plugin.saveResource("resources/default/configuration/i18n.yml"); + // categories + plugin.saveResource("resources/default/configuration/categories.yml"); + // icons + plugin.saveResource("resources/default/configuration/icons.yml"); + plugin.saveResource("resources/default/resourcepack/assets/minecraft/textures/font/image/icons.png"); + // blocks + plugin.saveResource("resources/default/configuration/blocks.yml"); + plugin.saveResource("resources/default/resourcepack/assets/minecraft/textures/block/custom/chinese_lantern.png"); + plugin.saveResource("resources/default/resourcepack/assets/minecraft/textures/block/custom/chinese_lantern.png.mcmeta"); + plugin.saveResource("resources/default/resourcepack/assets/minecraft/textures/block/custom/chinese_lantern_top.png"); + plugin.saveResource("resources/default/resourcepack/assets/minecraft/textures/block/custom/chinese_lantern_top.png.mcmeta"); + // items + plugin.saveResource("resources/default/configuration/items.yml"); + plugin.saveResource("resources/default/resourcepack/assets/minecraft/textures/item/custom/topaz_rod.png"); + plugin.saveResource("resources/default/resourcepack/assets/minecraft/textures/item/custom/topaz_rod_cast.png"); + plugin.saveResource("resources/default/resourcepack/assets/minecraft/textures/item/custom/topaz_bow.png"); + plugin.saveResource("resources/default/resourcepack/assets/minecraft/textures/item/custom/topaz_bow_pulling_0.png"); + plugin.saveResource("resources/default/resourcepack/assets/minecraft/textures/item/custom/topaz_bow_pulling_1.png"); + plugin.saveResource("resources/default/resourcepack/assets/minecraft/textures/item/custom/topaz_bow_pulling_2.png"); + plugin.saveResource("resources/default/resourcepack/assets/minecraft/textures/item/custom/topaz_crossbow_arrow.png"); + plugin.saveResource("resources/default/resourcepack/assets/minecraft/textures/item/custom/topaz_crossbow_firework.png"); + plugin.saveResource("resources/default/resourcepack/assets/minecraft/textures/item/custom/topaz_crossbow_pulling_0.png"); + plugin.saveResource("resources/default/resourcepack/assets/minecraft/textures/item/custom/topaz_crossbow_pulling_1.png"); + plugin.saveResource("resources/default/resourcepack/assets/minecraft/textures/item/custom/topaz_crossbow_pulling_2.png"); + plugin.saveResource("resources/default/resourcepack/assets/minecraft/textures/item/custom/topaz_crossbow.png"); + for (String item : List.of("helmet", "chestplate", "leggings", "boots", "pickaxe", "axe", "sword", "hoe", "shovel")) { + plugin.saveResource("resources/default/resourcepack/assets/minecraft/textures/item/custom/topaz_" + item + ".png"); + plugin.saveResource("resources/default/resourcepack/assets/minecraft/textures/item/custom/topaz_" + item + ".png.mcmeta"); + } + + // ores + plugin.saveResource("resources/default/configuration/ores.yml"); + plugin.saveResource("resources/default/resourcepack/assets/minecraft/textures/block/custom/deepslate_topaz_ore.png"); + plugin.saveResource("resources/default/resourcepack/assets/minecraft/textures/block/custom/deepslate_topaz_ore.png.mcmeta"); + plugin.saveResource("resources/default/resourcepack/assets/minecraft/textures/block/custom/topaz_ore.png"); + plugin.saveResource("resources/default/resourcepack/assets/minecraft/textures/block/custom/topaz_ore.png.mcmeta"); + plugin.saveResource("resources/default/resourcepack/assets/minecraft/textures/item/custom/topaz.png"); + plugin.saveResource("resources/default/resourcepack/assets/minecraft/textures/item/custom/topaz.png.mcmeta"); + // palm tree + plugin.saveResource("resources/default/configuration/palm_tree.yml"); + plugin.saveResource("resources/default/resourcepack/assets/minecraft/textures/block/custom/palm_sapling.png"); + plugin.saveResource("resources/default/resourcepack/assets/minecraft/textures/block/custom/palm_planks.png"); + plugin.saveResource("resources/default/resourcepack/assets/minecraft/textures/block/custom/palm_log.png"); + plugin.saveResource("resources/default/resourcepack/assets/minecraft/textures/block/custom/palm_log_top.png"); + plugin.saveResource("resources/default/resourcepack/assets/minecraft/textures/block/custom/stripped_palm_log.png"); + plugin.saveResource("resources/default/resourcepack/assets/minecraft/textures/block/custom/stripped_palm_log_top.png"); + plugin.saveResource("resources/default/resourcepack/assets/minecraft/textures/block/custom/palm_leaves.png"); + // fairy flower + plugin.saveResource("resources/default/configuration/fairy_flower.yml"); + plugin.saveResource("resources/default/resourcepack/assets/minecraft/textures/block/custom/fairy_flower_1.png"); + plugin.saveResource("resources/default/resourcepack/assets/minecraft/textures/block/custom/fairy_flower_2.png"); + plugin.saveResource("resources/default/resourcepack/assets/minecraft/textures/block/custom/fairy_flower_3.png"); + plugin.saveResource("resources/default/resourcepack/assets/minecraft/textures/block/custom/fairy_flower_4.png"); + plugin.saveResource("resources/default/resourcepack/assets/minecraft/textures/block/custom/fairy_flower_5.png"); + plugin.saveResource("resources/default/resourcepack/assets/minecraft/textures/item/custom/fairy_flower.png"); + plugin.saveResource("resources/default/resourcepack/assets/minecraft/models/block/custom/fairy_flower_1.json"); + // furniture + plugin.saveResource("resources/default/configuration/furniture.yml"); + plugin.saveResource("resources/default/resourcepack/assets/minecraft/models/item/custom/table_lamp.json"); + plugin.saveResource("resources/default/resourcepack/assets/minecraft/models/item/custom/wooden_chair.json"); + plugin.saveResource("resources/default/resourcepack/assets/minecraft/models/item/custom/bench.json"); + plugin.saveResource("resources/default/resourcepack/assets/minecraft/textures/item/custom/table_lamp.png"); + plugin.saveResource("resources/default/resourcepack/assets/minecraft/textures/item/custom/wooden_chair.png"); + plugin.saveResource("resources/default/resourcepack/assets/minecraft/textures/item/custom/bench.png"); + // tooltip + plugin.saveResource("resources/default/resourcepack/assets/minecraft/textures/gui/sprites/tooltip/topaz_background.png"); + plugin.saveResource("resources/default/resourcepack/assets/minecraft/textures/gui/sprites/tooltip/topaz_background.png.mcmeta"); + plugin.saveResource("resources/default/resourcepack/assets/minecraft/textures/gui/sprites/tooltip/topaz_frame.png"); + plugin.saveResource("resources/default/resourcepack/assets/minecraft/textures/gui/sprites/tooltip/topaz_frame.png.mcmeta"); + } + + private void loadConfigs() { + long o1 = System.nanoTime(); + for (Pack pack : loadedPacks()) { + Pair, List> files = FileUtils.getConfigsDeeply(pack.configurationFolder()); + for (Path path : files.left()) { + Yaml yaml = new Yaml(new StringKeyConstructor(new LoaderOptions())); + try (InputStreamReader inputStream = new InputStreamReader(new FileInputStream(path.toFile()), StandardCharsets.UTF_8)) { + Map data = yaml.load(inputStream); + if (data == null) continue; + for (Map.Entry entry : data.entrySet()) { + processConfigEntry(entry, path, pack); + } + } catch (IOException e) { + this.plugin.logger().warn(path, "Error loading config file", e); + } + } + for (Path path : files.right()) { + try (InputStreamReader inputStream = new InputStreamReader(new FileInputStream(path.toFile()), StandardCharsets.UTF_8)) { + Map dataRaw = GsonHelper.get().fromJson(JsonParser.parseReader(inputStream).getAsJsonObject(), Map.class); + Map data = MiscUtils.castToMap(dataRaw, false); + for (Map.Entry entry : data.entrySet()) { + processConfigEntry(entry, path, pack); + } + } catch (IOException e) { + this.plugin.logger().warn(path, "Error loading config file", e); + } + } + } + long o2 = System.nanoTime(); + this.plugin.logger().info("Loaded packs. Took " + String.format("%.2f", ((o2 - o1) / 1_000_000.0)) + " ms"); + for (Map.Entry> entry : this.cachedConfigs.entrySet()) { + ConfigSectionParser parser = entry.getKey(); + boolean isTemplate = parser.sectionId().equals(TemplateManager.CONFIG_SECTION_NAME); + long t1 = System.nanoTime(); + for (CachedConfig cached : entry.getValue()) { + for (Map.Entry configEntry : cached.config().entrySet()) { + String key = configEntry.getKey(); + try { + Key id = Key.withDefaultNamespace(key, cached.pack().namespace()); + if (configEntry.getValue() instanceof Map configSection0) { + Map configSection1 = castToMap(configSection0, false); + if ((boolean) configSection1.getOrDefault("enable", true)) { + parser.parseSection(cached.pack(), cached.filePath(), id, isTemplate ? configSection1 : plugin.templateManager().applyTemplates(configSection1)); + } + } else { + this.plugin.logger().warn(cached.filePath(), "Configuration section is required for " + parser.sectionId() + "." + configEntry.getKey() + " - "); + } + } catch (Exception e) { + this.plugin.logger().warn(cached.filePath(), "Error loading " + parser.sectionId() + "." + key, e); + } + } + } + long t2 = System.nanoTime(); + this.plugin.logger().info("Loaded " + parser.sectionId() + " in " + String.format("%.2f", ((t2 - t1) / 1_000_000.0)) + " ms"); + } + this.cachedConfigs.clear(); + } + + private void processConfigEntry(Map.Entry entry, Path path, Pack pack) { + if (entry.getValue() instanceof Map typeSections0) { + String configType = entry.getKey(); + Optional.ofNullable(this.sectionParsers.get(configType)) + .ifPresent(parser -> { + this.cachedConfigs.computeIfAbsent(parser, k -> new ArrayList<>()) + .add(new CachedConfig(castToMap(typeSections0, false), path, pack)); + }); + } + } + + @Override + public void generateResourcePack() { + this.plugin.logger().info("Generating resource pack..."); + long start = System.currentTimeMillis(); + // get the target location + Path generatedPackPath = this.plugin.dataFolderPath() + .resolve("generated") + .resolve("resource_pack"); + + try { + org.apache.commons.io.FileUtils.deleteDirectory(generatedPackPath.toFile()); + } catch (IOException e) { + this.plugin.logger().severe("Error deleting previous resource pack", e); + } + + // firstly merge existing folders + try { + List folders = new ArrayList<>(); + folders.addAll(loadedPacks().stream().map(Pack::resourcePackFolder).toList()); + folders.addAll(ConfigManager.foldersToMerge().stream().map(it -> plugin.dataFolderPath().getParent().resolve(it)).filter(Files::exists).toList()); + + List>> duplicated = mergeFolder(folders, generatedPackPath); + if (!duplicated.isEmpty()) { + this.plugin.logger().severe("Duplicated files Found. Please resolve them through config.yml resource-pack.duplicated-files-handler."); + for (Pair> path : duplicated) { + this.plugin.logger().warn(""); + this.plugin.logger().warn("Target: " + path.left()); + for (Path path0 : path.right()) { + this.plugin.logger().warn(" - " + path0.toAbsolutePath()); + } + } + } + } catch (IOException e) { + this.plugin.logger().severe("Error merging resource pack", e); + } + + this.generateFonts(generatedPackPath); + this.generateLegacyItemOverrides(generatedPackPath); + this.generateModernItemOverrides(generatedPackPath); + this.generateModernItemModels1_21_2(generatedPackPath); + this.generateModernItemModels1_21_4(generatedPackPath); + this.generateBlockOverrides(generatedPackPath); + this.generateItemModels(generatedPackPath, this.plugin.itemManager()); + this.generateItemModels(generatedPackPath, this.plugin.blockManager()); + this.generateOverrideSounds(generatedPackPath); + this.generateCustomSounds(generatedPackPath); + this.generateClientLang(generatedPackPath); + + Path zipFile = resourcePackPath(); + try { + this.zipGenerator.accept(generatedPackPath, zipFile); + } catch (Exception e) { + this.plugin.logger().severe("Error zipping resource pack", e); + } + + long end = System.currentTimeMillis(); + this.plugin.logger().info("Finished generating resource pack in " + (end - start) + "ms"); + + this.eventDispatcher.accept(generatedPackPath, zipFile); + this.calculateHash(); + } + + private void calculateHash() { + Path zipFile = selfHostPackPath(); + if (Files.exists(zipFile)) { + try { + this.packHash = computeSHA1(zipFile); + this.packUUID = UUID.nameUUIDFromBytes(this.packHash.getBytes(StandardCharsets.UTF_8)); + } catch (IOException | NoSuchAlgorithmException e) { + this.plugin.logger().severe("Error calculating resource pack hash", e); + } + } else { + this.packHash = ""; + this.packUUID = UUID.nameUUIDFromBytes("EMPTY".getBytes(StandardCharsets.UTF_8)); + } + } + + private void generateClientLang(Path generatedPackPath) { + for (Map.Entry entry : this.plugin.translationManager().clientLangManager().langData().entrySet()) { + JsonObject json = new JsonObject(); + for (Map.Entry pair : entry.getValue().translations.entrySet()) { + json.addProperty(pair.getKey(), pair.getValue()); + } + Path langPath = generatedPackPath + .resolve("assets") + .resolve("minecraft") + .resolve("lang") + .resolve(entry.getKey() + ".json"); + try { + Files.createDirectories(langPath.getParent()); + } catch (IOException e) { + plugin.logger().severe("Error creating " + langPath.toAbsolutePath()); + return; + } + try { + GsonHelper.writeJsonFile(json, langPath); + } catch (IOException e) { + this.plugin.logger().severe("Error writing language file", e); + } + } + } + + private void generateCustomSounds(Path generatedPackPath) { + AbstractSoundManager soundManager = (AbstractSoundManager) plugin.soundManager(); + for (Map.Entry> entry : soundManager.soundsByNamespace().entrySet()) { + Path soundPath = generatedPackPath + .resolve("assets") + .resolve(entry.getKey()) + .resolve("sounds.json"); + + JsonObject soundJson; + if (Files.exists(soundPath)) { + try (BufferedReader reader = Files.newBufferedReader(soundPath)) { + soundJson = JsonParser.parseReader(reader).getAsJsonObject(); + } catch (IOException e) { + plugin.logger().warn("Failed to load existing sounds.json", e); + return; + } + } else { + soundJson = new JsonObject(); + } + + for (SoundEvent soundEvent : entry.getValue()) { + soundJson.add(soundEvent.id().value(), soundEvent.get()); + } + + try { + Files.createDirectories(soundPath.getParent()); + } catch (IOException e) { + plugin.logger().severe("Error creating " + soundPath.toAbsolutePath()); + return; + } + + try (BufferedWriter writer = Files.newBufferedWriter(soundPath)) { + GsonHelper.get().toJson(soundJson, writer); + } catch (IOException e) { + plugin.logger().warn("Failed to generate sounds.json: " + soundPath.toAbsolutePath(), e); + } + } + } + + private void generateOverrideSounds(Path generatedPackPath) { + if (!ConfigManager.enableSoundSystem()) return; + + Path soundPath = generatedPackPath + .resolve("assets") + .resolve("minecraft") + .resolve("sounds.json"); + + JsonObject soundTemplate; + try (InputStream inputStream = plugin.resourceStream("internal/sounds.json")) { + if (inputStream == null) { + plugin.logger().warn("Failed to load internal/sounds.json"); + return; + } + soundTemplate = JsonParser.parseReader(new InputStreamReader(inputStream)).getAsJsonObject(); + } catch (IOException e) { + plugin.logger().warn("Failed to load internal/sounds.json", e); + return; + } + + JsonObject soundJson; + if (Files.exists(soundPath)) { + try (BufferedReader reader = Files.newBufferedReader(soundPath)) { + soundJson = JsonParser.parseReader(reader).getAsJsonObject(); + } catch (IOException e) { + plugin.logger().warn("Failed to load existing sounds.json", e); + return; + } + } else { + soundJson = new JsonObject(); + } + + for (Map.Entry mapper : plugin.blockManager().soundMapper().entrySet()) { + Key originalKey = mapper.getKey(); + JsonObject empty = new JsonObject(); + empty.add("sounds", new JsonArray()); + empty.addProperty("replace", true); + soundJson.add(originalKey.value(), empty); + JsonObject originalSounds = soundTemplate.getAsJsonObject(originalKey.value()); + if (originalSounds != null) { + soundJson.add(mapper.getValue().value(), originalSounds); + } else { + plugin.logger().warn("Cannot find " + originalKey.value() + " in sound template"); + } + } + + try { + Files.createDirectories(soundPath.getParent()); + } catch (IOException e) { + plugin.logger().severe("Error creating " + soundPath.toAbsolutePath()); + return; + } + + try (BufferedWriter writer = Files.newBufferedWriter(soundPath)) { + GsonHelper.get().toJson(soundJson, writer); + } catch (IOException e) { + plugin.logger().warn("Failed to generate sounds.json: " + soundPath.toAbsolutePath(), e); + } + } + + private void generateItemModels(Path generatedPackPath, ModelGenerator generator) { + for (ModelGeneration generation : generator.modelsToGenerate()) { + Path modelPath = generatedPackPath + .resolve("assets") + .resolve(generation.path().namespace()) + .resolve("models") + .resolve(generation.path().value() + ".json"); + + if (Files.exists(modelPath)) { + plugin.logger().warn("Failed to generate model because " + modelPath.toAbsolutePath() + " already exists"); + continue; + } + + try { + Files.createDirectories(modelPath.getParent()); + } catch (IOException e) { + plugin.logger().severe("Error creating " + modelPath.toAbsolutePath()); + continue; + } + + try (BufferedWriter writer = Files.newBufferedWriter(modelPath)) { + GsonHelper.get().toJson(generation.getJson(), writer); + } catch (IOException e) { + plugin.logger().warn("Failed to generate model: " + modelPath.toAbsolutePath(), e); + } + } + } + + private void generateBlockOverrides(Path generatedPackPath) { + File blockStatesFile = new File(plugin.dataFolderFile(), "blockstates.yml"); + if (!blockStatesFile.exists()) plugin.saveResource("blockstates.yml"); + YamlDocument preset = ConfigManager.instance().loadYamlData(blockStatesFile); + for (Map.Entry> entry : plugin.blockManager().blockOverrides().entrySet()) { + Key key = entry.getKey(); + Path overridedBlockPath = generatedPackPath + .resolve("assets") + .resolve(key.namespace()) + .resolve("blockstates") + .resolve(key.value() + ".json"); + JsonObject stateJson = new JsonObject(); + JsonObject variants = new JsonObject(); + stateJson.add("variants", variants); + Section presetSection = preset.getSection(key.toString()); + if (presetSection != null) { + for (Map.Entry presetEntry : presetSection.getStringRouteMappedValues(false).entrySet()) { + if (presetEntry.getValue() instanceof Section section) { + variants.add(presetEntry.getKey(), YamlUtils.sectionToJson(section)); + } + } + } + for (Map.Entry resourcePathEntry : entry.getValue().entrySet()) { + variants.add(resourcePathEntry.getKey(), resourcePathEntry.getValue()); + } + try { + Files.createDirectories(overridedBlockPath.getParent()); + } catch (IOException e) { + plugin.logger().severe("Error creating " + overridedBlockPath.toAbsolutePath()); + continue; + } + try (BufferedWriter writer = Files.newBufferedWriter(overridedBlockPath)) { + GsonHelper.get().toJson(stateJson, writer); + } catch (IOException e) { + plugin.logger().warn("Failed to save item model for [" + key + "]"); + } + } + } + + private void generateModernItemModels1_21_2(Path generatedPackPath) { + if (ConfigManager.packMaxVersion() < 21.19f) return; + if (ConfigManager.packMinVersion() > 21.39f) return; + + boolean has = false; + for (Map.Entry> entry : plugin.itemManager().modernItemModels1_21_2().entrySet()) { + has = true; + Key key = entry.getKey(); + List legacyOverridesModels = entry.getValue(); + boolean first = true; + JsonObject jsonObject = new JsonObject(); + JsonArray overrides = new JsonArray(); + for (LegacyOverridesModel model : legacyOverridesModels) { + if (first) { + jsonObject.addProperty("parent", model.model()); + if (model.hasPredicate()) { + overrides.add(model.toLegacyPredicateElement()); + } + first = false; + } else { + overrides.add(model.toLegacyPredicateElement()); + } + } + if (!overrides.isEmpty()) { + jsonObject.add("overrides", overrides); + } + + Path itemPath = generatedPackPath + .resolve("assets") + .resolve(key.namespace()) + .resolve("models") + .resolve("item") + .resolve(key.value() + ".json"); + if (Files.exists(itemPath)) { + plugin.logger().warn("Failed to generate item model for [" + key + "] because " + itemPath.toAbsolutePath() + " already exists"); + } else { + try (InputStream inputStream = plugin.resourceStream("internal/templates_" + LEGACY_TEMPLATES + "/" + key.namespace() + "/items/" + key.value() + ".json")) { + if (inputStream != null) { + plugin.logger().warn("Failed to generate item model for [" + key + "] because it conflicts with vanilla item"); + continue; + } + } catch (IOException e) { + plugin.logger().warn("Failed to load item model", e); + continue; + } + } + try { + Files.createDirectories(itemPath.getParent()); + } catch (IOException e) { + plugin.logger().severe("Error creating " + itemPath.toAbsolutePath()); + continue; + } + try (BufferedWriter writer = Files.newBufferedWriter(itemPath)) { + GsonHelper.get().toJson(jsonObject, writer); + } catch (IOException e) { + plugin.logger().warn("Failed to save item model for [" + key + "]"); + } + } + + if (ConfigManager.packMinVersion() < 21.19f && has) { + plugin.logger().warn("You are using item-model component for models which requires 1.21.2+. But the min supported version is " + "1." + ConfigManager.packMinVersion()); + } + } + + private void generateModernItemModels1_21_4(Path generatedPackPath) { + if (ConfigManager.packMaxVersion() < 21.39f) return; + for (Map.Entry entry : plugin.itemManager().modernItemModels1_21_4().entrySet()) { + Key key = entry.getKey(); + Path itemPath = generatedPackPath + .resolve("assets") + .resolve(key.namespace()) + .resolve("items") + .resolve(key.value() + ".json"); + if (Files.exists(itemPath)) { + plugin.logger().warn("Failed to generate item model for [" + key + "] because " + itemPath.toAbsolutePath() + " already exists"); + } else { + try (InputStream inputStream = plugin.resourceStream("internal/templates_" + LATEST_TEMPLATES + "/" + key.namespace() + "/items/" + key.value() + ".json")) { + if (inputStream != null) { + plugin.logger().warn("Failed to generate item model for [" + key + "] because it conflicts with vanilla item"); + continue; + } + } catch (IOException e) { + plugin.logger().warn("Failed to load item model", e); + continue; + } + } + try { + Files.createDirectories(itemPath.getParent()); + } catch (IOException e) { + plugin.logger().severe("Error creating " + itemPath.toAbsolutePath()); + continue; + } + JsonObject model = new JsonObject(); + model.add("model", entry.getValue().get()); + try (BufferedWriter writer = Files.newBufferedWriter(itemPath)) { + GsonHelper.get().toJson(model, writer); + } catch (IOException e) { + plugin.logger().warn("Failed to save item model for [" + key + "]"); + } + } + } + + private void generateModernItemOverrides(Path generatedPackPath) { + if (ConfigManager.packMaxVersion() < 21.39f) return; + for (Map.Entry> entry : plugin.itemManager().modernItemOverrides().entrySet()) { + Key key = entry.getKey(); + Path overridedItemPath = generatedPackPath + .resolve("assets") + .resolve(key.namespace()) + .resolve("items") + .resolve(key.value() + ".json"); + + JsonObject originalItemModel; + if (Files.exists(overridedItemPath)) { + try { + originalItemModel = GsonHelper.readJsonFile(overridedItemPath).getAsJsonObject(); + } catch (IOException e) { + plugin.logger().warn("Failed to load existing item model", e); + continue; + } + } else { + try (InputStream inputStream = plugin.resourceStream("internal/templates_" + LATEST_TEMPLATES + "/" + key.namespace() + "/items/" + key.value() + ".json")) { + if (inputStream == null) { + plugin.logger().warn("Failed to use [" + key + "] for base model"); + continue; + } + originalItemModel = JsonParser.parseReader(new InputStreamReader(inputStream)).getAsJsonObject(); + } catch (IOException e) { + plugin.logger().warn("Failed to load item model", e); + continue; + } + } + + boolean handAnimationOnSwap = Optional.ofNullable(originalItemModel.get("hand_animation_on_swap")).map(JsonElement::getAsBoolean).orElse(true); + JsonObject fallbackModel = originalItemModel.get("model").getAsJsonObject(); + + JsonObject newJson = new JsonObject(); + JsonObject model = new JsonObject(); + newJson.add("model", model); + model.addProperty("type", "minecraft:range_dispatch"); + model.addProperty("property", "minecraft:custom_model_data"); + if (!handAnimationOnSwap) { + model.addProperty("hand_animation_on_swap", false); + } + model.add("fallback", fallbackModel); + JsonArray entries = new JsonArray(); + model.add("entries", entries); + for (Map.Entry modelWithDataEntry : entry.getValue().entrySet()) { + JsonObject entryObject = new JsonObject(); + entryObject.addProperty("threshold", modelWithDataEntry.getKey()); + entryObject.add("model", modelWithDataEntry.getValue().get()); + entries.add(entryObject); + } + try { + Files.createDirectories(overridedItemPath.getParent()); + } catch (IOException e) { + plugin.logger().severe("Error creating " + overridedItemPath.toAbsolutePath()); + continue; + } + try (BufferedWriter writer = Files.newBufferedWriter(overridedItemPath)) { + GsonHelper.get().toJson(newJson, writer); + } catch (IOException e) { + plugin.logger().warn("Failed to save item model for [" + key + "]"); + } + } + } + + private void generateLegacyItemOverrides(Path generatedPackPath) { + if (ConfigManager.packMinVersion() > 21.39f) return; + for (Map.Entry> entry : plugin.itemManager().legacyItemOverrides().entrySet()) { + Key key = entry.getKey(); + Path overridedItemPath = generatedPackPath + .resolve("assets") + .resolve(key.namespace()) + .resolve("models") + .resolve("item") + .resolve(key.value() + ".json"); + + JsonObject originalItemModel; + if (Files.exists(overridedItemPath)) { + try (BufferedReader reader = Files.newBufferedReader(overridedItemPath)) { + originalItemModel = JsonParser.parseReader(reader).getAsJsonObject(); + } catch (IOException e) { + plugin.logger().warn("Failed to load existing item model", e); + continue; + } + } else { + try (InputStream inputStream = plugin.resourceStream("internal/templates_" + LEGACY_TEMPLATES + "/" + key.namespace() + "/items/" + key.value() + ".json")) { + if (inputStream == null) { + plugin.logger().warn("Failed to use [" + key + "] for base model"); + continue; + } + originalItemModel = JsonParser.parseReader(new InputStreamReader(inputStream)).getAsJsonObject(); + } catch (IOException e) { + plugin.logger().warn("Failed to load item model", e); + continue; + } + } + if (originalItemModel == null) { + plugin.logger().warn("Failed to load item model for [" + key + "]"); + continue; + } + JsonArray overrides; + if (originalItemModel.has("overrides")) { + overrides = originalItemModel.getAsJsonArray("overrides"); + } else { + overrides = new JsonArray(); + originalItemModel.add("overrides", overrides); + } + Collection legacyOverridesModels = entry.getValue(); + for (LegacyOverridesModel model : legacyOverridesModels) { + overrides.add(model.toLegacyPredicateElement()); + } + try { + Files.createDirectories(overridedItemPath.getParent()); + } catch (IOException e) { + plugin.logger().severe("Error creating " + overridedItemPath.toAbsolutePath()); + continue; + } + + try (BufferedWriter writer = Files.newBufferedWriter(overridedItemPath)) { + GsonHelper.get().toJson(originalItemModel, writer); + } catch (IOException e) { + plugin.logger().warn("Failed to save item model for [" + key + "]"); + } + } + } + + private void generateFonts(Path generatedPackPath) { + // generate image font json + for (Font font : plugin.imageManager().fontsInUse()) { + Key namespacedKey = font.key(); + Path fontPath = generatedPackPath.resolve("assets") + .resolve(namespacedKey.namespace()) + .resolve("font") + .resolve(namespacedKey.value() + ".json"); + + JsonObject fontJson; + if (Files.exists(fontPath)) { + try { + String content = Files.readString(fontPath); + fontJson = JsonParser.parseString(content).getAsJsonObject(); + } catch (IOException e) { + fontJson = new JsonObject(); + plugin.logger().warn(fontPath + " is not a valid font json file"); + } + } else { + fontJson = new JsonObject(); + try { + Files.createDirectories(fontPath.getParent()); + } catch (IOException e) { + throw new RuntimeException(e); + } + } + + JsonArray providers; + if (fontJson.has("providers")) { + providers = fontJson.getAsJsonArray("providers"); + } else { + providers = new JsonArray(); + fontJson.add("providers", providers); + } + + for (BitmapImage image : font.bitmapImages()) { + providers.add(image.getJson()); + } + + try (FileWriter fileWriter = new FileWriter(fontPath.toFile())) { + fileWriter.write(fontJson.toString().replace("\\\\u", "\\u")); + } catch (IOException e) { + throw new RuntimeException(e); + } + } + + if (ConfigManager.resourcePack$overrideUniform()) { + Path fontPath = generatedPackPath.resolve("assets") + .resolve("minecraft") + .resolve("font") + .resolve("default.json"); + if (Files.exists(fontPath)) { + Path targetPath = generatedPackPath.resolve("assets") + .resolve("minecraft") + .resolve("font") + .resolve("uniform.json"); + try { + Files.copy(fontPath, targetPath, StandardCopyOption.REPLACE_EXISTING); + } catch (IOException e) { + throw new RuntimeException(e); + } + } + } + } + + protected String computeSHA1(Path path) throws IOException, NoSuchAlgorithmException { + InputStream file = Files.newInputStream(path); + MessageDigest digest = MessageDigest.getInstance("SHA-1"); + byte[] buffer = new byte[8192]; + int bytesRead; + while ((bytesRead = file.read(buffer)) != -1) { + digest.update(buffer, 0, bytesRead); + } + file.close(); + + StringBuilder hexString = new StringBuilder(40); + for (byte b : digest.digest()) { + hexString.append(String.format("%02x", b)); + } + return hexString.toString(); + } + + private List>> mergeFolder(Collection sourceFolders, Path targetFolder) throws IOException { + Map> conflictChecker = new HashMap<>(); + for (Path sourceFolder : sourceFolders) { + if (Files.exists(sourceFolder)) { + Files.walkFileTree(sourceFolder, new SimpleFileVisitor<>() { + @Override + public FileVisitResult visitFile(Path file, BasicFileAttributes attrs) throws IOException { + Path relative = sourceFolder.relativize(file); + Path targetPath = targetFolder.resolve(relative); + List conflicts = conflictChecker.computeIfAbsent(relative, k -> new ArrayList<>()); + if (conflicts.isEmpty()) { + Files.createDirectories(targetPath.getParent()); + Files.copy(file, targetPath, StandardCopyOption.REPLACE_EXISTING); + conflicts.add(file); + } else { + for (ConditionalResolution resolution : ConfigManager.resolutions()) { + if (resolution.matcher().test(relative)) { + resolution.resolution().run(targetPath, file); + return FileVisitResult.CONTINUE; + } + } + conflicts.add(file); + } + return FileVisitResult.CONTINUE; + } + }); + } + } + List>> conflicts = new ArrayList<>(); + for (Map.Entry> entry : conflictChecker.entrySet()) { + if (entry.getValue().size() > 1) { + conflicts.add(Pair.of(entry.getKey(), entry.getValue())); + } + } + return conflicts; + } +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/pack/CachedConfig.java b/core/src/main/java/net/momirealms/craftengine/core/pack/CachedConfig.java new file mode 100644 index 000000000..808c649f0 --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/pack/CachedConfig.java @@ -0,0 +1,28 @@ +package net.momirealms.craftengine.core.pack; + +import java.nio.file.Path; +import java.util.Map; + +public class CachedConfig { + private final Pack pack; + private final Path filePath; + private final Map config; + + public CachedConfig(Map config, Path filePath, Pack pack) { + this.config = config; + this.filePath = filePath; + this.pack = pack; + } + + public Map config() { + return config; + } + + public Path filePath() { + return filePath; + } + + public Pack pack() { + return pack; + } +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/pack/LegacyOverridesModel.java b/core/src/main/java/net/momirealms/craftengine/core/pack/LegacyOverridesModel.java new file mode 100644 index 000000000..4d39a7d3e --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/pack/LegacyOverridesModel.java @@ -0,0 +1,114 @@ +package net.momirealms.craftengine.core.pack; + +import com.google.gson.JsonObject; +import org.jetbrains.annotations.NotNull; + +import java.util.Map; +import java.util.Objects; + +public class LegacyOverridesModel implements Comparable { + private final Map predicate; + private final String model; + private final int customModelData; + + public LegacyOverridesModel(Map predicate, String model, int customModelData) { + this.predicate = predicate; + this.model = model; + this.customModelData = customModelData; + if (customModelData > 0) { + this.predicate.put("custom_model_data", customModelData); + } + } + + public Map predicate() { + return predicate; + } + + public boolean hasPredicate() { + return !predicate.isEmpty(); + } + + public String model() { + return model; + } + + public JsonObject toLegacyPredicateElement() { + JsonObject json = new JsonObject(); + JsonObject predicateJson = new JsonObject(); + if (predicate != null && !predicate.isEmpty()) { + for (Map.Entry entry : predicate.entrySet()) { + if (entry.getValue() instanceof Boolean b) { + predicateJson.addProperty(entry.getKey(), b); + } else if (entry.getValue() instanceof Number n) { + predicateJson.addProperty(entry.getKey(), n); + } else if (entry.getValue() instanceof String s) { + predicateJson.addProperty(entry.getKey(), s); + } + } + json.add("predicate", predicateJson); + } + json.addProperty("model", model); + return json; + } + + public int customModelData() { + return customModelData; + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + LegacyOverridesModel that = (LegacyOverridesModel) o; + return customModelData == that.customModelData && Objects.equals(predicate, that.predicate) && Objects.equals(model, that.model); + } + + @Override + public int hashCode() { + int result = predicate.hashCode(); + result = 31 * result + Objects.hashCode(model); + result = 31 * result + customModelData; + return result; + } + + @Override + public String toString() { + return "LegacyOverridesModel{" + + "predicate=" + predicate + + ", model='" + model + '\'' + + ", custom-model-data=" + customModelData + + '}'; + } + + @Override + public int compareTo(@NotNull LegacyOverridesModel o) { + if (customModelData != o.customModelData) { + return customModelData - o.customModelData; + } else { + if (predicate.size() != o.predicate.size()) { + return predicate.size() - o.predicate.size(); + } + for (Map.Entry entry : predicate.entrySet()) { + String key = entry.getKey(); + Object value = entry.getValue(); + if (!o.predicate.containsKey(key)) { + return 1; + } + Object otherValue = o.predicate.get(key); + int valueComparison = compareValues(value, otherValue); + if (valueComparison != 0) { + return valueComparison; + } + } + } + return 0; + } + + @SuppressWarnings({"unchecked", "rawtypes"}) + private int compareValues(Object value1, Object value2) { + if (value1 instanceof Comparable c1 && value2 instanceof Comparable c2) { + return ((Comparable) c1).compareTo(c2); + } + return value1.equals(value2) ? 0 : -1; + } +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/pack/LoadingSequence.java b/core/src/main/java/net/momirealms/craftengine/core/pack/LoadingSequence.java new file mode 100644 index 000000000..fc810fa83 --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/pack/LoadingSequence.java @@ -0,0 +1,15 @@ +package net.momirealms.craftengine.core.pack; + +public class LoadingSequence { + public static final int TEMPLATE = 0; + public static final int BLOCK = 10; + public static final int ITEM = 20; + public static final int FURNITURE = 30; + public static final int FONT = 40; + public static final int RECIPE = 50; + public static final int CATEGORY = 60; + public static final int TRANSLATION = 70; + public static final int LANG = 80; + public static final int SOUND = 90; + public static final int JUKEBOX_SONG = 100; +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/pack/Pack.java b/core/src/main/java/net/momirealms/craftengine/core/pack/Pack.java new file mode 100644 index 000000000..09b70fffe --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/pack/Pack.java @@ -0,0 +1,51 @@ +package net.momirealms.craftengine.core.pack; + +import java.nio.file.Path; + +/** + * Represents a folder under the user's resources directory, + * designed to simplify the installation of third-party resource packs. + *