From eaa4dc99d723ad5acc0a5d22b1dcc3f631cbfa43 Mon Sep 17 00:00:00 2001 From: Elias Fleckenstein Date: Sat, 1 May 2021 16:52:16 +0200 Subject: [PATCH 001/982] Initial import --- LICENSE | 674 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ README.md | 4 + init.lua | 109 +++++++++ mod.conf | 3 + 4 files changed, 790 insertions(+) create mode 100644 LICENSE create mode 100644 README.md create mode 100644 init.lua create mode 100644 mod.conf diff --git a/LICENSE b/LICENSE new file mode 100644 index 000000000..f288702d2 --- /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..9b3293dda --- /dev/null +++ b/README.md @@ -0,0 +1,4 @@ +# tga_encoder +A TGA Encoder written in Lua without the use of external Libraries. + +May be used as a Minetest mod. diff --git a/init.lua b/init.lua new file mode 100644 index 000000000..45b9e85a2 --- /dev/null +++ b/init.lua @@ -0,0 +1,109 @@ +tga_encoder = {} + +local LUA_ARGS_LIMIT = 1000 + +local image = setmetatable({}, { + __call = function(self, ...) + local t = setmetatable({}, {__index = self}) + t:constructor(...) + return t + end, +}) + +function image:constructor(pixels) + self.bytes = {} + self.chunks = {self.bytes} + self.pixels = pixels + self.width = #pixels[1] + self.height = #pixels + + self:encode() +end + +function image:insert(byte) + table.insert(self.bytes, byte) + if #self.bytes == LUA_ARGS_LIMIT then + self.bytes = {} + table.insert(self.chunks, self.bytes) + end +end + +function image:littleendian(size, value) + for i = 1, size do + local byte = value % 256 + value = value - byte + value = value / 256 + self:insert(byte) + end +end + +function image:encode_colormap_spec() + -- first entry index + self:littleendian(2, 0) + -- number of entries + self:littleendian(2, 0) + -- number of bits per pixel + self:insert(0) +end + +function image:encode_image_spec() + -- X- and Y- origin + self:littleendian(2, 0) + self:littleendian(2, 0) + -- width and height + self:littleendian(2, self.width) + self:littleendian(2, self.height) + -- pixel depth + self:insert(24) + -- image descriptor + self:insert(0) +end + +function image:encode_header() + -- id length + self:insert(0) -- no image id info + -- color map type + self:insert(0) -- no color map + -- image type + self:insert(2) -- uncompressed true-color image + -- color map specification + self:encode_colormap_spec() + -- image specification + self:encode_image_spec() +end + +function image:encode_data() + for _, row in ipairs(self.pixels) do + for _, pixel in ipairs(row) do + self:insert(pixel[3]) + self:insert(pixel[2]) + self:insert(pixel[1]) + end + end +end + +function image:encode() + -- encode header + self:encode_header() + -- no color map and image id data + -- encode data + self:encode_data() + -- no extension area +end + +function image:get_data() + local data = "" + for _, bytes in ipairs(self.chunks) do + data = data .. string.char(unpack(bytes)) + end + return data .. string.char(0, 0, 0, 0) .. string.char(0, 0, 0, 0) .. "TRUEVISION-XFILE." .. string.char(0) +end + +function image:save(filename) + self.data = self.data or self:get_data() + local f = assert(io.open(filename, "w")) + f:write(self.data) + f:close() +end + +tga_encoder.image = image diff --git a/mod.conf b/mod.conf new file mode 100644 index 000000000..e4bfac898 --- /dev/null +++ b/mod.conf @@ -0,0 +1,3 @@ +name = tga_encoder +author = Fleckenstein +description = A TGA Encoder written in Lua without the use of external Libraries. From b88579b52e8ed66beca2b97871db3853d5260dd7 Mon Sep 17 00:00:00 2001 From: Elias Fleckenstein Date: Sun, 2 May 2021 17:47:46 +0200 Subject: [PATCH 002/982] Add updated tga_encoder --- init.lua | 97 +++++++++++++++++++------------------------------------- 1 file changed, 33 insertions(+), 64 deletions(-) diff --git a/init.lua b/init.lua index 45b9e85a2..96afda5e1 100644 --- a/init.lua +++ b/init.lua @@ -1,7 +1,5 @@ tga_encoder = {} -local LUA_ARGS_LIMIT = 1000 - local image = setmetatable({}, { __call = function(self, ...) local t = setmetatable({}, {__index = self}) @@ -11,8 +9,7 @@ local image = setmetatable({}, { }) function image:constructor(pixels) - self.bytes = {} - self.chunks = {self.bytes} + self.data = "" self.pixels = pixels self.width = #pixels[1] self.height = #pixels @@ -20,87 +17,59 @@ function image:constructor(pixels) self:encode() end -function image:insert(byte) - table.insert(self.bytes, byte) - if #self.bytes == LUA_ARGS_LIMIT then - self.bytes = {} - table.insert(self.chunks, self.bytes) - end -end - -function image:littleendian(size, value) - for i = 1, size do - local byte = value % 256 - value = value - byte - value = value / 256 - self:insert(byte) - end -end - function image:encode_colormap_spec() - -- first entry index - self:littleendian(2, 0) - -- number of entries - self:littleendian(2, 0) - -- number of bits per pixel - self:insert(0) + self.data = self.data + .. string.char(0, 0) -- first entry index + .. string.char(0, 0) -- number of entries + .. string.char(0) -- bits per pixel end function image:encode_image_spec() - -- X- and Y- origin - self:littleendian(2, 0) - self:littleendian(2, 0) - -- width and height - self:littleendian(2, self.width) - self:littleendian(2, self.height) - -- pixel depth - self:insert(24) - -- image descriptor - self:insert(0) + self.data = self.data + .. string.char(0, 0) -- X-origin + .. string.char(0, 0) -- Y-origin + .. string.char(self.width % 256, math.floor(self.width / 256)) -- width + .. string.char(self.height % 256, math.floor(self.height / 256)) -- height + .. string.char(24) -- pixel depth (RGB = 3 bytes = 24 bits) + .. string.char(0) -- image descriptor end function image:encode_header() - -- id length - self:insert(0) -- no image id info - -- color map type - self:insert(0) -- no color map - -- image type - self:insert(2) -- uncompressed true-color image - -- color map specification - self:encode_colormap_spec() - -- image specification - self:encode_image_spec() + self.data = self.data + .. string.char(0) -- image id + .. string.char(0) -- color map type + .. string.char(2) -- image type (uncompressed true-color image = 2) + self:encode_colormap_spec() -- color map specification + self:encode_image_spec() -- image specification end function image:encode_data() for _, row in ipairs(self.pixels) do for _, pixel in ipairs(row) do - self:insert(pixel[3]) - self:insert(pixel[2]) - self:insert(pixel[1]) + self.data = self.data + .. string.char(pixel[3], pixel[2], pixel[1]) end end end -function image:encode() - -- encode header - self:encode_header() - -- no color map and image id data - -- encode data - self:encode_data() - -- no extension area +function image:encode_footer() + self.data = self.data + .. string.char(0, 0, 0, 0) -- extension area offset + .. string.char(0, 0, 0, 0) -- developer area offset + .. "TRUEVISION-XFILE" + .. "." + .. string.char(0) end -function image:get_data() - local data = "" - for _, bytes in ipairs(self.chunks) do - data = data .. string.char(unpack(bytes)) - end - return data .. string.char(0, 0, 0, 0) .. string.char(0, 0, 0, 0) .. "TRUEVISION-XFILE." .. string.char(0) +function image:encode() + self:encode_header() -- header + -- no color map and image id data + self:encode_data() -- encode data + -- no extension or developer area + self:encode_footer() -- footer end function image:save(filename) - self.data = self.data or self:get_data() local f = assert(io.open(filename, "w")) f:write(self.data) f:close() From 52e5c955f0f9d745a23b057de5e48a8e2ad456e8 Mon Sep 17 00:00:00 2001 From: Nils Dagsson Moskopp Date: Thu, 4 Nov 2021 01:53:58 +0100 Subject: [PATCH 003/982] Use RLE compression in tga_encoder --- init.lua | 19 ++++++++++++++++--- 1 file changed, 16 insertions(+), 3 deletions(-) diff --git a/init.lua b/init.lua index 96afda5e1..973e44855 100644 --- a/init.lua +++ b/init.lua @@ -38,18 +38,31 @@ function image:encode_header() self.data = self.data .. string.char(0) -- image id .. string.char(0) -- color map type - .. string.char(2) -- image type (uncompressed true-color image = 2) + .. string.char(10) -- image type (RLE RGB = 10) self:encode_colormap_spec() -- color map specification self:encode_image_spec() -- image specification end function image:encode_data() + local current_pixel = '' + local previous_pixel = '' + local count = 1 + local encoded = '' + local rle_packet = '' for _, row in ipairs(self.pixels) do for _, pixel in ipairs(row) do - self.data = self.data - .. string.char(pixel[3], pixel[2], pixel[1]) + current_pixel = string.char(pixel[3], pixel[2], pixel[1]) + if current_pixel ~= previous_pixel or count == 128 then + encoded = encoded .. rle_packet + count = 1 + previous_pixel = current_pixel + else + count = count + 1 + end + rle_packet = string.char(128 + count - 1) .. current_pixel end end + self.data = self.data .. encoded .. rle_packet end function image:encode_footer() From 3f60b5baa67934674edebd9add85e474f122e32b Mon Sep 17 00:00:00 2001 From: Nils Dagsson Moskopp Date: Thu, 4 Nov 2021 15:15:28 +0100 Subject: [PATCH 004/982] Speed up TGA encoding by creating fewer strings --- init.lua | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/init.lua b/init.lua index 973e44855..39309c9c9 100644 --- a/init.lua +++ b/init.lua @@ -47,13 +47,13 @@ function image:encode_data() local current_pixel = '' local previous_pixel = '' local count = 1 - local encoded = '' + local packets = {} local rle_packet = '' for _, row in ipairs(self.pixels) do for _, pixel in ipairs(row) do current_pixel = string.char(pixel[3], pixel[2], pixel[1]) if current_pixel ~= previous_pixel or count == 128 then - encoded = encoded .. rle_packet + packets[#packets +1] = rle_packet count = 1 previous_pixel = current_pixel else @@ -62,7 +62,8 @@ function image:encode_data() rle_packet = string.char(128 + count - 1) .. current_pixel end end - self.data = self.data .. encoded .. rle_packet + packets[#packets +1] = rle_packet + self.data = self.data .. table.concat(packets) end function image:encode_footer() From adb8e45d6728a955f33bc99c05abdc8b488fe05c Mon Sep 17 00:00:00 2001 From: Nils Dagsson Moskopp Date: Sun, 30 Jan 2022 20:33:06 +0100 Subject: [PATCH 005/982] Fix TGA file writing on Windows Before this patch, the tga_encoder mod would write corrupted TGA files on Windows: Bytes that looked like newlines were replaced by a carriage return and a newline. --- init.lua | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/init.lua b/init.lua index 39309c9c9..24ec502e1 100644 --- a/init.lua +++ b/init.lua @@ -84,7 +84,7 @@ function image:encode() end function image:save(filename) - local f = assert(io.open(filename, "w")) + local f = assert(io.open(filename, "wb")) f:write(self.data) f:close() end From c00b0d50c6575fb41234edb687dd6a1b83d38dca Mon Sep 17 00:00:00 2001 From: Nils Dagsson Moskopp Date: Sat, 14 May 2022 19:56:02 +0200 Subject: [PATCH 006/982] Add usage examples --- README.md | 2 ++ examples.lua | 49 +++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 51 insertions(+) create mode 100644 examples.lua diff --git a/README.md b/README.md index 9b3293dda..dc7f2ab69 100644 --- a/README.md +++ b/README.md @@ -2,3 +2,5 @@ A TGA Encoder written in Lua without the use of external Libraries. May be used as a Minetest mod. + +See `examples.lua` for example code and usage hints. diff --git a/examples.lua b/examples.lua new file mode 100644 index 000000000..b832dddaa --- /dev/null +++ b/examples.lua @@ -0,0 +1,49 @@ +dofile("init.lua") + +-- encode a bitmap +local _ = { 0, 0, 0 } +local R = { 255, 127, 127 } +local pixels = { + { _, _, _, _, _, _, _ }, + { _, _, _, R, _, _, _ }, + { _, _, R, R, R, _, _ }, + { _, R, R, R, R, R, _ }, + { _, R, R, R, R, R, _ }, + { _, _, R, _, R, _, _ }, + { _, _, _, _, _, _, _ }, +} +tga_encoder.image(pixels):save("bitmap_small.tga") + +-- change a single pixel, then rescale the bitmap +local pixels_orig = pixels +pixels_orig[4][4] = { 255, 255, 255 } +local pixels = {} +for x = 1,56,1 do + local x_orig = math.ceil(x/8) + for z = 1,56,1 do + local z_orig = math.ceil(z/8) + local color = pixels_orig[z_orig][x_orig] + pixels[z] = pixels[z] or {} + pixels[z][x] = color + end +end +tga_encoder.image(pixels):save("bitmap_large.tga") + +local pixels = {} +for x = 1,16,1 do -- left to right + for z = 1,16,1 do -- bottom to top + local r = math.min(x * 32 - 1, 255) + local g = math.min(z * 32 - 1, 255) + local b = 0 + -- blue rectangle in top right corner + if x > 8 and z > 8 then + r = 0 + g = 0 + b = math.min(z * 16 - 1, 255) + end + local color = { r, g, b } + pixels[z] = pixels[z] or {} + pixels[z][x] = color + end +end +tga_encoder.image(pixels):save("gradients.tga") From 4f6ea5d03509076c5a0774838420243d3f3fce7e Mon Sep 17 00:00:00 2001 From: Nils Dagsson Moskopp Date: Sat, 14 May 2022 20:02:55 +0200 Subject: [PATCH 007/982] Add credits to README --- README.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/README.md b/README.md index dc7f2ab69..195cb8df5 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,8 @@ # tga_encoder A TGA Encoder written in Lua without the use of external Libraries. +Created by fleckenstein for MineClone2, then improved by erlehmann. + May be used as a Minetest mod. See `examples.lua` for example code and usage hints. From 13552f16f20ca34817ea0c2ad4e0e292312d009c Mon Sep 17 00:00:00 2001 From: Nils Dagsson Moskopp Date: Fri, 5 Nov 2021 18:58:01 +0100 Subject: [PATCH 008/982] Reduce TGA filesize by 25% by using 16-bit colors --- init.lua | 34 ++++++++++++++++++++++++++-------- 1 file changed, 26 insertions(+), 8 deletions(-) diff --git a/init.lua b/init.lua index 24ec502e1..8e467eb6b 100644 --- a/init.lua +++ b/init.lua @@ -30,7 +30,7 @@ function image:encode_image_spec() .. string.char(0, 0) -- Y-origin .. string.char(self.width % 256, math.floor(self.width / 256)) -- width .. string.char(self.height % 256, math.floor(self.height / 256)) -- height - .. string.char(24) -- pixel depth (RGB = 3 bytes = 24 bits) + .. string.char(16) -- pixel depth (ARRRRRGGGGGBBBBB = 2 bytes = 16 bits) .. string.char(0) -- image descriptor end @@ -44,24 +44,42 @@ function image:encode_header() end function image:encode_data() - local current_pixel = '' - local previous_pixel = '' + local colorword = nil + local previous_r = nil + local previous_g = nil + local previous_b = nil local count = 1 local packets = {} local rle_packet = '' + -- Sample depth rescaling is done according to the algorithm presented in: + -- + local max_sample_in = math.pow(2, 8) - 1 + local max_sample_out = math.pow(2, 5) - 1 for _, row in ipairs(self.pixels) do for _, pixel in ipairs(row) do - current_pixel = string.char(pixel[3], pixel[2], pixel[1]) - if current_pixel ~= previous_pixel or count == 128 then - packets[#packets +1] = rle_packet + if pixel[1] ~= previous_r or pixel[2] ~= previous_g or pixel[3] ~= previous_b or count == 128 then + if nil ~= previous_r then + colorword = 32768 + + ((math.floor((previous_r * max_sample_out / max_sample_in) + 0.5)) * 1024) + + ((math.floor((previous_g * max_sample_out / max_sample_in) + 0.5)) * 32) + + ((math.floor((previous_b * max_sample_out / max_sample_in) + 0.5)) * 1) + rle_packet = string.char(128 + count - 1, colorword % 256, math.floor(colorword / 256)) + packets[#packets +1] = rle_packet + end count = 1 - previous_pixel = current_pixel + previous_r = pixel[1] + previous_g = pixel[2] + previous_b = pixel[3] else count = count + 1 end - rle_packet = string.char(128 + count - 1) .. current_pixel end end + colorword = 32768 + + ((math.floor((previous_r * max_sample_out / max_sample_in) + 0.5)) * 1024) + + ((math.floor((previous_g * max_sample_out / max_sample_in) + 0.5)) * 32) + + ((math.floor((previous_b * max_sample_out / max_sample_in) + 0.5)) * 1) + rle_packet = string.char(128 + count - 1, colorword % 256, math.floor(colorword / 256)) packets[#packets +1] = rle_packet self.data = self.data .. table.concat(packets) end From 1b48c3f53949f5785b244b3647def5a4c58a17c8 Mon Sep 17 00:00:00 2001 From: Nils Dagsson Moskopp Date: Wed, 9 Feb 2022 13:40:47 +0100 Subject: [PATCH 009/982] Use raw packets in RLE compression in tga_encoder --- init.lua | 58 +++++++++++++++++++++++++++++++++++++++++++++++++++----- 1 file changed, 53 insertions(+), 5 deletions(-) diff --git a/init.lua b/init.lua index 8e467eb6b..a6972843e 100644 --- a/init.lua +++ b/init.lua @@ -48,8 +48,11 @@ function image:encode_data() local previous_r = nil local previous_g = nil local previous_b = nil + local raw_pixel = '' + local raw_pixels = {} local count = 1 local packets = {} + local raw_packet = '' local rle_packet = '' -- Sample depth rescaling is done according to the algorithm presented in: -- @@ -58,13 +61,37 @@ function image:encode_data() for _, row in ipairs(self.pixels) do for _, pixel in ipairs(row) do if pixel[1] ~= previous_r or pixel[2] ~= previous_g or pixel[3] ~= previous_b or count == 128 then - if nil ~= previous_r then + if nil ~= previous_r then colorword = 32768 + ((math.floor((previous_r * max_sample_out / max_sample_in) + 0.5)) * 1024) + ((math.floor((previous_g * max_sample_out / max_sample_in) + 0.5)) * 32) + ((math.floor((previous_b * max_sample_out / max_sample_in) + 0.5)) * 1) - rle_packet = string.char(128 + count - 1, colorword % 256, math.floor(colorword / 256)) - packets[#packets +1] = rle_packet + if 1 == count then + -- remember pixel verbatim for raw encoding + raw_pixel = string.char(colorword % 256, math.floor(colorword / 256)) + raw_pixels[#raw_pixels + 1] = raw_pixel + if 128 == #raw_pixels then + raw_packet = string.char(#raw_pixels - 1) + packets[#packets + 1] = raw_packet + for i=1, #raw_pixels do + packets[#packets +1] = raw_pixels[i] + end + raw_pixels = {} + end + else + -- encode raw pixels, if any + if #raw_pixels > 0 then + raw_packet = string.char(#raw_pixels - 1) + packets[#packets + 1] = raw_packet + for i=1, #raw_pixels do + packets[#packets +1] = raw_pixels[i] + end + raw_pixels = {} + end + -- RLE encoding + rle_packet = string.char(128 + count - 1, colorword % 256, math.floor(colorword / 256)) + packets[#packets +1] = rle_packet + end end count = 1 previous_r = pixel[1] @@ -79,8 +106,29 @@ function image:encode_data() ((math.floor((previous_r * max_sample_out / max_sample_in) + 0.5)) * 1024) + ((math.floor((previous_g * max_sample_out / max_sample_in) + 0.5)) * 32) + ((math.floor((previous_b * max_sample_out / max_sample_in) + 0.5)) * 1) - rle_packet = string.char(128 + count - 1, colorword % 256, math.floor(colorword / 256)) - packets[#packets +1] = rle_packet + if 1 == count then + raw_pixel = string.char(colorword % 256, math.floor(colorword / 256)) + raw_pixels[#raw_pixels + 1] = raw_pixel + raw_packet = string.char(#raw_pixels - 1) + packets[#packets + 1] = raw_packet + for i=1, #raw_pixels do + packets[#packets +1] = raw_pixels[i] + end + raw_pixels = {} + else + -- encode raw pixels, if any + if #raw_pixels > 0 then + raw_packet = string.char(#raw_pixels - 1) + packets[#packets + 1] = raw_packet + for i=1, #raw_pixels do + packets[#packets +1] = raw_pixels[i] + end + raw_pixels = {} + end + -- RLE encoding + rle_packet = string.char(128 + count - 1, colorword % 256, math.floor(colorword / 256)) + packets[#packets +1] = rle_packet + end self.data = self.data .. table.concat(packets) end From 9af0719df8dc5895633e5ce2ee107f78eb7a1bd0 Mon Sep 17 00:00:00 2001 From: Nils Dagsson Moskopp Date: Sat, 14 May 2022 20:44:12 +0200 Subject: [PATCH 010/982] Allow encoding RGB images as B8G8R8 --- examples.lua | 3 +- init.lua | 111 ++++++++++++++++++++++++++++++++++++++++++++++----- 2 files changed, 103 insertions(+), 11 deletions(-) diff --git a/examples.lua b/examples.lua index b832dddaa..5e16722f3 100644 --- a/examples.lua +++ b/examples.lua @@ -46,4 +46,5 @@ for x = 1,16,1 do -- left to right pixels[z][x] = color end end -tga_encoder.image(pixels):save("gradients.tga") +tga_encoder.image(pixels, {pixel_depth=16}):save("gradients_16bpp.tga") +tga_encoder.image(pixels, {pixel_depth=24}):save("gradients_24bpp.tga") diff --git a/init.lua b/init.lua index a6972843e..d8a044244 100644 --- a/init.lua +++ b/init.lua @@ -8,13 +8,16 @@ local image = setmetatable({}, { end, }) -function image:constructor(pixels) +function image:constructor(pixels, properties) + local properties = properties or {} + local pixel_depth = properties.pixel_depth or 16 + self.data = "" self.pixels = pixels self.width = #pixels[1] self.height = #pixels - self:encode() + self:encode(pixel_depth) end function image:encode_colormap_spec() @@ -24,26 +27,38 @@ function image:encode_colormap_spec() .. string.char(0) -- bits per pixel end -function image:encode_image_spec() +function image:encode_image_spec(pixel_depth) + assert( + 16 == pixel_depth or -- (A1R5G5B5 = 2 bytes = 16 bits) + 24 == pixel_depth -- (B8G8R8 = 3 bytes = 24 bits) + ) self.data = self.data .. string.char(0, 0) -- X-origin .. string.char(0, 0) -- Y-origin .. string.char(self.width % 256, math.floor(self.width / 256)) -- width .. string.char(self.height % 256, math.floor(self.height / 256)) -- height - .. string.char(16) -- pixel depth (ARRRRRGGGGGBBBBB = 2 bytes = 16 bits) + .. string.char(pixel_depth) .. string.char(0) -- image descriptor end -function image:encode_header() +function image:encode_header(pixel_depth) self.data = self.data .. string.char(0) -- image id .. string.char(0) -- color map type .. string.char(10) -- image type (RLE RGB = 10) self:encode_colormap_spec() -- color map specification - self:encode_image_spec() -- image specification + self:encode_image_spec(pixel_depth) -- image specification end -function image:encode_data() +function image:encode_data(pixel_depth) + if 16 == pixel_depth then + self:encode_data_a1r5g5b5_rle() + elseif 24 == pixel_depth then + self:encode_data_r8g8b8_rle() + end +end + +function image:encode_data_a1r5g5b5_rle() local colorword = nil local previous_r = nil local previous_g = nil @@ -132,6 +147,82 @@ function image:encode_data() self.data = self.data .. table.concat(packets) end +function image:encode_data_r8g8b8_rle() + local previous_r = nil + local previous_g = nil + local previous_b = nil + local raw_pixel = '' + local raw_pixels = {} + local count = 1 + local packets = {} + local raw_packet = '' + local rle_packet = '' + for _, row in ipairs(self.pixels) do + for _, pixel in ipairs(row) do + if pixel[1] ~= previous_r or pixel[2] ~= previous_g or pixel[3] ~= previous_b or count == 128 then + if nil ~= previous_r then + if 1 == count then + -- remember pixel verbatim for raw encoding + raw_pixel = string.char(previous_b, previous_g, previous_r) + raw_pixels[#raw_pixels + 1] = raw_pixel + if 128 == #raw_pixels then + raw_packet = string.char(#raw_pixels - 1) + packets[#packets + 1] = raw_packet + for i=1, #raw_pixels do + packets[#packets +1] = raw_pixels[i] + end + raw_pixels = {} + end + else + -- encode raw pixels, if any + if #raw_pixels > 0 then + raw_packet = string.char(#raw_pixels - 1) + packets[#packets + 1] = raw_packet + for i=1, #raw_pixels do + packets[#packets +1] = raw_pixels[i] + end + raw_pixels = {} + end + -- RLE encoding + rle_packet = string.char(128 + count - 1, previous_b, previous_g, previous_r) + packets[#packets +1] = rle_packet + end + end + count = 1 + previous_r = pixel[1] + previous_g = pixel[2] + previous_b = pixel[3] + else + count = count + 1 + end + end + end + if 1 == count then + raw_pixel = string.char(previous_b, previous_g, previous_r) + raw_pixels[#raw_pixels + 1] = raw_pixel + raw_packet = string.char(#raw_pixels - 1) + packets[#packets + 1] = raw_packet + for i=1, #raw_pixels do + packets[#packets +1] = raw_pixels[i] + end + raw_pixels = {} + else + -- encode raw pixels, if any + if #raw_pixels > 0 then + raw_packet = string.char(#raw_pixels - 1) + packets[#packets + 1] = raw_packet + for i=1, #raw_pixels do + packets[#packets +1] = raw_pixels[i] + end + raw_pixels = {} + end + -- RLE encoding + rle_packet = string.char(128 + count - 1, previous_b, previous_g, previous_r) + packets[#packets +1] = rle_packet + end + self.data = self.data .. table.concat(packets) +end + function image:encode_footer() self.data = self.data .. string.char(0, 0, 0, 0) -- extension area offset @@ -141,10 +232,10 @@ function image:encode_footer() .. string.char(0) end -function image:encode() - self:encode_header() -- header +function image:encode(pixel_depth) + self:encode_header(pixel_depth) -- header -- no color map and image id data - self:encode_data() -- encode data + self:encode_data(pixel_depth) -- encode data -- no extension or developer area self:encode_footer() -- footer end From 25b7b30945241cb22529bb60fdb44248a64c19a6 Mon Sep 17 00:00:00 2001 From: Nils Dagsson Moskopp Date: Sat, 14 May 2022 22:41:52 +0200 Subject: [PATCH 011/982] Allow encoding grayscale images as BW8 --- examples.lua | 16 +++++++++++++-- init.lua | 58 +++++++++++++++++++++++++++++++++++++++------------- 2 files changed, 58 insertions(+), 16 deletions(-) diff --git a/examples.lua b/examples.lua index 5e16722f3..e21e4db95 100644 --- a/examples.lua +++ b/examples.lua @@ -29,6 +29,18 @@ for x = 1,56,1 do end tga_encoder.image(pixels):save("bitmap_large.tga") +-- note that the uncompressed grayscale TGA file written in this +-- example is 80 bytes – but an optimized PNG file is 81 bytes … +local pixels = {} +for x = 1,6,1 do -- left to right + for z = 1,6,1 do -- bottom to top + local color = { math.min(x * z * 4 - 1, 255) } + pixels[z] = pixels[z] or {} + pixels[z][x] = color + end +end +tga_encoder.image(pixels, {colors="BW", pixel_depth=8}):save("gradients_8bpp.tga") + local pixels = {} for x = 1,16,1 do -- left to right for z = 1,16,1 do -- bottom to top @@ -46,5 +58,5 @@ for x = 1,16,1 do -- left to right pixels[z][x] = color end end -tga_encoder.image(pixels, {pixel_depth=16}):save("gradients_16bpp.tga") -tga_encoder.image(pixels, {pixel_depth=24}):save("gradients_24bpp.tga") +tga_encoder.image(pixels, {colors="RGB", pixel_depth=16}):save("gradients_16bpp.tga") +tga_encoder.image(pixels, {colors="RGB", pixel_depth=24}):save("gradients_24bpp.tga") diff --git a/init.lua b/init.lua index d8a044244..aad7f2cac 100644 --- a/init.lua +++ b/init.lua @@ -10,14 +10,15 @@ local image = setmetatable({}, { function image:constructor(pixels, properties) local properties = properties or {} - local pixel_depth = properties.pixel_depth or 16 + properties.colors = properties.colors or "RGB" + properties.pixel_depth = properties.pixel_depth or 16 self.data = "" self.pixels = pixels self.width = #pixels[1] self.height = #pixels - self:encode(pixel_depth) + self:encode(properties) end function image:encode_colormap_spec() @@ -27,10 +28,13 @@ function image:encode_colormap_spec() .. string.char(0) -- bits per pixel end -function image:encode_image_spec(pixel_depth) +function image:encode_image_spec(properties) + local colors = properties.colors + local pixel_depth = properties.pixel_depth assert( - 16 == pixel_depth or -- (A1R5G5B5 = 2 bytes = 16 bits) - 24 == pixel_depth -- (B8G8R8 = 3 bytes = 24 bits) + "BW" == colors and 8 == pixel_depth or -- (8 bit grayscale = 1 byte = 8 bits) + "RGB" == colors and 16 == pixel_depth or -- (A1R5G5B5 = 2 bytes = 16 bits) + "RGB" == colors and 24 == pixel_depth -- (B8G8R8 = 3 bytes = 24 bits) ) self.data = self.data .. string.char(0, 0) -- X-origin @@ -41,23 +45,49 @@ function image:encode_image_spec(pixel_depth) .. string.char(0) -- image descriptor end -function image:encode_header(pixel_depth) +function image:encode_header(properties) + local colors = properties.colors + local pixel_depth = properties.pixel_depth + local image_type + if "BW" == colors and 8 == pixel_depth then + image_type = 3 -- grayscale + elseif ( + "RGB" == colors and 16 == pixel_depth or + "RGB" == colors and 24 == pixel_depth + ) then + image_type = 10 -- RLE RGB + end self.data = self.data .. string.char(0) -- image id .. string.char(0) -- color map type - .. string.char(10) -- image type (RLE RGB = 10) + .. string.char(image_type) self:encode_colormap_spec() -- color map specification - self:encode_image_spec(pixel_depth) -- image specification + self:encode_image_spec(properties) -- image specification end -function image:encode_data(pixel_depth) - if 16 == pixel_depth then +function image:encode_data(properties) + local colors = properties.colors + local pixel_depth = properties.pixel_depth + if "BW" == colors and 8 == pixel_depth then + self:encode_data_bw8() + elseif "RGB" == colors and 16 == pixel_depth then self:encode_data_a1r5g5b5_rle() - elseif 24 == pixel_depth then + elseif "RGB" == colors and 24 == pixel_depth then self:encode_data_r8g8b8_rle() end end +function image:encode_data_bw8() + local raw_pixels = {} + for _, row in ipairs(self.pixels) do + for _, pixel in ipairs(row) do + local raw_pixel = string.char(pixel[1]) + raw_pixels[#raw_pixels + 1] = raw_pixel + end + end + self.data = self.data .. table.concat(raw_pixels) +end + function image:encode_data_a1r5g5b5_rle() local colorword = nil local previous_r = nil @@ -232,10 +262,10 @@ function image:encode_footer() .. string.char(0) end -function image:encode(pixel_depth) - self:encode_header(pixel_depth) -- header +function image:encode(properties) + self:encode_header(properties) -- header -- no color map and image id data - self:encode_data(pixel_depth) -- encode data + self:encode_data(properties) -- encode data -- no extension or developer area self:encode_footer() -- footer end From 5640e19c946c6742a8fd767b41690e57e91f1f1e Mon Sep 17 00:00:00 2001 From: Nils Dagsson Moskopp Date: Sun, 15 May 2022 03:10:53 +0200 Subject: [PATCH 012/982] Add fractal example --- examples.lua | 22 ++++++++++++++++++++++ 1 file changed, 22 insertions(+) diff --git a/examples.lua b/examples.lua index e21e4db95..0b5b55609 100644 --- a/examples.lua +++ b/examples.lua @@ -60,3 +60,25 @@ for x = 1,16,1 do -- left to right end tga_encoder.image(pixels, {colors="RGB", pixel_depth=16}):save("gradients_16bpp.tga") tga_encoder.image(pixels, {colors="RGB", pixel_depth=24}):save("gradients_24bpp.tga") + +local pixels = {} +for x = 1,512,1 do -- left to right + for z = 1,512,1 do -- bottom to top + local oz = (z - 256) / 256 + 0.75 + local ox = (x - 256) / 256 + local px, pz, i = 0, 0, 0 + while (px * px) + (pz * pz) <= 4 and i < 128 do + px = (px * px) - (pz * pz) + oz + pz = (2 * px * pz) + ox + i = i + 1 + end + local color = { + math.max(0, math.min(255, math.floor(px * 64))), + math.max(0, math.min(255, math.floor(pz * 64))), + math.max(0, math.min(255, math.floor(i))), + } + pixels[z] = pixels[z] or {} + pixels[z][x] = color + end +end +tga_encoder.image(pixels, {colors="RGB", pixel_depth=24}):save("fractal_24bpp.tga") From 9bd1702d60c63636db4ec93611b623dbb6648171 Mon Sep 17 00:00:00 2001 From: Nils Dagsson Moskopp Date: Sun, 15 May 2022 14:54:28 +0200 Subject: [PATCH 013/982] Encode image only when saving it to a file --- examples.lua | 9 +++++---- init.lua | 18 +++++++++--------- 2 files changed, 14 insertions(+), 13 deletions(-) diff --git a/examples.lua b/examples.lua index 0b5b55609..4d04e6e8a 100644 --- a/examples.lua +++ b/examples.lua @@ -39,7 +39,7 @@ for x = 1,6,1 do -- left to right pixels[z][x] = color end end -tga_encoder.image(pixels, {colors="BW", pixel_depth=8}):save("gradients_8bpp.tga") +tga_encoder.image(pixels):save("gradients_8bpp.tga", {colors="BW", pixel_depth=8}) local pixels = {} for x = 1,16,1 do -- left to right @@ -58,8 +58,9 @@ for x = 1,16,1 do -- left to right pixels[z][x] = color end end -tga_encoder.image(pixels, {colors="RGB", pixel_depth=16}):save("gradients_16bpp.tga") -tga_encoder.image(pixels, {colors="RGB", pixel_depth=24}):save("gradients_24bpp.tga") +local gradients = tga_encoder.image(pixels) +gradients:save("gradients_16bpp.tga", {colors="RGB", pixel_depth=16}) +gradients:save("gradients_24bpp.tga", {colors="RGB", pixel_depth=24}) local pixels = {} for x = 1,512,1 do -- left to right @@ -81,4 +82,4 @@ for x = 1,512,1 do -- left to right pixels[z][x] = color end end -tga_encoder.image(pixels, {colors="RGB", pixel_depth=24}):save("fractal_24bpp.tga") +tga_encoder.image(pixels):save("fractal_24bpp.tga", {colors="RGB", pixel_depth=24}) diff --git a/init.lua b/init.lua index aad7f2cac..a79a32920 100644 --- a/init.lua +++ b/init.lua @@ -8,17 +8,10 @@ local image = setmetatable({}, { end, }) -function image:constructor(pixels, properties) - local properties = properties or {} - properties.colors = properties.colors or "RGB" - properties.pixel_depth = properties.pixel_depth or 16 - - self.data = "" +function image:constructor(pixels) self.pixels = pixels self.width = #pixels[1] self.height = #pixels - - self:encode(properties) end function image:encode_colormap_spec() @@ -263,6 +256,7 @@ function image:encode_footer() end function image:encode(properties) + self.data = "" self:encode_header(properties) -- header -- no color map and image id data self:encode_data(properties) -- encode data @@ -270,7 +264,13 @@ function image:encode(properties) self:encode_footer() -- footer end -function image:save(filename) +function image:save(filename, properties) + local properties = properties or {} + properties.colors = properties.colors or "RGB" + properties.pixel_depth = properties.pixel_depth or 16 + + self:encode(properties) + local f = assert(io.open(filename, "wb")) f:write(self.data) f:close() From 376b6404b2e9a0a1d3ca6535b9c4a455ef283111 Mon Sep 17 00:00:00 2001 From: Nils Dagsson Moskopp Date: Sun, 15 May 2022 15:42:48 +0200 Subject: [PATCH 014/982] Allow RAW or RLE encoding for true-color images --- examples.lua | 8 +++++--- init.lua | 56 +++++++++++++++++++++++++++++++++++++++++++++++----- 2 files changed, 56 insertions(+), 8 deletions(-) diff --git a/examples.lua b/examples.lua index 4d04e6e8a..b2d9de605 100644 --- a/examples.lua +++ b/examples.lua @@ -39,7 +39,7 @@ for x = 1,6,1 do -- left to right pixels[z][x] = color end end -tga_encoder.image(pixels):save("gradients_8bpp.tga", {colors="BW", pixel_depth=8}) +tga_encoder.image(pixels):save("gradients_8bpp_raw.tga", {colors="BW", compression="RAW", pixel_depth=8}) local pixels = {} for x = 1,16,1 do -- left to right @@ -59,8 +59,10 @@ for x = 1,16,1 do -- left to right end end local gradients = tga_encoder.image(pixels) -gradients:save("gradients_16bpp.tga", {colors="RGB", pixel_depth=16}) -gradients:save("gradients_24bpp.tga", {colors="RGB", pixel_depth=24}) +gradients:save("gradients_16bpp_raw.tga", {colors="RGB", compression="RAW", pixel_depth=16}) +gradients:save("gradients_16bpp_rle.tga", {colors="RGB", compression="RLE", pixel_depth=16}) +gradients:save("gradients_24bpp_raw.tga", {colors="RGB", compression="RAW", pixel_depth=24}) +gradients:save("gradients_24bpp_rle.tga", {colors="RGB", compression="RLE", pixel_depth=24}) local pixels = {} for x = 1,512,1 do -- left to right diff --git a/init.lua b/init.lua index a79a32920..c044cdac9 100644 --- a/init.lua +++ b/init.lua @@ -40,15 +40,20 @@ end function image:encode_header(properties) local colors = properties.colors + local compression = properties.compression local pixel_depth = properties.pixel_depth local image_type - if "BW" == colors and 8 == pixel_depth then + if "BW" == colors and "RAW" == compression and 8 == pixel_depth then image_type = 3 -- grayscale elseif ( "RGB" == colors and 16 == pixel_depth or "RGB" == colors and 24 == pixel_depth ) then - image_type = 10 -- RLE RGB + if "RAW" == compression then + image_type = 2 -- RAW RGB + elseif "RLE" == compression then + image_type = 10 -- RLE RGB + end end self.data = self.data .. string.char(0) -- image id @@ -60,13 +65,23 @@ end function image:encode_data(properties) local colors = properties.colors + local compression = properties.compression local pixel_depth = properties.pixel_depth - if "BW" == colors and 8 == pixel_depth then + + if "BW" == colors and "RAW" == compression and 8 == pixel_depth then self:encode_data_bw8() elseif "RGB" == colors and 16 == pixel_depth then - self:encode_data_a1r5g5b5_rle() + if "RAW" == compression then + self:encode_data_a1r5g5b5_raw() + elseif "RLE" == compression then + self:encode_data_a1r5g5b5_rle() + end elseif "RGB" == colors and 24 == pixel_depth then - self:encode_data_r8g8b8_rle() + if "RAW" == compression then + self:encode_data_r8g8b8_raw() + elseif "RLE" == compression then + self:encode_data_r8g8b8_rle() + end end end @@ -81,6 +96,25 @@ function image:encode_data_bw8() self.data = self.data .. table.concat(raw_pixels) end +function image:encode_data_a1r5g5b5_raw() + local raw_pixels = {} + -- Sample depth rescaling is done according to the algorithm presented in: + -- + local max_sample_in = math.pow(2, 8) - 1 + local max_sample_out = math.pow(2, 5) - 1 + for _, row in ipairs(self.pixels) do + for _, pixel in ipairs(row) do + local colorword = 32768 + + ((math.floor((pixel[1] * max_sample_out / max_sample_in) + 0.5)) * 1024) + + ((math.floor((pixel[2] * max_sample_out / max_sample_in) + 0.5)) * 32) + + ((math.floor((pixel[3] * max_sample_out / max_sample_in) + 0.5)) * 1) + local raw_pixel = string.char(colorword % 256, math.floor(colorword / 256)) + raw_pixels[#raw_pixels + 1] = raw_pixel + end + end + self.data = self.data .. table.concat(raw_pixels) +end + function image:encode_data_a1r5g5b5_rle() local colorword = nil local previous_r = nil @@ -170,6 +204,17 @@ function image:encode_data_a1r5g5b5_rle() self.data = self.data .. table.concat(packets) end +function image:encode_data_r8g8b8_raw() + local raw_pixels = {} + for _, row in ipairs(self.pixels) do + for _, pixel in ipairs(row) do + local raw_pixel = string.char(pixel[3], pixel[2], pixel[1]) + raw_pixels[#raw_pixels + 1] = raw_pixel + end + end + self.data = self.data .. table.concat(raw_pixels) +end + function image:encode_data_r8g8b8_rle() local previous_r = nil local previous_g = nil @@ -267,6 +312,7 @@ end function image:save(filename, properties) local properties = properties or {} properties.colors = properties.colors or "RGB" + properties.compression = properties.compression or "RLE" properties.pixel_depth = properties.pixel_depth or 16 self:encode(properties) From 759b0a188f9445940ffad6b47032560b5d56c057 Mon Sep 17 00:00:00 2001 From: Nils Dagsson Moskopp Date: Sun, 15 May 2022 19:22:56 +0200 Subject: [PATCH 015/982] Allow saving R8G8B8 images as BW8 --- examples.lua | 5 ++++- init.lua | 32 ++++++++++++++++++++++++++++++-- 2 files changed, 34 insertions(+), 3 deletions(-) diff --git a/examples.lua b/examples.lua index b2d9de605..c6513553a 100644 --- a/examples.lua +++ b/examples.lua @@ -39,7 +39,7 @@ for x = 1,6,1 do -- left to right pixels[z][x] = color end end -tga_encoder.image(pixels):save("gradients_8bpp_raw.tga", {colors="BW", compression="RAW", pixel_depth=8}) +tga_encoder.image(pixels):save("gradient_8bpp_raw.tga", {colors="BW", compression="RAW", pixel_depth=8}) local pixels = {} for x = 1,16,1 do -- left to right @@ -59,6 +59,7 @@ for x = 1,16,1 do -- left to right end end local gradients = tga_encoder.image(pixels) +gradients:save("gradients_8bpp_raw.tga", {colors="BW", compression="RAW", pixel_depth=8}) gradients:save("gradients_16bpp_raw.tga", {colors="RGB", compression="RAW", pixel_depth=16}) gradients:save("gradients_16bpp_rle.tga", {colors="RGB", compression="RLE", pixel_depth=16}) gradients:save("gradients_24bpp_raw.tga", {colors="RGB", compression="RAW", pixel_depth=24}) @@ -84,4 +85,6 @@ for x = 1,512,1 do -- left to right pixels[z][x] = color end end +tga_encoder.image(pixels):save("fractal_8bpp.tga", {colors="BW", pixel_depth=8}) +tga_encoder.image(pixels):save("fractal_16bpp.tga", {colors="RGB", pixel_depth=16}) tga_encoder.image(pixels):save("fractal_24bpp.tga", {colors="RGB", pixel_depth=24}) diff --git a/init.lua b/init.lua index c044cdac9..0c604afbd 100644 --- a/init.lua +++ b/init.lua @@ -12,6 +12,7 @@ function image:constructor(pixels) self.pixels = pixels self.width = #pixels[1] self.height = #pixels + self.pixel_depth = #pixels[1][1] end function image:encode_colormap_spec() @@ -69,7 +70,11 @@ function image:encode_data(properties) local pixel_depth = properties.pixel_depth if "BW" == colors and "RAW" == compression and 8 == pixel_depth then - self:encode_data_bw8() + if 1 == self.pixel_depth then + self:encode_data_bw8_to_bw8_raw() + elseif 3 == self.pixel_depth then + self:encode_data_r8g8b8_to_bw8_raw() + end elseif "RGB" == colors and 16 == pixel_depth then if "RAW" == compression then self:encode_data_a1r5g5b5_raw() @@ -85,7 +90,8 @@ function image:encode_data(properties) end end -function image:encode_data_bw8() +function image:encode_data_bw8_to_bw8_raw() + assert(1 == self.pixel_depth) local raw_pixels = {} for _, row in ipairs(self.pixels) do for _, pixel in ipairs(row) do @@ -96,7 +102,26 @@ function image:encode_data_bw8() self.data = self.data .. table.concat(raw_pixels) end +function image:encode_data_r8g8b8_to_bw8_raw() + assert(3 == self.pixel_depth) + local raw_pixels = {} + for _, row in ipairs(self.pixels) do + for _, pixel in ipairs(row) do + -- see + local gray = math.floor( + 0.299 * pixel[1] + + 0.587 * pixel[2] + + 0.114 * pixel[3] + ) + local raw_pixel = string.char(gray) + raw_pixels[#raw_pixels + 1] = raw_pixel + end + end + self.data = self.data .. table.concat(raw_pixels) +end + function image:encode_data_a1r5g5b5_raw() + assert(3 == self.pixel_depth) local raw_pixels = {} -- Sample depth rescaling is done according to the algorithm presented in: -- @@ -116,6 +141,7 @@ function image:encode_data_a1r5g5b5_raw() end function image:encode_data_a1r5g5b5_rle() + assert(3 == self.pixel_depth) local colorword = nil local previous_r = nil local previous_g = nil @@ -205,6 +231,7 @@ function image:encode_data_a1r5g5b5_rle() end function image:encode_data_r8g8b8_raw() + assert(3 == self.pixel_depth) local raw_pixels = {} for _, row in ipairs(self.pixels) do for _, pixel in ipairs(row) do @@ -216,6 +243,7 @@ function image:encode_data_r8g8b8_raw() end function image:encode_data_r8g8b8_rle() + assert(3 == self.pixel_depth) local previous_r = nil local previous_g = nil local previous_b = nil From 5b79bc6fb7c409b631d7c2c88bfbbadc78269081 Mon Sep 17 00:00:00 2001 From: Nils Dagsson Moskopp Date: Sun, 15 May 2022 19:29:05 +0200 Subject: [PATCH 016/982] Set default encoding to R8G8B8 RAW This the most trivial RGB encoding the encoder supports. Setting it prevents a crash related to BW8 only supporting RAW encoding. --- init.lua | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/init.lua b/init.lua index 0c604afbd..3aaedbe71 100644 --- a/init.lua +++ b/init.lua @@ -340,8 +340,8 @@ end function image:save(filename, properties) local properties = properties or {} properties.colors = properties.colors or "RGB" - properties.compression = properties.compression or "RLE" - properties.pixel_depth = properties.pixel_depth or 16 + properties.compression = properties.compression or "RAW" + properties.pixel_depth = properties.pixel_depth or 24 self:encode(properties) From 2112637fafb256b92e46c3b13e0fe1f44774a7e9 Mon Sep 17 00:00:00 2001 From: Nils Dagsson Moskopp Date: Sun, 15 May 2022 19:54:53 +0200 Subject: [PATCH 017/982] Use HSP for RGB-to-BW8 conversion --- init.lua | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/init.lua b/init.lua index 3aaedbe71..90d8e3c5f 100644 --- a/init.lua +++ b/init.lua @@ -107,11 +107,15 @@ function image:encode_data_r8g8b8_to_bw8_raw() local raw_pixels = {} for _, row in ipairs(self.pixels) do for _, pixel in ipairs(row) do - -- see + -- the HSP RGB to brightness formula is + -- sqrt( 0.299 r² + .587 g² + .114 b² ) + -- see local gray = math.floor( - 0.299 * pixel[1] + - 0.587 * pixel[2] + - 0.114 * pixel[3] + math.sqrt( + 0.299 * pixel[1]^2 + + 0.587 * pixel[2]^2 + + 0.114 * pixel[3]^2 + ) + 0.5 ) local raw_pixel = string.char(gray) raw_pixels[#raw_pixels + 1] = raw_pixel From 36ee45ebe35ddfc198821ed394be689bd945f327 Mon Sep 17 00:00:00 2001 From: Nils Dagsson Moskopp Date: Mon, 16 May 2022 01:39:33 +0200 Subject: [PATCH 018/982] Add RGBA support (only RAW encoding) --- examples.lua | 9 +++++++++ init.lua | 26 ++++++++++++++++++++++---- 2 files changed, 31 insertions(+), 4 deletions(-) diff --git a/examples.lua b/examples.lua index c6513553a..95665c6e8 100644 --- a/examples.lua +++ b/examples.lua @@ -65,6 +65,15 @@ gradients:save("gradients_16bpp_rle.tga", {colors="RGB", compression="RLE", pixe gradients:save("gradients_24bpp_raw.tga", {colors="RGB", compression="RAW", pixel_depth=24}) gradients:save("gradients_24bpp_rle.tga", {colors="RGB", compression="RLE", pixel_depth=24}) +for x = 1,16,1 do -- left to right + for z = 1,16,1 do -- bottom to top + local color = pixels[z][x] + color[#color+1] = ((x * x) + (z * z)) % 256 + pixels[z][x] = color + end +end +gradients:save("gradients_32bpp_raw.tga", {colors="RGBA", compression="RAW", pixel_depth=32}) + local pixels = {} for x = 1,512,1 do -- left to right for z = 1,512,1 do -- bottom to top diff --git a/init.lua b/init.lua index 90d8e3c5f..00fee2158 100644 --- a/init.lua +++ b/init.lua @@ -12,7 +12,6 @@ function image:constructor(pixels) self.pixels = pixels self.width = #pixels[1] self.height = #pixels - self.pixel_depth = #pixels[1][1] end function image:encode_colormap_spec() @@ -28,7 +27,8 @@ function image:encode_image_spec(properties) assert( "BW" == colors and 8 == pixel_depth or -- (8 bit grayscale = 1 byte = 8 bits) "RGB" == colors and 16 == pixel_depth or -- (A1R5G5B5 = 2 bytes = 16 bits) - "RGB" == colors and 24 == pixel_depth -- (B8G8R8 = 3 bytes = 24 bits) + "RGB" == colors and 24 == pixel_depth or -- (B8G8R8 = 3 bytes = 24 bits) + "RGBA" == colors and 32 == pixel_depth -- (B8G8R8A8 = 4 bytes = 32 bits) ) self.data = self.data .. string.char(0, 0) -- X-origin @@ -48,10 +48,11 @@ function image:encode_header(properties) image_type = 3 -- grayscale elseif ( "RGB" == colors and 16 == pixel_depth or - "RGB" == colors and 24 == pixel_depth + "RGB" == colors and 24 == pixel_depth or + "RGBA" == colors and 32 == pixel_depth ) then if "RAW" == compression then - image_type = 2 -- RAW RGB + image_type = 2 -- RAW RGB(A) elseif "RLE" == compression then image_type = 10 -- RLE RGB end @@ -68,6 +69,7 @@ function image:encode_data(properties) local colors = properties.colors local compression = properties.compression local pixel_depth = properties.pixel_depth + self.pixel_depth = #self.pixels[1][1] if "BW" == colors and "RAW" == compression and 8 == pixel_depth then if 1 == self.pixel_depth then @@ -87,6 +89,10 @@ function image:encode_data(properties) elseif "RLE" == compression then self:encode_data_r8g8b8_rle() end + elseif "RGBA" == colors and 32 == pixel_depth then + if "RAW" == compression then + self:encode_data_r8g8b8a8_raw() + end end end @@ -323,6 +329,18 @@ function image:encode_data_r8g8b8_rle() self.data = self.data .. table.concat(packets) end +function image:encode_data_r8g8b8a8_raw() + assert(4 == self.pixel_depth) + local raw_pixels = {} + for _, row in ipairs(self.pixels) do + for _, pixel in ipairs(row) do + local raw_pixel = string.char(pixel[3], pixel[2], pixel[1], pixel[4]) + raw_pixels[#raw_pixels + 1] = raw_pixel + end + end + self.data = self.data .. table.concat(raw_pixels) +end + function image:encode_footer() self.data = self.data .. string.char(0, 0, 0, 0) -- extension area offset From fa23775bf933f17965f859b6c97c7c702ebabc22 Mon Sep 17 00:00:00 2001 From: Nils Dagsson Moskopp Date: Mon, 16 May 2022 01:54:21 +0200 Subject: [PATCH 019/982] Measure pixel_depth in bits everywhere --- init.lua | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/init.lua b/init.lua index 00fee2158..be713129d 100644 --- a/init.lua +++ b/init.lua @@ -69,12 +69,12 @@ function image:encode_data(properties) local colors = properties.colors local compression = properties.compression local pixel_depth = properties.pixel_depth - self.pixel_depth = #self.pixels[1][1] + self.pixel_depth = #self.pixels[1][1] * 8 if "BW" == colors and "RAW" == compression and 8 == pixel_depth then - if 1 == self.pixel_depth then + if 8 == self.pixel_depth then self:encode_data_bw8_to_bw8_raw() - elseif 3 == self.pixel_depth then + elseif 24 == self.pixel_depth then self:encode_data_r8g8b8_to_bw8_raw() end elseif "RGB" == colors and 16 == pixel_depth then @@ -97,7 +97,7 @@ function image:encode_data(properties) end function image:encode_data_bw8_to_bw8_raw() - assert(1 == self.pixel_depth) + assert(8 == self.pixel_depth) local raw_pixels = {} for _, row in ipairs(self.pixels) do for _, pixel in ipairs(row) do @@ -109,7 +109,7 @@ function image:encode_data_bw8_to_bw8_raw() end function image:encode_data_r8g8b8_to_bw8_raw() - assert(3 == self.pixel_depth) + assert(24 == self.pixel_depth) local raw_pixels = {} for _, row in ipairs(self.pixels) do for _, pixel in ipairs(row) do @@ -131,7 +131,7 @@ function image:encode_data_r8g8b8_to_bw8_raw() end function image:encode_data_a1r5g5b5_raw() - assert(3 == self.pixel_depth) + assert(24 == self.pixel_depth) local raw_pixels = {} -- Sample depth rescaling is done according to the algorithm presented in: -- @@ -151,7 +151,7 @@ function image:encode_data_a1r5g5b5_raw() end function image:encode_data_a1r5g5b5_rle() - assert(3 == self.pixel_depth) + assert(24 == self.pixel_depth) local colorword = nil local previous_r = nil local previous_g = nil @@ -241,7 +241,7 @@ function image:encode_data_a1r5g5b5_rle() end function image:encode_data_r8g8b8_raw() - assert(3 == self.pixel_depth) + assert(24 == self.pixel_depth) local raw_pixels = {} for _, row in ipairs(self.pixels) do for _, pixel in ipairs(row) do @@ -253,7 +253,7 @@ function image:encode_data_r8g8b8_raw() end function image:encode_data_r8g8b8_rle() - assert(3 == self.pixel_depth) + assert(24 == self.pixel_depth) local previous_r = nil local previous_g = nil local previous_b = nil @@ -330,7 +330,7 @@ function image:encode_data_r8g8b8_rle() end function image:encode_data_r8g8b8a8_raw() - assert(4 == self.pixel_depth) + assert(32 == self.pixel_depth) local raw_pixels = {} for _, row in ipairs(self.pixels) do for _, pixel in ipairs(row) do From 7b94fc026d10cc0c56aa0e5d50be61cac49b8278 Mon Sep 17 00:00:00 2001 From: Nils Dagsson Moskopp Date: Mon, 16 May 2022 02:48:51 +0200 Subject: [PATCH 020/982] Allow to specify color format --- examples.lua | 20 ++++++------- init.lua | 85 ++++++++++++++++++++++++++++++---------------------- 2 files changed, 60 insertions(+), 45 deletions(-) diff --git a/examples.lua b/examples.lua index 95665c6e8..559d36ac2 100644 --- a/examples.lua +++ b/examples.lua @@ -39,7 +39,7 @@ for x = 1,6,1 do -- left to right pixels[z][x] = color end end -tga_encoder.image(pixels):save("gradient_8bpp_raw.tga", {colors="BW", compression="RAW", pixel_depth=8}) +tga_encoder.image(pixels):save("gradient_8bpp_raw.tga", {color_format="Y8", compression="RAW"}) local pixels = {} for x = 1,16,1 do -- left to right @@ -59,11 +59,11 @@ for x = 1,16,1 do -- left to right end end local gradients = tga_encoder.image(pixels) -gradients:save("gradients_8bpp_raw.tga", {colors="BW", compression="RAW", pixel_depth=8}) -gradients:save("gradients_16bpp_raw.tga", {colors="RGB", compression="RAW", pixel_depth=16}) -gradients:save("gradients_16bpp_rle.tga", {colors="RGB", compression="RLE", pixel_depth=16}) -gradients:save("gradients_24bpp_raw.tga", {colors="RGB", compression="RAW", pixel_depth=24}) -gradients:save("gradients_24bpp_rle.tga", {colors="RGB", compression="RLE", pixel_depth=24}) +gradients:save("gradients_8bpp_raw.tga", {color_format="Y8", compression="RAW"}) +gradients:save("gradients_16bpp_raw.tga", {color_format="A1R5G5B5", compression="RAW"}) +gradients:save("gradients_16bpp_rle.tga", {color_format="A1R5G5B5", compression="RLE"}) +gradients:save("gradients_24bpp_raw.tga", {color_format="B8G8R8", compression="RAW"}) +gradients:save("gradients_24bpp_rle.tga", {color_format="B8G8R8", compression="RLE"}) for x = 1,16,1 do -- left to right for z = 1,16,1 do -- bottom to top @@ -72,7 +72,7 @@ for x = 1,16,1 do -- left to right pixels[z][x] = color end end -gradients:save("gradients_32bpp_raw.tga", {colors="RGBA", compression="RAW", pixel_depth=32}) +gradients:save("gradients_32bpp_raw.tga", {color_format="B8G8R8A8", compression="RAW"}) local pixels = {} for x = 1,512,1 do -- left to right @@ -94,6 +94,6 @@ for x = 1,512,1 do -- left to right pixels[z][x] = color end end -tga_encoder.image(pixels):save("fractal_8bpp.tga", {colors="BW", pixel_depth=8}) -tga_encoder.image(pixels):save("fractal_16bpp.tga", {colors="RGB", pixel_depth=16}) -tga_encoder.image(pixels):save("fractal_24bpp.tga", {colors="RGB", pixel_depth=24}) +tga_encoder.image(pixels):save("fractal_8bpp.tga", {color_format="Y8"}) +tga_encoder.image(pixels):save("fractal_16bpp.tga", {color_format="A1R5G5B5"}) +tga_encoder.image(pixels):save("fractal_24bpp.tga", {color_format="B8G8R8"}) diff --git a/init.lua b/init.lua index be713129d..07e1ebde3 100644 --- a/init.lua +++ b/init.lua @@ -22,14 +22,21 @@ function image:encode_colormap_spec() end function image:encode_image_spec(properties) - local colors = properties.colors - local pixel_depth = properties.pixel_depth + local color_format = properties.color_format assert( - "BW" == colors and 8 == pixel_depth or -- (8 bit grayscale = 1 byte = 8 bits) - "RGB" == colors and 16 == pixel_depth or -- (A1R5G5B5 = 2 bytes = 16 bits) - "RGB" == colors and 24 == pixel_depth or -- (B8G8R8 = 3 bytes = 24 bits) - "RGBA" == colors and 32 == pixel_depth -- (B8G8R8A8 = 4 bytes = 32 bits) + "Y8" == color_format or -- (8 bit grayscale = 1 byte = 8 bits) + "A1R5G5B5" == color_format or -- (A1R5G5B5 = 2 bytes = 16 bits) + "B8G8R8" == color_format or -- (B8G8R8 = 3 bytes = 24 bits) + "B8G8R8A8" == color_format -- (B8G8R8A8 = 4 bytes = 32 bits) ) + pixel_depth_by_color_format = { + ["Y8"] = 8, + ["A1R5G5B5"] = 16, + ["B8G8R8"] = 24, + ["B8G8R8A8"] = 32, + } + local pixel_depth = pixel_depth_by_color_format[color_format] + assert( nil ~= pixel_depth) self.data = self.data .. string.char(0, 0) -- X-origin .. string.char(0, 0) -- Y-origin @@ -40,16 +47,15 @@ function image:encode_image_spec(properties) end function image:encode_header(properties) - local colors = properties.colors + local color_format = properties.color_format local compression = properties.compression - local pixel_depth = properties.pixel_depth local image_type - if "BW" == colors and "RAW" == compression and 8 == pixel_depth then + if "Y8" == color_format and "RAW" == compression then image_type = 3 -- grayscale elseif ( - "RGB" == colors and 16 == pixel_depth or - "RGB" == colors and 24 == pixel_depth or - "RGBA" == colors and 32 == pixel_depth + "A1R5G5B5" == color_format or + "B8G8R8" == color_format or + "B8G8R8A8" == color_format ) then if "RAW" == compression then image_type = 2 -- RAW RGB(A) @@ -57,6 +63,7 @@ function image:encode_header(properties) image_type = 10 -- RLE RGB end end + assert( nil ~= image_type ) self.data = self.data .. string.char(0) -- image id .. string.char(0) -- color map type @@ -66,37 +73,35 @@ function image:encode_header(properties) end function image:encode_data(properties) - local colors = properties.colors + local color_format = properties.color_format local compression = properties.compression - local pixel_depth = properties.pixel_depth - self.pixel_depth = #self.pixels[1][1] * 8 - if "BW" == colors and "RAW" == compression and 8 == pixel_depth then + if "Y8" == color_format and "RAW" == compression then if 8 == self.pixel_depth then - self:encode_data_bw8_to_bw8_raw() + self:encode_data_Y8_as_Y8_raw() elseif 24 == self.pixel_depth then - self:encode_data_r8g8b8_to_bw8_raw() + self:encode_data_R8G8B8_as_Y8_raw() end - elseif "RGB" == colors and 16 == pixel_depth then + elseif "A1R5G5B5" == color_format then if "RAW" == compression then - self:encode_data_a1r5g5b5_raw() + self:encode_data_R8G8B8_as_A1R5G5B5_raw() elseif "RLE" == compression then - self:encode_data_a1r5g5b5_rle() + self:encode_data_R8G8B8_as_A1R5G5B5_rle() end - elseif "RGB" == colors and 24 == pixel_depth then + elseif "B8G8R8" == color_format then if "RAW" == compression then - self:encode_data_r8g8b8_raw() + self:encode_data_R8G8B8_as_B8G8R8_raw() elseif "RLE" == compression then - self:encode_data_r8g8b8_rle() + self:encode_data_R8G8B8_as_B8G8R8_rle() end - elseif "RGBA" == colors and 32 == pixel_depth then + elseif "B8G8R8A8" == color_format then if "RAW" == compression then - self:encode_data_r8g8b8a8_raw() + self:encode_data_R8G8B8A8_as_B8G8R8A8_raw() end end end -function image:encode_data_bw8_to_bw8_raw() +function image:encode_data_Y8_as_Y8_raw() assert(8 == self.pixel_depth) local raw_pixels = {} for _, row in ipairs(self.pixels) do @@ -108,7 +113,7 @@ function image:encode_data_bw8_to_bw8_raw() self.data = self.data .. table.concat(raw_pixels) end -function image:encode_data_r8g8b8_to_bw8_raw() +function image:encode_data_R8G8B8_as_Y8_raw() assert(24 == self.pixel_depth) local raw_pixels = {} for _, row in ipairs(self.pixels) do @@ -130,7 +135,7 @@ function image:encode_data_r8g8b8_to_bw8_raw() self.data = self.data .. table.concat(raw_pixels) end -function image:encode_data_a1r5g5b5_raw() +function image:encode_data_R8G8B8_as_A1R5G5B5_raw() assert(24 == self.pixel_depth) local raw_pixels = {} -- Sample depth rescaling is done according to the algorithm presented in: @@ -150,7 +155,7 @@ function image:encode_data_a1r5g5b5_raw() self.data = self.data .. table.concat(raw_pixels) end -function image:encode_data_a1r5g5b5_rle() +function image:encode_data_R8G8B8_as_A1R5G5B5_rle() assert(24 == self.pixel_depth) local colorword = nil local previous_r = nil @@ -240,7 +245,7 @@ function image:encode_data_a1r5g5b5_rle() self.data = self.data .. table.concat(packets) end -function image:encode_data_r8g8b8_raw() +function image:encode_data_R8G8B8_as_B8G8R8_raw() assert(24 == self.pixel_depth) local raw_pixels = {} for _, row in ipairs(self.pixels) do @@ -252,7 +257,7 @@ function image:encode_data_r8g8b8_raw() self.data = self.data .. table.concat(raw_pixels) end -function image:encode_data_r8g8b8_rle() +function image:encode_data_R8G8B8_as_B8G8R8_rle() assert(24 == self.pixel_depth) local previous_r = nil local previous_g = nil @@ -329,7 +334,7 @@ function image:encode_data_r8g8b8_rle() self.data = self.data .. table.concat(packets) end -function image:encode_data_r8g8b8a8_raw() +function image:encode_data_R8G8B8A8_as_B8G8R8A8_raw() assert(32 == self.pixel_depth) local raw_pixels = {} for _, row in ipairs(self.pixels) do @@ -361,9 +366,19 @@ end function image:save(filename, properties) local properties = properties or {} - properties.colors = properties.colors or "RGB" properties.compression = properties.compression or "RAW" - properties.pixel_depth = properties.pixel_depth or 24 + + self.pixel_depth = #self.pixels[1][1] * 8 + if nil == properties.color_format then + if 8 == self.pixel_depth then + properties.color_format = "Y8" + elseif 24 == self.pixel_depth then + properties.color_format = "B8G8R8" + elseif 32 == self.pixel_depth then + properties.color_format = "B8G8R8A8" + end + end + assert( nil ~= properties.color_format ) self:encode(properties) From 1f9c446a98c9082ac1083532f8419966773a8f1e Mon Sep 17 00:00:00 2001 From: Nils Dagsson Moskopp Date: Mon, 16 May 2022 03:21:52 +0200 Subject: [PATCH 021/982] Assert that pixel data is encoded --- init.lua | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/init.lua b/init.lua index 07e1ebde3..e8cc8942a 100644 --- a/init.lua +++ b/init.lua @@ -76,6 +76,7 @@ function image:encode_data(properties) local color_format = properties.color_format local compression = properties.compression + local data_length_before = #self.data if "Y8" == color_format and "RAW" == compression then if 8 == self.pixel_depth then self:encode_data_Y8_as_Y8_raw() @@ -99,6 +100,11 @@ function image:encode_data(properties) self:encode_data_R8G8B8A8_as_B8G8R8A8_raw() end end + local data_length_after = #self.data + assert( + data_length_after ~= data_length_before, + "No data encoded for color format: " .. color_format + ) end function image:encode_data_Y8_as_Y8_raw() From ed061e68ffb9eb80ac816f74eaeb1c4513511253 Mon Sep 17 00:00:00 2001 From: Nils Dagsson Moskopp Date: Mon, 16 May 2022 13:16:23 +0200 Subject: [PATCH 022/982] Allow RLE encoding for RGBA images --- examples.lua | 3 ++ init.lua | 81 ++++++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 84 insertions(+) diff --git a/examples.lua b/examples.lua index 559d36ac2..6255cf539 100644 --- a/examples.lua +++ b/examples.lua @@ -73,6 +73,9 @@ for x = 1,16,1 do -- left to right end end gradients:save("gradients_32bpp_raw.tga", {color_format="B8G8R8A8", compression="RAW"}) +-- the RLE-compressed file is larger than just dumping pixels because +-- the gradients in this picture can not be compressed well using RLE +gradients:save("gradients_32bpp_rle.tga", {color_format="B8G8R8A8", compression="RLE"}) local pixels = {} for x = 1,512,1 do -- left to right diff --git a/init.lua b/init.lua index e8cc8942a..562d1e1f1 100644 --- a/init.lua +++ b/init.lua @@ -98,6 +98,8 @@ function image:encode_data(properties) elseif "B8G8R8A8" == color_format then if "RAW" == compression then self:encode_data_R8G8B8A8_as_B8G8R8A8_raw() + elseif "RLE" == compression then + self:encode_data_R8G8B8A8_as_B8G8R8A8_rle() end end local data_length_after = #self.data @@ -352,6 +354,85 @@ function image:encode_data_R8G8B8A8_as_B8G8R8A8_raw() self.data = self.data .. table.concat(raw_pixels) end +function image:encode_data_R8G8B8A8_as_B8G8R8A8_rle() + assert(32 == self.pixel_depth) + local previous_r = nil + local previous_g = nil + local previous_b = nil + local previous_a = nil + local raw_pixel = '' + local raw_pixels = {} + local count = 1 + local packets = {} + local raw_packet = '' + local rle_packet = '' + for _, row in ipairs(self.pixels) do + for _, pixel in ipairs(row) do + if pixel[1] ~= previous_r or pixel[2] ~= previous_g or pixel[3] ~= previous_b or pixel[4] ~= previous_a or count == 128 then + if nil ~= previous_r then + if 1 == count then + -- remember pixel verbatim for raw encoding + raw_pixel = string.char(previous_b, previous_g, previous_r, previous_a) + raw_pixels[#raw_pixels + 1] = raw_pixel + if 128 == #raw_pixels then + raw_packet = string.char(#raw_pixels - 1) + packets[#packets + 1] = raw_packet + for i=1, #raw_pixels do + packets[#packets +1] = raw_pixels[i] + end + raw_pixels = {} + end + else + -- encode raw pixels, if any + if #raw_pixels > 0 then + raw_packet = string.char(#raw_pixels - 1) + packets[#packets + 1] = raw_packet + for i=1, #raw_pixels do + packets[#packets +1] = raw_pixels[i] + end + raw_pixels = {} + end + -- RLE encoding + rle_packet = string.char(128 + count - 1, previous_b, previous_g, previous_r, previous_a) + packets[#packets +1] = rle_packet + end + end + count = 1 + previous_r = pixel[1] + previous_g = pixel[2] + previous_b = pixel[3] + previous_a = pixel[4] + else + count = count + 1 + end + end + end + if 1 == count then + raw_pixel = string.char(previous_b, previous_g, previous_r, previous_a) + raw_pixels[#raw_pixels + 1] = raw_pixel + raw_packet = string.char(#raw_pixels - 1) + packets[#packets + 1] = raw_packet + for i=1, #raw_pixels do + packets[#packets +1] = raw_pixels[i] + end + raw_pixels = {} + else + -- encode raw pixels, if any + if #raw_pixels > 0 then + raw_packet = string.char(#raw_pixels - 1) + packets[#packets + 1] = raw_packet + for i=1, #raw_pixels do + packets[#packets +1] = raw_pixels[i] + end + raw_pixels = {} + end + -- RLE encoding + rle_packet = string.char(128 + count - 1, previous_b, previous_g, previous_r, previous_a) + packets[#packets +1] = rle_packet + end + self.data = self.data .. table.concat(packets) +end + function image:encode_footer() self.data = self.data .. string.char(0, 0, 0, 0) -- extension area offset From 9f9b78eed96eccac2cf6123ee0e54d36f1318d09 Mon Sep 17 00:00:00 2001 From: Nils Dagsson Moskopp Date: Mon, 16 May 2022 17:01:38 +0200 Subject: [PATCH 023/982] Allow color-mapped encoding for RGB images --- examples.lua | 26 +++++++++++++ init.lua | 104 +++++++++++++++++++++++++++++++++++++++++---------- 2 files changed, 111 insertions(+), 19 deletions(-) diff --git a/examples.lua b/examples.lua index 6255cf539..f80663d0e 100644 --- a/examples.lua +++ b/examples.lua @@ -100,3 +100,29 @@ end tga_encoder.image(pixels):save("fractal_8bpp.tga", {color_format="Y8"}) tga_encoder.image(pixels):save("fractal_16bpp.tga", {color_format="A1R5G5B5"}) tga_encoder.image(pixels):save("fractal_24bpp.tga", {color_format="B8G8R8"}) + +-- encode a colormapped bitmap +local K = { 0 } +local B = { 1 } +local R = { 2 } +local G = { 3 } +local W = { 4 } +local colormap = { + { 1, 2, 3 }, -- K + { 0, 0, 255 }, -- B + { 255, 0, 0 }, -- R + { 0, 255, 0 }, -- G + { 253, 254, 255 }, -- W +} +local pixels = { + { W, K, W, K, W, K, W }, + { R, G, B, R, G, B, K }, + { K, W, K, W, K, W, K }, + { G, B, R, G, B, R, W }, + { W, W, W, K, K, K, W }, + { B, R, G, B, R, G, K }, + { B, R, G, B, R, G, W }, +} +-- note that the uncompressed colormapped TGA file written in this +-- example is 108 bytes – but an optimized PNG file is 121 bytes … +tga_encoder.image(pixels):save("colormapped_8bpp.tga", {colormap=colormap}) diff --git a/init.lua b/init.lua index 562d1e1f1..49a2d44ce 100644 --- a/init.lua +++ b/init.lua @@ -14,11 +14,21 @@ function image:constructor(pixels) self.height = #pixels end -function image:encode_colormap_spec() - self.data = self.data - .. string.char(0, 0) -- first entry index - .. string.char(0, 0) -- number of entries - .. string.char(0) -- bits per pixel +function image:encode_colormap_spec(properties) + local colormap_spec + if nil ~= properties.colormap then + local color_count = #properties.colormap + colormap_spec = + string.char(0, 0) .. -- first entry index + string.char(color_count % 256, math.floor(color_count / 256)) .. -- number of entries + string.char(#properties.colormap[1] * 8) -- bits per pixel + else -- no colormap + colormap_spec = + string.char(0, 0) .. -- first entry index + string.char(0, 0) .. -- number of entries + string.char(0) -- bits per pixel + end + self.data = self.data .. colormap_spec end function image:encode_image_spec(properties) @@ -35,7 +45,12 @@ function image:encode_image_spec(properties) ["B8G8R8"] = 24, ["B8G8R8A8"] = 32, } - local pixel_depth = pixel_depth_by_color_format[color_format] + local pixel_depth + if nil ~= properties.colormap then + pixel_depth = self.pixel_depth + else + pixel_depth = pixel_depth_by_color_format[color_format] + end assert( nil ~= pixel_depth) self.data = self.data .. string.char(0, 0) -- X-origin @@ -46,8 +61,31 @@ function image:encode_image_spec(properties) .. string.char(0) -- image descriptor end +function image:encode_colormap(properties) + local colormap = properties.colormap + if nil == colormap then + return + end + local colormap_pixel_depth = #colormap[1] * 8 + assert( 24 == colormap_pixel_depth ) + local colors = {} + if 24 == colormap_pixel_depth then + for i = 1,#colormap,1 do + local color = colormap[i] + local color_bytes = string.char( + color[3], -- B + color[2], -- G + color[1] -- R + ) + colors[#colors + 1] = color_bytes + end + end + self.data = self.data .. table.concat(colors) +end + function image:encode_header(properties) local color_format = properties.color_format + local colormap = properties.colormap local compression = properties.compression local image_type if "Y8" == color_format and "RAW" == compression then @@ -58,22 +96,32 @@ function image:encode_header(properties) "B8G8R8A8" == color_format ) then if "RAW" == compression then - image_type = 2 -- RAW RGB(A) + if nil ~= colormap then + image_type = 1 -- colormapped RGB(A) + else + image_type = 2 -- RAW RGB(A) + end elseif "RLE" == compression then image_type = 10 -- RLE RGB end end assert( nil ~= image_type ) + local colormap_type = 0 + if nil ~= colormap then + colormap_type = 1 + end self.data = self.data .. string.char(0) -- image id - .. string.char(0) -- color map type + .. string.char(colormap_type) .. string.char(image_type) - self:encode_colormap_spec() -- color map specification + self:encode_colormap_spec(properties) -- color map specification self:encode_image_spec(properties) -- image specification + self:encode_colormap(properties) end function image:encode_data(properties) local color_format = properties.color_format + local colormap = properties.colormap local compression = properties.compression local data_length_before = #self.data @@ -90,10 +138,18 @@ function image:encode_data(properties) self:encode_data_R8G8B8_as_A1R5G5B5_rle() end elseif "B8G8R8" == color_format then - if "RAW" == compression then - self:encode_data_R8G8B8_as_B8G8R8_raw() - elseif "RLE" == compression then - self:encode_data_R8G8B8_as_B8G8R8_rle() + if nil ~= colormap then + if "RAW" == compression then + if 8 == self.pixel_depth then + self:encode_data_Y8_as_Y8_raw() + end + end + else + if "RAW" == compression then + self:encode_data_R8G8B8_as_B8G8R8_raw() + elseif "RLE" == compression then + self:encode_data_R8G8B8_as_B8G8R8_rle() + end end elseif "B8G8R8A8" == color_format then if "RAW" == compression then @@ -456,13 +512,23 @@ function image:save(filename, properties) properties.compression = properties.compression or "RAW" self.pixel_depth = #self.pixels[1][1] * 8 + + local color_format_defaults_by_pixel_depth = { + [8] = "Y8", + [24] = "B8G8R8", + [32] = "B8G8R8A8", + } if nil == properties.color_format then - if 8 == self.pixel_depth then - properties.color_format = "Y8" - elseif 24 == self.pixel_depth then - properties.color_format = "B8G8R8" - elseif 32 == self.pixel_depth then - properties.color_format = "B8G8R8A8" + if nil ~= properties.colormap then + properties.color_format = + color_format_defaults_by_pixel_depth[ + #properties.colormap[1] * 8 + ] + else + properties.color_format = + color_format_defaults_by_pixel_depth[ + self.pixel_depth + ] end end assert( nil ~= properties.color_format ) From e83894fcfabd229e4d5e7b9f538ed30fb3f00cdd Mon Sep 17 00:00:00 2001 From: Nils Dagsson Moskopp Date: Mon, 16 May 2022 17:56:53 +0200 Subject: [PATCH 024/982] Treat empty colormap as no colormap --- init.lua | 41 ++++++++++++++++++++--------------------- 1 file changed, 20 insertions(+), 21 deletions(-) diff --git a/init.lua b/init.lua index 49a2d44ce..bfe049166 100644 --- a/init.lua +++ b/init.lua @@ -15,19 +15,15 @@ function image:constructor(pixels) end function image:encode_colormap_spec(properties) - local colormap_spec - if nil ~= properties.colormap then - local color_count = #properties.colormap - colormap_spec = - string.char(0, 0) .. -- first entry index - string.char(color_count % 256, math.floor(color_count / 256)) .. -- number of entries - string.char(#properties.colormap[1] * 8) -- bits per pixel - else -- no colormap - colormap_spec = - string.char(0, 0) .. -- first entry index - string.char(0, 0) .. -- number of entries - string.char(0) -- bits per pixel + local colormap = properties.colormap + local colormap_pixel_depth = 0 + if 0 ~= #colormap then + colormap_pixel_depth = #colormap[1] * 8 end + local colormap_spec = + string.char(0, 0) .. -- first entry index + string.char(#colormap % 256, math.floor(#colormap / 256)) .. -- number of entries + string.char(colormap_pixel_depth) -- bits per pixel self.data = self.data .. colormap_spec end @@ -46,7 +42,7 @@ function image:encode_image_spec(properties) ["B8G8R8A8"] = 32, } local pixel_depth - if nil ~= properties.colormap then + if 0 ~= #properties.colormap then pixel_depth = self.pixel_depth else pixel_depth = pixel_depth_by_color_format[color_format] @@ -63,7 +59,7 @@ end function image:encode_colormap(properties) local colormap = properties.colormap - if nil == colormap then + if 0 == #colormap then return end local colormap_pixel_depth = #colormap[1] * 8 @@ -87,8 +83,10 @@ function image:encode_header(properties) local color_format = properties.color_format local colormap = properties.colormap local compression = properties.compression + local colormap_type local image_type if "Y8" == color_format and "RAW" == compression then + colormap_type = 0 image_type = 3 -- grayscale elseif ( "A1R5G5B5" == color_format or @@ -96,20 +94,20 @@ function image:encode_header(properties) "B8G8R8A8" == color_format ) then if "RAW" == compression then - if nil ~= colormap then + if 0 ~= #colormap then + colormap_type = 1 image_type = 1 -- colormapped RGB(A) else + colormap_type = 0 image_type = 2 -- RAW RGB(A) end elseif "RLE" == compression then + colormap_type = 0 image_type = 10 -- RLE RGB end end + assert( nil ~= colormap_type ) assert( nil ~= image_type ) - local colormap_type = 0 - if nil ~= colormap then - colormap_type = 1 - end self.data = self.data .. string.char(0) -- image id .. string.char(colormap_type) @@ -138,7 +136,7 @@ function image:encode_data(properties) self:encode_data_R8G8B8_as_A1R5G5B5_rle() end elseif "B8G8R8" == color_format then - if nil ~= colormap then + if 0 ~= #colormap then if "RAW" == compression then if 8 == self.pixel_depth then self:encode_data_Y8_as_Y8_raw() @@ -509,6 +507,7 @@ end function image:save(filename, properties) local properties = properties or {} + properties.colormap = properties.colormap or {} properties.compression = properties.compression or "RAW" self.pixel_depth = #self.pixels[1][1] * 8 @@ -519,7 +518,7 @@ function image:save(filename, properties) [32] = "B8G8R8A8", } if nil == properties.color_format then - if nil ~= properties.colormap then + if 0 ~= #properties.colormap then properties.color_format = color_format_defaults_by_pixel_depth[ #properties.colormap[1] * 8 From 45e405982a820c3fb81c11b65350ca7cae2a53e4 Mon Sep 17 00:00:00 2001 From: Nils Dagsson Moskopp Date: Mon, 16 May 2022 18:41:19 +0200 Subject: [PATCH 025/982] Allow encoding with A1R5G5B5 colormap --- examples.lua | 4 +++- init.lua | 60 ++++++++++++++++++++++++++++++++++++++++------------ 2 files changed, 49 insertions(+), 15 deletions(-) diff --git a/examples.lua b/examples.lua index f80663d0e..9ac530cbf 100644 --- a/examples.lua +++ b/examples.lua @@ -125,4 +125,6 @@ local pixels = { } -- note that the uncompressed colormapped TGA file written in this -- example is 108 bytes – but an optimized PNG file is 121 bytes … -tga_encoder.image(pixels):save("colormapped_8bpp.tga", {colormap=colormap}) +tga_encoder.image(pixels):save("colormapped_B8G8R8.tga", {colormap=colormap}) +-- encoding as A1R5G5B5 saves 1 byte per palette entry → 103 bytes +tga_encoder.image(pixels):save("colormapped_A1R5G5B5.tga", {colormap=colormap, color_format="A1R5G5B5"}) diff --git a/init.lua b/init.lua index bfe049166..f77b93a07 100644 --- a/init.lua +++ b/init.lua @@ -14,11 +14,20 @@ function image:constructor(pixels) self.height = #pixels end +local pixel_depth_by_color_format = { + ["Y8"] = 8, + ["A1R5G5B5"] = 16, + ["B8G8R8"] = 24, + ["B8G8R8A8"] = 32, +} + function image:encode_colormap_spec(properties) local colormap = properties.colormap local colormap_pixel_depth = 0 if 0 ~= #colormap then - colormap_pixel_depth = #colormap[1] * 8 + colormap_pixel_depth = pixel_depth_by_color_format[ + properties.color_format + ] end local colormap_spec = string.char(0, 0) .. -- first entry index @@ -35,12 +44,6 @@ function image:encode_image_spec(properties) "B8G8R8" == color_format or -- (B8G8R8 = 3 bytes = 24 bits) "B8G8R8A8" == color_format -- (B8G8R8A8 = 4 bytes = 32 bits) ) - pixel_depth_by_color_format = { - ["Y8"] = 8, - ["A1R5G5B5"] = 16, - ["B8G8R8"] = 24, - ["B8G8R8A8"] = 32, - } local pixel_depth if 0 ~= #properties.colormap then pixel_depth = self.pixel_depth @@ -62,10 +65,30 @@ function image:encode_colormap(properties) if 0 == #colormap then return end - local colormap_pixel_depth = #colormap[1] * 8 - assert( 24 == colormap_pixel_depth ) + local color_format = properties.color_format + assert ( + "A1R5G5B5" == color_format or + "B8G8R8" == color_format + ) local colors = {} - if 24 == colormap_pixel_depth then + if "A1R5G5B5" == color_format then + -- Sample depth rescaling is done according to the algorithm presented in: + -- + local max_sample_in = math.pow(2, 8) - 1 + local max_sample_out = math.pow(2, 5) - 1 + for i = 1,#colormap,1 do + local color = colormap[i] + local colorword = 32768 + + ((math.floor((color[1] * max_sample_out / max_sample_in) + 0.5)) * 1024) + + ((math.floor((color[2] * max_sample_out / max_sample_in) + 0.5)) * 32) + + ((math.floor((color[3] * max_sample_out / max_sample_in) + 0.5)) * 1) + local color_bytes = string.char( + colorword % 256, + math.floor(colorword / 256) + ) + colors[#colors + 1] = color_bytes + end + elseif "B8G8R8" == color_format then for i = 1,#colormap,1 do local color = colormap[i] local color_bytes = string.char( @@ -76,6 +99,7 @@ function image:encode_colormap(properties) colors[#colors + 1] = color_bytes end end + assert( 0 ~= #colors ) self.data = self.data .. table.concat(colors) end @@ -130,10 +154,18 @@ function image:encode_data(properties) self:encode_data_R8G8B8_as_Y8_raw() end elseif "A1R5G5B5" == color_format then - if "RAW" == compression then - self:encode_data_R8G8B8_as_A1R5G5B5_raw() - elseif "RLE" == compression then - self:encode_data_R8G8B8_as_A1R5G5B5_rle() + if 0 ~= #colormap then + if "RAW" == compression then + if 8 == self.pixel_depth then + self:encode_data_Y8_as_Y8_raw() + end + end + else + if "RAW" == compression then + self:encode_data_R8G8B8_as_A1R5G5B5_raw() + elseif "RLE" == compression then + self:encode_data_R8G8B8_as_A1R5G5B5_rle() + end end elseif "B8G8R8" == color_format then if 0 ~= #colormap then From 83348bf3ac49adb2e142cffde1accd3b620f727c Mon Sep 17 00:00:00 2001 From: Nils Dagsson Moskopp Date: Mon, 16 May 2022 20:34:33 +0200 Subject: [PATCH 026/982] Document use cases, image type support, plans --- README.md | 79 +++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 79 insertions(+) diff --git a/README.md b/README.md index 195cb8df5..555cefd59 100644 --- a/README.md +++ b/README.md @@ -6,3 +6,82 @@ Created by fleckenstein for MineClone2, then improved by erlehmann. May be used as a Minetest mod. See `examples.lua` for example code and usage hints. + +## Use Cases for `tga_encoder` + +### Encoding Textures for Editing + +TGA images of types 1/2/3 consist of header data followed by a pixel array. + +This makes it trivial to parse TGA files – and even edit pixels in-place. + +No checksums need to be updated on any kind of in-place texture editing. + +**Tip**: When storing an editable image in item meta, use zlib compression. + +### Legacy Minetest Texture Encoding + +Minetest 5.4 did not include `minetest.encode_png()` (or any equvivalent). + +Since `tga_encoder` is written in pure Lua, it does not need engine support. + +**Tip:** Look at `examples.lua` and the Minetest mod `mcl_maps` for guidance. + +### Advanced Texture Format Control + +The function `minetest.encode_png()` always encodes images as 32bpp RGBA. + +`tga_encoder` allows saving images as grayscale, 16bpp RGBA and 24bpp RGB. + +For generating maps from terrain, color-mapped formats can be more useful. + +### Encoding Very Small Textures + +Images of size 8×8 or below are often smaller than an equivalent PNG file. + +Note that on many filesystems files use at least 4096 bytes (i.e. 64×64). + +Therefore, saving bytes on files up to a few 100 bytes is often useless. + +### Encoding Reference Textures + +TGA is a simple format, which makes it easy to create reference textures. + +Using a hex editor, one can trivially see how all the pixels are stored. + +## Supported Image Types + +For all types, images are encoded in a fast single pass (i.e. append-only). + +### Color-Mapped Images (Type 1) + +These images contain a palette, followed by pixel data. + +* `A1R5G5B5` (8bpp RGB) +* `B8G8R8` (8bpp RGB) + +### True-Color Images (Type 2) + +These images contain uncompressed RGB(A) pixel data. + +* `A1R5G5B5` (16bpp RGBA) +* `B8G8R8` (24bpp RGB) +* `B8G8R8A8` (32bpp RGBA) + +### Grayscale Images (Type 3) + +* `Y8` (8bpp grayscale) + +### Run-Length Encoded (RLE), True-Color Images (Type 10) + +These images contain compressed RGB(A) pixel data. + +* `A1R5G5B5` (16bpp RGBA) +* `B8G8R8` (24bpp RGB) +* `B8G8R8A8` (32bpp RGBA) + +## TODO + +* Support Type 1 `B8G8R8A8` output (color-mapped 8bpp RGBA) +* Actually support `R8G8B8A8` input for `A1R5G5B5` output +* Add both zoomable and explorable maps to `mcl_maps`. From 7446a275b5424cc56c8a0b2670ab22cf95593086 Mon Sep 17 00:00:00 2001 From: Nils Dagsson Moskopp Date: Mon, 16 May 2022 22:17:52 +0200 Subject: [PATCH 027/982] Remove author from mod.conf ContentDB sets this field automatically --- mod.conf | 1 - 1 file changed, 1 deletion(-) diff --git a/mod.conf b/mod.conf index e4bfac898..d65aca884 100644 --- a/mod.conf +++ b/mod.conf @@ -1,3 +1,2 @@ name = tga_encoder -author = Fleckenstein description = A TGA Encoder written in Lua without the use of external Libraries. From 685bdcb379d07d0d0e4d80b3c4325759907024a3 Mon Sep 17 00:00:00 2001 From: Nils Dagsson Moskopp Date: Thu, 19 May 2022 18:26:41 +0200 Subject: [PATCH 028/982] Allow encoding with B8G8R8A8 colormap --- README.md | 2 +- examples.lua | 20 ++++++++++++++++++++ init.lua | 30 +++++++++++++++++++++++++----- 3 files changed, 46 insertions(+), 6 deletions(-) diff --git a/README.md b/README.md index 555cefd59..1ad978a22 100644 --- a/README.md +++ b/README.md @@ -59,6 +59,7 @@ These images contain a palette, followed by pixel data. * `A1R5G5B5` (8bpp RGB) * `B8G8R8` (8bpp RGB) +* `B8G8R8A8` (8bpp RGBA) ### True-Color Images (Type 2) @@ -82,6 +83,5 @@ These images contain compressed RGB(A) pixel data. ## TODO -* Support Type 1 `B8G8R8A8` output (color-mapped 8bpp RGBA) * Actually support `R8G8B8A8` input for `A1R5G5B5` output * Add both zoomable and explorable maps to `mcl_maps`. diff --git a/examples.lua b/examples.lua index 9ac530cbf..7642281aa 100644 --- a/examples.lua +++ b/examples.lua @@ -128,3 +128,23 @@ local pixels = { tga_encoder.image(pixels):save("colormapped_B8G8R8.tga", {colormap=colormap}) -- encoding as A1R5G5B5 saves 1 byte per palette entry → 103 bytes tga_encoder.image(pixels):save("colormapped_A1R5G5B5.tga", {colormap=colormap, color_format="A1R5G5B5"}) + +-- encode a colormapped bitmap with transparency +local _ = { 0 } +local K = { 1 } +local W = { 2 } +local colormap = { + { 0, 0, 0, 0 }, + { 0, 0, 0, 255 }, + { 255, 255, 255, 255 }, +} +local pixels = { + { _, K, K, K, K, K, _ }, + { _, K, W, W, W, K, _ }, + { K, K, W, W, W, K, K }, + { K, W, W, W, W, W, K }, + { _, K, W, W, W, K, _ }, + { _, _, K, W, K, _, _ }, + { _, _, _, K, _, _, _ }, +} +tga_encoder.image(pixels):save("colormapped_B8G8R8A8.tga", {colormap=colormap}) diff --git a/init.lua b/init.lua index f77b93a07..ed387eec0 100644 --- a/init.lua +++ b/init.lua @@ -68,7 +68,8 @@ function image:encode_colormap(properties) local color_format = properties.color_format assert ( "A1R5G5B5" == color_format or - "B8G8R8" == color_format + "B8G8R8" == color_format or + "B8G8R8A8" == color_format ) local colors = {} if "A1R5G5B5" == color_format then @@ -98,6 +99,17 @@ function image:encode_colormap(properties) ) colors[#colors + 1] = color_bytes end + elseif "B8G8R8A8" == color_format then + for i = 1,#colormap,1 do + local color = colormap[i] + local color_bytes = string.char( + color[3], -- B + color[2], -- G + color[1], -- R + color[4] -- A + ) + colors[#colors + 1] = color_bytes + end end assert( 0 ~= #colors ) self.data = self.data .. table.concat(colors) @@ -182,10 +194,18 @@ function image:encode_data(properties) end end elseif "B8G8R8A8" == color_format then - if "RAW" == compression then - self:encode_data_R8G8B8A8_as_B8G8R8A8_raw() - elseif "RLE" == compression then - self:encode_data_R8G8B8A8_as_B8G8R8A8_rle() + if 0 ~= #colormap then + if "RAW" == compression then + if 8 == self.pixel_depth then + self:encode_data_Y8_as_Y8_raw() + end + end + else + if "RAW" == compression then + self:encode_data_R8G8B8A8_as_B8G8R8A8_raw() + elseif "RLE" == compression then + self:encode_data_R8G8B8A8_as_B8G8R8A8_rle() + end end end local data_length_after = #self.data From e9862f5f24c3f9e375b4c43e70bf6c5dfcc2e8bf Mon Sep 17 00:00:00 2001 From: Nils Dagsson Moskopp Date: Sun, 31 Jul 2022 00:24:15 +0200 Subject: [PATCH 029/982] Add example code for node colormap generation --- colormap_generator.lua | 32 ++++++++++++++++++++++++++++++++ 1 file changed, 32 insertions(+) create mode 100644 colormap_generator.lua diff --git a/colormap_generator.lua b/colormap_generator.lua new file mode 100644 index 000000000..cc6c6a31e --- /dev/null +++ b/colormap_generator.lua @@ -0,0 +1,32 @@ +dofile("init.lua") + +-- This generates images necessary to colorize 16 Minetest nodes in 4096 colors. +-- It serves as a demonstration of what you can achieve using colormapped nodes. +-- It is be useful for grass or beam or glass nodes that need to blend smoothly. + +-- Sample depth rescaling is done according to the algorithm presented in: +-- +local max_sample_in = math.pow(2, 4) - 1 +local max_sample_out = math.pow(2, 8) - 1 + +for r = 0,15 do + local pixels = {} + for g = 0,15 do + if nil == pixels[g + 1] then + pixels[g + 1] = {} + end + for b = 0,15 do + local color = { + math.floor((r * max_sample_out / max_sample_in) + 0.5), + math.floor((g * max_sample_out / max_sample_in) + 0.5), + math.floor((b * max_sample_out / max_sample_in) + 0.5), + } + pixels[g + 1][b + 1] = color + end + end + local filename = "colormap_" .. tostring(r) .. ".tga" + tga_encoder.image(pixels):save( + filename, + { color_format="A1R5G5B5" } -- waste less bits + ) +end From df8c9625e4aa1a46f0d36ef6e47bb1c97514654f Mon Sep 17 00:00:00 2001 From: chmodsayshello Date: Wed, 7 Jun 2023 15:41:53 +0200 Subject: [PATCH 030/982] armor trims: proof of concept --- mods/ITEMS/mcl_armor_trims/init.lua | 34 ++++++++++++++++++++++++++++ mods/ITEMS/mcl_armor_trims/mod.conf | 2 ++ textures/coast.png | Bin 0 -> 6471 bytes textures/coast_leggings.png | Bin 0 -> 161 bytes textures/dune.png | Bin 0 -> 6971 bytes textures/dune_leggings.png | Bin 0 -> 142 bytes textures/eye.png | Bin 0 -> 6662 bytes textures/eye_leggings.png | Bin 0 -> 6108 bytes textures/rib.png | Bin 0 -> 203 bytes textures/rib_leggings.png | Bin 0 -> 135 bytes textures/sentry.png | Bin 0 -> 7131 bytes textures/sentry_leggings.png | Bin 0 -> 155 bytes textures/snout.png | Bin 0 -> 261 bytes textures/snout_leggings.png | Bin 0 -> 148 bytes textures/spire.png | Bin 0 -> 6926 bytes textures/spire_leggings.png | Bin 0 -> 166 bytes textures/tide.png | Bin 0 -> 258 bytes textures/tide_leggings.png | Bin 0 -> 181 bytes textures/vex.png | Bin 0 -> 250 bytes textures/vex_leggings.png | Bin 0 -> 131 bytes textures/ward.png | Bin 0 -> 8067 bytes textures/ward_leggings.png | Bin 0 -> 189 bytes textures/wild.png | Bin 0 -> 248 bytes textures/wild_leggings.png | Bin 0 -> 165 bytes 24 files changed, 36 insertions(+) create mode 100644 mods/ITEMS/mcl_armor_trims/init.lua create mode 100644 mods/ITEMS/mcl_armor_trims/mod.conf create mode 100644 textures/coast.png create mode 100644 textures/coast_leggings.png create mode 100644 textures/dune.png create mode 100644 textures/dune_leggings.png create mode 100644 textures/eye.png create mode 100644 textures/eye_leggings.png create mode 100644 textures/rib.png create mode 100644 textures/rib_leggings.png create mode 100644 textures/sentry.png create mode 100644 textures/sentry_leggings.png create mode 100644 textures/snout.png create mode 100644 textures/snout_leggings.png create mode 100644 textures/spire.png create mode 100644 textures/spire_leggings.png create mode 100644 textures/tide.png create mode 100644 textures/tide_leggings.png create mode 100644 textures/vex.png create mode 100644 textures/vex_leggings.png create mode 100644 textures/ward.png create mode 100644 textures/ward_leggings.png create mode 100644 textures/wild.png create mode 100644 textures/wild_leggings.png diff --git a/mods/ITEMS/mcl_armor_trims/init.lua b/mods/ITEMS/mcl_armor_trims/init.lua new file mode 100644 index 000000000..e9b744610 --- /dev/null +++ b/mods/ITEMS/mcl_armor_trims/init.lua @@ -0,0 +1,34 @@ +mcl_armor_trims = { + overlays = {"sentry","dune","coast","wild","tide","ward","vex","rib","snout","eye","spire"}, + colors = {"bf352d"} +} + + +local function define_items() + local register_list = {} + for itemname, itemdef in pairs(minetest.registered_items) do + if itemdef._mcl_armor_texture and type(itemdef._mcl_armor_texture) == "string" then + for _, overlay in pairs(mcl_armor_trims.overlays) do + local new_name = itemname .. "_trimmed_" .. overlay + minetest.override_item(itemname, {_mcl_armor_trims_trim = new_name}) + local new_def = table.copy(itemdef) + + --TODO: inventory stuff + + new_def.groups.not_in_creative_inventory = 0 --set this to 1 later! + new_def.groups.not_in_craft_guide = 1 + new_def._mcl_armor_texture = new_def._mcl_armor_texture .. "^" .. overlay .. ".png" + + new_def._mcl_armor_trims_trim = new_name + + register_list[":" .. new_name] = new_def + end + end + end + + for new_name, new_def in pairs(register_list) do + minetest.register_craftitem(new_name, new_def) + end +end + +minetest.register_on_mods_loaded(define_items) \ No newline at end of file diff --git a/mods/ITEMS/mcl_armor_trims/mod.conf b/mods/ITEMS/mcl_armor_trims/mod.conf new file mode 100644 index 000000000..6d001df60 --- /dev/null +++ b/mods/ITEMS/mcl_armor_trims/mod.conf @@ -0,0 +1,2 @@ +name = mcl_armor_trims +author = chmodsayshello \ No newline at end of file diff --git a/textures/coast.png b/textures/coast.png new file mode 100644 index 0000000000000000000000000000000000000000..54dfff6c8464147a335217d881b2655d03b76989 GIT binary patch literal 6471 zcmeHKcU)6h77n0@NErqdQIr@25e(_17$gu%f<{_IiiMPy5Fy1Bngv7;)n=? ztAcH$2-pJHkTxO%N)csH5NtTu(0vK0xHCJu{(igv`S>N|o%@~docrB#?tL%GYni*g z?o3?>1fox;x%hzpDc}dHqYZxN9^4cUfoNZhX8Oy0SP@W(RLm2E0Z@6A1b_mO0v-es z**4%8l={RAdH9~5UY)SvrJb4NzK-1+@>aEna}Kwp?2`2F?ra{} zYG?_|K({n`Jb#^+K2t$v#w_0WQTxyzPe0`KPx}xP7$Lt1UFdr6!JD9)mN6$2-7l9Z z$UTP1eWk0f^_mQz8Lt?P05Qw`4>H1az-Q{?3Z0C&O;=vzFaIzj?u6`6#JpD<4vyr# zZ5=TGfH{N5JaNgLMjd*cPrJG~r1KHG({T1l+X(}GsH?>-%6z@aZ)`k2Y*{fldtdKk z{e5rstxuaxPE4r3zOa7e=BquOcMu7pg4bJm2u1UwgFF!hi>+EO96L*DR^;~o1DfBX z+h?%O(aCGii_(&5D|d)%Fi(%)KW5Op2=Zn~Ii<)b5PB(hZh~oa!>K-|=GiTfdZJ z`!?vL*G5YxUc8q4gJ_2Ik0}cvKMoZgsW9HK=Bc?7r+K;J*Of-W!%`;AV1=-3Rjsx> zKDcIND6lJP0VO$jkuvj#&9R8Nzk9{;VFnseCoUCGz4Q0eAWqjZtt#@Sax@5!X8cw& z#~>&jeGrgLkG*!6y2?U2AJd?Xzez)I1)3tbJ>n z*b9ZZN z_|KNrg+%|vq3Ys%$)Tg`3+Dy4F@u!zY-Kn6S_!)fqpgCkxeIrmnlkgW31(-ZPLFVd zXH%?L*w@mr)o-)AEU}T~nSuibbhd6QUf8%#(>R|VKZ2W2?yER^= z%r{)^b-s%~5Q2L6!{hj!dzJQOx^-?FxKzKS>As4tB{cDUZFfd#?-gSoCSt+O+V~r- z%R*Y6XC?pM7*Cx;b8X&M*hXPYwz_U!PUQF>fBHLpzQbyZpb#e!3DvD!dsxQ>mYPtS zVNs`<@dI*Y`y6_9c5zy-MM9nr;!^VApZr4Z9ET%F2J|a_iN3YAu^kVq1gGw3R&F!y zBZ}{Ga{V$gx6Tm%df$E^Ykz_DU|LMy;3mJzACosF70QRxgOa|&O0);zl?A9=9a&|);E(gfs27@Yv>ph@B&VoFFuhoaeY%8Sh3b#sk7GG z{`S02>SSIKZI*txE+UoQm{qBS?1vpmDr|BO3ZaBm#a5MjpI=_`Qy=eKpMBfP^5O%y zMRnym#S?E6NFAiBYsmpgh~v+D9uAoVT%`gYh<%TKHpy&mf6jiah04)FybT#?h}-hA z0&^y3h2&BmQo&6Y~B5jO*W*%+2!Li5^^&DfYJe1}My zT^el@NDj{9*Vk{Fe5PhlXtrYr83$dFkt}#pzMNLw>e&iMxz9}|ZVg~faCV&&iPEsS z{mZ_c)XEwitDo%WS2!JC@&ZemIaqyuO{(2+74F&dAC=-&zSR}ks}oWl3>;Bz)?Rmp zk)p69qyb87B zml5Ci4SAipb*7iQ!+Cbky|Z`j;RV&x>y&H$HGF~fSrtSHY(UC<~+ENm(tzNdf9 zxuPdE6SwLt-`!x;s`)$dm`vkCLRgM*W0i$_<$+0*pnVj^-L-d48Et%PPTxZ7mg(8t z)n74p`+{wIV~bB6OmArEp>`xDWjdN!4N*Vt>_@Ubws$5DwXf4(+%a$Yx)&McRg!0W zln_HI@Qd`W-ZXFa(U6AJ5}jMOH9a8L*J_=+eei8Rq2+p0{z-ZD{8cM}fGaN+6K6G7 zw$I-9vb(dRbLwTR=DHY7qqxpc=Pu+02t*@6K&5)osnkzL8F+wYZ%lEZDJf>vYkc!z z(~PDh%ddGIT(~Xyk=62raS2U+AA$Wl zFm*HAPJ>Q1LLd8$Vmdwdm$iBOX^op|m5vWz?|qnh{hWr|t|(@Xv-Eve%(L>Kvq;pS z)kF@Zce^k~Piyn49PhIOPdRr**^m$XE|1VRwu<1ldxrv-Y&X-WynCryv1IRX?9JK1 z&*&L?*HhkO6Pz_79gm1_XpEFlhL7D1l9?A6QnsECJg;G3usH<=oQ$d{KVDf9Q;&W3 zPNQB=T5D-@Q$T0lP?{1bp^@K*)}f5*8;EkVDx3Um$XT zJuSZog9^9~uoXB4k|Ci2Ap%;o6!48+#^gkYa)?}*<6>QMBnc!C0&*5KQWz$Zks=*n zYF-lfTV+PTplXOb)B)zt@PbmsQUHpz!`dO?u91RpG;Fahlq}`)NIouZV-(<>11v-? zmyi&Mh=>Tg2#lRr%15AxL?Qx-MxfDf5CNA(iR7$ExJYK9q8R0H0c0GhKq422MNkzd zi!D~j9bhnU96Cl0j&fWhLE~5e)xDZtCg&pP;0+d>4+ub@kw^j@iH4(zi1Gg5D1-6Y zTO=D(5!4eA$&w&Yc1VO!_?3rD?i&6j-d}pinBXHG!UvFv6;cl18V-o$7UP3T!W6Rc zF%>dEWm4xI#^oWvq|}ke`?%8?UY~tbGV%pNiP}Sj9*^X5KI0?`X_y+rNbolV0jv)Vh*f#2kexDBZ;YrplMZ6>|h!lKLl_ zi@^|aJRBU!Mzi2pygeRHM4|C;E|!PE*s}mUo`4!hMHk8BED;A#QGw)k0+5GD!dP;iSSkeDOCaKkBV=EO zm;xc-D`%->L)qi)?ePQ*7KOxtvnPH5`2kWHSmr8L6w(fjR*!HwBsY+g1(usY$l?PC ziHNTrP%R7zoDL{0OVu49v)T^MhD4PDEV)?96pO3s2$Z{ zfUD}bv7U2g@e%4M8YPuLU^rzvuZY@Mk6; zaJQ4mrBU?%FsXmRkw*)b2KtJnQRCwK0_#TaMz^Fefm$jkRJ{$5Se#M$Wvp<3t6l<7 z$I&592us8V!2Nct**@6?e^JOdHX4aRqwsKm&1J)}EEW+?MC0w@IC~!2o&ykZSng;c ze`c47dGZLB6ma5$H2|(N*j(y$hFXu+--55Ri3kBy#f3y;RGT1*z(gWRI3fv&f{m^= zl#EdAu%Bj2R_#Fy25Gz=WYr!;qN@tgS0Ryv2>|KWI(@2}e}fz6KUSmv$$dO*)SD`n zM1fr#BKM3C{cZTa0FE*&6>tENO#FALkB5xPGVUM(a~`#U2OM}_B0e9OV^yMRr2peJ zR(=1+2q5+MAm60#ce%dH^-T(V6Zm^|eV6N-6!<3a_v-qe$))?{l^YO&&wUZ#3$=O0 z9ya(guFYQJ?gII!`pc;-*b7=FOK1Ty2xN+}>Z1Y4%ANrlC&}py*GavaMkb3iCN10+ z1ezM?E>6slj)C7A^|v7PCNyln?L_u)W2MbX@J1)&*Tv|djhIJ&v^hF_0hR{kym+AH z0$v}Ob4?*#gAfR2OJ-reC~9?jW#e$~*})4@^^)+7cZSOr(b5mucRi`O6Zp{Z=(*|b z=0>V3rC^sb0)g~A+**)?J@nY(J)jRY9lUVBVn{P6^mN9o9sHUK2;^tM`JwrhG`B*9 zaqy0IOVi3rX1x8atepFUjV;8bQSmFuklL4Koh#cdiOHL^1|KOJVj0HL_loo%EmGVg ZwfK}c_vUqBdEne2bk}7rMb5!-{{++N>Y4xm literal 0 HcmV?d00001 diff --git a/textures/coast_leggings.png b/textures/coast_leggings.png new file mode 100644 index 0000000000000000000000000000000000000000..509e2440789e72a85fe37e34c45fdcdb87ccf18b GIT binary patch literal 161 zcmeAS@N?(olHy`uVBq!ia0vp^4nVBH!3HE3&8=$zQW>5ujv*P&Z?80RHYfvV0V-u+*wBCPx1{N@3a#HU-C1krE}gPFYi+sw=hu}7 z;*8{tgrEJH@%_xqP4CXzZBqUG^t+_6c%5{gTe~ HDWM4fe7ZSG literal 0 HcmV?d00001 diff --git a/textures/dune.png b/textures/dune.png new file mode 100644 index 0000000000000000000000000000000000000000..54b1f61c5c313e4978074f1906fb2f45dad7db0f GIT binary patch literal 6971 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 UC@P7kq3OejX11oq#@;di0)F9O`v3p{ literal 0 HcmV?d00001 diff --git a/textures/eye_leggings.png b/textures/eye_leggings.png new file mode 100644 index 0000000000000000000000000000000000000000..8e2af36733f3dd3e3c78f7afca5bffef1cc3a765 GIT binary patch literal 6108 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 MSm3yS{_?ng0WZNmG5`Po literal 0 HcmV?d00001 diff --git a/textures/rib.png b/textures/rib.png new file mode 100644 index 0000000000000000000000000000000000000000..4170c2360279a2ad78ad3dfbad8189a60a4e1098 GIT binary patch literal 203 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 Qa|fB_>FVdQ&MBb@08>{+AOHXW literal 0 HcmV?d00001 diff --git a/textures/tide.png b/textures/tide.png new file mode 100644 index 0000000000000000000000000000000000000000..714fe22341f1c3c34f730b0469da97597b200eda GIT binary patch literal 258 zcmV+d0sa1oP)}L)Pm-6;76?==9!DNUY9{R=Vs}1tCUi+^tly%2G9d2 zr8G-l0Pw0>D>r~A1iIj70k|omfH1Q9ZfXc7J-Tu_gWhTijg4r7pRte|%~;5V5Ii-2 z&|*7L1EAhb0zg=x4}bzr&jQ=n1AG1-t6>Rn3kU$vn+V`Y>%EgR#Mjtutss-Pj+HM( z7al(5_^YYwlw0l5C8xY&0q z(5lP*qsF}>k*vCG#}}-$D!D?%jd7EZVE>Vz;L!T$ z>Do>=PoGbZ-^Z|g*8M8KCui>d$-eyH%Afez8A}$vd$xR**8X`;t6rr&OM4dYTk`Jx dlh6M9-!P_ruPV1sO4$lB*wfX|Wt~$(69DALNqqnS literal 0 HcmV?d00001 diff --git a/textures/vex.png b/textures/vex.png new file mode 100644 index 0000000000000000000000000000000000000000..3c265b41dfd29fb27ce87b9cca78629e97b8fed3 GIT binary patch literal 250 zcmeAS@N?(olHy`uVBq!ia0vp^4nVBH!3HE3&8=$zQU^U<978hhy`6EFv%!F;MRx1r zk|}+c0(W^nZD|(L?Rw<@rgj4RWUgmExsOaZ6S zNA9O;<95^U%_73bZ_9oAeZg;H`h#x?rW+Ua^?h2;)zDrVd&>RlzSsZ!ISQ8cL~J_z y?qQt2K@Y>;|DEglHfb|`&?wP8Fq_HlAkTS8BhQS(@411VVeoYIb6Mw<&;$UG6l_NT literal 0 HcmV?d00001 diff --git a/textures/vex_leggings.png b/textures/vex_leggings.png new file mode 100644 index 0000000000000000000000000000000000000000..99c4459bc3fc0ce7b62c4b0868fbcf31766b72d4 GIT binary patch literal 131 zcmeAS@N?(olHy`uVBq!ia0vp^4nVBH!3HE3&8=$zQeK`ejv*QM-d=SSJnSIA?C2~m z;%KRH{K!uU*DJhfS&_v~iNjn``$rhfpb_jL7hS?83{1OP}4DdGSC literal 0 HcmV?d00001 diff --git a/textures/ward.png b/textures/ward.png new file mode 100644 index 0000000000000000000000000000000000000000..df9ff5927e865aa7bfd8a4b65ab19aa06c27665c GIT binary patch literal 8067 zcmeHMc|4Ts+aD!+meL|*nuuh~VrCeTeHpS7rENA0W@%>ZOFF4Y2&oW~5JDpRQW04q zvb0%}5Yn+kvh+TqPU-!f_x#@TdEeiEXJ(#f=DzRm^}Vk9TJGn5o(Z)yH(D>SO#lP} zt;ZSbTLa(Pzyapt0nRrP1A{>z!SlYh4s2_@7ns4MJ5k)pV73o~3?_S1oIoJ&myfO< zjNXYA*8l2r9;?fckF4o*r#-Dt=7sB)+B(@4nI+t_O|v|!upwxz@VVwMW7V$~&z*~G zixXwx&}m^tw^GXL5}1ib&+Pry1#}vfXbpT6nG5&Z$9O$;cxk@irr#2)uL`4frLO!l zEfqN-@}*v6G@x)#GNw#qiV)?1_!vG~8Ra#+){p))!qGlUuG%XlkChlH|87xrYM@|Z z>E+;b-;Rxy5~c4G9eclo*$?+1?l+yJ`#)0+j}#O{9PB&hTittE^kUusyRx9s-|*e1 ziH(ZyBrW~b_Xw%(<58*1J=R-1Io2<^ezH7fsidzoa&D}w&e<#Jt6wW&_Go?i<_$Z{ ziftmpzC@f!yy&-dXdrH0#wYpHL7&Zfv%*i~u66qeJLc@{dd0JsTJTD_Qg|;MQSuIH zKYVuDH}CU!mgF)LEIvpnZmRn7UT~{$|EJd;Fvr_Tj-N{Kg1i<@CeAOKO%%8K%*!YB z(F%)eyAJU?Ve=m<%i}^Me!Et2S3r9_a7w{7D0z7JT>q#J-1VxUa8Y(L)VI)!hTHD5 z?qva-sY%99SEz#ZuSp~7d__y5Keg@hBM;xbSDPPXK};R+XGrrY&7ktz*L~dBZ;80} z#OrS7J>@c%WXqb6k(gF(n}D_1p!_H;tT^+QfsEb-#3L!w+xc?Iy61PNT?<}3G>aX) zYSU6W81FbKcgexJA?>QQX?CvfV?>uN3wp1sORX@U_4ZZxx*U)001?gE4i>C(7Gs<& zW++7&v}(SUYNomrEbkQWbNQgNqi2-Kp4%nujoG)$Uhe8F>ciJ3diIjLdyd{Z$U46C zZl2XKemdUfCJ7&yQfJQ!EV`pBZv|hA*rF8TtP>RM`P&OScfJ-rHt?N-m61MR$mM)U zM~J)Tt}<=m;l%n}{PEb|Xu(4Je*tR9$M=W0{-q@=zp!v2wm(S<^H^9;^2~+WGBhq#BZYa#pBCSLrIy3tH#sMCiX0QqqUBF zUh4GP8W?~0K%Zd5i>1b!0UzB46CciQPhQ9k*6!JnQt`p3-mqgLQ8vhPD(B9VeUpOY zLxjKqBMqtbgWMt)#_Ib6PKC|;6E`X47a4;bw|6*&P6ZBOVEo1F?haMF&c4|+VZML- zEMc3Lyvl1HQ5NadQY(Q|IM&2vupgDsrzPkp$dZuoxMkO-K$SL|cymUqU5(^&+Q`2oIZPs1tJ(1WTT z`QHxrd%lih%$2e2T*dM()9d-pIpaX0g8QSM9T?ch#gcvm|Qo3}Rdr{b|2f_f44;AHWr_SgWJDrqcRMhN;~ zd;Qyk#0|z#dn8*j=;Vd^h+v zhF+X+5a*-cJVdF9-<}e4V#A{xM`oc)Q&Vm&^8Uq~$O`pj8&9&!dB5Efq0O=L4(9FK zxJ|7Mvv>~PQ}GeMsU&(p)I2r4ELfALNwGJ_Tkm!1n8BJlerKziN7ztpGk8l;mBc9e)-tPUrwOB*>ZvJ~%O{k0@tZpOkq;;o*X zYJ=RGE#23%hXZzd@1V2J!;hcu>-5}x+E?h#o$$nmhcBy-+Gsj!Rp0g3V1&zZ*S&P! zw(C>x@4HGhEn;|8;c2-QaxA>l;8PIhKz7?RS*nDD{k7?jF{L3)~Qy6dCT%-1pUyhU+MNl3cE^3ts9a$$c)_eq~rq2!}*SWbvi zWBZ}?lv|v76&f;H3~fYcUDC2( zZLU&muQsP|rtZv=wGWL_NRUN{S-V+1kN<2ikDL@AIA+$o-RzlX#)F{+-JBV0lHAbk zl;X#V@5N6~R2_Rcx|jSZ>^8C(bzO0M!P4I#rdkendSh9*zBm_`0p$(l1@4^BdGi;$ z&u?!+-H+Bd^Wn@#F9k@r`gOU!zW zWpO*`!Fvl=jcg!(pEMrE(xH067->Miu4mlQvAn{XkLZe*5gx1A0$ zyPh#KqA&=4SkOLh*L7}}^n{pLyTseD<90kQp|BjmysYSlTjNM;XfAd+y_Y4DHl5kp zIezYG1p}mVtIKX@>eixuVqxJ0mzNr6B6o?vGhMVl!G>OG?PMNl)nHauG^!aM zSnJ61wtn9eF46Yk>EsWL~ zh<>SO$C{1e21&y9<_8qdPVY-nimtVaYTVNJKDN&FY4l#SY--<(;>8K42CsSv#8ZjF zh8-E`?6|wpT2fp)Y~0M0j%#pL=_>SJ-rHTC-c}RqW&%mPDZ6-Lq;>~ptQH^9W^{df zYD0EPMtW{&aKlk?_Z{K!LaZCvq~>Q`ARR@mtJ?J$)UaN!y-j=&TujuNqw(lxSsRKB zcaH`R-@n1@iP(?ymPqVXIx-|yle>MlqNKgmQ?s1GneyXeTx@|aTK*ce7#-@~I0v=N zFma;>kKM*`VtqDY!fMfT>T=kq*k*xd4R-S7*hN2eYdYmn6j$SxGvgAO{GSEbl!L=D zDxw00FA~{HZks%KWne?=KuJ7L{|o;+ayhZ`l`~ctIvNAs}J1 z>pr7)(P#JvPo+GD^w&!Z#2A!iDo+jQ>0Nq%mIr=Dx%DFu+mCsVVH=*ux>b#ha^H0W zOHil7M4O_OsWd}z41}HVRCvUt*9LpMiHkA2P-cC_dil~Vo$yRq@AfI7#=P2_&(S-F$$dis zJIcnS+d}gVy$_~!n{w&oZ%A@H(UaOD|3r>!`BvG5$GLMa_nBY(w2-++|J3Hzw7{4r zb~*MDm7iuOAeGHW>_&Xwxt!bvFG#zCIzKLFPFt{m8lUkixRG_KK>dUVVt4YEm0@I3pmWuj8Z`H@|A zO23_HKj6~&V6a^z1*aE1FrZMfS!&VYwt9)$*l52Z-)}PDTxIj~%GLv4qjkf!ibO0- zPV~N=kOp@&?MLse1KAZ^u+`Y*#M(pX-?ZinJV+u~&S^AsMwch)?b!BxRlNp2m*+~g zj3T2|CHgmpI>*r*YR77A5-zv+B&*e$MC5K za~M^r7_mn}aZ>h#z7@K0%U$I?*NWA$-zmEF##Fg*k*tL$RJsd_oDYW*~k?U3k zA3hRa(XN4(o%>DP=J$9U{}MBE$TUoftMb+TM;@jzb3skg$A8CN5o(B9M4i#)^43bF zH*zf%YtLo9a%9P5h-jZJJ5(hxI9HlsYO$f(cbrPLOA*rwYR3pPx5eO0- zszSgZp(rOJ7D_h;m=54tJf}JU=9PY6HtKpzGM-Im+S2Lnnh=h)U=HOEfMXD@_g9UxELH$;O55Mf>0J{Dl5s(P6T^=u9^YrUk*3Ol1Ex&!2&RFj)hu z9gEHM!Tp;_{WqM(w}dqYWa&(wRr+nnC%(15ElKW_6<2}5E6ad7p7_oEEW9U~v=Rcq zkKcxfE_j+V8CY+>7uz5Gls`#iBpIznMv(DPf~pfx3u zU)fo7C$<-!N!D=&asY@kP+Ti<1}l8ezumv$yGV|9o_@gZT2iz+8?mPUhEf4%H@ITr0kGuYs2mTiLpX~a7bCN;c%hxQ8-Z}C{B&~0EI-pN_%p>MQ8g-G7+YqV`i86*V zBx{?dr=_$KKaTNR>DFfYOy})uuVXXYclzj;mQ;xS6T`|5pLBJy}v!v4L&f&qTvC le|-~WySn1&w}0#R|7S~gy>C31<4FU^cu!Y9mvv4FO#uHMP`UsB literal 0 HcmV?d00001 diff --git a/textures/wild.png b/textures/wild.png new file mode 100644 index 0000000000000000000000000000000000000000..e47342a098ad439df9f42b85f851cec08167e82a GIT binary patch literal 248 zcmV-uw)>nWmGR!tbjj2zgWP3~`ft@g^z ys?}HiG zOLH`XPfbfwpFCMWtoXFzqxuJ)ETVs}vjP=^z=6nBr;>T(tAA87)}Gn9YLiO(GUY>p z56^5-`CQX*e*fdJ+0(YVD=KZVH9{N^y-5ZcO Mp00i_>zopr0C9vvi~s-t literal 0 HcmV?d00001 From cc186cc58865ada47e2324f211be4773b0f2974c Mon Sep 17 00:00:00 2001 From: chmodsayshello Date: Wed, 7 Jun 2023 15:58:28 +0200 Subject: [PATCH 031/982] add durability back --- mods/ITEMS/mcl_armor_trims/init.lua | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/mods/ITEMS/mcl_armor_trims/init.lua b/mods/ITEMS/mcl_armor_trims/init.lua index e9b744610..d99122f8e 100644 --- a/mods/ITEMS/mcl_armor_trims/init.lua +++ b/mods/ITEMS/mcl_armor_trims/init.lua @@ -17,7 +17,7 @@ local function define_items() new_def.groups.not_in_creative_inventory = 0 --set this to 1 later! new_def.groups.not_in_craft_guide = 1 - new_def._mcl_armor_texture = new_def._mcl_armor_texture .. "^" .. overlay .. ".png" + new_def._mcl_armor_texture = new_def._mcl_armor_texture .. "^" .. overlay .. ".png" .. "^[colorize:purple:50" new_def._mcl_armor_trims_trim = new_name @@ -27,7 +27,7 @@ local function define_items() end for new_name, new_def in pairs(register_list) do - minetest.register_craftitem(new_name, new_def) + minetest.register_tool(new_name, new_def) end end From 4dc5ad3bdbb0d75025efc780d0a844dc4a82bcdc Mon Sep 17 00:00:00 2001 From: chmodsayshello Date: Wed, 7 Jun 2023 16:11:07 +0200 Subject: [PATCH 032/982] add mcl_armor dependency --- mods/ITEMS/mcl_armor_trims/mod.conf | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/mods/ITEMS/mcl_armor_trims/mod.conf b/mods/ITEMS/mcl_armor_trims/mod.conf index 6d001df60..eb9311503 100644 --- a/mods/ITEMS/mcl_armor_trims/mod.conf +++ b/mods/ITEMS/mcl_armor_trims/mod.conf @@ -1,2 +1,3 @@ name = mcl_armor_trims -author = chmodsayshello \ No newline at end of file +author = chmodsayshello +optional_depends = mcl_armor \ No newline at end of file From c62195662ce88c1f081e5e4e72fbf4d702a07589 Mon Sep 17 00:00:00 2001 From: chmodsayshello Date: Wed, 7 Jun 2023 16:42:34 +0200 Subject: [PATCH 033/982] trims: blacklist certain iems --- mods/ITEMS/mcl_armor_trims/init.lua | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/mods/ITEMS/mcl_armor_trims/init.lua b/mods/ITEMS/mcl_armor_trims/init.lua index d99122f8e..27b6b360e 100644 --- a/mods/ITEMS/mcl_armor_trims/init.lua +++ b/mods/ITEMS/mcl_armor_trims/init.lua @@ -1,13 +1,13 @@ mcl_armor_trims = { + blacklisted = {["mcl_farming:pumpkin_face"]=true, ["mcl_armor:elytra"]=true, ["mcl_armor:elytra_enchanted"]=true}, overlays = {"sentry","dune","coast","wild","tide","ward","vex","rib","snout","eye","spire"}, colors = {"bf352d"} } - local function define_items() local register_list = {} for itemname, itemdef in pairs(minetest.registered_items) do - if itemdef._mcl_armor_texture and type(itemdef._mcl_armor_texture) == "string" then + if itemdef._mcl_armor_texture and type(itemdef._mcl_armor_texture) == "string" and not mcl_armor_trims.blacklisted[itemname] then for _, overlay in pairs(mcl_armor_trims.overlays) do local new_name = itemname .. "_trimmed_" .. overlay minetest.override_item(itemname, {_mcl_armor_trims_trim = new_name}) From b154f2def15bddc69840c7bbd107ebef854885f0 Mon Sep 17 00:00:00 2001 From: chmodsayshello Date: Wed, 7 Jun 2023 17:06:53 +0200 Subject: [PATCH 034/982] armor trims: inventory overlay --- mods/ITEMS/mcl_armor_trims/init.lua | 13 ++++++++++++- textures/boots_trim.png | Bin 0 -> 5461 bytes textures/chestplate_trim.png | Bin 0 -> 5523 bytes textures/helmet_trim.png | Bin 0 -> 5408 bytes textures/leggings_trim.png | Bin 0 -> 5556 bytes 5 files changed, 12 insertions(+), 1 deletion(-) create mode 100644 textures/boots_trim.png create mode 100644 textures/chestplate_trim.png create mode 100644 textures/helmet_trim.png create mode 100644 textures/leggings_trim.png diff --git a/mods/ITEMS/mcl_armor_trims/init.lua b/mods/ITEMS/mcl_armor_trims/init.lua index 27b6b360e..4a0558841 100644 --- a/mods/ITEMS/mcl_armor_trims/init.lua +++ b/mods/ITEMS/mcl_armor_trims/init.lua @@ -13,12 +13,23 @@ local function define_items() minetest.override_item(itemname, {_mcl_armor_trims_trim = new_name}) local new_def = table.copy(itemdef) - --TODO: inventory stuff + local invOverlay = "" + if string.find(itemname,"helmet") then + invOverlay = "^helmet_trim.png" + elseif string.find(itemname,"chestplate") then + invOverlay = "^chestplate_trim.png" + elseif string.find(itemname,"leggings") then + invOverlay = "^leggings_trim.png" + elseif string.find(itemname,"boots") then + invOverlay = "^boots_trim.png" + end new_def.groups.not_in_creative_inventory = 0 --set this to 1 later! new_def.groups.not_in_craft_guide = 1 new_def._mcl_armor_texture = new_def._mcl_armor_texture .. "^" .. overlay .. ".png" .. "^[colorize:purple:50" + new_def.inventory_image = itemdef.inventory_image .. invOverlay + new_def._mcl_armor_trims_trim = new_name register_list[":" .. new_name] = new_def diff --git a/textures/boots_trim.png b/textures/boots_trim.png new file mode 100644 index 0000000000000000000000000000000000000000..f46033c21dada34aa09b71e3606c3d414b311a8c GIT binary patch literal 5461 zcmeHKYg7~079P|p1+~-yy0A)&R$TUlZvUCAgq(f8{q23e zv-dg7s?eEJ2RV5-K@c=Z9TX4-{<^Rq$Nu2k^KKUgL45<0BO;kF%)&95jao`aa+o9& z$srRdEd(W=Ys-($zcO~<2N$DM`Ke<%*Oor4 zxwvjeRc46atbYtW|421BMa+O556T)p42clV0~4ZEtmZ{Klq-kWr{a9=KVIq+IdKSAN1raq5{*G6v^T+JVM zXW`FI@f{bIJL0(;#mNqit7*>@AO3XU@Vva;sqfFFBoj&==nH<}j#w0TYjo76S4NCJ z_b7U_J_8C{UOqZ~l!HTY5cjP+wR-}-*^(BLw)V4r&8exHD<62Fjz`_e7F7C`*WROV zCRtkQ`>ga*yT|W@qA^zC{)oOQof;ucnu=NvaWQt0)EHHT2g2K<& zN0!9aoT-m0%|)FDf4x5ZtPX7rgQ+xg^|kcDTXlzP+)KaM8Z143XV%-LA%nzcBR((O zU7r6{u*a!Y`Gu0W@(*W@h~Akoa?y=*dt2xAFFm*R^}si&Yb7~T%Xj3Q|18DJH)Qq9 z1&4!9u1S99SZHH-`qlU$E;0F{1sWYqnf^W)B(`{VPS^Db~jzQ;C1@E`oqusIs@ zzB{#Td-VNAhl_p}{kpKtIg6u83+|b;ZS&m=TaRJ2GVw2b#}(fHG!$&$*NhCgyZCxj zmVa`2eMaMNubxz)@ zt=xA92!rCk3H@lo%1qfbx2*R!A9S0O04H7d6bZ(R_gRx3S6y9vV%M^)1N#Q=OXoc3 zd-=xYPp)y_YA$e{b3E}<$D~sgt+$((q&Dn8PTuesAZn7FUiHPgx=({P&+g}vwlXCM zIgm|gM>$`7cxby}SH-Yz@3eOwcz7oLL~3e)qHf^nvGc}#+!teD5|jW`#~m?V|KpRqLZyn z%8%&IvhCtZ&*VwwU7{7kS3=NhMHD#UB7Yl-$|kU^v+1PsUO~$!0P*LRYWB2f+q^dy6E67@O* zEl*T(t-NyZn>F*f94my0Q*tANLplCNGszM8hcaz5W;vG`boK1Op4Ux1=0A4d2H!UG5%on&CJM4o{j%~IGn0!SJ+QznKo8aON` zrZFZkN-h`7bGpgFEUrof#_j;@*h)_`1YZpXBCs9+;3F_BL81V!)s5(H&W%HF2Mw}w#)}N?GqLB$mgeO77 z7*8aTN_aA%6y`~_s1%XG2&@qyc2sHu&0q$cWT^nT4+VHMG8qO6SIk2Rfs7{-%Y;0c zn810YMl2(Q7>sH(T04pmGX**U)7fXmQW1a(m1+efEE4k&97lN~6ef8X0!Sr*lpr;* z5Ek3AVfR5kB~-2CB0jK{+-eEcVT{&j)`Rw<4201_Kb?x8^kg`Lv9bvyQjt_5gJn_? zj3S8mDQFgHra_srtOD2vvBe^Ac_84#K)F$REQaKp3^7(0c4OpVIY3&B?GC_fwS(2j z{mmrC7|jtzqfW_XbK|g-)~4bpy4yuQ!-!iQtzeR1JFdIu{ID3lb*SJ!5Bw*l@K~e8 z@W1gqh4!#aF*6pUIWEK;qFF%V%=3Ak1@2)A1E(F$n3L3hv8eyRDQpEB1bmI=B)jQ+O<9h#|pw+udwW?9?*~Spti3nMS1H ziDU!;dO?WtFhVHcA()IrC4^Rh5_oTR+NfnLn3u-E-yd{=o ziwj1CJQ(mwA`nE52;_*AYujy(g3q3?Pgbj7&!FI7xxF3=_KcFN*+L9YFqw1|Y3{Al zle+mYI6MFD8vQGGdzj7J-)Kq#T^!4VSPah%{|umwVFrbh2HN<%)a@ZQS?n$%kh9GO zE;w*s@_R1K?kZs$>2G{>SKr?l0Z_jT@3W}m3$oUQS;{X*F4Fkpj zj5=5~pw+>{&26|w_s)J`ic|+oiICN`<$N{>5)ACqR(yPmz++3ItE59(JezxBNoK>S zn_H@G-hdsvavOgh<6M>Ndmx8+9h>M_lj)d8@HoOHldq12x@c{(^Mf_-egC~k0af}J a?-*J#N8sOi{>v5+15&GI2JG{DKmFfUtN<4P literal 0 HcmV?d00001 diff --git a/textures/chestplate_trim.png b/textures/chestplate_trim.png new file mode 100644 index 0000000000000000000000000000000000000000..9172f8e1cae77b07fb89166e8b2bb472784496ea GIT binary patch literal 5523 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 WF6`K~sOf-?p^A=++C6ho)_(v*=HSNw literal 0 HcmV?d00001 diff --git a/textures/leggings_trim.png b/textures/leggings_trim.png new file mode 100644 index 0000000000000000000000000000000000000000..0382d2c2ab554a72bab06f86930cb9f7e529ec92 GIT binary patch literal 5556 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 b?H&vIO<&qK38%j#lAuU}CIxPtFgx?#1(PbG literal 0 HcmV?d00001 From 483285a61227686eaa6b4bcade40a25bf82d0199 Mon Sep 17 00:00:00 2001 From: chmodsayshello Date: Wed, 7 Jun 2023 17:12:02 +0200 Subject: [PATCH 035/982] loop through tools instead of items --- mods/ITEMS/mcl_armor_trims/init.lua | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mods/ITEMS/mcl_armor_trims/init.lua b/mods/ITEMS/mcl_armor_trims/init.lua index 4a0558841..f2a2f504c 100644 --- a/mods/ITEMS/mcl_armor_trims/init.lua +++ b/mods/ITEMS/mcl_armor_trims/init.lua @@ -6,7 +6,7 @@ mcl_armor_trims = { local function define_items() local register_list = {} - for itemname, itemdef in pairs(minetest.registered_items) do + for itemname, itemdef in pairs(minetest.registered_tools) do if itemdef._mcl_armor_texture and type(itemdef._mcl_armor_texture) == "string" and not mcl_armor_trims.blacklisted[itemname] then for _, overlay in pairs(mcl_armor_trims.overlays) do local new_name = itemname .. "_trimmed_" .. overlay From b4273af24575639ce39a52ca1e572b77da63c35d Mon Sep 17 00:00:00 2001 From: chmodsayshello Date: Wed, 7 Jun 2023 17:22:57 +0200 Subject: [PATCH 036/982] fix color overlay --- mods/ITEMS/mcl_armor_trims/init.lua | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/mods/ITEMS/mcl_armor_trims/init.lua b/mods/ITEMS/mcl_armor_trims/init.lua index f2a2f504c..a0c96c425 100644 --- a/mods/ITEMS/mcl_armor_trims/init.lua +++ b/mods/ITEMS/mcl_armor_trims/init.lua @@ -13,6 +13,7 @@ local function define_items() minetest.override_item(itemname, {_mcl_armor_trims_trim = new_name}) local new_def = table.copy(itemdef) + local piece_overlay = overlay local invOverlay = "" if string.find(itemname,"helmet") then invOverlay = "^helmet_trim.png" @@ -20,16 +21,18 @@ local function define_items() invOverlay = "^chestplate_trim.png" elseif string.find(itemname,"leggings") then invOverlay = "^leggings_trim.png" + piece_overlay = piece_overlay .. "_leggings" elseif string.find(itemname,"boots") then invOverlay = "^boots_trim.png" end + piece_overlay = piece_overlay .. ".png" + new_def.groups.not_in_creative_inventory = 0 --set this to 1 later! new_def.groups.not_in_craft_guide = 1 - new_def._mcl_armor_texture = new_def._mcl_armor_texture .. "^" .. overlay .. ".png" .. "^[colorize:purple:50" + new_def._mcl_armor_texture = new_def._mcl_armor_texture .. "^(" .. piece_overlay .. "^[colorize:purple)" new_def.inventory_image = itemdef.inventory_image .. invOverlay - new_def._mcl_armor_trims_trim = new_name register_list[":" .. new_name] = new_def From 8476865ea7e1fc5bc7fbe88e5a364f2f41d6a345 Mon Sep 17 00:00:00 2001 From: chmodsayshello Date: Wed, 7 Jun 2023 19:47:51 +0200 Subject: [PATCH 037/982] add chestplate trim texture --- mods/ITEMS/mcl_armor_trims/init.lua | 1 + textures/coast_chestplate.png | Bin 0 -> 635 bytes textures/dune_chestplate.png | Bin 0 -> 625 bytes textures/eye_chestplate.png | Bin 0 -> 711 bytes textures/rib_chestplate.png | Bin 0 -> 690 bytes textures/sentry_chestplate.png | Bin 0 -> 689 bytes textures/snout_chestplate.png | Bin 0 -> 735 bytes textures/spire_chestplate.png | Bin 0 -> 696 bytes textures/tide_chestplate.png | Bin 0 -> 696 bytes textures/vex_chestplate.png | Bin 0 -> 757 bytes textures/ward_chestplate.png | Bin 0 -> 748 bytes textures/wild_chestplate.png | Bin 0 -> 712 bytes 12 files changed, 1 insertion(+) create mode 100644 textures/coast_chestplate.png create mode 100644 textures/dune_chestplate.png create mode 100644 textures/eye_chestplate.png create mode 100644 textures/rib_chestplate.png create mode 100644 textures/sentry_chestplate.png create mode 100644 textures/snout_chestplate.png create mode 100644 textures/spire_chestplate.png create mode 100644 textures/tide_chestplate.png create mode 100644 textures/vex_chestplate.png create mode 100644 textures/ward_chestplate.png create mode 100644 textures/wild_chestplate.png diff --git a/mods/ITEMS/mcl_armor_trims/init.lua b/mods/ITEMS/mcl_armor_trims/init.lua index a0c96c425..5e8e4f7e7 100644 --- a/mods/ITEMS/mcl_armor_trims/init.lua +++ b/mods/ITEMS/mcl_armor_trims/init.lua @@ -19,6 +19,7 @@ local function define_items() invOverlay = "^helmet_trim.png" elseif string.find(itemname,"chestplate") then invOverlay = "^chestplate_trim.png" + piece_overlay = piece_overlay .. "_chestplate" elseif string.find(itemname,"leggings") then invOverlay = "^leggings_trim.png" piece_overlay = piece_overlay .. "_leggings" diff --git a/textures/coast_chestplate.png b/textures/coast_chestplate.png new file mode 100644 index 0000000000000000000000000000000000000000..6898fc242816c1383bc07b20e690408a4411d004 GIT binary patch literal 635 zcmV->0)+jEP)EX>4Tx04R}tkv&MmKpe$iQ?()$1q+HeWT-A$5EXIMDionYs1;guFuC*#nlvOS zE{=k0!NHHks)LKOt`4q(Aou~|>f)s6A|?JWDYS_7;J6>}?mh0_0YbING^=eK&~)2O z#G+ybnM}+Rhls^o6Dv*3@}@>SMI2T&o$`g0 z$13M7&RVg|>i6U?3}*C|Wvu?$|#@+8xdM{QY<8BKia}S==vpcDdZ}E zkz)ZRXpmh$_#gc4*2+#!cuB!1(Ej2$AHzUk7pPSn=lj@kYA1mI8Mx9L{!$f~`6Rv4 z(85PR&o*#z-O!Xh;Bp5Tcrs*Db|pVeA)5u>&*+=dK;JFUwdVC!-^b|#kfg5SH^9Lm zFp{I}^%n2$Z0_yfGxh#{0AB}kpT)m#&Hw-a24YJ`L;(K){{a7>y{D4^000SaNLh0L z01FcU01FcV0GgZ_00007bV*G`2j>O{5fBCPPGcGX004JML_t(&-tE%C2?QYwh2bY` zA+Homu@p;7De1&LWmwpOISn|>|6L49Fo{Y40000000000FVS`{Fd~-izx~Wq@4a2+ z*lxEDV9vQRQ?~VUsU#f*M#QS3Ydy=UxXvYMjL{zXwK8*^#k=|3IDn(^dQAY^`2v8u VH6-;w8X^Dy002ovPDHLkV1hD-6S)8Y literal 0 HcmV?d00001 diff --git a/textures/dune_chestplate.png b/textures/dune_chestplate.png new file mode 100644 index 0000000000000000000000000000000000000000..ce22347b95c39fb75544697fdf318803109dcf3d GIT binary patch literal 625 zcmV-%0*?KOP)EX>4Tx04R}tkv&MmKpe$iQ?()$1q+HeWT-A$5EXIMDionYs1;guFuC*#nlvOS zE{=k0!NHHks)LKOt`4q(Aou~|>f)s6A|?JWDYS_7;J6>}?mh0_0YbING^=eK&~)2O z#G+ybnM}+Rhls^o6Dv*3@}@>SMI2T&o$`g0 z$13M7&RVg|>i6U?3}*C|Wvu?$|#@+8xdM{QY<8BKia}S==vpcDdZ}E zkz)ZRXpmh$_#gc4*2+#!cuB!1(Ej2$AHzUk7pPSn=lj@kYA1mI8Mx9L{!$f~`6Rv4 z(85PR&o*#z-O!Xh;Bp5Tcrs*Db|pVeA)5u>&*+=dK;JFUwdVC!-^b|#kfg5SH^9Lm zFp{I}^%n2$Z0_yfGxh#{0AB}kpT)m#&Hw-a24YJ`L;(K){{a7>y{D4^000SaNLh0L z01FcU01FcV0GgZ_00007bV*G`2j>O{5fl~@oaev*003=CL_t(&-tE+}4Ztu6L{ac0 zjN(x}ibuIkNRvqEQjrkpzuHC^PBsGo000000DxvBrKGH=J$^KVlDgjg;d}4A1`rVz z5hlszoc?t0Jnx@2zt+mm10L0}t%`2@*xonaISJ#9&65QF002!L^nXQQUUm(}00000 LNkvXXu0mjf>lzX{ literal 0 HcmV?d00001 diff --git a/textures/eye_chestplate.png b/textures/eye_chestplate.png new file mode 100644 index 0000000000000000000000000000000000000000..e25a14390093070d62322cc2886bb86ba7425161 GIT binary patch literal 711 zcmV;&0yzDNP)EX>4Tx04R}tkv&MmKpe$iQ?()$1q+HeWT-A$5EXIMDionYs1;guFuC*#nlvOS zE{=k0!NHHks)LKOt`4q(Aou~|>f)s6A|?JWDYS_7;J6>}?mh0_0YbING^=eK&~)2O z#G+ybnM}+Rhls^o6Dv*3@}@>SMI2T&o$`g0 z$13M7&RVg|>i6U?3}*C|Wvu?$|#@+8xdM{QY<8BKia}S==vpcDdZ}E zkz)ZRXpmh$_#gc4*2+#!cuB!1(Ej2$AHzUk7pPSn=lj@kYA1mI8Mx9L{!$f~`6Rv4 z(85PR&o*#z-O!Xh;Bp5Tcrs*Db|pVeA)5u>&*+=dK;JFUwdVC!-^b|#kfg5SH^9Lm zFp{I}^%n2$Z0_yfGxh#{0AB}kpT)m#&Hw-a24YJ`L;(K){{a7>y{D4^000SaNLh0L z01FcU01FcV0GgZ_00007bV*G`2j>O{5egU~W%U>U006^DL_t(&-tE=v34}ll1mJj; zY$+)vrEDoFWlEV&a=-TQIP@NfoH`!}i;J=o6EqVM5fKp)5fKrQE1CZNfFz5gnVGfL z#yxAT832ojrwo}{?rtQ_-KW!jIg+)s2cSNE&+Whk_-Sv~5y;FUX}$Mp>k(LM?}#XO ze;JQmW#*#|d+%jeG6Dmrv3^$s05!k%I_qt#uuDeUE1)xS-yZc1a0MxvT4kaRL tjKO?;x>jEcHG+TpTRL5VE*oAB;tt{@g6^gDX{P`H002ovPDHLkV1mMhH&6fo literal 0 HcmV?d00001 diff --git a/textures/rib_chestplate.png b/textures/rib_chestplate.png new file mode 100644 index 0000000000000000000000000000000000000000..04af7925fbee82188d32b6dbc8d4a582429939a3 GIT binary patch literal 690 zcmV;j0!{siP)EX>4Tx04R}tkv&MmKpe$iQ?()$5i5u|WT-A$5EXIMDionYs1;guFuC*#nlvOS zE{=k0!NHHks)LKOt`4q(Aou~|>f)s6A|?JWDYS_7;J6>}?mh0_0YbING^=eK&~)2O z#G+ybnM}+Rhls^o6Dv*3@}@>SMI2T&o$`g0 z$13M7&RVg|>i6U?3}*C|Wvu?$|#@+8xdM{QY<8BKia}S==vpcDdZ}E zkz)ZRXpmh$_#gc4*2+#!cuB!1(Ej2$AHzUk7pPSn=lj@kYA1mI8Mx9L{!$f~`6Rv4 z(85PR&o*#z-O!Xh;Bp5Tcrs*Db|pVeA)5u>&*+=dK;JFUwdVC!-^b|#kfg5SH^9Lm zFp{I}^%n2$Z0_yfGxh#{09;~no>HiB;s5{u24YJ`L;(K){{a7>y{D4^000SaNLh0L z04^f{04^f|c%?sf00007bV*G`2j>O{5g7u#=uPkd000?uMObu0Z*6U5Zgc=ca%Ew3 zWn>_CX>@2HM@dakSAh-}0001qNkl(<<@nb-3`DPgE0n~d1&X%oJVIZ;7kQ{H`}%? zul~JLiv@ftGiOx+5D@@$H{DHDE!X#XyB@&fd{y0NZz5twgcm$z0ecsHR={2{79f4y Y1+f251w>wPod5s;07*qoM6N<$f`u6;IRF3v literal 0 HcmV?d00001 diff --git a/textures/sentry_chestplate.png b/textures/sentry_chestplate.png new file mode 100644 index 0000000000000000000000000000000000000000..3a457ad67e8c1ba2d1ada59b5c6ab029684ac461 GIT binary patch literal 689 zcmV;i0#5yjP)EX>4Tx04R}tkv&MmKpe$iQ?()$5i5u|WT-A$5EXIMDionYs1;guFuC*#nlvOS zE{=k0!NHHks)LKOt`4q(Aou~|>f)s6A|?JWDYS_7;J6>}?mh0_0YbING^=eK&~)2O z#G+ybnM}+Rhls^o6Dv*3@}@>SMI2T&o$`g0 z$13M7&RVg|>i6U?3}*C|Wvu?$|#@+8xdM{QY<8BKia}S==vpcDdZ}E zkz)ZRXpmh$_#gc4*2+#!cuB!1(Ej2$AHzUk7pPSn=lj@kYA1mI8Mx9L{!$f~`6Rv4 z(85PR&o*#z-O!Xh;Bp5Tcrs*Db|pVeA)5u>&*+=dK;JFUwdVC!-^b|#kfg5SH^9Lm zFp{I}^%n2$Z0_yfGxh#{09;~no>HiB;s5{u24YJ`L;(K){{a7>y{D4^000SaNLh0L z04^f{04^f|c%?sf00007bV*G`2j>O{5g#-p2!HPY000?uMObu0Z*6U5Zgc=ca%Ew3 zWn>_CX>@2HM@dakSAh-}0001pNklQ z213#_DJk6ZV~mVJ&vGdM000000002s=_KWu+S>HT0i3E4z%K%jl*=((@4w~lxz(hZ zO_GYc=VSipk>EX>4Tx04R}tkv&MmKpe$iQ?()$5i5u|WT-A$5EXIMDionYs1;guFuC*#nlvOS zE{=k0!NHHks)LKOt`4q(Aou~|>f)s6A|?JWDYS_7;J6>}?mh0_0YbING^=eK&~)2O z#G+ybnM}+Rhls^o6Dv*3@}@>SMI2T&o$`g0 z$13M7&RVg|>i6U?3}*C|Wvu?$|#@+8xdM{QY<8BKia}S==vpcDdZ}E zkz)ZRXpmh$_#gc4*2+#!cuB!1(Ej2$AHzUk7pPSn=lj@kYA1mI8Mx9L{!$f~`6Rv4 z(85PR&o*#z-O!Xh;Bp5Tcrs*Db|pVeA)5u>&*+=dK;JFUwdVC!-^b|#kfg5SH^9Lm zFp{I}^%n2$Z0_yfGxh#{09;~no>HiB;s5{u24YJ`L;(K){{a7>y{D4^000SaNLh0L z04^f{04^f|c%?sf00007bV*G`2j>O{5h4`=i6;*L000?uMObu0Z*6U5Zgc=ca%Ew3 zWn>_CX>@2HM@dakSAh-}0002CNklxQ_kINfiWDCRHH=&0{Ddi)yyNA1Dssr%WwB;SGwKT*AY`wo}s#746t6L&+ttSFLh*q{< R>EHkW002ovPDHLkV1iK`LAw9| literal 0 HcmV?d00001 diff --git a/textures/spire_chestplate.png b/textures/spire_chestplate.png new file mode 100644 index 0000000000000000000000000000000000000000..7d57753387989c52e51ed133d60ca11dad28b67e GIT binary patch literal 696 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 Date: Wed, 7 Jun 2023 20:13:18 +0200 Subject: [PATCH 038/982] add helm trim textures --- mods/ITEMS/mcl_armor_trims/init.lua | 1 + textures/coast_helmet.png | Bin 0 -> 651 bytes textures/dune_helmet.png | Bin 0 -> 674 bytes textures/eyes_helmet.png | Bin 0 -> 603 bytes textures/rib_helmet.png | Bin 0 -> 667 bytes textures/sentry_helmet.png | Bin 0 -> 656 bytes textures/snout_helmet.png | Bin 0 -> 636 bytes textures/spire_helmet.png | Bin 0 -> 681 bytes textures/tide_helmet.png | Bin 0 -> 683 bytes textures/vex_helmet.png | Bin 0 -> 640 bytes textures/ward_helmet.png | Bin 0 -> 719 bytes textures/wild_helmet.png | Bin 0 -> 673 bytes 12 files changed, 1 insertion(+) create mode 100644 textures/coast_helmet.png create mode 100644 textures/dune_helmet.png create mode 100644 textures/eyes_helmet.png create mode 100644 textures/rib_helmet.png create mode 100644 textures/sentry_helmet.png create mode 100644 textures/snout_helmet.png create mode 100644 textures/spire_helmet.png create mode 100644 textures/tide_helmet.png create mode 100644 textures/vex_helmet.png create mode 100644 textures/ward_helmet.png create mode 100644 textures/wild_helmet.png diff --git a/mods/ITEMS/mcl_armor_trims/init.lua b/mods/ITEMS/mcl_armor_trims/init.lua index 5e8e4f7e7..572c23dbd 100644 --- a/mods/ITEMS/mcl_armor_trims/init.lua +++ b/mods/ITEMS/mcl_armor_trims/init.lua @@ -17,6 +17,7 @@ local function define_items() local invOverlay = "" if string.find(itemname,"helmet") then invOverlay = "^helmet_trim.png" + piece_overlay = piece_overlay .. "_helmet" elseif string.find(itemname,"chestplate") then invOverlay = "^chestplate_trim.png" piece_overlay = piece_overlay .. "_chestplate" diff --git a/textures/coast_helmet.png b/textures/coast_helmet.png new file mode 100644 index 0000000000000000000000000000000000000000..4a2050fdd0d7191eff02bbfc83f90a00461edfc7 GIT binary patch literal 651 zcmV;60(AX}P)EX>4Tx04R}tkv&MmKpe$iQ?()$5i5u|WT-A$5EXIMDionYs1;guFuC*#nlvOS zE{=k0!NHHks)LKOt`4q(Aou~|>f)s6A|?JWDYS_7;J6>}?mh0_0YbING^=eK&~)2O z#G+ybnM}+Rhls^o6Dv*3@}@>SMI2T&o$`g0 z$13M7&RVg|>i6U?3}*C|Wvu?$|#@+8xdM{QY<8BKia}S==vpcDdZ}E zkz)ZRXpmh$_#gc4*2+#!cuB!1(Ej2$AHzUk7pPSn=lj@kYA1mI8Mx9L{!$f~`6Rv4 z(85PR&o*#z-O!Xh;Bp5Tcrs*Db|pVeA)5u>&*+=dK;JFUwdVC!-^b|#kfg5SH^9Lm zFp{I}^%n2$Z0_yfGxh#{09;~no>HiB;s5{u24YJ`L;(K){{a7>y{D4^000SaNLh0L z04^f{04^f|c%?sf00007bV*G`2j>O{5jZKG%b`;M000?uMObu0Z*6U5Zgc=ca%Ew3 zWn>_CX>@2HM@dakSAh-}0001DNkl!YG6Vd=8sgjB! z|5cWCMu02<008_{IemdzYnLS3lB9@GM67xm{W7wB=J#3Kw{sq|t2cAD&ws#Mt+l>C lATta53jhEB00000A6>cBC4w(BkL3UW002ovPDHLkV1ifi7GeMZ literal 0 HcmV?d00001 diff --git a/textures/dune_helmet.png b/textures/dune_helmet.png new file mode 100644 index 0000000000000000000000000000000000000000..ff68b20bc1f85114d30cf803e1121d614304e923 GIT binary patch literal 674 zcmV;T0$u%yP)EX>4Tx04R}tkv&MmKpe$iQ?()$5i5u|WT-A$5EXIMDionYs1;guFuC*#nlvOS zE{=k0!NHHks)LKOt`4q(Aou~|>f)s6A|?JWDYS_7;J6>}?mh0_0YbING^=eK&~)2O z#G+ybnM}+Rhls^o6Dv*3@}@>SMI2T&o$`g0 z$13M7&RVg|>i6U?3}*C|Wvu?$|#@+8xdM{QY<8BKia}S==vpcDdZ}E zkz)ZRXpmh$_#gc4*2+#!cuB!1(Ej2$AHzUk7pPSn=lj@kYA1mI8Mx9L{!$f~`6Rv4 z(85PR&o*#z-O!Xh;Bp5Tcrs*Db|pVeA)5u>&*+=dK;JFUwdVC!-^b|#kfg5SH^9Lm zFp{I}^%n2$Z0_yfGxh#{09;~no>HiB;s5{u24YJ`L;(K){{a7>y{D4^000SaNLh0L z04^f{04^f|c%?sf00007bV*G`2j>O{5jz?QHj{<`000?uMObu0Z*6U5Zgc=ca%Ew3 zWn>_CX>@2HM@dakSAh-}0001aNklj~N~pRtASM58 zOA86pv=IxjJ#3H4Gxu1G?Vtf&8&F;Rk_l+t07)dEx(Un8fcCFI^*`e17XN30w!e$Y z%pvJj+#L67P13D^dHu`&R#zZ1N9P&PehBu9Jpcdz0000UPPuDHvvASwoB#j-07*qo IM6N<$f?K;Jh5!Hn literal 0 HcmV?d00001 diff --git a/textures/eyes_helmet.png b/textures/eyes_helmet.png new file mode 100644 index 0000000000000000000000000000000000000000..90d0e874e3b20a8090d2cdcf4e1c83c8fd07c793 GIT binary patch literal 603 zcmV-h0;K(kP)EX>4Tx04R}tkv&MmKpe$iQ?()$5i5u|WT-A$5EXIMDionYs1;guFuC*#nlvOS zE{=k0!NHHks)LKOt`4q(Aou~|>f)s6A|?JWDYS_7;J6>}?mh0_0YbING^=eK&~)2O z#G+ybnM}+Rhls^o6Dv*3@}@>SMI2T&o$`g0 z$13M7&RVg|>i6U?3}*C|Wvu?$|#@+8xdM{QY<8BKia}S==vpcDdZ}E zkz)ZRXpmh$_#gc4*2+#!cuB!1(Ej2$AHzUk7pPSn=lj@kYA1mI8Mx9L{!$f~`6Rv4 z(85PR&o*#z-O!Xh;Bp5Tcrs*Db|pVeA)5u>&*+=dK;JFUwdVC!-^b|#kfg5SH^9Lm zFp{I}^%n2$Z0_yfGxh#{09;~no>HiB;s5{u24YJ`L;(K){{a7>y{D4^000SaNLh0L z04^f{04^f|c%?sf00007bV*G`2j>O{5&_CX>@2HM@dakSAh-}0000oNkl peS!VzM0001Za{$=M4ZZ)b^Pd0!002ovPDHLkV1hXi0YLx& literal 0 HcmV?d00001 diff --git a/textures/rib_helmet.png b/textures/rib_helmet.png new file mode 100644 index 0000000000000000000000000000000000000000..cf5826d0c1ffd6c0974486df416e9d6f32899a13 GIT binary patch literal 667 zcmV;M0%ZM(P)EX>4Tx04R}tkv&MmKpe$iQ?()$5i5u|WT-A$5EXIMDionYs1;guFuC*#nlvOS zE{=k0!NHHks)LKOt`4q(Aou~|>f)s6A|?JWDYS_7;J6>}?mh0_0YbING^=eK&~)2O z#G+ybnM}+Rhls^o6Dv*3@}@>SMI2T&o$`g0 z$13M7&RVg|>i6U?3}*C|Wvu?$|#@+8xdM{QY<8BKia}S==vpcDdZ}E zkz)ZRXpmh$_#gc4*2+#!cuB!1(Ej2$AHzUk7pPSn=lj@kYA1mI8Mx9L{!$f~`6Rv4 z(85PR&o*#z-O!Xh;Bp5Tcrs*Db|pVeA)5u>&*+=dK;JFUwdVC!-^b|#kfg5SH^9Lm zFp{I}^%n2$Z0_yfGxh#{09;~no>HiB;s5{u24YJ`L;(K){{a7>y{D4^000SaNLh0L z04^f{04^f|c%?sf00007bV*G`2j>O{5(67+=%KOz000?uMObu0Z*6U5Zgc=ca%Ew3 zWn>_CX>@2HM@dakSAh-}0001TNklAd1vo^opV?7cROsaBToaK zZot3aOQJdF$E~fkb(j6#V|)A6J^%m!004kj*#Q>+JE8FvA2a{}002ovPDHLkV1lPj B9y$O3 literal 0 HcmV?d00001 diff --git a/textures/sentry_helmet.png b/textures/sentry_helmet.png new file mode 100644 index 0000000000000000000000000000000000000000..aa20bdc29d5def83c5d96c69e04110cf398d989b GIT binary patch literal 656 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 BJF@@) literal 0 HcmV?d00001 diff --git a/textures/wild_helmet.png b/textures/wild_helmet.png new file mode 100644 index 0000000000000000000000000000000000000000..7ae48bed4fef8e4125b38bd8761965aaff4b52bc GIT binary patch literal 673 zcmV;S0$%-zP)EX>4Tx04R}tkv&MmKpe$iQ?()$5i5u|WT-A$5EXIMDionYs1;guFuC*#nlvOS zE{=k0!NHHks)LKOt`4q(Aou~|>f)s6A|?JWDYS_7;J6>}?mh0_0YbING^=eK&~)2O z#G+ybnM}+Rhls^o6Dv*3@}@>SMI2T&o$`g0 z$13M7&RVg|>i6U?3}*C|Wvu?$|#@+8xdM{QY<8BKia}S==vpcDdZ}E zkz)ZRXpmh$_#gc4*2+#!cuB!1(Ej2$AHzUk7pPSn=lj@kYA1mI8Mx9L{!$f~`6Rv4 z(85PR&o*#z-O!Xh;Bp5Tcrs*Db|pVeA)5u>&*+=dK;JFUwdVC!-^b|#kfg5SH^9Lm zFp{I}^%n2$Z0_yfGxh#{09;~no>HiB;s5{u24YJ`L;(K){{a7>y{D4^000SaNLh0L z04^f{04^f|c%?sf00007bV*G`2j>O{5)3&x5d4_{000?uMObu0Z*6U5Zgc=ca%Ew3 zWn>_CX>@2HM@dakSAh-}0001ZNkloX{VfeX3jf^s@h=y000000N^wib@MEP+w%AD00000NkvXX Hu0mjf@JJ*R literal 0 HcmV?d00001 From 6c6a27320d87954a57f2cd304a7610c7579bdaa9 Mon Sep 17 00:00:00 2001 From: chmodsayshello Date: Wed, 7 Jun 2023 20:30:10 +0200 Subject: [PATCH 039/982] add trim boot textures --- mods/ITEMS/mcl_armor_trims/init.lua | 1 + textures/coast_boots.png | Bin 0 -> 648 bytes textures/dune_boots.png | Bin 0 -> 622 bytes textures/eye_boots.png | Bin 0 -> 633 bytes textures/sentry_boots.png | Bin 0 -> 644 bytes textures/snout_boots.png | Bin 0 -> 631 bytes textures/spire_boots.png | Bin 0 -> 628 bytes textures/tide_boots.png | Bin 0 -> 632 bytes textures/vex_boots.png | Bin 0 -> 619 bytes textures/ward_boots.png | Bin 0 -> 653 bytes textures/wild_boots.png | Bin 0 -> 631 bytes 11 files changed, 1 insertion(+) create mode 100644 textures/coast_boots.png create mode 100644 textures/dune_boots.png create mode 100644 textures/eye_boots.png create mode 100644 textures/sentry_boots.png create mode 100644 textures/snout_boots.png create mode 100644 textures/spire_boots.png create mode 100644 textures/tide_boots.png create mode 100644 textures/vex_boots.png create mode 100644 textures/ward_boots.png create mode 100644 textures/wild_boots.png diff --git a/mods/ITEMS/mcl_armor_trims/init.lua b/mods/ITEMS/mcl_armor_trims/init.lua index 572c23dbd..82e070a18 100644 --- a/mods/ITEMS/mcl_armor_trims/init.lua +++ b/mods/ITEMS/mcl_armor_trims/init.lua @@ -26,6 +26,7 @@ local function define_items() piece_overlay = piece_overlay .. "_leggings" elseif string.find(itemname,"boots") then invOverlay = "^boots_trim.png" + piece_overlay = piece_overlay .. "_boots" end piece_overlay = piece_overlay .. ".png" diff --git a/textures/coast_boots.png b/textures/coast_boots.png new file mode 100644 index 0000000000000000000000000000000000000000..8e7ee7bf80a42124b834f5a9853b358d616ba73d GIT binary patch literal 648 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 O0000n literal 0 HcmV?d00001 diff --git a/textures/tide_boots.png b/textures/tide_boots.png new file mode 100644 index 0000000000000000000000000000000000000000..a0f9ada88483c6baca4946bc5c4046f3b6b23630 GIT binary patch literal 632 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 RM1ueT002ovPDHLkV1hMe3-$m2 literal 0 HcmV?d00001 From ed5232411bbd6f13aab5cf3f5dc8eb90d8edd7cf Mon Sep 17 00:00:00 2001 From: chmodsayshello Date: Wed, 7 Jun 2023 20:31:54 +0200 Subject: [PATCH 040/982] remove raw trim textures --- textures/coast.png | Bin 6471 -> 0 bytes textures/dune.png | Bin 6971 -> 0 bytes textures/eye.png | Bin 6662 -> 0 bytes textures/rib.png | Bin 203 -> 0 bytes textures/sentry.png | Bin 7131 -> 0 bytes textures/snout.png | Bin 261 -> 0 bytes textures/spire.png | Bin 6926 -> 0 bytes textures/tide.png | Bin 258 -> 0 bytes textures/vex.png | Bin 250 -> 0 bytes textures/ward.png | Bin 8067 -> 0 bytes textures/wild.png | Bin 248 -> 0 bytes 11 files changed, 0 insertions(+), 0 deletions(-) delete mode 100644 textures/coast.png delete mode 100644 textures/dune.png delete mode 100644 textures/eye.png delete mode 100644 textures/rib.png delete mode 100644 textures/sentry.png delete mode 100644 textures/snout.png delete mode 100644 textures/spire.png delete mode 100644 textures/tide.png delete mode 100644 textures/vex.png delete mode 100644 textures/ward.png delete mode 100644 textures/wild.png diff --git a/textures/coast.png b/textures/coast.png deleted file mode 100644 index 54dfff6c8464147a335217d881b2655d03b76989..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6471 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 ZwfK}c_vUqBdEne2bk}7rMb5!-{{++N>Y4xm diff --git a/textures/dune.png b/textures/dune.png deleted file mode 100644 index 54b1f61c5c313e4978074f1906fb2f45dad7db0f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6971 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 UC@P7kq3OejX11oq#@;di0)F9O`v3p{ diff --git a/textures/rib.png b/textures/rib.png deleted file mode 100644 index 4170c2360279a2ad78ad3dfbad8189a60a4e1098..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 203 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 diff --git a/textures/ward.png b/textures/ward.png deleted file mode 100644 index df9ff5927e865aa7bfd8a4b65ab19aa06c27665c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8067 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 ys?} Date: Wed, 7 Jun 2023 21:01:55 +0200 Subject: [PATCH 041/982] add armor trim color support --- mods/ITEMS/mcl_armor_trims/init.lua | 61 +++++++++++++++-------------- 1 file changed, 32 insertions(+), 29 deletions(-) diff --git a/mods/ITEMS/mcl_armor_trims/init.lua b/mods/ITEMS/mcl_armor_trims/init.lua index 82e070a18..9321ca111 100644 --- a/mods/ITEMS/mcl_armor_trims/init.lua +++ b/mods/ITEMS/mcl_armor_trims/init.lua @@ -1,7 +1,7 @@ mcl_armor_trims = { blacklisted = {["mcl_farming:pumpkin_face"]=true, ["mcl_armor:elytra"]=true, ["mcl_armor:elytra_enchanted"]=true}, overlays = {"sentry","dune","coast","wild","tide","ward","vex","rib","snout","eye","spire"}, - colors = {"bf352d"} + colors = {["amethyst"]="#8246a5",["gold"]="#ce9627",["emerald"]="#1b9958",["copper"]="#c36447",["diamond"]="#5faed8",["iron"]="#938e88",["lapis"]="#1c306b",["netherite"]="#302a26",["quartz"]="#c9bcb9",["redstone"]="#af2c23"} } local function define_items() @@ -9,36 +9,39 @@ local function define_items() for itemname, itemdef in pairs(minetest.registered_tools) do if itemdef._mcl_armor_texture and type(itemdef._mcl_armor_texture) == "string" and not mcl_armor_trims.blacklisted[itemname] then for _, overlay in pairs(mcl_armor_trims.overlays) do - local new_name = itemname .. "_trimmed_" .. overlay - minetest.override_item(itemname, {_mcl_armor_trims_trim = new_name}) - local new_def = table.copy(itemdef) + for mineral, color in pairs(mcl_armor_trims.colors) do + local new_name = itemname .. "_trimmed_" .. overlay .. "_" .. mineral + minetest.override_item(itemname, {_mcl_armor_trims_trim = new_name}) + local new_def = table.copy(itemdef) - local piece_overlay = overlay - local invOverlay = "" - if string.find(itemname,"helmet") then - invOverlay = "^helmet_trim.png" - piece_overlay = piece_overlay .. "_helmet" - elseif string.find(itemname,"chestplate") then - invOverlay = "^chestplate_trim.png" - piece_overlay = piece_overlay .. "_chestplate" - elseif string.find(itemname,"leggings") then - invOverlay = "^leggings_trim.png" - piece_overlay = piece_overlay .. "_leggings" - elseif string.find(itemname,"boots") then - invOverlay = "^boots_trim.png" - piece_overlay = piece_overlay .. "_boots" + local piece_overlay = overlay + local invOverlay = "" + if string.find(itemname,"helmet") then + invOverlay = "^(helmet_trim.png" + piece_overlay = piece_overlay .. "_helmet" + elseif string.find(itemname,"chestplate") then + invOverlay = "^(chestplate_trim.png" + piece_overlay = piece_overlay .. "_chestplate" + elseif string.find(itemname,"leggings") then + invOverlay = "^(leggings_trim.png" + piece_overlay = piece_overlay .. "_leggings" + elseif string.find(itemname,"boots") then + invOverlay = "^(boots_trim.png" + piece_overlay = piece_overlay .. "_boots" + end + + invOverlay = invOverlay .. "^[colorize:" .. color .. ")" + piece_overlay = piece_overlay .. ".png" + + new_def.groups.not_in_creative_inventory = 0 --set this to 1 later! + new_def.groups.not_in_craft_guide = 1 + new_def._mcl_armor_texture = new_def._mcl_armor_texture .. "^(" .. piece_overlay .. "^[colorize:" .. color .. ")" + + new_def.inventory_image = itemdef.inventory_image .. invOverlay + new_def._mcl_armor_trims_trim = new_name + + register_list[":" .. new_name] = new_def end - - piece_overlay = piece_overlay .. ".png" - - new_def.groups.not_in_creative_inventory = 0 --set this to 1 later! - new_def.groups.not_in_craft_guide = 1 - new_def._mcl_armor_texture = new_def._mcl_armor_texture .. "^(" .. piece_overlay .. "^[colorize:purple)" - - new_def.inventory_image = itemdef.inventory_image .. invOverlay - new_def._mcl_armor_trims_trim = new_name - - register_list[":" .. new_name] = new_def end end end From 311beeb31ce972c86d6b3403a78373dff5ddc4e8 Mon Sep 17 00:00:00 2001 From: chmodsayshello Date: Wed, 7 Jun 2023 22:27:52 +0200 Subject: [PATCH 042/982] fix enchanting of trimmed armor --- mods/ITEMS/mcl_armor_trims/init.lua | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/mods/ITEMS/mcl_armor_trims/init.lua b/mods/ITEMS/mcl_armor_trims/init.lua index 9321ca111..d3b338d98 100644 --- a/mods/ITEMS/mcl_armor_trims/init.lua +++ b/mods/ITEMS/mcl_armor_trims/init.lua @@ -11,7 +11,6 @@ local function define_items() for _, overlay in pairs(mcl_armor_trims.overlays) do for mineral, color in pairs(mcl_armor_trims.colors) do local new_name = itemname .. "_trimmed_" .. overlay .. "_" .. mineral - minetest.override_item(itemname, {_mcl_armor_trims_trim = new_name}) local new_def = table.copy(itemdef) local piece_overlay = overlay @@ -36,10 +35,14 @@ local function define_items() new_def.groups.not_in_creative_inventory = 0 --set this to 1 later! new_def.groups.not_in_craft_guide = 1 new_def._mcl_armor_texture = new_def._mcl_armor_texture .. "^(" .. piece_overlay .. "^[colorize:" .. color .. ")" - new_def.inventory_image = itemdef.inventory_image .. invOverlay - new_def._mcl_armor_trims_trim = new_name + if string.find(itemname, "_enchanted") then + new_def._mcl_enchanting_enchanted_tool = new_name + else + new_def._mcl_enchanting_enchanted_tool = itemname .. "_enchanted_trimmed_" .. overlay .. "_" .. mineral + end + register_list[":" .. new_name] = new_def end end From 0c65d9d11a4de516643bdc540efc9ce0ee837fe1 Mon Sep 17 00:00:00 2001 From: chmodsayshello Date: Wed, 7 Jun 2023 22:29:59 +0200 Subject: [PATCH 043/982] add mcl_enchanting as hard dependency --- mods/ITEMS/mcl_armor_trims/mod.conf | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/mods/ITEMS/mcl_armor_trims/mod.conf b/mods/ITEMS/mcl_armor_trims/mod.conf index eb9311503..13ee95d34 100644 --- a/mods/ITEMS/mcl_armor_trims/mod.conf +++ b/mods/ITEMS/mcl_armor_trims/mod.conf @@ -1,3 +1,4 @@ name = mcl_armor_trims author = chmodsayshello -optional_depends = mcl_armor \ No newline at end of file +optional_depends = mcl_armor +depends = mcl_enchanting \ No newline at end of file From 049128972fd9809c39573342c1f6192b7dcd0057 Mon Sep 17 00:00:00 2001 From: chmodsayshello Date: Wed, 7 Jun 2023 22:49:04 +0200 Subject: [PATCH 044/982] armor trim: more color transparency & creative inventory removal --- mods/ITEMS/mcl_armor_trims/init.lua | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/mods/ITEMS/mcl_armor_trims/init.lua b/mods/ITEMS/mcl_armor_trims/init.lua index d3b338d98..e75671293 100644 --- a/mods/ITEMS/mcl_armor_trims/init.lua +++ b/mods/ITEMS/mcl_armor_trims/init.lua @@ -29,12 +29,12 @@ local function define_items() piece_overlay = piece_overlay .. "_boots" end - invOverlay = invOverlay .. "^[colorize:" .. color .. ")" + invOverlay = invOverlay .. "^[colorize:" .. color .. ":150)" piece_overlay = piece_overlay .. ".png" - new_def.groups.not_in_creative_inventory = 0 --set this to 1 later! + new_def.groups.not_in_creative_inventory = 1 new_def.groups.not_in_craft_guide = 1 - new_def._mcl_armor_texture = new_def._mcl_armor_texture .. "^(" .. piece_overlay .. "^[colorize:" .. color .. ")" + new_def._mcl_armor_texture = new_def._mcl_armor_texture .. "^(" .. piece_overlay .. "^[colorize:" .. color .. ":150)" new_def.inventory_image = itemdef.inventory_image .. invOverlay if string.find(itemname, "_enchanted") then @@ -42,7 +42,6 @@ local function define_items() else new_def._mcl_enchanting_enchanted_tool = itemname .. "_enchanted_trimmed_" .. overlay .. "_" .. mineral end - register_list[":" .. new_name] = new_def end end From 8431ac34d0ade02351b666ebe6133a15b7ebaaf1 Mon Sep 17 00:00:00 2001 From: chmodsayshello Date: Thu, 8 Jun 2023 00:16:57 +0200 Subject: [PATCH 045/982] add armor trim templates --- mods/ITEMS/mcl_armor_trims/init.lua | 3 +- .../locale/mcl_armor_trims.de.tr | 2 + .../ITEMS/mcl_armor_trims/locale/template.txt | 2 + mods/ITEMS/mcl_armor_trims/mod.conf | 2 +- mods/ITEMS/mcl_armor_trims/templates.lua | 46 ++++++++++++++++++ mods/MAPGEN/mcl_nether_fortresses/init.lua | 1 + mods/MAPGEN/mcl_structures/desert_temple.lua | 1 + mods/MAPGEN/mcl_structures/end_city.lua | 1 + mods/MAPGEN/mcl_structures/jungle_temple.lua | 1 + .../mcl_structures/pillager_outpost.lua | 1 + mods/MAPGEN/mcl_structures/shipwrecks.lua | 2 +- .../mcl_structures/woodland_mansion.lua | 1 + .../coast_armor_trim_smithing_template.png | Bin 0 -> 6436 bytes .../dune_armor_trim_smithing_template.png | Bin 0 -> 6506 bytes textures/eye_armor_trim_smithing_template.png | Bin 0 -> 6327 bytes textures/rib_armor_trim_smithing_template.png | Bin 0 -> 6259 bytes .../sentry_armor_trim_smithing_template.png | Bin 0 -> 6200 bytes .../snout_armor_trim_smithing_template.png | Bin 0 -> 6163 bytes .../spire_armor_trim_smithing_template.png | Bin 0 -> 6259 bytes .../tide_armor_trim_smithing_template.png | Bin 0 -> 6266 bytes textures/vex_armor_trim_smithing_template.png | Bin 0 -> 848 bytes .../ward_armor_trim_smithing_template.png | Bin 0 -> 6214 bytes .../wild_armor_trim_smithing_template.png | Bin 0 -> 6306 bytes 23 files changed, 60 insertions(+), 3 deletions(-) create mode 100644 mods/ITEMS/mcl_armor_trims/locale/mcl_armor_trims.de.tr create mode 100644 mods/ITEMS/mcl_armor_trims/locale/template.txt create mode 100644 mods/ITEMS/mcl_armor_trims/templates.lua create mode 100644 textures/coast_armor_trim_smithing_template.png create mode 100644 textures/dune_armor_trim_smithing_template.png create mode 100644 textures/eye_armor_trim_smithing_template.png create mode 100644 textures/rib_armor_trim_smithing_template.png create mode 100644 textures/sentry_armor_trim_smithing_template.png create mode 100644 textures/snout_armor_trim_smithing_template.png create mode 100644 textures/spire_armor_trim_smithing_template.png create mode 100644 textures/tide_armor_trim_smithing_template.png create mode 100644 textures/vex_armor_trim_smithing_template.png create mode 100644 textures/ward_armor_trim_smithing_template.png create mode 100644 textures/wild_armor_trim_smithing_template.png diff --git a/mods/ITEMS/mcl_armor_trims/init.lua b/mods/ITEMS/mcl_armor_trims/init.lua index e75671293..d7ea3ba74 100644 --- a/mods/ITEMS/mcl_armor_trims/init.lua +++ b/mods/ITEMS/mcl_armor_trims/init.lua @@ -53,4 +53,5 @@ local function define_items() end end -minetest.register_on_mods_loaded(define_items) \ No newline at end of file +minetest.register_on_mods_loaded(define_items) +dofile(minetest.get_modpath(minetest.get_current_modname()).."/templates.lua") \ No newline at end of file diff --git a/mods/ITEMS/mcl_armor_trims/locale/mcl_armor_trims.de.tr b/mods/ITEMS/mcl_armor_trims/locale/mcl_armor_trims.de.tr new file mode 100644 index 000000000..71b363ec6 --- /dev/null +++ b/mods/ITEMS/mcl_armor_trims/locale/mcl_armor_trims.de.tr @@ -0,0 +1,2 @@ +# textdomain: mcl_armor_trims +Smithing Template '@1'=Schiedevorlage '@1' diff --git a/mods/ITEMS/mcl_armor_trims/locale/template.txt b/mods/ITEMS/mcl_armor_trims/locale/template.txt new file mode 100644 index 000000000..58eef9444 --- /dev/null +++ b/mods/ITEMS/mcl_armor_trims/locale/template.txt @@ -0,0 +1,2 @@ +# textdomain: mcl_armor_trims +Smithing Template '@1' diff --git a/mods/ITEMS/mcl_armor_trims/mod.conf b/mods/ITEMS/mcl_armor_trims/mod.conf index 13ee95d34..de381b16f 100644 --- a/mods/ITEMS/mcl_armor_trims/mod.conf +++ b/mods/ITEMS/mcl_armor_trims/mod.conf @@ -1,4 +1,4 @@ name = mcl_armor_trims author = chmodsayshello optional_depends = mcl_armor -depends = mcl_enchanting \ No newline at end of file +depends = mcl_enchanting, mcl_core, mcl_end \ No newline at end of file diff --git a/mods/ITEMS/mcl_armor_trims/templates.lua b/mods/ITEMS/mcl_armor_trims/templates.lua new file mode 100644 index 000000000..896aa1892 --- /dev/null +++ b/mods/ITEMS/mcl_armor_trims/templates.lua @@ -0,0 +1,46 @@ +local modname = minetest.get_current_modname() +local S = minetest.get_translator(modname) + +for _, template_name in pairs(mcl_armor_trims.overlays) do + minetest.register_craftitem(modname .. ":" .. template_name, { + description = S("Smithing Template '@1'", template_name), + inventory_image = template_name .. "_armor_trim_smithing_template.png", + }) + + minetest.register_craft({ + output = modname .. ":" .. template_name .. " 2", + recipe = { + {"mcl_core:diamond",modname .. ":" .. template_name,"mcl_core:diamond"}, + {"mcl_core:diamond","mcl_core:cobble","mcl_core:diamond"}, + {"mcl_core:diamond","mcl_core:diamond","mcl_core:diamond"}, + } + }) +end + +--temp craft recipies +minetest.register_craft({ + output = modname .. ":eye", + recipe = { + {"mcl_core:diamond","mcl_end:ender_eye","mcl_core:diamond"}, + {"mcl_core:diamond","mcl_end:ender_eye","mcl_core:diamond"}, + {"mcl_core:diamond","mcl_core:diamond","mcl_core:diamond"}, + } +}) + +minetest.register_craft({ + output = modname .. ":ward", + recipe = { + {"mcl_core:diamond","mcl_core:diamond","mcl_core:diamond"}, + {"mcl_core:diamond","mcl_core:apple_gold_enchanted","mcl_core:diamond"}, + {"mcl_core:diamond","mcl_core:diamond","mcl_core:diamond"}, + } +}) + +minetest.register_craft({ + output = modname .. ":snout", + recipe = { + {"mcl_core:diamond","mcl_core:diamond","mcl_core:diamond"}, + {"mcl_core:diamond","mcl_core:goldblock","mcl_core:diamond"}, + {"mcl_core:diamond","mcl_core:diamond","mcl_core:diamond"}, + } +}) \ No newline at end of file diff --git a/mods/MAPGEN/mcl_nether_fortresses/init.lua b/mods/MAPGEN/mcl_nether_fortresses/init.lua index b736ff133..478b20e4f 100644 --- a/mods/MAPGEN/mcl_nether_fortresses/init.lua +++ b/mods/MAPGEN/mcl_nether_fortresses/init.lua @@ -188,6 +188,7 @@ mcl_structures.register_structure("nether_bulwark",{ stacks_max = 1, items = { { itemstring = "mcl_compass:lodestone" }, + { itemstring = "mcl_armor_trims:rib" }, } }} }, diff --git a/mods/MAPGEN/mcl_structures/desert_temple.lua b/mods/MAPGEN/mcl_structures/desert_temple.lua index 75c170ab1..6f196bf8c 100644 --- a/mods/MAPGEN/mcl_structures/desert_temple.lua +++ b/mods/MAPGEN/mcl_structures/desert_temple.lua @@ -69,6 +69,7 @@ mcl_structures.register_structure("desert_temple",{ { itemstring = "mcl_mobitems:diamond_horse_armor", weight = 5, }, { itemstring = "mcl_core:diamond", weight = 5, amount_min = 1, amount_max = 3 }, { itemstring = "mcl_core:apple_gold_enchanted", weight = 2, }, + { itemstring = "mcl_armor_trims:dune", weight = 20, amount_min = 2, amount_max = 2}, } }, { diff --git a/mods/MAPGEN/mcl_structures/end_city.lua b/mods/MAPGEN/mcl_structures/end_city.lua index 5f432a0eb..2f9d847e8 100644 --- a/mods/MAPGEN/mcl_structures/end_city.lua +++ b/mods/MAPGEN/mcl_structures/end_city.lua @@ -58,6 +58,7 @@ mcl_structures.register_structure("end_shipwreck",{ { itemstring = "mcl_core:diamond", weight = 3, amount_min = 2, amount_max = 7 }, { itemstring = "mcl_mobitems:saddle", weight = 3, }, { itemstring = "mcl_core:emerald", weight = 2, amount_min = 1, amount_max = 3 }, + { itemstring = "mcl_armor_trims:spire", amount_min = 1, amount_max = 1 }, { itemstring = "mcl_books:book", weight = 1, func = function(stack, pr) mcl_enchanting.enchant_uniform_randomly(stack, {"soul_speed"}, pr) end }, diff --git a/mods/MAPGEN/mcl_structures/jungle_temple.lua b/mods/MAPGEN/mcl_structures/jungle_temple.lua index 843dec04d..cb2887395 100644 --- a/mods/MAPGEN/mcl_structures/jungle_temple.lua +++ b/mods/MAPGEN/mcl_structures/jungle_temple.lua @@ -38,6 +38,7 @@ mcl_structures.register_structure("jungle_temple",{ { itemstring = "mcl_mobitems:gold_horse_armor", weight = 1, }, { itemstring = "mcl_mobitems:diamond_horse_armor", weight = 1, }, { itemstring = "mcl_core:apple_gold_enchanted", weight = 2, }, + { itemstring = "mcl_armor_trims:wild", amount_min = 1, amount_max = 1, }, } }} } diff --git a/mods/MAPGEN/mcl_structures/pillager_outpost.lua b/mods/MAPGEN/mcl_structures/pillager_outpost.lua index 53652d4fb..22ec743bc 100644 --- a/mods/MAPGEN/mcl_structures/pillager_outpost.lua +++ b/mods/MAPGEN/mcl_structures/pillager_outpost.lua @@ -44,6 +44,7 @@ mcl_structures.register_structure("pillager_outpost",{ { itemstring = "mcl_books:book", weight = 1, func = function(stack, pr) mcl_enchanting.enchant_uniform_randomly(stack, {"soul_speed"}, pr) end }, + { itemstring = "mcl_armor_trims:sentry"}, } }, { diff --git a/mods/MAPGEN/mcl_structures/shipwrecks.lua b/mods/MAPGEN/mcl_structures/shipwrecks.lua index a9c48e0b5..a9c58ea64 100644 --- a/mods/MAPGEN/mcl_structures/shipwrecks.lua +++ b/mods/MAPGEN/mcl_structures/shipwrecks.lua @@ -166,7 +166,7 @@ mcl_structures.register_structure("shipwreck",{ { itemstring = "mcl_clock:clock", weight = 1, amount_min = 1, amount_max = 1 }, { itemstring = "mcl_compass:compass", weight = 1, amount_min = 1, amount_max = 1 }, { itemstring = "mcl_maps:empty_map", weight = 1, amount_min = 1, amount_max = 1 }, - + { itemstring = "mcl_armor_trims:coast", weight = 20, amount_min = 2, amount_max = 2}, } }, } diff --git a/mods/MAPGEN/mcl_structures/woodland_mansion.lua b/mods/MAPGEN/mcl_structures/woodland_mansion.lua index 5429e4892..ef50ac714 100644 --- a/mods/MAPGEN/mcl_structures/woodland_mansion.lua +++ b/mods/MAPGEN/mcl_structures/woodland_mansion.lua @@ -63,6 +63,7 @@ mcl_structures.register_structure("woodland_cabin",{ { itemstring = "mcl_armor:chestplate_chain", weight = 1, }, { itemstring = "mcl_armor:chestplate_diamond", weight = 1, }, { itemstring = "mcl_core:apple_gold_enchanted", weight = 2, }, + { itemstring = "mcl_armor_trims:vex", amount_max = 1, }, } }} } diff --git a/textures/coast_armor_trim_smithing_template.png b/textures/coast_armor_trim_smithing_template.png new file mode 100644 index 0000000000000000000000000000000000000000..08abe9ba2f9582b4dcc01e07f0f39420724f650a GIT binary patch literal 6436 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 literal 0 HcmV?d00001 diff --git a/textures/eye_armor_trim_smithing_template.png b/textures/eye_armor_trim_smithing_template.png new file mode 100644 index 0000000000000000000000000000000000000000..7cc95fb77726162afefca86f19b11cffd3db67d4 GIT binary patch literal 6327 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 Xk?IFji^ZYH#-Nz4J}yO0YqtCoKdp-+ literal 0 HcmV?d00001 diff --git a/textures/sentry_armor_trim_smithing_template.png b/textures/sentry_armor_trim_smithing_template.png new file mode 100644 index 0000000000000000000000000000000000000000..09473aa3f753c3d659b0805da6f71ac055886935 GIT binary patch literal 6200 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 IFgqmf-x&95M*si- literal 0 HcmV?d00001 diff --git a/textures/snout_armor_trim_smithing_template.png b/textures/snout_armor_trim_smithing_template.png new file mode 100644 index 0000000000000000000000000000000000000000..25a6d3a1147451726992866ca8fcd61107c30269 GIT binary patch literal 6163 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 literal 0 HcmV?d00001 diff --git a/textures/spire_armor_trim_smithing_template.png b/textures/spire_armor_trim_smithing_template.png new file mode 100644 index 0000000000000000000000000000000000000000..09c16732a8ecf77b1baf0c0cfe242e1d2e9cce3e GIT binary patch literal 6259 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 a|KSUj@|^%ta+t{g0000Y=AZZ literal 0 HcmV?d00001 diff --git a/textures/ward_armor_trim_smithing_template.png b/textures/ward_armor_trim_smithing_template.png new file mode 100644 index 0000000000000000000000000000000000000000..c348818d7339945073357a3aee270ad3075b544b GIT binary patch literal 6214 zcmeHLdpy+X8XrY2xun=ic8yU0# zGTZBGBLfQq1Oj2iba&&x@6*&Ty(#cttD#XY0->`g)-OQ8;VO|*nM5FrfRKt9DTIWg zg#rX3`q$oN%_t;!x&B@gms&e7ovfPi?Bet9YRa1rn8Zao*3{7}r|GwybW%ADVJLUK_bpHz zF-hUkCwC1km3^J?JxAg2qtH}!Yg>-OOut`?YVbU&_O)5HYHD7;@;ohh7+d4_{?es(IDQRx$9)9<)K-rksS#@}NMv=VHBc z1<+T@N>$J1NZWgji52EMNZ*L6g6&Kv?{VH{0a-M)oabyx-nL}&bV1Q#k1w=*Iv3tX zU`Y}S%el;5diNH#o4da{v+4Flp=hNY@8PnH8f}PhG(<48q^~UHTE=eMlY`sLpLQ}` zGO#=MqXk;iEM{(3==@opeIofd!a10`O$xN0^f$|^F08Q$Tsn3B!nP$X3r?vJ)|cB1 zK=;JN7ju^%hzK!u+X8Ak&Q3w4KAfcIo;Ig|Z`-Nm_1ihpZS7U^z?f8@QpCoTbVS&X z{E#m8oyzQX6nVFQ)6rus2Yq%4Fl{j}+H{>#R~t_cYG`-W!{+W#xy>ZLp2Z_zuV#|< zQ&jV_T~h4wGE0O>kG3|?o*}aj$~~KNHJ#04&Rf}Vr2JTO3tM&c=%Z^aizjYF=u>w% zwOQ2srr?&oxSoR7}|Dp;ITz znSn=M+m;xep_kY|!&;omsLB+X;BGtfkiD*ue{&fG$CdXf=r0% z=rF8NU;2jrHtWsM;neGCsvBnP^G>T!@x$GvFIyM=5gapIPtvRIp0{ww&t{t-{zb~o zIk|DUx}@zoy`IgT>dM`uH)WQ0~pJ9w4sGXFB``>nTIRu-K$?mfY>ambSH zy}ETO*?8u9x>apy@6t7MbZZyg)Niflthr38X*KmNcX_;cN_yAqJwKf|I}$?vdH$7_ z1;*~}=h7-0%&MyBYXh_wjfC~-4!+h0=MT6$J-ODwyj$RUt|;pgqxY3bOn7>HBUQX= z<(+J=Q=$AIr#qz93Nz|DgMhH`UsINsfGb`-<7P9;&U`uf#?jtK@mq}DF8so`2y!xX zSRF8Ox&0TfuU?;b39%_9_dC4m^4LW45?5|Od#tgExaf0+-JgBDNrhfwROjn>;Km;_ zY^^2_0sQzg^UG>gS*GOgp6Rna=gjK8->K?+I(n^O``jO|oG2qcDAuic(09f6sBBAr z=QMuQl5U zODr!rwxh+nd9VPx+P>VNn?Suls{0<2Q({_uw(iRDqu*Y(+kT|AKyr&s87a7KLcE@k z@TTG(t*C4ie_L7i)?6oH3u^YCwx0QyMkm!|6A_aV5i1Y~txZB#S2okt_1&=vAC{SG zchcRf*=C!(eHlAbHZbzY{Cux3Qc}pv%~L}Toibk)3B)|MA_(0%L6$l#>o+*1`s>aN z4gNAn$9X{aO7m4_BV+jmjNPd%gO?w!%~aNRR16~y`EZZjHP`X0!*K>PGU^Ib=qCoO zH*yWF7h-+Ab7$fQ3Qoj5Ib5DPu(=P|7v zZ4UrF>#uANN)L{I7^Dbj-|K9%YoD$0^wg`ydzNIR8Ky<=BNyabbWIIRH~;yY%;x1k zobIbxJ?nb-B4N=j3x=hKJ5t{i_uT^3q^YLA5;>l^J+wz1CX}~x&+%nxRo6=r7y7wx zvl=mpufM(6lU2@KH>=?duhj}%T5sP_(E7*A5)sK8F^ZSwoqp3i1sG<=Rupd9p14lb z-dSE)6Ia<~3_Q>ENczn^ewE81#D(leQdeTtHwPtkS>Nks6vFpd0LzmKN<{WtzJv$aM~kHJJ%>QhoT8;% zFdR}Kc~GcOOh@&fzl1^x`E=AuA`4(iU7;|cd#nudjrH;aW5YoTALZm|K#Qir1R_Ym zMMjGv#Byph9i`!=!k^V<3<{}%D8lKe02UkRDv?1*f<3_=Kr^C+Q8<*N0g@);3#c5o zW#bg^h>i+VD5O*jMyXWVEAjRcSttfep-?aY4uiv?VFX$pBUW&u(PFucnqrK@4U&U0 zp;RH1h>>beE>9AvprcUmJaU{Io&_1vuyH(qdaR+BEBF{DJRrd9fdLpC0FcoD4vnK= zCi=s(EY^E(v3y)bSWiqeSBk;f0~nF$BM-TP5%nS7UwX*>;I9)H4kVXE%0P$_1&I|l z6N5@4BIOffM#>?zNt1U3Ux0y=(nOx<^EH#je($4}F;pm$YCP2FiAX;99w&{IMQAX5 z5CcU(A~+E_%#8gAuMi48Y|uyRQP2EKB5=6({2!s;>7~gLB9TY|94JIGWdapbELU*FAf%>($?b(O z4-rq~QSbyJngS9jXab1kqIn>Whz7_4JSgCjNjOL_fx=rRggb#7F)=GO6(6R;kpuvi zM8u-8Acc!2@CX2!ix)VcK^~FB$5U_+o-#(I-Uq5Pn@LCE>;VnA#=?%^Dg+Xl2yQQ- zm@iSvKTP=vMUbz8tCkJxKq8RHSR6pXk;o*9!w1j`NG6BNT+NCF>~T2F3?HN}gE_fy zxd}zwPzWOxhiWF&8$*Sc153+QcL&U@vBRsOy2>D~LL&2%NFwMcb#6#CrKYKnwDESK zdP+czqXrD|)g3q9b1vLajAlr~{2lmTn0&(|O7VZk^8xyv#aX6MN@U^QGH>2@5UBWj zp1%UWXX3!8om?S{Vg83j{S%HhR%E$8AWBP3(+@HDvc0AvX6CoS2zC#H^G0rM*oxhMA(?O zt3(d!$wN#DrbM_+eu%FcFj|QZTxB>LQK(bP z2}5sjR~7BPeA4Wv#$8E2-|x#mT`ZM)9UR?Iz1}+8GsMUUhodf&gnUbTl%640{Km^t<`<=?heqN|Gun68+Ey|8@?Sy3`1!E@O1NGL`JG(`T6Mv1tj0! eCmtE?n9&n*W|E{Y`3AfL2qweJt;i*0{XYP4tZ_mB literal 0 HcmV?d00001 diff --git a/textures/wild_armor_trim_smithing_template.png b/textures/wild_armor_trim_smithing_template.png new file mode 100644 index 0000000000000000000000000000000000000000..69e722d069cc51ce1ff997b053c01390d2649748 GIT binary patch literal 6306 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 literal 0 HcmV?d00001 From 0b118c170e673639ca1fd31e1c66883e0455f84d Mon Sep 17 00:00:00 2001 From: chmodsayshello Date: Thu, 8 Jun 2023 10:02:00 +0200 Subject: [PATCH 046/982] armor trims: support smithing table --- mods/ITEMS/mcl_armor_trims/templates.lua | 2 +- mods/ITEMS/mcl_smithing_table/init.lua | 59 ++++++++++++++++++++++-- 2 files changed, 56 insertions(+), 5 deletions(-) diff --git a/mods/ITEMS/mcl_armor_trims/templates.lua b/mods/ITEMS/mcl_armor_trims/templates.lua index 896aa1892..fdc61b931 100644 --- a/mods/ITEMS/mcl_armor_trims/templates.lua +++ b/mods/ITEMS/mcl_armor_trims/templates.lua @@ -17,7 +17,7 @@ for _, template_name in pairs(mcl_armor_trims.overlays) do }) end ---temp craft recipies +--temp craft recipies, missing structures minetest.register_craft({ output = modname .. ":eye", recipe = { diff --git a/mods/ITEMS/mcl_smithing_table/init.lua b/mods/ITEMS/mcl_smithing_table/init.lua index dbb6c620f..a85303240 100644 --- a/mods/ITEMS/mcl_smithing_table/init.lua +++ b/mods/ITEMS/mcl_smithing_table/init.lua @@ -6,7 +6,7 @@ local S = minetest.get_translator("mcl_smithing_table") mcl_smithing_table = {} -- Function to upgrade diamond tool/armor to netherite tool/armor -function mcl_smithing_table.upgrade_item(itemstack) +function mcl_smithing_table.upgrade_item_netherite(itemstack) local def = itemstack:get_definition() if not def or not def._mcl_upgradable then @@ -43,6 +43,8 @@ local formspec = "size[9,9]" .. mcl_formspec.get_itemslot_bg(1,2.5,1,1) .. "list[context;netherite;4,2.5;1,1;]" .. mcl_formspec.get_itemslot_bg(4,2.5,1,1) .. + "list[context;template;5,2.5;1,1;]".. + mcl_formspec.get_itemslot_bg(5,2.5,1,1).. "list[context;upgraded_item;8,2.5;1,1;]" .. mcl_formspec.get_itemslot_bg(8,2.5,1,1) .. "label[3,0.1;" .. minetest.formspec_escape(minetest.colorize(mcl_colors.DARK_GRAY, S("Upgrade Gear"))) .. "]" .. @@ -51,12 +53,59 @@ local formspec = "size[9,9]" .. "listring[context;input]".. "listring[current_player;main]" +local function upgrade_trimmed(itemstack, color_mineral, template) + --get information required + local material_name = color_mineral:get_name() + if(string.find(material_name,"mesecons:")) then + material_name = "redstone" + else + material_name = material_name:gsub("_ingot","") + material_name = material_name:gsub("mcl_core:","") + material_name = material_name:gsub("mcl_nether:","") + material_name = material_name:gsub("mcl_amethyst:","") + material_name = material_name:gsub("_shard","") + material_name = material_name:gsub("mcl_copper:","") + end + + local overlay = template:get_name():gsub("mcl_armor_trims:","") + + --trimming process + itemstack:set_name(itemstack:get_name() .. "_trimmed_" .. overlay .. "_" .. material_name) + tt.reload_itemstack_description(itemstack) + + return itemstack +end + +local function is_smithing_mineral(itemname) + if itemname == "mcl_nether:netherite_ingot" + or itemname == "mcl_core:diamond" + or itemname == "mcl_core:lapis" + or itemname == "mcl_amethyst:amethyst_shard" + or itemname == "mesecons:wire_00000000_off" + or itemname == "mcl_core:iron_ingot" + or itemname == "mcl_core:gold_ingot" + or itemname == "mcl_copper:copper_ingot" + or itemname == "mcl_core:emerald" + or itemname == "mcl_nether:quartz" + then + return true + end + + return false +end + local function reset_upgraded_item(pos) local inv = minetest.get_meta(pos):get_inventory() local upgraded_item + local original_itemname = inv:get_stack("diamond_item", 1):get_name() + local template_present = inv:get_stack("template",1):get_name() ~= "" + local is_armor = original_itemname:find("mcl_armor:") ~= nil + local is_trimmed = original_itemname:find("_trimmed") ~= nil - if inv:get_stack("netherite", 1):get_name() == "mcl_nether:netherite_ingot" then - upgraded_item = mcl_smithing_table.upgrade_item(inv:get_stack("diamond_item", 1)) + if inv:get_stack("netherite", 1):get_name() == "mcl_nether:netherite_ingot" and not template_present then + upgraded_item = mcl_smithing_table.upgrade_item_netherite(inv:get_stack("diamond_item", 1)) + elseif template_present and is_armor and not is_trimmed and is_smithing_mineral(inv:get_stack("netherite", 1):get_name()) then + upgraded_item = upgrade_trimmed(inv:get_stack("diamond_item", 1),inv:get_stack("netherite", 1),inv:get_stack("template", 1)) end inv:set_stack("upgraded_item", 1, upgraded_item) @@ -88,11 +137,12 @@ minetest.register_node("mcl_smithing_table:table", { inv:set_size("diamond_item", 1) inv:set_size("netherite", 1) + inv:set_size("template",1) inv:set_size("upgraded_item", 1) end, allow_metadata_inventory_put = function(pos, listname, index, stack, player) - if listname == "diamond_item" and mcl_smithing_table.upgrade_item(stack) or listname == "netherite" and stack:get_name() == "mcl_nether:netherite_ingot" then + if listname == "diamond_item" and (mcl_smithing_table.upgrade_item_netherite(stack) or string.find(stack:get_name(),"mcl_armor:")) or listname == "netherite" and is_smithing_mineral(stack:get_name()) or listname == "template" and string.find(stack:get_name(),"mcl_armor_trims") then return stack:get_count() end @@ -117,6 +167,7 @@ minetest.register_node("mcl_smithing_table:table", { if listname == "upgraded_item" then take_item("diamond_item") take_item("netherite") + take_item("template") -- ToDo: make epic sound minetest.sound_play("mcl_smithing_table_upgrade", {pos = pos, max_hear_distance = 16}) From 703f1f46fc0b390260d0155adeff45a40556c011 Mon Sep 17 00:00:00 2001 From: chmodsayshello Date: Thu, 8 Jun 2023 10:06:26 +0200 Subject: [PATCH 047/982] make slot names fit --- mods/ITEMS/mcl_smithing_table/init.lua | 24 ++++++++++++------------ 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/mods/ITEMS/mcl_smithing_table/init.lua b/mods/ITEMS/mcl_smithing_table/init.lua index a85303240..89e28a8a4 100644 --- a/mods/ITEMS/mcl_smithing_table/init.lua +++ b/mods/ITEMS/mcl_smithing_table/init.lua @@ -39,9 +39,9 @@ local formspec = "size[9,9]" .. mcl_formspec.get_itemslot_bg(0,4.5,9,3) .. "list[current_player;main;0,7.74;9,1;]" .. mcl_formspec.get_itemslot_bg(0,7.74,9,1) .. - "list[context;diamond_item;1,2.5;1,1;]" .. + "list[context;upgrade_item;1,2.5;1,1;]" .. mcl_formspec.get_itemslot_bg(1,2.5,1,1) .. - "list[context;netherite;4,2.5;1,1;]" .. + "list[context;mineral;4,2.5;1,1;]" .. mcl_formspec.get_itemslot_bg(4,2.5,1,1) .. "list[context;template;5,2.5;1,1;]".. mcl_formspec.get_itemslot_bg(5,2.5,1,1).. @@ -97,15 +97,15 @@ end local function reset_upgraded_item(pos) local inv = minetest.get_meta(pos):get_inventory() local upgraded_item - local original_itemname = inv:get_stack("diamond_item", 1):get_name() + local original_itemname = inv:get_stack("upgrade_item", 1):get_name() local template_present = inv:get_stack("template",1):get_name() ~= "" local is_armor = original_itemname:find("mcl_armor:") ~= nil local is_trimmed = original_itemname:find("_trimmed") ~= nil - if inv:get_stack("netherite", 1):get_name() == "mcl_nether:netherite_ingot" and not template_present then - upgraded_item = mcl_smithing_table.upgrade_item_netherite(inv:get_stack("diamond_item", 1)) - elseif template_present and is_armor and not is_trimmed and is_smithing_mineral(inv:get_stack("netherite", 1):get_name()) then - upgraded_item = upgrade_trimmed(inv:get_stack("diamond_item", 1),inv:get_stack("netherite", 1),inv:get_stack("template", 1)) + if inv:get_stack("mineral", 1):get_name() == "mcl_nether:netherite_ingot" and not template_present then + upgraded_item = mcl_smithing_table.upgrade_item_netherite(inv:get_stack("upgrade_item", 1)) + elseif template_present and is_armor and not is_trimmed and is_smithing_mineral(inv:get_stack("mineral", 1):get_name()) then + upgraded_item = upgrade_trimmed(inv:get_stack("upgrade_item", 1),inv:get_stack("mineral", 1),inv:get_stack("template", 1)) end inv:set_stack("upgraded_item", 1, upgraded_item) @@ -135,14 +135,14 @@ minetest.register_node("mcl_smithing_table:table", { local inv = meta:get_inventory() - inv:set_size("diamond_item", 1) - inv:set_size("netherite", 1) + inv:set_size("upgrade_item", 1) + inv:set_size("mineral", 1) inv:set_size("template",1) inv:set_size("upgraded_item", 1) end, allow_metadata_inventory_put = function(pos, listname, index, stack, player) - if listname == "diamond_item" and (mcl_smithing_table.upgrade_item_netherite(stack) or string.find(stack:get_name(),"mcl_armor:")) or listname == "netherite" and is_smithing_mineral(stack:get_name()) or listname == "template" and string.find(stack:get_name(),"mcl_armor_trims") then + if listname == "upgrade_item" and (mcl_smithing_table.upgrade_item_netherite(stack) or string.find(stack:get_name(),"mcl_armor:")) or listname == "mineral" and is_smithing_mineral(stack:get_name()) or listname == "template" and string.find(stack:get_name(),"mcl_armor_trims") then return stack:get_count() end @@ -165,8 +165,8 @@ minetest.register_node("mcl_smithing_table:table", { end if listname == "upgraded_item" then - take_item("diamond_item") - take_item("netherite") + take_item("upgrade_item") + take_item("mineral") take_item("template") -- ToDo: make epic sound From b76ed92abae43334e619e1c97a14956a8daa58c3 Mon Sep 17 00:00:00 2001 From: chmodsayshello Date: Thu, 8 Jun 2023 10:38:30 +0200 Subject: [PATCH 048/982] add missing rib_boots texture --- textures/rib_boots.png | Bin 0 -> 644 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 textures/rib_boots.png diff --git a/textures/rib_boots.png b/textures/rib_boots.png new file mode 100644 index 0000000000000000000000000000000000000000..dfe77f4332bad5951164607766e6b0d47421994b GIT binary patch literal 644 zcmV-~0(EX>4Tx04R}tkv&MmKp2MKrfQ2+9PCiUAz*c~AS&XhRVYG*P%E_RU~=gnG-*gu zTpR`0f`dPcRR6lU)@9ujoOL<}e~Mvy3@ON}}WVx`&VNcQKyTx$e)=r{*jM_(bAaW|%hd2J!T! zZE)Tv4zr@H5}y-~nRG$oN3JU#zi}?OEbz>*nNH0Uhl#~P8!K(hil#<9MI2Q%o$`f@ z$13M7&RV(3n)l={4CVBdWvu?swklh8!_5-QY@tCJl?@S==vpcDdZ}F zkz)ZBXpmh$_#gc4t(Bjg@RCAtp!>yfK1P7RF3_ks&iAq7G)@5jGjOH1{FOQ|^GSNG zrA3c`{%zpmx}_<5z~v4Qc`{^Eb|pV8A)g1{&*+=7z`!lgyXN(+d5+TuAWgkW-T()O zz-WQ8*E_sB*xt8)YnuK00XzqCkwwBB+yDRo24YJ`L;(K){{a7>y{D4^000SaNLh0L z04^f{04^f|c%?sf00007bV*G`2j>O|2qiDTP~g)5000?uMObu0Z*6U5Zgc=ca%Ew3 zWn>_CX>@2HM@dakSAh-}00016Nkl<{900000006)rj3mAHmL%DhB%O1#)*5%mNjk~kjbACCswC;r`g6{%D!sk{ e+iko5TEGP)861JCMAGj70000 Date: Thu, 8 Jun 2023 10:41:49 +0200 Subject: [PATCH 049/982] fix texture filename --- textures/{eyes_helmet.png => eye_helmet.png} | Bin 1 file changed, 0 insertions(+), 0 deletions(-) rename textures/{eyes_helmet.png => eye_helmet.png} (100%) diff --git a/textures/eyes_helmet.png b/textures/eye_helmet.png similarity index 100% rename from textures/eyes_helmet.png rename to textures/eye_helmet.png From bb2ce9ef926a841321813547ad29c6864f4dd736 Mon Sep 17 00:00:00 2001 From: chmodsayshello Date: Sat, 17 Jun 2023 20:16:36 +0200 Subject: [PATCH 050/982] pare down a few bytes from textures --- textures/boots_trim.png | Bin 5461 -> 5442 bytes textures/chestplate_trim.png | Bin 5523 -> 5494 bytes .../coast_armor_trim_smithing_template.png | Bin 6436 -> 6243 bytes .../dune_armor_trim_smithing_template.png | Bin 6506 -> 6360 bytes textures/eye_armor_trim_smithing_template.png | Bin 6327 -> 6151 bytes textures/eye_leggings.png | Bin 6108 -> 6072 bytes textures/helmet_trim.png | Bin 5408 -> 5397 bytes textures/leggings_trim.png | Bin 5556 -> 5531 bytes textures/rib_armor_trim_smithing_template.png | Bin 6259 -> 6080 bytes .../sentry_armor_trim_smithing_template.png | Bin 6200 -> 6063 bytes .../snout_armor_trim_smithing_template.png | Bin 6163 -> 6052 bytes .../spire_armor_trim_smithing_template.png | Bin 6259 -> 6115 bytes .../tide_armor_trim_smithing_template.png | Bin 6266 -> 6119 bytes .../ward_armor_trim_smithing_template.png | Bin 6214 -> 6080 bytes .../wild_armor_trim_smithing_template.png | Bin 6306 -> 6141 bytes 15 files changed, 0 insertions(+), 0 deletions(-) diff --git a/textures/boots_trim.png b/textures/boots_trim.png index f46033c21dada34aa09b71e3606c3d414b311a8c..762e4ec2d996f881eef542777b8e2dea9ad540d8 100644 GIT binary patch delta 120 zcmcbrbx3Q&I+4i-L^N{PlDyqr82*Fcg1yTpGcYi?db&7`%j!0hTU0VtBym+s*Oh=2 z29HGx7d9?nR4|oj6Id;|UU4x4lZ=eaKXnzA1m1uN5*~a@+E%cXJ~+_$pI^>~Az7f> dc)I$ztaD0e0s#8BEwlgt delta 152 zcmV;J0B8U9Dw8X)-4qW7VoOIv0RI600RN!9r<0S~6f1mZNklJQ40E_7 zr}UJb;!|=;Pw^*Vs#F0IMZg5!A|-Zg15Y9%^6JiVS9BSfC7m8f+J71mNit_uN#=~* zufWEkl#=cacLzz^1}6!U&|0%Yg0YoO)T@((TC4q;zkn4A4>Nzwz-bKt0000y{D4^008w#L_t(I%VS`m7O=?p z{@=0w&wmh&%m-nj3;-!KFm4B9kY*5VW;YwmZYatI<4K)O{}<1k@*k%QKpH?8<`NK2 z3JU_`g7`=<1{v^juE!s|-T>h!e;*9ZAPjQF!&W=&27sLD-?;XF*o=Q8V2vIfVTG8kJ|tkhD99+!^B`w4NEH+02XNYXyn9(0lb_X!2Sls1jz3o8l4YPgEvKj x6uK472L~L8M&}bu(jXs&AQ}|v*!Y7F000%{KBWR(;sO8w002ovPDHLkV1hiufR_LO delta 491 zcmVVoOIv0RI600RN!9r<0Q$7b<@Nwn;=mR5;7clQBpeQ5eU6 zcS-K<84-=4XE&*xvK1+~6f~2FkS?8?wqpzJAR;*0%#~6%7q^No5r-n3qGLd8hEgq+ zmJ+1bNSbJnyu@669ptW>i(R_-E#LQl@c#V1_k9okGc>Olc_x*xBgj&V{G!l24X~LB zYgZYBy+VK35vuQA`DTsnH=IS|=!rBhr=Kf;m~GS78{^T_7rvqH6|&UAh{iFZafBVg zx;urQNRy~Mqk6b;f&~WR)768V(W+>=M zOxwoVGiWqVeUoZx4tZFn_sa?&f9w-z!HfP+%ZPs)aRC2vO*R=A9HKk-8i2`FC)|;s zQI`M=3=VN;KFe_TZ+1>X6v{3?zkekJysytQHn*U>>4e(}dW1=H;W2q2f8o3j$j6pB z+kMOF!EKD;dqDyKONjH_B?4r^j!@k$qbJh-Zd@`bI)_;1-^XjuH=X-1xsEKgI&alP za#T<4S6r3KWYua>sZ=H#&=bi~b@9%nDQx7nw4IX>^0-E!>>`hAwCj!BmiEujG5evV h0G_OUR-N?qi$7Ks!PghQi`D=D002ovPDHLkV1iZK@IL?m diff --git a/textures/dune_armor_trim_smithing_template.png b/textures/dune_armor_trim_smithing_template.png index 3b97d22b5875ba083ac136a60d5d149207950357..f5e7868131774e2ebd238dc35d65e0ff6e7ce48a 100644 GIT binary patch delta 237 zcmV;;(9K^PV;FfZUW0Onm>SfC*X zD#2Jlk1pisMCRi(U~5Ma*y;Fa5XNc1;>rxL|NR@+g1rHv(fJ@XcvB-tpu)jex nI-g*21}Oy5pg_aMAAA4+M#EXamaRN100000NkvXXu0mjfXXk2E delta 397 zcmV;80doG>G3qj~!WRz)VoOIv0RI600RN!9r<0Sv7b<@NSxH1eR5;7clCeudQ5eO4 zuct%e%PpcwT>1lQllF=r9HJI!kyfWDkid!(hjx*gTpFU${(#m@!o?`Tq0&Nx`>s5d zr@RI;pZaXAv)p?=?)mu6`7Zo56g&CMo>+D+jqaF0^Qg?O9scO1MjuF{%lX^^d#z1` zG!fF|cxr!}bRdS1CIBCoD;>uM(&+N~W)Sf!L`9}o(@mlxL$zGOr@4_vmsZulv4Q4M z0mwB}q;8^Z98n1+0a#sHKu8nKqf#h5GtmM-zSf)YqHJ+{{{+CIcaX>WRmIi6yPQIc z_!ZvoVCyjsfKPLiE?ew=Td-qn0&T`kuA!1$J{@t012L-Q(vVHZHI}a9)@UC6$?V*| z#vu#E7ai}ki$=3E@f^jFg}N}951)~42dRXTq}#zUUKhsX2H`|X$u(4(LMLDA&=fkO rJe)`=zy9t02h#%BxhYys{Quz#;y0((#PorC00000NkvXXu0mjfp>D;E diff --git a/textures/eye_armor_trim_smithing_template.png b/textures/eye_armor_trim_smithing_template.png index 7cc95fb77726162afefca86f19b11cffd3db67d4..afeb95cef1d17d19162624853210eb1af1b9bb70 100644 GIT binary patch delta 250 zcmV=8Q5t6tKfGL7`1=&Cl8zhc13_v!){0%b%BnE22ATf~l zKy17Qz-$6xn7?5G3JVv!2EZ_K^dXDmH6X;x6>JMW8ia8g;OS%scCLTpTCkHrG&&!o z25)KvDRe8E5B5KZM&}bu&LD*#8Wf1w_=67s0FSIE700RWQ2+n{07*qoM6N<$f)Rse AMgRZ+ delta 441 zcmV;q0Y?6ZFt;(V}0Q6XxhWcvKD_xF%FfJ7}xNaUMr#Zw&gQ$v(ZrTWdKNO{PW{cb9 zK{BaVPhXawUQz2K9SH(3vbc#q6h&2J(vcvin#1Fh#rgRazdj+**n}9U0w7_Cq>`5i zrVT(Uc|#r0y>TZM-9XoET743^{xty3=6b1$g;9SM8Gk5>b+4i8_K(1V4dSESxIGKd zIZdFki4LFS6`DSXfFhSRP!$6*$-T#V(*)5cnhNxpGxVsETV)&hp*Ln!9VtkAEwxYhW{YAVDIwDli!JH*U#~EaSX}0_x9Rp-opkQ4T(Xe0&a;@ zdL9KzvuqbP-N3>o$N&NVQ;NRNo2jIsfXH<+;jq@KJ?&$dE_vZQ>IaV$0xL)31rnGM+TcfjMLyzk+GPIXYw2eJ{_xIkv z+vghfS7e-Jxox>9CcW$F=Czwkm%UrRyJz=z+xdnK{V@y?FT)gfMwmB)?DTZ?b6Mw< G&;$T*C0`W) diff --git a/textures/helmet_trim.png b/textures/helmet_trim.png index f35661f8d4ce166f2527849a236ce58b7f10494d..508686cf10c893fdff4b5bbd8a6a6dc32db63138 100644 GIT binary patch delta 107 zcmZ3WHC1avpUC6|A{y~*N#5=*4F5rJ!QSPQ85kHWJY5_^EKVmUNU&aE<>ci2FD)hY z@9`w|lZ{s%n5GEZan$jvB^vfw>R?MR*0gTe~DWM4fy4x+< diff --git a/textures/leggings_trim.png b/textures/leggings_trim.png index 0382d2c2ab554a72bab06f86930cb9f7e529ec92..28f2a8a1098c69fa55f58fd2dd1760bfea7bc6ea 100644 GIT binary patch delta 148 zcmV;F0BirWE1N5@>=cv!6excNVoOIv0RI600RN!9r;`8x0ANW(K~y-)V_={MSg>FL zJ6$YdNJvQd-_X$T|G5VX;9}G>!t&000TvR7xl6YM}rC000O{MNUMnLSTYD C89SN) delta 159 zcmV;Q0AT-{E3_-H>=cs}6%v!|6exdrNklxAc-W9 zw7pcXyJxL6_#q@slCeEi^|-yN#`Yu`Nr#_Y&XOeeCF}%;?9ZFI0WIM>B99Mi&4T~{ N002ovPDHLkV1nAOMi~GA diff --git a/textures/rib_armor_trim_smithing_template.png b/textures/rib_armor_trim_smithing_template.png index eb3fd6d76929fd6dcaeecac3588e4907f5f46fcf..7f7b97addd1172865b49ab21566ecea94d8371a9 100644 GIT binary patch delta 252 zcmVy{D4^0075HL_t(IjbmUKRKQt9 z;lIC@Itm7f!7xk=rvV_z+wcDTU-9Vw|MGLc|NA$t{qI&ZAI=Ah0oA;m>+uJt0oHO- za2r7y;@91Pi-Bm6nuo1+*bRVbLU#d(4RaYt&6WsB+%ACG1kwoiJJ4_-m^g^W8wN0E z>q&{DXab3Wd8Ysj; zG&&!z0U!WU2#Y#cB0}cl)eHh4g&-Of>e%>$4*&pj?(-iEZ7*{G0000HK9?r zeVRMlXl;l0tIO1FAAshV8dfxzmP&wnRsRs_+wnL$E#!4neO=x_Z9;eZ;qBAJwb4th#o|L?tTcf*OzFTc^ z9kEfulahpCuzS*q&LC{N{&9bbR|82rDPg0;=;tcKnF;pivrk{4n9nI&Tmx|JcS-A7 zuzQ%FbRc9W2+&N$`_31Io&mpaTmW3ZOHz05S?l3vksUOZ^~YDm@}~N6u2iwS*{8FE zrV97G2n*}Vj@5*Q+jgkiK5pCLv9_-4*t0G^9sE@QOTU^bO8y{D4^006;BL_t(I%VS^|RABMU zDgQxuQfCvKZYauzW0*Kz1Cqjm{zv)yfa%-s{`_C@=s%cU5FZJ~AT=-Ndi=p^0LTWI zW)NL|?)U%rbvNLeK^UawVXGZ>13=D1wi(?eAOk>ZwnRwcHvncch>dE_2dTjs1{E1e zc*6ihgVf+P0NKCT!hoOwFpM01$l`bnK#l=iGzjA~z{|-2>~H_ZwP3%4XmmbE4c^oU wQs`DRAMAe+jm~Ev1V9QwG$`<}@dqCO03p;N1CTkr;s5{u07*qoM6N<$g0fX>r2qf` delta 382 zcmV-^0fGLnFSszUpB4`WVoOIv0RI600RN!9r<0SM7Ak)MN=ZaPR5;7ck}*reP!xr~ z+R`Krq3P1uzfd>b#X$#g6GV!Gg9;9UbZ~HYbf}<{4pPv;p@?AZ=u#bA6qll4jcA&t zX_MAM94sM86IVUU<-B+Ax%Zy;;I9$$lB4}S2cV&AD5*3JT|-k<_dcD;prq0)uB^Fr ziJ;>3RT+P~+d~wRzFU2}`=ZjXbS!&~hU zMH2iu{SKiMXsYV#e7-)5C?r`O@SE)gG*#vP^@+$80JpO!Bz-(?bx8p;C-p?AfZeeG zc-fg7@<5RU3{Otv1hOO`4|WcEAbY%s6c8opCyruDaJ<17U=Pm1;1hVRzq>CG6@wV@ z61`=TFBEBKb4=}?($40FxZX0O1xn>gtZK%wng(|teXOQIkeAAp*sp(k>-Nh5SUP)f c!ubEgH@d*Cx(t#}6aWAK07*qoM6N<$f^EjLh5!Hn diff --git a/textures/snout_armor_trim_smithing_template.png b/textures/snout_armor_trim_smithing_template.png index 25a6d3a1147451726992866ca8fcd61107c30269..0fb91e5663b8ece205a83d01692f84682719b668 100644 GIT binary patch delta 258 zcmV+d0sa1yFr+WAh!&HY7AJoI24YJ`L;(K){{a7>y{D4^007NNL_t(I%VS^|RKVWK z>OTlunVQ0BQv(AyhKb`f0Hjb&S^2-Vh6bF5VUQe1&C9tSf3O+=vH_+Eq!?xhvOyp< z4_oc98vwKY_Pam-S3LR;)}Saa59XJj`wcgEON1nD13(%;isRSafZKKsG7QECslgcr zFfWA7IP%}WaV^~GAOk^SFfZUW0NvlPuz<1g8h{*)Fboqz7RPA-dh}tVK^Uh2un-6N z9~5vP8l4YPgEuvT6uK472L~L8M&}bu&LD*#8We5V_=67s0JC7@tWrOaS^xk507*qo IM6N<$f{meQdH?_b delta 368 zcmV-$0gwKqFOx8^h!zh9VoOIv0RI600RN!9r<0R~7Ak)MJV``BR5;7cQ88-6KoA_o zS~ygi^umvD<0fqigP)K`q)6?5ByDix5CVCC8$n_m7fKQ1!d4nvK^SD2^Mw^$3Pp!x zOKy{e<(R#ly}2FWufr;Wi%v%a05gM#z|3G~b5BGdB8)uG@Xih=N+}U-HYTM~Ci7w8 z-DR5h+eLpeGb2tC5D^?9Ab)H5>ryEY5!70uQbFGQ=)L3mX`0p26wl)sy7#{6@%=d} z73755rN(+W%XVSgnCuz`LkM&SE4y+45rJ$Qi`N%?hoPxWqZIqE$Skqeg-*Mz<0L8l z+Ytg%DFA>Y1c(UUcx=@wIBzzOtaBWvw4-8_2CP)V(D+|>o{X03>iH(sz5Y-SKDF-k zhex>Oy1K|I*|-P-YqD!#A8)h8#akTWMG#mgRouL>27s%F4_$@-U;F^&OU%EEOOTfU O0000*Fyk+<#TJv-7AJoI24YJ`L;(K){{a7>y{D4^007TPL_t(I%VS^|RA63O z?tgUL7oP^lFfqIaWcx&cad}Vz9K*yw7^LRqT#r9E4G5cY;{0G2~!Nx45ML&feZ(!*%Bd%-vE#Xkj)?rVuK8dUw3!|EC*79GYmks zfSd`|1XK*-gD^-F%m5IdpaCEokpmHgLCy!s5i|hVRv1PW$7=vA`tZ>pjMIPww@`4v z`8TcwhXaU4=Y!PXO^qOhZbkFK;Q*r1`2>?QNFj&@g*rC=-~#}nzan9o0mXIz0000< KMNUMnLSTaSb8F22 delta 403 zcmV;E0c`%`FY_?4#TE|+VoOIv0RI600RN!9r<0Sy7Ak)MUr9tkR5;7cl21zlQ5400 z+VC83grGoZ=e~`I-=T%jB4``bU?8+ul~lk8{sEm-pbW5tt_B^xoJn=-Rf|FNQ(@Y!{EcImJJ4`}_ugCWLop zN;&CBtSo=gDy=!uoofXk=r?GmGDJ0%c)mhd1knuxO$fBZQ%^H&zI%PpA2(Jru(Aan zvO8GW0_T~uYnI!koyyR)Z5oY7ep~?{zO0ZqDY`4=O4K_J&CM*avm=NIQWr1ETm#c~ zynPK_CoJ56(U3xOec#heV{U?a#}!%fFy}9@$QF~@7AJoI24YJ`L;(K){{a7>y{D4^007WQL_t(I%VS^|RG@t6 z_%^VPbdPxtbvIDNKx!Vg+F>^UaG-%`bUxwa3{(iBL4k&iKllIu&1V@k4WcU000000 LNkvXXu0mjfDSUP+ delta 407 zcmV;I0cif`FZwXB$QBONp983@r20-f@egTD8C z`c$$(edVv#y36+-?m36^{eCa}^|Ac~;p6REJE5Q$*4^!M0kAQrlw)2 zIy*-v?5BTf+^@~x@_Gmjb&$)uiec|91aZgEPP?^KTV zxJ|K;l0>#j@jZ)>5&%QhDJTZX7xwK!8JZny^1DK6kGRqwXEiL3Uoz>kl3V{&gn->%Up$?qW^xg)MXv`MZ z?G*EBeT8|Ib{vVuY`^~P@Li<_Fn9S_>xTc|`2xB0tLxt!6gdC@002ovPDHLkV1k-1 B$*TYW diff --git a/textures/ward_armor_trim_smithing_template.png b/textures/ward_armor_trim_smithing_template.png index c348818d7339945073357a3aee270ad3075b544b..1260cdf58433a2c07a83946e93f5dcfc2d7a02fc 100644 GIT binary patch delta 259 zcmV+e0sQ{PFu*Uclopew7AKRF788HnNkl`|?Hn*?j`>U+VyZIg`i2=M1)5-~;SsTdN_AKf8Xap1pp67FJZsry%GRCUVy$fSx>k17ocjc&sHm- zABHlBBJpM91#oZH$KA=z+6y2svUeU)_ixwUW&$Ibmv`0Oiyxt#37rQ3(TxBA002ov JPDHLkV1jzNa?1b! delta 407 zcmV;I0ciffFUByilok&LVoOIv0RI600RN!9r<0SB7Ak)MV@X6oR5;7ck-tmAQ53~L zmgf6HG(|NA4NbZjL3=|%;1E~@QBc&}QnRZ|RBNpvK}M4e{R4^>_+3&drKJps6zSb> z8m}qwS2fmI9*29+x#!*oe+^eNSy~Jk0IdbfQfMuRNTaTl!m<>{(UXSG-R`KhuyAlr zp#Ouzf+2sOOkfQSGBP?wa%&pPQWTG7>ceXn?hXU31<&j@@l=M`a|x$dM3*bPW^>F= zjKl6F+3-B_^hVbNBErDew7pFL9LK@y^%Ce`2Hd1Yu2}F0#r~;jTpta9A+x zho%6Si$1!$CQwQt;-H^POzvK?KI-DC+Dkl@A)k9pGx+jd=5 zd(q_zH>EndT%nz(ZQJ!@ik<740a%IMnr{66;S=a!wgPYNiOK)~002ovPDHLkV1f(A B#$Esb diff --git a/textures/wild_armor_trim_smithing_template.png b/textures/wild_armor_trim_smithing_template.png index 69e722d069cc51ce1ff997b053c01390d2649748..2422e253897a30c4d95e4d46f3dcc0fe1ee4594b 100644 GIT binary patch delta 280 zcmV+z0q6drG5s&F%oda07AJoI24YJ`L;(K){{a7>y{D4^0081iL_t(I%VS^|R6w)D z>^}&rr<=g(hN5gZp48d&fAP#I|M4227HtB@Nnt^7To4}##vlV;&h_|%)c}wU{*7z@ zhs`+hKg!<+MKeg;t!O^j6%SkOup0n!CP+j4x*Pw?&;9;?``sTf4dQ=;3T#foOC-!Q>252%R4iI&x&(m!q+_eHp+D)2IJ?bvkJn3$+r#L@lv!u{OniS;bwtMS zJr4~iF%>1I@_3)*;`juB_-eoQk?$xjo~#>StEvsz>&3CT1hNsYu9UfK9wwJc)BJcv zUdv($NXFyT#twLGU!;CM#CW5`N>p$YJx9Jx&~&jz5)Vh$5o^GQ*#mRj0lUjVZlY({ z19P~5G~fmX0;d=Ds2a63I_Y$)47NE}+;K?y))4BwflN0C)?lzibC;rhi@`TBZAB&iAi zLQn)0A^Z!$FWT4FD~fAM4k^67BkgAF Date: Wed, 21 Jun 2023 10:53:41 +0200 Subject: [PATCH 051/982] add ':' to modname once --- mods/ITEMS/mcl_armor_trims/templates.lua | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/mods/ITEMS/mcl_armor_trims/templates.lua b/mods/ITEMS/mcl_armor_trims/templates.lua index fdc61b931..459cc9683 100644 --- a/mods/ITEMS/mcl_armor_trims/templates.lua +++ b/mods/ITEMS/mcl_armor_trims/templates.lua @@ -1,14 +1,14 @@ -local modname = minetest.get_current_modname() -local S = minetest.get_translator(modname) +local mod_registername = minetest.get_current_modname() .. ":" +local S = minetest.get_translator(modname) for _, template_name in pairs(mcl_armor_trims.overlays) do - minetest.register_craftitem(modname .. ":" .. template_name, { + minetest.register_craftitem(mod_registername .. template_name, { description = S("Smithing Template '@1'", template_name), inventory_image = template_name .. "_armor_trim_smithing_template.png", }) minetest.register_craft({ - output = modname .. ":" .. template_name .. " 2", + output = mod_registername .. template_name .. " 2", recipe = { {"mcl_core:diamond",modname .. ":" .. template_name,"mcl_core:diamond"}, {"mcl_core:diamond","mcl_core:cobble","mcl_core:diamond"}, @@ -19,7 +19,7 @@ end --temp craft recipies, missing structures minetest.register_craft({ - output = modname .. ":eye", + output = mod_registername .. "eye", recipe = { {"mcl_core:diamond","mcl_end:ender_eye","mcl_core:diamond"}, {"mcl_core:diamond","mcl_end:ender_eye","mcl_core:diamond"}, @@ -28,7 +28,7 @@ minetest.register_craft({ }) minetest.register_craft({ - output = modname .. ":ward", + output = mod_registername .. "ward", recipe = { {"mcl_core:diamond","mcl_core:diamond","mcl_core:diamond"}, {"mcl_core:diamond","mcl_core:apple_gold_enchanted","mcl_core:diamond"}, @@ -37,7 +37,7 @@ minetest.register_craft({ }) minetest.register_craft({ - output = modname .. ":snout", + output = mod_registername .. "snout", recipe = { {"mcl_core:diamond","mcl_core:diamond","mcl_core:diamond"}, {"mcl_core:diamond","mcl_core:goldblock","mcl_core:diamond"}, From 16415ae5770dde1533b3d764c8183e3e2d37dc19 Mon Sep 17 00:00:00 2001 From: chmodsayshello Date: Wed, 21 Jun 2023 10:57:50 +0200 Subject: [PATCH 052/982] bring back old global function --- mods/ITEMS/mcl_smithing_table/init.lua | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/mods/ITEMS/mcl_smithing_table/init.lua b/mods/ITEMS/mcl_smithing_table/init.lua index 89e28a8a4..a3924830d 100644 --- a/mods/ITEMS/mcl_smithing_table/init.lua +++ b/mods/ITEMS/mcl_smithing_table/init.lua @@ -194,3 +194,8 @@ minetest.register_craft({ {"group:wood", "group:wood", ""} } }) + +-- this is the exact same as mcl_smithing_table.upgrade_item_netherite , in case something relies on the old function +function mcl_smithing_table.upgrade_item(itemstack) + return mcl_smithing_table.upgrade_item_netherite(itemstack) +end \ No newline at end of file From 1e16647fe9dda16e8aff4514d184199d814300cd Mon Sep 17 00:00:00 2001 From: chmodsayshello Date: Wed, 21 Jun 2023 11:21:39 +0200 Subject: [PATCH 053/982] various codestyle fixes --- mods/ITEMS/mcl_armor_trims/templates.lua | 2 +- mods/ITEMS/mcl_smithing_table/init.lua | 59 ++++++++++++------------ 2 files changed, 31 insertions(+), 30 deletions(-) diff --git a/mods/ITEMS/mcl_armor_trims/templates.lua b/mods/ITEMS/mcl_armor_trims/templates.lua index 459cc9683..6a8c23667 100644 --- a/mods/ITEMS/mcl_armor_trims/templates.lua +++ b/mods/ITEMS/mcl_armor_trims/templates.lua @@ -10,7 +10,7 @@ for _, template_name in pairs(mcl_armor_trims.overlays) do minetest.register_craft({ output = mod_registername .. template_name .. " 2", recipe = { - {"mcl_core:diamond",modname .. ":" .. template_name,"mcl_core:diamond"}, + {"mcl_core:diamond",mod_registername .. template_name,"mcl_core:diamond"}, {"mcl_core:diamond","mcl_core:cobble","mcl_core:diamond"}, {"mcl_core:diamond","mcl_core:diamond","mcl_core:diamond"}, } diff --git a/mods/ITEMS/mcl_smithing_table/init.lua b/mods/ITEMS/mcl_smithing_table/init.lua index a3924830d..8242a9269 100644 --- a/mods/ITEMS/mcl_smithing_table/init.lua +++ b/mods/ITEMS/mcl_smithing_table/init.lua @@ -53,20 +53,25 @@ local formspec = "size[9,9]" .. "listring[context;input]".. "listring[current_player;main]" +local smithing_materials = { + ["mcl_nether:netherite_ingot"] = "netherite", + ["mcl_core:diamond"] = "diamond", + ["mcl_core:lapis"] = "lapis", + ["mcl_amethyst:amethyst_shard"] = "amethyst", + ["mesecons:wire_00000000_off"] = "redstone", + ["mcl_core:iron_ingot"] = "iron", + ["mcl_core:gold_ingot"] = "gold", + ["mcl_copper:copper_ingot"] = "copper", + ["mcl_core:emerald"] = "emerald", + ["mcl_nether:quartz"] = "quartz" + +} + local function upgrade_trimmed(itemstack, color_mineral, template) --get information required local material_name = color_mineral:get_name() - if(string.find(material_name,"mesecons:")) then - material_name = "redstone" - else - material_name = material_name:gsub("_ingot","") - material_name = material_name:gsub("mcl_core:","") - material_name = material_name:gsub("mcl_nether:","") - material_name = material_name:gsub("mcl_amethyst:","") - material_name = material_name:gsub("_shard","") - material_name = material_name:gsub("mcl_copper:","") - end - + material_name = smithing_materials[material_name] + local overlay = template:get_name():gsub("mcl_armor_trims:","") --trimming process @@ -76,22 +81,8 @@ local function upgrade_trimmed(itemstack, color_mineral, template) return itemstack end -local function is_smithing_mineral(itemname) - if itemname == "mcl_nether:netherite_ingot" - or itemname == "mcl_core:diamond" - or itemname == "mcl_core:lapis" - or itemname == "mcl_amethyst:amethyst_shard" - or itemname == "mesecons:wire_00000000_off" - or itemname == "mcl_core:iron_ingot" - or itemname == "mcl_core:gold_ingot" - or itemname == "mcl_copper:copper_ingot" - or itemname == "mcl_core:emerald" - or itemname == "mcl_nether:quartz" - then - return true - end - - return false +function mcl_smithing_table.is_smithing_mineral(itemname) + return smithing_materials[itemname] ~= nil end local function reset_upgraded_item(pos) @@ -104,7 +95,7 @@ local function reset_upgraded_item(pos) if inv:get_stack("mineral", 1):get_name() == "mcl_nether:netherite_ingot" and not template_present then upgraded_item = mcl_smithing_table.upgrade_item_netherite(inv:get_stack("upgrade_item", 1)) - elseif template_present and is_armor and not is_trimmed and is_smithing_mineral(inv:get_stack("mineral", 1):get_name()) then + elseif template_present and is_armor and not is_trimmed and mcl_smithing_table.is_smithing_mineral(inv:get_stack("mineral", 1):get_name()) then upgraded_item = upgrade_trimmed(inv:get_stack("upgrade_item", 1),inv:get_stack("mineral", 1),inv:get_stack("template", 1)) end @@ -142,7 +133,17 @@ minetest.register_node("mcl_smithing_table:table", { end, allow_metadata_inventory_put = function(pos, listname, index, stack, player) - if listname == "upgrade_item" and (mcl_smithing_table.upgrade_item_netherite(stack) or string.find(stack:get_name(),"mcl_armor:")) or listname == "mineral" and is_smithing_mineral(stack:get_name()) or listname == "template" and string.find(stack:get_name(),"mcl_armor_trims") then + if + listname == "upgrade_item" + and string.find(stack:get_name(),"mcl_armor:") -- allow any armor piece to go in (in case the player wants to trim them) + + or listname == "mineral" + and mcl_smithing_table.is_smithing_mineral(stack:get_name()) + + or listname == "template" + and string.find(stack:get_name(),"mcl_armor_trims") + + then return stack:get_count() end From 460ef23b50ae2a331548d9d27840f132c0199228 Mon Sep 17 00:00:00 2001 From: chmodsayshello Date: Wed, 21 Jun 2023 11:48:21 +0200 Subject: [PATCH 054/982] make upgrade_trimmed global --- mods/ITEMS/mcl_smithing_table/init.lua | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/mods/ITEMS/mcl_smithing_table/init.lua b/mods/ITEMS/mcl_smithing_table/init.lua index 8242a9269..9680bb68f 100644 --- a/mods/ITEMS/mcl_smithing_table/init.lua +++ b/mods/ITEMS/mcl_smithing_table/init.lua @@ -64,10 +64,9 @@ local smithing_materials = { ["mcl_copper:copper_ingot"] = "copper", ["mcl_core:emerald"] = "emerald", ["mcl_nether:quartz"] = "quartz" - } -local function upgrade_trimmed(itemstack, color_mineral, template) +function mcl_smithing_table.upgrade_trimmed(itemstack, color_mineral, template) --get information required local material_name = color_mineral:get_name() material_name = smithing_materials[material_name] @@ -96,7 +95,7 @@ local function reset_upgraded_item(pos) if inv:get_stack("mineral", 1):get_name() == "mcl_nether:netherite_ingot" and not template_present then upgraded_item = mcl_smithing_table.upgrade_item_netherite(inv:get_stack("upgrade_item", 1)) elseif template_present and is_armor and not is_trimmed and mcl_smithing_table.is_smithing_mineral(inv:get_stack("mineral", 1):get_name()) then - upgraded_item = upgrade_trimmed(inv:get_stack("upgrade_item", 1),inv:get_stack("mineral", 1),inv:get_stack("template", 1)) + upgraded_item = mcl_smithing_table.upgrade_trimmed(inv:get_stack("upgrade_item", 1),inv:get_stack("mineral", 1),inv:get_stack("template", 1)) end inv:set_stack("upgraded_item", 1, upgraded_item) @@ -141,8 +140,7 @@ minetest.register_node("mcl_smithing_table:table", { and mcl_smithing_table.is_smithing_mineral(stack:get_name()) or listname == "template" - and string.find(stack:get_name(),"mcl_armor_trims") - + and string.find(stack:get_name(),"mcl_armor_trims") then return stack:get_count() end From 5cc9038169ee82ef6ac0a115b95e488a9dda2e12 Mon Sep 17 00:00:00 2001 From: chmodsayshello Date: Wed, 21 Jun 2023 11:51:03 +0200 Subject: [PATCH 055/982] reduce texture filesize (again) --- textures/boots_trim.png | Bin 5442 -> 126 bytes textures/chestplate_trim.png | Bin 5494 -> 131 bytes .../coast_armor_trim_smithing_template.png | Bin 6243 -> 302 bytes textures/dune_armor_trim_smithing_template.png | Bin 6360 -> 256 bytes textures/eye_armor_trim_smithing_template.png | Bin 6151 -> 269 bytes textures/helmet_trim.png | Bin 5397 -> 113 bytes textures/leggings_trim.png | Bin 5531 -> 153 bytes textures/rib_armor_trim_smithing_template.png | Bin 6080 -> 256 bytes .../sentry_armor_trim_smithing_template.png | Bin 6063 -> 250 bytes .../snout_armor_trim_smithing_template.png | Bin 6052 -> 262 bytes .../spire_armor_trim_smithing_template.png | Bin 6115 -> 264 bytes textures/tide_armor_trim_smithing_template.png | Bin 6119 -> 265 bytes textures/ward_armor_trim_smithing_template.png | Bin 6080 -> 278 bytes textures/wild_armor_trim_smithing_template.png | Bin 6141 -> 283 bytes 14 files changed, 0 insertions(+), 0 deletions(-) diff --git a/textures/boots_trim.png b/textures/boots_trim.png index 762e4ec2d996f881eef542777b8e2dea9ad540d8..20a91a7fed5491545307c4d9d0ea387a9af9485d 100644 GIT binary patch delta 9 QcmX@4RX0I-@^g`B02MF<2LJ#7 literal 5442 zcmeHKdt4J&77l8K;-l08x>zL!t5^(~OrDb_J|MvajiEpliq%eLCNPp0nZW>B1k@q| zZV?NLw92+>eb)MbB0gZ%wmh_S6}MHuDpt@I5p8|0x_1)9uyyVF`)&V|5R!ZDcfND( zch9+($%&XbZHT9zCyT`zqERa&!KWAV_818M`rmknvRM7Y(xPMNNYu`@+AIdrNU-Tt zE5RmGNCS(Na;CE=uIS>p!SA1oRTX87ouWt9)FVGkEn4rtXp1fRpLiO~t0k$yy9ZAW z@!wSU+u;YVUVUlKFSS)(O_4Ke+dL6G7;5O69V@!C>q=YA`mc_6?HnF8tFi7u!sU*| zcWckB{;Yb1E@akUho8N#8k&9RphtJ>H+czXI=$+$Ke+ZFYiQ*6_G`(cho0|?U{M9QoWKw8c*z5VGX0-9moj*6N^Z*L?=!4! zipF1G@RMg!ck@yYY}GnZnwv*H<$vtMANL%XTevOb-8rOq;;!4K;_o@57A9T|h~4nQ zsDLx~;{r_CtjML60a;_*+}5i(uU)U(uKebcOkL&&Ukqr?$k1PWKM?Uad7#ESVYl}#PwDr&77It*jK~=ln#Wh=`%)7%k!t?NPs!2gD%FxO?bi7v z`_{zlN~k^65L>Na`yVH*UNQ7M5m+o zm29gl`bz6}BB!WCoLKqc%u#V$vPUnxa%M;S+=1n1K6p9oRkCAO!L-WH3eJ9!9ynQ- zKXd*8_3@QyZyt$gipsi_G;F-Ut8EH2P}A{1-~R%iR9!3wk~t;*&XFuCD)FT{e4wSLX6` zHM}PeH;fr{?(Y80=B-sDzP;XcZ_nLRS;sOml=Aw)C&$el|8eWyAt&w~sx z(F`A(esTYW?vd@Q>id1`ecYI~GG=U1_^9nP6tvE-+dC<`iLM)N8@;WxLYmm*m)KHx z7@E^qESR%dlsCY)KD>R!cW(P96zNw%%RWh0lfSTB{5;Dn3O&X8diQ!t8K^h9uq$qG(D7E3-k#foBy z1kKhH@uXS7>8d)+VUxImGh3vEwAN4}fmEm2h^Vxg(O6m{hTxpZlRV`qGC*J=Xq25| zGMXt_ih|?dm4WY!na5!}AatUF6Qhk_hgxg|TNo@1hPbK}askYl>O9B2$FIkm%92SuwEJdXE74=Ng5G`vWHvLxFuLbZS}(*dqQt;S@^HD)qJ zFeXRdM%=&yNjW0B`b^VkBYJ%p8RJQl)#1UQU6DA}i?b%%j1CNr@dzVf0*O$7ncoLb zlZM9|)Mq`+%|10tv*G7!V08g)3s4Br>kTdxIvWW(0X4d2#ZcjZ3XvH21SAx3VGKjKLIfhXC=5u&fD|Y6 zkN^@nvtjl@HZ?+{;K0FFru`XjWV+F#S)=JEQO>J zA%wuN=rL#(VWU8qGpu|l75AVRBkfl-0RPGFU GH|yVi7WFIu diff --git a/textures/chestplate_trim.png b/textures/chestplate_trim.png index 2dea11a6deac7d8d18309e4b016d773744e42281..e0d028e6dffda4492379f4b64dc2e6952b253a83 100644 GIT binary patch delta 10 RcmeyS)yz0Sd9s*j0st0f19kua literal 5494 zcmeHKdsq`!79Xt$Vy&zTmSPJrP?chmNiu{a5D^HEP=l#J0bgY@nS?1J6Ow@hu_y?B zBGgh*sDR}midAd(6F)?dMOv*@#9|Ar-4!T4plW@fU0<}acLGA#x_14(?SI0TA@|(h z`JHor_ndo~Tt!6aG$(|Eu>%obT^)!|UtRD;CAm28h>7Q3lIoj%d$z|B|B9fBpIdKxmUeT{Yw0~_ zww}vqNSkuk`EF|yGoAHtThxuf3(0t|1lm?3^n~qViV)i>r}HN+`@07Oc3(c(6MXsO zPnOSouXjxrlep(AbS>Pr|Iw%A7Yc_QD6iut{+mtej9bO2@_~X&X`9ZTe*f&f&aDLn z-%#_fE>eQlLy z|NK@>RoUTHHKRTHoY|Q!YNSZw6B%JJ?ugY?kf2W%;lzDe&yL0WO z+#@Rv2QK%^b3hjv?reMu3cR>)NBxY|b^VyZ$symXZN1IR=Ib+-Rqv=%zjksW%h~zt z%^nxRcTxfK^lN{4af;pj>;pB@mD{%3r6IRG9e71YXE`YH&pW(s+wy&t*029d-|)ow zq1|2QY9VI$44abqHv1+D1RWnt4w|-g9`~4YWJdz`#Ac5i$H?%KzP^|!B%z~v&#t(< zT${Y2MQvrc*S6YtW4;J)D>AZe3TMuH`N#^mV$1tJKYTv((7`L}W!>Sy4>}Z>JbLfp zl0@QsHCmqV2~k_L>`KR5;gVm@MSic7+~Xn3cjuLVmPtdlB!5mIxtZ}l9ZPOM zek0^YX6e-4;`#yE89C)203PoYq+hH&e^(MCbH_+eG4Bnc4SQbtvoxV ze&f4u*EDVm-FfBy_YDVIPshYHl*WY)<#ZnA94dQsptS4n4L*apcl@_p?+I+qd4$dW z_2lM(&sutx3Qlo@`VYty*LKy#7U>dvn_Iu7^|P?bm`M(q8#2OpwfQRb?5RBu8)|fW z8lAtseRHt(VMo^SwQHq*tuKB%XXV_FyAMt~GkA>Y)%wPOXy7B+%N`k*8ZHdX>fhWt z@oUF6?W#?&9!24=?W16?QkMb8@*3~_Ni#o` z+Rt$8Py{#$ln1X>$A*2IcK(E0@^797&r5sOeu%lwYG*WN-15IKS+-Xw>U}-u;=+4* z7gy&)l`AUZOl3E*6U4_*i{{60a?r=+=;^sv{#7?qGI4TUX5O{BT|ZAK_C4BOIJ@+K zmklxHIP+FUNY57A$z*1CG^zX4ShfI)E9v}ZnqF_0UoQ82=enc>rpHbrx;3HL+B*Tn~lv(2BDHL zW4z_CTpxrd5Miqfc;u>xC~Q?CCQ>o|7ufrm#eg6Qr%;ADNvku8%@U@CR}8+>W)72K zfl!GOW~^Mn2qFzQ17RanCEJOq=St#bCX7Mm! z7J^v>N3E!2IwOVZFr20WTMZrVp%|&oEiVIQ1nqskm z0G)tpt+S%3RDen;6miumu9}4lyg@cTK75vtiwjvkut+UJgnR@M3N6{t`ydWb$Rtc2 z8y>SLv?!$}4N0KA2%U;F8ONrgh$K9cLTTB!0w2Uj;Nt@$0ucfWxMQHVaf1<*InBz2 z**udwo z8x||y#WCvXJWm3TGA#k8oslx6$^Kwb|AF%xF4!>OOB&Lw;z#1i!=vFNNlRFyVlXVn zfEdMwI=M{4ws z+^u25-a({34Rmn=wb-P4YWODrhZzk3us9?R0<8z zzZFe2g}@RnlLkZyTe0|xIkA6>Z&|akL!pAgswyipD<&|!o!2|;edV*+JD`cLzWVB; zxgH+z(-Z~HVJ}s$-#sbi$D^4;(_Q@_%po1=AnYKWOMvHD*4|pc3dw>ar27Nov;GaI CFbuE& diff --git a/textures/coast_armor_trim_smithing_template.png b/textures/coast_armor_trim_smithing_template.png index 28e2c25a44314246dbbd712667fec8e9f5163b8e..2701244fcd95dff6d125f64f1427eaf79e814cf0 100644 GIT binary patch delta 11 ScmaECu#Rbh^5zI}Zbkqb*8`;h literal 6243 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 A+5i9m diff --git a/textures/dune_armor_trim_smithing_template.png b/textures/dune_armor_trim_smithing_template.png index f5e7868131774e2ebd238dc35d65e0ff6e7ce48a..a816e88fd25d67dcc27b9ee72aa74dc3e404e4d5 100644 GIT binary patch delta 10 Rcmca%*uXSFdGc@Zy8sxN1i=6R literal 6360 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 diff --git a/textures/eye_armor_trim_smithing_template.png b/textures/eye_armor_trim_smithing_template.png index afeb95cef1d17d19162624853210eb1af1b9bb70..a9d78dee800d268d34063daf6f78bd68a65a5094 100644 GIT binary patch delta 10 RcmZoS=w+IqJXu!!6#x@J1FHZ4 literal 6151 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 literal 5397 zcmeHKdsr0Z8Xqr6fS@U;EhX!U3d!Dvy|)V@5WDCC!J4<~I6FJLOziF~vxB>fH$X8B zLPdlGv@FX4FXsp$;!{fDB>|xog|H{j*R); z;$t;SuCCtr)z6>Zy*=f4Qp-Qq^nRc_mHbVo@5x;oyL&R@GRcsXIp;c4J(h)cEZtML z;kkyGU)u3ic5&3c;A2nzzzOu<9yE%diSN!{eY0%lyt#bR z5ZUCDtwMjQG;*Q6)P3QtOME^IN}P#;H8km{J{^m+8M_+W5NU{XSm3;sS2= zu{VR`D}R4xW+P%CwRX=P^?6?udA#S@_KBBe_(J?-Les7c&H#ZAYRQcL33-aG{^!km@dB3os zfxS4j=Ss)t-ZOR@xLYe)EzPC-vD4C`tO&0Huk?w6Agul68`amgFFn8F^s*0?Z!yaM zt=W_Q!NI~~YR0Mcg~dYR;Fh>&K5Rz6+Fp~^b+9N?;}2hI+O*a?z)?`b$R2U+wd=Q< zue@_Cr`eb+7E;1Pfyt9+$hKxqiW#0-GIC>+d@B-u`~>n&NkdgG8dt!dv(3U#YnhXt z`^A<|fu_Y*R(ZWqxdkH<&E@AMjaNO3dde5owCF!cpYzdi@3D7vZs<=pKKpUs zi@ni@SC0Ap4C7o_%esq;S$8I+dwraJVRp;2YgSEos;{+g#8poD<-(0hZwMN;29JzP zP(?=G>ln}{r7Jcml%FN|X2&PJ$C~FJs!TnRuq|ZW>ylW%oFzLd{T8M199IJb{J>yN zURFwN?OR97R_9dg_1T-n>>Y8bJ6tZ5gDd>7T(FZP6;I@I2MVMRvM2XJEt!(H&5 z=*;@+g8F^R9rH(y&0M!q30LIm^i#ZAZr1EFmmQjP`g+%`ikr<@M>8^_sMDMR|_%ZBB^r6KN~2?OdQd{2X3n*$_kSE#^xToA%~MMD&ve5*j20w*ky{wFtg-z&#Ww4$1G|KW1Jc9DGC{WgItUt5ih~_&fqJeCB}^PdM`$sQ z-DCkf90bY3?G^-0!6>E{GvH_+5&_```R_yD)61EQQ&(9Ofu_+xRZ$8Sov%zs zptw%vyp_NLu~5qoWot!(P_{rMq3`%YwpNQ`(onsCuZQ(6R4TKTLd+;eQvq@g4tR6| zOdKjjcx(*O@z?^r1O?uDjE(Sw5(H47yim-ABA&!SCm=@GtY|77pb|+D1l3_M8-=BO zwm^trY$+y`u=R)th0#z6EES5KRP;K?A`(;z7R=!dSrUv0r6))eXfNEXBW%{8Aq{TA zk|>0hjV}@l#Nd*Oggl8v%pU^1h>=!M<}@px$AMwzhz^xK4>%D}Znz0CU|fsY;2fYA zMh2z>q($iN0L)H1n2juw#1M)gH3VT)u;^@=G^MktnDT*kkFACd=(*X5 zf$Myfa~}r&6H`($VKe`4JVVeymI#uv5oAg{8Lxd6L#c=JJP162Qgkgr)XB^>0Z=+$j~4>D&fn2-+{d6>omt5wigU`|Uup z-LvBlC}h1JR0W?WVrzw<<^&ifW@{x{K3gK?iNu&tCzil}V7C%_%7&0wgaOn5SZB~& z&UI!64b)%o{n^-(F}k>Ta44I{XTu^549oa@S*VEBzuHVWm)>FT%~nqDL29+kRS!A6 zN6A!lAtt3+EJhq7@7L*G-TW7vi~m54{*}8ctlvA5usA>$CsXk@^FzZw0NBqk7e_I( zm3Ua{u8@9NTn-|TbH5E7aNxY;4jz~TRYEt?-}o7*zP~X7pne?Wk@S5m*JHUJNr6WK zKd!FFay^m)j|6^PUH><^JcnMnF*EqT&jwzon|zOL1ux?s7Ue=K1bL08uVGMe=_Fuu zr&Q`__x527Kd(S&PGkZwjndAEiGup*@7o{m+6*ibRaAsVQjac~?K+M0mAOv6#xJL diff --git a/textures/leggings_trim.png b/textures/leggings_trim.png index 28f2a8a1098c69fa55f58fd2dd1760bfea7bc6ea..8c22023a70b603ee9a6947d5cf39b7026093c668 100644 GIT binary patch delta 10 RcmbQOJ(F>Q@?=%fG5{0Q16Ke5 literal 5531 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 diff --git a/textures/sentry_armor_trim_smithing_template.png b/textures/sentry_armor_trim_smithing_template.png index 3677c51291b4ba3704cfb1f1d57f8cab61ac8128..2e967e86cf6b858b63059b74c1512271df3b8603 100644 GIT binary patch delta 10 RcmZ3l|BG>g^5h$0*8v(t1myq# literal 6063 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 QY+^W`&kXO=l8w-Gx-8J`>eh8KI`m#PVVZU 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 diff --git a/textures/ward_armor_trim_smithing_template.png b/textures/ward_armor_trim_smithing_template.png index 1260cdf58433a2c07a83946e93f5dcfc2d7a02fc..0cb227c9d3c70144dde60d62c08ab67c21f38619 100644 GIT binary patch delta 10 RcmX@0KaFXE^5nB(p8*%p1f&1} literal 6080 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 diff --git a/textures/wild_armor_trim_smithing_template.png b/textures/wild_armor_trim_smithing_template.png index 2422e253897a30c4d95e4d46f3dcc0fe1ee4594b..1d3ba516c3dba400b5c955d1e5a7407916a96a1a 100644 GIT binary patch delta 10 RcmeyXKbvWS@?=)=9{?B$1S9|e literal 6141 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 From 9d1840f4ca2464fbd69ec55711ef24e95a4060f2 Mon Sep 17 00:00:00 2001 From: chmodsayshello Date: Wed, 21 Jun 2023 12:11:04 +0200 Subject: [PATCH 056/982] fix crash (no longer allow blacklisted items) --- mods/ITEMS/mcl_smithing_table/init.lua | 1 + mods/ITEMS/mcl_smithing_table/mod.conf | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/mods/ITEMS/mcl_smithing_table/init.lua b/mods/ITEMS/mcl_smithing_table/init.lua index 9680bb68f..33e118bf3 100644 --- a/mods/ITEMS/mcl_smithing_table/init.lua +++ b/mods/ITEMS/mcl_smithing_table/init.lua @@ -135,6 +135,7 @@ minetest.register_node("mcl_smithing_table:table", { if listname == "upgrade_item" and string.find(stack:get_name(),"mcl_armor:") -- allow any armor piece to go in (in case the player wants to trim them) + and not mcl_armor_trims.blacklisted[stack:get_name()] or listname == "mineral" and mcl_smithing_table.is_smithing_mineral(stack:get_name()) diff --git a/mods/ITEMS/mcl_smithing_table/mod.conf b/mods/ITEMS/mcl_smithing_table/mod.conf index aee93fa65..c38c8ef36 100644 --- a/mods/ITEMS/mcl_smithing_table/mod.conf +++ b/mods/ITEMS/mcl_smithing_table/mod.conf @@ -1,2 +1,2 @@ name = mcl_smithing_table -depends = mcl_colors, mcl_formspec +depends = mcl_colors, mcl_formspec, mcl_armor_trims From d346aa07ee7ad6902a7ec0a0588f278c30962fd8 Mon Sep 17 00:00:00 2001 From: chmodsayshello Date: Sun, 25 Jun 2023 11:54:56 +0200 Subject: [PATCH 057/982] reduce filesize for a FINAL time --- textures/coast_boots.png | Bin 648 -> 139 bytes textures/coast_chestplate.png | Bin 635 -> 155 bytes textures/coast_helmet.png | Bin 651 -> 145 bytes textures/dune_boots.png | Bin 622 -> 115 bytes textures/dune_chestplate.png | Bin 625 -> 147 bytes textures/dune_helmet.png | Bin 674 -> 171 bytes textures/eye_boots.png | Bin 633 -> 127 bytes textures/eye_chestplate.png | Bin 711 -> 208 bytes textures/eye_helmet.png | Bin 603 -> 103 bytes textures/eye_leggings.png | Bin 6072 -> 177 bytes textures/rib_boots.png | Bin 644 -> 126 bytes textures/rib_chestplate.png | Bin 690 -> 154 bytes textures/rib_helmet.png | Bin 667 -> 139 bytes textures/sentry_boots.png | Bin 644 -> 134 bytes textures/sentry_chestplate.png | Bin 689 -> 178 bytes textures/sentry_helmet.png | Bin 656 -> 155 bytes textures/snout_boots.png | Bin 631 -> 124 bytes textures/snout_chestplate.png | Bin 735 -> 203 bytes textures/snout_helmet.png | Bin 636 -> 139 bytes textures/spire_boots.png | Bin 628 -> 129 bytes textures/spire_chestplate.png | Bin 696 -> 184 bytes textures/spire_helmet.png | Bin 681 -> 149 bytes textures/tide_boots.png | Bin 632 -> 123 bytes textures/tide_chestplate.png | Bin 696 -> 170 bytes textures/tide_helmet.png | Bin 683 -> 171 bytes textures/vex_armor_trim_smithing_template.png | Bin 848 -> 258 bytes textures/vex_boots.png | Bin 619 -> 114 bytes textures/vex_chestplate.png | Bin 757 -> 215 bytes textures/vex_helmet.png | Bin 640 -> 125 bytes textures/ward_boots.png | Bin 653 -> 135 bytes textures/ward_chestplate.png | Bin 748 -> 201 bytes textures/ward_helmet.png | Bin 719 -> 202 bytes textures/wild_boots.png | Bin 631 -> 132 bytes textures/wild_chestplate.png | Bin 712 -> 185 bytes textures/wild_helmet.png | Bin 673 -> 155 bytes 35 files changed, 0 insertions(+), 0 deletions(-) diff --git a/textures/coast_boots.png b/textures/coast_boots.png index 8e7ee7bf80a42124b834f5a9853b358d616ba73d..8229876bc29a037f3cb56c212fcab70e6ec6828a 100644 GIT binary patch delta 111 zcmeBR?Pi>yoWT&}>EalY;r#Z}LCymTJgfokr6TSpHToW@O{>tjEX>4Tx04R}tkv&MmKpe$iQ?()$5i5u| zWT-A$5EXIMDionYs1;guFuC*#nlvOSE{=k0!NHHks)LKOt`4q(Aou~|>f)s6A|?JW zDYS_7;J6>}?mh0_0YbING^=eK&~)2O#G+yl*cOPEzVl8%Sb_u* z3d$&;2pbVvb$?PUBxpa{!awNxC2}d`Du9t=0VQaVT|f9A{O;DuPEL49!6?xF;y53} zKwuZBRUGI0*l}tnfd3h|(i{F#6`1)Xz0%OaM?lXuaBVo-o6w3YuHrYq!67h`qwMt-?|<%W?(N?*_5OYUTw-#bQmAp_ z00006VoOIv0RI600RN!9r;`8x010qNS#tmYE+YT{E+YYWr9XB6000McNliru=LQE7 z5EPoY{jmT502y>eSad^gZEa<4bO1wgWnpw>WFU8GbZ8()Nlj2!fese{003V}L_t(& z-tE(|4QYTt3`5bJ#2_9eqj{7Y&6^w*2nrTB{*zKTrIl0x0000000000;2(zV)!ilO zUM8vT9#^)#B$cE}a*w34J+^Bl$$I8F=i2oGj*kLfB_!cjfIXcqSR-SAd5gdR0000< KMNUMnLSTa2M-u%2 diff --git a/textures/coast_chestplate.png b/textures/coast_chestplate.png index 6898fc242816c1383bc07b20e690408a4411d004..d0dfe61c04bb38a8d78e14c7665a70abba866fb2 100644 GIT binary patch delta 127 zcmey(GMjONas@+@r;B4q#=W#`|PJsZE8KHuZ6pP*Op=J?N>bAJ{p|G$0i?Ee2=>S1zs dR~NF{ZDl;4QvSPmNx25d08dvxmvv4FO#t3RHR=EW delta 611 zcmV-p0-XJu0s91yBYy#fX+uL$Nkc;*aB^>EX>4Tx04R}tkv&MmKpe$iQ?()$1q+He zWT-A$5EXIMDionYs1;guFuC*#nlvOSE{=k0!NHHks)LKOt`4q(Aou~|>f)s6A|?JW zDYS_7;J6>}?mh0_0YbING^=eK&~)2O#G+yl*cOPEzVl8%Sb_u* z3d$&;2pbVvb$?PUBxpa{!awNxC2}d`Du9t=0VQaVT|f9A{O;DuPEL49!6?xF;y53} zKwuZBRUGI0*l}tnfd3h|(i{F#6`1)Xz0%OaM?lXuaBVo-o6w3YuHrYq!67h`qwMt-?|<%W?(N?*_5OYUUk7rZ#lLUP z00006VoOIv0RI600RN!9r;`8x010qNS#tmY3ljhU3ljkVnw%H_000McNliru=LQE6 z5C!s1V;TSe0C!15K~!ko?b5*s1R)HC;U{b%uM|tM6iZ7f>BK!{SlEF%4LHpIT?|Sv ziAn$f09*h700000FVS`{Fd~-izx~Wq@4a2+*lxEDV9vQRQ?~VUsU#f*M#QS3Ydy=U xxXvYMjL{zXwK8*^#k=|3IDn(^dQAY^`2v8uH6-;w8X^Dy002ovPDHLkV1n#B64L+x diff --git a/textures/coast_helmet.png b/textures/coast_helmet.png index 4a2050fdd0d7191eff02bbfc83f90a00461edfc7..2529b587b9088a26ae812f860ab0f7648030aeb7 100644 GIT binary patch delta 117 zcmeBXoya&rIgcU2)5S3)!};y`vz!MMc-R8mOGVrZfk@c9Wy+(K+rNE~s}VTCzeI$A zVc*55=!sFU{jTi&KG*QrT+8RD=B}8(caHu0luu!Ap5~oEX>4Tx04R}tkv&MmKpe$iQ?()$5i5u| zWT-A$5EXIMDionYs1;guFuC*#nlvOSE{=k0!NHHks)LKOt`4q(Aou~|>f)s6A|?JW zDYS_7;J6>}?mh0_0YbING^=eK&~)2O#G+yl*cOPEzVl8%Sb_u* z3d$&;2pbVvb$?PUBxpa{!awNxC2}d`Du9t=0VQaVT|f9A{O;DuPEL49!6?xF;y53} zKwuZBRUGI0*l}tnfd3h|(i{F#6`1)Xz0%OaM?lXuaBVo-o6w3YuHrYq!67h`qwMt-?|<%W?(N?*_5OYUTw-#bQmAp_ z00006VoOIv0RI600RN!9r;`8x010qNS#tmYE+YT{E+YYWr9XB6000McNliru=LQE6 zI4PaWp;G_=02y>eSad^gZEa<4bO1wgWnpw>WFU8GbZ8()Nlj2!fese{003f1L_t(& z-tE${4Q#+53`Egm6OZE27>!YG6Vd=8sgjB!|5cWCMu02<008_{IemdzYnLS3lB9@G zM67xm{W7wB=J#3Kw{sq|t2cAD&ws#Mt+l>CATta53jhEB00000A6>cBC4w(BkL3UW N002ovPDHLkV1ngB6%zme diff --git a/textures/dune_boots.png b/textures/dune_boots.png index 3a870b478661cc5a9d5b26121dd01d2074b1cefa..9fba1177211b89e5374b2dcc1918d069c6cd56ef 100644 GIT binary patch delta 86 zcmaFIQanL9fWgYs#W6%e^6f!JMrKDI<^_}EG^Yw_mQMP4gPETJ1b%GWojqxv{>+(b oFYlUqmT&jmwR`SNJBAHq)$ delta 597 zcmV-b0;>IU?gWq{e*uMQLqkwWLqi~Na&Km7Y-IodD3N`UJxIeq9K~N#wIUS}D~LE` zs4iL%6>-!m6rn<>6nNgNw7S4z7YA_yOYT;-u&zCH^ld zw21ZKxF7HCJ?`ECLbb>=t8E<6blXhCqGBq&Dh6KBfdG2Ze~(d_S;m|s#nEzn-NVP% zy9m!}eeTcEt!69+_(bAaW|%hd2J!T!ZE)Tv4zawf5}y-~nRG$oN3JU#zj4mFEbz>b znM}+Rhls^o6Dv*3@}@>SMI2T&o$`g0$13M7&RVg|>i6U?3}*C|Wvu? z$|#@+8xdM{e^M+YXg}J*Kj``;aw+60fRSSXC1{XcKlmT~?$*jqPIyVdDA4}mI3L46 zU>B%W9OwJkacU=k{~5T_8~#!inE52V($K<3K+iUCaoy0AJ>YT&7xW(6#3ER^P|z1CXSy;y1v-Auy7o?DZD!f9`DV?cX!?{(b;lVsf5RsBz)| z000JJOGiWi{{a60|De66lK=n!32;bRa{vG?BLDy{BLR4&KXw2B00(qQO+^Ri1_u%o z12RS{wEzGB8FWQhbVF}#ZDnqB07G(RVRU6=Aa`kWXdp*PO;A^X4i^9b07XeeK~!ko z?b0z3Prxt`1Hm^FLou|6W+-CfR4GCs-mR|HjH&r;B4q#=W;!Hu4@Y;9+*`e-~)M<^E93XX>%gT@n}K*E%iWSj)-) z0nmdKI;Vst06`ZoUjP6A delta 601 zcmV-f0;c_w0r3QoBYy#fX+uL$Nkc;*aB^>EX>4Tx04R}tkv&MmKpe$iQ?()$1q+He zWT-A$5EXIMDionYs1;guFuC*#nlvOSE{=k0!NHHks)LKOt`4q(Aou~|>f)s6A|?JW zDYS_7;J6>}?mh0_0YbING^=eK&~)2O#G+yl*cOPEzVl8%Sb_u* z3d$&;2pbVvb$?PUBxpa{!awNxC2}d`Du9t=0VQaVT|f9A{O;DuPEL49!6?xF;y53} zKwuZBRUGI0*l}tnfd3h|(i{F#6`1)Xz0%OaM?lXuaBVo-o6w3YuHrYq!67h`qwMt-?|<%W?(N?*_5OYUUk7rZ#lLUP z00006VoOIv0RI600RN!9r;`8x010qNS#tmY3ljhU3ljkVnw%H_000McNliru=LQE6 z6c!Sk=fD5}0BuP`K~!ko?bNXiz%U3zQSc;;;!!<{N4ZT%lSt`Okr3&>+C~^oHUj_v z00000fKp~8rKGH=J$^KVlDgjg;d}4A1`rVz5hlszoc?t0Jnx@2zt+mm10L0}t%`2@ n*xonaISJ#9&65QF002!L^nXQQUUm(}00000NkvXXu0mjffrJq^ diff --git a/textures/dune_helmet.png b/textures/dune_helmet.png index ff68b20bc1f85114d30cf803e1121d614304e923..7f3054ced7d808e21ce9a4970bc5329e5b629db7 100644 GIT binary patch delta 144 zcmV;B0B`@I1*-v&BYyyLNklEX>4Tx04R}tkv&MmKpe$iQ?()$5i5u| zWT-A$5EXIMDionYs1;guFuC*#nlvOSE{=k0!NHHks)LKOt`4q(Aou~|>f)s6A|?JW zDYS_7;J6>}?mh0_0YbING^=eK&~)2O#G+yl*cOPEzVl8%Sb_u* z3d$&;2pbVvb$?PUBxpa{!awNxC2}d`Du9t=0VQaVT|f9A{O;DuPEL49!6?xF;y53} zKwuZBRUGI0*l}tnfd3h|(i{F#6`1)Xz0%OaM?lXuaBVo-o6w3YuHrYq!67h`qwMt-?|<%W?(N?*_5OYUTw-#bQmAp_ z00006VoOIv0RI600RN!9r;`8x010qNS#tmYE+YT{E+YYWr9XB6000McNliru=LQE6 zI~oZ#lZF5Q02y>eSad^gZEa<4bO1wgWnpw>WFU8GbZ8()Nlj2!fese{004POL_t(& z-tE>w3V(nw3`Ef=9%PQ5qs>j~N~pRtASM58OA86pv=IxjJ#3H4Gxu1G?Vtf&8&F;R zk_l+t07)dEx(Un8fcCFI^*`e17XN30w!e$Y%pvJj+#L67P13D^dHu`&R#zZ1N9P&P lehBu9Jpcdz0000UPPuDHvvASwoB#j-07*qoLp6^Q;Ta7ig9G^3xhXDvYUHx3vIVCg!0Ei|g A(f|Me delta 608 zcmV-m0-ybV`2>(7e*uMQLqkwWLqi~Na&Km7Y-IodD3N`UJxIeq9K~N#wIUS}D~LE` zs4iL%6>-!m6rn<>6nNgNw7S4z7YA_yOYT;-u&zCH^ld zw21ZKxF7HCJ?`ECLbb>=t8E<6blXhCqGBq&Dh6KBfdG2Ze~(d_S;m|s#nEzn-NVP% zy9m!}eeTcEt!69+_(bAaW|%hd2J!T!ZE)Tv4zawf5}y-~nRG$oN3JU#zj4mFEbz>b znM}+Rhls^o6Dv*3@}@>SMI2T&o$`g0$13M7&RVg|>i6U?3}*C|Wvu? z$|#@+8xdM{e^M+YXg}J*Kj``;aw+60fRSSXC1{XcKlmT~?$*jqPIyVdDA4}mI3L46 zU>B%W9OwJkacU=k{~5T_8~#!inE52V($K<3K+iUCaoy0AJ>YT&7xW(6#3ER^P|z1CXSy;y1v-Auy7o?DZD!f9`DV?cX!?{(b;lVsf5RsBz)| z000JJOGiWi{{a60|De66lK=n!32;bRa{vG?BLDy{BLR4&KXw2B00(qQO+^Ri1_u%p z8X0UAvH$=88FWQhbVF}#ZDnqB07G(RVRU6=Aa`kWXdp*PO;A^X4i^9b08mLpK~!ko z?bERpT7WPJK*3~_jFwR{N=9K6Ho;0;ZPmMmn$M#(000000N~d$vm&B?8{lsFh^Wl` uM4-O+t}(`W`D?DV`hy5<&e{D8z)KwkRo31vQwBD_h7Eq zaYhCRu%8rk%JA6g$oTi)cod&h@9EV{`+4ZfvuXbOra!rSQsR)sV#R(M7g>~;oO>gnp|vd$@?2>`NPQa1nq delta 688 zcmV;h0#E(W0mlW9BYy#fX+uL$Nkc;*aB^>EX>4Tx04R}tkv&MmKpe$iQ?()$1q+He zWT-A$5EXIMDionYs1;guFuC*#nlvOSE{=k0!NHHks)LKOt`4q(Aou~|>f)s6A|?JW zDYS_7;J6>}?mh0_0YbING^=eK&~)2O#G+yl*cOPEzVl8%Sb_u* z3d$&;2pbVvb$?PUBxpa{!awNxC2}d`Du9t=0VQaVT|f9A{O;DuPEL49!6?xF;y53} zKwuZBRUGI0*l}tnfd3h|(i{F#6`1)Xz0%OaM?lXuaBVo-o6w3YuHrYq!67h`qwMt-?|<%W?(N?*_5OYUUk7rZ#lLUP z00006VoOIv0RI600RN!9r;`8x010qNS#tmY3ljhU3ljkVnw%H_000McNliru=LQE6 z3K$_}^%wvE0K-W{K~!ko?bYiEgg^`g;CPj6DJdnTY$+*aN|{b_zxMDr^d5+uIv)s& zi?S0FG=CEj5fKp)5fKrQE1CZNfFz5gnVGfL#yxAT832ojrwo}{?rtQ_-KW!jIg+)s z2cSNE&+Whk_-Sv~5y;FUX}$Mp>k(LM?}#XOe;JQmW#*#|d+%jeG6Dmrv3^$s05!k% zI_qt#uuDeUE1)xS-yZc1a0MxvT4kaRLj48o-!m6rn<>6nNgNw7S4z7YA_yOYT;-u&zCH^ld zw21ZKxF7HCJ?`ECLbb>=t8E<6blXhCqGBq&Dh6KBfdG2Ze~(d_S;m|s#nEzn-NVP% zy9m!}eeTcEt!69+_(bAaW|%hd2J!T!ZE)Tv4zawf5}y-~nRG$oN3JU#zj4mFEbz>b znM}+Rhls^o6Dv*3@}@>SMI2T&o$`g0$13M7&RVg|>i6U?3}*C|Wvu? z$|#@+8xdM{e^M+YXg}J*Kj``;aw+60fRSSXC1{XcKlmT~?$*jqPIyVdDA4}mI3L46 zU>B%W9OwJkacU=k{~5T_8~#!inE52V($K<3K+iUCaoy0AJ>YT&7xW(6#3ER^P|z1CXSy;y1v-Auy7o?DZD!f9`DV?cX!?{(b;lVsf5RsBz)| z000JJOGiWi{{a60|De66lK=n!32;bRa{vG?BLDy{BLR4&KXw2B00(qQO+^Ri1_u%W zC78e7n*aa+8FWQhbVF}#ZDnqB07G(RVRU6=Aa`kWXdp*PO;A^X4i^9b05VBLK~!ko z?a(0sJOD5d1F`q7s#5CYhbCZbAYn&u1^|G6CE2!nyX_`fX8-^I004M%0NBY5z5lQC Qp8x;=07*qoM6N<$f=Q(R*8l(j diff --git a/textures/eye_leggings.png b/textures/eye_leggings.png index 4738ce12f4cd3ab8e2c0af62909363b645b79192..9fadede49993a07f7a61eadae079bc6af0cdf990 100644 GIT binary patch delta 10 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 BCP4rI diff --git a/textures/rib_helmet.png b/textures/rib_helmet.png index cf5826d0c1ffd6c0974486df416e9d6f32899a13..825d543066fb8fe13bfb1c6ec2030d51716f014e 100644 GIT binary patch delta 111 zcmV-#0FeKi1&aZYBWM6pNkl2n0Y&yHY5H&M|fTBTaTg-eFi4004j= zboX@kRMjMzBvVzhjbHWd>(2VGW<1U2D{sD+zE delta 643 zcmV-}0(||80hEX>4Tx04R}tkv&MmKpe$iQ?()$5i5u| zWT-A$5EXIMDionYs1;guFuC*#nlvOSE{=k0!NHHks)LKOt`4q(Aou~|>f)s6A|?JW zDYS_7;J6>}?mh0_0YbING^=eK&~)2O#G+yl*cOPEzVl8%Sb_u* z3d$&;2pbVvb$?PUBxpa{!awNxC2}d`Du9t=0VQaVT|f9A{O;DuPEL49!6?xF;y53} zKwuZBRUGI0*l}tnfd3h|(i{F#6`1)Xz0%OaM?lXuaBVo-o6w3YuHrYq!67h`qwMt-?|<%W?(N?*_5OYUTw-#bQmAp_ z00006VoOIv0RI600RN!9r;`8x010qNS#tmYE+YT{E+YYWr9XB6000McNliru=LQE7 z0~>4Tp|St~02y>eSad^gZEa<4bO1wgWnpw>WFU8GbZ8()Nlj2!fese{0044HL_t(& z-tE${4Sd5e5JORVlN&{&XcUg3Q8WrSkt+jEU?-&u|5pmU!vUfM0002sjkc!`u)QQH ziIPZ?s!CO*<9&>Ad1vo^opV?7cROsaBToaKZot3aOQJdF$E~fkb(j6#V|)A6J^%m! d004kj*#Q>+JE8FvA2a{}002ovPDHLkV1huS9R&aY diff --git a/textures/sentry_boots.png b/textures/sentry_boots.png index 4450ee37445f88d88bae4f42b282c714e5eb9f2d..b72a6cf294c33df75b727eb8129af69db0fb1514 100644 GIT binary patch delta 106 zcmZo+ZDX9EoXp_s>EalYaqsQixqnpS(h`bUw(Z>m$Bz6u9tJRw zx?P>V^y-VPVPWSUmhS(b-G1J3^QZ0Ng7M$?M6Z09d%Soi`-C|LAGsQ*T>z=~boFyt I=akR{02|gVIsgCw delta 620 zcmV-y0+aoQ0fYsRBYy#fX+uL$Nkc;*aB^>EX>4Tx04R}tkv&MmKpe$iQ?()$5i5u| zWT-A$5EXIMDionYs1;guFuC*#nlvOSE{=k0!NHHks)LKOt`4q(Aou~|>f)s6A|?JW zDYS_7;J6>}?mh0_0YbING^=eK&~)2O#G+yl*cOPEzVl8%Sb_u* z3d$&;2pbVvb$?PUBxpa{!awNxC2}d`Du9t=0VQaVT|f9A{O;DuPEL49!6?xF;y53} zKwuZBRUGI0*l}tnfd3h|(i{F#6`1)Xz0%OaM?lXuaBVo-o6w3YuHrYq!67h`qwMt-?|<%W?(N?*_5OYUTw-#bQmAp_ z00006VoOIv0RI600RN!9r;`8x010qNS#tmYE+YT{E+YYWr9XB6000McNliru=LQE7 z7Z}`6CtUyl02y>eSad^gZEa<4bO1wgWnpw>WFU8GbZ8()Nlj2!fese{003J_L_t(& z-tEw_6=lFM2tz@66GmY)Mqw0>!X~6jp3BtcU!_8gBmn>b00000003aHs_Lrh30v12 z_TDW?W+pRR#}SewcVAaNkeQvC{kInpU-!(TL`07rkIOt8C?~j>VSlXv0000((r;B4q#=WIp1GiJtdY{-GE&~$EN?9u3JI<{6YJBHdxQTvdxxMG+B~?cSzFkXyog2=7p-k3v zzvK~P=NH^x8wCTmW&h>3e)nhQuiMfL|8g0h9h)F3u(+~D5oEBZtDnm{r-UW|9Zo?1 delta 666 zcmV;L0%iTO0kH*;BYy#fX+uL$Nkc;*aB^>EX>4Tx04R}tkv&MmKpe$iQ?()$5i5u| zWT-A$5EXIMDionYs1;guFuC*#nlvOSE{=k0!NHHks)LKOt`4q(Aou~|>f)s6A|?JW zDYS_7;J6>}?mh0_0YbING^=eK&~)2O#G+yl*cOPEzVl8%Sb_u* z3d$&;2pbVvb$?PUBxpa{!awNxC2}d`Du9t=0VQaVT|f9A{O;DuPEL49!6?xF;y53} zKwuZBRUGI0*l}tnfd3h|(i{F#6`1)Xz0%OaM?lXuaBVo-o6w3YuHrYq!67h`qwMt-?|<%W?(N?*_5OYUTw-#bQmAp_ z00006VoOIv0RI600RN!9r;`8x010qNS#tmYE+YT{E+YYWr9XB6000McNliru=LQE6 zA2cKgfA0VQ02y>eSad^gZEa<4bO1wgWnpw>WFU8GbZ8()Nlj2!fese{004+dL_t(& z-tE)T34g;d3`J2plXw)5;!!k;M$ss56ZI>Q213#_DJk6ZV~mVJ&vGdM000000002s z=_KWu+S>HT0i3E4z%K%jl*=((@4w~lxz(hZO_GYc=VSipk>Mw&=fBw*UYD07*qoM6N<$f`imA A3;+NC diff --git a/textures/sentry_helmet.png b/textures/sentry_helmet.png index aa20bdc29d5def83c5d96c69e04110cf398d989b..eded069db4223bfa20d9f9753052a58c827e4859 100644 GIT binary patch delta 127 zcmbQhI-7BVas@+@r;B4q#=W}cl=)xQuwgu zsRaWAL&NpZsk?6*Kc4w9>b2FRIhLNcW1sE59s1PY*2>#HGUk%lBfXR)wG1V-xTcS9 ef$Bk8>Ma@XvBfO(VD-%e@jYGrT-G@yGywqAnKQ}& delta 632 zcmV-;0*C#Z0gwfdBYy#fX+uL$Nkc;*aB^>EX>4Tx04R}tkv&MmKpe$iQ?()$5i5u| zWT-A$5EXIMDionYs1;guFuC*#nlvOSE{=k0!NHHks)LKOt`4q(Aou~|>f)s6A|?JW zDYS_7;J6>}?mh0_0YbING^=eK&~)2O#G+yl*cOPEzVl8%Sb_u* z3d$&;2pbVvb$?PUBxpa{!awNxC2}d`Du9t=0VQaVT|f9A{O;DuPEL49!6?xF;y53} zKwuZBRUGI0*l}tnfd3h|(i{F#6`1)Xz0%OaM?lXuaBVo-o6w3YuHrYq!67h`qwMt-?|<%W?(N?*_5OYUTw-#bQmAp_ z00006VoOIv0RI600RN!9r;`8x010qNS#tmYE+YT{E+YYWr9XB6000McNliru=LQE7 z1TO_0!@vLl02y>eSad^gZEa<4bO1wgWnpw>WFU8GbZ8()Nlj2!fese{003u6L_t(& z-tEw_5plpE5CcKciAtjsN})7$f)hXE%&9%xCOkv(oCE*>fHSo(Ez^5nwq;wA_F1#- zCP_(FlKob55+%``v;8K(7-N6tZSf@Qj?vyiJ_Au-YL;wH)00000XSe`^1}cKd Svxn~h0000rRY xR3M(7-hcP4{G0xP(`GuiY~PkN-17pd@^tlcS?83{1OW9TD=+{6 delta 606 zcmV-k0-^nU_XLn5e*uMQLqkwWLqi~Na&Km7Y-IodD3N`UJxIeq9K~N#wIUS}D~LE` zs4iL%6>-!m6rn<>6nNgNw7S4z7YA_yOYT;-u&zCH^ld zw21ZKxF7HCJ?`ECLbb>=t8E<6blXhCqGBq&Dh6KBfdG2Ze~(d_S;m|s#nEzn-NVP% zy9m!}eeTcEt!69+_(bAaW|%hd2J!T!ZE)Tv4zawf5}y-~nRG$oN3JU#zj4mFEbz>b znM}+Rhls^o6Dv*3@}@>SMI2T&o$`g0$13M7&RVg|>i6U?3}*C|Wvu? z$|#@+8xdM{e^M+YXg}J*Kj``;aw+60fRSSXC1{XcKlmT~?$*jqPIyVdDA4}mI3L46 zU>B%W9OwJkacU=k{~5T_8~#!inE52V($K<3K+iUCaoy0AJ>YT&7xW(6#3ER^P|z1CXSy;y1v-Auy7o?DZD!f9`DV?cX!?{(b;lVsf5RsBz)| z000JJOGiWi{{a60|De66lK=n!32;bRa{vG?BLDy{BLR4&KXw2B00(qQO+^Ri1_u%t zDw6tLNsc&n spL4EVwyN4&-m2;uXy-9T_cOp>-Csi-gc8oWlK=n!07*qoM6N<$f{@D&7XSbN diff --git a/textures/snout_chestplate.png b/textures/snout_chestplate.png index 53800de7d7394eabc3a371198dfaf9d16c7f465b..7256d70314913defc728fd588b0f9e353292ca85 100644 GIT binary patch delta 176 zcmcc5dYW;9ay`Q&PZ!6KjC*gd9^`FM;Bg3aOBHcT1R`Nye$yp_9wt)V|L2AXWUdro zVt{}Lzr8eXPc_?q@LE*=f}(S`br>(DzvPl&-4XL)89|Q;%odj!|_~*Q^uUVw3&*=8~I+civxkYyZ1D bnbYs>V)+e6Yx_i)K^A(t`njxgN@xNAu}n)2 delta 712 zcmV;(0yq830pA6XBYy#fX+uL$Nkc;*aB^>EX>4Tx04R}tkv&MmKpe$iQ?()$5i5u| zWT-A$5EXIMDionYs1;guFuC*#nlvOSE{=k0!NHHks)LKOt`4q(Aou~|>f)s6A|?JW zDYS_7;J6>}?mh0_0YbING^=eK&~)2O#G+yl*cOPEzVl8%Sb_u* z3d$&;2pbVvb$?PUBxpa{!awNxC2}d`Du9t=0VQaVT|f9A{O;DuPEL49!6?xF;y53} zKwuZBRUGI0*l}tnfd3h|(i{F#6`1)Xz0%OaM?lXuaBVo-o6w3YuHrYq!67h`qwMt-?|<%W?(N?*_5OYUTw-#bQmAp_ z00006VoOIv0RI600RN!9r;`8x010qNS#tmYE+YT{E+YYWr9XB6000McNliru=LQE6 zA{7FOCl3Gs02y>eSad^gZEa<4bO1wgWnpw>WFU8GbZ8()Nlj2!fese{006d0L_t(& z-tE)T4S$0$3xQ_kINfiWzo^i?U&DTx^-<4Hx0ICBitrlmPuiaRb($UNS N1fH&bF6*2UngFdjD*^xj delta 612 zcmV-q0-ODd0sI7zBYy#fX+uL$Nkc;*aB^>EX>4Tx04R}tkv&MmKpe$iQ?()$5i5u| zWT-A$5EXIMDionYs1;guFuC*#nlvOSE{=k0!NHHks)LKOt`4q(Aou~|>f)s6A|?JW zDYS_7;J6>}?mh0_0YbING^=eK&~)2O#G+yl*cOPEzVl8%Sb_u* z3d$&;2pbVvb$?PUBxpa{!awNxC2}d`Du9t=0VQaVT|f9A{O;DuPEL49!6?xF;y53} zKwuZBRUGI0*l}tnfd3h|(i{F#6`1)Xz0%OaM?lXuaBVo-o6w3YuHrYq!67h`qwMt-?|<%W?(N?*_5OYUTw-#bQmAp_ z00006VoOIv0RI600RN!9r;`8x010qNS#tmYE+YT{E+YYWr9XB6000McNliru=LQE7 z1_A5+tc?Hw02y>eSad^gZEa<4bO1wgWnpw>WFU8GbZ8()Nlj2!fese{002`-L_t(& z-tEw_4PAsl5Cp*!`amx94P`@_Ob!blA;cq8Bjb! y1Cop+k9U4=I-tA9obz&{yKg%Z0001hui60spDTe37@RBs00003yin!9DJ-;mzm7~ z1_gbqcDbcLdvou%algxvGq>LV&3xUlUHwg6sZ9a%=ZX4-8#{emKq@_5{an^LB{Ts5 D0lqCo delta 604 zcmV-i0;Bzb0rUirBYy#fX+uL$Nkc;*aB^>EX>4Tx04R}tkv&MmKpe$iQ?()$5i5u| zWT-A$5EXIMDionYs1;guFuC*#nlvOSE{=k0!NHHks)LKOt`4q(Aou~|>f)s6A|?JW zDYS_7;J6>}?mh0_0YbING^=eK&~)2O#G+yl*cOPEzVl8%Sb_u* z3d$&;2pbVvb$?PUBxpa{!awNxC2}d`Du9t=0VQaVT|f9A{O;DuPEL49!6?xF;y53} zKwuZBRUGI0*l}tnfd3h|(i{F#6`1)Xz0%OaM?lXuaBVo-o6w3YuHrYq!67h`qwMt-?|<%W?(N?*_5OYUTw-#bQmAp_ z00006VoOIv0RI600RN!9r;`8x010qNS#tmYE+YT{E+YYWr9XB6000McNliru=LQE7 z87hh!TT=i402y>eSad^gZEa<4bO1wgWnpw>WFU8GbZ8()Nlj2!fese{002u#L_t(& z-tEw_4OM_Z34N&kMf&@3JN3!0PdP7avCQA000000D%8kYfX}L_aw>Q``WvE qs%olg&ip=K?JV*1gs1yYlm`y;kuPzSXx9?}0000)6r;B4q#=W zX0MRFm)FXp66-IxT{V|po?o`+m&mTd>er8JxA8I5h^=H^DB3*LEq8qr$aGIvKbLh* G2~7aS{6k#; delta 673 zcmV;S0$%;N0k{Q_BYy#fX+uL$Nkc;*aB^>EX>4Tx04R}tkv&MmKpe$iQ?()$5i5u| zWT-A$5EXIMDionYs1;guFuC*#nlvOSE{=k0!NHHks)LKOt`4q(Aou~|>f)s6A|?JW zDYS_7;J6>}?mh0_0YbING^=eK&~)2O#G+yl*cOPEzVl8%Sb_u* z3d$&;2pbVvb$?PUBxpa{!awNxC2}d`Du9t=0VQaVT|f9A{O;DuPEL49!6?xF;y53} zKwuZBRUGI0*l}tnfd3h|(i{F#6`1)Xz0%OaM?lXuaBVo-o6w3YuHrYq!67h`qwMt-?|<%W?(N?*_5OYUTw-#bQmAp_ z00006VoOIv0RI600RN!9r;`8x010qNS#tmYE+YT{E+YYWr9XB6000McNliru=LQE6 zB^^T(Ir;zq02y>eSad^gZEa<4bO1wgWnpw>WFU8GbZ8()Nlj2!fese{0056kL_t(& z-tE-E34g;d4259@I*3Q{XdcC*yiwjJ>ZJuI#3U5bAhz}gzeQjBPqwYTMCwxw$pY>%3q6_HGh=vJA_;89ez~Mc3}Ui^>sy3+o$$MrIaY8 zEN8CxqXy7g%dxpy>vRC0r?F~!FUEFAN=eaLTN?NU0bJz`E5L7Y?*oEV00000NkvXX Hu0mjf_1-Nn diff --git a/textures/spire_helmet.png b/textures/spire_helmet.png index 67619c3e959010b23624d784a380b405db36a811..6f11bb0a76d9f3207ce94d94d511d1fb1bc58187 100644 GIT binary patch delta 121 zcmV-<0EYjm1(gAiBXR&-NklEX>4Tx04R}tkv&MmKpe$iQ?()$5i5u| zWT-A$5EXIMDionYs1;guFuC*#nlvOSE{=k0!NHHks)LKOt`4q(Aou~|>f)s6A|?JW zDYS_7;J6>}?mh0_0YbING^=eK&~)2O#G+yl*cOPEzVl8%Sb_u* z3d$&;2pbVvb$?PUBxpa{!awNxC2}d`Du9t=0VQaVT|f9A{O;DuPEL49!6?xF;y53} zKwuZBRUGI0*l}tnfd3h|(i{F#6`1)Xz0%OaM?lXuaBVo-o6w3YuHrYq!67h`qwMt-?|<%W?(N?*_5OYUTw-#bQmAp_ z00006VoOIv0RI600RN!9r;`8x010qNS#tmYE+YT{E+YYWr9XB6000McNliru=LQE7 z2N0N6y*>Z{02y>eSad^gZEa<4bO1wgWnpw>WFU8GbZ8()Nlj2!fese{004kVL_t(& z-tE+}4Sxh73`EhPlPSfeP#UGU6nDZUXNi?Axo89ai;xW#wh$5k0Klcj+ZR}C?TC;h z*&ZD`_t=*0$GNIfRXt*J&hgD{Ny^N}*{z@PY^|^%o&W#< diff --git a/textures/tide_boots.png b/textures/tide_boots.png index a0f9ada88483c6baca4946bc5c4046f3b6b23630..7dfddcdd0543dbb9fd4b9e387bba126956653e43 100644 GIT binary patch delta 94 zcmeytQawRAg2Bnt#W5t~-rGx#yax<;m=8GdPjN7uVstWYwi!q8dlmaXTla`DfWe%F wyO-})KRJ2tcNu%1Nh??RzuS24ZtH{VdKz1FKRR!b+yGML>FVdQ&MBb@02dP{82|tP delta 607 zcmV-l0-*hS_ymw6e*uMQLqkwWLqi~Na&Km7Y-IodD3N`UJxIeq9K~N#wIUS}D~LE` zs4iL%6>-!m6rn<>6nNgNw7S4z7YA_yOYT;-u&zCH^ld zw21ZKxF7HCJ?`ECLbb>=t8E<6blXhCqGBq&Dh6KBfdG2Ze~(d_S;m|s#nEzn-NVP% zy9m!}eeTcEt!69+_(bAaW|%hd2J!T!ZE)Tv4zawf5}y-~nRG$oN3JU#zj4mFEbz>b znM}+Rhls^o6Dv*3@}@>SMI2T&o$`g0$13M7&RVg|>i6U?3}*C|Wvu? z$|#@+8xdM{e^M+YXg}J*Kj``;aw+60fRSSXC1{XcKlmT~?$*jqPIyVdDA4}mI3L46 zU>B%W9OwJkacU=k{~5T_8~#!inE52V($K<3K+iUCaoy0AJ>YT&7xW(6#3ER^P|z1CXSy;y1v-Auy7o?DZD!f9`DV?cX!?{(b;lVsf5RsBz)| z000JJOGiWi{{a60|De66lK=n!32;bRa{vG?BLDy{BLR4&KXw2B00(qQO+^Ri1_u%v zE~Z<|i2wiq8FWQhbVF}#ZDnqB07G(RVRU6=Aa`kWXdp*PO;A^X4i^9b08dFoK~!ko z?b5LgS%5GM1VCq#A1$M06pxZkpaO}40T6ec|GSr~00000007_@##-yBs!DQ)Nh-jbb*4g+!ei=_Yn002ovPDHLkV1li@4s8Gc diff --git a/textures/tide_chestplate.png b/textures/tide_chestplate.png index cb01eef8d046b9bb36da1835841bfe48a6517988..1cbf82aa1884deb418bae92684448e929ecb2331 100644 GIT binary patch delta 143 zcmdnNx{7gvay>(#r;B4q#=WUujHr;{&v}7o%5J@THZ8Vw`;VJ3o;zP(m$`e< r$hvaTPwn;#w=>xaxIHb4!w)ide5{J;(|`E~WFm*BtDnm{r-UW|50gEx delta 673 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 Ef-`7;^8f$< diff --git a/textures/vex_boots.png b/textures/vex_boots.png index 7194840b0bf1033d3355e8b74fa6c994c412b488..08370b6c75a6f24381bfd9dee41d42fe030a57d5 100644 GIT binary patch delta 85 zcmaFOQZzx?pTW}8#W5t~-rEa|j0_4qhYgm*a|NkA^>a8O#QxTj0R$Yj-mUeF``S>Q m|Gq(mErfrDBy-kd&CiSp){13q&siiuYCK*2T-G@yGywqpa2);s delta 594 zcmV-Y0jaP^e*uMQLqkwWLqi~Na&Km7Y-IodD3N`UJxIeq9K~N#wIUS}D~LE` zs4iL%6>-!m6rn<>6nNgNw7S4z7YA_yOYT;-u&zCH^ld zw21ZKxF7HCJ?`ECLbb>=t8E<6blXhCqGBq&Dh6KBfdG2Ze~(d_S;m|s#nEzn-NVP% zy9m!}eeTcEt!69+_(bAaW|%hd2J!T!ZE)Tv4zawf5}y-~nRG$oN3JU#zj4mFEbz>b znM}+Rhls^o6Dv*3@}@>SMI2T&o$`g0$13M7&RVg|>i6U?3}*C|Wvu? z$|#@+8xdM{e^M+YXg}J*Kj``;aw+60fRSSXC1{XcKlmT~?$*jqPIyVdDA4}mI3L46 zU>B%W9OwJkacU=k{~5T_8~#!inE52V($K<3K+iUCaoy0AJ>YT&7xW(6#3ER^P|z1CXSy;y1v-Auy7o?DZD!f9`DV?cX!?{(b;lVsf5RsBz)| z000JJOGiWi{{a60|De66lK=n!32;bRa{vG?BLDy{BLR4&KXw2B00(qQO+^Ri1_u%w zFUUvDUH||98FWQhbVF}#ZDnqB07G(RVRU6=Aa`kWXdp*PO;A^X4i^9b076MbK~!ko z?bQJdOu#@40>ExcD-|hq@^kP4);k9f5~=_I0001h)n?`-IUBORmlA4i0b9af7qGg3 gBo@%!k2~Q1KD)UOib;M4-2eap07*qoM6N<$f;Yzm-~a#s diff --git a/textures/vex_chestplate.png b/textures/vex_chestplate.png index 2abda74f2dcdc77ce9bfe70426aab3c0490493b1..50d29ec6c8d5af873c2048b11436c49fb165b2b3 100644 GIT binary patch delta 188 zcmey$dYy5Cay`R5PZ!6KjC*gVc5@z35OB6$wb-Hyh-OCwafoDlJ93HMZ*F+;P<`I> zZHx>saG<*A+}2RdrP~T$O|JTQ>F%EW<_gCmoH^RBOp6k(Dd^w+QFCdx;;YLyrbHH+ zJ*@e${Kvdyby8*r&G+Th259x4dHDQcPLbQ*oedXFx3*tQTkiifka^jPC-G7jehW=s n#po^lfN9$r#(!M@_Z*kyeEVeUnjNwJAiF(X{an^LB{Ts5OBq*+ delta 734 zcmV<40wMj^0rdrtBYy#fX+uL$Nkc;*aB^>EX>4Tx04R}tkv&MmKpe$iQ?()$5i5u| zWT-A$5EXIMDionYs1;guFuC*#nlvOSE{=k0!NHHks)LKOt`4q(Aou~|>f)s6A|?JW zDYS_7;J6>}?mh0_0YbING^=eK&~)2O#G+yl*cOPEzVl8%Sb_u* z3d$&;2pbVvb$?PUBxpa{!awNxC2}d`Du9t=0VQaVT|f9A{O;DuPEL49!6?xF;y53} zKwuZBRUGI0*l}tnfd3h|(i{F#6`1)Xz0%OaM?lXuaBVo-o6w3YuHrYq!67h`qwMt-?|<%W?(N?*_5OYUTw-#bQmAp_ z00006VoOIv0RI600RN!9r;`8x010qNS#tmYE+YT{E+YYWr9XB6000McNliru=LQE6 zDi1d@RDA#d02y>eSad^gZEa<4bO1wgWnpw>WFU8GbZ8()Nlj2!fese{007KML_t(& z-tE@W4S$0$3L4D)qcDm`$tW4+HgSIl0!oBbXiJ-WKS)vJC?{hOAtE9oA|fIp zA|mQYI$EHV66-Zp6;)l-1`y+OvyPdit-9;=v)xY!V7ip5*2@Ths38Cd08&bkc?fmC zsy+n?pc&SsI$(>thnY-!m6rn<>6nNgNw7S4z7YA_yOYT;-u&zCH^ld zw21ZKxF7HCJ?`ECLbb>=t8E<6blXhCqGBq&Dh6KBfdG2Ze~(d_S;m|s#nEzn-NVP% zy9m!}eeTcEt!69+_(bAaW|%hd2J!T!ZE)Tv4zawf5}y-~nRG$oN3JU#zj4mFEbz>b znM}+Rhls^o6Dv*3@}@>SMI2T&o$`g0$13M7&RVg|>i6U?3}*C|Wvu? z$|#@+8xdM{e^M+YXg}J*Kj``;aw+60fRSSXC1{XcKlmT~?$*jqPIyVdDA4}mI3L46 zU>B%W9OwJkacU=k{~5T_8~#!inE52V($K<3K+iUCaoy0AJ>YT&7xW(6#3ER^P|z1CXSy;y1v-Auy7o?DZD!f9`DV?cX!?{(b;lVsf5RsBz)| z000JJOGiWi{{a60|De66lK=n!32;bRa{vG?BLDy{BLR4&KXw2B00(qQO+^Ri1_u%e zI^AwrW&i*H8FWQhbVF}#ZDnqB07G(RVRU6=Aa`kWXdp*PO;A^X4i^9b09Q#wK~!ko z?a{FfVFE!6ML|O)E@ew|DK2G8aVJZ3NQ4lb#7yYuKRE&b0D%AVxbwKGI++=n8EdVN zt$Xh?Gchw!RX=w;@BX1Hvb)c9>+W|v0002Mw_b9Q9zy3ZHRk{T002ovPDHLkV1lq( B577Vs diff --git a/textures/ward_boots.png b/textures/ward_boots.png index 48b10bd15478a588e232f4f224f0c831c4343cc5..6616f3b5c0314def1a5612909438c48694a94adf 100644 GIT binary patch delta 107 zcmeBWZD*XIoWkJe>EalYaqsQrgPaVCJS-00Tc=E!6m;pPELW5149N(QN5@@{Gl0Ph zE#v*GZe>Ovh`KF);ng9*jhnxH7q{4K`TU$^@%j0>OYeFwSSc^J*`@Q|)4lsaIy_zd KT-G@yGywoDb1l07 delta 629 zcmV-*0*d{I0gVNaBYy#fX+uL$Nkc;*aB^>EX>4Tx04R}tkv&MmKpe$iQ?()$5i5u| zWT-A$5EXIMDionYs1;guFuC*#nlvOSE{=k0!NHHks)LKOt`4q(Aou~|>f)s6A|?JW zDYS_7;J6>}?mh0_0YbING^=eK&~)2O#G+yl*cOPEzVl8%Sb_u* z3d$&;2pbVvb$?PUBxpa{!awNxC2}d`Du9t=0VQaVT|f9A{O;DuPEL49!6?xF;y53} zKwuZBRUGI0*l}tnfd3h|(i{F#6`1)Xz0%OaM?lXuaBVo-o6w3YuHrYq!67h`qwMt-?|<%W?(N?*_5OYUTw-#bQmAp_ z00006VoOIv0RI600RN!9r;`8x010qNS#tmYE+YT{E+YYWr9XB6000McNliru=LQE7 z95fAMl63$802y>eSad^gZEa<4bO1wgWnpw>WFU8GbZ8()Nlj2!fese{003l3L_t(& z-tE-E32wkJ3`0?+lVp^PlF>ApH*rtyp_C2~{|6?ZoFYsl0000000000fF{N}u$^;G zNzz(toL<276?S;|ZvmZ37`8JaBuTaUbw7#LZY5v&8+9kM>rnOnwrhLY zZb-hBjoTBqM*2qmhNtWN4yYgBVb*l&YhJF_R;TkK>h?!jZsaFSPB6E3O;lEEcS~Hu YS|GXjB!}~~(;(|SUHx3vIVCg!09K+%X#fBK delta 725 zcmV;`0xJE<0qg~kBYy#fX+uL$Nkc;*aB^>EX>4Tx04R}tkv&MmKpe$iQ?()$5i5u| zWT-A$5EXIMDionYs1;guFuC*#nlvOSE{=k0!NHHks)LKOt`4q(Aou~|>f)s6A|?JW zDYS_7;J6>}?mh0_0YbING^=eK&~)2O#G+yl*cOPEzVl8%Sb_u* z3d$&;2pbVvb$?PUBxpa{!awNxC2}d`Du9t=0VQaVT|f9A{O;DuPEL49!6?xF;y53} zKwuZBRUGI0*l}tnfd3h|(i{F#6`1)Xz0%OaM?lXuaBVo-o6w3YuHrYq!67h`qwMt-?|<%W?(N?*_5OYUTw-#bQmAp_ z00006VoOIv0RI600RN!9r;`8x010qNS#tmYE+YT{E+YYWr9XB6000McNliru=LQE6 zEHh3Ak9+_C02y>eSad^gZEa<4bO1wgWnpw>WFU8GbZ8()Nlj2!fese{006^DL_t(& z-tE-O4S$0`3D7S|4#LNK#7o-f(j zExU}sQu?p7Fv%K=y$J(mhG7`mvu`pJB-=*=a8CE?y(1#-ES^ySj`Y^uH0djN~7XfoXA0};-00000NkvXX Hu0mjf@U}r_ diff --git a/textures/ward_helmet.png b/textures/ward_helmet.png index 83b169ba697402baed0a221bdfec6378e56fa5ce..a28ee2ecd85e6479d0941d402a4368f6bfafc17e 100644 GIT binary patch delta 175 zcmX@ldWvy^ay`RDPZ!6KjC*gd9OOKpz~d0;UM%8X2twu?T|7>zT7C)0{mJjNFzd(` zHB|{kMRn+~QM&)3P^c8RY`*H{EX>4Tx04R}tkv&MmKpe$iQ?()$5i5u| zWT-A$5EXIMDionYs1;guFuC*#nlvOSE{=k0!NHHks)LKOt`4q(Aou~|>f)s6A|?JW zDYS_7;J6>}?mh0_0YbING^=eK&~)2O#G+yl*cOPEzVl8%Sb_u* z3d$&;2pbVvb$?PUBxpa{!awNxC2}d`Du9t=0VQaVT|f9A{O;DuPEL49!6?xF;y53} zKwuZBRUGI0*l}tnfd3h|(i{F#6`1)Xz0%OaM?lXuaBVo-o6w3YuHrYq!67h`qwMt-?|<%W?(N?*_5OYUTw-#bQmAp_ z00006VoOIv0RI600RN!9r;`8x010qNS#tmYE+YT{E+YYWr9XB6000McNliru=LQE7 z3p194gFpZP02y>eSad^gZEa<4bO1wgWnpw>WFU8GbZ8()Nlj2!fese{005>*L_t(& z-tE=V34a4241nQSI!H#zD30PNj*?NbiG8x%$=O2hK@0!)5+RtA5Iqq90JaqoZI*NQ zcDMfH4;nDdsVWnKo6_n7m{~iH^BDVj9QTMgU5~yVW8ZIPVrK7s?k*9rz5!jWwW+GO zyOdJWr$^7srg?W4Rh67`y84EQT;{fDz%j0>u`x_3rLCy-+^q=_A+^?@Ml|Q#_%#9m e00000eDMOfTvnfFQx!b`0000*eoFAmyH}elF{r5}E*Z CKPoZ+ delta 607 zcmV-l0-*hb0rv!uBYy#fX+uL$Nkc;*aB^>EX>4Tx04R}tkv&MmKpe$iQ?()$5i5u| zWT-A$5EXIMDionYs1;guFuC*#nlvOSE{=k0!NHHks)LKOt`4q(Aou~|>f)s6A|?JW zDYS_7;J6>}?mh0_0YbING^=eK&~)2O#G+yl*cOPEzVl8%Sb_u* z3d$&;2pbVvb$?PUBxpa{!awNxC2}d`Du9t=0VQaVT|f9A{O;DuPEL49!6?xF;y53} zKwuZBRUGI0*l}tnfd3h|(i{F#6`1)Xz0%OaM?lXuaBVo-o6w3YuHrYq!67h`qwMt-?|<%W?(N?*_5OYUTw-#bQmAp_ z00006VoOIv0RI600RN!9r;`8x010qNS#tmYE+YT{E+YYWr9XB6000McNliru=LQE7 z9WWCWXDt8#02y>eSad^gZEa<4bO1wgWnpw>WFU8GbZ8()Nlj2!fese{002%&L_t(& z-tE${30S~D3`0@fCLUFzcrBYi((RA3hI6M1ueT002ovPDHLkV1lwg3h@8{ diff --git a/textures/wild_chestplate.png b/textures/wild_chestplate.png index 0994d9c48c4db885b7ecd3f80deb128db083470b..9b092ef4525fb7ce45d3b7fd043fdea382b7343c 100644 GIT binary patch delta 158 zcmX@Xx|4B&ay>(Xr;B4q#=W;!4{{z*;Au^CFP+l!NTctOn&x`}jZ0rHOuqHM*`Zta zi>jA5BLftymQMaLeQWZUdzUAyHMP&X^*Q9e)2x~D!Xe*hZPQvOy6@Vowkxw{ZMf<; zqdD*M!&fCG(V~j;&gJ;{m)7f7*S+2>Gr8yFzfa*)-?EA8JYlkM?hjU2{%<|Va8Fl1 Jmvv4FO#q}qNcI2# delta 689 zcmV;i0#5z80mucABYy#fX+uL$Nkc;*aB^>EX>4Tx04R}tkv&MmKpe$iQ?()$5i5u| zWT-A$5EXIMDionYs1;guFuC*#nlvOSE{=k0!NHHks)LKOt`4q(Aou~|>f)s6A|?JW zDYS_7;J6>}?mh0_0YbING^=eK&~)2O#G+yl*cOPEzVl8%Sb_u* z3d$&;2pbVvb$?PUBxpa{!awNxC2}d`Du9t=0VQaVT|f9A{O;DuPEL49!6?xF;y53} zKwuZBRUGI0*l}tnfd3h|(i{F#6`1)Xz0%OaM?lXuaBVo-o6w3YuHrYq!67h`qwMt-?|<%W?(N?*_5OYUTw-#bQmAp_ z00006VoOIv0RI600RN!9r;`8x010qNS#tmYE+YT{E+YYWr9XB6000McNliru=LQE6 zE;eSad^gZEa<4bO1wgWnpw>WFU8GbZ8()Nlj2!fese{005s!L_t(& z-tE)T34g;d3p#Q>=B|!`f z4ePH)g=gn}y;t62Se8DM#u)UIDdr5@ix%c~;KwM8(KbLh*2~7Y)k~wq$ delta 650 zcmV;50(JeH0igwuBYy#fX+uL$Nkc;*aB^>EX>4Tx04R}tkv&MmKpe$iQ?()$5i5u| zWT-A$5EXIMDionYs1;guFuC*#nlvOSE{=k0!NHHks)LKOt`4q(Aou~|>f)s6A|?JW zDYS_7;J6>}?mh0_0YbING^=eK&~)2O#G+yl*cOPEzVl8%Sb_u* z3d$&;2pbVvb$?PUBxpa{!awNxC2}d`Du9t=0VQaVT|f9A{O;DuPEL49!6?xF;y53} zKwuZBRUGI0*l}tnfd3h|(i{F#6`1)Xz0%OaM?lXuaBVo-o6w3YuHrYq!67h`qwMt-?|<%W?(N?*_5OYUTw-#bQmAp_ z00006VoOIv0RI600RN!9r;`8x010qNS#tmYE+YT{E+YYWr9XB6000McNliru=LQE7 z3^_Rv{Fwj%02y>eSad^gZEa<4bO1wgWnpw>WFU8GbZ8()Nlj2!fese{004MNL_t(& z-tE${5q|_B2!-KCCzN6-lwv8AVkvauCa$v=TyWX#_oX{VfeX3jf^ ks@h=y000000N^wib@MEP+w%AD00000NkvXXt^-0~g52vO`Tzg` From 2cf518363841c0d714f46e5bb652e9044975ba2b Mon Sep 17 00:00:00 2001 From: codiac Date: Tue, 25 Jul 2023 13:44:28 +1000 Subject: [PATCH 058/982] Import villager trade changes by Alessandra_Lozoya --- mods/ENTITIES/mobs_mc/villager.lua | 390 +++++++++++++++++++---------- 1 file changed, 263 insertions(+), 127 deletions(-) diff --git a/mods/ENTITIES/mobs_mc/villager.lua b/mods/ENTITIES/mobs_mc/villager.lua index 8fc18ccab..b5c8efcd8 100644 --- a/mods/ENTITIES/mobs_mc/villager.lua +++ b/mods/ENTITIES/mobs_mc/villager.lua @@ -101,28 +101,32 @@ local professions = { jobsite = "mcl_composters:composter", trades = { { - { { "mcl_farming:wheat_item", 18, 22, }, E1 }, - { { "mcl_farming:potato_item", 15, 19, }, E1 }, - { { "mcl_farming:carrot_item", 15, 19, }, E1 }, - { E1, { "mcl_farming:bread", 2, 4 } }, + { { "mcl_farming:wheat_item", 20, 20, }, E1 }, + { { "mcl_farming:potato_item", 26, 26, }, E1 }, + { { "mcl_farming:carrot_item", 22, 22, }, E1 }, + { { "mcl_farming:beetroot_item", 15, 15 }, E1 }, + { E1, { "mcl_farming:bread", 6, 6 } }, }, { - { { "mcl_farming:pumpkin", 6, 7 }, E1 }, - { E1, { "mcl_farming:pumpkin_pie", 2, 3} }, - { E1, { "mcl_core:apple", 2, 3} }, + { { "mcl_farming:pumpkin", 6, 6 }, E1 }, + { E1, { "mcl_farming:pumpkin_pie", 4, 4 } }, + { E1, { "mcl_core:apple", 4, 4 } }, }, { - { { "mcl_farming:melon", 7, 12 }, E1 }, - { E1, {"mcl_farming:cookie", 5, 7 }, }, + { { "mcl_farming:melon", 4, 4 }, E1 }, + { { "mcl_core:emerald", 3, 3 }, {"mcl_farming:cookie", 18, 18 }, }, }, + { + { E1, { "mcl_cake:cake", 1, 1 } }, { E1, { "mcl_mushrooms:mushroom_stew", 6, 10 } }, --FIXME: expert level farmer is supposed to sell sus stews. }, + { - { E1, { "mcl_farming:carrot_item_gold", 3, 10 } }, - { E1, { "mcl_potions:speckled_melon", 1, 4 } }, + { { "mcl_core:emerald", 3, 3 }, { "mcl_farming:carrot_item_gold", 3, 3 } }, + { { "mcl_core:emerald", 4, 4 }, { "mcl_potions:speckled_melon", 3, 3 } }, TRADE_V6_BIRCH_SAPLING, TRADE_V6_DARK_OAK_SAPLING, TRADE_V6_ACACIA_SAPLING, @@ -135,31 +139,36 @@ local professions = { jobsite = "mcl_barrels:barrel_closed", trades = { { - { { "mcl_fishing:fish_raw", 6, 6, "mcl_core:emerald", 1, 1 },{ "mcl_fishing:fish_cooked", 6, 6 } }, - { { "mcl_mobitems:string", 15, 20 }, E1 }, - { { "mcl_core:coal_lump", 10, 15 }, E1 }, - -- FIXME missing: bucket of cod + fish should be cod. + { { "mcl_mobitems:string", 20, 20 }, E1 }, + { { "mcl_core:coal_lump", 10, 10 }, E1 }, + { { "mcl_core:emerald", 1, 1, "mcl_fishing:fish_raw", 6, 6 }, { "mcl_fishing:fish_cooked", 6, 6 } }, + { { "mcl_core:emerald", 3, 3 }, { "mcl_buckets:bucket_cod", 1, 1 } }, }, - { - { { "mcl_fishing:fish_raw", 6, 15,}, E1 }, - { { "mcl_fishing:salmon_raw", 6, 6, "mcl_core:emerald", 1, 1 },{ "mcl_fishing:salmon_cooked", 6, 6 } }, - { { "mcl_core:emerald", 1, 2 },{"mcl_campfires:campfire_lit",1,1} }, - }, - { - { { "mcl_fishing:salmon_raw", 6, 13,}, E1 }, - { { "mcl_core:emerald", 7, 22 }, { "mcl_fishing:fishing_rod_enchanted", 1, 1} }, - }, - { - { { "mcl_fishing:clownfish_raw", 6, 6,}, E1 }, - }, - { - { { "mcl_fishing:pufferfish_raw", 4, 4,}, E1 }, - { { "mcl_boats:boat", 1, 1,}, E1 }, - { { "mcl_boats:boat_acacia", 1, 1,}, E1 }, - { { "mcl_boats:boat_spruce", 1, 1,}, E1 }, - { { "mcl_boats:boat_dark_oak", 1, 1,}, E1 }, - { { "mcl_boats:boat_birch", 1, 1,}, E1 }, + { + { { "mcl_fishing:fish_raw", 15, 15 }, E1 }, + { { "mcl_core:emerald", 1, 1, "mcl_fishing:salmon_raw", 6, 6 }, { "mcl_fishing:salmon_cooked", 6, 6 } }, + { { "mcl_core:emerald", 2, 2 }, {"mcl_campfires:campfire_lit", 1, 1 } }, + }, + + { + { { "mcl_fishing:salmon_raw", 13, 13 }, E1 }, + { { "mcl_core:emerald", 8, 22 }, { "mcl_fishing:fishing_rod_enchanted", 1, 1 } }, + }, + + { + { { "mcl_fishing:clownfish_raw", 6, 6 }, E1 }, + }, + + { + { { "mcl_fishing:pufferfish_raw", 4, 4 }, E1 }, + + --Boat cherry? + { { "mcl_boats:boat", 1, 1 }, E1 }, + { { "mcl_boats:boat_acacia", 1, 1 }, E1 }, + { { "mcl_boats:boat_spruce", 1, 1 }, E1 }, + { { "mcl_boats:boat_dark_oak", 1, 1 }, E1 }, + { { "mcl_boats:boat_birch", 1, 1 }, E1 }, }, }, }, @@ -169,25 +178,28 @@ local professions = { jobsite = "mcl_fletching_table:fletching_table", trades = { { - { { "mcl_mobitems:string", 15, 20 }, E1 }, - { E1, { "mcl_bows:arrow", 8, 12 } }, - { { "mcl_core:gravel", 10, 10, "mcl_core:emerald", 1, 1 }, { "mcl_core:flint", 6, 10 } }, { { "mcl_core:stick", 32, 32 }, E1 }, + { E1, { "mcl_bows:arrow", 16, 16 } }, + { { "mcl_core:emerald", 1, 1, "mcl_core:gravel", 10, 10 }, { "mcl_core:flint", 10, 10 } }, }, + { { { "mcl_core:flint", 26, 26 }, E1 }, - { { "mcl_core:emerald", 2, 3 }, { "mcl_bows:bow", 1, 1 } }, + { { "mcl_core:emerald", 2, 2 }, { "mcl_bows:bow", 1, 1 } }, }, + { { { "mcl_mobitems:string", 14, 14 }, E1 }, { { "mcl_core:emerald", 3, 3 }, { "mcl_bows:crossbow", 1, 1 } }, }, + { - { { "mcl_mobitems:string", 24, 24 }, E1 }, + { { "mcl_mobitems:feather", 24, 24 }, E1 }, { { "mcl_core:emerald", 7, 21 } , { "mcl_bows:bow_enchanted", 1, 1 } }, }, + { - --FIXME: supposed to be tripwire hook{ { "tripwirehook", 24, 24 }, E1 }, + --FIXME: supposed to be tripwire hook{ { "tripwirehook", 8, 8 }, E1 }, { { "mcl_core:emerald", 8, 22 } , { "mcl_bows:crossbow_enchanted", 1, 1 } }, { { "mcl_core:emerald", 2, 2, "mcl_bows:arrow", 5, 5 }, { "mcl_potions:healing_arrow", 5, 5 } }, { { "mcl_core:emerald", 2, 2, "mcl_bows:arrow", 5, 5 }, { "mcl_potions:harming_arrow", 5, 5 } }, @@ -209,27 +221,108 @@ local professions = { jobsite = "mcl_loom:loom", trades = { { - { { "mcl_wool:white", 16, 22 }, E1 }, - { { "mcl_core:emerald", 3, 4 }, { "mcl_tools:shears", 1, 1 } }, + { { "mcl_wool:white", 18, 18 }, E1 }, + { { "mcl_wool:brown", 18, 18 }, E1 }, + { { "mcl_wool:black", 18, 18 }, E1 }, + { { "mcl_wool:grey", 18, 18 }, E1 }, + { { "mcl_core:emerald", 2, 2 }, { "mcl_tools:shears", 1, 1 } }, }, { - { { "mcl_core:emerald", 1, 2 }, { "mcl_wool:white", 1, 1 } }, - { { "mcl_core:emerald", 1, 2 }, { "mcl_wool:grey", 1, 1 } }, - { { "mcl_core:emerald", 1, 2 }, { "mcl_wool:silver", 1, 1 } }, - { { "mcl_core:emerald", 1, 2 }, { "mcl_wool:black", 1, 1 } }, - { { "mcl_core:emerald", 1, 2 }, { "mcl_wool:yellow", 1, 1 } }, - { { "mcl_core:emerald", 1, 2 }, { "mcl_wool:orange", 1, 1 } }, - { { "mcl_core:emerald", 1, 2 }, { "mcl_wool:red", 1, 1 } }, - { { "mcl_core:emerald", 1, 2 }, { "mcl_wool:magenta", 1, 1 } }, - { { "mcl_core:emerald", 1, 2 }, { "mcl_wool:purple", 1, 1 } }, - { { "mcl_core:emerald", 1, 2 }, { "mcl_wool:blue", 1, 1 } }, - { { "mcl_core:emerald", 1, 2 }, { "mcl_wool:cyan", 1, 1 } }, - { { "mcl_core:emerald", 1, 2 }, { "mcl_wool:lime", 1, 1 } }, - { { "mcl_core:emerald", 1, 2 }, { "mcl_wool:green", 1, 1 } }, - { { "mcl_core:emerald", 1, 2 }, { "mcl_wool:pink", 1, 1 } }, - { { "mcl_core:emerald", 1, 2 }, { "mcl_wool:light_blue", 1, 1 } }, - { { "mcl_core:emerald", 1, 2 }, { "mcl_wool:brown", 1, 1 } }, + { { "mcl_dye:black", 12, 12 }, E1 }, + { { "mcl_dye:dark_grey", 12, 12 }, E1 }, + { { "mcl_dye:green", 12, 12 }, E1 }, + { { "mcl_dye:lightblue", 12, 12 }, E1 }, + { { "mcl_dye:white", 12, 12 }, E1 }, + + { E1, { "mcl_wool:white", 1, 1 } }, + { E1, { "mcl_wool:grey", 1, 1 } }, + { E1, { "mcl_wool:silver", 1, 1 } }, + { E1, { "mcl_wool:black", 1, 1 } }, + { E1, { "mcl_wool:yellow", 1, 1 } }, + { E1, { "mcl_wool:orange", 1, 1 } }, + { E1, { "mcl_wool:red", 1, 1 } }, + { E1, { "mcl_wool:magenta", 1, 1 } }, + { E1, { "mcl_wool:purple", 1, 1 } }, + { E1, { "mcl_wool:blue", 1, 1 } }, + { E1, { "mcl_wool:cyan", 1, 1 } }, + { E1, { "mcl_wool:lime", 1, 1 } }, + { E1, { "mcl_wool:green", 1, 1 } }, + { E1, { "mcl_wool:pink", 1, 1 } }, + { E1, { "mcl_wool:light_blue", 1, 1 } }, + { E1, { "mcl_wool:brown", 1, 1 } }, + + { E1, { "mcl_wool:white_carpet", 4, 4 } }, + { E1, { "mcl_wool:grey_carpet", 4, 4 } }, + { E1, { "mcl_wool:silver_carpet", 4, 4 } }, + { E1, { "mcl_wool:black_carpet", 4, 4 } }, + { E1, { "mcl_wool:yellow_carpet", 4, 4 } }, + { E1, { "mcl_wool:orange_carpet", 4, 4 } }, + { E1, { "mcl_wool:red_carpet", 4, 4 } }, + { E1, { "mcl_wool:magenta_carpet", 4, 4 } }, + { E1, { "mcl_wool:purple_carpet", 4, 4 } }, + { E1, { "mcl_wool:blue_carpet", 4, 4 } }, + { E1, { "mcl_wool:cyan_carpet", 4, 4 } }, + { E1, { "mcl_wool:lime_carpet", 4, 4 } }, + { E1, { "mcl_wool:green_carpet", 4, 4 } }, + { E1, { "mcl_wool:pink_carpet", 4, 4 } }, + { E1, { "mcl_wool:light_blue_carpet", 4, 4 } }, + { E1, { "mcl_wool:brown_carpet", 4, 4 } }, + }, + + { + { { "mcl_dye:red", 12, 12 }, E1 }, + { { "mcl_dye:grey", 12, 12 }, E1 }, + { { "mcl_dye:pink", 12, 12 }, E1 }, + { { "mcl_dye:yellow", 12, 12 }, E1 }, + { { "mcl_dye:orange", 12, 12 }, E1 }, + + { { "mcl_core:emerald", 3, 3 }, { "mcl_beds:bed_red_bottom", 1, 1 } }, + { { "mcl_core:emerald", 3, 3 }, { "mcl_beds:bed_blue_bottom", 1, 1 } }, + { { "mcl_core:emerald", 3, 3 }, { "mcl_beds:bed_cyan_bottom", 1, 1 } }, + { { "mcl_core:emerald", 3, 3 }, { "mcl_beds:bed_grey_bottom", 1, 1 } }, + { { "mcl_core:emerald", 3, 3 }, { "mcl_beds:bed_silver_bottom", 1, 1 } }, + { { "mcl_core:emerald", 3, 3 }, { "mcl_beds:bed_black_bottom", 1, 1 } }, + { { "mcl_core:emerald", 3, 3 }, { "mcl_beds:bed_yellow_bottom", 1, 1 } }, + { { "mcl_core:emerald", 3, 3 }, { "mcl_beds:bed_green_bottom", 1, 1 } }, + { { "mcl_core:emerald", 3, 3 }, { "mcl_beds:bed_magenta_bottom", 1, 1 } }, + { { "mcl_core:emerald", 3, 3 }, { "mcl_beds:bed_orange_bottom", 1, 1 } }, + { { "mcl_core:emerald", 3, 3 }, { "mcl_beds:bed_purple_bottom", 1, 1 } }, + { { "mcl_core:emerald", 3, 3 }, { "mcl_beds:bed_brown_bottom", 1, 1 } }, + { { "mcl_core:emerald", 3, 3 }, { "mcl_beds:bed_pink_bottom", 1, 1 } }, + { { "mcl_core:emerald", 3, 3 }, { "mcl_beds:bed_lime_bottom", 1, 1 } }, + { { "mcl_core:emerald", 3, 3 }, { "mcl_beds:bed_light_blue_bottom", 1, 1 } }, + { { "mcl_core:emerald", 3, 3 }, { "mcl_beds:bed_white_bottom", 1, 1 } }, + }, + + { + { { "mcl_dye:dark_green", 12, 12 }, E1 }, + { { "mcl_dye:brown", 12, 12 }, E1 }, + { { "mcl_dye:blue", 12, 12 }, E1 }, + { { "mcl_dye:violet", 12, 12 }, E1 }, + { { "mcl_dye:cyan", 12, 12 }, E1 }, + { { "mcl_dye:magenta", 12, 12 }, E1 }, + + { { "mcl_core:emerald", 3, 3 }, { "mcl_banners:banner_item_white", 1, 1 } }, + { { "mcl_core:emerald", 3, 3 }, { "mcl_banners:banner_item_grey", 1, 1 } }, + { { "mcl_core:emerald", 3, 3 }, { "mcl_banners:banner_item_silver", 1, 1 } }, + { { "mcl_core:emerald", 3, 3 }, { "mcl_banners:banner_item_black", 1, 1 } }, + { { "mcl_core:emerald", 3, 3 }, { "mcl_banners:banner_item_red", 1, 1 } }, + { { "mcl_core:emerald", 3, 3 }, { "mcl_banners:banner_item_yellow", 1, 1 } }, + { { "mcl_core:emerald", 3, 3 }, { "mcl_banners:banner_item_green", 1, 1 } }, + { { "mcl_core:emerald", 3, 3 }, { "mcl_banners:banner_item_cyan", 1, 1 } }, + { { "mcl_core:emerald", 3, 3 }, { "mcl_banners:banner_item_blue", 1, 1 } }, + { { "mcl_core:emerald", 3, 3 }, { "mcl_banners:banner_item_magenta", 1, 1 } }, + { { "mcl_core:emerald", 3, 3 }, { "mcl_banners:banner_item_orange", 1, 1 } }, + { { "mcl_core:emerald", 3, 3 }, { "mcl_banners:banner_item_purple", 1, 1 } }, + { { "mcl_core:emerald", 3, 3 }, { "mcl_banners:banner_item_brown", 1, 1 } }, + { { "mcl_core:emerald", 3, 3 }, { "mcl_banners:banner_item_pink", 1, 1 } }, + { { "mcl_core:emerald", 3, 3 }, { "mcl_banners:banner_item_lime", 1, 1 } }, + { { "mcl_core:emerald", 3, 3 }, { "mcl_banners:banner_item_light_blue", 1, 1 } }, + }, + + { + { { "mcl_core:emerald", 2, 2 }, { "mcl_paintings:painting", 3, 3 } }, }, }, }, @@ -239,28 +332,28 @@ local professions = { jobsite = "mcl_lectern:lectern", trades = { { - { { "mcl_core:paper", 24, 36 }, E1 }, - { { "mcl_books:book", 8, 10 }, E1 }, - { { "mcl_core:emerald", 9, 9 }, { "mcl_books:bookshelf", 1 ,1 }}, - { { "mcl_core:emerald", 5, 64, "mcl_books:book", 1, 1 }, { "mcl_enchanting:book_enchanted", 1 ,1 }}, + { { "mcl_core:paper", 24, 24 }, E1 }, + { { "mcl_core:emerald", 5, 64, "mcl_books:book", 1, 1 }, { "mcl_enchanting:book_enchanted", 1 ,1 } }, + { { "mcl_core:emerald", 9, 9 }, { "mcl_books:bookshelf", 1 ,1 } }, }, + { - { { "mcl_books:written_book", 2, 2 }, E1 }, - { { "mcl_core:emerald", 5, 64, "mcl_books:book", 1, 1 }, { "mcl_enchanting:book_enchanted", 1 ,1 }}, + { { "mcl_books:book", 4, 4 }, E1 }, + { { "mcl_core:emerald", 5, 64, "mcl_books:book", 1, 1 }, { "mcl_enchanting:book_enchanted", 1 ,1 } }, { E1, { "mcl_lanterns:lantern_floor", 1, 1 } }, }, { - { { "mcl_dye:black", 5, 5 }, E1 }, - { { "mcl_core:emerald", 5, 64, "mcl_books:book", 1, 1 }, { "mcl_enchanting:book_enchanted", 1 ,1 }}, + { { "mcl_mobitems:ink_sac", 5, 5 }, E1 }, + { { "mcl_core:emerald", 5, 64, "mcl_books:book", 1, 1 }, { "mcl_enchanting:book_enchanted", 1 ,1 } }, { E1, { "mcl_core:glass", 4, 4 } }, }, { - { E1, { "mcl_books:writable_book", 1, 1 } }, - { { "mcl_core:emerald", 5, 64, "mcl_books:book", 1, 1 }, { "mcl_enchanting:book_enchanted", 1 ,1 }}, - { { "mcl_core:emerald", 4, 4 }, { "mcl_compass:compass", 1 ,1 }}, + { { "mcl_books:writable_book", 1, 1 }, E1 }, + { { "mcl_core:emerald", 5, 64, "mcl_books:book", 1, 1 }, { "mcl_enchanting:book_enchanted", 1 ,1 } }, { { "mcl_core:emerald", 5, 5 }, { "mcl_clock:clock", 1, 1 } }, + { { "mcl_core:emerald", 4, 4 }, { "mcl_compass:compass", 1 ,1 } }, }, { @@ -275,38 +368,43 @@ local professions = { trades = { { { { "mcl_core:paper", 24, 24 }, E1 }, - { { "mcl_core:emerald", 7, 7}, { "mcl_maps:empty_map", 1, 1 } }, + { { "mcl_core:emerald", 7, 7 }, { "mcl_maps:empty_map", 1, 1 } }, }, + { -- compass subject to special checks { { "xpanes:pane_natural_flat", 11, 11 }, E1 }, - --{ { "mcl_core:emerald", 13, 13, "mcl_compass:compass", 1, 1 }, { "FIXME:ocean explorer map" 1, 1} }, + --{ { "mcl_core:emerald", 13, 13, "mcl_compass:compass", 1, 1 }, { "FIXME:ocean explorer map" 1, 1 } }, }, + { { { "mcl_compass:compass", 1, 1 }, E1 }, - --{ { "mcl_core:emerald", 13, 13, "mcl_compass:compass", 1, 1 }, { "FIXME:woodland explorer map" 1, 1} }, + --{ { "mcl_core:emerald", 14, 14, "mcl_compass:compass", 1, 1 }, { "FIXME:woodland explorer map" 1, 1 } }, }, - { - { { "mcl_core:emerald", 7, 7}, { "mcl_itemframes:item_frame", 1, 1 }}, - { { "mcl_core:emerald", 7, 7}, { "mcl_banners:banner_item_white", 1, 1 }}, - { { "mcl_core:emerald", 7, 7}, { "mcl_banners:banner_item_grey", 1, 1 }}, - { { "mcl_core:emerald", 7, 7}, { "mcl_banners:banner_item_silver", 1, 1 }}, - { { "mcl_core:emerald", 7, 7}, { "mcl_banners:banner_item_black", 1, 1 }}, - { { "mcl_core:emerald", 7, 7}, { "mcl_banners:banner_item_red", 1, 1 }}, - { { "mcl_core:emerald", 7, 7}, { "mcl_banners:banner_item_green", 1, 1 }}, - { { "mcl_core:emerald", 7, 7}, { "mcl_banners:banner_item_cyan", 1, 1 }}, - { { "mcl_core:emerald", 7, 7}, { "mcl_banners:banner_item_blue", 1, 1 }}, - { { "mcl_core:emerald", 7, 7}, { "mcl_banners:banner_item_magenta", 1, 1 }}, - { { "mcl_core:emerald", 7, 7}, { "mcl_banners:banner_item_orange", 1, 1 }}, - { { "mcl_core:emerald", 7, 7}, { "mcl_banners:banner_item_purple", 1, 1 }}, - { { "mcl_core:emerald", 7, 7}, { "mcl_banners:banner_item_brown", 1, 1 }}, - { { "mcl_core:emerald", 7, 7}, { "mcl_banners:banner_item_pink", 1, 1 }}, - { { "mcl_core:emerald", 7, 7}, { "mcl_banners:banner_item_lime", 1, 1 }}, - { { "mcl_core:emerald", 7, 7}, { "mcl_banners:banner_item_light_blue", 1, 1 }}, - }, { - --{ { "mcl_core:emerald", 8, 8}, { "FIXME: globe banner pattern", 1, 1 } }, + { { "mcl_core:emerald", 7, 7 }, { "mcl_itemframes:item_frame", 1, 1 } }, + + { { "mcl_core:emerald", 3, 3 }, { "mcl_banners:banner_item_white", 1, 1 } }, + { { "mcl_core:emerald", 3, 3 }, { "mcl_banners:banner_item_grey", 1, 1 } }, + { { "mcl_core:emerald", 3, 3 }, { "mcl_banners:banner_item_silver", 1, 1 } }, + { { "mcl_core:emerald", 3, 3 }, { "mcl_banners:banner_item_black", 1, 1 } }, + { { "mcl_core:emerald", 3, 3 }, { "mcl_banners:banner_item_red", 1, 1 } }, + { { "mcl_core:emerald", 3, 3 }, { "mcl_banners:banner_item_yellow", 1, 1 } }, + { { "mcl_core:emerald", 3, 3 }, { "mcl_banners:banner_item_green", 1, 1 } }, + { { "mcl_core:emerald", 3, 3 }, { "mcl_banners:banner_item_cyan", 1, 1 } }, + { { "mcl_core:emerald", 3, 3 }, { "mcl_banners:banner_item_blue", 1, 1 } }, + { { "mcl_core:emerald", 3, 3 }, { "mcl_banners:banner_item_magenta", 1, 1 } }, + { { "mcl_core:emerald", 3, 3 }, { "mcl_banners:banner_item_orange", 1, 1 } }, + { { "mcl_core:emerald", 3, 3 }, { "mcl_banners:banner_item_purple", 1, 1 } }, + { { "mcl_core:emerald", 3, 3 }, { "mcl_banners:banner_item_brown", 1, 1 } }, + { { "mcl_core:emerald", 3, 3 }, { "mcl_banners:banner_item_pink", 1, 1 } }, + { { "mcl_core:emerald", 3, 3 }, { "mcl_banners:banner_item_lime", 1, 1 } }, + { { "mcl_core:emerald", 3, 3 }, { "mcl_banners:banner_item_light_blue", 1, 1 } }, + }, + + { + --{ { "mcl_core:emerald", 8, 8 }, { "FIXME: globe banner pattern", 1, 1 } }, }, -- TODO: special maps }, @@ -330,6 +428,7 @@ local professions = { { { "mcl_core:emerald", 3, 3 }, { "mcl_armor:leggings_chain", 1, 1 } }, { { "mcl_core:emerald", 1, 1 }, { "mcl_armor:boots_chain", 1, 1 } }, }, + { { { "mcl_buckets:bucket_lava", 1, 1 }, E1 }, { { "mcl_core:diamond", 1, 1 }, E1 }, @@ -342,6 +441,7 @@ local professions = { { { "mcl_core:emerald", 19, 33 }, { "mcl_armor:leggings_diamond_enchanted", 1, 1 } }, { { "mcl_core:emerald", 13, 27 }, { "mcl_armor:boots_diamond_enchanted", 1, 1 } }, }, + { { { "mcl_core:emerald", 13, 27 }, { "mcl_armor:helmet_diamond_enchanted", 1, 1 } }, { { "mcl_core:emerald", 21, 35 }, { "mcl_armor:chestplate_diamond_enchanted", 1, 1 } }, @@ -354,26 +454,31 @@ local professions = { jobsite = "mcl_cauldrons:cauldron", trades = { { - { { "mcl_mobitems:leather", 9, 12 }, E1 }, - { { "mcl_core:emerald", 3, 3 }, { "mcl_armor:leggings_leather", 2, 4 } }, - { { "mcl_core:emerald", 7, 7 }, { "mcl_armor:chestplate_leather", 2, 4 } }, + { { "mcl_mobitems:leather", 6, 6 }, E1 }, + { { "mcl_core:emerald", 3, 3 }, { "mcl_armor:leggings_leather", 1, 1 } }, + { { "mcl_core:emerald", 7, 7 }, { "mcl_armor:chestplate_leather", 1, 1 } }, }, + { { { "mcl_core:flint", 26, 26 }, E1 }, - { { "mcl_core:emerald", 5, 5 }, { "mcl_armor:helmet_leather", 2, 4 } }, - { { "mcl_core:emerald", 4, 4 }, { "mcl_armor:boots_leather", 2, 4 } }, + { { "mcl_core:emerald", 5, 5 }, { "mcl_armor:helmet_leather", 1, 1 } }, + { { "mcl_core:emerald", 4, 4 }, { "mcl_armor:boots_leather", 1, 1 } }, }, + { { { "mcl_mobitems:rabbit_hide", 9, 9 }, E1 }, { { "mcl_core:emerald", 7, 7 }, { "mcl_armor:chestplate_leather", 1, 1 } }, }, + { --{ { "FIXME: scute", 4, 4 }, E1 }, { { "mcl_core:emerald", 8, 10 }, { "mcl_mobitems:saddle", 1, 1 } }, + --FIXME: { { "mcl_core:emerald", 6, 6 }, { "mcl_mobitems:leather_horse_armor", 1, 1 } }, }, + { { { "mcl_core:emerald", 6, 6 }, { "mcl_mobitems:saddle", 1, 1 } }, - { { "mcl_core:emerald", 5, 5 }, { "mcl_armor:helmet_leather", 2, 4 } }, + { { "mcl_core:emerald", 5, 5 }, { "mcl_armor:helmet_leather", 1, 1 } }, }, }, }, @@ -383,8 +488,8 @@ local professions = { jobsite = "mcl_smoker:smoker", trades = { { - { { "mcl_mobitems:beef", 14, 14 }, E1 }, - { { "mcl_mobitems:chicken", 7, 7 }, E1 }, + { { "mcl_mobitems:chicken", 14, 14 }, E1 }, + { { "mcl_mobitems:porkchop", 7, 7 }, E1 }, { { "mcl_mobitems:rabbit", 4, 4 }, E1 }, { E1, { "mcl_mobitems:rabbit_stew", 1, 1 } }, }, @@ -394,16 +499,15 @@ local professions = { { E1, { "mcl_mobitems:cooked_porkchop", 5, 5 } }, { E1, { "mcl_mobitems:cooked_chicken", 8, 8 } }, }, + { { { "mcl_mobitems:mutton", 7, 7 }, E1 }, { { "mcl_mobitems:beef", 10, 10 }, E1 }, }, + { - { { "mcl_mobitems:mutton", 7, 7 }, E1 }, - { { "mcl_mobitems:beef", 10, 10 }, E1 }, - }, - { - --{ { "FIXME: Sweet Berries", 10, 10 }, E1 }, + { { "mcl_ocean:dried_kelp_block", 10, 10 }, E1 }, + { { "mcl_farming:sweet_berry", 10, 10 }, E1 }, }, }, }, @@ -422,11 +526,13 @@ local professions = { { { "mcl_core:iron_ingot", 4, 4 }, E1 }, { { "mcl_core:emerald", 36, 36 }, { "mcl_bells:bell", 1, 1 } }, }, + { - { { "mcl_core:flint", 7, 9 }, E1 }, + { { "mcl_core:flint", 24, 24 }, E1 }, }, + { - { { "mcl_core:diamond", 7, 9 }, E1 }, + { { "mcl_core:diamond", 1, 1 }, E1 }, { { "mcl_core:emerald", 17, 31 }, { "mcl_tools:axe_diamond_enchanted", 1, 1 } }, }, @@ -452,6 +558,7 @@ local professions = { { { "mcl_core:iron_ingot", 4, 4 }, E1 }, { { "mcl_core:emerald", 36, 36 }, { "mcl_bells:bell", 1, 1 } }, }, + { { { "mcl_core:flint", 30, 30 }, E1 }, { { "mcl_core:emerald", 6, 20 }, { "mcl_tools:axe_iron_enchanted", 1, 1 } }, @@ -459,11 +566,13 @@ local professions = { { { "mcl_core:emerald", 8, 22 }, { "mcl_tools:pick_iron_enchanted", 1, 1 } }, { { "mcl_core:emerald", 4, 4 }, { "mcl_farming:hoe_diamond", 1, 1 } }, }, + { { { "mcl_core:diamond", 1, 1 }, E1 }, { { "mcl_core:emerald", 17, 31 }, { "mcl_tools:axe_diamond_enchanted", 1, 1 } }, { { "mcl_core:emerald", 10, 24 }, { "mcl_tools:shovel_diamond_enchanted", 1, 1 } }, }, + { { { "mcl_core:emerald", 18, 32 }, { "mcl_tools:pick_diamond_enchanted", 1, 1 } }, }, @@ -478,23 +587,27 @@ local professions = { { { "mcl_mobitems:rotten_flesh", 32, 32 }, E1 }, { E1, { "mesecons:redstone", 2, 2 } }, }, + { { { "mcl_core:gold_ingot", 3, 3 }, E1 }, { E1, { "mcl_core:lapis", 1, 1 } }, }, + { { { "mcl_mobitems:rabbit_foot", 2, 2 }, E1 }, - { E1, { "mcl_nether:glowstone", 4, 4 } }, + { { "mcl_core:emerald", 4, 4 }, { "mcl_nether:glowstone", 1, 1 } }, }, + { --{ { "FIXME: scute", 4, 4 }, E1 }, { { "mcl_potions:glass_bottle", 9, 9 }, E1 }, { { "mcl_core:emerald", 5, 5 }, { "mcl_throwing:ender_pearl", 1, 1 } }, TRADE_V6_RED_SANDSTONE, }, + { - { { "mcl_nether:nether_wart_item", 22, 22 }, E1 }, - { { "mcl_core:emerald", 3, 3 }, { "mcl_experience:bottle", 1, 1 } }, + { { "mcl_nether:nether_wart_item", 22, 22 }, E1 }, + { { "mcl_core:emerald", 3, 3 }, { "mcl_experience:bottle", 1, 1 } }, }, }, }, @@ -507,38 +620,61 @@ local professions = { { { "mcl_core:clay_lump", 10, 10 }, E1 }, { E1, { "mcl_core:brick", 10, 10 } }, }, - { + + { { { "mcl_core:stone", 20, 20 }, E1 }, { E1, { "mcl_core:stonebrickcarved", 4, 4 } }, }, + { { { "mcl_core:granite", 16, 16 }, E1 }, { { "mcl_core:andesite", 16, 16 }, E1 }, { { "mcl_core:diorite", 16, 16 }, E1 }, - { E1, { "mcl_core:granite_smooth", 4, 4 } }, { E1, { "mcl_core:andesite_smooth", 4, 4 } }, + { E1, { "mcl_core:granite_smooth", 4, 4 } }, { E1, { "mcl_core:diorite_smooth", 4, 4 } }, + --FIXME: { E1, { "Dripstone Block", 4, 4 } }, }, + { { { "mcl_nether:quartz", 12, 12 }, E1 }, - { E1, { "mcl_colorblocks:hardened_clay", 1, 1} }, - { E1, { "mcl_colorblocks:hardened_clay_white", 1, 1} }, - { E1, { "mcl_colorblocks:hardened_clay_grey", 1, 1} }, - { E1, { "mcl_colorblocks:hardened_clay_silver", 1, 1} }, - { E1, { "mcl_colorblocks:hardened_clay_black", 1, 1} }, - { E1, { "mcl_colorblocks:hardened_clay_red", 1, 1} }, - { E1, { "mcl_colorblocks:hardened_clay_yellow", 1, 1} }, - { E1, { "mcl_colorblocks:hardened_clay_green", 1, 1} }, - { E1, { "mcl_colorblocks:hardened_clay_cyan", 1, 1} }, - { E1, { "mcl_colorblocks:hardened_clay_blue", 1, 1} }, - { E1, { "mcl_colorblocks:hardened_clay_magenta", 1, 1} }, - { E1, { "mcl_colorblocks:hardened_clay_orange", 1, 1} }, - { E1, { "mcl_colorblocks:hardened_clay_brown", 1, 1} }, - { E1, { "mcl_colorblocks:hardened_clay_pink", 1, 1} }, - { E1, { "mcl_colorblocks:hardened_clay_light_blue", 1, 1} }, - { E1, { "mcl_colorblocks:hardened_clay_lime", 1, 1} }, + --Only Colored Terracotta? + { E1, { "mcl_colorblocks:hardened_clay", 1, 1 } }, + { E1, { "mcl_colorblocks:hardened_clay_white", 1, 1 } }, + { E1, { "mcl_colorblocks:hardened_clay_grey", 1, 1 } }, + { E1, { "mcl_colorblocks:hardened_clay_silver", 1, 1 } }, + { E1, { "mcl_colorblocks:hardened_clay_black", 1, 1 } }, + { E1, { "mcl_colorblocks:hardened_clay_red", 1, 1 } }, + { E1, { "mcl_colorblocks:hardened_clay_yellow", 1, 1 } }, + { E1, { "mcl_colorblocks:hardened_clay_green", 1, 1 } }, + { E1, { "mcl_colorblocks:hardened_clay_cyan", 1, 1 } }, + { E1, { "mcl_colorblocks:hardened_clay_blue", 1, 1 } }, + { E1, { "mcl_colorblocks:hardened_clay_magenta", 1, 1 } }, + { E1, { "mcl_colorblocks:hardened_clay_orange", 1, 1 } }, + { E1, { "mcl_colorblocks:hardened_clay_brown", 1, 1 } }, + { E1, { "mcl_colorblocks:hardened_clay_pink", 1, 1 } }, + { E1, { "mcl_colorblocks:hardened_clay_light_blue", 1, 1 } }, + { E1, { "mcl_colorblocks:hardened_clay_lime", 1, 1 } }, { E1, { "mcl_colorblocks:hardened_clay_purple", 1, 1 } }, + + { E1, { "mcl_colorblocks:glazed_terracotta_white", 1, 1 } }, + { E1, { "mcl_colorblocks:glazed_terracotta_grey", 1, 1 } }, + { E1, { "mcl_colorblocks:glazed_terracotta_silver", 1, 1 } }, + { E1, { "mcl_colorblocks:glazed_terracotta_black", 1, 1 } }, + { E1, { "mcl_colorblocks:glazed_terracotta_red", 1, 1 } }, + { E1, { "mcl_colorblocks:glazed_terracotta_yellow", 1, 1 } }, + { E1, { "mcl_colorblocks:glazed_terracotta_green", 1, 1 } }, + { E1, { "mcl_colorblocks:glazed_terracotta_cyan", 1, 1 } }, + { E1, { "mcl_colorblocks:glazed_terracotta_blue", 1, 1 } }, + { E1, { "mcl_colorblocks:glazed_terracotta_magenta", 1, 1 } }, + { E1, { "mcl_colorblocks:glazed_terracotta_orange", 1, 1 } }, + { E1, { "mcl_colorblocks:glazed_terracotta_brown", 1, 1 } }, + { E1, { "mcl_colorblocks:glazed_terracotta_pink", 1, 1 } }, + { E1, { "mcl_colorblocks:glazed_terracotta_light_blue", 1, 1 } }, + { E1, { "mcl_colorblocks:glazed_terracotta_lime", 1, 1 } }, + { E1, { "mcl_colorblocks:glazed_terracotta_purple", 1, 1 } }, }, + { { E1, { "mcl_nether:quartz_pillar", 1, 1 } }, { E1, { "mcl_nether:quartz_block", 1, 1 } }, From 80b21759d9bed3060b6dcff49c6e3cd403f70a82 Mon Sep 17 00:00:00 2001 From: Johannes Fritz Date: Wed, 26 Jul 2023 09:56:13 -0500 Subject: [PATCH 059/982] Remove mcl_base_textures mod --- mods/HUD/mcl_base_textures/init.lua | 1 - mods/HUD/mcl_base_textures/mod.conf | 3 --- 2 files changed, 4 deletions(-) delete mode 100644 mods/HUD/mcl_base_textures/init.lua delete mode 100644 mods/HUD/mcl_base_textures/mod.conf diff --git a/mods/HUD/mcl_base_textures/init.lua b/mods/HUD/mcl_base_textures/init.lua deleted file mode 100644 index 643c51108..000000000 --- a/mods/HUD/mcl_base_textures/init.lua +++ /dev/null @@ -1 +0,0 @@ --- This mod has no code and is only a collection of textures. diff --git a/mods/HUD/mcl_base_textures/mod.conf b/mods/HUD/mcl_base_textures/mod.conf deleted file mode 100644 index b36dccfe4..000000000 --- a/mods/HUD/mcl_base_textures/mod.conf +++ /dev/null @@ -1,3 +0,0 @@ -name = mcl_base_textures -author = Wuzzy -description = Provides core textures needed by Minetest. From a99daf429443ebfe146a9ad6dcbda2aa8a21af53 Mon Sep 17 00:00:00 2001 From: Nicu Date: Sun, 30 Jul 2023 09:16:02 +0000 Subject: [PATCH 060/982] Fixed typo in mcl_damage Fixed typo that invalidated the cached reason for damage --- mods/CORE/mcl_damage/init.lua | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/mods/CORE/mcl_damage/init.lua b/mods/CORE/mcl_damage/init.lua index 8804b8561..f6058dbaa 100644 --- a/mods/CORE/mcl_damage/init.lua +++ b/mods/CORE/mcl_damage/init.lua @@ -96,8 +96,8 @@ function mcl_damage.finish_reason(mcl_reason) end function mcl_damage.from_mt(mt_reason) - if mt_reason._mcl_chached_reason then - return mt_reason._mcl_chached_reason + if mt_reason._mcl_cached_reason then + return mt_reason._mcl_cached_reason end local mcl_reason From a3bbb3694c572786ea815289cb852a87550bcc45 Mon Sep 17 00:00:00 2001 From: codiac Date: Thu, 27 Jul 2023 21:27:51 +1000 Subject: [PATCH 061/982] Allow villager to claim filled cauldrons. Fixes #3733 --- mods/ENTITIES/mobs_mc/villager.lua | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/mods/ENTITIES/mobs_mc/villager.lua b/mods/ENTITIES/mobs_mc/villager.lua index 8fc18ccab..7db8a8306 100644 --- a/mods/ENTITIES/mobs_mc/villager.lua +++ b/mods/ENTITIES/mobs_mc/villager.lua @@ -351,7 +351,7 @@ local professions = { leatherworker = { name = N("Leatherworker"), texture = "mobs_mc_villager_leatherworker.png", - jobsite = "mcl_cauldrons:cauldron", + jobsite = "group:cauldron", trades = { { { { "mcl_mobitems:leather", 9, 12 }, E1 }, @@ -1007,8 +1007,9 @@ end ----- JOBSITE LOGIC local function get_profession_by_jobsite(js) + local is_cauldron = string.find(js, "mcl_cauldrons:cauldron") for k,v in pairs(professions) do - if v.jobsite == js then return k end + if v.jobsite == js or (is_cauldron and v.jobsite == "group:cauldron") then return k end end end From 4f2cb955b895f2e265da222986c3a5a227e76145 Mon Sep 17 00:00:00 2001 From: codiac Date: Fri, 4 Aug 2023 11:24:07 +1000 Subject: [PATCH 062/982] Use minetest.get_item_group for more flexibility --- mods/ENTITIES/mobs_mc/villager.lua | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/mods/ENTITIES/mobs_mc/villager.lua b/mods/ENTITIES/mobs_mc/villager.lua index 7db8a8306..96c5c7233 100644 --- a/mods/ENTITIES/mobs_mc/villager.lua +++ b/mods/ENTITIES/mobs_mc/villager.lua @@ -1007,9 +1007,16 @@ end ----- JOBSITE LOGIC local function get_profession_by_jobsite(js) - local is_cauldron = string.find(js, "mcl_cauldrons:cauldron") for k,v in pairs(professions) do - if v.jobsite == js or (is_cauldron and v.jobsite == "group:cauldron") then return k end + if v.jobsite == js then + return k + -- Catch Nitwit doesn't have a jobsite + elseif v.jobsite and v.jobsite:find("^group:") then + local group = v.jobsite:gsub("^group:", "") + if minetest.get_item_group(js, group) > 0 then + return k + end + end end end From a6096395855f714c696518b619213853fe89ab97 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mikita=20Wi=C5=9Bniewski?= Date: Wed, 9 Aug 2023 12:02:04 +0700 Subject: [PATCH 063/982] Add spaces after #, make the commands monospaced --- MODELS.md | 23 ++++++++++++++--------- RELEASE.md | 18 ++++++++++++------ 2 files changed, 26 insertions(+), 15 deletions(-) diff --git a/MODELS.md b/MODELS.md index 4b9094c33..663313f30 100644 --- a/MODELS.md +++ b/MODELS.md @@ -1,13 +1,14 @@ -#Models in Minetest/Mineclone2 +# Models in Minetest/Mineclone2 Models are an important part of all entities & unique nodes in Mineclone2. They provide a 3 dimensional map of an object for which textures are then applied to. This document is for modders, it quickly highlights some important information for the software needed to open models in Mineclone2. ## Minetest Wiki + For more detailed information on actually using blender to create and modify models for Minetest/Mineclone2, please visit the Minetest wiki's page on using Blender [Here](https://wiki.minetest.net/Using_Blender) -##Recommended software +## Recommended software -###Blender +### Blender Blender is a very popular and free modeling software supported on Windows, MacOS, and most Linux distributions. It is recommended to use Blender to create and modify 3D models within the minetest engine. @@ -19,14 +20,16 @@ Blitz 3D (.b3d) Is one of the main animated model formats used for entities in t The most up to date version of this Blender plugin can be downloaded [Here](https://github.com/GreenXenith/io_scene_b3d/releases/tag/f189786) -##Types of model formats +## Types of model formats + +### Animated, skinned models -###Animated, skinned models * Blitz 3D files (.b3d) * Microsoft DirectX (.x) (binary & text, compression is not supported) -###Static meshes +### Static meshes + * Wavefront OBJ (.obj) Note: The sometimes accompanying .mtl files are not supported and can safely be deleted. @@ -45,16 +48,18 @@ Note: Do not use .b3d and .x files for static meshes at the moment, Minetest cur Note: Any formats not mentioned above but known to work in the past were removed in 5.5.0 and aren't supported anymore. -##Pros & Cons of .b3d vs .x +## Pros & Cons of .b3d vs .x + +### B3D -###B3D * [+] Binary format means a small size * [-] Difficult to postprocess after exporting * [-] Difficult to debug problems -###X (text version) +### X (text version) + * [+] Can be parsed easily with lua scripts * [+] Can be easily generated by scripts diff --git a/RELEASE.md b/RELEASE.md index 52be92b6c..3984c4c84 100644 --- a/RELEASE.md +++ b/RELEASE.md @@ -1,10 +1,11 @@ ### Standard Release -#File to document release steps with a view to evolving into a script +# File to document release steps with a view to evolving into a script -#Update CREDITS.md -#Update version in game.conf +# Update CREDITS.md +# Update version in game.conf +``` lua tools/generate_ingame_credits.lua git add CREDITS.md @@ -18,10 +19,11 @@ git commit -m "Pre-release update credits and set version 0.83.0" git tag 0.83.0 git push origin 0.83.0 +``` -#Update version in game.conf to the next version with -SNAPSHOT suffix +# Update version in game.conf to the next version with -SNAPSHOT suffix -git commit -m "Post-release set version 0.84.0-SNAPSHOT" +`git commit -m "Post-release set version 0.84.0-SNAPSHOT"` ### Hotfix Release @@ -32,15 +34,17 @@ To mitigate this, you just release the last release, and the relevant bug fix. F * Create release branch from the last release tag, push it: +``` git checkout -b release/0.82.1 0.82.0 git push origin release/0.82.1 +``` ##### Prepare feature branch and fix * Create feature branch from that release branch (can review it to check only fix is there, nothing else, and use to also merge into master separately) -git checkout -b hotfix_bug_1_branch +`git checkout -b hotfix_bug_1_branch` * Fix crash/serious bug and commit * Push branch and create pr to the release and also the master branch (Do not rebase, to reduce merge conflict risk. Do not delete after first merge or it needs to be repushed) @@ -53,11 +57,13 @@ git checkout -b hotfix_bug_1_branch * Tag it, push tag and branch: +``` git tag 0.82.1 git push origin 0.82.1 git push origin release/0.82.1 +``` Note: If you have to do more than 1 hotfix release, can do it on the same release branch. From f884de5f87edf3351fec1bf7c8ec4651dd87a873 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mikita=20Wi=C5=9Bniewski?= Date: Wed, 9 Aug 2023 12:06:50 +0700 Subject: [PATCH 064/982] Fix a link and a typo in LEGAL.md --- LEGAL.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/LEGAL.md b/LEGAL.md index aace346bf..e378c1b59 100644 --- a/LEGAL.md +++ b/LEGAL.md @@ -38,11 +38,11 @@ No non-free licenses are used anywhere. The textures, unless otherwise noted, are based on the Pixel Perfection resource pack for Minecraft 1.11, authored by XSSheep. Most textures are verbatim copies, while some textures have been changed or redone from scratch. -The glazed terracotta textures have been created by (MysticTempest)[https://github.com/MysticTempest]. +The glazed terracotta textures have been created by [MysticTempest](https://github.com/MysticTempest). Source: License: [CC BY-SA 4.0](http://creativecommons.org/licenses/by-sa/4.0/) -The main menu images are release under: [CC0](https://creativecommons.org/publicdomain/zero/1.0/) +The main menu images are released under: [CC0](https://creativecommons.org/publicdomain/zero/1.0/) All other files, unless mentioned otherwise, fall under: Creative Commons Attribution-ShareAlike 3.0 Unported (CC BY-SA 3.0) From 6ae597c97fb2bfade939d80af8bab7ad337f0334 Mon Sep 17 00:00:00 2001 From: codiac Date: Sat, 12 Aug 2023 14:01:26 +1000 Subject: [PATCH 065/982] This changes mob floating so they stay inside the top water node instead of standing on it. The head of the mod should still be above water. Changes drowning so that mobs will not drown in one block of water. They will drown in 2 or more blocks of water. Does not appear to affect them getting out of deep water :( But they do seem to die somewhat faster when they stay in deep water. --- mods/ENTITIES/mcl_mobs/physics.lua | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/mods/ENTITIES/mcl_mobs/physics.lua b/mods/ENTITIES/mcl_mobs/physics.lua index e1b23d78a..e49da2633 100644 --- a/mods/ENTITIES/mcl_mobs/physics.lua +++ b/mods/ENTITIES/mcl_mobs/physics.lua @@ -675,6 +675,9 @@ function mob_class:do_env_damage() self.standing_in = node_ok(pos, "air").name self.standing_on = node_ok(pos2, "air").name + local pos3 = {x=pos.x, y=pos.y+1, z=pos.z} + self.standing_under = node_ok(pos3, "air").name + -- don't fall when on ignore, just stand still if self.standing_in == "ignore" then self.object:set_velocity({x = 0, y = 0, z = 0}) @@ -682,6 +685,7 @@ function mob_class:do_env_damage() local nodef = minetest.registered_nodes[self.standing_in] local nodef2 = minetest.registered_nodes[self.standing_on] + local nodef3 = minetest.registered_nodes[self.standing_under] -- rain if self.rain_damage > 0 then @@ -761,7 +765,7 @@ function mob_class:do_env_damage() if minetest.get_item_group(self.standing_in, "water") == 0 then drowning = true end - elseif nodef.drowning > 0 then + elseif nodef.drowning > 0 and nodef3.drowning > 0 then drowning = true end @@ -939,7 +943,7 @@ function mob_class:falling(pos) -- in water then float up if registered_node.groups.water then - if acc and self.floats == 1 then + if acc and self.floats == 1 and minetest.registered_nodes[node_ok(vector.offset(pos,0,self.collisionbox[5],0)).name].groups.water then self.object:set_acceleration(vector.new(0, -self.fall_speed / (math.max(1, v.y) ^ 2), 0)) end else From 898a183ccdd7d267a93d2462f79a609180dad068 Mon Sep 17 00:00:00 2001 From: cora Date: Sat, 12 Aug 2023 08:36:24 +0200 Subject: [PATCH 066/982] Prevent floating mobs from drowning all the time Less dieing for mobs in deep water. --- mods/ENTITIES/mcl_mobs/physics.lua | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mods/ENTITIES/mcl_mobs/physics.lua b/mods/ENTITIES/mcl_mobs/physics.lua index e49da2633..32ebc75cd 100644 --- a/mods/ENTITIES/mcl_mobs/physics.lua +++ b/mods/ENTITIES/mcl_mobs/physics.lua @@ -943,7 +943,7 @@ function mob_class:falling(pos) -- in water then float up if registered_node.groups.water then - if acc and self.floats == 1 and minetest.registered_nodes[node_ok(vector.offset(pos,0,self.collisionbox[5],0)).name].groups.water then + if acc and minetest.registered_nodes[node_ok(vector.offset(pos,0,self.collisionbox[5] -0.25,0)).name].groups.water then self.object:set_acceleration(vector.new(0, -self.fall_speed / (math.max(1, v.y) ^ 2), 0)) end else From 034382c883690dd3c22f6869494bfcdf5c30ea6f Mon Sep 17 00:00:00 2001 From: codiac Date: Sun, 13 Aug 2023 12:14:52 +1000 Subject: [PATCH 067/982] Fix float check :( --- mods/ENTITIES/mcl_mobs/physics.lua | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mods/ENTITIES/mcl_mobs/physics.lua b/mods/ENTITIES/mcl_mobs/physics.lua index 32ebc75cd..0f3334367 100644 --- a/mods/ENTITIES/mcl_mobs/physics.lua +++ b/mods/ENTITIES/mcl_mobs/physics.lua @@ -943,7 +943,7 @@ function mob_class:falling(pos) -- in water then float up if registered_node.groups.water then - if acc and minetest.registered_nodes[node_ok(vector.offset(pos,0,self.collisionbox[5] -0.25,0)).name].groups.water then + if acc and self.floats == 1 minetest.registered_nodes[node_ok(vector.offset(pos,0,self.collisionbox[5] -0.25,0)).name].groups.water then self.object:set_acceleration(vector.new(0, -self.fall_speed / (math.max(1, v.y) ^ 2), 0)) end else From 8c64fdfa5db0cef33f7bf9c70444810825d9e1d0 Mon Sep 17 00:00:00 2001 From: codiac Date: Sun, 13 Aug 2023 14:02:15 +1000 Subject: [PATCH 068/982] Enable enchanting on sheers & allow enchanted shears to shear. --- mods/ENTITIES/mobs_mc/cow+mooshroom.lua | 2 +- mods/ENTITIES/mobs_mc/sheep.lua | 2 +- mods/ENTITIES/mobs_mc/snowman.lua | 2 +- mods/ITEMS/mcl_beehives/init.lua | 2 +- mods/ITEMS/mcl_tools/init.lua | 2 +- 5 files changed, 5 insertions(+), 5 deletions(-) diff --git a/mods/ENTITIES/mobs_mc/cow+mooshroom.lua b/mods/ENTITIES/mobs_mc/cow+mooshroom.lua index 64f74c516..9d1aa1aaa 100644 --- a/mods/ENTITIES/mobs_mc/cow+mooshroom.lua +++ b/mods/ENTITIES/mobs_mc/cow+mooshroom.lua @@ -105,7 +105,7 @@ mooshroom_def.on_rightclick = function(self, clicker) end local item = clicker:get_wielded_item() -- Use shears to get mushrooms and turn mooshroom into cow - if item:get_name() == "mcl_tools:shears" then + if minetest.get_item_group(item:get_name(), "shears") > 0 then local pos = self.object:get_pos() minetest.sound_play("mcl_tools_shears_cut", {pos = pos}, true) diff --git a/mods/ENTITIES/mobs_mc/sheep.lua b/mods/ENTITIES/mobs_mc/sheep.lua index 6eaffa611..af1222403 100644 --- a/mods/ENTITIES/mobs_mc/sheep.lua +++ b/mods/ENTITIES/mobs_mc/sheep.lua @@ -234,7 +234,7 @@ mcl_mobs.register_mob("mobs_mc:sheep", { if self:feed_tame(clicker, 1, true, false) then return end if mcl_mobs:protect(self, clicker) then return end - if item:get_name() == "mcl_tools:shears" and not self.gotten and not self.child then + if minetest.get_item_group(item:get_name(), "shears") > 0 and not self.gotten and not self.child then self.gotten = true local pos = self.object:get_pos() minetest.sound_play("mcl_tools_shears_cut", {pos = pos}, true) diff --git a/mods/ENTITIES/mobs_mc/snowman.lua b/mods/ENTITIES/mobs_mc/snowman.lua index ec2a14675..0e5bc8d4b 100644 --- a/mods/ENTITIES/mobs_mc/snowman.lua +++ b/mods/ENTITIES/mobs_mc/snowman.lua @@ -114,7 +114,7 @@ mcl_mobs.register_mob("mobs_mc:snowman", { -- Remove pumpkin if using shears on_rightclick = function(self, clicker) local item = clicker:get_wielded_item() - if self.gotten ~= true and item:get_name() == "mcl_tools:shears" then + if self.gotten ~= true and inetest.get_item_group(item:get_name(), "shears") > 0 then -- Remove pumpkin self.gotten = true self.object:set_properties({ diff --git a/mods/ITEMS/mcl_beehives/init.lua b/mods/ITEMS/mcl_beehives/init.lua index 82b3cae5f..d20370ca7 100644 --- a/mods/ITEMS/mcl_beehives/init.lua +++ b/mods/ITEMS/mcl_beehives/init.lua @@ -8,7 +8,7 @@ local S = minetest.get_translator(minetest.get_current_modname()) -- Function to allow harvesting honey and honeycomb from the beehive and bee nest. local honey_harvest = function(pos, node, player, itemstack, pointed_thing) local inv = player:get_inventory() - local shears = player:get_wielded_item():get_name() == "mcl_tools:shears" + local shears = minetest.get_item_group(player:get_wielded_item():get_name(), "shears") > 0 local bottle = player:get_wielded_item():get_name() == "mcl_potions:glass_bottle" local beehive = "mcl_beehives:beehive" local is_creative = minetest.is_creative_enabled(player:get_player_name()) diff --git a/mods/ITEMS/mcl_tools/init.lua b/mods/ITEMS/mcl_tools/init.lua index 5f96fa3fa..2c17aa135 100644 --- a/mods/ITEMS/mcl_tools/init.lua +++ b/mods/ITEMS/mcl_tools/init.lua @@ -661,7 +661,7 @@ minetest.register_tool("mcl_tools:shears", { inventory_image = "default_tool_shears.png", wield_image = "default_tool_shears.png", stack_max = 1, - groups = { tool=1, shears=1, dig_speed_class=4, }, + groups = { tool=1, shears=1, dig_speed_class=4, enchantability=14, }, tool_capabilities = { full_punch_interval = 0.5, max_drop_level=1, From 246a95f9731b1d98a9270540217d399dbce21526 Mon Sep 17 00:00:00 2001 From: codiac Date: Mon, 14 Aug 2023 10:39:31 +1000 Subject: [PATCH 069/982] Fix typo --- mods/ENTITIES/mobs_mc/snowman.lua | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mods/ENTITIES/mobs_mc/snowman.lua b/mods/ENTITIES/mobs_mc/snowman.lua index 0e5bc8d4b..62b988b9a 100644 --- a/mods/ENTITIES/mobs_mc/snowman.lua +++ b/mods/ENTITIES/mobs_mc/snowman.lua @@ -114,7 +114,7 @@ mcl_mobs.register_mob("mobs_mc:snowman", { -- Remove pumpkin if using shears on_rightclick = function(self, clicker) local item = clicker:get_wielded_item() - if self.gotten ~= true and inetest.get_item_group(item:get_name(), "shears") > 0 then + if self.gotten ~= true and minetest.get_item_group(item:get_name(), "shears") > 0 then -- Remove pumpkin self.gotten = true self.object:set_properties({ From 0d16acdd423776deb955beb21e904e267f9611bf Mon Sep 17 00:00:00 2001 From: codiac Date: Mon, 14 Aug 2023 10:48:27 +1000 Subject: [PATCH 070/982] Use a vector and fix the merge fail >_< --- mods/ENTITIES/mcl_mobs/physics.lua | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/mods/ENTITIES/mcl_mobs/physics.lua b/mods/ENTITIES/mcl_mobs/physics.lua index 0f3334367..341e28984 100644 --- a/mods/ENTITIES/mcl_mobs/physics.lua +++ b/mods/ENTITIES/mcl_mobs/physics.lua @@ -675,7 +675,7 @@ function mob_class:do_env_damage() self.standing_in = node_ok(pos, "air").name self.standing_on = node_ok(pos2, "air").name - local pos3 = {x=pos.x, y=pos.y+1, z=pos.z} + local pos3 = vector.offset(pos, 0, 1, 0) self.standing_under = node_ok(pos3, "air").name -- don't fall when on ignore, just stand still @@ -943,7 +943,7 @@ function mob_class:falling(pos) -- in water then float up if registered_node.groups.water then - if acc and self.floats == 1 minetest.registered_nodes[node_ok(vector.offset(pos,0,self.collisionbox[5] -0.25,0)).name].groups.water then + if acc and self.floats == 1 and minetest.registered_nodes[node_ok(vector.offset(pos,0,self.collisionbox[5] -0.25,0)).name].groups.water then self.object:set_acceleration(vector.new(0, -self.fall_speed / (math.max(1, v.y) ^ 2), 0)) end else From d7ea628270e27d687b54f3c9289dfdc387e6cd6c Mon Sep 17 00:00:00 2001 From: Sebastian Riedel Date: Mon, 14 Aug 2023 11:27:36 +0200 Subject: [PATCH 071/982] Revert reversion of 822071c66b30d9a1da3ae810d038bebdb65e101c --- mods/ENTITIES/mobs_mc/LICENSE-media.md | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/mods/ENTITIES/mobs_mc/LICENSE-media.md b/mods/ENTITIES/mobs_mc/LICENSE-media.md index 4e3de49f1..c937097c9 100644 --- a/mods/ENTITIES/mobs_mc/LICENSE-media.md +++ b/mods/ENTITIES/mobs_mc/LICENSE-media.md @@ -191,9 +191,10 @@ Origin of those models: * [Spennnyyy](https://freesound.org/people/Spennnyyy/) (CC0) * `mcl_totems_totem.ogg` * Source: -* [Baŝto](https://opengameart.org/users/ba%C5%9Dto) +* [Baŝto](https://opengameart.org/users/ba%C5%9Dto) (remixer) and [kantouth](https://freesound.org/people/kantouth/) (original author) * `mobs_mc_skeleton_random.*.ogg` (CC BY 3.0) * Source: + * Based on: * [spookymodem](https://freesound.org/people/spookymodem/) * `mobs_mc_skeleton_death.ogg` (CC0) * @@ -307,4 +308,4 @@ Origin of those models: Note: Many of these sounds have been more or less modified to fit the game. -Sounds not mentioned hre are licensed under CC0. +Sounds not mentioned here are licensed under CC0. From 11d275a471c11ffeb13a363fe64ef1637e2aa5d8 Mon Sep 17 00:00:00 2001 From: Sebastian Riedel Date: Mon, 14 Aug 2023 12:57:36 +0200 Subject: [PATCH 072/982] Increase copper needed for blocks from 4 to 9 --- mods/ITEMS/mcl_copper/crafting.lua | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/mods/ITEMS/mcl_copper/crafting.lua b/mods/ITEMS/mcl_copper/crafting.lua index ce280fcdf..41084afb3 100644 --- a/mods/ITEMS/mcl_copper/crafting.lua +++ b/mods/ITEMS/mcl_copper/crafting.lua @@ -10,8 +10,9 @@ minetest.register_craft({ minetest.register_craft({ output = "mcl_copper:block", recipe = { - { "mcl_copper:copper_ingot", "mcl_copper:copper_ingot" }, - { "mcl_copper:copper_ingot", "mcl_copper:copper_ingot" }, + { "mcl_copper:copper_ingot", "mcl_copper:copper_ingot", "mcl_copper:copper_ingot" }, + { "mcl_copper:copper_ingot", "mcl_copper:copper_ingot", "mcl_copper:copper_ingot" }, + { "mcl_copper:copper_ingot", "mcl_copper:copper_ingot", "mcl_copper:copper_ingot" }, }, }) @@ -59,7 +60,7 @@ for _, w in ipairs(waxable_blocks) do end minetest.register_craft({ - output = "mcl_copper:copper_ingot 4", + output = "mcl_copper:copper_ingot 9", recipe = { { "mcl_copper:block" }, }, From dd96af15c44fe63cbb5eccfecd119434be237962 Mon Sep 17 00:00:00 2001 From: cora Date: Tue, 15 Aug 2023 04:09:02 +0200 Subject: [PATCH 073/982] Shears are not enchantable on enchanting table --- mods/ITEMS/mcl_tools/init.lua | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mods/ITEMS/mcl_tools/init.lua b/mods/ITEMS/mcl_tools/init.lua index 2c17aa135..49863268e 100644 --- a/mods/ITEMS/mcl_tools/init.lua +++ b/mods/ITEMS/mcl_tools/init.lua @@ -661,7 +661,7 @@ minetest.register_tool("mcl_tools:shears", { inventory_image = "default_tool_shears.png", wield_image = "default_tool_shears.png", stack_max = 1, - groups = { tool=1, shears=1, dig_speed_class=4, enchantability=14, }, + groups = { tool=1, shears=1, dig_speed_class=4, enchantability=-1, }, tool_capabilities = { full_punch_interval = 0.5, max_drop_level=1, From 6756358307a6ba744677ed0b1cbcb6caf285fcf1 Mon Sep 17 00:00:00 2001 From: Johannes Fritz Date: Mon, 31 Jul 2023 10:04:41 -0500 Subject: [PATCH 074/982] Fix meshhand with mcl_skins disabled --- mods/PLAYER/mcl_meshhand/init.lua | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/mods/PLAYER/mcl_meshhand/init.lua b/mods/PLAYER/mcl_meshhand/init.lua index a28efd502..6d1177b18 100644 --- a/mods/PLAYER/mcl_meshhand/init.lua +++ b/mods/PLAYER/mcl_meshhand/init.lua @@ -85,16 +85,16 @@ function mcl_meshhand.update_player(player) end end +minetest.register_on_joinplayer(function(player) + player:get_inventory():set_size("hand", 1) +end) + if mcl_skins_enabled then mcl_player.register_on_visual_change(mcl_meshhand.update_player) else minetest.register_on_joinplayer(mcl_meshhand.update_player) end -minetest.register_on_joinplayer(function(player) - player:get_inventory():set_size("hand", 1) -end) - -- This is needed to deal damage when punching mobs -- with random items in hand in survival mode minetest.override_item("", { From 64bc57c6a46e9531046fdfec8b4bad82023e7d75 Mon Sep 17 00:00:00 2001 From: chmodsayshello Date: Fri, 18 Aug 2023 16:47:17 +0200 Subject: [PATCH 075/982] replace trim textures with CC ones --- CREDITS.md | 1 + textures/coast_boots.png | Bin 139 -> 175 bytes textures/coast_chestplate.png | Bin 155 -> 272 bytes textures/coast_helmet.png | Bin 145 -> 221 bytes textures/coast_leggings.png | Bin 161 -> 215 bytes textures/dune_boots.png | Bin 115 -> 166 bytes textures/dune_chestplate.png | Bin 147 -> 382 bytes textures/dune_helmet.png | Bin 171 -> 305 bytes textures/dune_leggings.png | Bin 142 -> 341 bytes textures/eye_boots.png | Bin 127 -> 150 bytes textures/eye_chestplate.png | Bin 208 -> 373 bytes textures/eye_helmet.png | Bin 103 -> 144 bytes textures/eye_leggings.png | Bin 177 -> 276 bytes textures/rib_boots.png | Bin 126 -> 199 bytes textures/rib_chestplate.png | Bin 154 -> 353 bytes textures/rib_helmet.png | Bin 139 -> 282 bytes textures/rib_leggings.png | Bin 135 -> 294 bytes textures/sentry_boots.png | Bin 134 -> 143 bytes textures/sentry_chestplate.png | Bin 178 -> 301 bytes textures/sentry_helmet.png | Bin 155 -> 254 bytes textures/sentry_leggings.png | Bin 155 -> 231 bytes textures/snout_boots.png | Bin 124 -> 165 bytes textures/snout_chestplate.png | Bin 203 -> 389 bytes textures/snout_helmet.png | Bin 139 -> 202 bytes textures/snout_leggings.png | Bin 148 -> 237 bytes textures/spire_boots.png | Bin 129 -> 204 bytes textures/spire_chestplate.png | Bin 184 -> 283 bytes textures/spire_helmet.png | Bin 149 -> 233 bytes textures/spire_leggings.png | Bin 166 -> 260 bytes textures/tide_boots.png | Bin 123 -> 162 bytes textures/tide_chestplate.png | Bin 170 -> 293 bytes textures/tide_helmet.png | Bin 171 -> 340 bytes textures/tide_leggings.png | Bin 181 -> 300 bytes textures/vex_boots.png | Bin 114 -> 141 bytes textures/vex_chestplate.png | Bin 215 -> 378 bytes textures/vex_helmet.png | Bin 125 -> 177 bytes textures/vex_leggings.png | Bin 131 -> 167 bytes textures/ward_boots.png | Bin 135 -> 169 bytes textures/ward_chestplate.png | Bin 201 -> 298 bytes textures/ward_helmet.png | Bin 202 -> 228 bytes textures/ward_leggings.png | Bin 189 -> 257 bytes textures/wild_boots.png | Bin 132 -> 177 bytes textures/wild_chestplate.png | Bin 185 -> 345 bytes textures/wild_helmet.png | Bin 155 -> 316 bytes textures/wild_leggings.png | Bin 165 -> 328 bytes 45 files changed, 1 insertion(+) diff --git a/CREDITS.md b/CREDITS.md index 3584cae1e..4873adf1d 100644 --- a/CREDITS.md +++ b/CREDITS.md @@ -175,6 +175,7 @@ * Faerraven / Michieal * Nicu * Exhale +* Aeonix_Aeon ## Translations * Wuzzy diff --git a/textures/coast_boots.png b/textures/coast_boots.png index 8229876bc29a037f3cb56c212fcab70e6ec6828a..5782e80e0ab6833541dcf728ad8460e4b7cb212a 100644 GIT binary patch delta 147 zcmeBXT+cW`rM}G5#W6%e^6kNmf-MRnt{3l1u5FmuEb>r5P%7vUKQHf`n_@2-o$f8W zw&1%AGXo6RJ+krNxqIE~NxNU~%fA}cYIoDMRPXuR4ldc;kFP6l#{!_12WOm)z4*}Q$iB}4ZA;3 delta 110 zcmZ3_*v&XWB|XT~#W5tq`R%2HoCg$mSOeTkMchwn^gU9WR-tjp`~5GumJh1aS-cq; zK;VJU+O0RM=O_1UH>yupO4^%#J|;W1cD}WnT;lniU*`3H|E}DSY%_J8o$nIH?bRS1 Mp00i_>zopr0Gnnk(-?nXP7=~&bM|Bso(!TFX zYb~DVRYg%qp68OLsYFpEK@e0~mWkDe&~=^ozW*^nyu%?pK5fx?o=siXf-0lJNs&$fkiKt8&&Z0eRQ$d%gx9D z0u829f}+-b6|k*;e(o{rvMEtL8^4-9-{Y>IpjYtb_|Kbje-1x|UpxIp@;jzSE=i_nr2hrl}mwbI!>t9;xqpJ30(Q89;|?nnvonwx8RU vlv3-xZ$JB8bPJ3z?^s&^000000N|N^aFc3`&Uy_N00000NkvXXu0mjfz_VEB delta 116 zcmcc1IFWIJN^XRwi(^QJ^V{=hIS(lCum!l6intd7k+65mlt(MKfBPU;BXEL$i3kJ3 zzKc=O6Qf@HUD^A6uHmt{md{VkT`_;}9Q*evpTgce%{%w}?0su_i{A_&u&01=$HV0N Td3PVY0C7EC{an^LB{Ts5%Xc*r diff --git a/textures/coast_leggings.png b/textures/coast_leggings.png index 509e2440789e72a85fe37e34c45fdcdb87ccf18b..a5d6c1c353f468347f4e45e84151d2f28c34598e 100644 GIT binary patch delta 187 zcmZ3;c%5;AO8q=f7srr{dvC8Q@-;gMv_8C-^S)V0Kj?~2N$(21y@NvuWR9n+pUXO@geCyFAvS3M diff --git a/textures/dune_boots.png b/textures/dune_boots.png index 9fba1177211b89e5374b2dcc1918d069c6cd56ef..776dbdceb9249ffb10a91e534057624624939f7e 100644 GIT binary patch delta 137 zcmXS3#yCNxKG)O5F(l*O+e-_185DV16V0*<)*NK>P)TG`nPhlj%^`)o4o*d{YeO`Sp>hfj#%D;?3URi7Jo_;zf_3F8u lvFnp-&N_3P;*NdCxMsJ@a>YHjEJ22Ny85}SV|Get0suGoIoJRI delta 85 zcmZ3+SUf?+-^$a)F+@W0?LkIHW=9_81(V}6rwVD7PWpL+nV$g!er(&FJ!zl*%$aI0 n@0xm+Z};4_d+tm-h9B1U8};SBmss8N1gY|L^>bP0l+XkK8PXr0 diff --git a/textures/dune_chestplate.png b/textures/dune_chestplate.png index 09f87baca240e6e9fac46baf770c347dbecf182f..2edc91c744dcdb7fd3142ba065216d292020829c 100644 GIT binary patch delta 356 zcmV-q0h|7l0saDzBYy!!NklzcCGkJkPL<2Vvc(+F!l%Q9LN1$U`JaUAa|lx0bIo13Lk_PmBPr@+Vldo#|ilQ(T8-~G8)0Di#6G@Vu|3g!tVAC|I z=Xun!ETZfBsk)HUb=_-5VNL!mu`J8X!>o$aD2n!?pg=(o?mNd@u`sKk7<}8dP0!++ zrtv|!v-sOIz+G`10`s^T6DwX-)wh`j1B0u7+Xj3ZfupAh=6$;r;B4q#=W;!Hu4@Y;9+*`e-~)M<^E93XX>%gT@n}K*E%iWSj)-) z0nmdKI;Vst07f=1Y5)KL diff --git a/textures/dune_helmet.png b/textures/dune_helmet.png index 7f3054ced7d808e21ce9a4970bc5329e5b629db7..8aa90b25fb69de67056140d2ae34241710e99444 100644 GIT binary patch delta 278 zcmV+x0qOp$0kHy*B!BoxL_t(&-tE+(iiJQF2H^WRK7c_ms2D8GMAI}cfpuL^ZQCZU|MkF0l28x? z6h#q*VMwZ~3Q3Z9gQ@TPZ*P~^a3HQRO;b3IbNAw&+?&IH*N0z`EX#yX1^@s600000 c0REXL>J@>As}FEz!~g&Q07*qoM6N<$f`xK_y8r+H delta 143 zcmdnUw3=~(N_~;1i(^Q}y|>pk@*Ys&aS7}{r(u4ow`jJ-)Y(%!C!hH5>EYo}e4=fY zyyqp)UE91aZ7XM2$joQh#+gvc@Y*|}R(J{f9-ar^|95Ox{cuuf(v@x1dFjXQd|PvV v-pu>g=g)gCy0BeGY2|s#YGwv7a0re4{Pz^I)mf)+AU=nutDnm{r-UW|swY5E diff --git a/textures/dune_leggings.png b/textures/dune_leggings.png index c30fd98b642813bd86e8a863a10bb3a9efc7a5a0..d40e2b42cf9940b7315731bbb914b323812c9586 100644 GIT binary patch delta 315 zcmV-B0mS}}0o4MKBYy!LNkl8ZB6bJBpD93;}JG(gP&>%JqLbIRR3_=|W z1#t{gQnTq)I~{IW1Cm_?cku(f=4ERr?b_P^4-Uk0@Sb=6-)sf|0000000000@SkkA zTT0WEilQLCuBwXax)xtO+jX7VwyiiGkK%ARkmEQsxq{fXt$+HyFQ1=cnPr)}-@l5} z=_K3`2UJCoIbnlinG;z|H1?Ow%MqQG}*xD$WZ4zz@c8RQtY{9IKoh9IZTd zyB8UT;k19GWm$@*X*e$B^_;Hj@|-NheZ=+LFbtQzf_o4yS`zusWM++F!1nRyx$ z0}vcotdwLIyYKrxu?^?#w_clR`95CPJLQ;!_H&`KleXy}uidh_|BH*EU@d?3N5|7K SOaHoqba}e^xvX1r-e`B?d`^6uWp+% zz`_5k)$=XWZ^kd3l49nf!?1-T@V5&q*p^^e?xZyW}6& zi#rUvcF)!K2wLDU*~Ig_}$$t5bD?@Jk5jWxC$pEIF{0SG)@{an^LB{Ts5Uic<# diff --git a/textures/eye_chestplate.png b/textures/eye_chestplate.png index 1592bec610840646de519e50b2981b400c9097de..71bb0fa7b0258c4c07d607d3b4d20a2d034973a1 100644 GIT binary patch delta 347 zcmV-h0i^!W0rdiqBYy!rNklg5!`1k;yA7eN?=)&*$j^os0Y_v@0qeJ>G=H(2q9qGHeH#p(@xs$jslaw zb^W{gzBM=_)>Qr7Elk_1&2?lNKNhU1`bsu{1?VVS-+|IJrRU^?uFV$EG>w;KxjwvZ tuCMApdD=JE=L~2Ff?!P+!s5{K`T_$sq%m*<&^-VE002ovPDHLkV1nPFp|}75 delta 181 zcmey$bb)b#ay`RzPZ!6KjC*gdKICjr5NLboRx09N2t>kRo31vQwBD_h7Eq zaYhCRu%8rk%JA6g$oTi)cod&h@9EV{`+4ZfvuXbOra!rSQsR)sV#R(M7g>~;oO>gnp|vd$@?2>{T?QeprA diff --git a/textures/eye_helmet.png b/textures/eye_helmet.png index a3ba5beb5b2f4d54849e5a6a184c3245091da6b2..7c049b08672d36a75b420e050ef5e00329d2ba6d 100644 GIT binary patch delta 114 zcmYeFz&JrAC*0G;F+@W0?LkN01_K_4i&nE49|QCTlKjS=Gh>0SDam*Zh#^y>+c( PFG#@C)z4*}Q$iB}ElVzG delta 73 zcmbQhm_9+pS-WNHQ?kO-s4`E+*IfBp(9^ Z*jU~;$-7r4*z-7u=jrO_vd$@?2>?Ul7N!6I diff --git a/textures/eye_leggings.png b/textures/eye_leggings.png index 9fadede49993a07f7a61eadae079bc6af0cdf990..64fc3192b70cc98334a91ffb796137be9224b629 100644 GIT binary patch delta 248 zcmVw3W87&2HH zr{!W!yKPF2;}qTgs;Y`KO)1ZF3W9(JyO=17dWX9&X1Ig1x^b?>tKW^|n3Pgt5X1Vu zPquB7=Xq`M@4Bue(=>YrT|aM delta 149 zcmbQjw2^UwN_~Z=i(^Q}y|>pk@-iFpIA4^GU0fj2x5#(KsRk})OPK=KIsc;q=lZ_b z#Q*_+L_Jro3JFzl4a!-*TUm2=P5JR}WpzBaD~+sQrP|Dt{mi=W?OGdEriAowC+7Oi zto;;xchkGZyRsXNKIhGdygl=`w*7M()d!*S8>9LH7j^TsyMxU2boFyt=akR{06H5# AwEzGB diff --git a/textures/rib_boots.png b/textures/rib_boots.png index ff7f6170f26de28bf9498d3183ad09fb3948fa1f..4549b077e7b40a63e04fca7e8779b38ba7065690 100644 GIT binary patch delta 170 zcmb}j{L6u?k70Xn7ypJ`8w5%GJ}wF(l*O+e-@>4>)kJ9Mta(S~unOoE1M_{ONILsODn;gM!v=*2dPx xx65wlP5Nu~x~X1E;pFr8>Nn#>KIqkFGw_?$D}LmXd%Oyy*wfX|Wt~$(69Cm3C!PQR diff --git a/textures/rib_chestplate.png b/textures/rib_chestplate.png index 7674f4101a0b93da81365bc7ca26328b842eefa2..a9a78e8b3c9804262d8b1513b3996073bc8eb279 100644 GIT binary patch delta 327 zcmV-N0l5B}0pS9WBYy!XNklS03#}QpO5vGO%(1c2LH;su21tSUR`Ke77gZq z=BxeQHZHHaNxs!zUu%0002ovPDHLkV1luAq(cAz delta 126 zcmaFJG>dV9aydhyr;B4q#=Wx})hpeeNH9Rb zpQg8yLMELmQ(bxW_FNsmsD`&uJChmXJudO8zHC$Z`u+L0cb|&O_ANXZEdJrji+4#s b3_k4Q{=F)Tzg7RoERY$Vu6{1-oD!MXz)+103^X(I zClXAw1VgKs<1Kg`cZi{Iybp$zVdjDC8U_&&5fKs51Ck_>JkNF2buC@j>6+(Rnx^UR z_Sbdohhcc{A>+(LHgeGa%vzSE$6ORe^7Q{3<2b6KC=^cAzIX5HI1aUKn?6xjyKUR* z`EwTEXAUw^=$B<_eeX`wWW{l;jHh{?CywKY>$>{Ja4WWLOBjYyRTXYdf*|;L3F!I0 zFIkr9S?pjJ8OTB=DoxYNS7e&z?F%C!A|fIpA|m=bFKj)ruUBH0DgXcg07*qoM6N<$ Ef>^9{*#H0l delta 110 zcmV-!0FnQi0*e8VBxh1dL_t(&-tE!35r6;)1VBr>QYeMaF?IYSO?E@xVOSOb0DvEK z_jLDE)g+lDQ&qE#U-j5S=&? zy3-K~?Irp-yNPS=BiCGV;{QuFW0RR?%#I`h00000000000GvtJb*v}~Hjbl+r)z-c zd1Tu*MNve$uJeF80on6Ph?-z5`J=Va5k)hVH3)fwZoPO@?9&YCPUkrc#xhQl=-L?Q}@O1Ta JS?83{1OVgOD<1#= diff --git a/textures/sentry_boots.png b/textures/sentry_boots.png index b72a6cf294c33df75b727eb8129af69db0fb1514..9296361bbdfb7920e08c306b85ac5d13f4f26a02 100644 GIT binary patch delta 114 zcmZo;>}Q;yk{#yh;us%j{G_v1~8Di zU7f!4>Wi&mVdox}?*E_Ne%^BPr|sf`@!$7EuY8z$ym%)2ggFKuxf-Wk0IBzM^>bP0 Hl+XkK9Fr|U diff --git a/textures/sentry_chestplate.png b/textures/sentry_chestplate.png index 4b8bb133dbd5a9feddeb095b8adaa42df5cedf99..f09d7040444e43a1b977df1bef2f83147fb705e6 100644 GIT binary patch delta 274 zcmV+t0qy>>0j&a%B!BctL_t(&-tE;rOT$nU#_@iy3{AGcrI?S9q?I1Q(h>+{5#tAt z;$YO)Qu-ny*|Xm4cgdJB-{f%-!6E46+kJlf9nPP_xq|@_5fKp)5fKp)(J#}sEslph ztPN1tHNr5oGr;k%$IbE@uIoZX@VH)Kx81<=ykXy)D2j$J&wo!pzct1fou;X_c6Ar? znN~{K7oaRlyw25(oN`0lLi(^Q}y|+tLjGav7f;n;^QFzp_RVWU!~JpUXO@geCwNuR!s4uU`shT%O96*bvVY^_#mYs8<<7*Ilt6_nKe zL_CRGkU+^1wxp!kJB)XLYBS$+gL#vgj1UePhJm#Hk>ILrTe`+4-T{t>J>LLYYg(_C zd;?TfMN&$>0WR^GeBb9A;C{<^2guTdJkR4Bz!*bWnv4!$ty`tKuH6kd^$+N}&h07IAzN1CoA|gc^5f%{9h7M_^{@w z1p@;^!}ZXqyKfsmp7}BAwbi6KmY%m`pY6UK`qban%G*9N=91VWy_6)i3?;R=rjKud d>OorSEgA2z#Vqt-_00tFJzf1=);T3K0RRSkG&BGJ diff --git a/textures/sentry_leggings.png b/textures/sentry_leggings.png index d47aa7eabe3b5275f717abf3e5569fca9e145ad2..80ca3a4534d36b10b7c2f7fe5b60d647f2a661dc 100644 GIT binary patch delta 203 zcmV;+05t!b0p|gbB!8|+L_t(&-tE+}3c@fDfZ;w)-y-w@q*=tpB1O>Af<8d0pdGtN zCn;pg6J%}a)VDgh&c1-={~&O=WVz##Bmn>b0000007Ph>XVZ0^IOohXO;VPniK_Tz zS){5eX`03y_B$zx?bil`5XR@@F2nF%@BV!8ZQDv+*K$4`*F*+rtogowt+D2G>E3%U zx9erpb8V2dR{nAt^a*5HW}^HHbgc7yBWaq(*#H2D$p`kNPl6xfQ854j002ovPDHLk FV1iPuVtfDq delta 126 zcmaFPIGb^TN_mo}i(^Q}y|-5!xf&D%SOfas1=@7Ee^hHd|qAH>b9tK=)Fy!&|_;~cnP^KOl6 ep=-p>-(p-+UO#i~qN`yb13X>*T-G@yGywn~k2eAU diff --git a/textures/snout_boots.png b/textures/snout_boots.png index 023dd569c97c7fea7a48867a821dee7f086e74a0..e863989bf1e431bd8d9fae32e4594710baf24d63 100644 GIT binary patch delta 136 zcmbU^gCc7$Q(~sKbLh*ObJZ@+^jcP delta 94 zcmZ3=STjK-!r9ZsF(l*O+sg+z84NjC4t$AkT^i9fSK<@Lo#$K}=MFTz@jtkg0Sweu wudaHC+>iYy7X zLfDEJHG-`O_Oz!xcodAli+CIT4t@a<{2DJN*jQqX2qKgByXkujzL_`ARtq775JCtc zgb+dqA%qaBJ>U1CDi+5vG^*GrikM|tZ1(y3YEW6^}!=9u-ny|)d5M8 zu!A1?I8o2@m@La;RsP1REZVls{=98RqY>QR3}CO@`SHg*KMg_Gby!+l0994Nb?k4g z$2aWEG@ylkS(arm9*^gq$m>hMjt|M)SP%s4^uz$`vJa+dvNTQUG!}*-Ez9!DL022D z>x$c3>!2tKIAo4Pc_IAW=e(jQL>|lYobq2-yWNKAJziOssMb+{Pw)FX8;m3JzSh6$ z1WA&pAPAHYLiHYji}OD46XY|17dDwpU`JKx=9)x#!FYFS;tfoKoVK&mIeP#A002ov JPDHLkV1kISu7m&p delta 176 zcmZo=KFv5mxt?K?r;B4q#=W;!5ArrB@HhmzrHZ&E0+FyUzv&V|4-={G|8qkGGFJ*P zF+jkB-(H%xrF6rzY zx9)4*G={%+yPsYT^13T}jq62d#~$s~smC*J$EZ50Yu1TvvB~~@bIDD^JMS;Nwg26n b%<1=bvHXUkwS6MYAPYTR{an^LB{Ts5at=ze diff --git a/textures/snout_helmet.png b/textures/snout_helmet.png index a117526a43310769ba68ff4bd7d5321320892e95..a25297dac64b3487a7bda80add9673e3ce768aaa 100644 GIT binary patch delta 174 zcmeBXJjFOcrGBEPi(`m{(jfM1pY7pfv2mV%Q~loCIBqOOeg>V delta 110 zcmX@b*v&XWB|XT~#W6%e^6kNmybTUKEC+=bP0+u)bjOspM@$?(G%+;I?Nsrcw8TI3 zDg(2R9247&RkL!eJ_$QC>|td&vCi0@amnt@*G>iBl~r&6sskyl7H62R-B^^;(aZn@ Mp00i_>zopr0F%%v%>V!Z diff --git a/textures/snout_leggings.png b/textures/snout_leggings.png index aa3b341b1901c37da03aaa26fb95c9008d919fa2..1ff74f4a342b5f193863da273b629766fd6cb0c6 100644 GIT binary patch delta 209 zcmbQj_?B^kO8pj37srr{dvCAW@-;aKv_1Upai_Vfg3&5>!=gtLSsbi}(xwMn+T8Bs z@i`s#y~efp*fGDS)w_OXrWxI26@-JCGizg|9U`Z(734`V7o5Af``=2tumAU0^zkNa zjgfMgwaowH>XrLEgf9Q=II*};hBrZi?eo3%efwFw-mm{$seNmkX~X4@0?Y2??dIIP zyJg+$ch2Ijg8yFK{!_yET8Enbn<2lRKtF)d}%I&NCAbstYSGW0IK@|od@O1Ta JS?83{1OS0qUYP&@ delta 119 zcmaFMIE8V7NrZkm5lbfcU%18q z0vc)OW-hOr{eN%AiQxTbnRWJlkEva6#JHxtuxH}?0I!?O5zi;h4)}Jvr{m7+)!%Cv X1ok92CpR@!f%JO1`njxgN@xNA4Hqvq5TTJz%a zzN_E&wk6K^yldUoAIzsVg+#1hvr0>rznWW7<9zXH%}qX;vySb*d$&wj+|}^8=cF5# azSlEW^11uBE}py{WP_)xpUXO@geCxGh){k2 delta 100 zcmX@Z*vL3RCDy~!#W5tq`R#>^oCgdzSP%5P)98DoadU}k;}_)%jJNI_e5_cPnauzO z1%0b_xurjQbMLotzsr#`x8DEFeBH5K{Y_n|O#$=giTZ^bJAGV0Dm`8OT-G@yGywqa CTP+#@ diff --git a/textures/spire_chestplate.png b/textures/spire_chestplate.png index 32cc08b75bc2f9537653dd37773daca826029876..baafb613789c542b4b62bfc695c386f2a0a0c8b7 100644 GIT binary patch delta 255 zcmVt(D?T z3{YUo2%nHJ4tVU$*9#$gaZb*NtaJj4Vd{lUPL;sf%`C z;1PJAGrgn?I_W|}zMtflyZ+MV(kKD|0KhWJvXr7Iq-h!ny=j`nn3FtgFT*g1b55?^ zMRwbb*72~Hs;V@1>&|+19LG6t`@7D3g}l#%xqChJzBEne-bUh*B$2wVwemdw`C)M! z>r&dbl`PA?^2V6C=kNHOuby9k|3%i?zZMJt000000AL;73iNJTRtY-$00000NkvXX Hu0mjf%&28w delta 120 zcmV-;0EhqS0hIxeByn6xL_t(&L+#SR3BVu>1yJ{&!ciQ>OpU0vf0JPOb2CSxt%^f&-!s|ciF;%tb`~betX!A9ZdKQ*O(|RD+8o#KUiWxg z?#fIl+0fYg-zUHR{O9L?|2KvEH|E}cl4ov}7J1B5=5pfxFVdQ&MBb@07N8cnE(I) delta 138 zcmV;50CoR_0;U0wB!6v5L_t(&-tE*u3V_+o?{ggUQp(KZ%;zp(6d3EP3%JW){qke11;$ISSD z;DP;}YSZUeEZvL!)^5F09lmz!4*6peNB72_+qpyk-ftnN058w9W!GkXyZ37E=`$&5 gRrA~p-7FtmwOjSr==^q$u6mF`p00i_>zopr03&!gQ2+n{ delta 93 zcmZ3)SUo`{+{x3$F(l*O+e?nT2Ml<8paWI@>bTV$X8AtGY75hJ1_lPlo!JLJ= vm+w|TIeG7Q8GD~eD_8ly+j#G8>x1ih8e4QfI&YEO08-`Y>gTe~DWM4f^e`sC diff --git a/textures/tide_chestplate.png b/textures/tide_chestplate.png index 1cbf82aa1884deb418bae92684448e929ecb2331..ae5a219cc5285bf0b2fc147c69ab3d76abc127e3 100644 GIT binary patch delta 266 zcmV+l0rmc>0i^t$FSE%eO$dvGg?Xw?+w{-$Pc4fOLI@#*5JCtcgb+dqxjc1U%idbob#iO*%d)(( zEZY^C=eYzy@Vc$|X_~Zc+iGu*@B6B4TRo2Bxh4$5pyD{*Eq^pkQ^89%O(SNp7~>V! zvr<)+e8*7~edZ8&bhqbu3g=EWpznJWdsqb86`6(+MNtThaUAErTX>#log|5NU01Ir z=tup~WmzhSH!`VzMd5ZJuVxFQ#gW~|7!ZcxMl7=Z7z5UyeUo`J5?A64TA+GSazi!% Q00000NkvXXt^-0~f|&tz0ssI2 delta 142 zcmZ3=w2EEUrtcvN=fB6Swq9?nnpUXO@geCw1i9MPC diff --git a/textures/tide_helmet.png b/textures/tide_helmet.png index a3c525c4689cb87e03ff5f0d0fa8623b4645f44e..4e08461cab675c34f333705cf3cd30d201c0a8ef 100644 GIT binary patch delta 314 zcmV-A0mc5S0n`GJBYy!KNklvj6b9h`kqAV$D_H|`KER7G=3u&4Pd{I@EVBvH+34Bo$ zgWZ;vgX(Y=sGfk6uJRX7{yx(uZLff{2HL2^G%d&K@*UO#HXT}dcpO3TFGG^mA z^7VRkSerCW9T7SFsPB8zb)EEmZ>DK7d7euYMFwkA*EJIn;}2PunPC{D>pDr2#9)ms zmy2vR8^NFM_cOcO?RE~nvexo;yJh%_h&T*GhEhr?rIb=iDW#OpzBy8bEhP+DlK=n! M07*qoM6N<$g5O(>NB{r; delta 144 zcmcb@w3=~(ay>(lr;B4q#=W;!b_yPF;BXG~x*w#`8uWr?xmw3IHJpK+%rcQ96o8@hINJSp_Wy#-J9X|EAqB?b+utz(K+py+Wc6?0|)t6Xi0Odc1oxR>GE{- Kb6Mw<&;$UJT__U( delta 84 zcmeBWESjL=XX)wU7?N@C?FB|g1_hqO220|(g4CY+Ih+t;e{0DA0uEd6)_TT$ZK%$F k-=M-4!aqZjIqR|JXT}6;#j>{NED|6!p00i_>zopr0NXqqod5s; diff --git a/textures/vex_chestplate.png b/textures/vex_chestplate.png index 50d29ec6c8d5af873c2048b11436c49fb165b2b3..77ab1e0f6db4aad93b4aecb837ecf13f5b2d7b44 100644 GIT binary patch delta 352 zcmV-m0iXWY0r~=vBYy!wNkl$=XyTt6R%A*iY<_J8wrU5il^!RQ6x26SBq z!!Ur|Dx16KdB7OsKbfX!_*?J__jhZsEbCX^aU9694B|M3BuVU|C~Opio1dRa;}@_E z(=_?xgAT6iig=QrAMda@m-x0Uo<7PzF(~f&$pU4ygq6I6%lWBzu%m$zupM~)wfUiZ zH-uv&@L53+@L7RtVDBS@FCZ^=tMQBLa81+TO!*rTX%CUa~!d~3c$JE yRlq@me*~Q8$qK**Oj-bb)k(mV1+1AedI4X>9ns}9oUHx;0000 zZHx>saG<*A+}2RdrP~T$O|JTQ>F%EW<_gCmoH^RBOp6k(Dd^w+QFCdx;;YLyrbHH+ zJ*@e${Kvdyby8*r&G+Th259x4dHDQcPLbQ*oedXFx3*tQTkiifka^jPC-G7jehW=s n#po^lfN9$r#(!M@_Z*kyeEVeUnjNwJAiF(X{an^LB{Ts5Oq5rQ diff --git a/textures/vex_helmet.png b/textures/vex_helmet.png index 8f40f4c9efd12ff6d2a88558669a4a6168aff738..613af3decd84f829b21839474180b5b652a9b8fa 100644 GIT binary patch delta 148 zcmb>3$T&fzzQWVRF+@W0?ZJ(_PKqK9fo9HkpOmV#vG~4_eAw?WqoGOem_j0}62q-qoJE^pL4wb ydc~GByE(;YZQoVxj=NI5UMYzes2L3G_cDrBm_*01@uho$1Uy~+T-G@yGywnvhB@j0 delta 95 zcmdnUSUW)_(#6xoF(l*O+e-_14>)kJUXY#}DA9U0LtsX6sqg2wriOl{Im`?U4D*Eq y=gy1`txY$col{m<+hBX>%DL_L@2mz&G349W^QvvGU3)tK#Pf9Zb6Mw<&;$T5oFyCp diff --git a/textures/vex_leggings.png b/textures/vex_leggings.png index 99c4459bc3fc0ce7b62c4b0868fbcf31766b72d4..d7e179a22cff6c40781161001fee229b2ccfd28f 100644 GIT binary patch delta 139 zcmZo>T+TQ_r9RKo#W5t~-rK7ic^ec&TmzpkTJ%Rbz=%mzIpC7;R)b@Qc5qAAN-zI# z*Z9y`?|YjVAmBjyxtF)CV$2RyzL^(viT6Tvx$$M*4|k@w3zRVDy#64uIIrQ_tg?on quIF<~nXg1`6;DXJrO)u^KKFBG&3+A~%bp-(JYD@r$PMI0?Pjvx6c;d+HP(JT754Fd?wSINI! zZsu_NEyMRX#z}A3ES~4E&#-UYcAI-feY58_afbiz+0B+4uh%q8{{T|&>FVdQ&MBb@ E0I<3yl>h($ diff --git a/textures/ward_boots.png b/textures/ward_boots.png index 6616f3b5c0314def1a5612909438c48694a94adf..2918e54e53d3573ae0e220d113dd5939a7241d16 100644 GIT binary patch delta 141 zcmZo?T*){=rM|$^#W6%e^6kNmyoU@#Tm$pPf?S%!Bp5g^@8$`yck^&alw4Nu(>wqB z4dpw?&MBb@09cYU{Qv*} delta 106 zcmZ3<*v>dXCE3r@#W5t~-rLIuIT;jrSRA~!PMI<(=+aGDt|rqNk`W@0j=LUb0D~7= z#`{;@%8Wh`bzA(xt3!etH-GysZn4?&`8mtt^Ye9=-t}IvQeJMeOXt0(d-sEMc)I$z JtaD0e0su8OEzUi1d>FT2>pIwFg6DJeK)5h0RR91000000002|J=b+9ZO-?7 z%6tH(!BdOmoM$_LIF9A@YMxr;Zo47R^W@AF8-^hr_KXxok$Mf)o-_I_fPB8LH|A)s=xmfdfkpL zHk=%1jFDj&dTw56@e(_ZL*fLNi#bVoGttKMuAdvT>8ohVvho>#XqPjmfBr8&0H%p$ V=pzvh4gdfE00>D%PDHLkV1hD8dpH09 delta 173 zcmZ3*bdqs`O8o>+7srr{dv7l{ayBRkv?jWjintd7k?>M2R90(uOI*WR XAi4M?hx4@4AnQC`{an^LB{Ts5C9g;% diff --git a/textures/ward_helmet.png b/textures/ward_helmet.png index a28ee2ecd85e6479d0941d402a4368f6bfafc17e..02e57103c61aaed4f45de2e888d063fb58f23d48 100644 GIT binary patch delta 200 zcmV;(05|{20ptOYB!8<(L_t(&L+#Kp3c@fH#_`^)WN>g5#5Hm15uzf5ihDd+%} z=+L2K#~h(Id6EY@lsb3t|ARon_q`C3WdHyGSjY9^#d|MxT}zBnSKGGIG>vp!C&MsE z-}kzorb*AKd%p!qv!Cubj+&=lRaJWD`Q(4jzn%{{>~}JM&p~RObGfxvj?RiPCZFeJ zS$^}>o#)$)(Yz>%#XQZ25cFe~asU7T00000_zQ207<{dcB{Bv80000&O;0 zRR)GW(_=I4MZB;5w~yhX;^IdP@)L{a2`!x>y7ijq+O5`4q)xogbG~=ea+lxdjJUJ9 z#c!lnbG Yk6SZp?sK8`H*-N;Pgg&ebxsLQ07{li1poj5 diff --git a/textures/ward_leggings.png b/textures/ward_leggings.png index 4bd70c1a699713ca2a1290b82fbd9e35255f96a9..b25ca08efba86c6639da56c122c945fac37056d4 100644 GIT binary patch delta 229 zcmVpZQEp77V+Loj8W!!E_q#RjqazEO0IR9 z-=YcD+Mfr}M%?xmIOm?-fVORA7zWWs)X?j#(f7TK<5*T63|;`=a?WKe);Q0X97p;H z9i1VBGD`P-zg#~}6Ymc22fs-DBN$_(>)y-wzjWymcoTZbk|qCBQc_SbOf86=l$3;5 fy^oI%&C37)juzI0{z1Lc00000NkvXXu0mjf51whH delta 161 zcmV;S0ABxr0=)r{B!7fSL_t(&-tE@G3BVu_L{Uq%6ieAsEX7U|M%ZBXpr=64|6n0% z4$GxR%(}W&7e#x@HcyGX z>8;Mulwe-rU%fhf&pKuX82GR~Ywfdl-?H?YGizHuJKJk84@w@Fy1e)gcubH#? yQEAxz`!_3XBE39U>*v?*Y6-XJWB)k)SnkEI4notE`JzlgCV9I0xvXqXc)(%}7llkh&CoYL5ZiAaYJvIn2z`%!i zPqmYCcD>zL`^G%-uI;3d&?@tj&)@GZzwOPC_mv^DS>A5zF6BF5QSH@C2_s7oil)+N9qP+~^?lz4t~Z6951J000000001h z(Tk#phMr|vMn@I4X&N2JvHpGU^TQtu>H9t%Re0{`{oR5tPk%*Ugtl$X&H8aL-CQrz|V=^k-(W(Xr;B4q#=W;!4{{z*;Au^CFP+l!NTctOn&x`}jZ0rHOuqHM*`Zta zi>jA5BLftymQMaLeQWZUdzUAyHMP&X^*Q9e)2x~D!Xe*hZPQvOy6@Vowkxw{ZMf<; zqdD*M!&fCG(V~j;&gJ;{m)7f7*S+2>Gr8yFzfa*)-?EA8JYlkM?hjU2{%<|Va8Fl1 Jmvv4FO#rOvNdy1@ diff --git a/textures/wild_helmet.png b/textures/wild_helmet.png index 88b815ceb92648129e0fa2ef8c34e140c375564c..866ef67de3788e9ae33fda45d5665f4dc22cb893 100644 GIT binary patch delta 290 zcmV+-0p0$a0lWf`BYyz{Nkl>JEXiXShSYUk+O}=}cL%@A=O$N% zJnxy`%}5AAMNu3-o4T$`ZVQJKMN#RxF0EHfQsy7RE#bDj?zVJ0y;0}lXN!B=oX<|} o_-UA_0RR9102=@R0Dz*t0h=?1`}8F-ZU6uP07*qoM6N<$f->KQH2?qr delta 127 zcmdnPG@EgPas@+@r;B4q#=Wp#Q>=B|!`f z4ePH)g=gn}y;t62Se8DM#u)UIDdr5@ix%c~;KwM8(KbLh*2~7Y`eL0K( diff --git a/textures/wild_leggings.png b/textures/wild_leggings.png index eab3d865b3f0acb3ed74a89078a5c8bf3bedad38..f4657ab134f99d7a5d70a954055187d8b0b7f3c1 100644 GIT binary patch delta 302 zcmV+}0nz@Y0muT7BYy!8Nkl>UDty9W%)+u(}~h0UzV&9T%0fbonaWapD_pD7kB&p#WYPBmai|*l;=6! zAAG^(FMST!-6wWS9Js~tD2LND?ZV-Uy8?gf1KmrgOpS$NjQ{`u07*qoM6N<$f`CVo AlK=n! delta 138 zcmX@Xw3Kmzay>(ir;B4q#=W;!4ssq)5OBFTW!KUi&EQkhlGGS{hk5^MwTHgdUH1lLlBcVm%Q|MKgeCyryg;P@ From 85c1c57e953017bfe32295ee80afe4225d05bf74 Mon Sep 17 00:00:00 2001 From: codiac Date: Sat, 19 Aug 2023 11:36:04 +1000 Subject: [PATCH 076/982] Fix formatting. Remove plain terracotta. --- mods/ENTITIES/mobs_mc/villager.lua | 128 ++++++++++++++--------------- 1 file changed, 63 insertions(+), 65 deletions(-) diff --git a/mods/ENTITIES/mobs_mc/villager.lua b/mods/ENTITIES/mobs_mc/villager.lua index b5c8efcd8..20f1aa5fd 100644 --- a/mods/ENTITIES/mobs_mc/villager.lua +++ b/mods/ENTITIES/mobs_mc/villager.lua @@ -163,7 +163,7 @@ local professions = { { { { "mcl_fishing:pufferfish_raw", 4, 4 }, E1 }, - --Boat cherry? + --Boat cherry? { { "mcl_boats:boat", 1, 1 }, E1 }, { { "mcl_boats:boat_acacia", 1, 1 }, E1 }, { { "mcl_boats:boat_spruce", 1, 1 }, E1 }, @@ -234,7 +234,7 @@ local professions = { { { "mcl_dye:green", 12, 12 }, E1 }, { { "mcl_dye:lightblue", 12, 12 }, E1 }, { { "mcl_dye:white", 12, 12 }, E1 }, - + { E1, { "mcl_wool:white", 1, 1 } }, { E1, { "mcl_wool:grey", 1, 1 } }, { E1, { "mcl_wool:silver", 1, 1 } }, @@ -276,7 +276,7 @@ local professions = { { { "mcl_dye:pink", 12, 12 }, E1 }, { { "mcl_dye:yellow", 12, 12 }, E1 }, { { "mcl_dye:orange", 12, 12 }, E1 }, - + { { "mcl_core:emerald", 3, 3 }, { "mcl_beds:bed_red_bottom", 1, 1 } }, { { "mcl_core:emerald", 3, 3 }, { "mcl_beds:bed_blue_bottom", 1, 1 } }, { { "mcl_core:emerald", 3, 3 }, { "mcl_beds:bed_cyan_bottom", 1, 1 } }, @@ -612,73 +612,71 @@ local professions = { }, }, mason = { - name = N("Mason"), - texture = "mobs_mc_villager_mason.png", - jobsite = "mcl_stonecutter:stonecutter", - trades = { - { - { { "mcl_core:clay_lump", 10, 10 }, E1 }, - { E1, { "mcl_core:brick", 10, 10 } }, - }, + name = N("Mason"), + texture = "mobs_mc_villager_mason.png", + jobsite = "mcl_stonecutter:stonecutter", + trades = { + { + { { "mcl_core:clay_lump", 10, 10 }, E1 }, + { E1, { "mcl_core:brick", 10, 10 } }, + }, - { - { { "mcl_core:stone", 20, 20 }, E1 }, - { E1, { "mcl_core:stonebrickcarved", 4, 4 } }, - }, + { + { { "mcl_core:stone", 20, 20 }, E1 }, + { E1, { "mcl_core:stonebrickcarved", 4, 4 } }, + }, - { - { { "mcl_core:granite", 16, 16 }, E1 }, - { { "mcl_core:andesite", 16, 16 }, E1 }, - { { "mcl_core:diorite", 16, 16 }, E1 }, - { E1, { "mcl_core:andesite_smooth", 4, 4 } }, - { E1, { "mcl_core:granite_smooth", 4, 4 } }, - { E1, { "mcl_core:diorite_smooth", 4, 4 } }, - --FIXME: { E1, { "Dripstone Block", 4, 4 } }, - }, + { + { { "mcl_core:granite", 16, 16 }, E1 }, + { { "mcl_core:andesite", 16, 16 }, E1 }, + { { "mcl_core:diorite", 16, 16 }, E1 }, + { E1, { "mcl_core:andesite_smooth", 4, 4 } }, + { E1, { "mcl_core:granite_smooth", 4, 4 } }, + { E1, { "mcl_core:diorite_smooth", 4, 4 } }, + --FIXME: { E1, { "Dripstone Block", 4, 4 } }, + }, - { - { { "mcl_nether:quartz", 12, 12 }, E1 }, - --Only Colored Terracotta? - { E1, { "mcl_colorblocks:hardened_clay", 1, 1 } }, - { E1, { "mcl_colorblocks:hardened_clay_white", 1, 1 } }, - { E1, { "mcl_colorblocks:hardened_clay_grey", 1, 1 } }, - { E1, { "mcl_colorblocks:hardened_clay_silver", 1, 1 } }, - { E1, { "mcl_colorblocks:hardened_clay_black", 1, 1 } }, - { E1, { "mcl_colorblocks:hardened_clay_red", 1, 1 } }, - { E1, { "mcl_colorblocks:hardened_clay_yellow", 1, 1 } }, - { E1, { "mcl_colorblocks:hardened_clay_green", 1, 1 } }, - { E1, { "mcl_colorblocks:hardened_clay_cyan", 1, 1 } }, - { E1, { "mcl_colorblocks:hardened_clay_blue", 1, 1 } }, - { E1, { "mcl_colorblocks:hardened_clay_magenta", 1, 1 } }, - { E1, { "mcl_colorblocks:hardened_clay_orange", 1, 1 } }, - { E1, { "mcl_colorblocks:hardened_clay_brown", 1, 1 } }, - { E1, { "mcl_colorblocks:hardened_clay_pink", 1, 1 } }, - { E1, { "mcl_colorblocks:hardened_clay_light_blue", 1, 1 } }, - { E1, { "mcl_colorblocks:hardened_clay_lime", 1, 1 } }, - { E1, { "mcl_colorblocks:hardened_clay_purple", 1, 1 } }, + { + { { "mcl_nether:quartz", 12, 12 }, E1 }, + { E1, { "mcl_colorblocks:hardened_clay_white", 1, 1 } }, + { E1, { "mcl_colorblocks:hardened_clay_grey", 1, 1 } }, + { E1, { "mcl_colorblocks:hardened_clay_silver", 1, 1 } }, + { E1, { "mcl_colorblocks:hardened_clay_black", 1, 1 } }, + { E1, { "mcl_colorblocks:hardened_clay_red", 1, 1 } }, + { E1, { "mcl_colorblocks:hardened_clay_yellow", 1, 1 } }, + { E1, { "mcl_colorblocks:hardened_clay_green", 1, 1 } }, + { E1, { "mcl_colorblocks:hardened_clay_cyan", 1, 1 } }, + { E1, { "mcl_colorblocks:hardened_clay_blue", 1, 1 } }, + { E1, { "mcl_colorblocks:hardened_clay_magenta", 1, 1 } }, + { E1, { "mcl_colorblocks:hardened_clay_orange", 1, 1 } }, + { E1, { "mcl_colorblocks:hardened_clay_brown", 1, 1 } }, + { E1, { "mcl_colorblocks:hardened_clay_pink", 1, 1 } }, + { E1, { "mcl_colorblocks:hardened_clay_light_blue", 1, 1 } }, + { E1, { "mcl_colorblocks:hardened_clay_lime", 1, 1 } }, + { E1, { "mcl_colorblocks:hardened_clay_purple", 1, 1 } }, - { E1, { "mcl_colorblocks:glazed_terracotta_white", 1, 1 } }, - { E1, { "mcl_colorblocks:glazed_terracotta_grey", 1, 1 } }, - { E1, { "mcl_colorblocks:glazed_terracotta_silver", 1, 1 } }, - { E1, { "mcl_colorblocks:glazed_terracotta_black", 1, 1 } }, - { E1, { "mcl_colorblocks:glazed_terracotta_red", 1, 1 } }, - { E1, { "mcl_colorblocks:glazed_terracotta_yellow", 1, 1 } }, - { E1, { "mcl_colorblocks:glazed_terracotta_green", 1, 1 } }, - { E1, { "mcl_colorblocks:glazed_terracotta_cyan", 1, 1 } }, - { E1, { "mcl_colorblocks:glazed_terracotta_blue", 1, 1 } }, - { E1, { "mcl_colorblocks:glazed_terracotta_magenta", 1, 1 } }, - { E1, { "mcl_colorblocks:glazed_terracotta_orange", 1, 1 } }, - { E1, { "mcl_colorblocks:glazed_terracotta_brown", 1, 1 } }, - { E1, { "mcl_colorblocks:glazed_terracotta_pink", 1, 1 } }, - { E1, { "mcl_colorblocks:glazed_terracotta_light_blue", 1, 1 } }, - { E1, { "mcl_colorblocks:glazed_terracotta_lime", 1, 1 } }, - { E1, { "mcl_colorblocks:glazed_terracotta_purple", 1, 1 } }, - }, + { E1, { "mcl_colorblocks:glazed_terracotta_white", 1, 1 } }, + { E1, { "mcl_colorblocks:glazed_terracotta_grey", 1, 1 } }, + { E1, { "mcl_colorblocks:glazed_terracotta_silver", 1, 1 } }, + { E1, { "mcl_colorblocks:glazed_terracotta_black", 1, 1 } }, + { E1, { "mcl_colorblocks:glazed_terracotta_red", 1, 1 } }, + { E1, { "mcl_colorblocks:glazed_terracotta_yellow", 1, 1 } }, + { E1, { "mcl_colorblocks:glazed_terracotta_green", 1, 1 } }, + { E1, { "mcl_colorblocks:glazed_terracotta_cyan", 1, 1 } }, + { E1, { "mcl_colorblocks:glazed_terracotta_blue", 1, 1 } }, + { E1, { "mcl_colorblocks:glazed_terracotta_magenta", 1, 1 } }, + { E1, { "mcl_colorblocks:glazed_terracotta_orange", 1, 1 } }, + { E1, { "mcl_colorblocks:glazed_terracotta_brown", 1, 1 } }, + { E1, { "mcl_colorblocks:glazed_terracotta_pink", 1, 1 } }, + { E1, { "mcl_colorblocks:glazed_terracotta_light_blue", 1, 1 } }, + { E1, { "mcl_colorblocks:glazed_terracotta_lime", 1, 1 } }, + { E1, { "mcl_colorblocks:glazed_terracotta_purple", 1, 1 } }, + }, - { - { E1, { "mcl_nether:quartz_pillar", 1, 1 } }, - { E1, { "mcl_nether:quartz_block", 1, 1 } }, - }, + { + { E1, { "mcl_nether:quartz_pillar", 1, 1 } }, + { E1, { "mcl_nether:quartz_block", 1, 1 } }, + }, }, }, nitwit = { From ac4db102b2d99ce38c947a9f251e2a625330527f Mon Sep 17 00:00:00 2001 From: AFCMS Date: Sun, 25 Apr 2021 23:35:27 +0200 Subject: [PATCH 077/982] add basic temp function to get v4 itemslots --- mods/HUD/mcl_formspec/init.lua | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/mods/HUD/mcl_formspec/init.lua b/mods/HUD/mcl_formspec/init.lua index 7013fc0ee..6418a23fd 100644 --- a/mods/HUD/mcl_formspec/init.lua +++ b/mods/HUD/mcl_formspec/init.lua @@ -9,3 +9,15 @@ function mcl_formspec.get_itemslot_bg(x, y, w, h) end return out end + +--This function will replace mcl_formspec.get_itemslot_bg then every formspec will be upgrade to version 4 +function mcl_formspec.get_itemslot_bg_v4(x, y, w, h) + local out = "" + for i = 0, w - 1, 1 do + for j = 0, h - 1, 1 do + out = out .."image["..x+i+(i*0.25)..","..y+j+(j*0.25)..";1,1;mcl_formspec_itemslot.png]" + end + end + return out +end + From 767c904258239c68b5602d4a820f721f5bbfdbac Mon Sep 17 00:00:00 2001 From: AFCMS Date: Fri, 17 Sep 2021 20:00:25 +0200 Subject: [PATCH 078/982] create some files --- mods/HUD/mcl_formspec/API.md | 0 mods/HUD/mcl_formspec/FORMSPEC_GUIDE.md | 0 2 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 mods/HUD/mcl_formspec/API.md create mode 100644 mods/HUD/mcl_formspec/FORMSPEC_GUIDE.md diff --git a/mods/HUD/mcl_formspec/API.md b/mods/HUD/mcl_formspec/API.md new file mode 100644 index 000000000..e69de29bb diff --git a/mods/HUD/mcl_formspec/FORMSPEC_GUIDE.md b/mods/HUD/mcl_formspec/FORMSPEC_GUIDE.md new file mode 100644 index 000000000..e69de29bb From f20fbfb95af50cd794a92c03589a647f4be9b307 Mon Sep 17 00:00:00 2001 From: AFCMS Date: Fri, 17 Sep 2021 23:58:58 +0200 Subject: [PATCH 079/982] ender chest formspec v4 --- mods/HUD/mcl_formspec/FORMSPEC_GUIDE.md | 20 ++++++++++ mods/HUD/mcl_formspec/init.lua | 24 ++++++++++-- mods/ITEMS/mcl_chests/init.lua | 50 +++++++++++++++---------- 3 files changed, 71 insertions(+), 23 deletions(-) diff --git a/mods/HUD/mcl_formspec/FORMSPEC_GUIDE.md b/mods/HUD/mcl_formspec/FORMSPEC_GUIDE.md index e69de29bb..337d203ea 100644 --- a/mods/HUD/mcl_formspec/FORMSPEC_GUIDE.md +++ b/mods/HUD/mcl_formspec/FORMSPEC_GUIDE.md @@ -0,0 +1,20 @@ +Formspecs are an important part of game and mod development. + +This guide will learn you rules about creation of formspecs for the MineClone2 game. + +First of all, MineClone2 aims to support ONLY last formspec version. Many utility functions will not work with formspec v1 or v2. + +Label font size should be 25 to be minecraft like. We arent modifying formspec prepend in order to not break existing mods. + +Just use this code to apply it to your formspec: +```lua +"style_type[label;font_size=25]", +``` + +The typical width of an inventory formspec is `0.375 + 9 + (9 * 0.25) + 0.375 = 12` + +Margins is 0.375 +Space between 1st inventory line and the rest of inventory is 0.4 + +Labels should have 0.375 space above if there is no other stuff above and 0.45 between content ++ 0.375 under \ No newline at end of file diff --git a/mods/HUD/mcl_formspec/init.lua b/mods/HUD/mcl_formspec/init.lua index 6418a23fd..1acf8b372 100644 --- a/mods/HUD/mcl_formspec/init.lua +++ b/mods/HUD/mcl_formspec/init.lua @@ -1,5 +1,12 @@ +local string = string +local table = table + +local sf = string.format + mcl_formspec = {} +mcl_formspec.label_color = "#313131" + function mcl_formspec.get_itemslot_bg(x, y, w, h) local out = "" for i = 0, w - 1, 1 do @@ -11,13 +18,22 @@ function mcl_formspec.get_itemslot_bg(x, y, w, h) end --This function will replace mcl_formspec.get_itemslot_bg then every formspec will be upgrade to version 4 -function mcl_formspec.get_itemslot_bg_v4(x, y, w, h) +local function get_slot(x, y, size) + local t = "image["..x-size..","..y-size..";".. 1+(size*2)..",".. 1+(size*2)..";mcl_formspec_itemslot.png]" + return t +end + +mcl_formspec.itemslot_border_size = 0.05 + +function mcl_formspec.get_itemslot_bg_v4(x, y, w, h, size) + if not size then + size = mcl_formspec.itemslot_border_size + end local out = "" for i = 0, w - 1, 1 do for j = 0, h - 1, 1 do - out = out .."image["..x+i+(i*0.25)..","..y+j+(j*0.25)..";1,1;mcl_formspec_itemslot.png]" + out = out .. get_slot(x+i+(i*0.25), y+j+(j*0.25), size) end end return out -end - +end \ No newline at end of file diff --git a/mods/ITEMS/mcl_chests/init.lua b/mods/ITEMS/mcl_chests/init.lua index 38437c73f..2169f488f 100644 --- a/mods/ITEMS/mcl_chests/init.lua +++ b/mods/ITEMS/mcl_chests/init.lua @@ -1,4 +1,6 @@ local S = minetest.get_translator(minetest.get_current_modname()) +local F = minetest.formspec_escape +local C = minetest.colorize local mod_doc = minetest.get_modpath("doc") -- Christmas chest setup @@ -492,10 +494,10 @@ local function register_chest(basename, desc, longdesc, usagehelp, tt_help, tile minetest.show_formspec(clicker:get_player_name(), "mcl_chests:"..canonical_basename.."_"..pos.x.."_"..pos.y.."_"..pos.z, "size[9,8.75]".. - "label[0,0;"..minetest.formspec_escape(minetest.colorize("#313131", name)).."]".. + "label[0,0;"..F(minetest.colorize("#313131", name)).."]".. "list[nodemeta:"..pos.x..","..pos.y..","..pos.z..";main;0,0.5;9,3;]".. mcl_formspec.get_itemslot_bg(0,0.5,9,3).. - "label[0,4.0;"..minetest.formspec_escape(minetest.colorize("#313131", S("Inventory"))).."]".. + "label[0,4.0;"..F(minetest.colorize("#313131", S("Inventory"))).."]".. "list[current_player;main;0,4.5;9,3;9]".. mcl_formspec.get_itemslot_bg(0,4.5,9,3).. "list[current_player;main;0,7.74;9,1;]".. @@ -643,12 +645,12 @@ local function register_chest(basename, desc, longdesc, usagehelp, tt_help, tile minetest.show_formspec(clicker:get_player_name(), "mcl_chests:"..canonical_basename.."_"..pos.x.."_"..pos.y.."_"..pos.z, "size[9,11.5]".. - "label[0,0;"..minetest.formspec_escape(minetest.colorize("#313131", name)).."]".. + "label[0,0;"..F(minetest.colorize("#313131", name)).."]".. "list[nodemeta:"..pos.x..","..pos.y..","..pos.z..";main;0,0.5;9,3;]".. mcl_formspec.get_itemslot_bg(0,0.5,9,3).. "list[nodemeta:"..pos_other.x..","..pos_other.y..","..pos_other.z..";main;0,3.5;9,3;]".. mcl_formspec.get_itemslot_bg(0,3.5,9,3).. - "label[0,7;"..minetest.formspec_escape(minetest.colorize("#313131", S("Inventory"))).."]".. + "label[0,7;"..F(minetest.colorize("#313131", S("Inventory"))).."]".. "list[current_player;main;0,7.5;9,3;9]".. mcl_formspec.get_itemslot_bg(0,7.5,9,3).. "list[current_player;main;0,10.75;9,1;]".. @@ -791,12 +793,12 @@ local function register_chest(basename, desc, longdesc, usagehelp, tt_help, tile "mcl_chests:"..canonical_basename.."_"..pos.x.."_"..pos.y.."_"..pos.z, "size[9,11.5]".. - "label[0,0;"..minetest.formspec_escape(minetest.colorize("#313131", name)).."]".. + "label[0,0;"..F(minetest.colorize("#313131", name)).."]".. "list[nodemeta:"..pos_other.x..","..pos_other.y..","..pos_other.z..";main;0,0.5;9,3;]".. mcl_formspec.get_itemslot_bg(0,0.5,9,3).. "list[nodemeta:"..pos.x..","..pos.y..","..pos.z..";main;0,3.5;9,3;]".. mcl_formspec.get_itemslot_bg(0,3.5,9,3).. - "label[0,7;"..minetest.formspec_escape(minetest.colorize("#313131", S("Inventory"))).."]".. + "label[0,7;"..F(minetest.colorize("#313131", S("Inventory"))).."]".. "list[current_player;main;0,7.5;9,3;9]".. mcl_formspec.get_itemslot_bg(0,7.5,9,3).. "list[current_player;main;0,10.75;9,1;]".. @@ -985,17 +987,27 @@ minetest.register_node("mcl_chests:ender_chest", { end, }) -local formspec_ender_chest = "size[9,8.75]".. - "label[0,0;"..minetest.formspec_escape(minetest.colorize("#313131", S("Ender Chest"))).."]".. - "list[current_player;enderchest;0,0.5;9,3;]".. - mcl_formspec.get_itemslot_bg(0,0.5,9,3).. - "label[0,4.0;"..minetest.formspec_escape(minetest.colorize("#313131", S("Inventory"))).."]".. - "list[current_player;main;0,4.5;9,3;9]".. - mcl_formspec.get_itemslot_bg(0,4.5,9,3).. - "list[current_player;main;0,7.74;9,1;]".. - mcl_formspec.get_itemslot_bg(0,7.74,9,1).. - "listring[current_player;enderchest]".. - "listring[current_player;main]" +local formspec_ender_chest = table.concat({ + "formspec_version[4]", + "size[12,10.375]", + "style_type[label;font_size=25]", + + "label[0.375,0.375;"..F(C(mcl_formspec.label_color, S("Ender Chest"))).."]", + + mcl_formspec.get_itemslot_bg_v4(0.375, 0.75, 9, 3), + "list[current_player;enderchest;0.375,0.75;9,3;]", + + "label[0.375,4.7;"..F(C(mcl_formspec.label_color, S("Inventory"))).."]", + + mcl_formspec.get_itemslot_bg_v4(0.375, 5.1, 9, 3), + "list[current_player;main;0.375,5.1;9,3;9]", + + mcl_formspec.get_itemslot_bg_v4(0.375, 9, 9, 1), + "list[current_player;main;0.375,9;9,1;]", + + "listring[current_player;enderchest]", + "listring[current_player;main]", +}) minetest.register_node("mcl_chests:ender_chest_small", { @@ -1118,10 +1130,10 @@ local function formspec_shulker_box(name) name = S("Shulker Box") end return "size[9,8.75]".. - "label[0,0;"..minetest.formspec_escape(minetest.colorize("#313131", name)).."]".. + "label[0,0;"..F(minetest.colorize("#313131", name)).."]".. "list[context;main;0,0.5;9,3;]".. mcl_formspec.get_itemslot_bg(0,0.5,9,3).. - "label[0,4.0;"..minetest.formspec_escape(minetest.colorize("#313131", S("Inventory"))).."]".. + "label[0,4.0;"..F(minetest.colorize("#313131", S("Inventory"))).."]".. "list[current_player;main;0,4.5;9,3;9]".. mcl_formspec.get_itemslot_bg(0,4.5,9,3).. "list[current_player;main;0,7.74;9,1;]".. From cf01c0630c9d798c32c049551f37bb1f205663a0 Mon Sep 17 00:00:00 2001 From: AFCMS Date: Sat, 18 Sep 2021 00:36:33 +0200 Subject: [PATCH 080/982] chest + shulkerbox formspec --- mods/HUD/mcl_formspec/FORMSPEC_GUIDE.md | 6 +- mods/ITEMS/mcl_chests/init.lua | 132 +++++++++++++++--------- 2 files changed, 87 insertions(+), 51 deletions(-) diff --git a/mods/HUD/mcl_formspec/FORMSPEC_GUIDE.md b/mods/HUD/mcl_formspec/FORMSPEC_GUIDE.md index 337d203ea..6bb2e1424 100644 --- a/mods/HUD/mcl_formspec/FORMSPEC_GUIDE.md +++ b/mods/HUD/mcl_formspec/FORMSPEC_GUIDE.md @@ -11,10 +11,12 @@ Just use this code to apply it to your formspec: "style_type[label;font_size=25]", ``` -The typical width of an inventory formspec is `0.375 + 9 + (9 * 0.25) + 0.375 = 12` +The typical width of an inventory formspec is `0.375 + 9 + ((9-1) * 0.25) + 0.375 = 11.75` Margins is 0.375 Space between 1st inventory line and the rest of inventory is 0.4 Labels should have 0.375 space above if there is no other stuff above and 0.45 between content -+ 0.375 under \ No newline at end of file ++ 0.375 under + +According to minetest modding book, table.concat is faster than string concatenation, so this method should be prefered (the code is also more clear) \ No newline at end of file diff --git a/mods/ITEMS/mcl_chests/init.lua b/mods/ITEMS/mcl_chests/init.lua index 2169f488f..ad3db56ee 100644 --- a/mods/ITEMS/mcl_chests/init.lua +++ b/mods/ITEMS/mcl_chests/init.lua @@ -1,6 +1,13 @@ local S = minetest.get_translator(minetest.get_current_modname()) local F = minetest.formspec_escape local C = minetest.colorize + +local string = string +local table = table +local math = math + +local sf = string.format + local mod_doc = minetest.get_modpath("doc") -- Christmas chest setup @@ -52,7 +59,7 @@ local entity_animations = { speed = 25, open = {x = 0, y = 7}, close = {x = 13, y = 20}, - } + }, } minetest.register_entity("mcl_chests:chest", { @@ -240,7 +247,7 @@ local function chest_update_after_close(pos) local node = minetest.get_node(pos) if node.name == "mcl_chests:trapped_chest_on_small" then - minetest.swap_node(pos, {name="mcl_chests:trapped_chest_small", param2 = node.param2}) + minetest.swap_node(pos, {name = "mcl_chests:trapped_chest_small", param2 = node.param2}) find_or_create_entity(pos, "mcl_chests:trapped_chest_small", {"mcl_chests_trapped.png"}, node.param2, false, "default_chest", "mcl_chests_chest", "chest"):reinitialize("mcl_chests:trapped_chest_small") mesecon.receptor_off(pos, trapped_chest_mesecons_rules) elseif node.name == "mcl_chests:trapped_chest_on_left" then @@ -249,10 +256,10 @@ local function chest_update_after_close(pos) mesecon.receptor_off(pos, trapped_chest_mesecons_rules) local pos_other = mcl_util.get_double_container_neighbor_pos(pos, node.param2, "left") - minetest.swap_node(pos_other, {name="mcl_chests:trapped_chest_right", param2 = node.param2}) + minetest.swap_node(pos_other, {name = "mcl_chests:trapped_chest_right", param2 = node.param2}) mesecon.receptor_off(pos_other, trapped_chest_mesecons_rules) elseif node.name == "mcl_chests:trapped_chest_on_right" then - minetest.swap_node(pos, {name="mcl_chests:trapped_chest_right", param2 = node.param2}) + minetest.swap_node(pos, {name = "mcl_chests:trapped_chest_right", param2 = node.param2}) mesecon.receptor_off(pos, trapped_chest_mesecons_rules) local pos_other = mcl_util.get_double_container_neighbor_pos(pos, node.param2, "right") @@ -492,18 +499,29 @@ local function register_chest(basename, desc, longdesc, usagehelp, tt_help, tile end minetest.show_formspec(clicker:get_player_name(), - "mcl_chests:"..canonical_basename.."_"..pos.x.."_"..pos.y.."_"..pos.z, - "size[9,8.75]".. - "label[0,0;"..F(minetest.colorize("#313131", name)).."]".. - "list[nodemeta:"..pos.x..","..pos.y..","..pos.z..";main;0,0.5;9,3;]".. - mcl_formspec.get_itemslot_bg(0,0.5,9,3).. - "label[0,4.0;"..F(minetest.colorize("#313131", S("Inventory"))).."]".. - "list[current_player;main;0,4.5;9,3;9]".. - mcl_formspec.get_itemslot_bg(0,4.5,9,3).. - "list[current_player;main;0,7.74;9,1;]".. - mcl_formspec.get_itemslot_bg(0,7.74,9,1).. - "listring[nodemeta:"..pos.x..","..pos.y..","..pos.z..";main]".. - "listring[current_player;main]") + sf("mcl_chests:%s_%s_%s_%s", canonical_basename, pos.x, pos.y, pos.z), + table.concat({ + "formspec_version[4]", + "size[11.75,10.375]", + "style_type[label;font_size=25]", + + "label[0.375,0.375;"..F(C(mcl_formspec.label_color, name)).."]", + + mcl_formspec.get_itemslot_bg_v4(0.375, 0.75, 9, 3), + sf("list[nodemeta:%s,%s,%s;main;0.375,0.75;9,3;]", pos.x, pos.y, pos.z), + + "label[0.375,4.7;"..F(C(mcl_formspec.label_color, S("Inventory"))).."]", + + mcl_formspec.get_itemslot_bg_v4(0.375, 5.1, 9, 3), + "list[current_player;main;0.375,5.1;9,3;9]", + + mcl_formspec.get_itemslot_bg_v4(0.375, 9, 9, 1), + "list[current_player;main;0.375,9;9,1;]", + + sf("listring[nodemeta:%s,%s,%s;main]", pos.x, pos.y, pos.z), + "listring[current_player;main]", + }) + ) if on_rightclick_addendum then on_rightclick_addendum(pos, node, clicker) @@ -856,10 +874,12 @@ register_chest("trapped_chest", S("27 inventory slots") .. "\n" .. S("Can be combined to a large chest") .. "\n" .. S("Emits a redstone signal when opened"), traptiles, nil, - {receptor = { - state = mesecon.state.off, - rules = trapped_chest_mesecons_rules, - }}, + { + receptor = { + state = mesecon.state.off, + rules = trapped_chest_mesecons_rules, + }, + }, function(pos, node, clicker) minetest.swap_node(pos, {name="mcl_chests:trapped_chest_on_small", param2 = node.param2}) find_or_create_entity(pos, "mcl_chests:trapped_chest_on_small", {"mcl_chests_trapped.png"}, node.param2, false, "default_chest", "mcl_chests_chest", "chest"):reinitialize("mcl_chests:trapped_chest_on_small") @@ -891,10 +911,12 @@ register_chest("trapped_chest", register_chest("trapped_chest_on", nil, nil, nil, nil, traptiles, true, - {receptor = { - state = mesecon.state.on, - rules = trapped_chest_mesecons_rules, - }}, + { + receptor = { + state = mesecon.state.on, + rules = trapped_chest_mesecons_rules, + }, + }, nil, nil, nil, "trapped_chest", "trapped_chest" @@ -951,19 +973,19 @@ minetest.register_craft({ {"group:wood", "group:wood", "group:wood"}, {"group:wood", "", "group:wood"}, {"group:wood", "group:wood", "group:wood"}, - } + }, }) minetest.register_craft({ type = "fuel", recipe = "mcl_chests:chest", - burntime = 15 + burntime = 15, }) minetest.register_craft({ type = "fuel", recipe = "mcl_chests:trapped_chest", - burntime = 15 + burntime = 15, }) minetest.register_node("mcl_chests:ender_chest", { @@ -989,7 +1011,7 @@ minetest.register_node("mcl_chests:ender_chest", { local formspec_ender_chest = table.concat({ "formspec_version[4]", - "size[12,10.375]", + "size[11.75,10.375]", "style_type[label;font_size=25]", "label[0.375,0.375;"..F(C(mcl_formspec.label_color, S("Ender Chest"))).."]", @@ -1082,7 +1104,7 @@ minetest.register_craft({ {"mcl_core:obsidian", "mcl_core:obsidian", "mcl_core:obsidian"}, {"mcl_core:obsidian", "mcl_end:ender_eye", "mcl_core:obsidian"}, {"mcl_core:obsidian", "mcl_core:obsidian", "mcl_core:obsidian"}, - } + }, }) -- Shulker boxes @@ -1125,21 +1147,33 @@ local shulker_mob_textures = { } local canonical_shulker_color = "violet" +--WARNING: after formspec v4 update, old shulker boxes will need to be placed again to get the new formspec local function formspec_shulker_box(name) - if name == "" then + if not name or name == "" then name = S("Shulker Box") end - return "size[9,8.75]".. - "label[0,0;"..F(minetest.colorize("#313131", name)).."]".. - "list[context;main;0,0.5;9,3;]".. - mcl_formspec.get_itemslot_bg(0,0.5,9,3).. - "label[0,4.0;"..F(minetest.colorize("#313131", S("Inventory"))).."]".. - "list[current_player;main;0,4.5;9,3;9]".. - mcl_formspec.get_itemslot_bg(0,4.5,9,3).. - "list[current_player;main;0,7.74;9,1;]".. - mcl_formspec.get_itemslot_bg(0,7.74,9,1).. - "listring[context;main]".. - "listring[current_player;main]" + + return table.concat({ + "formspec_version[4]", + "size[11.75,10.375]", + "style_type[label;font_size=25]", + + "label[0.375,0.375;"..F(C(mcl_formspec.label_color, name)).."]", + + mcl_formspec.get_itemslot_bg_v4(0.375, 0.75, 9, 3), + "list[context;main;0.375,0.75;9,3;]", + + "label[0.375,4.7;"..F(C(mcl_formspec.label_color, S("Inventory"))).."]", + + mcl_formspec.get_itemslot_bg_v4(0.375, 5.1, 9, 3), + "list[current_player;main;0.375,5.1;9,3;9]", + + mcl_formspec.get_itemslot_bg_v4(0.375, 9, 9, 1), + "list[current_player;main;0.375,9;9,1;]", + + "listring[context;main]", + "listring[current_player;main]", + }) end local function set_shulkerbox_meta(nmeta, imeta) @@ -1248,9 +1282,9 @@ for color, desc in pairs(boxtypes) do drop = "", paramtype = "light", paramtype2 = "facedir", --- TODO: Make shulker boxes rotatable --- This doesn't work, it just destroys the inventory: --- on_place = minetest.rotate_node, + -- TODO: Make shulker boxes rotatable + -- This doesn't work, it just destroys the inventory: + -- on_place = minetest.rotate_node, on_construct = function(pos) local meta = minetest.get_meta(pos) meta:set_string("formspec", formspec_shulker_box(nil)) @@ -1336,7 +1370,7 @@ for color, desc in pairs(boxtypes) do minetest.register_craft({ type = "shapeless", output = "mcl_chests:"..color.."_shulker_box", - recipe = { "group:shulker_box", "mcl_dye:"..color } + recipe = {"group:shulker_box", "mcl_dye:"..color}, }) end @@ -1346,7 +1380,7 @@ minetest.register_craft({ {"mcl_mobitems:shulker_shell"}, {"mcl_chests:chest"}, {"mcl_mobitems:shulker_shell"}, - } + }, }) -- Save metadata of shulker box when used in crafting @@ -1420,13 +1454,13 @@ minetest.register_lbm({ }) minetest.register_lbm({ - label = "Update shulker box formspecs (0.60.0)", - name = "mcl_chests:update_shulker_box_formspecs_0_60_0", + label = "Update shulker box formspecs (0.72.0)", + name = "mcl_chests:update_shulker_box_formspecs_0_72_0", nodenames = { "group:shulker_box" }, run_at_every_load = false, action = function(pos, node) local meta = minetest.get_meta(pos) - meta:set_string("formspec", formspec_shulker_box) + meta:set_string("formspec", formspec_shulker_box(meta:get_string("name"))) end, }) From 558df5e4bd4d65b68241360c54b031b34c845ee0 Mon Sep 17 00:00:00 2001 From: AFCMS Date: Sat, 18 Sep 2021 09:53:45 +0200 Subject: [PATCH 081/982] fix all chest formspecs --- mods/HUD/mcl_formspec/FORMSPEC_GUIDE.md | 2 +- mods/HUD/mcl_formspec/init.lua | 4 + mods/ITEMS/mcl_chests/init.lua | 127 ++++++++++++++---------- settingtypes.txt | 5 + 4 files changed, 85 insertions(+), 53 deletions(-) diff --git a/mods/HUD/mcl_formspec/FORMSPEC_GUIDE.md b/mods/HUD/mcl_formspec/FORMSPEC_GUIDE.md index 6bb2e1424..20673a682 100644 --- a/mods/HUD/mcl_formspec/FORMSPEC_GUIDE.md +++ b/mods/HUD/mcl_formspec/FORMSPEC_GUIDE.md @@ -14,7 +14,7 @@ Just use this code to apply it to your formspec: The typical width of an inventory formspec is `0.375 + 9 + ((9-1) * 0.25) + 0.375 = 11.75` Margins is 0.375 -Space between 1st inventory line and the rest of inventory is 0.4 +Space between 1st inventory line and the rest of inventory is 0.45 Labels should have 0.375 space above if there is no other stuff above and 0.45 between content + 0.375 under diff --git a/mods/HUD/mcl_formspec/init.lua b/mods/HUD/mcl_formspec/init.lua index 1acf8b372..8ddc90c1d 100644 --- a/mods/HUD/mcl_formspec/init.lua +++ b/mods/HUD/mcl_formspec/init.lua @@ -7,6 +7,10 @@ mcl_formspec = {} mcl_formspec.label_color = "#313131" +mcl_formspec.label_size = tonumber(minetest.settings:get("mcl_label_font_size")) or 24 + +mcl_formspec.apply_label_size = sf("style_type[label;font_size=%s]", mcl_formspec.label_size) + function mcl_formspec.get_itemslot_bg(x, y, w, h) local out = "" for i = 0, w - 1, 1 do diff --git a/mods/ITEMS/mcl_chests/init.lua b/mods/ITEMS/mcl_chests/init.lua index ad3db56ee..b870fc362 100644 --- a/mods/ITEMS/mcl_chests/init.lua +++ b/mods/ITEMS/mcl_chests/init.lua @@ -502,8 +502,8 @@ local function register_chest(basename, desc, longdesc, usagehelp, tt_help, tile sf("mcl_chests:%s_%s_%s_%s", canonical_basename, pos.x, pos.y, pos.z), table.concat({ "formspec_version[4]", - "size[11.75,10.375]", - "style_type[label;font_size=25]", + "size[11.75,10.425]", + mcl_formspec.apply_label_size, "label[0.375,0.375;"..F(C(mcl_formspec.label_color, name)).."]", @@ -515,8 +515,8 @@ local function register_chest(basename, desc, longdesc, usagehelp, tt_help, tile mcl_formspec.get_itemslot_bg_v4(0.375, 5.1, 9, 3), "list[current_player;main;0.375,5.1;9,3;9]", - mcl_formspec.get_itemslot_bg_v4(0.375, 9, 9, 1), - "list[current_player;main;0.375,9;9,1;]", + mcl_formspec.get_itemslot_bg_v4(0.375, 9.05, 9, 1), + "list[current_player;main;0.375,9.05;9,1;]", sf("listring[nodemeta:%s,%s,%s;main]", pos.x, pos.y, pos.z), "listring[current_player;main]", @@ -661,26 +661,38 @@ local function register_chest(basename, desc, longdesc, usagehelp, tt_help, tile end minetest.show_formspec(clicker:get_player_name(), - "mcl_chests:"..canonical_basename.."_"..pos.x.."_"..pos.y.."_"..pos.z, - "size[9,11.5]".. - "label[0,0;"..F(minetest.colorize("#313131", name)).."]".. - "list[nodemeta:"..pos.x..","..pos.y..","..pos.z..";main;0,0.5;9,3;]".. - mcl_formspec.get_itemslot_bg(0,0.5,9,3).. - "list[nodemeta:"..pos_other.x..","..pos_other.y..","..pos_other.z..";main;0,3.5;9,3;]".. - mcl_formspec.get_itemslot_bg(0,3.5,9,3).. - "label[0,7;"..F(minetest.colorize("#313131", S("Inventory"))).."]".. - "list[current_player;main;0,7.5;9,3;9]".. - mcl_formspec.get_itemslot_bg(0,7.5,9,3).. - "list[current_player;main;0,10.75;9,1;]".. - mcl_formspec.get_itemslot_bg(0,10.75,9,1).. - -- BEGIN OF LISTRING WORKAROUND - "listring[current_player;main]".. - "listring[nodemeta:"..pos.x..","..pos.y..","..pos.z..";input]".. - -- END OF LISTRING WORKAROUND - "listring[current_player;main]".. - "listring[nodemeta:"..pos.x..","..pos.y..","..pos.z..";main]".. - "listring[current_player;main]".. - "listring[nodemeta:"..pos_other.x..","..pos_other.y..","..pos_other.z..";main]") + sf("mcl_chests:%s_%s_%s_%s", canonical_basename, pos.x, pos.y, pos.z), + table.concat({ + "formspec_version[4]", + "size[11.75,14.15]", + mcl_formspec.apply_label_size, + + "label[0.375,0.375;"..F(C(mcl_formspec.label_color, name)).."]", + + mcl_formspec.get_itemslot_bg_v4(0.375, 0.75, 9, 3), + sf("list[nodemeta:%s,%s,%s;main;0.375,0.75;9,3;]", pos.x, pos.y, pos.z), + + mcl_formspec.get_itemslot_bg_v4(0.375, 4.5, 9, 3), + sf("list[nodemeta:%s,%s,%s;main;0.375,4.5;9,3;]", pos_other.x, pos_other.y, pos_other.z), + + "label[0.375,8.45;"..F(C(mcl_formspec.label_color, S("Inventory"))).."]", + + mcl_formspec.get_itemslot_bg_v4(0.375, 8.825, 9, 3), + "list[current_player;main;0.375,8.825;9,3;9]", + + mcl_formspec.get_itemslot_bg_v4(0.375, 12.775, 9, 1), + "list[current_player;main;0.375,12.775;9,1;]", + + --BEGIN OF LISTRING WORKAROUND + "listring[current_player;main]", + sf("listring[nodemeta:%s,%s,%s;input]", pos.x, pos.y, pos.z), + --END OF LISTRING WORKAROUND + "listring[current_player;main]".. + sf("listring[nodemeta:%s,%s,%s;main]", pos.x, pos.y, pos.z), + "listring[current_player;main]", + sf("listring[nodemeta:%s,%s,%s;main]", pos_other.x, pos_other.y, pos_other.z), + }) + ) if on_rightclick_addendum_left then on_rightclick_addendum_left(pos, node, clicker) @@ -808,27 +820,38 @@ local function register_chest(basename, desc, longdesc, usagehelp, tt_help, tile end minetest.show_formspec(clicker:get_player_name(), - "mcl_chests:"..canonical_basename.."_"..pos.x.."_"..pos.y.."_"..pos.z, + sf("mcl_chests:%s_%s_%s_%s", canonical_basename, pos.x, pos.y, pos.z), + table.concat({ + "formspec_version[4]", + "size[11.75,14.15]", + mcl_formspec.apply_label_size, - "size[9,11.5]".. - "label[0,0;"..F(minetest.colorize("#313131", name)).."]".. - "list[nodemeta:"..pos_other.x..","..pos_other.y..","..pos_other.z..";main;0,0.5;9,3;]".. - mcl_formspec.get_itemslot_bg(0,0.5,9,3).. - "list[nodemeta:"..pos.x..","..pos.y..","..pos.z..";main;0,3.5;9,3;]".. - mcl_formspec.get_itemslot_bg(0,3.5,9,3).. - "label[0,7;"..F(minetest.colorize("#313131", S("Inventory"))).."]".. - "list[current_player;main;0,7.5;9,3;9]".. - mcl_formspec.get_itemslot_bg(0,7.5,9,3).. - "list[current_player;main;0,10.75;9,1;]".. - mcl_formspec.get_itemslot_bg(0,10.75,9,1).. - -- BEGIN OF LISTRING WORKAROUND - "listring[current_player;main]".. - "listring[nodemeta:"..pos.x..","..pos.y..","..pos.z..";input]".. - -- END OF LISTRING WORKAROUND - "listring[current_player;main]".. - "listring[nodemeta:"..pos_other.x..","..pos_other.y..","..pos_other.z..";main]".. - "listring[current_player;main]".. - "listring[nodemeta:"..pos.x..","..pos.y..","..pos.z..";main]") + "label[0.375,0.375;"..F(C(mcl_formspec.label_color, name)).."]", + + mcl_formspec.get_itemslot_bg_v4(0.375, 0.75, 9, 3), + sf("list[nodemeta:%s,%s,%s;main;0.375,0.75;9,3;]", pos_other.x, pos_other.y, pos_other.z), + + mcl_formspec.get_itemslot_bg_v4(0.375, 4.5, 9, 3), + sf("list[nodemeta:%s,%s,%s;main;0.375,4.5;9,3;]", pos.x, pos.y, pos.z), + + "label[0.375,8.45;"..F(C(mcl_formspec.label_color, S("Inventory"))).."]", + + mcl_formspec.get_itemslot_bg_v4(0.375, 8.825, 9, 3), + "list[current_player;main;0.375,8.825;9,3;9]", + + mcl_formspec.get_itemslot_bg_v4(0.375, 12.775, 9, 1), + "list[current_player;main;0.375,12.775;9,1;]", + + --BEGIN OF LISTRING WORKAROUND + "listring[current_player;main]", + sf("listring[nodemeta:%s,%s,%s;input]", pos.x, pos.y, pos.z), + --END OF LISTRING WORKAROUND + "listring[current_player;main]".. + sf("listring[nodemeta:%s,%s,%s;main]", pos_other.x, pos_other.y, pos_other.z), + "listring[current_player;main]", + sf("listring[nodemeta:%s,%s,%s;main]", pos.x, pos.y, pos.z), + }) + ) if on_rightclick_addendum_right then on_rightclick_addendum_right(pos, node, clicker) @@ -1011,8 +1034,8 @@ minetest.register_node("mcl_chests:ender_chest", { local formspec_ender_chest = table.concat({ "formspec_version[4]", - "size[11.75,10.375]", - "style_type[label;font_size=25]", + "size[11.75,10.425]", + mcl_formspec.apply_label_size, "label[0.375,0.375;"..F(C(mcl_formspec.label_color, S("Ender Chest"))).."]", @@ -1024,8 +1047,8 @@ local formspec_ender_chest = table.concat({ mcl_formspec.get_itemslot_bg_v4(0.375, 5.1, 9, 3), "list[current_player;main;0.375,5.1;9,3;9]", - mcl_formspec.get_itemslot_bg_v4(0.375, 9, 9, 1), - "list[current_player;main;0.375,9;9,1;]", + mcl_formspec.get_itemslot_bg_v4(0.375, 9.05, 9, 1), + "list[current_player;main;0.375,9.05;9,1;]", "listring[current_player;enderchest]", "listring[current_player;main]", @@ -1155,8 +1178,8 @@ local function formspec_shulker_box(name) return table.concat({ "formspec_version[4]", - "size[11.75,10.375]", - "style_type[label;font_size=25]", + "size[11.75,10.425]", + mcl_formspec.apply_label_size, "label[0.375,0.375;"..F(C(mcl_formspec.label_color, name)).."]", @@ -1168,8 +1191,8 @@ local function formspec_shulker_box(name) mcl_formspec.get_itemslot_bg_v4(0.375, 5.1, 9, 3), "list[current_player;main;0.375,5.1;9,3;9]", - mcl_formspec.get_itemslot_bg_v4(0.375, 9, 9, 1), - "list[current_player;main;0.375,9;9,1;]", + mcl_formspec.get_itemslot_bg_v4(0.375, 9.05, 9, 1), + "list[current_player;main;0.375,9.05;9,1;]", "listring[context;main]", "listring[current_player;main]", diff --git a/settingtypes.txt b/settingtypes.txt index c5d5d32c1..1f1e31dbb 100644 --- a/settingtypes.txt +++ b/settingtypes.txt @@ -192,6 +192,11 @@ animated_chests (Animated chests) bool true # The maximum number of boss bars to simultaniously display on the screen max_bossbars (Maximum Boss bars) int 5 +# Define how wide font will be displayed in mineclone2 formspecs +# This allow MineClone2 to have a label size similar to minecraft, but allowing at least singleplayer to use his own font with custom size +# (some fonts may be bigger than the default one and break formspecs) +mcl_label_font_size (Label Font Size) int 24 + # Default intensity of shadows (default: 0.33) mcl_default_shadow_intensity (Default shadow intensity) float 0.33 0.0 1.0 From 54b119cffacf79cee11ac8b108204e4aa6cbb08a Mon Sep 17 00:00:00 2001 From: AFCMS Date: Sat, 18 Sep 2021 11:05:17 +0200 Subject: [PATCH 082/982] some things --- mods/HUD/mcl_formspec/FORMSPEC_GUIDE.md | 13 ++++++++----- mods/ITEMS/mcl_hoppers/init.lua | 12 ++++++------ 2 files changed, 14 insertions(+), 11 deletions(-) diff --git a/mods/HUD/mcl_formspec/FORMSPEC_GUIDE.md b/mods/HUD/mcl_formspec/FORMSPEC_GUIDE.md index 20673a682..838e5cbdd 100644 --- a/mods/HUD/mcl_formspec/FORMSPEC_GUIDE.md +++ b/mods/HUD/mcl_formspec/FORMSPEC_GUIDE.md @@ -1,19 +1,22 @@ -Formspecs are an important part of game and mod development. +# MineClone2 Formspec Guide -This guide will learn you rules about creation of formspecs for the MineClone2 game. +***This guide will learn you rules about creation of formspecs for the MineClone2 game.*** + +Formspecs are an important part of game and mod development. First of all, MineClone2 aims to support ONLY last formspec version. Many utility functions will not work with formspec v1 or v2. Label font size should be 25 to be minecraft like. We arent modifying formspec prepend in order to not break existing mods. -Just use this code to apply it to your formspec: +Just add this code to apply it to your formspec: ```lua -"style_type[label;font_size=25]", +mcl_formspec.apply_label_size ``` -The typical width of an inventory formspec is `0.375 + 9 + ((9-1) * 0.25) + 0.375 = 11.75` +The typical width of an 9 slots width inventory formspec is `0.375 + 9 + ((9-1) * 0.25) + 0.375 = 11.75` Margins is 0.375 + Space between 1st inventory line and the rest of inventory is 0.45 Labels should have 0.375 space above if there is no other stuff above and 0.45 between content diff --git a/mods/ITEMS/mcl_hoppers/init.lua b/mods/ITEMS/mcl_hoppers/init.lua index 15bc922ff..62b358c64 100644 --- a/mods/ITEMS/mcl_hoppers/init.lua +++ b/mods/ITEMS/mcl_hoppers/init.lua @@ -13,16 +13,16 @@ end local mcl_hoppers_formspec = table.concat({ "size[9,7]", - "label[2,0;" .. F(C("#313131", S("Hopper"))) .. "]", + "label[2,0;"..F(C(mcl_formspec.label_color, S("Hopper"))).."]", "list[context;main;2,0.5;5,1;]", - mcl_formspec.get_itemslot_bg(2, 0.5, 5, 1), - "label[0,2;" .. F(C("#313131", S("Inventory"))) .. "]", + mcl_formspec.get_itemslot_bg(2,0.5,5,1), + "label[0,2;"..F(C(mcl_formspec.label_color, S("Inventory"))).."]", "list[current_player;main;0,2.5;9,3;9]", - mcl_formspec.get_itemslot_bg(0, 2.5, 9, 3), + mcl_formspec.get_itemslot_bg(0,2.5,9,3), "list[current_player;main;0,5.74;9,1;]", - mcl_formspec.get_itemslot_bg(0, 5.74, 9, 1), + mcl_formspec.get_itemslot_bg(0,5.74,9,1), "listring[context;main]", - "listring[current_player;main]", + "listring[current_player;main]" }) -- Downwards hopper (base definition) From 4ee6a67516376fc8935aa7ccfb4562e65f1c27f3 Mon Sep 17 00:00:00 2001 From: AFCMS Date: Mon, 20 Sep 2021 09:22:13 +0200 Subject: [PATCH 083/982] survival inventory --- mods/HUD/mcl_inventory/init.lua | 91 ++++++++++++++++----------- textures/crafting_formspec_arrow.png | Bin 0 -> 5362 bytes 2 files changed, 55 insertions(+), 36 deletions(-) create mode 100644 textures/crafting_formspec_arrow.png diff --git a/mods/HUD/mcl_inventory/init.lua b/mods/HUD/mcl_inventory/init.lua index 4ca0f2a73..a83425388 100644 --- a/mods/HUD/mcl_inventory/init.lua +++ b/mods/HUD/mcl_inventory/init.lua @@ -15,14 +15,14 @@ function return_item(itemstack, dropper, pos, inv) else -- Drop item on the ground local v = dropper:get_look_dir() - local p = {x=pos.x, y=pos.y+1.2, z=pos.z} - p.x = p.x+(math.random(1,3)*0.2) - p.z = p.z+(math.random(1,3)*0.2) + local p = { x = pos.x, y = pos.y + 1.2, z = pos.z } + p.x = p.x + (math.random(1, 3) * 0.2) + p.z = p.z + (math.random(1, 3) * 0.2) local obj = minetest.add_item(p, itemstack) if obj then - v.x = v.x*4 - v.y = v.y*4 + 2 - v.z = v.z*4 + v.x = v.x * 4 + v.y = v.y * 4 + 2 + v.z = v.z * 4 obj:set_velocity(v) obj:get_luaentity()._insta_collect = false end @@ -39,7 +39,7 @@ function return_fields(player, name) local inv = player:get_inventory() local list = inv:get_list(name) if not list then return end - for i,stack in ipairs(list) do + for i, stack in ipairs(list) do return_item(stack, player, player:get_pos(), inv) stack:clear() inv:set_stack(name, i, stack) @@ -55,11 +55,12 @@ local function set_inventory(player) inv:set_width("craft", 2) inv:set_size("craft", 4) - local armor_slots = {"helmet", "chestplate", "leggings", "boots"} + local armor_slots = { "helmet", "chestplate", "leggings", "boots" } local armor_slot_imgs = "" - for a=1,4 do - if inv:get_stack("armor", a+1):is_empty() then - armor_slot_imgs = armor_slot_imgs .. "image[0,"..(a-1)..";1,1;mcl_inventory_empty_armor_slot_"..armor_slots[a]..".png]" + for a = 1, 4 do + if inv:get_stack("armor", a + 1):is_empty() then + armor_slot_imgs = armor_slot_imgs .. + "image[0," .. (a - 1) .. ";1,1;mcl_inventory_empty_armor_slot_" .. armor_slots[a] .. ".png]" end end @@ -76,29 +77,29 @@ local function set_inventory(player) "list[current_player;armor;0,1;1,1;2]" .. "list[current_player;armor;0,2;1,1;3]" .. "list[current_player;armor;0,3;1,1;4]" .. - mcl_formspec.get_itemslot_bg(0,0,1,1) .. - mcl_formspec.get_itemslot_bg(0,1,1,1) .. - mcl_formspec.get_itemslot_bg(0,2,1,1) .. - mcl_formspec.get_itemslot_bg(0,3,1,1) .. + mcl_formspec.get_itemslot_bg(0, 0, 1, 1) .. + mcl_formspec.get_itemslot_bg(0, 1, 1, 1) .. + mcl_formspec.get_itemslot_bg(0, 2, 1, 1) .. + mcl_formspec.get_itemslot_bg(0, 3, 1, 1) .. "list[current_player;offhand;3,2;1,1]" .. - mcl_formspec.get_itemslot_bg(3,2,1,1) .. + mcl_formspec.get_itemslot_bg(3, 2, 1, 1) .. armor_slot_imgs .. -- Craft and inventory - "label[0,4;"..F(minetest.colorize("#313131", S("Inventory"))) .. "]" .. + "label[0,4;" .. F(minetest.colorize("#313131", S("Inventory"))) .. "]" .. "list[current_player;main;0,4.5;9,3;9]" .. "list[current_player;main;0,7.74;9,1;]" .. - "label[4,0.5;"..F(minetest.colorize("#313131", S("Crafting"))) .. "]" .. + "label[4,0.5;" .. F(minetest.colorize("#313131", S("Crafting"))) .. "]" .. "list[current_player;craft;4,1;2,2]" .. "list[current_player;craftpreview;7,1.5;1,1;]" .. mcl_formspec.get_itemslot_bg(0, 4.5, 9, 3) .. mcl_formspec.get_itemslot_bg(0, 7.74, 9, 1) .. - mcl_formspec.get_itemslot_bg(4, 1,2, 2) .. + mcl_formspec.get_itemslot_bg(4, 1, 2, 2) .. mcl_formspec.get_itemslot_bg(7, 1.5, 1, 1) .. -- Crafting guide button "image_button[4.5,3;1,1;craftguide_book.png;__mcl_craftguide;]" .. - "tooltip[__mcl_craftguide;"..F(S("Recipe book")) .. "]" .. + "tooltip[__mcl_craftguide;" .. F(S("Recipe book")) .. "]" .. -- Help button "image_button[8,3;1,1;doc_button_icon_lores.png;__mcl_doc;]" .. @@ -129,9 +130,9 @@ end -- Drop items in craft grid and reset inventory on closing minetest.register_on_player_receive_fields(function(player, formname, fields) if fields.quit then - return_fields(player,"craft") - return_fields(player,"enchanting_lapis") - return_fields(player,"enchanting_item") + return_fields(player, "craft") + return_fields(player, "enchanting_lapis") + return_fields(player, "enchanting_item") if not minetest.is_creative_enabled(player:get_player_name()) and (formname == "" or formname == "main") then set_inventory(player) end @@ -174,7 +175,7 @@ minetest.register_on_joinplayer(function(player) return_fields(player, "enchanting_lapis") end) -dofile(minetest.get_modpath(minetest.get_current_modname()).."/creative.lua") +dofile(minetest.get_modpath(minetest.get_current_modname()) .. "/creative.lua") mcl_player.register_on_visual_change(mcl_inventory.update_inventory_formspec) @@ -190,8 +191,26 @@ function minetest.is_creative_enabled(name) return false end -local function in_table(n,h) - for k,v in pairs(h) do +--Insta "digging" nodes in gamemode-creative +minetest.register_on_punchnode(function(pos, node, puncher, pointed_thing) + if not puncher or not puncher:is_player() then return end + local name = puncher:get_player_name() + if not minetest.is_creative_enabled(name) then return end + if pointed_thing.type ~= "node" then return end + local def = minetest.registered_nodes[node.name] + if def then + minetest.node_dig(pos, node, puncher) + return true + end +end) + +--Don't subtract from inv when placing in gamemode-creative +minetest.register_on_placenode(function(pos, newnode, placer, oldnode, itemstack, pointed_thing) + if placer and placer:is_player() and minetest.is_creative_enabled(placer:get_player_name()) then return true end +end) + +local function in_table(n, h) + for k, v in pairs(h) do if v == n then return true end end return false @@ -202,24 +221,24 @@ local gamemodes = { "creative" } -function mcl_inventory.player_set_gamemode(p,g) +function mcl_inventory.player_set_gamemode(p, g) local m = p:get_meta() - m:set_string("gamemode",g) + m:set_string("gamemode", g) if g == "survival" then - mcl_experience.setup_hud(p) - mcl_experience.update(p) + mcl_experience.setup_hud(p) + mcl_experience.update(p) elseif g == "creative" then - mcl_experience.remove_hud(p) + mcl_experience.remove_hud(p) end mcl_meshhand.update_player(p) set_inventory(p) end -minetest.register_chatcommand("gamemode",{ +minetest.register_chatcommand("gamemode", { params = S("[] []"), description = S("Change gamemode (survival/creative) for yourself or player"), privs = { server = true }, - func = function(n,param) + func = function(n, param) -- Full input validation ( just for @erlehmann <3 ) local p local args = param:split(" ") @@ -232,15 +251,15 @@ minetest.register_chatcommand("gamemode",{ if not p then return false, S("Player not online") end - if args[1] ~= nil and not in_table(args[1],gamemodes) then + if args[1] ~= nil and not in_table(args[1], gamemodes) then return false, S("Gamemode " .. args[1] .. " does not exist.") elseif args[1] ~= nil then - mcl_inventory.player_set_gamemode(p,args[1]) + mcl_inventory.player_set_gamemode(p, args[1]) end --Result message - show effective game mode local gm = p:get_meta():get_string("gamemode") if gm == "" then gm = gamemodes[1] end - return true, S("Gamemode for player ")..n..S(": "..gm) + return true, S("Gamemode for player ") .. n .. S(": " .. gm) end }) diff --git a/textures/crafting_formspec_arrow.png b/textures/crafting_formspec_arrow.png new file mode 100644 index 0000000000000000000000000000000000000000..12b9c197041202eb4aaa6517d9794a5c329d43ce GIT binary patch literal 5362 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 Date: Fri, 9 Sep 2022 18:59:12 +0200 Subject: [PATCH 084/982] Modern Survival Inventory (9 slice images, formspec v6) --- mods/HUD/mcl_formspec/init.lua | 21 +++- mods/HUD/mcl_inventory/init.lua | 143 +++++++++++++++---------- mods/PLAYER/mcl_player/init.lua | 35 ++++-- textures/mcl_inventory_background9.png | Bin 0 -> 5324 bytes 4 files changed, 126 insertions(+), 73 deletions(-) create mode 100644 textures/mcl_inventory_background9.png diff --git a/mods/HUD/mcl_formspec/init.lua b/mods/HUD/mcl_formspec/init.lua index 8ddc90c1d..e7817e639 100644 --- a/mods/HUD/mcl_formspec/init.lua +++ b/mods/HUD/mcl_formspec/init.lua @@ -15,20 +15,31 @@ function mcl_formspec.get_itemslot_bg(x, y, w, h) local out = "" for i = 0, w - 1, 1 do for j = 0, h - 1, 1 do - out = out .."image["..x+i..","..y+j..";1,1;mcl_formspec_itemslot.png]" + out = out .. "image[" .. x + i .. "," .. y + j .. ";1,1;mcl_formspec_itemslot.png]" end end return out end ---This function will replace mcl_formspec.get_itemslot_bg then every formspec will be upgrade to version 4 +---This function will replace mcl_formspec.get_itemslot_bg then every formspec will be upgrade to version 4 +---@param x number +---@param y number +---@param size number +---@return string local function get_slot(x, y, size) - local t = "image["..x-size..","..y-size..";".. 1+(size*2)..",".. 1+(size*2)..";mcl_formspec_itemslot.png]" + local t = "image[" .. x - size .. "," .. y - size .. ";" .. 1 + (size * 2) .. + "," .. 1 + (size * 2) .. ";mcl_formspec_itemslot.png]" return t end mcl_formspec.itemslot_border_size = 0.05 +---@param x number +---@param y number +---@param w integer +---@param h integer +---@param size? number +---@return string function mcl_formspec.get_itemslot_bg_v4(x, y, w, h, size) if not size then size = mcl_formspec.itemslot_border_size @@ -36,8 +47,8 @@ function mcl_formspec.get_itemslot_bg_v4(x, y, w, h, size) local out = "" for i = 0, w - 1, 1 do for j = 0, h - 1, 1 do - out = out .. get_slot(x+i+(i*0.25), y+j+(j*0.25), size) + out = out .. get_slot(x + i + (i * 0.25), y + j + (j * 0.25), size) end end return out -end \ No newline at end of file +end diff --git a/mods/HUD/mcl_inventory/init.lua b/mods/HUD/mcl_inventory/init.lua index a83425388..a46f2669f 100644 --- a/mods/HUD/mcl_inventory/init.lua +++ b/mods/HUD/mcl_inventory/init.lua @@ -6,8 +6,12 @@ mcl_inventory = {} --local mod_player = minetest.get_modpath("mcl_player") --local mod_craftguide = minetest.get_modpath("mcl_craftguide") --- Returns a single itemstack in the given inventory to the main inventory, or drop it when there's no space left -function return_item(itemstack, dropper, pos, inv) +---Returns a single itemstack in the given inventory to the main inventory, or drop it when there's no space left. +---@param itemstack ItemStack +---@param dropper ObjectRef +---@param pos Vector +---@param inv InvRef +local function return_item(itemstack, dropper, pos, inv) if dropper:is_player() then -- Return to main inventory if inv:room_for_item("main", itemstack) then @@ -15,7 +19,7 @@ function return_item(itemstack, dropper, pos, inv) else -- Drop item on the ground local v = dropper:get_look_dir() - local p = { x = pos.x, y = pos.y + 1.2, z = pos.z } + local p = vector.offset(pos, 0, 1.2, 0) p.x = p.x + (math.random(1, 3) * 0.2) p.z = p.z + (math.random(1, 3) * 0.2) local obj = minetest.add_item(p, itemstack) @@ -34,9 +38,14 @@ function return_item(itemstack, dropper, pos, inv) return itemstack end --- Return items in the given inventory list (name) to the main inventory, or drop them if there is no space left -function return_fields(player, name) +---Return items in the given inventory list (name) to the main inventory, or drop them if there is no space left. +---@param player ObjectRef +---@param name string +local function return_fields(player, name) local inv = player:get_inventory() + + ---@diagnostic disable need-check-nil + local list = inv:get_list(name) if not list then return end for i, stack in ipairs(list) do @@ -44,85 +53,102 @@ function return_fields(player, name) stack:clear() inv:set_stack(name, i, stack) end + + ---@diagnostic enable need-check-nil end +---@param player ObjectRef local function set_inventory(player) if minetest.is_creative_enabled(player:get_player_name()) then mcl_inventory.set_creative_formspec(player) return end + local inv = player:get_inventory() + + ---@diagnostic disable need-check-nil inv:set_width("craft", 2) inv:set_size("craft", 4) local armor_slots = { "helmet", "chestplate", "leggings", "boots" } local armor_slot_imgs = "" + for a = 1, 4 do if inv:get_stack("armor", a + 1):is_empty() then armor_slot_imgs = armor_slot_imgs .. - "image[0," .. (a - 1) .. ";1,1;mcl_inventory_empty_armor_slot_" .. armor_slots[a] .. ".png]" + "image[0.375," .. + (0.375 + (a - 1) * 1.25) .. ";1,1;mcl_inventory_empty_armor_slot_" .. armor_slots[a] .. ".png]" end end if inv:get_stack("offhand", 1):is_empty() then - armor_slot_imgs = armor_slot_imgs .. "image[3,2;1,1;mcl_inventory_empty_armor_slot_shield.png]" + armor_slot_imgs = armor_slot_imgs .. "image[5.375,4.125;1,1;mcl_inventory_empty_armor_slot_shield.png]" end - local form = "size[9,8.75]" .. - "background[-0.19,-0.25;9.41,9.49;crafting_formspec_bg.png]" .. - mcl_player.get_player_formspec_model(player, 1.0, 0.0, 2.25, 4.5, "") .. + ---@diagnostic enable need-check-nil - -- Armor - "list[current_player;armor;0,0;1,1;1]" .. - "list[current_player;armor;0,1;1,1;2]" .. - "list[current_player;armor;0,2;1,1;3]" .. - "list[current_player;armor;0,3;1,1;4]" .. - mcl_formspec.get_itemslot_bg(0, 0, 1, 1) .. - mcl_formspec.get_itemslot_bg(0, 1, 1, 1) .. - mcl_formspec.get_itemslot_bg(0, 2, 1, 1) .. - mcl_formspec.get_itemslot_bg(0, 3, 1, 1) .. - "list[current_player;offhand;3,2;1,1]" .. - mcl_formspec.get_itemslot_bg(3, 2, 1, 1) .. - armor_slot_imgs .. + local form = table.concat({ + "formspec_version[6]", + "size[11.75,10.9]", - -- Craft and inventory - "label[0,4;" .. F(minetest.colorize("#313131", S("Inventory"))) .. "]" .. - "list[current_player;main;0,4.5;9,3;9]" .. - "list[current_player;main;0,7.74;9,1;]" .. - "label[4,0.5;" .. F(minetest.colorize("#313131", S("Crafting"))) .. "]" .. - "list[current_player;craft;4,1;2,2]" .. - "list[current_player;craftpreview;7,1.5;1,1;]" .. - mcl_formspec.get_itemslot_bg(0, 4.5, 9, 3) .. - mcl_formspec.get_itemslot_bg(0, 7.74, 9, 1) .. - mcl_formspec.get_itemslot_bg(4, 1, 2, 2) .. - mcl_formspec.get_itemslot_bg(7, 1.5, 1, 1) .. + --Armor slots + mcl_formspec.get_itemslot_bg_v4(0.375, 0.375, 1, 4), + "list[current_player;armor;0.375,0.375;1,1;1]", + "list[current_player;armor;0.375,1.625;1,1;2]", + "list[current_player;armor;0.375,2.875;1,1;3]", + "list[current_player;armor;0.375,4.125;1,1;4]", - -- Crafting guide button - "image_button[4.5,3;1,1;craftguide_book.png;__mcl_craftguide;]" .. - "tooltip[__mcl_craftguide;" .. F(S("Recipe book")) .. "]" .. + --Main inventory + mcl_formspec.get_itemslot_bg_v4(0.375, 5.575, 9, 3), + "list[current_player;main;0.375,5.575;9,3;9]", - -- Help button - "image_button[8,3;1,1;doc_button_icon_lores.png;__mcl_doc;]" .. - "tooltip[__mcl_doc;" .. F(S("Help")) .. "]" + --Hotbar + mcl_formspec.get_itemslot_bg_v4(0.375, 9.525, 9, 1), + "list[current_player;main;0.375,9.525;9,1;]", - -- Skins button - if minetest.global_exists("mcl_skins") then - form = form .. - "image_button[3,3;1,1;mcl_skins_button.png;__mcl_skins;]" .. - "tooltip[__mcl_skins;" .. F(S("Select player skin")) .. "]" - end + --Player model + "image[1.57,0.343;3.62,4.85;mcl_inventory_background9.png;2]", + mcl_player.get_player_formspec_model(player, 1.57, 0.4, 3.62, 4.85, ""), - form = form .. - -- Achievements button - "image_button[7,3;1,1;mcl_achievements_button.png;__mcl_achievements;]" .. - "tooltip[__mcl_achievements;" .. F(S("Advancements")) .. "]" .. + --Offhand + mcl_formspec.get_itemslot_bg_v4(5.375, 4.125, 1, 1), + "list[current_player;offhand;5.375,4.125;1,1]", - -- For shortcuts - "listring[current_player;main]" .. - "listring[current_player;armor]" .. - "listring[current_player;main]" .. - "listring[current_player;craft]" .. - "listring[current_player;main]" + armor_slot_imgs, + + --Craft grid + "label[6.61,0.5;" .. F(minetest.colorize(mcl_formspec.label_color, S("Crafting"))) .. "]", + mcl_formspec.get_itemslot_bg_v4(6.625, 0.875, 2, 2), + "list[current_player;craft;6.625,0.875;2,2]", + + "image[9.125,1.5;1,1;crafting_formspec_arrow.png]", + + mcl_formspec.get_itemslot_bg_v4(10.375, 1.5, 1, 1), + "list[current_player;craftpreview;10.375,1.5;1,1;]", + + --Crafting guide button + "image_button[6.575,4.075;1.1,1.1;craftguide_book.png;__mcl_craftguide;]", + "tooltip[__mcl_craftguide;" .. F(S("Recipe book")) .. "]", + + --Help button + "image_button[7.825,4.075;1.1,1.1;doc_button_icon_lores.png;__mcl_doc;]", + "tooltip[__mcl_doc;" .. F(S("Help")) .. "]", + + --Skins button + "image_button[9.075,4.075;1.1,1.1;mcl_skins_button.png;__mcl_skins;]", + "tooltip[__mcl_skins;" .. F(S("Select player skin")) .. "]", + + --Advancements button + "image_button[10.325,4.075;1.1,1.1;mcl_achievements_button.png;__mcl_achievements;]", + "tooltip[__mcl_achievements;" .. F(S("Advancements")) .. "]", + + --Listring + "listring[current_player;main]", + "listring[current_player;armor]", + "listring[current_player;main]", + "listring[current_player;craft]", + "listring[current_player;main]", + }) player:set_inventory_formspec(form) end @@ -151,9 +177,13 @@ end) minetest.register_on_joinplayer(function(player) --init inventory local inv = player:get_inventory() + + ---get_inventory can return nil if object isn't a player, but we are sure this is one :) + ---@diagnostic disable need-check-nil inv:set_width("main", 9) inv:set_size("main", 36) inv:set_size("offhand", 1) + ---@diagnostic enable need-check-nil --set hotbar size player:hud_set_hotbar_itemcount(9) @@ -175,9 +205,8 @@ minetest.register_on_joinplayer(function(player) return_fields(player, "enchanting_lapis") end) -dofile(minetest.get_modpath(minetest.get_current_modname()) .. "/creative.lua") -mcl_player.register_on_visual_change(mcl_inventory.update_inventory_formspec) +dofile(minetest.get_modpath(minetest.get_current_modname()) .. "/creative.lua") local mt_is_creative_enabled = minetest.is_creative_enabled diff --git a/mods/PLAYER/mcl_player/init.lua b/mods/PLAYER/mcl_player/init.lua index 084fe48a1..520add947 100644 --- a/mods/PLAYER/mcl_player/init.lua +++ b/mods/PLAYER/mcl_player/init.lua @@ -11,15 +11,16 @@ local animation_blend = 0 local function get_mouse_button(player) local controls = player:get_player_control() local get_wielded_item_name = player:get_wielded_item():get_name() - if controls.RMB and not string.find(get_wielded_item_name, "mcl_bows:bow") and not string.find(get_wielded_item_name, "mcl_bows:crossbow") and - not mcl_shields.wielding_shield(player, 1) and not mcl_shields.wielding_shield(player, 2) or controls.LMB then + if controls.RMB and not string.find(get_wielded_item_name, "mcl_bows:bow") and + not string.find(get_wielded_item_name, "mcl_bows:crossbow") and + not mcl_shields.wielding_shield(player, 1) and not mcl_shields.wielding_shield(player, 2) or controls.LMB then return true else return false end end -mcl_player.registered_player_models = { } +mcl_player.registered_player_models = {} -- Local for speed. local models = mcl_player.registered_player_models @@ -49,7 +50,7 @@ function mcl_player.player_get_animation(player) model = player_model[name], textures = textures, animation = player_anim[name], - visibility = player_visibility[name] + visibility = player_visible[name] } end @@ -94,7 +95,7 @@ function mcl_player.player_set_model(player, model_name) player:set_properties({ mesh = model_name, visual = "mesh", - visual_size = model.visual_size or {x=1, y=1}, + visual_size = model.visual_size or { x = 1, y = 1 }, damage_texture_modifier = "^[colorize:red:130", }) update_player_textures(player) @@ -133,6 +134,14 @@ function mcl_player.player_set_armor(player, texture) update_player_textures(player) end +---comment +---@param player ObjectRef +---@param x number +---@param y number +---@param w number +---@param h number +---@param fsname string +---@return string function mcl_player.get_player_formspec_model(player, x, y, w, h, fsname) local name = player:get_player_name() local model = player_model[name] @@ -165,7 +174,8 @@ minetest.register_on_joinplayer(function(player) local name = player:get_player_name() mcl_player.player_attached[name] = false player_visible[name] = true - player_textures[name] = {"character.png", "blank.png", "blank.png"} + player_textures[name] = { "character.png", "blank.png", "blank.png" } + --player:set_local_animation({x=0, y=79}, {x=168, y=187}, {x=189, y=198}, {x=200, y=219}, 30) player:set_fov(86.1) -- see >>> end) @@ -221,11 +231,13 @@ minetest.register_globalstep(function(dtime) elseif mcl_playerplus.elytra[player] and mcl_playerplus.elytra[player].active then player_set_animation(player, "stand") elseif walking and velocity.x > 0.35 - or walking and velocity.x < -0.35 - or walking and velocity.z > 0.35 - or walking and velocity.z < -0.35 then + or walking and velocity.x < -0.35 + or walking and velocity.z > 0.35 + or walking and velocity.z < -0.35 then local wielded_itemname = player:get_wielded_item():get_name() - local no_arm_moving = string.find(wielded_itemname, "mcl_bows:bow") or mcl_shields.wielding_shield(player, 1) or mcl_shields.wielding_shield(player, 2) + local no_arm_moving = string.find(wielded_itemname, "mcl_bows:bow") or + mcl_shields.wielding_shield(player, 1) or + mcl_shields.wielding_shield(player, 2) if player_sneak[name] ~= controls.sneak then player_anim[name] = nil player_sneak[name] = controls.sneak @@ -234,7 +246,8 @@ minetest.register_globalstep(function(dtime) player_set_animation(player, "swim_walk_mine", animation_speed_mod) elseif not controls.sneak and head_in_water and is_sprinting == true then player_set_animation(player, "swim_walk", animation_speed_mod) - elseif no_arm_moving and controls.RMB and controls.sneak or string.find(wielded_itemname, "mcl_bows:crossbow_") and controls.sneak then + elseif no_arm_moving and controls.RMB and controls.sneak or + string.find(wielded_itemname, "mcl_bows:crossbow_") and controls.sneak then player_set_animation(player, "bow_sneak", animation_speed_mod) elseif no_arm_moving and controls.RMB or string.find(wielded_itemname, "mcl_bows:crossbow_") then player_set_animation(player, "bow_walk", animation_speed_mod) diff --git a/textures/mcl_inventory_background9.png b/textures/mcl_inventory_background9.png new file mode 100644 index 0000000000000000000000000000000000000000..d774fd31925f642e35f3fe4f7157bdf93dcf8bdd GIT binary patch literal 5324 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 literal 0 HcmV?d00001 From c2032fe4de645ab43914386635322bd1f17e65f6 Mon Sep 17 00:00:00 2001 From: AFCMS Date: Fri, 9 Sep 2022 19:02:45 +0200 Subject: [PATCH 085/982] Fix --- mods/PLAYER/mcl_player/init.lua | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mods/PLAYER/mcl_player/init.lua b/mods/PLAYER/mcl_player/init.lua index 520add947..757d33c0a 100644 --- a/mods/PLAYER/mcl_player/init.lua +++ b/mods/PLAYER/mcl_player/init.lua @@ -1,3 +1,4 @@ +local string = string local sf = string.format -- Minetest 0.4 mod: player @@ -134,7 +135,6 @@ function mcl_player.player_set_armor(player, texture) update_player_textures(player) end ----comment ---@param player ObjectRef ---@param x number ---@param y number From e093c693280cf0a3c0f23b4ca71c256b2b271ba1 Mon Sep 17 00:00:00 2001 From: AFCMS Date: Fri, 9 Sep 2022 20:42:28 +0200 Subject: [PATCH 086/982] Remove the label size thing (too breaking change) --- mods/HUD/mcl_formspec/FORMSPEC_GUIDE.md | 18 +- mods/HUD/mcl_formspec/init.lua | 14 +- mods/ITEMS/mcl_chests/init.lua | 550 ++++++++++++++---------- settingtypes.txt | 5 - 4 files changed, 336 insertions(+), 251 deletions(-) diff --git a/mods/HUD/mcl_formspec/FORMSPEC_GUIDE.md b/mods/HUD/mcl_formspec/FORMSPEC_GUIDE.md index 838e5cbdd..f8576070f 100644 --- a/mods/HUD/mcl_formspec/FORMSPEC_GUIDE.md +++ b/mods/HUD/mcl_formspec/FORMSPEC_GUIDE.md @@ -1,25 +1,21 @@ # MineClone2 Formspec Guide -***This guide will learn you rules about creation of formspecs for the MineClone2 game.*** +**_This guide will learn you rules about creation of formspecs for the MineClone2 game._** Formspecs are an important part of game and mod development. First of all, MineClone2 aims to support ONLY last formspec version. Many utility functions will not work with formspec v1 or v2. -Label font size should be 25 to be minecraft like. We arent modifying formspec prepend in order to not break existing mods. - -Just add this code to apply it to your formspec: -```lua -mcl_formspec.apply_label_size -``` - The typical width of an 9 slots width inventory formspec is `0.375 + 9 + ((9-1) * 0.25) + 0.375 = 11.75` -Margins is 0.375 +Margins is 0.375. + +The labels color is `mcl_formspec.label_color` Space between 1st inventory line and the rest of inventory is 0.45 Labels should have 0.375 space above if there is no other stuff above and 0.45 between content -+ 0.375 under -According to minetest modding book, table.concat is faster than string concatenation, so this method should be prefered (the code is also more clear) \ No newline at end of file +- 0.375 under + +According to minetest modding book, table.concat is faster than string concatenation, so this method should be prefered (the code is also more clear) diff --git a/mods/HUD/mcl_formspec/init.lua b/mods/HUD/mcl_formspec/init.lua index e7817e639..00fa7560e 100644 --- a/mods/HUD/mcl_formspec/init.lua +++ b/mods/HUD/mcl_formspec/init.lua @@ -1,16 +1,12 @@ -local string = string -local table = table - -local sf = string.format - mcl_formspec = {} mcl_formspec.label_color = "#313131" -mcl_formspec.label_size = tonumber(minetest.settings:get("mcl_label_font_size")) or 24 - -mcl_formspec.apply_label_size = sf("style_type[label;font_size=%s]", mcl_formspec.label_size) - +---@param x number +---@param y number +---@param w number +---@param h number +---@return string function mcl_formspec.get_itemslot_bg(x, y, w, h) local out = "" for i = 0, w - 1, 1 do diff --git a/mods/ITEMS/mcl_chests/init.lua b/mods/ITEMS/mcl_chests/init.lua index b870fc362..fb4850759 100644 --- a/mods/ITEMS/mcl_chests/init.lua +++ b/mods/ITEMS/mcl_chests/init.lua @@ -14,37 +14,37 @@ local mod_doc = minetest.get_modpath("doc") local it_is_christmas = false local date = os.date("*t") if ( - date.month == 12 and ( - date.day == 24 or - date.day == 25 or - date.day == 26 - ) -) then + date.month == 12 and ( + date.day == 24 or + date.day == 25 or + date.day == 26 + ) + ) then it_is_christmas = true end -local tiles_chest_normal_small = {"mcl_chests_normal.png"} -local tiles_chest_normal_double = {"mcl_chests_normal_double.png"} +local tiles_chest_normal_small = { "mcl_chests_normal.png" } +local tiles_chest_normal_double = { "mcl_chests_normal_double.png" } if it_is_christmas then - tiles_chest_normal_small = {"mcl_chests_normal_present.png^mcl_chests_noise.png"} - tiles_chest_normal_double = {"mcl_chests_normal_double_present.png^mcl_chests_noise_double.png"} + tiles_chest_normal_small = { "mcl_chests_normal_present.png^mcl_chests_noise.png" } + tiles_chest_normal_double = { "mcl_chests_normal_double_present.png^mcl_chests_noise_double.png" } end -local tiles_chest_trapped_small = {"mcl_chests_trapped.png"} -local tiles_chest_trapped_double = {"mcl_chests_trapped_double.png"} +local tiles_chest_trapped_small = { "mcl_chests_trapped.png" } +local tiles_chest_trapped_double = { "mcl_chests_trapped_double.png" } if it_is_christmas then - tiles_chest_trapped_small = {"mcl_chests_trapped_present.png^mcl_chests_noise.png"} - tiles_chest_trapped_double = {"mcl_chests_trapped_double_present.png^mcl_chests_noise_double.png"} + tiles_chest_trapped_small = { "mcl_chests_trapped_present.png^mcl_chests_noise.png" } + tiles_chest_trapped_double = { "mcl_chests_trapped_double_present.png^mcl_chests_noise_double.png" } end -local tiles_chest_ender_small = {"mcl_chests_ender.png"} +local tiles_chest_ender_small = { "mcl_chests_ender.png" } -local ender_chest_texture = {"mcl_chests_ender.png"} +local ender_chest_texture = { "mcl_chests_ender.png" } if it_is_christmas then - tiles_chest_ender_small = {"mcl_chests_ender_present.png^mcl_chests_noise.png"} - ender_chest_texture = {"mcl_chests_ender_present.png"} + tiles_chest_ender_small = { "mcl_chests_ender_present.png^mcl_chests_noise.png" } + ender_chest_texture = { "mcl_chests_ender_present.png" } end -- Chest Entity @@ -52,19 +52,20 @@ local animate_chests = (minetest.settings:get_bool("animated_chests") ~= false) local entity_animations = { shulker = { speed = 50, - open = {x = 45, y = 95}, - close = {x = 95, y = 145}, + open = { x = 45, y = 95 }, + close = { x = 95, y = 145 }, }, chest = { speed = 25, - open = {x = 0, y = 7}, - close = {x = 13, y = 20}, + open = { x = 0, y = 7 }, + close = { x = 13, y = 20 }, }, } minetest.register_entity("mcl_chests:chest", { initial_properties = { visual = "mesh", + visual_size = { x = 3, y = 3 }, pointable = false, physical = false, static_save = false, @@ -81,7 +82,8 @@ minetest.register_entity("mcl_chests:chest", { self.players[playername] = true if not self.is_open then self:set_animation("open") - minetest.sound_play(self.sound_prefix .. "_open", {pos=self.node_pos, gain=0.5, max_hear_distance = 16}, true) + minetest.sound_play(self.sound_prefix .. "_open", { pos = self.node_pos, gain = 0.5, max_hear_distance = 16 }, + true) self.is_open = true end end, @@ -94,7 +96,8 @@ minetest.register_entity("mcl_chests:chest", { return end self:set_animation("close") - minetest.sound_play(self.sound_prefix .. "_close", {pos=self.node_pos, gain=0.3, max_hear_distance = 16}, true) + minetest.sound_play(self.sound_prefix .. "_close", { pos = self.node_pos, gain = 0.3, max_hear_distance = 16 }, + true) self.is_open = false end end, @@ -133,7 +136,7 @@ minetest.register_entity("mcl_chests:chest", { end, on_activate = function(self) - self.object:set_armor_groups({immortal = 1}) + self.object:set_armor_groups({ immortal = 1 }) self.players = {} end, @@ -167,7 +170,8 @@ local function get_entity_info(pos, param2, double, dir, entity_pos) return dir, get_entity_pos(pos, dir, double) end -local function create_entity(pos, node_name, textures, param2, double, sound_prefix, mesh_prefix, animation_type, dir, entity_pos) +local function create_entity(pos, node_name, textures, param2, double, sound_prefix, mesh_prefix, animation_type, dir, + entity_pos) dir, entity_pos = get_entity_info(pos, param2, double, dir, entity_pos) local obj = minetest.add_entity(entity_pos, "mcl_chests:chest") local luaentity = obj:get_luaentity() @@ -175,9 +179,12 @@ local function create_entity(pos, node_name, textures, param2, double, sound_pre return luaentity end -local function find_or_create_entity(pos, node_name, textures, param2, double, sound_prefix, mesh_prefix, animation_type, dir, entity_pos) +local function find_or_create_entity(pos, node_name, textures, param2, double, sound_prefix, mesh_prefix, animation_type + , dir, entity_pos) dir, entity_pos = get_entity_info(pos, param2, double, dir, entity_pos) - return find_entity(entity_pos) or create_entity(pos, node_name, textures, param2, double, sound_prefix, mesh_prefix, animation_type, dir, entity_pos) + return find_entity(entity_pos) or + create_entity(pos, node_name, textures, param2, double, sound_prefix, mesh_prefix, animation_type, dir, + entity_pos) end local no_rotate, simple_rotate @@ -188,7 +195,9 @@ if minetest.get_modpath("screwdriver") then local nodename = node.name local nodedef = minetest.registered_nodes[nodename] local dir = minetest.facedir_to_dir(new_param2) - find_or_create_entity(pos, nodename, nodedef._chest_entity_textures, new_param2, false, nodedef._chest_entity_sound, nodedef._chest_entity_mesh, nodedef._chest_entity_animation_type, dir):set_yaw(dir) + find_or_create_entity(pos, nodename, nodedef._chest_entity_textures, new_param2, false, + nodedef._chest_entity_sound, + nodedef._chest_entity_mesh, nodedef._chest_entity_animation_type, dir):set_yaw(dir) else return false end @@ -213,10 +222,21 @@ end]] -- To be called if a player opened a chest local function player_chest_open(player, pos, node_name, textures, param2, double, sound, mesh, shulker) local name = player:get_player_name() - open_chests[name] = {pos = pos, node_name = node_name, textures = textures, param2 = param2, double = double, sound = sound, mesh = mesh, shulker = shulker} + open_chests[name] = { + pos = pos, + node_name = node_name, + textures = textures, + param2 = param2, + double = double, + sound = sound, + mesh = mesh, + shulker = shulker + } if animate_chests then local dir = minetest.facedir_to_dir(param2) - find_or_create_entity(pos, node_name, textures, param2, double, sound, mesh, shulker and "shulker" or "chest", dir):open(name) + find_or_create_entity(pos, node_name, textures, param2, double, sound, mesh, shulker and "shulker" or "chest", + dir): + open(name) end end @@ -230,6 +250,7 @@ local function protection_check_move(pos, from_list, from_index, to_list, to_ind return count end end + local function protection_check_put_take(pos, listname, index, stack, player) local name = player:get_player_name() if minetest.is_protected(pos, name) then @@ -247,24 +268,27 @@ local function chest_update_after_close(pos) local node = minetest.get_node(pos) if node.name == "mcl_chests:trapped_chest_on_small" then - minetest.swap_node(pos, {name = "mcl_chests:trapped_chest_small", param2 = node.param2}) - find_or_create_entity(pos, "mcl_chests:trapped_chest_small", {"mcl_chests_trapped.png"}, node.param2, false, "default_chest", "mcl_chests_chest", "chest"):reinitialize("mcl_chests:trapped_chest_small") + minetest.swap_node(pos, { name = "mcl_chests:trapped_chest_small", param2 = node.param2 }) + find_or_create_entity(pos, "mcl_chests:trapped_chest_small", { "mcl_chests_trapped.png" }, node.param2, false, + "default_chest", "mcl_chests_chest", "chest"):reinitialize("mcl_chests:trapped_chest_small") mesecon.receptor_off(pos, trapped_chest_mesecons_rules) elseif node.name == "mcl_chests:trapped_chest_on_left" then - minetest.swap_node(pos, {name="mcl_chests:trapped_chest_left", param2 = node.param2}) - find_or_create_entity(pos, "mcl_chests:trapped_chest_left", tiles_chest_trapped_double, node.param2, true, "default_chest", "mcl_chests_chest", "chest"):reinitialize("mcl_chests:trapped_chest_left") + minetest.swap_node(pos, { name = "mcl_chests:trapped_chest_left", param2 = node.param2 }) + find_or_create_entity(pos, "mcl_chests:trapped_chest_left", tiles_chest_trapped_double, node.param2, true, + "default_chest", "mcl_chests_chest", "chest"):reinitialize("mcl_chests:trapped_chest_left") mesecon.receptor_off(pos, trapped_chest_mesecons_rules) local pos_other = mcl_util.get_double_container_neighbor_pos(pos, node.param2, "left") - minetest.swap_node(pos_other, {name = "mcl_chests:trapped_chest_right", param2 = node.param2}) + minetest.swap_node(pos_other, { name = "mcl_chests:trapped_chest_right", param2 = node.param2 }) mesecon.receptor_off(pos_other, trapped_chest_mesecons_rules) elseif node.name == "mcl_chests:trapped_chest_on_right" then - minetest.swap_node(pos, {name = "mcl_chests:trapped_chest_right", param2 = node.param2}) + minetest.swap_node(pos, { name = "mcl_chests:trapped_chest_right", param2 = node.param2 }) mesecon.receptor_off(pos, trapped_chest_mesecons_rules) local pos_other = mcl_util.get_double_container_neighbor_pos(pos, node.param2, "right") - minetest.swap_node(pos_other, {name="mcl_chests:trapped_chest_left", param2 = node.param2}) - find_or_create_entity(pos_other, "mcl_chests:trapped_chest_left", tiles_chest_trapped_double, node.param2, true, "default_chest", "mcl_chests_chest", "chest"):reinitialize("mcl_chests:trapped_chest_left") + minetest.swap_node(pos_other, { name = "mcl_chests:trapped_chest_left", param2 = node.param2 }) + find_or_create_entity(pos_other, "mcl_chests:trapped_chest_left", tiles_chest_trapped_double, node.param2, true, + "default_chest", "mcl_chests_chest", "chest"):reinitialize("mcl_chests:trapped_chest_left") mesecon.receptor_off(pos_other, trapped_chest_mesecons_rules) end end @@ -277,7 +301,9 @@ local function player_chest_close(player) return end if animate_chests then - find_or_create_entity(open_chest.pos, open_chest.node_name, open_chest.textures, open_chest.param2, open_chest.double, open_chest.sound, open_chest.mesh, open_chest.shulker and "shulker" or "chest"):close(name) + find_or_create_entity(open_chest.pos, open_chest.node_name, open_chest.textures, open_chest.param2, + open_chest.double, + open_chest.sound, open_chest.mesh, open_chest.shulker and "shulker" or "chest"):close(name) end chest_update_after_close(open_chest.pos) @@ -285,12 +311,14 @@ local function player_chest_close(player) end -- This is a helper function to register both chests and trapped chests. Trapped chests will make use of the additional parameters -local function register_chest(basename, desc, longdesc, usagehelp, tt_help, tiles_table, hidden, mesecons, on_rightclick_addendum, on_rightclick_addendum_left, on_rightclick_addendum_right, drop, canonical_basename) +local function register_chest(basename, desc, longdesc, usagehelp, tt_help, tiles_table, hidden, mesecons, + on_rightclick_addendum, on_rightclick_addendum_left, on_rightclick_addendum_right, drop, + canonical_basename) -- START OF register_chest FUNCTION BODY if not drop then - drop = "mcl_chests:"..basename + drop = "mcl_chests:" .. basename else - drop = "mcl_chests:"..drop + drop = "mcl_chests:" .. drop end -- The basename of the "canonical" version of the node, if set (e.g.: trapped_chest_on → trapped_chest). -- Used to get a shared formspec ID and to swap the node back to the canonical version in on_construct. @@ -356,12 +384,12 @@ local function register_chest(basename, desc, longdesc, usagehelp, tt_help, tile return stack:get_count() - leftover:get_count() end - local small_name = "mcl_chests:"..basename.."_small" + local small_name = "mcl_chests:" .. basename .. "_small" local small_textures = tiles_table.small - local left_name = "mcl_chests:"..basename.."_left" + local left_name = "mcl_chests:" .. basename .. "_left" local left_textures = tiles_table.double - minetest.register_node("mcl_chests:"..basename, { + minetest.register_node("mcl_chests:" .. basename, { description = desc, _tt_help = tt_help, _doc_items_longdesc = longdesc, @@ -375,7 +403,7 @@ local function register_chest(basename, desc, longdesc, usagehelp, tt_help, tile paramtype2 = "facedir", stack_max = 64, sounds = mcl_sounds.node_sound_wood_defaults(), - groups = {deco_block=1}, + groups = { deco_block = 1 }, on_construct = function(pos, node) local node = minetest.get_node(pos) node.name = small_name @@ -388,9 +416,10 @@ local function register_chest(basename, desc, longdesc, usagehelp, tt_help, tile local function close_forms(canonical_basename, pos) local players = minetest.get_connected_players() - for p=1, #players do + for p = 1, #players do if vector.distance(players[p]:get_pos(), pos) <= 30 then - minetest.close_formspec(players[p]:get_player_name(), "mcl_chests:"..canonical_basename.."_"..pos.x.."_"..pos.y.."_"..pos.z) + minetest.close_formspec(players[p]:get_player_name(), + "mcl_chests:" .. canonical_basename .. "_" .. pos.x .. "_" .. pos.y .. "_" .. pos.z) end end end @@ -404,9 +433,9 @@ local function register_chest(basename, desc, longdesc, usagehelp, tt_help, tile drawtype = "nodebox", node_box = { type = "fixed", - fixed = {-0.4375, -0.5, -0.4375, 0.4375, 0.375, 0.4375}, + fixed = { -0.4375, -0.5, -0.4375, 0.4375, 0.375, 0.4375 }, }, - tiles = {"blank.png^[resize:16x16"}, + tiles = { "blank.png^[resize:16x16" }, use_texture_alpha = minetest.features.use_texture_alpha_string_modes and "clip" or true, _chest_entity_textures = small_textures, _chest_entity_sound = "default_chest", @@ -416,7 +445,16 @@ local function register_chest(basename, desc, longdesc, usagehelp, tt_help, tile paramtype2 = "facedir", stack_max = 64, drop = drop, - groups = {handy=1,axey=1, container=2, deco_block=1, material_wood=1,flammable=-1,chest_entity=1, not_in_creative_inventory=1}, + groups = { + handy = 1, + axey = 1, + container = 2, + deco_block = 1, + material_wood = 1, + flammable = -1, + chest_entity = 1, + not_in_creative_inventory = 1 + }, is_ground_content = false, sounds = mcl_sounds.node_sound_wood_defaults(), on_construct = function(pos) @@ -433,7 +471,7 @@ local function register_chest(basename, desc, longdesc, usagehelp, tt_help, tile meta:set_string("workaround", nil) -- Done to keep metadata clean -- END OF WORKAROUND -- local inv = meta:get_inventory() - inv:set_size("main", 9*3) + inv:set_size("main", 9 * 3) --[[ The "input" list is *another* workaround (hahahaha!) around the fact that Minetest does not support listrings to put items into an alternative list if the first one happens to be full. See . @@ -444,19 +482,26 @@ local function register_chest(basename, desc, longdesc, usagehelp, tt_help, tile -- BEGIN OF LISTRING WORKAROUND inv:set_size("input", 1) -- END OF LISTRING WORKAROUND - if minetest.get_node(mcl_util.get_double_container_neighbor_pos(pos, param2, "right")).name == "mcl_chests:"..canonical_basename.."_small" then - minetest.swap_node(pos, {name="mcl_chests:"..canonical_basename.."_right",param2=param2}) + if minetest.get_node(mcl_util.get_double_container_neighbor_pos(pos, param2, "right")).name == + "mcl_chests:" .. canonical_basename .. "_small" then + minetest.swap_node(pos, { name = "mcl_chests:" .. canonical_basename .. "_right", param2 = param2 }) local p = mcl_util.get_double_container_neighbor_pos(pos, param2, "right") - minetest.swap_node(p, { name = "mcl_chests:"..canonical_basename.."_left", param2 = param2 }) - create_entity(p, "mcl_chests:"..canonical_basename.."_left", left_textures, param2, true, "default_chest", "mcl_chests_chest", "chest") - elseif minetest.get_node(mcl_util.get_double_container_neighbor_pos(pos, param2, "left")).name == "mcl_chests:"..canonical_basename.."_small" then - minetest.swap_node(pos, {name="mcl_chests:"..canonical_basename.."_left",param2=param2}) - create_entity(pos, "mcl_chests:"..canonical_basename.."_left", left_textures, param2, true, "default_chest", "mcl_chests_chest", "chest") + minetest.swap_node(p, { name = "mcl_chests:" .. canonical_basename .. "_left", param2 = param2 }) + create_entity(p, "mcl_chests:" .. canonical_basename .. "_left", left_textures, param2, true, + "default_chest", + "mcl_chests_chest", "chest") + elseif minetest.get_node(mcl_util.get_double_container_neighbor_pos(pos, param2, "left")).name == + "mcl_chests:" .. canonical_basename .. "_small" then + minetest.swap_node(pos, { name = "mcl_chests:" .. canonical_basename .. "_left", param2 = param2 }) + create_entity(pos, "mcl_chests:" .. canonical_basename .. "_left", left_textures, param2, true, + "default_chest", + "mcl_chests_chest", "chest") local p = mcl_util.get_double_container_neighbor_pos(pos, param2, "left") - minetest.swap_node(p, { name = "mcl_chests:"..canonical_basename.."_right", param2 = param2 }) + minetest.swap_node(p, { name = "mcl_chests:" .. canonical_basename .. "_right", param2 = param2 }) else - minetest.swap_node(pos, { name = "mcl_chests:"..canonical_basename.."_small", param2 = param2 }) - create_entity(pos, small_name, small_textures, param2, false, "default_chest", "mcl_chests_chest", "chest") + minetest.swap_node(pos, { name = "mcl_chests:" .. canonical_basename .. "_small", param2 = param2 }) + create_entity(pos, small_name, small_textures, param2, false, "default_chest", "mcl_chests_chest", + "chest") end end, after_place_node = function(pos, placer, itemstack, pointed_thing) @@ -468,28 +513,28 @@ local function register_chest(basename, desc, longdesc, usagehelp, tt_help, tile allow_metadata_inventory_take = protection_check_put_take, allow_metadata_inventory_put = protection_check_put_take, on_metadata_inventory_move = function(pos, from_list, from_index, to_list, to_index, count, player) - minetest.log("action", player:get_player_name().. - " moves stuff in chest at "..minetest.pos_to_string(pos)) + minetest.log("action", player:get_player_name() .. + " moves stuff in chest at " .. minetest.pos_to_string(pos)) end, on_metadata_inventory_put = function(pos, listname, index, stack, player) - minetest.log("action", player:get_player_name().. - " moves stuff to chest at "..minetest.pos_to_string(pos)) + minetest.log("action", player:get_player_name() .. + " moves stuff to chest at " .. minetest.pos_to_string(pos)) -- BEGIN OF LISTRING WORKAROUND if listname == "input" then - local inv = minetest.get_inventory({type="node", pos=pos}) + local inv = minetest.get_inventory({ type = "node", pos = pos }) inv:add_item("main", stack) end -- END OF LISTRING WORKAROUND end, on_metadata_inventory_take = function(pos, listname, index, stack, player) - minetest.log("action", player:get_player_name().. - " takes stuff from chest at "..minetest.pos_to_string(pos)) + minetest.log("action", player:get_player_name() .. + " takes stuff from chest at " .. minetest.pos_to_string(pos)) end, _mcl_blast_resistance = 2.5, _mcl_hardness = 2.5, on_rightclick = function(pos, node, clicker) - if minetest.registered_nodes[minetest.get_node({x = pos.x, y = pos.y + 1, z = pos.z}).name].groups.opaque == 1 then + if minetest.registered_nodes[minetest.get_node({ x = pos.x, y = pos.y + 1, z = pos.z }).name].groups.opaque == 1 then -- won't open if there is no space from the top return false end @@ -503,21 +548,16 @@ local function register_chest(basename, desc, longdesc, usagehelp, tt_help, tile table.concat({ "formspec_version[4]", "size[11.75,10.425]", - mcl_formspec.apply_label_size, - - "label[0.375,0.375;"..F(C(mcl_formspec.label_color, name)).."]", + "label[0.375,0.375;" .. F(C(mcl_formspec.label_color, name)) .. "]", mcl_formspec.get_itemslot_bg_v4(0.375, 0.75, 9, 3), sf("list[nodemeta:%s,%s,%s;main;0.375,0.75;9,3;]", pos.x, pos.y, pos.z), - - "label[0.375,4.7;"..F(C(mcl_formspec.label_color, S("Inventory"))).."]", - + "label[0.375,4.7;" .. F(C(mcl_formspec.label_color, S("Inventory"))) .. "]", mcl_formspec.get_itemslot_bg_v4(0.375, 5.1, 9, 3), "list[current_player;main;0.375,5.1;9,3;9]", mcl_formspec.get_itemslot_bg_v4(0.375, 9.05, 9, 1), "list[current_player;main;0.375,9.05;9,1;]", - sf("listring[nodemeta:%s,%s,%s;main]", pos.x, pos.y, pos.z), "listring[current_player;main]", }) @@ -527,7 +567,8 @@ local function register_chest(basename, desc, longdesc, usagehelp, tt_help, tile on_rightclick_addendum(pos, node, clicker) end - player_chest_open(clicker, pos, small_name, small_textures, node.param2, false, "default_chest", "mcl_chests_chest") + player_chest_open(clicker, pos, small_name, small_textures, node.param2, false, "default_chest", + "mcl_chests_chest") end, on_destruct = function(pos) @@ -541,9 +582,9 @@ local function register_chest(basename, desc, longdesc, usagehelp, tt_help, tile drawtype = "nodebox", node_box = { type = "fixed", - fixed = {-0.4375, -0.5, -0.4375, 0.5, 0.375, 0.4375}, + fixed = { -0.4375, -0.5, -0.4375, 0.5, 0.375, 0.4375 }, }, - tiles = {"blank.png^[resize:16x16"}, + tiles = { "blank.png^[resize:16x16" }, use_texture_alpha = minetest.features.use_texture_alpha_string_modes and "clip" or true, _chest_entity_textures = left_textures, _chest_entity_sound = "default_chest", @@ -551,7 +592,16 @@ local function register_chest(basename, desc, longdesc, usagehelp, tt_help, tile _chest_entity_animation_type = "chest", paramtype = "light", paramtype2 = "facedir", - groups = {handy=1,axey=1, container=5,not_in_creative_inventory=1, material_wood=1,flammable=-1,chest_entity=1,double_chest=1}, + groups = { + handy = 1, + axey = 1, + container = 5, + not_in_creative_inventory = 1, + material_wood = 1, + flammable = -1, + chest_entity = 1, + double_chest = 1 + }, drop = drop, is_ground_content = false, sounds = mcl_sounds.node_sound_wood_defaults(), @@ -559,8 +609,8 @@ local function register_chest(basename, desc, longdesc, usagehelp, tt_help, tile local n = minetest.get_node(pos) local param2 = n.param2 local p = mcl_util.get_double_container_neighbor_pos(pos, param2, "left") - if not p or minetest.get_node(p).name ~= "mcl_chests:"..canonical_basename.."_right" then - n.name = "mcl_chests:"..canonical_basename.."_small" + if not p or minetest.get_node(p).name ~= "mcl_chests:" .. canonical_basename .. "_right" then + n.name = "mcl_chests:" .. canonical_basename .. "_small" minetest.swap_node(pos, n) end create_entity(pos, left_name, left_textures, param2, true, "default_chest", "mcl_chests_chest", "chest") @@ -578,7 +628,7 @@ local function register_chest(basename, desc, longdesc, usagehelp, tt_help, tile local param2 = n.param2 local p = mcl_util.get_double_container_neighbor_pos(pos, param2, "left") - if not p or minetest.get_node(p).name ~= "mcl_chests:"..basename.."_right" then + if not p or minetest.get_node(p).name ~= "mcl_chests:" .. basename .. "_right" then return end close_forms(canonical_basename, p) @@ -595,11 +645,11 @@ local function register_chest(basename, desc, longdesc, usagehelp, tt_help, tile if minetest.is_protected(pos, name) then minetest.record_protection_violation(pos, name) return 0 - -- BEGIN OF LISTRING WORKAROUND + -- BEGIN OF LISTRING WORKAROUND elseif listname == "input" then - local inv = minetest.get_inventory({type="node", pos=pos}) + local inv = minetest.get_inventory({ type = "node", pos = pos }) local other_pos = mcl_util.get_double_container_neighbor_pos(pos, minetest.get_node(pos).param2, "left") - local other_inv = minetest.get_inventory({type="node", pos=other_pos}) + local other_inv = minetest.get_inventory({ type = "node", pos = other_pos }) return limit_put(stack, inv, other_inv) --[[if inv:room_for_item("main", stack) then return -1 @@ -610,24 +660,25 @@ local function register_chest(basename, desc, longdesc, usagehelp, tt_help, tile else return 0 end - end]]-- - -- END OF LISTRING WORKAROUND + end]] + -- + -- END OF LISTRING WORKAROUND else return stack:get_count() end end, on_metadata_inventory_move = function(pos, from_list, from_index, to_list, to_index, count, player) - minetest.log("action", player:get_player_name().. - " moves stuff in chest at "..minetest.pos_to_string(pos)) + minetest.log("action", player:get_player_name() .. + " moves stuff in chest at " .. minetest.pos_to_string(pos)) end, on_metadata_inventory_put = function(pos, listname, index, stack, player) - minetest.log("action", player:get_player_name().. - " moves stuff to chest at "..minetest.pos_to_string(pos)) + minetest.log("action", player:get_player_name() .. + " moves stuff to chest at " .. minetest.pos_to_string(pos)) -- BEGIN OF LISTRING WORKAROUND if listname == "input" then - local inv = minetest.get_inventory({type="node", pos=pos}) + local inv = minetest.get_inventory({ type = "node", pos = pos }) local other_pos = mcl_util.get_double_container_neighbor_pos(pos, minetest.get_node(pos).param2, "left") - local other_inv = minetest.get_inventory({type="node", pos=other_pos}) + local other_inv = minetest.get_inventory({ type = "node", pos = other_pos }) inv:set_stack("input", 1, nil) @@ -636,16 +687,17 @@ local function register_chest(basename, desc, longdesc, usagehelp, tt_help, tile -- END OF LISTRING WORKAROUND end, on_metadata_inventory_take = function(pos, listname, index, stack, player) - minetest.log("action", player:get_player_name().. - " takes stuff from chest at "..minetest.pos_to_string(pos)) + minetest.log("action", player:get_player_name() .. + " takes stuff from chest at " .. minetest.pos_to_string(pos)) end, _mcl_blast_resistance = 2.5, _mcl_hardness = 2.5, on_rightclick = function(pos, node, clicker) local pos_other = mcl_util.get_double_container_neighbor_pos(pos, node.param2, "left") - local above_def = minetest.registered_nodes[minetest.get_node({x = pos.x, y = pos.y + 1, z = pos.z}).name] - local above_def_other = minetest.registered_nodes[minetest.get_node({x = pos_other.x, y = pos_other.y + 1, z = pos_other.z}).name] + local above_def = minetest.registered_nodes[minetest.get_node({ x = pos.x, y = pos.y + 1, z = pos.z }).name] + local above_def_other = minetest.registered_nodes[ + minetest.get_node({ x = pos_other.x, y = pos_other.y + 1, z = pos_other.z }).name] if not above_def or above_def.groups.opaque == 1 or not above_def_other or above_def_other.groups.opaque == 1 then -- won't open if there is no space from the top @@ -665,18 +717,13 @@ local function register_chest(basename, desc, longdesc, usagehelp, tt_help, tile table.concat({ "formspec_version[4]", "size[11.75,14.15]", - mcl_formspec.apply_label_size, - - "label[0.375,0.375;"..F(C(mcl_formspec.label_color, name)).."]", + "label[0.375,0.375;" .. F(C(mcl_formspec.label_color, name)) .. "]", mcl_formspec.get_itemslot_bg_v4(0.375, 0.75, 9, 3), sf("list[nodemeta:%s,%s,%s;main;0.375,0.75;9,3;]", pos.x, pos.y, pos.z), - mcl_formspec.get_itemslot_bg_v4(0.375, 4.5, 9, 3), sf("list[nodemeta:%s,%s,%s;main;0.375,4.5;9,3;]", pos_other.x, pos_other.y, pos_other.z), - - "label[0.375,8.45;"..F(C(mcl_formspec.label_color, S("Inventory"))).."]", - + "label[0.375,8.45;" .. F(C(mcl_formspec.label_color, S("Inventory"))) .. "]", mcl_formspec.get_itemslot_bg_v4(0.375, 8.825, 9, 3), "list[current_player;main;0.375,8.825;9,3;9]", @@ -687,7 +734,7 @@ local function register_chest(basename, desc, longdesc, usagehelp, tt_help, tile "listring[current_player;main]", sf("listring[nodemeta:%s,%s,%s;input]", pos.x, pos.y, pos.z), --END OF LISTRING WORKAROUND - "listring[current_player;main]".. + "listring[current_player;main]" .. sf("listring[nodemeta:%s,%s,%s;main]", pos.x, pos.y, pos.z), "listring[current_player;main]", sf("listring[nodemeta:%s,%s,%s;main]", pos_other.x, pos_other.y, pos_other.z), @@ -698,23 +745,32 @@ local function register_chest(basename, desc, longdesc, usagehelp, tt_help, tile on_rightclick_addendum_left(pos, node, clicker) end - player_chest_open(clicker, pos, left_name, left_textures, node.param2, true, "default_chest", "mcl_chests_chest") + player_chest_open(clicker, pos, left_name, left_textures, node.param2, true, "default_chest", + "mcl_chests_chest") end, mesecons = mesecons, on_rotate = no_rotate, }) - minetest.register_node("mcl_chests:"..basename.."_right", { + minetest.register_node("mcl_chests:" .. basename .. "_right", { drawtype = "nodebox", paramtype = "light", paramtype2 = "facedir", node_box = { type = "fixed", - fixed = {-0.5, -0.5, -0.4375, 0.4375, 0.375, 0.4375}, + fixed = { -0.5, -0.5, -0.4375, 0.4375, 0.375, 0.4375 }, }, - tiles = {"blank.png^[resize:16x16"}, + tiles = { "blank.png^[resize:16x16" }, use_texture_alpha = minetest.features.use_texture_alpha_string_modes and "clip" or true, - groups = {handy=1,axey=1, container=6,not_in_creative_inventory=1, material_wood=1,flammable=-1,double_chest=2}, + groups = { + handy = 1, + axey = 1, + container = 6, + not_in_creative_inventory = 1, + material_wood = 1, + flammable = -1, + double_chest = 2 + }, drop = drop, is_ground_content = false, sounds = mcl_sounds.node_sound_wood_defaults(), @@ -722,8 +778,8 @@ local function register_chest(basename, desc, longdesc, usagehelp, tt_help, tile local n = minetest.get_node(pos) local param2 = n.param2 local p = mcl_util.get_double_container_neighbor_pos(pos, param2, "right") - if not p or minetest.get_node(p).name ~= "mcl_chests:"..canonical_basename.."_left" then - n.name = "mcl_chests:"..canonical_basename.."_small" + if not p or minetest.get_node(p).name ~= "mcl_chests:" .. canonical_basename .. "_left" then + n.name = "mcl_chests:" .. canonical_basename .. "_small" minetest.swap_node(pos, n) end end, @@ -740,7 +796,7 @@ local function register_chest(basename, desc, longdesc, usagehelp, tt_help, tile local param2 = n.param2 local p = mcl_util.get_double_container_neighbor_pos(pos, param2, "right") - if not p or minetest.get_node(p).name ~= "mcl_chests:"..basename.."_left" then + if not p or minetest.get_node(p).name ~= "mcl_chests:" .. basename .. "_left" then return end close_forms(canonical_basename, p) @@ -757,11 +813,11 @@ local function register_chest(basename, desc, longdesc, usagehelp, tt_help, tile if minetest.is_protected(pos, name) then minetest.record_protection_violation(pos, name) return 0 - -- BEGIN OF LISTRING WORKAROUND + -- BEGIN OF LISTRING WORKAROUND elseif listname == "input" then local other_pos = mcl_util.get_double_container_neighbor_pos(pos, minetest.get_node(pos).param2, "right") - local other_inv = minetest.get_inventory({type="node", pos=other_pos}) - local inv = minetest.get_inventory({type="node", pos=pos}) + local other_inv = minetest.get_inventory({ type = "node", pos = other_pos }) + local inv = minetest.get_inventory({ type = "node", pos = pos }) --[[if other_inv:room_for_item("main", stack) then return -1 else @@ -772,23 +828,23 @@ local function register_chest(basename, desc, longdesc, usagehelp, tt_help, tile end end--]] return limit_put(stack, other_inv, inv) - -- END OF LISTRING WORKAROUND + -- END OF LISTRING WORKAROUND else return stack:get_count() end end, on_metadata_inventory_move = function(pos, from_list, from_index, to_list, to_index, count, player) - minetest.log("action", player:get_player_name().. - " moves stuff in chest at "..minetest.pos_to_string(pos)) + minetest.log("action", player:get_player_name() .. + " moves stuff in chest at " .. minetest.pos_to_string(pos)) end, on_metadata_inventory_put = function(pos, listname, index, stack, player) - minetest.log("action", player:get_player_name().. - " moves stuff to chest at "..minetest.pos_to_string(pos)) + minetest.log("action", player:get_player_name() .. + " moves stuff to chest at " .. minetest.pos_to_string(pos)) -- BEGIN OF LISTRING WORKAROUND if listname == "input" then local other_pos = mcl_util.get_double_container_neighbor_pos(pos, minetest.get_node(pos).param2, "right") - local other_inv = minetest.get_inventory({type="node", pos=other_pos}) - local inv = minetest.get_inventory({type="node", pos=pos}) + local other_inv = minetest.get_inventory({ type = "node", pos = other_pos }) + local inv = minetest.get_inventory({ type = "node", pos = pos }) inv:set_stack("input", 1, nil) @@ -797,18 +853,20 @@ local function register_chest(basename, desc, longdesc, usagehelp, tt_help, tile -- END OF LISTRING WORKAROUND end, on_metadata_inventory_take = function(pos, listname, index, stack, player) - minetest.log("action", player:get_player_name().. - " takes stuff from chest at "..minetest.pos_to_string(pos)) + minetest.log("action", player:get_player_name() .. + " takes stuff from chest at " .. minetest.pos_to_string(pos)) end, _mcl_blast_resistance = 2.5, _mcl_hardness = 2.5, on_rightclick = function(pos, node, clicker) local pos_other = mcl_util.get_double_container_neighbor_pos(pos, node.param2, "right") - if minetest.registered_nodes[minetest.get_node({x = pos.x, y = pos.y + 1, z = pos.z}).name].groups.opaque == 1 - or minetest.registered_nodes[minetest.get_node({x = pos_other.x, y = pos_other.y + 1, z = pos_other.z}).name].groups.opaque == 1 then - -- won't open if there is no space from the top - return false + if minetest.registered_nodes[minetest.get_node({ x = pos.x, y = pos.y + 1, z = pos.z }).name].groups.opaque == 1 + or + minetest.registered_nodes[minetest.get_node({ x = pos_other.x, y = pos_other.y + 1, z = pos_other.z }).name].groups.opaque + == 1 then + -- won't open if there is no space from the top + return false end local name = minetest.get_meta(pos_other):get_string("name") @@ -824,18 +882,13 @@ local function register_chest(basename, desc, longdesc, usagehelp, tt_help, tile table.concat({ "formspec_version[4]", "size[11.75,14.15]", - mcl_formspec.apply_label_size, - - "label[0.375,0.375;"..F(C(mcl_formspec.label_color, name)).."]", + "label[0.375,0.375;" .. F(C(mcl_formspec.label_color, name)) .. "]", mcl_formspec.get_itemslot_bg_v4(0.375, 0.75, 9, 3), sf("list[nodemeta:%s,%s,%s;main;0.375,0.75;9,3;]", pos_other.x, pos_other.y, pos_other.z), - mcl_formspec.get_itemslot_bg_v4(0.375, 4.5, 9, 3), sf("list[nodemeta:%s,%s,%s;main;0.375,4.5;9,3;]", pos.x, pos.y, pos.z), - - "label[0.375,8.45;"..F(C(mcl_formspec.label_color, S("Inventory"))).."]", - + "label[0.375,8.45;" .. F(C(mcl_formspec.label_color, S("Inventory"))) .. "]", mcl_formspec.get_itemslot_bg_v4(0.375, 8.825, 9, 3), "list[current_player;main;0.375,8.825;9,3;9]", @@ -846,7 +899,7 @@ local function register_chest(basename, desc, longdesc, usagehelp, tt_help, tile "listring[current_player;main]", sf("listring[nodemeta:%s,%s,%s;input]", pos.x, pos.y, pos.z), --END OF LISTRING WORKAROUND - "listring[current_player;main]".. + "listring[current_player;main]" .. sf("listring[nodemeta:%s,%s,%s;main]", pos_other.x, pos_other.y, pos_other.z), "listring[current_player;main]", sf("listring[nodemeta:%s,%s,%s;main]", pos.x, pos.y, pos.z), @@ -857,15 +910,16 @@ local function register_chest(basename, desc, longdesc, usagehelp, tt_help, tile on_rightclick_addendum_right(pos, node, clicker) end - player_chest_open(clicker, pos_other, left_name, left_textures, node.param2, true, "default_chest", "mcl_chests_chest") + player_chest_open(clicker, pos_other, left_name, left_textures, node.param2, true, "default_chest", + "mcl_chests_chest") end, mesecons = mesecons, on_rotate = no_rotate, }) if mod_doc then - doc.add_entry_alias("nodes", small_name, "nodes", "mcl_chests:"..basename.."_left") - doc.add_entry_alias("nodes", small_name, "nodes", "mcl_chests:"..basename.."_right") + doc.add_entry_alias("nodes", small_name, "nodes", "mcl_chests:" .. basename .. "_left") + doc.add_entry_alias("nodes", small_name, "nodes", "mcl_chests:" .. basename .. "_right") end -- END OF register_chest FUNCTION BODY @@ -875,12 +929,23 @@ local chestusage = S("To access its inventory, rightclick it. When broken, the i register_chest("chest", S("Chest"), - S("Chests are containers which provide 27 inventory slots. Chests can be turned into large chests with double the capacity by placing two chests next to each other."), + S( + "Chests are containers which provide 27 inventory slots. Chests can be turned into large chests with double the capacity by placing two chests next to each other.") + , chestusage, S("27 inventory slots") .. "\n" .. S("Can be combined to a large chest"), { small = tiles_chest_normal_small, double = tiles_chest_normal_double, + inv = { "default_chest_top.png", "mcl_chests_chest_bottom.png", + "mcl_chests_chest_right.png", "mcl_chests_chest_left.png", + "mcl_chests_chest_back.png", "default_chest_front.png" }, + --[[left = {"default_chest_top_big.png", "default_chest_top_big.png", + "mcl_chests_chest_right.png", "mcl_chests_chest_left.png", + "default_chest_side_big.png^[transformFX", "default_chest_front_big.png"}, + right = {"default_chest_top_big.png^[transformFX", "default_chest_top_big.png^[transformFX", + "mcl_chests_chest_right.png", "mcl_chests_chest_left.png", + "default_chest_side_big.png", "default_chest_front_big.png^[transformFX"},]] -- }, false ) @@ -892,9 +957,12 @@ local traptiles = { register_chest("trapped_chest", S("Trapped Chest"), - S("A trapped chest is a container which provides 27 inventory slots. When it is opened, it sends a redstone signal to its adjacent blocks as long it stays open. Trapped chests can be turned into large trapped chests with double the capacity by placing two trapped chests next to each other."), + S( + "A trapped chest is a container which provides 27 inventory slots. When it is opened, it sends a redstone signal to its adjacent blocks as long it stays open. Trapped chests can be turned into large trapped chests with double the capacity by placing two trapped chests next to each other.") + , chestusage, - S("27 inventory slots") .. "\n" .. S("Can be combined to a large chest") .. "\n" .. S("Emits a redstone signal when opened"), + S("27 inventory slots") .. + "\n" .. S("Can be combined to a large chest") .. "\n" .. S("Emits a redstone signal when opened"), traptiles, nil, { @@ -904,30 +972,34 @@ register_chest("trapped_chest", }, }, function(pos, node, clicker) - minetest.swap_node(pos, {name="mcl_chests:trapped_chest_on_small", param2 = node.param2}) - find_or_create_entity(pos, "mcl_chests:trapped_chest_on_small", {"mcl_chests_trapped.png"}, node.param2, false, "default_chest", "mcl_chests_chest", "chest"):reinitialize("mcl_chests:trapped_chest_on_small") + minetest.swap_node(pos, { name = "mcl_chests:trapped_chest_on_small", param2 = node.param2 }) + find_or_create_entity(pos, "mcl_chests:trapped_chest_on_small", { "mcl_chests_trapped.png" }, node.param2, false, + "default_chest", "mcl_chests_chest", "chest"):reinitialize("mcl_chests:trapped_chest_on_small") mesecon.receptor_on(pos, trapped_chest_mesecons_rules) end, function(pos, node, clicker) local meta = minetest.get_meta(pos) meta:set_int("players", 1) - minetest.swap_node(pos, {name="mcl_chests:trapped_chest_on_left", param2 = node.param2}) - find_or_create_entity(pos, "mcl_chests:trapped_chest_on_left", tiles_chest_trapped_double, node.param2, true, "default_chest", "mcl_chests_chest", "chest"):reinitialize("mcl_chests:trapped_chest_on_left") + minetest.swap_node(pos, { name = "mcl_chests:trapped_chest_on_left", param2 = node.param2 }) + find_or_create_entity(pos, "mcl_chests:trapped_chest_on_left", tiles_chest_trapped_double, node.param2, true, + "default_chest", "mcl_chests_chest", "chest"):reinitialize("mcl_chests:trapped_chest_on_left") mesecon.receptor_on(pos, trapped_chest_mesecons_rules) local pos_other = mcl_util.get_double_container_neighbor_pos(pos, node.param2, "left") - minetest.swap_node(pos_other, {name="mcl_chests:trapped_chest_on_right", param2 = node.param2}) + minetest.swap_node(pos_other, { name = "mcl_chests:trapped_chest_on_right", param2 = node.param2 }) mesecon.receptor_on(pos_other, trapped_chest_mesecons_rules) end, function(pos, node, clicker) local pos_other = mcl_util.get_double_container_neighbor_pos(pos, node.param2, "right") - minetest.swap_node(pos, {name="mcl_chests:trapped_chest_on_right", param2 = node.param2}) + minetest.swap_node(pos, { name = "mcl_chests:trapped_chest_on_right", param2 = node.param2 }) mesecon.receptor_on(pos, trapped_chest_mesecons_rules) - minetest.swap_node(pos_other, {name="mcl_chests:trapped_chest_on_left", param2 = node.param2}) - find_or_create_entity(pos_other, "mcl_chests:trapped_chest_on_left", tiles_chest_trapped_double, node.param2, true, "default_chest", "mcl_chests_chest", "chest"):reinitialize("mcl_chests:trapped_chest_on_left") + minetest.swap_node(pos_other, { name = "mcl_chests:trapped_chest_on_left", param2 = node.param2 }) + find_or_create_entity(pos_other, "mcl_chests:trapped_chest_on_left", tiles_chest_trapped_double, node.param2, + true, + "default_chest", "mcl_chests_chest", "chest"):reinitialize("mcl_chests:trapped_chest_on_left") mesecon.receptor_on(pos_other, trapped_chest_mesecons_rules) end ) @@ -993,9 +1065,9 @@ end) minetest.register_craft({ output = "mcl_chests:chest", recipe = { - {"group:wood", "group:wood", "group:wood"}, - {"group:wood", "", "group:wood"}, - {"group:wood", "group:wood", "group:wood"}, + { "group:wood", "group:wood", "group:wood" }, + { "group:wood", "", "group:wood" }, + { "group:wood", "group:wood", "group:wood" }, }, }) @@ -1013,8 +1085,10 @@ minetest.register_craft({ minetest.register_node("mcl_chests:ender_chest", { description = S("Ender Chest"), - _tt_help = S("27 interdimensional inventory slots") .. "\n" .. S("Put items inside, retrieve them from any ender chest"), - _doc_items_longdesc = S("Ender chests grant you access to a single personal interdimensional inventory with 27 slots. This inventory is the same no matter from which ender chest you access it from. If you put one item into one ender chest, you will find it in all other ender chests. Each player will only see their own items, but not the items of other players."), + _tt_help = S("27 interdimensional inventory slots") .. + "\n" .. S("Put items inside, retrieve them from any ender chest"), + _doc_items_longdesc = S( + "Ender chests grant you access to a single personal interdimensional inventory with 27 slots. This inventory is the same no matter from which ender chest you access it from. If you put one item into one ender chest, you will find it in all other ender chests. Each player will only see their own items, but not the items of other players."), _doc_items_usagehelp = S("Rightclick the ender chest to access your personal interdimensional inventory."), drawtype = "mesh", mesh = "mcl_chests_chest.b3d", @@ -1023,7 +1097,7 @@ minetest.register_node("mcl_chests:ender_chest", { paramtype = "light", paramtype2 = "facedir", stack_max = 64, - groups = {deco_block=1}, + groups = { deco_block = 1 }, sounds = mcl_sounds.node_sound_stone_defaults(), on_construct = function(pos, node) local node = minetest.get_node(pos) @@ -1035,15 +1109,11 @@ minetest.register_node("mcl_chests:ender_chest", { local formspec_ender_chest = table.concat({ "formspec_version[4]", "size[11.75,10.425]", - mcl_formspec.apply_label_size, - - "label[0.375,0.375;"..F(C(mcl_formspec.label_color, S("Ender Chest"))).."]", + "label[0.375,0.375;" .. F(C(mcl_formspec.label_color, S("Ender Chest"))) .. "]", mcl_formspec.get_itemslot_bg_v4(0.375, 0.75, 9, 3), "list[current_player;enderchest;0.375,0.75;9,3;]", - - "label[0.375,4.7;"..F(C(mcl_formspec.label_color, S("Inventory"))).."]", - + "label[0.375,4.7;" .. F(C(mcl_formspec.label_color, S("Inventory"))) .. "]", mcl_formspec.get_itemslot_bg_v4(0.375, 5.1, 9, 3), "list[current_player;main;0.375,5.1;9,3;9]", @@ -1057,23 +1127,25 @@ local formspec_ender_chest = table.concat({ minetest.register_node("mcl_chests:ender_chest_small", { description = S("Ender Chest"), - _tt_help = S("27 interdimensional inventory slots") .. "\n" .. S("Put items inside, retrieve them from any ender chest"), - _doc_items_longdesc = S("Ender chests grant you access to a single personal interdimensional inventory with 27 slots. This inventory is the same no matter from which ender chest you access it from. If you put one item into one ender chest, you will find it in all other ender chests. Each player will only see their own items, but not the items of other players."), + _tt_help = S("27 interdimensional inventory slots") .. + "\n" .. S("Put items inside, retrieve them from any ender chest"), + _doc_items_longdesc = S( + "Ender chests grant you access to a single personal interdimensional inventory with 27 slots. This inventory is the same no matter from which ender chest you access it from. If you put one item into one ender chest, you will find it in all other ender chests. Each player will only see their own items, but not the items of other players."), _doc_items_usagehelp = S("Rightclick the ender chest to access your personal interdimensional inventory."), drawtype = "nodebox", node_box = { type = "fixed", - fixed = {-0.4375, -0.5, -0.4375, 0.4375, 0.375, 0.4375}, + fixed = { -0.4375, -0.5, -0.4375, 0.4375, 0.375, 0.4375 }, }, _chest_entity_textures = ender_chest_texture, _chest_entity_sound = "mcl_chests_enderchest", _chest_entity_mesh = "mcl_chests_chest", _chest_entity_animation_type = "chest", - tiles = {"blank.png^[resize:16x16"}, + tiles = { "blank.png^[resize:16x16" }, use_texture_alpha = minetest.features.use_texture_alpha_string_modes and "clip" or true, -- Note: The “container” group is missing here because the ender chest does not -- have an inventory on its own - groups = {pickaxey=1, deco_block=1, material_stone=1, chest_entity=1, not_in_creative_inventory=1}, + groups = { pickaxey = 1, deco_block = 1, material_stone = 1, chest_entity = 1, not_in_creative_inventory = 1 }, is_ground_content = false, paramtype = "light", light_source = 7, @@ -1081,15 +1153,18 @@ minetest.register_node("mcl_chests:ender_chest_small", { sounds = mcl_sounds.node_sound_stone_defaults(), drop = "mcl_core:obsidian 8", on_construct = function(pos) - create_entity(pos, "mcl_chests:ender_chest_small", ender_chest_texture, minetest.get_node(pos).param2, false, "mcl_chests_enderchest", "mcl_chests_chest", "chest") + create_entity(pos, "mcl_chests:ender_chest_small", ender_chest_texture, minetest.get_node(pos).param2, false, + "mcl_chests_enderchest", "mcl_chests_chest", "chest") end, on_rightclick = function(pos, node, clicker) - if minetest.registered_nodes[minetest.get_node({x = pos.x, y = pos.y + 1, z = pos.z}).name].groups.opaque == 1 then - -- won't open if there is no space from the top - return false + if minetest.registered_nodes[minetest.get_node({ x = pos.x, y = pos.y + 1, z = pos.z }).name].groups.opaque == 1 then + -- won't open if there is no space from the top + return false end - minetest.show_formspec(clicker:get_player_name(), "mcl_chests:ender_chest_"..clicker:get_player_name(), formspec_ender_chest) - player_chest_open(clicker, pos, "mcl_chests:ender_chest_small", ender_chest_texture, node.param2, false, "mcl_chests_enderchest", "mcl_chests_chest") + minetest.show_formspec(clicker:get_player_name(), "mcl_chests:ender_chest_" .. clicker:get_player_name(), + formspec_ender_chest) + player_chest_open(clicker, pos, "mcl_chests:ender_chest_small", ender_chest_texture, node.param2, false, + "mcl_chests_enderchest", "mcl_chests_chest") end, on_receive_fields = function(pos, formname, fields, sender) if fields.quit then @@ -1098,21 +1173,21 @@ minetest.register_node("mcl_chests:ender_chest_small", { end, _mcl_blast_resistance = 3000, _mcl_hardness = 22.5, - _mcl_silk_touch_drop = {"mcl_chests:ender_chest"}, + _mcl_silk_touch_drop = { "mcl_chests:ender_chest" }, on_rotate = simple_rotate, }) minetest.register_on_joinplayer(function(player) local inv = player:get_inventory() - inv:set_size("enderchest", 9*3) + inv:set_size("enderchest", 9 * 3) end) minetest.register_allow_player_inventory_action(function(player, action, inv, info) if inv:get_location().type == "player" and ( - action == "move" and (info.from_list == "enderchest" or info.to_list == "enderchest") - or action == "put" and info.listname == "enderchest" - or action == "take" and info.listname == "enderchest" - ) then + action == "move" and (info.from_list == "enderchest" or info.to_list == "enderchest") + or action == "put" and info.listname == "enderchest" + or action == "take" and info.listname == "enderchest" + ) then local def = player:get_wielded_item():get_definition() local range = (def and def.range or player:get_inventory():get_stack("hand", 1):get_definition().range) + 1 if not minetest.find_node_near(player:get_pos(), range, "mcl_chests:ender_chest_small", true) then @@ -1124,9 +1199,9 @@ end) minetest.register_craft({ output = "mcl_chests:ender_chest", recipe = { - {"mcl_core:obsidian", "mcl_core:obsidian", "mcl_core:obsidian"}, - {"mcl_core:obsidian", "mcl_end:ender_eye", "mcl_core:obsidian"}, - {"mcl_core:obsidian", "mcl_core:obsidian", "mcl_core:obsidian"}, + { "mcl_core:obsidian", "mcl_core:obsidian", "mcl_core:obsidian" }, + { "mcl_core:obsidian", "mcl_end:ender_eye", "mcl_core:obsidian" }, + { "mcl_core:obsidian", "mcl_core:obsidian", "mcl_core:obsidian" }, }, }) @@ -1179,15 +1254,11 @@ local function formspec_shulker_box(name) return table.concat({ "formspec_version[4]", "size[11.75,10.425]", - mcl_formspec.apply_label_size, - - "label[0.375,0.375;"..F(C(mcl_formspec.label_color, name)).."]", + "label[0.375,0.375;" .. F(C(mcl_formspec.label_color, name)) .. "]", mcl_formspec.get_itemslot_bg_v4(0.375, 0.75, 9, 3), "list[context;main;0.375,0.75;9,3;]", - - "label[0.375,4.7;"..F(C(mcl_formspec.label_color, S("Inventory"))).."]", - + "label[0.375,4.7;" .. F(C(mcl_formspec.label_color, S("Inventory"))) .. "]", mcl_formspec.get_itemslot_bg_v4(0.375, 5.1, 9, 3), "list[current_player;main;0.375,5.1;9,3;9]", @@ -1212,28 +1283,38 @@ for color, desc in pairs(boxtypes) do local longdesc, usagehelp, create_entry, entry_name if mod_doc then if is_canonical then - longdesc = S("A shulker box is a portable container which provides 27 inventory slots for any item except shulker boxes. Shulker boxes keep their inventory when broken, so shulker boxes as well as their contents can be taken as a single item. Shulker boxes come in many different colors.") - usagehelp = S("To access the inventory of a shulker box, place and right-click it. To take a shulker box and its contents with you, just break and collect it, the items will not fall out. Place the shulker box again to be able to retrieve its contents.") + longdesc = S( + "A shulker box is a portable container which provides 27 inventory slots for any item except shulker boxes. Shulker boxes keep their inventory when broken, so shulker boxes as well as their contents can be taken as a single item. Shulker boxes come in many different colors.") + usagehelp = S( + "To access the inventory of a shulker box, place and right-click it. To take a shulker box and its contents with you, just break and collect it, the items will not fall out. Place the shulker box again to be able to retrieve its contents.") entry_name = S("Shulker Box") else create_entry = false end end - local small_name = "mcl_chests:"..color.."_shulker_box_small" + local small_name = "mcl_chests:" .. color .. "_shulker_box_small" - minetest.register_node("mcl_chests:"..color.."_shulker_box", { + minetest.register_node("mcl_chests:" .. color .. "_shulker_box", { description = desc, _tt_help = S("27 inventory slots") .. "\n" .. S("Can be carried around with its contents"), _doc_items_create_entry = create_entry, _doc_items_entry_name = entry_name, _doc_items_longdesc = longdesc, _doc_items_usagehelp = usagehelp, - tiles = {mob_texture}, + tiles = { mob_texture }, use_texture_alpha = minetest.features.use_texture_alpha_string_modes and "opaque" or false, drawtype = "mesh", mesh = "mcl_chests_shulker.b3d", - groups = {handy=1,pickaxey=1, container=3, deco_block=1, dig_by_piston=1, shulker_box=1, old_shulker_box_node=1}, + groups = { + handy = 1, + pickaxey = 1, + container = 3, + deco_block = 1, + dig_by_piston = 1, + shulker_box = 1, + old_shulker_box_node = 1 + }, is_ground_content = false, sounds = mcl_sounds.node_sound_stone_defaults(), stack_max = 1, @@ -1251,7 +1332,7 @@ for color, desc in pairs(boxtypes) do local iinv_main = minetest.deserialize(imetadata) local ninv = nmeta:get_inventory() ninv:set_list("main", iinv_main) - ninv:set_size("main", 9*3) + ninv:set_size("main", 9 * 3) set_shulkerbox_meta(nmeta, itemstack:get_meta()) if minetest.is_creative_enabled(placer:get_player_name()) then @@ -1267,12 +1348,12 @@ for color, desc in pairs(boxtypes) do _on_dispense = function(stack, pos, droppos, dropnode, dropdir) -- Place shulker box as node if minetest.registered_nodes[dropnode.name].buildable_to then - minetest.set_node(droppos, {name = small_name, param2 = minetest.dir_to_facedir(dropdir)}) - local ninv = minetest.get_inventory({type="node", pos=droppos}) + minetest.set_node(droppos, { name = small_name, param2 = minetest.dir_to_facedir(dropdir) }) + local ninv = minetest.get_inventory({ type = "node", pos = droppos }) local imetadata = stack:get_metadata() local iinv_main = minetest.deserialize(imetadata) ninv:set_list("main", iinv_main) - ninv:set_size("main", 9*3) + ninv:set_size("main", 9 * 3) set_shulkerbox_meta(minetest.get_meta(droppos), stack:get_meta()) stack:take_item() end @@ -1290,15 +1371,24 @@ for color, desc in pairs(boxtypes) do drawtype = "nodebox", node_box = { type = "fixed", - fixed = {-0.48, -0.5, -0.48, 0.48, 0.489, 0.48}, + fixed = { -0.48, -0.5, -0.48, 0.48, 0.489, 0.48 }, }, - tiles = {"blank.png^[resize:16x16"}, + tiles = { "blank.png^[resize:16x16" }, use_texture_alpha = minetest.features.use_texture_alpha_string_modes and "clip" or true, - _chest_entity_textures = {mob_texture}, + _chest_entity_textures = { mob_texture }, _chest_entity_sound = "mcl_chests_shulker", _chest_entity_mesh = "mcl_chests_shulker", _chest_entity_animation_type = "shulker", - groups = {handy=1,pickaxey=1, container=3, deco_block=1, dig_by_piston=1, shulker_box=1, chest_entity=1, not_in_creative_inventory=1}, + groups = { + handy = 1, + pickaxey = 1, + container = 3, + deco_block = 1, + dig_by_piston = 1, + shulker_box = 1, + chest_entity = 1, + not_in_creative_inventory = 1 + }, is_ground_content = false, sounds = mcl_sounds.node_sound_stone_defaults(), stack_max = 1, @@ -1312,8 +1402,9 @@ for color, desc in pairs(boxtypes) do local meta = minetest.get_meta(pos) meta:set_string("formspec", formspec_shulker_box(nil)) local inv = meta:get_inventory() - inv:set_size("main", 9*3) - create_entity(pos, small_name, {mob_texture}, minetest.get_node(pos).param2, false, "mcl_chests_shulker", "mcl_chests_shulker", "shulker") + inv:set_size("main", 9 * 3) + create_entity(pos, small_name, { mob_texture }, minetest.get_node(pos).param2, false, "mcl_chests_shulker", + "mcl_chests_shulker", "shulker") end, after_place_node = function(pos, placer, itemstack, pointed_thing) local nmeta = minetest.get_meta(pos) @@ -1321,7 +1412,7 @@ for color, desc in pairs(boxtypes) do local iinv_main = minetest.deserialize(imetadata) local ninv = nmeta:get_inventory() ninv:set_list("main", iinv_main) - ninv:set_size("main", 9*3) + ninv:set_size("main", 9 * 3) set_shulkerbox_meta(nmeta, itemstack:get_meta()) if minetest.is_creative_enabled(placer:get_player_name()) then @@ -1335,7 +1426,8 @@ for color, desc in pairs(boxtypes) do end end, on_rightclick = function(pos, node, clicker) - player_chest_open(clicker, pos, small_name, {mob_texture}, node.param2, false, "mcl_chests_shulker", "mcl_chests_shulker", true) + player_chest_open(clicker, pos, small_name, { mob_texture }, node.param2, false, "mcl_chests_shulker", + "mcl_chests_shulker", true) end, on_receive_fields = function(pos, formname, fields, sender) if fields.quit then @@ -1346,12 +1438,12 @@ for color, desc in pairs(boxtypes) do local meta = minetest.get_meta(pos) local inv = meta:get_inventory() local items = {} - for i=1, inv:get_size("main") do + for i = 1, inv:get_size("main") do local stack = inv:get_stack("main", i) items[i] = stack:to_string() end local data = minetest.serialize(items) - local boxitem = ItemStack("mcl_chests:"..color.."_shulker_box") + local boxitem = ItemStack("mcl_chests:" .. color .. "_shulker_box") local boxitem_meta = boxitem:get_meta() boxitem_meta:set_string("description", meta:get_string("description")) boxitem_meta:set_string("name", meta:get_string("name")) @@ -1386,23 +1478,25 @@ for color, desc in pairs(boxtypes) do }) if mod_doc and not is_canonical then - doc.add_entry_alias("nodes", "mcl_chests:"..canonical_shulker_color.."_shulker_box", "nodes", "mcl_chests:"..color.."_shulker_box") - doc.add_entry_alias("nodes", "mcl_chests:"..canonical_shulker_color.."_shulker_box_small", "nodes", "mcl_chests:"..color.."_shulker_box_small") + doc.add_entry_alias("nodes", "mcl_chests:" .. canonical_shulker_color .. "_shulker_box", "nodes", + "mcl_chests:" .. color .. "_shulker_box") + doc.add_entry_alias("nodes", "mcl_chests:" .. canonical_shulker_color .. "_shulker_box_small", "nodes", + "mcl_chests:" .. color .. "_shulker_box_small") end minetest.register_craft({ type = "shapeless", - output = "mcl_chests:"..color.."_shulker_box", - recipe = {"group:shulker_box", "mcl_dye:"..color}, + output = "mcl_chests:" .. color .. "_shulker_box", + recipe = { "group:shulker_box", "mcl_dye:" .. color }, }) end minetest.register_craft({ output = "mcl_chests:violet_shulker_box", recipe = { - {"mcl_mobitems:shulker_shell"}, - {"mcl_chests:chest"}, - {"mcl_mobitems:shulker_shell"}, + { "mcl_mobitems:shulker_shell" }, + { "mcl_chests:chest" }, + { "mcl_mobitems:shulker_shell" }, }, }) @@ -1431,13 +1525,14 @@ local function select_and_spawn_entity(pos, node) local node_name = node.name local node_def = minetest.registered_nodes[node_name] local double_chest = minetest.get_item_group(node_name, "double_chest") > 0 - find_or_create_entity(pos, node_name, node_def._chest_entity_textures, node.param2, double_chest, node_def._chest_entity_sound, node_def._chest_entity_mesh, node_def._chest_entity_animation_type) + find_or_create_entity(pos, node_name, node_def._chest_entity_textures, node.param2, double_chest, + node_def._chest_entity_sound, node_def._chest_entity_mesh, node_def._chest_entity_animation_type) end minetest.register_lbm({ label = "Spawn Chest entities", name = "mcl_chests:spawn_chest_entities", - nodenames = {"group:chest_entity"}, + nodenames = { "group:chest_entity" }, run_at_every_load = true, action = select_and_spawn_entity, }) @@ -1445,7 +1540,9 @@ minetest.register_lbm({ minetest.register_lbm({ label = "Replace old chest nodes", name = "mcl_chests:replace_old", - nodenames = {"mcl_chests:chest", "mcl_chests:trapped_chest", "mcl_chests:trapped_chest_on", "mcl_chests:ender_chest", "group:old_shulker_box_node"}, + nodenames = { "mcl_chests:chest", "mcl_chests:trapped_chest", "mcl_chests:trapped_chest_on", + "mcl_chests:ender_chest", + "group:old_shulker_box_node" }, run_at_every_load = true, action = function(pos, node) local node_name = node.name @@ -1453,7 +1550,7 @@ minetest.register_lbm({ minetest.swap_node(pos, node) select_and_spawn_entity(pos, node) if node_name == "mcl_chests:trapped_chest_on" then - minetest.log("action", "[mcl_chests] Disabled active trapped chest on load: " ..minetest.pos_to_string(pos)) + minetest.log("action", "[mcl_chests] Disabled active trapped chest on load: " .. minetest.pos_to_string(pos)) chest_update_after_close(pos) elseif node_name == "mcl_chests:ender_chest" then local meta = minetest.get_meta(pos) @@ -1468,10 +1565,11 @@ minetest.register_lbm({ -- Fixes redstone weirdness. label = "Disable active trapped chests", name = "mcl_chests:reset_trapped_chests", - nodenames = { "mcl_chests:trapped_chest_on_small", "mcl_chests:trapped_chest_on_left", "mcl_chests:trapped_chest_on_right" }, + nodenames = { "mcl_chests:trapped_chest_on_small", "mcl_chests:trapped_chest_on_left", + "mcl_chests:trapped_chest_on_right" }, run_at_every_load = true, action = function(pos, node) - minetest.log("action", "[mcl_chests] Disabled active trapped chest on load: " ..minetest.pos_to_string(pos)) + minetest.log("action", "[mcl_chests] Disabled active trapped chest on load: " .. minetest.pos_to_string(pos)) chest_update_after_close(pos) end, }) @@ -1490,7 +1588,7 @@ minetest.register_lbm({ minetest.register_lbm({ label = "Upgrade old ender chest formspec", name = "mcl_chests:replace_old_ender_form", - nodenames = {"mcl_chests:ender_chest_small"}, + nodenames = { "mcl_chests:ender_chest_small" }, run_at_every_load = false, action = function(pos, node) minetest.get_meta(pos):set_string("formspec", "") diff --git a/settingtypes.txt b/settingtypes.txt index 1f1e31dbb..c5d5d32c1 100644 --- a/settingtypes.txt +++ b/settingtypes.txt @@ -192,11 +192,6 @@ animated_chests (Animated chests) bool true # The maximum number of boss bars to simultaniously display on the screen max_bossbars (Maximum Boss bars) int 5 -# Define how wide font will be displayed in mineclone2 formspecs -# This allow MineClone2 to have a label size similar to minecraft, but allowing at least singleplayer to use his own font with custom size -# (some fonts may be bigger than the default one and break formspecs) -mcl_label_font_size (Label Font Size) int 24 - # Default intensity of shadows (default: 0.33) mcl_default_shadow_intensity (Default shadow intensity) float 0.33 0.0 1.0 From fb794650526c09f65a2a74bdf4123d31699a60ef Mon Sep 17 00:00:00 2001 From: AFCMS Date: Fri, 9 Sep 2022 20:46:04 +0200 Subject: [PATCH 087/982] Fixes --- mods/HUD/mcl_inventory/init.lua | 300 ++++++++++++++++++++++++++++++++ 1 file changed, 300 insertions(+) diff --git a/mods/HUD/mcl_inventory/init.lua b/mods/HUD/mcl_inventory/init.lua index a46f2669f..b9b952e97 100644 --- a/mods/HUD/mcl_inventory/init.lua +++ b/mods/HUD/mcl_inventory/init.lua @@ -292,3 +292,303 @@ minetest.register_chatcommand("gamemode", { return true, S("Gamemode for player ") .. n .. S(": " .. gm) end }) +local S = minetest.get_translator(minetest.get_current_modname()) +local F = minetest.formspec_escape + +---get_inventory can return nil if object isn't a player, but we are sure sometimes this is one :) +---@diagnostic disable need-check-nil + +mcl_inventory = {} + +--local mod_player = minetest.get_modpath("mcl_player") +--local mod_craftguide = minetest.get_modpath("mcl_craftguide") + +---Returns a single itemstack in the given inventory to the main inventory, or drop it when there's no space left. +---@param itemstack ItemStack +---@param dropper ObjectRef +---@param pos Vector +---@param inv InvRef +local function return_item(itemstack, dropper, pos, inv) + if dropper:is_player() then + -- Return to main inventory + if inv:room_for_item("main", itemstack) then + inv:add_item("main", itemstack) + else + -- Drop item on the ground + local v = dropper:get_look_dir() + local p = vector.offset(pos, 0, 1.2, 0) + p.x = p.x + (math.random(1, 3) * 0.2) + p.z = p.z + (math.random(1, 3) * 0.2) + local obj = minetest.add_item(p, itemstack) + if obj then + v.x = v.x * 4 + v.y = v.y * 4 + 2 + v.z = v.z * 4 + obj:set_velocity(v) + obj:get_luaentity()._insta_collect = false + end + end + else + -- Fallback for unexpected cases + minetest.add_item(pos, itemstack) + end + return itemstack +end + +---Return items in the given inventory list (name) to the main inventory, or drop them if there is no space left. +---@param player ObjectRef +---@param name string +local function return_fields(player, name) + local inv = player:get_inventory() + + local list = inv:get_list(name) + if not list then return end + for i, stack in ipairs(list) do + return_item(stack, player, player:get_pos(), inv) + stack:clear() + inv:set_stack(name, i, stack) + end +end + +---@param player ObjectRef +---@param armor_change_only? boolean +local function set_inventory(player, armor_change_only) + if minetest.is_creative_enabled(player:get_player_name()) then + if armor_change_only then + -- Stay on survival inventory plage if only the armor has been changed + mcl_inventory.set_creative_formspec(player, 0, 0, nil, nil, "inv") + else + mcl_inventory.set_creative_formspec(player, 0, 1) + end + return + end + + local inv = player:get_inventory() + + inv:set_width("craft", 2) + inv:set_size("craft", 4) + + local armor_slots = { "helmet", "chestplate", "leggings", "boots" } + local armor_slot_imgs = "" + + for a = 1, 4 do + if inv:get_stack("armor", a + 1):is_empty() then + armor_slot_imgs = armor_slot_imgs .. + "image[0.375," .. (0.375 + (a - 1) * 1.25) .. ";1,1;mcl_inventory_empty_armor_slot_" .. armor_slots[a] .. ".png]" + end + end + + if inv:get_stack("offhand", 1):is_empty() then + armor_slot_imgs = armor_slot_imgs .. "image[5.375,4.125;1,1;mcl_inventory_empty_armor_slot_shield.png]" + end + + local form = table.concat({ + "formspec_version[6]", + "size[11.75,10.9]", + + --Armor slots + mcl_formspec.get_itemslot_bg_v4(0.375, 0.375, 1, 4), + "list[current_player;armor;0.375,0.375;1,1;1]", + "list[current_player;armor;0.375,1.625;1,1;2]", + "list[current_player;armor;0.375,2.875;1,1;3]", + "list[current_player;armor;0.375,4.125;1,1;4]", + + --Main inventory + mcl_formspec.get_itemslot_bg_v4(0.375, 5.575, 9, 3), + "list[current_player;main;0.375,5.575;9,3;9]", + + --Hotbar + mcl_formspec.get_itemslot_bg_v4(0.375, 9.525, 9, 1), + "list[current_player;main;0.375,9.525;9,1;]", + + --Player model + "image[1.57,0.343;3.62,4.85;mcl_inventory_background9.png;2]", + mcl_player.get_player_formspec_model(player, 1.57, 0.4, 3.62, 4.85, ""), + + --Offhand + mcl_formspec.get_itemslot_bg_v4(5.375, 4.125, 1, 1), + "list[current_player;offhand;5.375,4.125;1,1]", + + armor_slot_imgs, + + --Craft grid + "label[6.61,0.5;" .. F(minetest.colorize(mcl_formspec.label_color, S("Crafting"))) .. "]", + + mcl_formspec.get_itemslot_bg_v4(6.625, 0.875, 2, 2), + "list[current_player;craft;6.625,0.875;2,2]", + + "image[9.125,1.5;1,1;crafting_formspec_arrow.png]", + + mcl_formspec.get_itemslot_bg_v4(10.375, 1.5, 1, 1), + "list[current_player;craftpreview;10.375,1.5;1,1;]", + + --Crafting guide button + "image_button[6.575,4.075;1.1,1.1;craftguide_book.png;__mcl_craftguide;]", + "tooltip[__mcl_craftguide;" .. F(S("Recipe book")) .. "]", + + --Help button + "image_button[7.825,4.075;1.1,1.1;doc_button_icon_lores.png;__mcl_doc;]", + "tooltip[__mcl_doc;" .. F(S("Help")) .. "]", + + --Skins button + "image_button[9.075,4.075;1.1,1.1;mcl_skins_button.png;__mcl_skins;]", + "tooltip[__mcl_skins;" .. F(S("Select player skin")) .. "]", + + --Achievements button + "image_button[10.325,4.075;1.1,1.1;mcl_achievements_button.png;__mcl_achievements;]", + "tooltip[__mcl_achievements;" .. F(S("Achievements")) .. "]", + + --Listring + "listring[current_player;main]", + "listring[current_player;armor]", + "listring[current_player;main]", + "listring[current_player;craft]", + "listring[current_player;main]", + }) + + player:set_inventory_formspec(form) +end + +-- Drop items in craft grid and reset inventory on closing +minetest.register_on_player_receive_fields(function(player, formname, fields) + if fields.quit then + return_fields(player, "craft") + return_fields(player, "enchanting_lapis") + return_fields(player, "enchanting_item") + if not minetest.is_creative_enabled(player:get_player_name()) and (formname == "" or formname == "main") then + set_inventory(player) + end + end +end) + +if not minetest.is_creative_enabled("") then + function mcl_inventory.update_inventory_formspec(player) + set_inventory(player) + end +end + +-- Drop crafting grid items on leaving +minetest.register_on_leaveplayer(function(player) + return_fields(player, "craft") + return_fields(player, "enchanting_lapis") + return_fields(player, "enchanting_item") +end) + +minetest.register_on_joinplayer(function(player) + --init inventory + local inv = player:get_inventory() + + inv:set_width("main", 9) + inv:set_size("main", 36) + inv:set_size("offhand", 1) + + --set hotbar size + player:hud_set_hotbar_itemcount(9) + --add hotbar images + player:hud_set_hotbar_image("mcl_inventory_hotbar.png") + player:hud_set_hotbar_selected_image("mcl_inventory_hotbar_selected.png") + + local old_update_player = mcl_armor.update_player + function mcl_armor.update_player(player, info) + old_update_player(player, info) + set_inventory(player, true) + end + + -- In Creative Mode, the initial inventory setup is handled in creative.lua + if not minetest.is_creative_enabled(player:get_player_name()) then + set_inventory(player) + end + + --[[ Make sure the crafting grid is empty. Why? Because the player might have + items remaining in the crafting grid from the previous join; this is likely + when the server has been shutdown and the server didn't clean up the player + inventories. ]] + return_fields(player, "craft") + return_fields(player, "enchanting_item") + return_fields(player, "enchanting_lapis") +end) + + +dofile(minetest.get_modpath(minetest.get_current_modname()) .. "/creative.lua") + +local mt_is_creative_enabled = minetest.is_creative_enabled + +function minetest.is_creative_enabled(name) + if mt_is_creative_enabled(name) then return true end + if not name then return false end + local p = minetest.get_player_by_name(name) + if p then + return p:get_meta():get_string("gamemode") == "creative" + end + return false +end + +--Insta "digging" nodes in gamemode-creative +minetest.register_on_punchnode(function(pos, node, puncher, pointed_thing) + if not puncher or not puncher:is_player() then return end + if minetest.is_creative_enabled() then return end + local name = puncher:get_player_name() + if not minetest.is_creative_enabled(name) then return end + if pointed_thing.type ~= "node" then return end + local def = minetest.registered_nodes[node.name] + if def then + if def.on_destruct then def.on_destruct(pos) end + minetest.remove_node(pos) + return true + end +end) + +--Don't subtract from inv when placing in gamemode-creative +minetest.register_on_placenode(function(pos, newnode, placer, oldnode, itemstack, pointed_thing) + if placer and placer:is_player() and minetest.is_creative_enabled(placer:get_player_name()) then return true end +end) + +local function in_table(n, h) + for k, v in pairs(h) do + if v == n then return true end + end + return false +end + +local gamemodes = { + "survival", + "creative" +} + +function mcl_inventory.player_set_gamemode(p, g) + local m = p:get_meta() + m:set_string("gamemode", g) + if g == "survival" then + mcl_experience.setup_hud(p) + mcl_experience.update(p) + elseif g == "creative" then + mcl_experience.remove_hud(p) + end + set_inventory(p) +end + +minetest.register_chatcommand("gamemode", { + params = S("[] []"), + description = S("Change gamemode (survival/creative) for yourself or player"), + privs = { server = true }, + func = function(n, param) + -- Full input validation ( just for @erlehmann <3 ) + local p = minetest.get_player_by_name(n) + local args = param:split(" ") + if args[2] ~= nil then + p = minetest.get_player_by_name(args[2]) + end + if not p then + return false, S("Player not online") + end + if args[1] ~= nil and not in_table(args[1], gamemodes) then + return false, S("Gamemode " .. args[1] .. " does not exist.") + elseif args[1] ~= nil then + mcl_inventory.player_set_gamemode(p, args[1]) + end + --Result message - show effective game mode + local gm = p:get_meta():get_string("gamemode") + if gm == "" then gm = gamemodes[1] end + return true, S("Gamemode for player ") .. n .. S(": " .. gm) + end +}) From fbb51835b382d8869b8e77c4be6844f46e51bfaa Mon Sep 17 00:00:00 2001 From: AFCMS Date: Sat, 10 Sep 2022 01:06:10 +0200 Subject: [PATCH 088/982] survival inventory tabs API + mcl_gamemode --- mods/HUD/mcl_experience/init.lua | 33 ++-- mods/HUD/mcl_experience/mod.conf | 1 + mods/HUD/mcl_inventory/API.md | 0 mods/HUD/mcl_inventory/creative.lua | 259 ++++++++++++++++++---------- mods/HUD/mcl_inventory/init.lua | 180 ++----------------- mods/HUD/mcl_inventory/mod.conf | 5 + mods/HUD/mcl_inventory/survival.lua | 219 +++++++++++++++++++++++ mods/PLAYER/mcl_gamemode/init.lua | 106 ++++++++++++ mods/PLAYER/mcl_gamemode/mod.conf | 1 + 9 files changed, 539 insertions(+), 265 deletions(-) create mode 100644 mods/HUD/mcl_inventory/API.md create mode 100644 mods/HUD/mcl_inventory/survival.lua create mode 100644 mods/PLAYER/mcl_gamemode/init.lua create mode 100644 mods/PLAYER/mcl_gamemode/mod.conf diff --git a/mods/HUD/mcl_experience/init.lua b/mods/HUD/mcl_experience/init.lua index 359e68918..47e48d36c 100644 --- a/mods/HUD/mcl_experience/init.lua +++ b/mods/HUD/mcl_experience/init.lua @@ -147,13 +147,13 @@ function mcl_experience.throw_xp(pos, total_xp) obj:set_velocity(vector.new( math.random(-2, 2) * math.random(), - math.random( 2, 5), + math.random(2, 5), math.random(-2, 2) * math.random() )) i = i + xp j = j + 1 - table.insert(obs,obj) + table.insert(obs, obj) end return obs end @@ -179,18 +179,18 @@ function mcl_experience.setup_hud(player) if not minetest.is_creative_enabled(player:get_player_name()) then hud_bars[player] = player:hud_add({ hud_elem_type = "image", - position = {x = 0.5, y = 1}, - offset = {x = (-9 * 28) - 3, y = -(48 + 24 + 16 - 5)}, - scale = {x = 0.35, y = 0.375}, - alignment = {x = 1, y = 1}, + position = { x = 0.5, y = 1 }, + offset = { x = (-9 * 28) - 3, y = -(48 + 24 + 16 - 5) }, + scale = { x = 0.35, y = 0.375 }, + alignment = { x = 1, y = 1 }, z_index = 11, }) hud_levels[player] = player:hud_add({ hud_elem_type = "text", - position = {x = 0.5, y = 1}, + position = { x = 0.5, y = 1 }, number = 0x80FF20, - offset = {x = 0, y = -(48 + 24 + 24)}, + offset = { x = 0, y = -(48 + 24 + 24) }, z_index = 12, }) end @@ -221,7 +221,7 @@ function mcl_experience.update(player) end function mcl_experience.register_on_add_xp(func, priority) - table.insert(mcl_experience.on_add_xp, {func = func, priority = priority or 0}) + table.insert(mcl_experience.on_add_xp, { func = func, priority = priority or 0 }) end -- callbacks @@ -232,9 +232,9 @@ minetest.register_on_joinplayer(function(player) end) minetest.register_on_leaveplayer(function(player) - hud_bars[player] = nil - hud_levels[player] = nil - caches[player] = nil + hud_bars[player] = nil + hud_levels[player] = nil + caches[player] = nil end) minetest.register_on_dieplayer(function(player) @@ -247,3 +247,12 @@ end) minetest.register_on_mods_loaded(function() table.sort(mcl_experience.on_add_xp, function(a, b) return a.priority < b.priority end) end) + +mcl_gamemode.register_on_gamemode_change(function(player, old_gamemode, new_gamemode) + if new_gamemode == "survival" then + mcl_experience.setup_hud(player) + mcl_experience.update(player) + elseif new_gamemode == "creative" then + mcl_experience.remove_hud(player) + end +end) diff --git a/mods/HUD/mcl_experience/mod.conf b/mods/HUD/mcl_experience/mod.conf index 211249b30..a8e992c06 100644 --- a/mods/HUD/mcl_experience/mod.conf +++ b/mods/HUD/mcl_experience/mod.conf @@ -1,3 +1,4 @@ name = mcl_experience author = oilboi description = eXPerience mod +depends = mcl_gamemode diff --git a/mods/HUD/mcl_inventory/API.md b/mods/HUD/mcl_inventory/API.md new file mode 100644 index 000000000..e69de29bb diff --git a/mods/HUD/mcl_inventory/creative.lua b/mods/HUD/mcl_inventory/creative.lua index 32bb226f0..c18b559b1 100644 --- a/mods/HUD/mcl_inventory/creative.lua +++ b/mods/HUD/mcl_inventory/creative.lua @@ -11,7 +11,8 @@ local inventory_lists = {} --local mod_player = minetest.get_modpath("mcl_player") -- Create tables -local builtin_filter_ids = {"blocks","deco","redstone","rail","food","tools","combat","mobs","brew","matr","misc","all"} +local builtin_filter_ids = { "blocks", "deco", "redstone", "rail", "food", "tools", "combat", "mobs", "brew", "matr", + "misc", "all" } for _, f in pairs(builtin_filter_ids) do inventory_lists[f] = {} end @@ -31,17 +32,26 @@ end --[[ Populate all the item tables. We only do this once. Note this code must be executed after loading all the other mods in order to work. ]] minetest.register_on_mods_loaded(function() - for name,def in pairs(minetest.registered_items) do - if (not def.groups.not_in_creative_inventory or def.groups.not_in_creative_inventory == 0) and def.description and def.description ~= "" then + for name, def in pairs(minetest.registered_items) do + if (not def.groups.not_in_creative_inventory or def.groups.not_in_creative_inventory == 0) and def.description and + def.description ~= "" then local function is_redstone(def) - return def.mesecons or def.groups.mesecon or def.groups.mesecon_conductor_craftable or def.groups.mesecon_effecor_off + return def.mesecons or def.groups.mesecon or def.groups.mesecon_conductor_craftable or + def.groups.mesecon_effecor_off end + local function is_tool(def) return def.groups.tool or (def.tool_capabilities and def.tool_capabilities.damage_groups == nil) end + local function is_weapon_or_armor(def) - return def.groups.weapon or def.groups.weapon_ranged or def.groups.ammo or def.groups.combat_item or ((def.groups.armor_head or def.groups.armor_torso or def.groups.armor_legs or def.groups.armor_feet or def.groups.horse_armor) and def.groups.non_combat_armor ~= 1) + return def.groups.weapon or def.groups.weapon_ranged or def.groups.ammo or def.groups.combat_item or + ( + ( + def.groups.armor_head or def.groups.armor_torso or def.groups.armor_legs or def.groups.armor_feet or + def.groups.horse_armor) and def.groups.non_combat_armor ~= 1) end + -- Is set to true if it was added in any category besides misc local nonmisc = false if def.groups.building_block then @@ -122,11 +132,12 @@ end local function set_inv_search(filter, player) local playername = player:get_player_name() - local inv = minetest.get_inventory({type="detached", name="creative_"..playername}) + local inv = minetest.get_inventory({ type = "detached", name = "creative_" .. playername }) local creative_list = {} local lang = minetest.get_player_information(playername).lang_code - for name,def in pairs(minetest.registered_items) do - if (not def.groups.not_in_creative_inventory or def.groups.not_in_creative_inventory == 0) and def.description and def.description ~= "" then + for name, def in pairs(minetest.registered_items) do + if (not def.groups.not_in_creative_inventory or def.groups.not_in_creative_inventory == 0) and def.description and + def.description ~= "" then if filter_item(string.lower(def.name), def.description, lang, filter) then table.insert(creative_list, name) end @@ -149,7 +160,7 @@ end local function set_inv_page(page, player) local playername = player:get_player_name() - local inv = minetest.get_inventory({type="detached", name="creative_"..playername}) + local inv = minetest.get_inventory({ type = "detached", name = "creative_" .. playername }) inv:set_size("main", 0) local creative_list = {} if inventory_lists[page] then -- Standard filter @@ -162,7 +173,7 @@ end local function init(player) local playername = player:get_player_name() - minetest.create_detached_inventory("creative_"..playername, { + minetest.create_detached_inventory("creative_" .. playername, { allow_move = function(inv, from_list, from_index, to_list, to_index, count, player) if minetest.is_creative_enabled(playername) then return count @@ -200,7 +211,7 @@ local trash = minetest.create_detached_inventory("trash", { trash:set_size("main", 1) local noffset = {} -- numeric tab offset -local offset = {} -- string offset: +local offset = {} -- string offset: local boffset = {} -- local hoch = {} local filtername = {} @@ -238,9 +249,9 @@ next_noffset("mobs") next_noffset("matr") next_noffset("inv", true) -for k,v in pairs(noffset) do +for k, v in pairs(noffset) do offset[k] = tostring(v[1]) .. "," .. tostring(v[2]) - boffset[k] = tostring(v[1]+0.19) .. "," .. tostring(v[2]+0.25) + boffset[k] = tostring(v[1] + 0.19) .. "," .. tostring(v[2] + 0.25) end hoch["blocks"] = "" @@ -299,7 +310,7 @@ local function set_stack_size(player, n) player:get_meta():set_int("mcl_inventory:switch_stack", n) end -minetest.register_on_joinplayer(function (player) +minetest.register_on_joinplayer(function(player) if get_stack_size(player) == 0 then set_stack_size(player, 64) end @@ -310,14 +321,26 @@ function mcl_inventory.set_creative_formspec(player) if not players[playername] then return end local start_i = players[playername].start_i - local pagenum = start_i / (9*5) + 1 + local pagenum = start_i / (9 * 5) + 1 local name = players[playername].page local inv_size = players[playername].inv_size local filter = players[playername].filter - local pagemax = math.max(1, math.floor((inv_size-1) / (9*5) + 1)) + + if not inv_size then + if page == "nix" then + local inv = minetest.get_inventory({ type = "detached", name = "creative_" .. playername }) + inv_size = inv:get_size("main") + elseif page and page ~= "inv" then + inv_size = #(inventory_lists[page]) + else + inv_size = 0 + end + end + local pagemax = math.max(1, math.floor((inv_size - 1) / (9 * 5) + 1)) + local name = "nix" local main_list - local listrings = "listring[detached:creative_"..playername..";main]".. - "listring[current_player;main]".. + local listrings = "listring[detached:creative_" .. playername .. ";main]" .. + "listring[current_player;main]" .. "listring[detached:trash;main]" local inv_bg = "crafting_inventory_creative.png" @@ -349,7 +372,7 @@ function mcl_inventory.set_creative_formspec(player) -- Survival inventory slots main_list = "list[current_player;main;0,3.75;9,3;9]" .. mcl_formspec.get_itemslot_bg(0, 3.75, 9, 3) .. - + -- Armor "list[current_player;armor;2.5,1.3;1,1;1]" .. "list[current_player;armor;2.5,2.75;1,1;2]" .. @@ -362,46 +385,46 @@ function mcl_inventory.set_creative_formspec(player) "list[current_player;offhand;1.5,2.025;1,1]" .. mcl_formspec.get_itemslot_bg(1.5, 2.025, 1, 1) .. armor_slot_imgs .. - + -- Player preview mcl_player.get_player_formspec_model(player, 3.9, 1.4, 1.2333, 2.4666, "") .. - + -- Crafting guide button "image_button[9,1;1,1;craftguide_book.png;__mcl_craftguide;]" .. - "tooltip[__mcl_craftguide;"..F(S("Recipe book")) .. "]" .. - + "tooltip[__mcl_craftguide;" .. F(S("Recipe book")) .. "]" .. + -- Help button "image_button[9,2;1,1;doc_button_icon_lores.png;__mcl_doc;]" .. "tooltip[__mcl_doc;" .. F(S("Help")) .. "]" .. - - -- Achievements button + + -- Advancements button "image_button[9,3;1,1;mcl_achievements_button.png;__mcl_achievements;]" .. --"style_type[image_button;border=;bgimg=;bgimg_pressed=]" .. - "tooltip[__mcl_achievements;"..F(S("Advancements")) .. "]" .. - + "tooltip[__mcl_achievements;" .. F(S("Advancements")) .. "]" .. + -- Switch stack size button "image_button[9,4;1,1;default_apple.png;__switch_stack;]" .. "label[9.4,4.4;" .. F(C("#FFFFFF", stack_size ~= 1 and stack_size or "")) .. "]" .. "tooltip[__switch_stack;" .. F(S("Switch stack size")) .. "]" - + -- Skins button if minetest.global_exists("mcl_skins") then main_list = main_list .. "image_button[9,5;1,1;mcl_skins_button.png;__mcl_skins;]" .. - "tooltip[__mcl_skins;"..F(S("Select player skin")) .. "]" + "tooltip[__mcl_skins;" .. F(S("Select player skin")) .. "]" end -- For shortcuts listrings = listrings .. - "listring[detached:"..playername.."_armor;armor]".. + "listring[detached:" .. playername .. "_armor;armor]" .. "listring[current_player;main]" else -- Creative inventory slots - main_list = "list[detached:creative_"..playername..";main;0,1.75;9,5;"..tostring(start_i).."]".. - mcl_formspec.get_itemslot_bg(0,1.75,9,5).. - -- Page buttons - "label[9.0,5.5;"..F(S("@1/@2", pagenum, pagemax)).."]".. - "image_button[9.0,6.0;0.7,0.7;crafting_creative_prev.png;creative_prev;]".. + main_list = "list[detached:creative_" .. playername .. ";main;0,1.75;9,5;" .. tostring(start_i) .. "]" .. + mcl_formspec.get_itemslot_bg(0, 1.75, 9, 5) .. + -- Page buttons + "label[9.0,5.5;" .. F(S("@1/@2", pagenum, pagemax)) .. "]" .. + "image_button[9.0,6.0;0.7,0.7;crafting_creative_prev.png;creative_prev;]" .. "image_button[9.5,6.0;0.7,0.7;crafting_creative_next.png;creative_next;]" end @@ -423,65 +446,65 @@ function mcl_inventory.set_creative_formspec(player) local function tab(current_tab, this_tab) local bg_img if current_tab == this_tab then - bg_img = "crafting_creative_active"..hoch[this_tab]..".png" + bg_img = "crafting_creative_active" .. hoch[this_tab] .. ".png" else - bg_img = "crafting_creative_inactive"..hoch[this_tab]..".png" + bg_img = "crafting_creative_inactive" .. hoch[this_tab] .. ".png" end - return - "style["..this_tab..";border=false;bgimg=;bgimg_pressed=]".. - "item_image_button[" .. boffset[this_tab] ..";1,1;"..tab_icon[this_tab]..";"..this_tab..";]".. + return "style[" .. this_tab .. ";border=false;bgimg=;bgimg_pressed=]" .. + "item_image_button[" .. boffset[this_tab] .. ";1,1;" .. tab_icon[this_tab] .. ";" .. this_tab .. ";]" .. "image[" .. offset[this_tab] .. ";1.5,1.44;" .. bg_img .. "]" end + local caption = "" if name ~= "inv" and filtername[name] then - caption = "label[0,1.2;"..F(minetest.colorize("#313131", filtername[name])).."]" + caption = "label[0,1.2;" .. F(minetest.colorize("#313131", filtername[name])) .. "]" end - local formspec = "size[10,9.3]".. - "no_prepend[]".. - mcl_vars.gui_nonbg..mcl_vars.gui_bg_color.. - "background[-0.19,-0.25;10.5,9.87;"..inv_bg.."]".. - "label[-5,-5;"..name.."]".. + local formspec = "size[10,9.3]" .. + "no_prepend[]" .. + mcl_vars.gui_nonbg .. mcl_vars.gui_bg_color .. + "background[-0.19,-0.25;10.5,9.87;" .. inv_bg .. "]" .. + "label[-5,-5;" .. name .. "]" .. tab(name, "blocks") .. - "tooltip[blocks;"..F(filtername["blocks"]).."]".. + "tooltip[blocks;" .. F(filtername["blocks"]) .. "]" .. tab(name, "deco") .. - "tooltip[deco;"..F(filtername["deco"]).."]".. + "tooltip[deco;" .. F(filtername["deco"]) .. "]" .. tab(name, "redstone") .. - "tooltip[redstone;"..F(filtername["redstone"]).."]".. + "tooltip[redstone;" .. F(filtername["redstone"]) .. "]" .. tab(name, "rail") .. - "tooltip[rail;"..F(filtername["rail"]).."]".. + "tooltip[rail;" .. F(filtername["rail"]) .. "]" .. tab(name, "misc") .. - "tooltip[misc;"..F(filtername["misc"]).."]".. + "tooltip[misc;" .. F(filtername["misc"]) .. "]" .. tab(name, "nix") .. - "tooltip[nix;"..F(filtername["nix"]).."]".. - caption.. - "list[current_player;main;0,7;9,1;]".. - mcl_formspec.get_itemslot_bg(0,7,9,1).. - main_list.. + "tooltip[nix;" .. F(filtername["nix"]) .. "]" .. + caption .. + "list[current_player;main;0,7;9,1;]" .. + mcl_formspec.get_itemslot_bg(0, 7, 9, 1) .. + main_list .. tab(name, "food") .. - "tooltip[food;"..F(filtername["food"]).."]".. + "tooltip[food;" .. F(filtername["food"]) .. "]" .. tab(name, "tools") .. - "tooltip[tools;"..F(filtername["tools"]).."]".. + "tooltip[tools;" .. F(filtername["tools"]) .. "]" .. tab(name, "combat") .. - "tooltip[combat;"..F(filtername["combat"]).."]".. + "tooltip[combat;" .. F(filtername["combat"]) .. "]" .. tab(name, "mobs") .. - "tooltip[mobs;"..F(filtername["mobs"]).."]".. + "tooltip[mobs;" .. F(filtername["mobs"]) .. "]" .. tab(name, "brew") .. - "tooltip[brew;"..F(filtername["brew"]).."]".. + "tooltip[brew;" .. F(filtername["brew"]) .. "]" .. tab(name, "matr") .. - "tooltip[matr;"..F(filtername["matr"]).."]".. + "tooltip[matr;" .. F(filtername["matr"]) .. "]" .. tab(name, "inv") .. - "tooltip[inv;"..F(filtername["inv"]).."]".. - "list[detached:trash;main;9,7;1,1;]".. - mcl_formspec.get_itemslot_bg(9,7,1,1).. - "image[9,7;1,1;crafting_creative_trash.png]".. + "tooltip[inv;" .. F(filtername["inv"]) .. "]" .. + "list[detached:trash;main;9,7;1,1;]" .. + mcl_formspec.get_itemslot_bg(9, 7, 1, 1) .. + "image[9,7;1,1;crafting_creative_trash.png]" .. listrings if name == "nix" then - formspec = formspec .. "field[5.3,1.34;4,0.75;search;;"..minetest.formspec_escape(filter).."]" + formspec = formspec .. "field[5.3,1.34;4,0.75;search;;" .. minetest.formspec_escape(filter) .. "]" formspec = formspec .. "field_close_on_enter[search;false]" end - if pagenum then formspec = formspec .. "p"..tostring(pagenum) end + if pagenum then formspec = formspec .. "p" .. tostring(pagenum) end player:set_inventory_formspec(formspec) end @@ -500,50 +523,50 @@ minetest.register_on_player_receive_fields(function(player, formname, fields) if fields.blocks then if players[name].page == "blocks" then return end - set_inv_page("blocks",player) + set_inv_page("blocks", player) page = "blocks" elseif fields.deco then if players[name].page == "deco" then return end - set_inv_page("deco",player) + set_inv_page("deco", player) page = "deco" elseif fields.redstone then if players[name].page == "redstone" then return end - set_inv_page("redstone",player) + set_inv_page("redstone", player) page = "redstone" elseif fields.rail then if players[name].page == "rail" then return end - set_inv_page("rail",player) + set_inv_page("rail", player) page = "rail" elseif fields.misc then if players[name].page == "misc" then return end - set_inv_page("misc",player) + set_inv_page("misc", player) page = "misc" elseif fields.nix then - set_inv_page("all",player) + set_inv_page("all", player) page = "nix" elseif fields.food then if players[name].page == "food" then return end - set_inv_page("food",player) + set_inv_page("food", player) page = "food" elseif fields.tools then if players[name].page == "tools" then return end - set_inv_page("tools",player) + set_inv_page("tools", player) page = "tools" elseif fields.combat then if players[name].page == "combat" then return end - set_inv_page("combat",player) + set_inv_page("combat", player) page = "combat" elseif fields.mobs then if players[name].page == "mobs" then return end - set_inv_page("mobs",player) + set_inv_page("mobs", player) page = "mobs" elseif fields.brew then if players[name].page == "brew" then return end - set_inv_page("brew",player) + set_inv_page("brew", player) page = "brew" elseif fields.matr then if players[name].page == "matr" then return end - set_inv_page("matr",player) + set_inv_page("matr", player) page = "matr" elseif fields.inv then if players[name].page == "inv" then return end @@ -552,7 +575,7 @@ minetest.register_on_player_receive_fields(function(player, formname, fields) set_inv_page("all", player) page = "nix" elseif fields.search and not fields.creative_next and not fields.creative_prev then - set_inv_search(string.lower(fields.search),player) + set_inv_search(string.lower(fields.search), player) page = "nix" elseif fields.__switch_stack then local switch = 1 @@ -570,20 +593,20 @@ minetest.register_on_player_receive_fields(function(player, formname, fields) local start_i = players[name].start_i if fields.creative_prev then - start_i = start_i - 9*5 + start_i = start_i - 9 * 5 elseif fields.creative_next then - start_i = start_i + 9*5 + start_i = start_i + 9 * 5 else -- Reset scroll bar if not scrolled start_i = 0 end if start_i < 0 then - start_i = start_i + 9*5 + start_i = start_i + 9 * 5 end local inv_size if page == "nix" then - local inv = minetest.get_inventory({type="detached", name="creative_"..name}) + local inv = minetest.get_inventory({ type = "detached", name = "creative_" .. name }) inv_size = inv:get_size("main") elseif page and page ~= "inv" then inv_size = #(inventory_lists[page]) @@ -593,7 +616,7 @@ minetest.register_on_player_receive_fields(function(player, formname, fields) players[name].inv_size = inv_size if start_i >= inv_size then - start_i = start_i - 9*5 + start_i = start_i - 9 * 5 end if start_i < 0 or start_i >= inv_size then start_i = 0 @@ -606,13 +629,66 @@ minetest.register_on_player_receive_fields(function(player, formname, fields) players[name].filter = "" end - mcl_inventory.set_creative_formspec(player) + mcl_inventory.set_creative_formspec(player, start_i, start_i / (9 * 5) + 1, inv_size, false, page, filter) end) -minetest.register_on_placenode(function(pos, newnode, placer, oldnode, itemstack) - return placer and placer:is_player() and minetest.is_creative_enabled(placer:get_player_name()) -end) +if minetest.is_creative_enabled("") then + minetest.register_on_placenode(function(pos, newnode, placer, oldnode, itemstack) + -- Place infinite nodes, except for shulker boxes + local group = minetest.get_item_group(itemstack:get_name(), "shulker_box") + return group == 0 or group == nil + end) + + function minetest.handle_node_drops(pos, drops, digger) + if not digger or not digger:is_player() then + for _, item in ipairs(drops) do + minetest.add_item(pos, item) + end + end + local inv = digger:get_inventory() + if inv then + for _, item in ipairs(drops) do + if not inv:contains_item("main", item, true) then + inv:add_item("main", item) + end + end + end + end + + mcl_inventory.update_inventory_formspec = function(player) + local page + + local name = player:get_player_name() + + if players[name].page then + page = players[name].page + else + page = "nix" + end + + -- Figure out current scroll bar from formspec + --local formspec = player:get_inventory_formspec() + local start_i = players[name].start_i + + local inv_size + if page == "nix" then + local inv = minetest.get_inventory({ type = "detached", name = "creative_" .. name }) + inv_size = inv:get_size("main") + elseif page and page ~= "inv" then + inv_size = #(inventory_lists[page]) + else + inv_size = 0 + end + + local filter = players[name].filter + if filter == nil then + filter = "" + end + + mcl_inventory.set_creative_formspec(player, start_i, start_i / (9 * 5) + 1, inv_size, false, page, filter) + end +end minetest.register_on_joinplayer(function(player) -- Initialize variables and inventory @@ -629,7 +705,8 @@ minetest.register_on_joinplayer(function(player) end) minetest.register_on_player_inventory_action(function(player, action, inventory, inventory_info) - if minetest.is_creative_enabled(player:get_player_name()) and get_stack_size(player) == 64 and action == "put" and inventory_info.listname == "main" then + if minetest.is_creative_enabled(player:get_player_name()) and get_stack_size(player) == 64 and action == "put" and + inventory_info.listname == "main" then local stack = inventory_info.stack stack:set_count(stack:get_stack_max()) player:get_inventory():set_stack("main", inventory_info.index, stack) diff --git a/mods/HUD/mcl_inventory/init.lua b/mods/HUD/mcl_inventory/init.lua index b9b952e97..ca019fae8 100644 --- a/mods/HUD/mcl_inventory/init.lua +++ b/mods/HUD/mcl_inventory/init.lua @@ -300,6 +300,9 @@ local F = minetest.formspec_escape mcl_inventory = {} +dofile(minetest.get_modpath(minetest.get_current_modname()) .. "/creative.lua") +dofile(minetest.get_modpath(minetest.get_current_modname()) .. "/survival.lua") + --local mod_player = minetest.get_modpath("mcl_player") --local mod_craftguide = minetest.get_modpath("mcl_craftguide") @@ -363,90 +366,9 @@ local function set_inventory(player, armor_change_only) return end - local inv = player:get_inventory() - inv:set_width("craft", 2) - inv:set_size("craft", 4) - local armor_slots = { "helmet", "chestplate", "leggings", "boots" } - local armor_slot_imgs = "" - - for a = 1, 4 do - if inv:get_stack("armor", a + 1):is_empty() then - armor_slot_imgs = armor_slot_imgs .. - "image[0.375," .. (0.375 + (a - 1) * 1.25) .. ";1,1;mcl_inventory_empty_armor_slot_" .. armor_slots[a] .. ".png]" - end - end - - if inv:get_stack("offhand", 1):is_empty() then - armor_slot_imgs = armor_slot_imgs .. "image[5.375,4.125;1,1;mcl_inventory_empty_armor_slot_shield.png]" - end - - local form = table.concat({ - "formspec_version[6]", - "size[11.75,10.9]", - - --Armor slots - mcl_formspec.get_itemslot_bg_v4(0.375, 0.375, 1, 4), - "list[current_player;armor;0.375,0.375;1,1;1]", - "list[current_player;armor;0.375,1.625;1,1;2]", - "list[current_player;armor;0.375,2.875;1,1;3]", - "list[current_player;armor;0.375,4.125;1,1;4]", - - --Main inventory - mcl_formspec.get_itemslot_bg_v4(0.375, 5.575, 9, 3), - "list[current_player;main;0.375,5.575;9,3;9]", - - --Hotbar - mcl_formspec.get_itemslot_bg_v4(0.375, 9.525, 9, 1), - "list[current_player;main;0.375,9.525;9,1;]", - - --Player model - "image[1.57,0.343;3.62,4.85;mcl_inventory_background9.png;2]", - mcl_player.get_player_formspec_model(player, 1.57, 0.4, 3.62, 4.85, ""), - - --Offhand - mcl_formspec.get_itemslot_bg_v4(5.375, 4.125, 1, 1), - "list[current_player;offhand;5.375,4.125;1,1]", - - armor_slot_imgs, - - --Craft grid - "label[6.61,0.5;" .. F(minetest.colorize(mcl_formspec.label_color, S("Crafting"))) .. "]", - - mcl_formspec.get_itemslot_bg_v4(6.625, 0.875, 2, 2), - "list[current_player;craft;6.625,0.875;2,2]", - - "image[9.125,1.5;1,1;crafting_formspec_arrow.png]", - - mcl_formspec.get_itemslot_bg_v4(10.375, 1.5, 1, 1), - "list[current_player;craftpreview;10.375,1.5;1,1;]", - - --Crafting guide button - "image_button[6.575,4.075;1.1,1.1;craftguide_book.png;__mcl_craftguide;]", - "tooltip[__mcl_craftguide;" .. F(S("Recipe book")) .. "]", - - --Help button - "image_button[7.825,4.075;1.1,1.1;doc_button_icon_lores.png;__mcl_doc;]", - "tooltip[__mcl_doc;" .. F(S("Help")) .. "]", - - --Skins button - "image_button[9.075,4.075;1.1,1.1;mcl_skins_button.png;__mcl_skins;]", - "tooltip[__mcl_skins;" .. F(S("Select player skin")) .. "]", - - --Achievements button - "image_button[10.325,4.075;1.1,1.1;mcl_achievements_button.png;__mcl_achievements;]", - "tooltip[__mcl_achievements;" .. F(S("Achievements")) .. "]", - - --Listring - "listring[current_player;main]", - "listring[current_player;armor]", - "listring[current_player;main]", - "listring[current_player;craft]", - "listring[current_player;main]", - }) - - player:set_inventory_formspec(form) + player:set_inventory_formspec(mcl_inventory.build_survival_formspec(player)) end -- Drop items in craft grid and reset inventory on closing @@ -508,87 +430,21 @@ minetest.register_on_joinplayer(function(player) return_fields(player, "enchanting_lapis") end) - -dofile(minetest.get_modpath(minetest.get_current_modname()) .. "/creative.lua") - -local mt_is_creative_enabled = minetest.is_creative_enabled - -function minetest.is_creative_enabled(name) - if mt_is_creative_enabled(name) then return true end - if not name then return false end - local p = minetest.get_player_by_name(name) - if p then - return p:get_meta():get_string("gamemode") == "creative" +---@param player ObjectRef +function mcl_inventory.update_inventory(player) + local player_gamemode = mcl_gamemode.get_gamemode(player) + if player_gamemode == "creative" then + --if armor_change_only then + -- Stay on survival inventory plage if only the armor has been changed + -- mcl_inventory.set_creative_formspec(player, 0, 0, nil, nil, "inv") + --else + mcl_inventory.set_creative_formspec(player, 0, 1) + --end + elseif player_gamemode == "survival" then + player:set_inventory_formspec(mcl_inventory.build_survival_formspec(player)) end - return false end ---Insta "digging" nodes in gamemode-creative -minetest.register_on_punchnode(function(pos, node, puncher, pointed_thing) - if not puncher or not puncher:is_player() then return end - if minetest.is_creative_enabled() then return end - local name = puncher:get_player_name() - if not minetest.is_creative_enabled(name) then return end - if pointed_thing.type ~= "node" then return end - local def = minetest.registered_nodes[node.name] - if def then - if def.on_destruct then def.on_destruct(pos) end - minetest.remove_node(pos) - return true - end +mcl_gamemode.register_on_gamemode_change(function(player, old_gamemode, new_gamemode) + set_inventory(player) end) - ---Don't subtract from inv when placing in gamemode-creative -minetest.register_on_placenode(function(pos, newnode, placer, oldnode, itemstack, pointed_thing) - if placer and placer:is_player() and minetest.is_creative_enabled(placer:get_player_name()) then return true end -end) - -local function in_table(n, h) - for k, v in pairs(h) do - if v == n then return true end - end - return false -end - -local gamemodes = { - "survival", - "creative" -} - -function mcl_inventory.player_set_gamemode(p, g) - local m = p:get_meta() - m:set_string("gamemode", g) - if g == "survival" then - mcl_experience.setup_hud(p) - mcl_experience.update(p) - elseif g == "creative" then - mcl_experience.remove_hud(p) - end - set_inventory(p) -end - -minetest.register_chatcommand("gamemode", { - params = S("[] []"), - description = S("Change gamemode (survival/creative) for yourself or player"), - privs = { server = true }, - func = function(n, param) - -- Full input validation ( just for @erlehmann <3 ) - local p = minetest.get_player_by_name(n) - local args = param:split(" ") - if args[2] ~= nil then - p = minetest.get_player_by_name(args[2]) - end - if not p then - return false, S("Player not online") - end - if args[1] ~= nil and not in_table(args[1], gamemodes) then - return false, S("Gamemode " .. args[1] .. " does not exist.") - elseif args[1] ~= nil then - mcl_inventory.player_set_gamemode(p, args[1]) - end - --Result message - show effective game mode - local gm = p:get_meta():get_string("gamemode") - if gm == "" then gm = gamemodes[1] end - return true, S("Gamemode for player ") .. n .. S(": " .. gm) - end -}) diff --git a/mods/HUD/mcl_inventory/mod.conf b/mods/HUD/mcl_inventory/mod.conf index e42213d4f..80aab2ab1 100644 --- a/mods/HUD/mcl_inventory/mod.conf +++ b/mods/HUD/mcl_inventory/mod.conf @@ -1,5 +1,10 @@ name = mcl_inventory author = BlockMen description = Adds the player inventory and creative inventory. +<<<<<<< HEAD depends = mcl_init, mcl_formspec, mcl_enchanting, mcl_player optional_depends = mcl_armor, mcl_brewing, mcl_potions, mcl_enchanting, mcl_craftguide +======= +depends = mcl_init, mcl_formspec, mcl_enchanting, mcl_gamemode +optional_depends = mcl_armor, mcl_brewing, mcl_potions, mcl_enchanting, mcl_craftguide, mcl_player +>>>>>>> a2429154d (survival inventory tabs API + mcl_gamemode) diff --git a/mods/HUD/mcl_inventory/survival.lua b/mods/HUD/mcl_inventory/survival.lua new file mode 100644 index 000000000..99c8cf839 --- /dev/null +++ b/mods/HUD/mcl_inventory/survival.lua @@ -0,0 +1,219 @@ +---@diagnostic disable need-check-nil + +local table = table +local ipairs = ipairs + +local S = minetest.get_translator("mcl_inventory") +local F = minetest.formspec_escape + +---@type {id: string, description: string, item_icon: string, build: (fun(player: ObjectRef): string), handle: fun(player: ObjectRef, fields: table), access: (fun(player): boolean), show_inventory: boolean}[] +mcl_inventory.registered_survival_inventory_tabs = {} + +---@param def {id: string, description: string, item_icon: string, build: (fun(player: ObjectRef): string), handle: fun(player: ObjectRef, fields: table), access: (fun(player): boolean), show_inventory: boolean} +function mcl_inventory.register_survival_inventory_tab(def) + if #mcl_inventory.registered_survival_inventory_tabs == 7 then + error("Too much tabs registered!") + end + + assert(def.id) + assert(def.description) + assert(def.item_icon) + assert(def.build) + assert(def.handle) + + if not def.access then + function def.access(player) + return true + end + end + + if def.show_inventory == nil then + def.show_inventory = true + end + + table.insert(mcl_inventory.registered_survival_inventory_tabs, def) +end + +local player_current_tab = {} + +minetest.register_on_joinplayer(function(player, last_login) + player_current_tab[player] = "main" +end) + +minetest.register_on_leaveplayer(function(player, timed_out) + player_current_tab[player] = nil +end) + +---@param player ObjectRef +---@param content string +---@param inventory boolean +---@param tabname string +function build_page(player, content, inventory, tabname) + local tab_buttons = "style_type[image;noclip=true]" + + if #mcl_inventory.registered_survival_inventory_tabs ~= 1 then + for i, d in ipairs(mcl_inventory.registered_survival_inventory_tabs) do + local btn_name = "tab_" .. d.id + + tab_buttons = tab_buttons .. table.concat({ + "style[" .. btn_name .. ";border=false;bgimg=;bgimg_pressed=;noclip=true]", + "image[" .. + (0.2 + (i - 1) * 1.6) .. + ",-1.34;1.5,1.44;" .. (tabname == d.id and "crafting_creative_active.png" or "crafting_creative_inactive.png") .. + "]", + "item_image_button[" .. (0.44 + (i - 1) * 1.6) .. ",-1.1;1,1;" .. d.item_icon .. ";" .. btn_name .. ";]", + }) + end + end + + return table.concat({ + "formspec_version[6]", + "size[11.75,10.9]", + + inventory and table.concat({ + --Main inventory + mcl_formspec.get_itemslot_bg_v4(0.375, 5.575, 9, 3), + "list[current_player;main;0.375,5.575;9,3;9]", + + --Hotbar + mcl_formspec.get_itemslot_bg_v4(0.375, 9.525, 9, 1), + "list[current_player;main;0.375,9.525;9,1;]" + }) or "", + + content, + tab_buttons, + }) +end + +local main_page_static = table.concat({ + --Armor slots + mcl_formspec.get_itemslot_bg_v4(0.375, 0.375, 1, 4), + "list[current_player;armor;0.375,0.375;1,1;1]", + "list[current_player;armor;0.375,1.625;1,1;2]", + "list[current_player;armor;0.375,2.875;1,1;3]", + "list[current_player;armor;0.375,4.125;1,1;4]", + + --Player model background + "image[1.57,0.343;3.62,4.85;mcl_inventory_background9.png;2]", + + --Offhand + mcl_formspec.get_itemslot_bg_v4(5.375, 4.125, 1, 1), + "list[current_player;offhand;5.375,4.125;1,1]", + + --Craft grid + "label[6.61,0.5;" .. F(minetest.colorize(mcl_formspec.label_color, S("Crafting"))) .. "]", + + mcl_formspec.get_itemslot_bg_v4(6.625, 0.875, 2, 2), + "list[current_player;craft;6.625,0.875;2,2]", + + "image[9.125,1.5;1,1;crafting_formspec_arrow.png]", + + mcl_formspec.get_itemslot_bg_v4(10.375, 1.5, 1, 1), + "list[current_player;craftpreview;10.375,1.5;1,1;]", + + --Crafting guide button + "image_button[6.575,4.075;1.1,1.1;craftguide_book.png;__mcl_craftguide;]", + "tooltip[__mcl_craftguide;" .. F(S("Recipe book")) .. "]", + + --Help button + "image_button[7.825,4.075;1.1,1.1;doc_button_icon_lores.png;__mcl_doc;]", + "tooltip[__mcl_doc;" .. F(S("Help")) .. "]", + + --Skins button + "image_button[9.075,4.075;1.1,1.1;mcl_skins_button.png;__mcl_skins;]", + "tooltip[__mcl_skins;" .. F(S("Select player skin")) .. "]", + + --Achievements button + "image_button[10.325,4.075;1.1,1.1;mcl_achievements_button.png;__mcl_achievements;]", + "tooltip[__mcl_achievements;" .. F(S("Achievements")) .. "]", + + --Listring + "listring[current_player;main]", + "listring[current_player;armor]", + "listring[current_player;main]", + "listring[current_player;craft]", + "listring[current_player;main]", +}) + +mcl_inventory.register_survival_inventory_tab({ + id = "main", + description = "Main Inventory", + item_icon = "mcl_crafting_table:crafting_table", + show_inventory = true, + build = function(player) + local inv = player:get_inventory() + + local armor_slots = { "helmet", "chestplate", "leggings", "boots" } + local armor_slot_imgs = "" + + for a = 1, 4 do + if inv:get_stack("armor", a + 1):is_empty() then + armor_slot_imgs = armor_slot_imgs .. + "image[0.375," .. (0.375 + (a - 1) * 1.25) .. ";1,1;mcl_inventory_empty_armor_slot_" .. armor_slots[a] .. ".png]" + end + end + + if inv:get_stack("offhand", 1):is_empty() then + armor_slot_imgs = armor_slot_imgs .. "image[5.375,4.125;1,1;mcl_inventory_empty_armor_slot_shield.png]" + end + return main_page_static .. armor_slot_imgs .. mcl_player.get_player_formspec_model(player, 1.57, 0.4, 3.62, 4.85, "") + end, + handle = function() end, +}) + +-- +mcl_inventory.register_survival_inventory_tab({ + id = "test", + description = "Test", + item_icon = "mcl_core:stone", + show_inventory = true, + build = function(player) + return "label[1,1;Hello hello]button[2,2;2,2;Hello;hey]" + end, + handle = function(player, fields) + print(dump(fields)) + end, +}) + +---@param player ObjectRef +function mcl_inventory.build_survival_formspec(player) + local inv = player:get_inventory() + + inv:set_width("craft", 2) + inv:set_size("craft", 4) + + local tab = player_current_tab[player] + + local tab_def = nil + + for _, d in ipairs(mcl_inventory.registered_survival_inventory_tabs) do + if tab == d.id then + tab_def = d + break + end + end + + local form = build_page(player, tab_def.build(player), tab_def.show_inventory, tab) + + return form +end + +minetest.register_on_player_receive_fields(function(player, formname, fields) + if formname == "" and #mcl_inventory.registered_survival_inventory_tabs ~= 1 and + mcl_gamemode.get_gamemode(player) == "survival" then + for _, d in ipairs(mcl_inventory.registered_survival_inventory_tabs) do + if fields["tab_" .. d.id] and d.access(player) then + player_current_tab[player] = d.id + mcl_inventory.update_inventory(player) + return + end + end + + for _, d in ipairs(mcl_inventory.registered_survival_inventory_tabs) do + if player_current_tab[player] == d.id and d.access(player) then + d.handle(player, fields) + return + end + end + end +end) diff --git a/mods/PLAYER/mcl_gamemode/init.lua b/mods/PLAYER/mcl_gamemode/init.lua new file mode 100644 index 000000000..7ac814073 --- /dev/null +++ b/mods/PLAYER/mcl_gamemode/init.lua @@ -0,0 +1,106 @@ +---@diagnostic disable lowercase-global + +local S = minetest.get_translator("mcl_gamemode") + +mcl_gamemode = {} + +mcl_gamemode.gamemodes = { + "survival", + "creative", +} + +---@param n any +---@param h table +---@return boolean +local function in_table(n, h) + for k, v in pairs(h) do + if v == n then return true end + end + return false +end + +---@type fun(player: ObjectRef, old_gamemode: '"survival"'|'"creative"', new_gamemode: '"survival"'|'"creative"')[] +mcl_gamemode.registered_on_gamemode_change = {} + +---@param func fun(player: ObjectRef, old_gamemode: '"survival"'|'"creative"', new_gamemode: '"survival"'|'"creative"') +function mcl_gamemode.register_on_gamemode_change(func) + table.insert(mcl_gamemode.registered_on_gamemode_change, func) +end + +---@param player ObjectRef +---@param gamemode '"survival"'|'"creative"' +function mcl_gamemode.set_gamemode(player, gamemode) + local meta = player:get_meta() + local old_gamemode = meta:get_string("gamemode") + meta:set_string("gamemode", gamemode) + for _, f in ipairs(mcl_gamemode.registered_on_gamemode_change) do + f(player, old_gamemode, gamemode) + end +end + +local mt_is_creative_enabled = minetest.is_creative_enabled + +---@param player ObjectRef +---@return '"survival"'|'"creative"' +function mcl_gamemode.get_gamemode(player) + if mt_is_creative_enabled(player:get_player_name()) then + return "creative" + end + return player:get_meta():get_string("gamemode") +end + +function minetest.is_creative_enabled(name) + if mt_is_creative_enabled(name) then return true end + if not name then return false end + local p = minetest.get_player_by_name(name) + if p then + return p:get_meta():get_string("gamemode") == "creative" + end + return false +end + +-- Insta "digging" nodes in gamemode-creative +minetest.register_on_punchnode(function(pos, node, puncher, pointed_thing) + if not puncher or not puncher:is_player() then return end + if minetest.is_creative_enabled() then return end + local name = puncher:get_player_name() + if not minetest.is_creative_enabled(name) then return end + if pointed_thing.type ~= "node" then return end + local def = minetest.registered_nodes[node.name] + if def then + if def.on_destruct then def.on_destruct(pos) end + minetest.remove_node(pos) + return true + end +end) + +-- Don't subtract from inv when placing in gamemode-creative +minetest.register_on_placenode(function(pos, newnode, placer, oldnode, itemstack, pointed_thing) + if placer and placer:is_player() and minetest.is_creative_enabled(placer:get_player_name()) then return true end +end) + +minetest.register_chatcommand("gamemode", { + params = S("[] []"), + description = S("Change gamemode (survival/creative) for yourself or player"), + privs = { server = true }, + func = function(n, param) + -- Full input validation ( just for @erlehmann <3 ) + local p = minetest.get_player_by_name(n) + local args = param:split(" ") + if args[2] ~= nil then + p = minetest.get_player_by_name(args[2]) + end + if not p then + return false, S("Player not online") + end + if args[1] ~= nil and not in_table(args[1], gamemodes) then + return false, S("Gamemode " .. args[1] .. " does not exist.") + elseif args[1] ~= nil then + mcl_inventory.player_set_gamemode(p, args[1]) + end + --Result message - show effective game mode + local gm = p:get_meta():get_string("gamemode") + if gm == "" then gm = gamemodes[1] end + return true, S("Gamemode for player ") .. n .. S(": " .. gm) + end +}) diff --git a/mods/PLAYER/mcl_gamemode/mod.conf b/mods/PLAYER/mcl_gamemode/mod.conf new file mode 100644 index 000000000..03eade707 --- /dev/null +++ b/mods/PLAYER/mcl_gamemode/mod.conf @@ -0,0 +1 @@ +name = mcl_gamemode \ No newline at end of file From 04a58ddd24ce01f1f106fad8284ff17c8b0e9cfc Mon Sep 17 00:00:00 2001 From: AFCMS Date: Sat, 10 Sep 2022 01:06:53 +0200 Subject: [PATCH 089/982] Disable test tab --- mods/HUD/mcl_inventory/survival.lua | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/mods/HUD/mcl_inventory/survival.lua b/mods/HUD/mcl_inventory/survival.lua index 99c8cf839..5f213ad2b 100644 --- a/mods/HUD/mcl_inventory/survival.lua +++ b/mods/HUD/mcl_inventory/survival.lua @@ -161,7 +161,7 @@ mcl_inventory.register_survival_inventory_tab({ handle = function() end, }) --- +--[[ mcl_inventory.register_survival_inventory_tab({ id = "test", description = "Test", @@ -173,7 +173,7 @@ mcl_inventory.register_survival_inventory_tab({ handle = function(player, fields) print(dump(fields)) end, -}) +})]] ---@param player ObjectRef function mcl_inventory.build_survival_formspec(player) From 9e83e531bdea548d2b2db6193e4412b93dfcd845 Mon Sep 17 00:00:00 2001 From: AFCMS Date: Sat, 10 Sep 2022 11:03:28 +0200 Subject: [PATCH 090/982] Make function local --- mods/HUD/mcl_inventory/survival.lua | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mods/HUD/mcl_inventory/survival.lua b/mods/HUD/mcl_inventory/survival.lua index 5f213ad2b..0ca22d119 100644 --- a/mods/HUD/mcl_inventory/survival.lua +++ b/mods/HUD/mcl_inventory/survival.lua @@ -48,7 +48,7 @@ end) ---@param content string ---@param inventory boolean ---@param tabname string -function build_page(player, content, inventory, tabname) +local function build_page(player, content, inventory, tabname) local tab_buttons = "style_type[image;noclip=true]" if #mcl_inventory.registered_survival_inventory_tabs ~= 1 then From 452cd2655816b54ef8750d8d0a68a16994223bec Mon Sep 17 00:00:00 2001 From: AFCMS Date: Sat, 10 Sep 2022 11:05:59 +0200 Subject: [PATCH 091/982] Reenable creative formspec armor update --- mods/HUD/mcl_inventory/init.lua | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) diff --git a/mods/HUD/mcl_inventory/init.lua b/mods/HUD/mcl_inventory/init.lua index ca019fae8..2f954c070 100644 --- a/mods/HUD/mcl_inventory/init.lua +++ b/mods/HUD/mcl_inventory/init.lua @@ -431,15 +431,16 @@ minetest.register_on_joinplayer(function(player) end) ---@param player ObjectRef -function mcl_inventory.update_inventory(player) +---@param armor_change_only? boolean +function mcl_inventory.update_inventory(player, armor_change_only) local player_gamemode = mcl_gamemode.get_gamemode(player) if player_gamemode == "creative" then - --if armor_change_only then - -- Stay on survival inventory plage if only the armor has been changed - -- mcl_inventory.set_creative_formspec(player, 0, 0, nil, nil, "inv") - --else - mcl_inventory.set_creative_formspec(player, 0, 1) - --end + if armor_change_only then + -- Stay on survival inventory plage if only the armor has been changed + mcl_inventory.set_creative_formspec(player, 0, 0, nil, nil, "inv") + else + mcl_inventory.set_creative_formspec(player, 0, 1) + end elseif player_gamemode == "survival" then player:set_inventory_formspec(mcl_inventory.build_survival_formspec(player)) end From 1065eb4d8c74c4aa4d4af7ffcb5ecbb98a366951 Mon Sep 17 00:00:00 2001 From: AFCMS Date: Sat, 10 Sep 2022 11:20:48 +0200 Subject: [PATCH 092/982] Hooper formspec --- mods/HUD/mcl_inventory/init.lua | 4 +- mods/ITEMS/mcl_hoppers/init.lua | 77 ++++++++++++++++++--------------- 2 files changed, 43 insertions(+), 38 deletions(-) diff --git a/mods/HUD/mcl_inventory/init.lua b/mods/HUD/mcl_inventory/init.lua index 2f954c070..6edfc3d78 100644 --- a/mods/HUD/mcl_inventory/init.lua +++ b/mods/HUD/mcl_inventory/init.lua @@ -366,8 +366,6 @@ local function set_inventory(player, armor_change_only) return end - - player:set_inventory_formspec(mcl_inventory.build_survival_formspec(player)) end @@ -436,7 +434,7 @@ function mcl_inventory.update_inventory(player, armor_change_only) local player_gamemode = mcl_gamemode.get_gamemode(player) if player_gamemode == "creative" then if armor_change_only then - -- Stay on survival inventory plage if only the armor has been changed + -- Stay on survival inventory page if only the armor has been changed mcl_inventory.set_creative_formspec(player, 0, 0, nil, nil, "inv") else mcl_inventory.set_creative_formspec(player, 0, 1) diff --git a/mods/ITEMS/mcl_hoppers/init.lua b/mods/ITEMS/mcl_hoppers/init.lua index 62b358c64..b4378b21b 100644 --- a/mods/ITEMS/mcl_hoppers/init.lua +++ b/mods/ITEMS/mcl_hoppers/init.lua @@ -12,17 +12,24 @@ end --[[ BEGIN OF NODE DEFINITIONS ]] local mcl_hoppers_formspec = table.concat({ - "size[9,7]", - "label[2,0;"..F(C(mcl_formspec.label_color, S("Hopper"))).."]", - "list[context;main;2,0.5;5,1;]", - mcl_formspec.get_itemslot_bg(2,0.5,5,1), - "label[0,2;"..F(C(mcl_formspec.label_color, S("Inventory"))).."]", - "list[current_player;main;0,2.5;9,3;9]", - mcl_formspec.get_itemslot_bg(0,2.5,9,3), - "list[current_player;main;0,5.74;9,1;]", - mcl_formspec.get_itemslot_bg(0,5.74,9,1), + "formspec_version[4]", + "size[11.75,8.175]", + + "label[0.375,0.375;" .. F(C(mcl_formspec.label_color, S("Hopper"))) .. "]", + + mcl_formspec.get_itemslot_bg_v4(2.875, 0.75, 5, 1), + "list[context;main;2.875,0.75;5,1;]", + + "label[0.375,2.45;" .. F(C(mcl_formspec.label_color, S("Inventory"))) .. "]", + + mcl_formspec.get_itemslot_bg_v4(0.375, 2.85, 9, 3), + "list[current_player;main;0.375,2.85;9,3;9]", + + mcl_formspec.get_itemslot_bg_v4(0.375, 6.8, 9, 1), + "list[current_player;main;0.375,6.8;9,1;]", + "listring[context;main]", - "listring[current_player;main]" + "listring[current_player;main]", }) -- Downwards hopper (base definition) @@ -31,7 +38,7 @@ local mcl_hoppers_formspec = table.concat({ local def_hopper = { inventory_image = "mcl_hoppers_item.png", wield_image = "mcl_hoppers_item.png", - groups = {pickaxey = 1, container = 2, deco_block = 1, hopper = 1}, + groups = { pickaxey = 1, container = 2, deco_block = 1, hopper = 1 }, drawtype = "nodebox", paramtype = "light", -- FIXME: mcl_hoppers_hopper_inside.png is unused by hoppers. @@ -47,25 +54,25 @@ local def_hopper = { type = "fixed", fixed = { --funnel walls - {-0.5, 0.0, 0.4, 0.5, 0.5, 0.5}, - {0.4, 0.0, -0.5, 0.5, 0.5, 0.5}, - {-0.5, 0.0, -0.5, -0.4, 0.5, 0.5}, - {-0.5, 0.0, -0.5, 0.5, 0.5, -0.4}, + { -0.5, 0.0, 0.4, 0.5, 0.5, 0.5 }, + { 0.4, 0.0, -0.5, 0.5, 0.5, 0.5 }, + { -0.5, 0.0, -0.5, -0.4, 0.5, 0.5 }, + { -0.5, 0.0, -0.5, 0.5, 0.5, -0.4 }, --funnel base - {-0.5, 0.0, -0.5, 0.5, 0.1, 0.5}, + { -0.5, 0.0, -0.5, 0.5, 0.1, 0.5 }, --spout - {-0.3, -0.3, -0.3, 0.3, 0.0, 0.3}, - {-0.1, -0.3, -0.1, 0.1, -0.5, 0.1}, + { -0.3, -0.3, -0.3, 0.3, 0.0, 0.3 }, + { -0.1, -0.3, -0.1, 0.1, -0.5, 0.1 }, }, }, selection_box = { type = "fixed", fixed = { --funnel - {-0.5, 0.0, -0.5, 0.5, 0.5, 0.5}, + { -0.5, 0.0, -0.5, 0.5, 0.5, 0.5 }, --spout - {-0.3, -0.3, -0.3, 0.3, 0.0, 0.3}, - {-0.1, -0.3, -0.1, 0.1, -0.5, 0.1}, + { -0.3, -0.3, -0.3, 0.3, 0.0, 0.3 }, + { -0.1, -0.3, -0.1, 0.1, -0.5, 0.1 }, }, }, is_ground_content = false, @@ -248,25 +255,25 @@ local def_hopper_side = { type = "fixed", fixed = { --funnel walls - {-0.5, 0.0, 0.4, 0.5, 0.5, 0.5}, - {0.4, 0.0, -0.5, 0.5, 0.5, 0.5}, - {-0.5, 0.0, -0.5, -0.4, 0.5, 0.5}, - {-0.5, 0.0, -0.5, 0.5, 0.5, -0.4}, + { -0.5, 0.0, 0.4, 0.5, 0.5, 0.5 }, + { 0.4, 0.0, -0.5, 0.5, 0.5, 0.5 }, + { -0.5, 0.0, -0.5, -0.4, 0.5, 0.5 }, + { -0.5, 0.0, -0.5, 0.5, 0.5, -0.4 }, --funnel base - {-0.5, 0.0, -0.5, 0.5, 0.1, 0.5}, + { -0.5, 0.0, -0.5, 0.5, 0.1, 0.5 }, --spout - {-0.3, -0.3, -0.3, 0.3, 0.0, 0.3}, - {-0.5, -0.3, -0.1, 0.1, -0.1, 0.1}, + { -0.3, -0.3, -0.3, 0.3, 0.0, 0.3 }, + { -0.5, -0.3, -0.1, 0.1, -0.1, 0.1 }, }, }, selection_box = { type = "fixed", fixed = { --funnel - {-0.5, 0.0, -0.5, 0.5, 0.5, 0.5}, + { -0.5, 0.0, -0.5, 0.5, 0.5, 0.5 }, --spout - {-0.3, -0.3, -0.3, 0.3, 0.0, 0.3}, - {-0.5, -0.3, -0.1, 0.1, -0.1, 0.1}, + { -0.3, -0.3, -0.3, 0.3, 0.0, 0.3 }, + { -0.5, -0.3, -0.1, 0.1, -0.1, 0.1 }, }, }, is_ground_content = false, @@ -559,8 +566,8 @@ end minetest.register_abm({ label = "Hopper/container item exchange", - nodenames = {"mcl_hoppers:hopper"}, - neighbors = {"group:container"}, + nodenames = { "mcl_hoppers:hopper" }, + neighbors = { "group:container" }, interval = 1.0, chance = 1, action = function(pos, node, active_object_count, active_object_count_wider) @@ -591,8 +598,8 @@ minetest.register_abm({ minetest.register_abm({ label = "Side-hopper/container item exchange", - nodenames = {"mcl_hoppers:hopper_side"}, - neighbors = {"group:container"}, + nodenames = { "mcl_hoppers:hopper_side" }, + neighbors = { "group:container" }, interval = 1.0, chance = 1, action = function(pos, node, active_object_count, active_object_count_wider) From 37176976b66b418887e5c7e856945fe580398322 Mon Sep 17 00:00:00 2001 From: AFCMS Date: Sat, 10 Sep 2022 11:39:10 +0200 Subject: [PATCH 093/982] Dropper + Dispenser inventory --- mods/ITEMS/REDSTONE/mcl_dispensers/init.lua | 127 +++++++++++--------- mods/ITEMS/REDSTONE/mcl_droppers/init.lua | 78 +++++++----- 2 files changed, 117 insertions(+), 88 deletions(-) diff --git a/mods/ITEMS/REDSTONE/mcl_dispensers/init.lua b/mods/ITEMS/REDSTONE/mcl_dispensers/init.lua index 17d9385a2..fa8ecc779 100644 --- a/mods/ITEMS/REDSTONE/mcl_dispensers/init.lua +++ b/mods/ITEMS/REDSTONE/mcl_dispensers/init.lua @@ -8,23 +8,36 @@ All node definitions share a lot of code, so this is the reason why there are so many weird tables below. ]] local S = minetest.get_translator(minetest.get_current_modname()) +local C = minetest.colorize +local F = minetest.formspec_escape --- For after_place_node +local dispenser_formspec = table.concat({ + "formspec_version[4]", + "size[11.75,10.425]", + + "label[4.125,0.375;" .. F(C(mcl_formspec.label_color, S("Dispenser"))) .. "]", + + mcl_formspec.get_itemslot_bg_v4(4.125, 0.75, 3, 3), + "list[context;main;4.125,0.75;3,3;]", + + "label[0.375,4.7;" .. F(C(mcl_formspec.label_color, S("Inventory"))) .. "]", + + mcl_formspec.get_itemslot_bg_v4(0.375, 5.1, 9, 3), + "list[current_player;main;0.375,5.1;9,3;9]", + + mcl_formspec.get_itemslot_bg_v4(0.375, 9.05, 9, 1), + "list[current_player;main;0.375,9.05;9,1;]", + + "listring[context;main]", + "listring[current_player;main]", +}) + +---For after_place_node +---@param pos Vector local function setup_dispenser(pos) -- Set formspec and inventory - local form = "size[9,8.75]".. - "label[0,4.0;"..minetest.formspec_escape(minetest.colorize("#313131", S("Inventory"))).."]".. - "list[current_player;main;0,4.5;9,3;9]".. - mcl_formspec.get_itemslot_bg(0,4.5,9,3).. - "list[current_player;main;0,7.74;9,1;]".. - mcl_formspec.get_itemslot_bg(0,7.74,9,1).. - "label[3,0;"..minetest.formspec_escape(minetest.colorize("#313131", S("Dispenser"))).."]".. - "list[context;main;3,0.5;3,3;]".. - mcl_formspec.get_itemslot_bg(3,0.5,3,3).. - "listring[context;main]".. - "listring[current_player;main]" local meta = minetest.get_meta(pos) - meta:set_string("formspec", form) + meta:set_string("formspec", dispenser_formspec) local inv = meta:get_inventory() inv:set_size("main", 9) end @@ -38,9 +51,9 @@ local function orientate_dispenser(pos, placer) local node = minetest.get_node(pos) if pitch > 55 then - minetest.swap_node(pos, {name="mcl_dispensers:dispenser_up", param2 = node.param2}) + minetest.swap_node(pos, { name = "mcl_dispensers:dispenser_up", param2 = node.param2 }) elseif pitch < -55 then - minetest.swap_node(pos, {name="mcl_dispensers:dispenser_down", param2 = node.param2}) + minetest.swap_node(pos, { name = "mcl_dispensers:dispenser_down", param2 = node.param2 }) end end @@ -85,10 +98,10 @@ local dispenserdef = { local meta2 = meta:to_table() meta:from_table(oldmetadata) local inv = meta:get_inventory() - for i=1, inv:get_size("main") do + for i = 1, inv:get_size("main") do local stack = inv:get_stack("main", i) if not stack:is_empty() then - local p = {x=pos.x+math.random(0, 10)/10-0.5, y=pos.y, z=pos.z+math.random(0, 10)/10-0.5} + local p = { x = pos.x + math.random(0, 10) / 10 - 0.5, y = pos.y, z = pos.z + math.random(0, 10) / 10 - 0.5 } minetest.add_item(p, stack) end end @@ -107,19 +120,19 @@ local dispenserdef = { dropdir = vector.multiply(minetest.facedir_to_dir(node.param2), -1) droppos = vector.add(pos, dropdir) elseif node.name == "mcl_dispensers:dispenser_up" then - dropdir = {x=0, y=1, z=0} - droppos = {x=pos.x, y=pos.y+1, z=pos.z} + dropdir = { x = 0, y = 1, z = 0 } + droppos = { x = pos.x, y = pos.y + 1, z = pos.z } elseif node.name == "mcl_dispensers:dispenser_down" then - dropdir = {x=0, y=-1, z=0} - droppos = {x=pos.x, y=pos.y-1, z=pos.z} + dropdir = { x = 0, y = -1, z = 0 } + droppos = { x = pos.x, y = pos.y - 1, z = pos.z } end local dropnode = minetest.get_node(droppos) local dropnodedef = minetest.registered_nodes[dropnode.name] local stacks = {} - for i=1,inv:get_size("main") do + for i = 1, inv:get_size("main") do local stack = inv:get_stack("main", i) if not stack:is_empty() then - table.insert(stacks, {stack = stack, stackpos = i}) + table.insert(stacks, { stack = stack, stackpos = i }) end end if #stacks >= 1 then @@ -143,9 +156,10 @@ local dispenserdef = { -- Armor, mob heads and pumpkins if igroups.armor then - local droppos_below = {x = droppos.x, y = droppos.y - 1, z = droppos.z} + local droppos_below = { x = droppos.x, y = droppos.y - 1, z = droppos.z } - for _, objs in ipairs({minetest.get_objects_inside_radius(droppos, 1), minetest.get_objects_inside_radius(droppos_below, 1)}) do + for _, objs in ipairs({ minetest.get_objects_inside_radius(droppos, 1), + minetest.get_objects_inside_radius(droppos_below, 1) }) do for _, obj in ipairs(objs) do stack = mcl_armor.equip(stack, obj) if stack:is_empty() then @@ -157,11 +171,11 @@ local dispenserdef = { end end - -- Place head or pumpkin as node, if equipping it as armor has failed + -- Place head or pumpkin as node, if equipping it as armor has failed if not stack:is_empty() then if igroups.head or iname == "mcl_farming:pumpkin_face" then if dropnodedef.buildable_to then - minetest.set_node(droppos, {name = iname, param2 = node.param2}) + minetest.set_node(droppos, { name = iname, param2 = node.param2 }) stack:take_item() end end @@ -169,7 +183,7 @@ local dispenserdef = { inv:set_stack("main", stack_id, stack) - -- Use shears on sheeps + -- Use shears on sheeps elseif igroups.shears then for _, obj in pairs(minetest.get_objects_inside_radius(droppos, 1)) do local entity = obj:get_luaentity() @@ -220,7 +234,7 @@ local dispenserdef = { end end - -- Spawn Egg + -- Spawn Egg elseif igroups.spawn_egg then -- Spawn mob if not dropnodedef.walkable then @@ -231,7 +245,7 @@ local dispenserdef = { inv:set_stack("main", stack_id, stack) end - -- Generalized dispension + -- Generalized dispension elseif (not dropnodedef.walkable or stackdef._dispense_into_walkable) then --[[ _on_dispense(stack, pos, droppos, dropnode, dropdir) * stack: Itemstack which is dispense @@ -263,7 +277,7 @@ local dispenserdef = { local item_entity = minetest.add_item(droppos, dropitem) local drop_vel = vector.subtract(droppos, pos) local speed = 3 - item_entity:set_velocity(vector.multiply(drop_vel,speed)) + item_entity:set_velocity(vector.multiply(drop_vel, speed)) end else stack:take_item() @@ -280,7 +294,7 @@ local dispenserdef = { local item_entity = minetest.add_item(droppos, dropitem) local drop_vel = vector.subtract(droppos, pos) local speed = 3 - item_entity:set_velocity(vector.multiply(drop_vel,speed)) + item_entity:set_velocity(vector.multiply(drop_vel, speed)) stack:take_item() inv:set_stack("main", stack_id, stack) end @@ -299,27 +313,28 @@ local dispenserdef = { local horizontal_def = table.copy(dispenserdef) horizontal_def.description = S("Dispenser") -horizontal_def._tt_help = S("9 inventory slots").."\n"..S("Launches item when powered by redstone power") +horizontal_def._tt_help = S("9 inventory slots") .. "\n" .. S("Launches item when powered by redstone power") horizontal_def._doc_items_longdesc = S("A dispenser is a block which acts as a redstone component which, when powered with redstone power, dispenses an item. It has a container with 9 inventory slots.") -horizontal_def._doc_items_usagehelp = S("Place the dispenser in one of 6 possible directions. The “hole” is where items will fly out of the dispenser. Use the dispenser to access its inventory. Insert the items you wish to dispense. Supply the dispenser with redstone energy once to dispense a random item.").."\n\n".. +horizontal_def._doc_items_usagehelp = S("Place the dispenser in one of 6 possible directions. The “hole” is where items will fly out of the dispenser. Use the dispenser to access its inventory. Insert the items you wish to dispense. Supply the dispenser with redstone energy once to dispense a random item.") + .. "\n\n" .. -S("The dispenser will do different things, depending on the dispensed item:").."\n\n".. + S("The dispenser will do different things, depending on the dispensed item:") .. "\n\n" .. -S("• Arrows: Are launched").."\n".. -S("• Eggs and snowballs: Are thrown").."\n".. -S("• Fire charges: Are fired in a straight line").."\n".. -S("• Armor: Will be equipped to players and armor stands").."\n".. -S("• Boats: Are placed on water or are dropped").."\n".. -S("• Minecart: Are placed on rails or are dropped").."\n".. -S("• Bone meal: Is applied on the block it is facing").."\n".. -S("• Empty buckets: Are used to collect a liquid source").."\n".. -S("• Filled buckets: Are used to place a liquid source").."\n".. -S("• Heads, pumpkins: Equipped to players and armor stands, or placed as a block").."\n".. -S("• Shulker boxes: Are placed as a block").."\n".. -S("• TNT: Is placed and ignited").."\n".. -S("• Flint and steel: Is used to ignite a fire in air and to ignite TNT").."\n".. -S("• Spawn eggs: Will summon the mob they contain").."\n".. -S("• Other items: Are simply dropped") + S("• Arrows: Are launched") .. "\n" .. + S("• Eggs and snowballs: Are thrown") .. "\n" .. + S("• Fire charges: Are fired in a straight line") .. "\n" .. + S("• Armor: Will be equipped to players and armor stands") .. "\n" .. + S("• Boats: Are placed on water or are dropped") .. "\n" .. + S("• Minecart: Are placed on rails or are dropped") .. "\n" .. + S("• Bone meal: Is applied on the block it is facing") .. "\n" .. + S("• Empty buckets: Are used to collect a liquid source") .. "\n" .. + S("• Filled buckets: Are used to place a liquid source") .. "\n" .. + S("• Heads, pumpkins: Equipped to players and armor stands, or placed as a block") .. "\n" .. + S("• Shulker boxes: Are placed as a block") .. "\n" .. + S("• TNT: Is placed and ignited") .. "\n" .. + S("• Flint and steel: Is used to ignite a fire in air and to ignite TNT") .. "\n" .. + S("• Spawn eggs: Will summon the mob they contain") .. "\n" .. + S("• Other items: Are simply dropped") function horizontal_def.after_place_node(pos, placer, itemstack, pointed_thing) setup_dispenser(pos) @@ -332,7 +347,7 @@ horizontal_def.tiles = { "default_furnace_side.png", "mcl_dispensers_dispenser_front_horizontal.png" } horizontal_def.paramtype2 = "facedir" -horizontal_def.groups = {pickaxey=1, container=2, material_stone=1} +horizontal_def.groups = { pickaxey = 1, container = 2, material_stone = 1 } minetest.register_node("mcl_dispensers:dispenser", horizontal_def) @@ -345,7 +360,7 @@ down_def.tiles = { "default_furnace_side.png", "default_furnace_side.png", "default_furnace_side.png", "default_furnace_side.png" } -down_def.groups = {pickaxey=1, container=2,not_in_creative_inventory=1, material_stone=1} +down_def.groups = { pickaxey = 1, container = 2, not_in_creative_inventory = 1, material_stone = 1 } down_def._doc_items_create_entry = false down_def.drop = "mcl_dispensers:dispenser" minetest.register_node("mcl_dispensers:dispenser_down", down_def) @@ -365,9 +380,9 @@ minetest.register_node("mcl_dispensers:dispenser_up", up_def) minetest.register_craft({ output = "mcl_dispensers:dispenser", recipe = { - {"mcl_core:cobble", "mcl_core:cobble", "mcl_core:cobble",}, - {"mcl_core:cobble", "mcl_bows:bow", "mcl_core:cobble",}, - {"mcl_core:cobble", "mesecons:redstone", "mcl_core:cobble",}, + { "mcl_core:cobble", "mcl_core:cobble", "mcl_core:cobble", }, + { "mcl_core:cobble", "mcl_bows:bow", "mcl_core:cobble", }, + { "mcl_core:cobble", "mesecons:redstone", "mcl_core:cobble", }, } }) @@ -384,6 +399,6 @@ minetest.register_lbm({ nodenames = { "mcl_dispensers:dispenser", "mcl_dispensers:dispenser_down", "mcl_dispensers:dispenser_up" }, action = function(pos, node) setup_dispenser(pos) - minetest.log("action", "[mcl_dispenser] Node formspec updated at "..minetest.pos_to_string(pos)) + minetest.log("action", "[mcl_dispenser] Node formspec updated at " .. minetest.pos_to_string(pos)) end, }) diff --git a/mods/ITEMS/REDSTONE/mcl_droppers/init.lua b/mods/ITEMS/REDSTONE/mcl_droppers/init.lua index 5f8f94d84..78a9a773b 100644 --- a/mods/ITEMS/REDSTONE/mcl_droppers/init.lua +++ b/mods/ITEMS/REDSTONE/mcl_droppers/init.lua @@ -9,23 +9,36 @@ are so many weird tables below. ]] local S = minetest.get_translator(minetest.get_current_modname()) +local C = minetest.colorize +local F = minetest.formspec_escape --- For after_place_node +local dropper_formspec = table.concat({ + "formspec_version[4]", + "size[11.75,10.425]", + + "label[4.125,0.375;" .. F(C(mcl_formspec.label_color, S("Dropper"))) .. "]", + + mcl_formspec.get_itemslot_bg_v4(4.125, 0.75, 3, 3), + "list[context;main;4.125,0.75;3,3;]", + + "label[0.375,4.7;" .. F(C(mcl_formspec.label_color, S("Inventory"))) .. "]", + + mcl_formspec.get_itemslot_bg_v4(0.375, 5.1, 9, 3), + "list[current_player;main;0.375,5.1;9,3;9]", + + mcl_formspec.get_itemslot_bg_v4(0.375, 9.05, 9, 1), + "list[current_player;main;0.375,9.05;9,1;]", + + "listring[context;main]", + "listring[current_player;main]", +}) + +---For after_place_node +---@param pos Vector local function setup_dropper(pos) -- Set formspec and inventory - local form = "size[9,8.75]".. - "label[0,4.0;"..minetest.formspec_escape(minetest.colorize("#313131", S("Inventory"))).."]".. - "list[current_player;main;0,4.5;9,3;9]".. - mcl_formspec.get_itemslot_bg(0,4.5,9,3).. - "list[current_player;main;0,7.74;9,1;]".. - mcl_formspec.get_itemslot_bg(0,7.74,9,1).. - "label[3,0;"..minetest.formspec_escape(minetest.colorize("#313131", S("Dropper"))).."]".. - "list[context;main;3,0.5;3,3;]".. - mcl_formspec.get_itemslot_bg(3,0.5,3,3).. - "listring[context;main]".. - "listring[current_player;main]" local meta = minetest.get_meta(pos) - meta:set_string("formspec", form) + meta:set_string("formspec", dropper_formspec) local inv = meta:get_inventory() inv:set_size("main", 9) end @@ -38,9 +51,9 @@ local function orientate_dropper(pos, placer) local pitch = placer:get_look_vertical() * (180 / math.pi) if pitch > 55 then - minetest.swap_node(pos, {name="mcl_droppers:dropper_up"}) + minetest.swap_node(pos, { name = "mcl_droppers:dropper_up" }) elseif pitch < -55 then - minetest.swap_node(pos, {name="mcl_droppers:dropper_down"}) + minetest.swap_node(pos, { name = "mcl_droppers:dropper_down" }) end end @@ -58,10 +71,10 @@ local dropperdef = { local meta2 = meta:to_table() meta:from_table(oldmetadata) local inv = meta:get_inventory() - for i=1, inv:get_size("main") do + for i = 1, inv:get_size("main") do local stack = inv:get_stack("main", i) if not stack:is_empty() then - local p = {x=pos.x+math.random(0, 10)/10-0.5, y=pos.y, z=pos.z+math.random(0, 10)/10-0.5} + local p = { x = pos.x + math.random(0, 10) / 10 - 0.5, y = pos.y, z = pos.z + math.random(0, 10) / 10 - 0.5 } minetest.add_item(p, stack) end end @@ -96,7 +109,7 @@ local dropperdef = { end, _mcl_blast_resistance = 3.5, _mcl_hardness = 3.5, - mesecons = {effector = { + mesecons = { effector = { -- Drop random item when triggered action_on = function(pos, node) if not pos then return end @@ -104,11 +117,11 @@ local dropperdef = { local inv = meta:get_inventory() local droppos if node.name == "mcl_droppers:dropper" then - droppos = vector.subtract(pos, minetest.facedir_to_dir(node.param2)) + droppos = vector.subtract(pos, minetest.facedir_to_dir(node.param2)) elseif node.name == "mcl_droppers:dropper_up" then - droppos = {x=pos.x, y=pos.y+1, z=pos.z} + droppos = { x = pos.x, y = pos.y + 1, z = pos.z } elseif node.name == "mcl_droppers:dropper_down" then - droppos = {x=pos.x, y=pos.y-1, z=pos.z} + droppos = { x = pos.x, y = pos.y - 1, z = pos.z } end local dropnode = minetest.get_node(droppos) -- Do not drop into solid nodes, unless they are containers @@ -117,10 +130,10 @@ local dropperdef = { return end local stacks = {} - for i=1,inv:get_size("main") do + for i = 1, inv:get_size("main") do local stack = inv:get_stack("main", i) if not stack:is_empty() then - table.insert(stacks, {stack = stack, stackpos = i}) + table.insert(stacks, { stack = stack, stackpos = i }) end end if #stacks >= 1 then @@ -144,14 +157,14 @@ local dropperdef = { local item_entity = minetest.add_item(droppos, dropitem) local drop_vel = vector.subtract(droppos, pos) local speed = 3 - item_entity:set_velocity(vector.multiply(drop_vel,speed)) + item_entity:set_velocity(vector.multiply(drop_vel, speed)) stack:take_item() inv:set_stack("main", stack_id, stack) end end end, rules = mesecon.rules.alldirs, - }}, + } }, on_rotate = on_rotate, } @@ -159,20 +172,21 @@ local dropperdef = { local horizontal_def = table.copy(dropperdef) horizontal_def.description = S("Dropper") -horizontal_def._tt_help = S("9 inventory slots").."\n"..S("Drops item when powered by redstone power") +horizontal_def._tt_help = S("9 inventory slots") .. "\n" .. S("Drops item when powered by redstone power") horizontal_def._doc_items_longdesc = S("A dropper is a redstone component and a container with 9 inventory slots which, when supplied with redstone power, drops an item or puts it into a container in front of it.") horizontal_def._doc_items_usagehelp = S("Droppers can be placed in 6 possible directions, items will be dropped out of the hole. Use the dropper to access its inventory. Supply it with redstone energy once to make the dropper drop or transfer a random item.") function horizontal_def.after_place_node(pos, placer, itemstack, pointed_thing) setup_dropper(pos) orientate_dropper(pos, placer) end + horizontal_def.tiles = { "default_furnace_top.png", "default_furnace_bottom.png", "default_furnace_side.png", "default_furnace_side.png", "default_furnace_side.png", "mcl_droppers_dropper_front_horizontal.png" } horizontal_def.paramtype2 = "facedir" -horizontal_def.groups = {pickaxey=1, container=2, material_stone=1} +horizontal_def.groups = { pickaxey = 1, container = 2, material_stone = 1 } minetest.register_node("mcl_droppers:dropper", horizontal_def) @@ -185,7 +199,7 @@ down_def.tiles = { "default_furnace_side.png", "default_furnace_side.png", "default_furnace_side.png", "default_furnace_side.png" } -down_def.groups = {pickaxey=1, container=2,not_in_creative_inventory=1, material_stone=1} +down_def.groups = { pickaxey = 1, container = 2, not_in_creative_inventory = 1, material_stone = 1 } down_def._doc_items_create_entry = false down_def.drop = "mcl_droppers:dropper" minetest.register_node("mcl_droppers:dropper_down", down_def) @@ -207,9 +221,9 @@ minetest.register_node("mcl_droppers:dropper_up", up_def) minetest.register_craft({ output = "mcl_droppers:dropper", recipe = { - {"mcl_core:cobble", "mcl_core:cobble", "mcl_core:cobble",}, - {"mcl_core:cobble", "", "mcl_core:cobble",}, - {"mcl_core:cobble", "mesecons:redstone", "mcl_core:cobble",}, + { "mcl_core:cobble", "mcl_core:cobble", "mcl_core:cobble", }, + { "mcl_core:cobble", "", "mcl_core:cobble", }, + { "mcl_core:cobble", "mesecons:redstone", "mcl_core:cobble", }, } }) @@ -226,6 +240,6 @@ minetest.register_lbm({ nodenames = { "mcl_droppers:dropper", "mcl_droppers:dropper_down", "mcl_droppers:dropper_up" }, action = function(pos, node) setup_dropper(pos) - minetest.log("action", "[mcl_droppers] Node formspec updated at "..minetest.pos_to_string(pos)) + minetest.log("action", "[mcl_droppers] Node formspec updated at " .. minetest.pos_to_string(pos)) end, }) From 842363464d77b5f8b13bfc637250a112cce9fb91 Mon Sep 17 00:00:00 2001 From: AFCMS Date: Sat, 10 Sep 2022 13:44:12 +0200 Subject: [PATCH 094/982] Enchanting table formspec redo --- mods/ITEMS/mcl_enchanting/engine.lua | 158 ++++++++++++++++++--------- 1 file changed, 105 insertions(+), 53 deletions(-) diff --git a/mods/ITEMS/mcl_enchanting/engine.lua b/mods/ITEMS/mcl_enchanting/engine.lua index fa6dea353..57fde4dd5 100644 --- a/mods/ITEMS/mcl_enchanting/engine.lua +++ b/mods/ITEMS/mcl_enchanting/engine.lua @@ -2,7 +2,8 @@ local S = minetest.get_translator(minetest.get_current_modname()) local F = minetest.formspec_escape function mcl_enchanting.is_book(itemname) - return itemname == "mcl_books:book" or itemname == "mcl_enchanting:book_enchanted" or itemname == "mcl_books:book_enchanted" + return itemname == "mcl_books:book" or itemname == "mcl_enchanting:book_enchanted" or + itemname == "mcl_books:book_enchanted" end function mcl_enchanting.get_enchantments(itemstack) @@ -54,11 +55,13 @@ end function mcl_enchanting.get_enchantment_description(enchantment, level) local enchantment_def = mcl_enchanting.enchantments[enchantment] - return enchantment_def.name .. (enchantment_def.max_level == 1 and "" or " " .. mcl_enchanting.roman_numerals.toRoman(level)) + return enchantment_def.name .. + (enchantment_def.max_level == 1 and "" or " " .. mcl_enchanting.roman_numerals.toRoman(level)) end function mcl_enchanting.get_colorized_enchantment_description(enchantment, level) - return minetest.colorize(mcl_enchanting.enchantments[enchantment].curse and mcl_colors.RED or mcl_colors.GRAY, mcl_enchanting.get_enchantment_description(enchantment, level)) + return minetest.colorize(mcl_enchanting.enchantments[enchantment].curse and mcl_colors.RED or mcl_colors.GRAY, + mcl_enchanting.get_enchantment_description(enchantment, level)) end function mcl_enchanting.get_enchanted_itemstring(itemname) @@ -169,7 +172,9 @@ function mcl_enchanting.combine(itemstack, combine_with) local itemname = itemstack:get_name() local combine_name = combine_with:get_name() local enchanted_itemname = mcl_enchanting.get_enchanted_itemstring(itemname) - if not enchanted_itemname or enchanted_itemname ~= mcl_enchanting.get_enchanted_itemstring(combine_name) and not mcl_enchanting.is_book(combine_name) then + if not enchanted_itemname or + enchanted_itemname ~= mcl_enchanting.get_enchanted_itemstring(combine_name) and + not mcl_enchanting.is_book(combine_name) then return false end local enchantments = mcl_enchanting.get_enchantments(itemstack) @@ -219,7 +224,7 @@ function mcl_enchanting.enchantments_snippet(_, _, itemstack) local enchantments = mcl_enchanting.get_enchantments(itemstack) local text = "" for enchantment, level in pairs(enchantments) do - text = text .. mcl_enchanting.get_colorized_enchantment_description(enchantment, level) .. "\n" + text = text .. mcl_enchanting.get_colorized_enchantment_description(enchantment, level) .. "\n" end if text ~= "" then if not itemstack:get_definition()._tt_original_description then @@ -267,7 +272,7 @@ function mcl_enchanting.initialize() for itemname, itemdef in pairs(minetest.registered_items) do if mcl_enchanting.can_enchant_freshly(itemname) and not mcl_enchanting.is_book(itemname) then local new_name = itemname .. "_enchanted" - minetest.override_item(itemname, {_mcl_enchanting_enchanted_tool = new_name}) + minetest.override_item(itemname, { _mcl_enchanting_enchanted_tool = new_name }) local new_def = table.copy(itemdef) new_def.inventory_image = itemdef.inventory_image .. mcl_enchanting.overlay if new_def.wield_image then @@ -303,7 +308,7 @@ end function mcl_enchanting.random(pr, ...) local r = pr and pr:next(...) or math.random(...) - if pr and not ({...})[1] then + if pr and not ({ ... })[1] then r = r / 32767 end @@ -328,20 +333,24 @@ function mcl_enchanting.get_random_enchantment(itemstack, treasure, weighted, ex return #possible > 0 and possible[mcl_enchanting.random(pr, 1, #possible)] end -function mcl_enchanting.generate_random_enchantments(itemstack, enchantment_level, treasure, no_reduced_bonus_chance, ignore_already_enchanted, pr) +function mcl_enchanting.generate_random_enchantments(itemstack, enchantment_level, treasure, no_reduced_bonus_chance, + ignore_already_enchanted, pr) local itemname = itemstack:get_name() - if (not mcl_enchanting.can_enchant_freshly(itemname) and not ignore_already_enchanted) or mcl_enchanting.not_enchantable_on_enchanting_table(itemname) then + if (not mcl_enchanting.can_enchant_freshly(itemname) and not ignore_already_enchanted) or + mcl_enchanting.not_enchantable_on_enchanting_table(itemname) then return end itemstack = ItemStack(itemstack) local enchantability = minetest.get_item_group(itemname, "enchantability") - enchantability = 1 + mcl_enchanting.random(pr, 0, math.floor(enchantability / 4)) + mcl_enchanting.random(pr, 0, math.floor(enchantability / 4)) + enchantability = 1 + mcl_enchanting.random(pr, 0, math.floor(enchantability / 4)) + + mcl_enchanting.random(pr, 0, math.floor(enchantability / 4)) enchantment_level = enchantment_level + enchantability - enchantment_level = enchantment_level + enchantment_level * (mcl_enchanting.random(pr) + mcl_enchanting.random(pr) - 1) * 0.15 + enchantment_level = enchantment_level + + enchantment_level * (mcl_enchanting.random(pr) + mcl_enchanting.random(pr) - 1) * 0.15 enchantment_level = math.max(math.floor(enchantment_level + 0.5), 1) local enchantments = {} @@ -393,18 +402,22 @@ function mcl_enchanting.generate_random_enchantments(itemstack, enchantment_leve return enchantments, description end -function mcl_enchanting.generate_random_enchantments_reliable(itemstack, enchantment_level, treasure, no_reduced_bonus_chance, ignore_already_enchanted, pr) +function mcl_enchanting.generate_random_enchantments_reliable(itemstack, enchantment_level, treasure, + no_reduced_bonus_chance, ignore_already_enchanted, pr) local enchantments repeat - enchantments = mcl_enchanting.generate_random_enchantments(itemstack, enchantment_level, treasure, no_reduced_bonus_chance, ignore_already_enchanted, pr) + enchantments = mcl_enchanting.generate_random_enchantments(itemstack, enchantment_level, treasure, + no_reduced_bonus_chance, ignore_already_enchanted, pr) until enchantments return enchantments end -function mcl_enchanting.enchant_randomly(itemstack, enchantment_level, treasure, no_reduced_bonus_chance, ignore_already_enchanted, pr) - local enchantments = mcl_enchanting.generate_random_enchantments_reliable(itemstack, enchantment_level, treasure, no_reduced_bonus_chance, ignore_already_enchanted, pr) +function mcl_enchanting.enchant_randomly(itemstack, enchantment_level, treasure, no_reduced_bonus_chance, + ignore_already_enchanted, pr) + local enchantments = mcl_enchanting.generate_random_enchantments_reliable(itemstack, enchantment_level, treasure, + no_reduced_bonus_chance, ignore_already_enchanted, pr) mcl_enchanting.set_enchanted_itemstring(itemstack) mcl_enchanting.set_enchantments(itemstack, enchantments) @@ -416,7 +429,8 @@ function mcl_enchanting.enchant_uniform_randomly(stack, exclude, pr) local enchantment = mcl_enchanting.get_random_enchantment(stack, true, false, exclude, pr) if enchantment then - mcl_enchanting.enchant(stack, enchantment, mcl_enchanting.random(pr, 1, mcl_enchanting.enchantments[enchantment].max_level)) + mcl_enchanting.enchant(stack, enchantment, + mcl_enchanting.random(pr, 1, mcl_enchanting.enchantments[enchantment].max_level)) end return stack @@ -426,7 +440,8 @@ function mcl_enchanting.get_random_glyph_row() local glyphs = "" local x = 1.3 for i = 1, 9 do - glyphs = glyphs .. "image[".. x .. ",0.1;0.5,0.5;mcl_enchanting_glyph_" .. math.random(18) .. ".png^[colorize:#675D49:255]" + glyphs = glyphs .. + "image[" .. x .. ",0.1;0.5,0.5;mcl_enchanting_glyph_" .. math.random(18) .. ".png^[colorize:#675D49:255]" x = x + 0.6 end return glyphs @@ -459,7 +474,7 @@ end function mcl_enchanting.get_table_slots(player, itemstack, num_bookshelves) local itemname = itemstack:get_name() if (not mcl_enchanting.can_enchant_freshly(itemname)) or mcl_enchanting.not_enchantable_on_enchanting_table(itemname) then - return {false, false, false} + return { false, false, false } end local meta = player:get_meta() local player_slots = minetest.deserialize(meta:get_string("mcl_enchanting:slots")) or {} @@ -475,7 +490,7 @@ function mcl_enchanting.get_table_slots(player, itemstack, num_bookshelves) meta:set_string("mcl_enchanting:slots", minetest.serialize(player_slots)) return player_bookshelves_item_slots else - return {false, false, false} + return { false, false, false } end end end @@ -491,28 +506,37 @@ function mcl_enchanting.show_enchanting_formspec(player) local inv = player:get_inventory() local num_bookshelves = meta:get_int("mcl_enchanting:num_bookshelves") local table_name = meta:get_string("mcl_enchanting:table_name") - local formspec = "" - .. "size[9.07,8.6;]" - .. "formspec_version[3]" - .. "label[0,0;" .. C("#313131") .. F(table_name) .. "]" - .. mcl_formspec.get_itemslot_bg(0.2, 2.4, 1, 1) - .. "list[current_player;enchanting_item;0.2,2.4;1,1]" - .. mcl_formspec.get_itemslot_bg(1.1, 2.4, 1, 1) - .. "image[1.1,2.4;1,1;mcl_enchanting_lapis_background.png]" - .. "list[current_player;enchanting_lapis;1.1,2.4;1,1]" - .. "label[0,4;" .. C("#313131") .. F(S("Inventory")).."]" - .. mcl_formspec.get_itemslot_bg(0, 4.5, 9, 3) - .. mcl_formspec.get_itemslot_bg(0, 7.74, 9, 1) - .. "list[current_player;main;0,4.5;9,3;9]" - .. "listring[current_player;enchanting_item]" - .. "listring[current_player;main]" - .. "listring[current_player;enchanting]" - .. "listring[current_player;main]" - .. "listring[current_player;enchanting_lapis]" - .. "listring[current_player;main]" - .. "list[current_player;main;0,7.74;9,1;]" - .. "real_coordinates[true]" - .. "image[3.15,0.6;7.6,4.1;mcl_enchanting_button_background.png]" + + local formspec = table.concat({ + "formspec_version[4]", + "size[11.75,10.425]", + + "label[0.375,0.375;" .. F(C(mcl_formspec.label_color) .. table_name) .. "]", + + mcl_formspec.get_itemslot_bg_v4(1, 3.25, 1, 1), + "list[current_player;enchanting_item;1,3.25;1,1]", + mcl_formspec.get_itemslot_bg_v4(2.25, 3.25, 1, 1), + "list[current_player;enchanting_lapis;2.25,3.25;1,1]", + "image[2.25,2.4;1,1;mcl_enchanting_lapis_background.png]", + + "image[4.125,0.375;7.25,4.1;mcl_enchanting_button_background.png]", + + "label[0.375,4.7;" .. F(C(mcl_formspec.label_color) .. S("Inventory")) .. "]", + + mcl_formspec.get_itemslot_bg_v4(0.375, 5.1, 9, 3), + "list[current_player;main;0.375,5.1;9,3;9]", + + mcl_formspec.get_itemslot_bg_v4(0.375, 9.05, 9, 1), + "list[current_player;main;0.375,9.05;9,1;]", + + "listring[current_player;enchanting_item]", + "listring[current_player;main]", + "listring[current_player;enchanting]", + "listring[current_player;main]", + "listring[current_player;enchanting_lapis]", + "listring[current_player;main]", + }) + local itemstack = inv:get_stack("enchanting_item", 1) local player_levels = mcl_experience.get_level(player) local y = 0.65 @@ -526,18 +550,43 @@ function mcl_enchanting.show_enchanting_formspec(player) local ending = (can_enchant and "" or "_off") local hover_ending = (can_enchant and "_hovered" or "_off") formspec = formspec - .. "container[3.2," .. y .. "]" - .. (slot and "tooltip[button_" .. i .. ";" .. C("#818181") .. ((slot.description and F(slot.description)) or "") .. " " .. C("#FFFFFF") .. " . . . ?\n\n" .. (enough_levels and C(enough_lapis and "#818181" or "#FC5454") .. F(S("@1 Lapis Lazuli", i)) .. "\n" .. C("#818181") .. F(S("@1 Enchantment Levels", i)) or C("#FC5454") .. F(S("Level requirement: @1", slot.level_requirement))) .. "]" or "") - .. "style[button_" .. i .. ";bgimg=mcl_enchanting_button" .. ending .. ".png;bgimg_hovered=mcl_enchanting_button" .. hover_ending .. ".png;bgimg_pressed=mcl_enchanting_button" .. hover_ending .. ".png]" + .. "container[4.125," .. y .. "]" + .. + ( + slot and + "tooltip[button_" .. + i .. + ";" .. + C("#818181") .. + ((slot.description and F(slot.description)) or "") .. + " " .. + C("#FFFFFF") .. + " . . . ?\n\n" .. + ( + enough_levels and + C(enough_lapis and "#818181" or "#FC5454") .. + F(S("@1 Lapis Lazuli", i)) .. "\n" .. C("#818181") .. F(S("@1 Enchantment Levels", i)) or + C("#FC5454") .. F(S("Level requirement: @1", slot.level_requirement))) .. "]" or "") + .. + "style[button_" .. + i .. + ";bgimg=mcl_enchanting_button" .. + ending .. + ".png;bgimg_hovered=mcl_enchanting_button" .. + hover_ending .. ".png;bgimg_pressed=mcl_enchanting_button" .. hover_ending .. ".png]" .. "button[0,0;7.5,1.3;button_" .. i .. ";]" .. (slot and "image[0,0;1.3,1.3;mcl_enchanting_number_" .. i .. ending .. ".png]" or "") - .. (slot and "label[7.2,1.1;" .. C(can_enchant and "#80FF20" or "#407F10") .. slot.level_requirement .. "]" or "") + .. (slot and "label[6.8,1;" .. C(can_enchant and "#80FF20" or "#407F10") .. slot.level_requirement .. "]" or "") .. (slot and slot.glyphs or "") .. "container_end[]" - y = y + 1.35 + y = y + 1.3 end formspec = formspec - .. "image[" .. (any_enchantment and 0.58 or 1.15) .. ",1.2;" .. (any_enchantment and 2 or 0.87) .. ",1.43;mcl_enchanting_book_" .. (any_enchantment and "open" or "closed") .. ".png]" + .. + "image[" .. + (any_enchantment and 1.1 or 1.67) .. + ",1.2;" .. + (any_enchantment and 2 or 0.87) .. ",1.43;mcl_enchanting_book_" .. (any_enchantment and "open" or "closed") .. ".png]" minetest.show_formspec(name, "mcl_enchanting:table", formspec) end @@ -573,7 +622,7 @@ function mcl_enchanting.handle_formspec_fields(player, formname, fields) mcl_enchanting.set_enchanted_itemstring(itemstack) mcl_enchanting.set_enchantments(itemstack, slot.enchantments) inv:set_stack("enchanting_item", 1, itemstack) - minetest.sound_play("mcl_enchanting_enchant", {to_player = name, gain = 5.0}) + minetest.sound_play("mcl_enchanting_enchant", { to_player = name, gain = 5.0 }) mcl_enchanting.reset_table_slots(player) mcl_enchanting.show_enchanting_formspec(player) awards.unlock(player:get_player_name(), "mcl:enchanter") @@ -645,13 +694,16 @@ function mcl_enchanting.on_inventory_action(player, action, inventory, inventory end function mcl_enchanting.schedule_book_animation(self, anim) - self.scheduled_anim = {timer = self.anim_length, anim = anim} + self.scheduled_anim = { timer = self.anim_length, anim = anim } end function mcl_enchanting.set_book_animation(self, anim) local anim_index = mcl_enchanting.book_animations[anim] - local start, stop = mcl_enchanting.book_animation_steps[anim_index], mcl_enchanting.book_animation_steps[anim_index + 1] - self.object:set_animation({x = start, y = stop}, mcl_enchanting.book_animation_speed, 0, mcl_enchanting.book_animation_loop[anim] or false) + local start, stop = mcl_enchanting.book_animation_steps[anim_index], + mcl_enchanting.book_animation_steps[anim_index + 1 + ] + self.object:set_animation({ x = start, y = stop }, mcl_enchanting.book_animation_speed, 0, + mcl_enchanting.book_animation_loop[anim] or false) self.scheduled_anim = nil self.anim_length = (stop - start) / 40 end @@ -661,7 +713,7 @@ function mcl_enchanting.check_animation_schedule(self, dtime) if schedanim then schedanim.timer = schedanim.timer - dtime if schedanim.timer <= 0 then - mcl_enchanting.set_book_animation(self, schedanim.anim) + mcl_enchanting.set_book_animation(self, schedanim.anim) end end end @@ -669,7 +721,7 @@ end function mcl_enchanting.look_at(self, pos2) local pos1 = self.object:get_pos() local vec = vector.subtract(pos1, pos2) - local yaw = math.atan(vec.z / vec.x) - math.pi/2 + local yaw = math.atan(vec.z / vec.x) - math.pi / 2 yaw = yaw + (pos1.x >= pos2.x and math.pi or 0) self.object:set_yaw(yaw + math.pi) end From e5ee0c4afc618c4989e2d86a3aa7bd51acef6714 Mon Sep 17 00:00:00 2001 From: AFCMS Date: Sat, 10 Sep 2022 14:14:12 +0200 Subject: [PATCH 095/982] Crafting table formspec redo --- mods/ITEMS/mcl_crafting_table/init.lua | 79 ++++++++++++++++---------- 1 file changed, 48 insertions(+), 31 deletions(-) diff --git a/mods/ITEMS/mcl_crafting_table/init.lua b/mods/ITEMS/mcl_crafting_table/init.lua index 7f6b9ccc5..2f114362d 100644 --- a/mods/ITEMS/mcl_crafting_table/init.lua +++ b/mods/ITEMS/mcl_crafting_table/init.lua @@ -1,34 +1,51 @@ +---@diagnostic disable lowercase-global + local S = minetest.get_translator(minetest.get_current_modname()) -local formspec_escape = minetest.formspec_escape -local show_formspec = minetest.show_formspec +local F = minetest.formspec_escape local C = minetest.colorize -local text_color = "#313131" -local itemslot_bg = mcl_formspec.get_itemslot_bg +local show_formspec = minetest.show_formspec mcl_crafting_table = {} -function mcl_crafting_table.show_crafting_form(player) - player:get_inventory():set_width("craft", 3) - player:get_inventory():set_size("craft", 9) +mcl_crafting_table.formspec = table.concat({ + "formspec_version[4]", + "size[11.75,10.425]", - show_formspec(player:get_player_name(), "main", - "size[9,8.75]".. - "image[4.7,1.5;1.5,1;gui_crafting_arrow.png]".. - "label[0,4;"..formspec_escape(C(text_color, S("Inventory"))).."]".. - "list[current_player;main;0,4.5;9,3;9]".. - itemslot_bg(0,4.5,9,3).. - "list[current_player;main;0,7.74;9,1;]".. - itemslot_bg(0,7.74,9,1).. - "label[1.75,0;"..formspec_escape(C(text_color, S("Crafting"))).."]".. - "list[current_player;craft;1.75,0.5;3,3;]".. - itemslot_bg(1.75,0.5,3,3).. - "list[current_player;craftpreview;6.1,1.5;1,1;]".. - itemslot_bg(6.1,1.5,1,1).. - "image_button[0.75,1.5;1,1;craftguide_book.png;__mcl_craftguide;]".. - "tooltip[__mcl_craftguide;"..formspec_escape(S("Recipe book")).."]".. - "listring[current_player;main]".. - "listring[current_player;craft]" - ) + "label[2.25,0.375;" .. F(C(mcl_formspec.label_color, S("Crafting"))) .. "]", + + mcl_formspec.get_itemslot_bg_v4(2.25, 0.75, 3, 3), + "list[current_player;craft;2.25,0.75;3,3;]", + + "image[6.125,2;1.5,1;gui_crafting_arrow.png]", + + mcl_formspec.get_itemslot_bg_v4(8.2, 2, 1, 1, 0.2), + "list[current_player;craftpreview;8.2,2;1,1;]", + + "label[0.375,4.7;" .. F(C(mcl_formspec.label_color, S("Inventory"))) .. "]", + + mcl_formspec.get_itemslot_bg_v4(0.375, 5.1, 9, 3), + "list[current_player;main;0.375,5.1;9,3;9]", + + mcl_formspec.get_itemslot_bg_v4(0.375, 9.05, 9, 1), + "list[current_player;main;0.375,9.05;9,1;]", + + "listring[current_player;craft]", + "listring[current_player;main]", + + --Crafting guide button + "image_button[0.325,1.95;1.1,1.1;craftguide_book.png;__mcl_craftguide;]", + "tooltip[__mcl_craftguide;" .. F(S("Recipe book")) .. "]", +}) + +---@param player ObjectRef +function mcl_crafting_table.show_crafting_form(player) + local inv = player:get_inventory() + if inv then + inv:set_width("craft", 3) + inv:set_size("craft", 9) + end + + show_formspec(player:get_player_name(), "main", mcl_crafting_table.formspec) end minetest.register_node("mcl_crafting_table:crafting_table", { @@ -38,10 +55,10 @@ minetest.register_node("mcl_crafting_table:crafting_table", { _doc_items_usagehelp = S("Rightclick the crafting table to access the 3×3 crafting grid."), _doc_items_hidden = false, is_ground_content = false, - tiles = {"crafting_workbench_top.png", "default_wood.png", "crafting_workbench_side.png", - "crafting_workbench_side.png", "crafting_workbench_front.png", "crafting_workbench_front.png"}, + tiles = { "crafting_workbench_top.png", "default_wood.png", "crafting_workbench_side.png", + "crafting_workbench_side.png", "crafting_workbench_front.png", "crafting_workbench_front.png" }, paramtype2 = "facedir", - groups = {handy=1,axey=1, deco_block=1, material_wood=1,flammable=-1}, + groups = { handy = 1, axey = 1, deco_block = 1, material_wood = 1, flammable = -1 }, on_rightclick = function(pos, node, player, itemstack) if not player:get_player_control().sneak then mcl_crafting_table.show_crafting_form(player) @@ -55,9 +72,9 @@ minetest.register_node("mcl_crafting_table:crafting_table", { minetest.register_craft({ output = "mcl_crafting_table:crafting_table", recipe = { - {"group:wood", "group:wood"}, - {"group:wood", "group:wood"} - } + { "group:wood", "group:wood" }, + { "group:wood", "group:wood" } + }, }) minetest.register_craft({ From 0ae76776b1e6b20b8b6bb523ef8d50fff053cc3e Mon Sep 17 00:00:00 2001 From: AFCMS Date: Sat, 10 Sep 2022 14:28:26 +0200 Subject: [PATCH 096/982] Bookshelf menu redo --- mods/ITEMS/mcl_books/init.lua | 142 ++++++++++++++++++---------------- 1 file changed, 77 insertions(+), 65 deletions(-) diff --git a/mods/ITEMS/mcl_books/init.lua b/mods/ITEMS/mcl_books/init.lua index af84feb66..e8c53ed8a 100644 --- a/mods/ITEMS/mcl_books/init.lua +++ b/mods/ITEMS/mcl_books/init.lua @@ -5,7 +5,7 @@ local C = minetest.colorize local max_text_length = 4500 -- TODO: Increase to 12800 when scroll bar was added to written book local max_title_length = 64 -local bookshelf_inv = minetest.settings:get_bool("mcl_bookshelf_inventories",true) +local bookshelf_inv = minetest.settings:get_bool("mcl_bookshelf_inventories", true) local header = "" if minetest.get_modpath("mcl_init") then @@ -19,7 +19,7 @@ minetest.register_craftitem("mcl_books:book", { _doc_items_longdesc = S("Books are used to make bookshelves and book and quills."), inventory_image = "default_book.png", stack_max = 64, - groups = { book=1, craftitem = 1, enchantability = 1 }, + groups = { book = 1, craftitem = 1, enchantability = 1 }, _mcl_enchanting_enchanted_tool = "mcl_enchanting:book_enchanted", }) @@ -91,12 +91,12 @@ local function write(itemstack, user, pointed_thing) end local text = get_text(itemstack) - local formspec = "size[8,9]".. - header.. - "background[-0.5,-0.5;9,10;mcl_books_book_bg.png]".. - "textarea[0.75,0.1;7.25,9;text;;"..minetest.formspec_escape(text).."]".. - "button[0.75,7.95;3,1;sign;"..minetest.formspec_escape(S("Sign")).."]".. - "button_exit[4.25,7.95;3,1;ok;"..minetest.formspec_escape(S("Done")).."]" + local formspec = "size[8,9]" .. + header .. + "background[-0.5,-0.5;9,10;mcl_books_book_bg.png]" .. + "textarea[0.75,0.1;7.25,9;text;;" .. minetest.formspec_escape(text) .. "]" .. + "button[0.75,7.95;3,1;sign;" .. minetest.formspec_escape(S("Sign")) .. "]" .. + "button_exit[4.25,7.95;3,1;ok;" .. minetest.formspec_escape(S("Done")) .. "]" minetest.show_formspec(user:get_player_name(), "mcl_books:writable_book", formspec) end @@ -112,11 +112,11 @@ local function read(itemstack, user, pointed_thing) end local text = get_text(itemstack) - local formspec = "size[8,9]".. - header.. - "background[-0.5,-0.5;9,10;mcl_books_book_bg.png]".. - "textarea[0.75,0.1;7.25,9;;"..minetest.formspec_escape(text)..";]".. - "button_exit[2.25,7.95;3,1;ok;"..minetest.formspec_escape(S("Done")).."]" + local formspec = "size[8,9]" .. + header .. + "background[-0.5,-0.5;9,10;mcl_books_book_bg.png]" .. + "textarea[0.75,0.1;7.25,9;;" .. minetest.formspec_escape(text) .. ";]" .. + "button_exit[2.25,7.95;3,1;ok;" .. minetest.formspec_escape(S("Done")) .. "]" minetest.show_formspec(user:get_player_name(), "mcl_books:written_book", formspec) end @@ -125,16 +125,17 @@ minetest.register_craftitem("mcl_books:writable_book", { description = S("Book and Quill"), _tt_help = S("Write down some notes"), _doc_items_longdesc = S("This item can be used to write down some notes."), - _doc_items_usagehelp = S("Hold it in the hand, then rightclick to read the current notes and edit then. You can edit the text as often as you like. You can also sign the book which turns it into a written book which you can stack, but it can't be edited anymore.").."\n".. - S("A book can hold up to 4500 characters. The title length is limited to 64 characters."), + _doc_items_usagehelp = S("Hold it in the hand, then rightclick to read the current notes and edit then. You can edit the text as often as you like. You can also sign the book which turns it into a written book which you can stack, but it can't be edited anymore.") + .. "\n" .. + S("A book can hold up to 4500 characters. The title length is limited to 64 characters."), inventory_image = "mcl_books_book_writable.png", - groups = { book=1 }, + groups = { book = 1 }, stack_max = 1, on_place = write, on_secondary_use = write, }) -minetest.register_on_player_receive_fields(function ( player, formname, fields ) +minetest.register_on_player_receive_fields(function(player, formname, fields) if ((formname == "mcl_books:writable_book") and fields and fields.text) then local stack = player:get_wielded_item() if (stack:get_name() and (stack:get_name() == "mcl_books:writable_book")) then @@ -148,14 +149,16 @@ minetest.register_on_player_receive_fields(function ( player, formname, fields ) player:set_wielded_item(stack) local name = player:get_player_name() - local formspec = "size[8,9]".. - header.. - "background[-0.5,-0.5;9,10;mcl_books_book_bg.png]".. - "field[0.75,1;7.25,1;title;"..minetest.formspec_escape(minetest.colorize("#000000", S("Enter book title:")))..";]".. - "label[0.75,1.5;"..minetest.formspec_escape(minetest.colorize("#404040", S("by @1", name))).."]".. - "button_exit[0.75,7.95;3,1;sign;"..minetest.formspec_escape(S("Sign and Close")).."]".. - "tooltip[sign;"..minetest.formspec_escape(S("Note: The book will no longer be editable after signing")).."]".. - "button[4.25,7.95;3,1;cancel;"..minetest.formspec_escape(S("Cancel")).."]" + local formspec = "size[8,9]" .. + header .. + "background[-0.5,-0.5;9,10;mcl_books_book_bg.png]" .. + "field[0.75,1;7.25,1;title;" .. + minetest.formspec_escape(minetest.colorize("#000000", S("Enter book title:"))) .. ";]" .. + "label[0.75,1.5;" .. minetest.formspec_escape(minetest.colorize("#404040", S("by @1", name))) .. "]" .. + "button_exit[0.75,7.95;3,1;sign;" .. minetest.formspec_escape(S("Sign and Close")) .. "]" .. + "tooltip[sign;" .. + minetest.formspec_escape(S("Note: The book will no longer be editable after signing")) .. "]" .. + "button[4.25,7.95;3,1;cancel;" .. minetest.formspec_escape(S("Cancel")) .. "]" minetest.show_formspec(player:get_player_name(), "mcl_books:signing", formspec) end end @@ -181,7 +184,7 @@ minetest.register_on_player_receive_fields(function ( player, formname, fields ) player:set_wielded_item(newbook) else - minetest.log("error", "[mcl_books] "..name.." failed to sign a book!") + minetest.log("error", "[mcl_books] " .. name .. " failed to sign a book!") end elseif ((formname == "mcl_books:signing") and fields and fields.cancel) then local book = player:get_wielded_item() @@ -203,11 +206,11 @@ end minetest.register_craftitem("mcl_books:written_book", { description = S("Written Book"), _doc_items_longdesc = S("Written books contain some text written by someone. They can be read and copied, but not edited."), - _doc_items_usagehelp = S("Hold it in your hand, then rightclick to read the book.").."\n\n".. + _doc_items_usagehelp = S("Hold it in your hand, then rightclick to read the book.") .. "\n\n" .. -S("To copy the text of the written book, place it into the crafting grid together with a book and quill (or multiple of those) and craft. The written book will not be consumed. Copies of copies can not be copied."), + S("To copy the text of the written book, place it into the crafting grid together with a book and quill (or multiple of those) and craft. The written book will not be consumed. Copies of copies can not be copied."), inventory_image = "mcl_books_book_written.png", - groups = { not_in_creative_inventory=1, book=1, no_rename=1 }, + groups = { not_in_creative_inventory = 1, book = 1, no_rename = 1 }, stack_max = 16, on_place = read, on_secondary_use = read @@ -219,19 +222,19 @@ S("To copy the text of the written book, place it into the crafting grid togethe local baq = "mcl_books:writable_book" local wb = "mcl_books:written_book" local recipes = { - {wb, baq}, - {baq, baq, wb}, - {baq, baq, wb, baq}, - {baq, baq, baq, baq, wb}, - {baq, baq, baq, baq, wb, baq}, - {baq, baq, baq, baq, wb, baq, baq}, - {baq, baq, baq, baq, wb, baq, baq, baq}, - {baq, baq, baq, baq, wb, baq, baq, baq, baq}, + { wb, baq }, + { baq, baq, wb }, + { baq, baq, wb, baq }, + { baq, baq, baq, baq, wb }, + { baq, baq, baq, baq, wb, baq }, + { baq, baq, baq, baq, wb, baq, baq }, + { baq, baq, baq, baq, wb, baq, baq, baq }, + { baq, baq, baq, baq, wb, baq, baq, baq, baq }, } -for r=#recipes, 1, -1 do +for r = #recipes, 1, -1 do minetest.register_craft({ type = "shapeless", - output = "mcl_books:written_book "..r, + output = "mcl_books:written_book " .. r, recipe = recipes[r], }) end @@ -367,6 +370,9 @@ local function protection_check_put_take(pos, listname, index, stack, player) end end +---@param pos Vector +---@param node node +---@param clicker ObjectRef local function bookshelf_gui(pos, node, clicker) if not bookshelf_inv then return end local name = minetest.get_meta(pos):get_string("name") @@ -378,18 +384,25 @@ local function bookshelf_gui(pos, node, clicker) local playername = clicker:get_player_name() minetest.show_formspec(playername, - "mcl_books:bookshelf_"..pos.x.."_"..pos.y.."_"..pos.z, + "mcl_books:bookshelf_" .. pos.x .. "_" .. pos.y .. "_" .. pos.z, table.concat({ - "size[9,8.75]", - "label[0,0;"..F(C("#313131", name)).."]", - "list[nodemeta:"..pos.x..","..pos.y..","..pos.z..";main;0,0.5;9,3;]", - mcl_formspec.get_itemslot_bg(0, 0.5, 9, 3), - "label[0,4.0;"..F(C("#313131", S("Inventory"))).."]", - "list[current_player;main;0,4.5;9,3;9]", - mcl_formspec.get_itemslot_bg(0, 4.5, 9, 3), - "list[current_player;main;0,7.74;9,1;]", - mcl_formspec.get_itemslot_bg(0, 7.74, 9, 1), - "listring[nodemeta:"..pos.x..","..pos.y..","..pos.z..";main]", + "formspec_version[4]", + "size[11.75,10.425]", + + "label[0.375,0.375;" .. F(C(mcl_formspec.label_color, name)) .. "]", + + mcl_formspec.get_itemslot_bg_v4(0.375, 0.75, 9, 3), + "list[nodemeta:" .. pos.x .. "," .. pos.y .. "," .. pos.z .. ";main;0.375,0.75;9,3;]", + + "label[0.375,4.7;" .. F(C(mcl_formspec.label_color, S("Inventory"))) .. "]", + + mcl_formspec.get_itemslot_bg_v4(0.375, 5.1, 9, 3), + "list[current_player;main;0.375,5.1;9,3;9]", + + mcl_formspec.get_itemslot_bg_v4(0.375, 9.05, 9, 1), + "list[current_player;main;0.375,9.05;9,1;]", + + "listring[nodemeta:" .. pos.x .. "," .. pos.y .. "," .. pos.z .. ";main]", "listring[current_player;main]", }) ) @@ -397,7 +410,7 @@ end local function close_forms(pos) local players = minetest.get_connected_players() - local formname = "mcl_books:bookshelf_"..pos.x.."_"..pos.y.."_"..pos.z + local formname = "mcl_books:bookshelf_" .. pos.x .. "_" .. pos.y .. "_" .. pos.z for p = 1, #players do if vector.distance(players[p]:get_pos(), pos) <= 30 then minetest.close_formspec(players[p]:get_player_name(), formname) @@ -409,12 +422,12 @@ end minetest.register_node("mcl_books:bookshelf", { description = S("Bookshelf"), _doc_items_longdesc = S("Bookshelves are used for decoration."), - tiles = {"mcl_books_bookshelf_top.png", "mcl_books_bookshelf_top.png", "default_bookshelf.png"}, + tiles = { "mcl_books_bookshelf_top.png", "mcl_books_bookshelf_top.png", "default_bookshelf.png" }, stack_max = 64, is_ground_content = false, groups = { - handy=1, axey=1, deco_block=1, material_wood=1, - flammable=3, fire_encouragement=30, fire_flammability=20, container=1 + handy = 1, axey = 1, deco_block = 1, material_wood = 1, + flammable = 3, fire_encouragement = 30, fire_flammability = 20, container = 1 }, drop = "mcl_books:book 3", sounds = wood_sound, @@ -424,7 +437,7 @@ minetest.register_node("mcl_books:bookshelf", { on_construct = function(pos) local meta = minetest.get_meta(pos) local inv = meta:get_inventory() - inv:set_size("main", 9*3) + inv:set_size("main", 9 * 3) end, after_place_node = function(pos, placer, itemstack, pointed_thing) minetest.get_meta(pos):set_string("name", itemstack:get_meta():get_string("name")) @@ -433,16 +446,16 @@ minetest.register_node("mcl_books:bookshelf", { allow_metadata_inventory_take = protection_check_put_take, allow_metadata_inventory_put = protection_check_put_take, on_metadata_inventory_move = function(pos, from_list, from_index, to_list, to_index, count, player) - minetest.log("action", player:get_player_name().. - " moves stuff in bookshelf at "..minetest.pos_to_string(pos)) + minetest.log("action", player:get_player_name() .. + " moves stuff in bookshelf at " .. minetest.pos_to_string(pos)) end, on_metadata_inventory_put = function(pos, listname, index, stack, player) - minetest.log("action", player:get_player_name().. - " moves stuff to bookshelf at "..minetest.pos_to_string(pos)) + minetest.log("action", player:get_player_name() .. + " moves stuff to bookshelf at " .. minetest.pos_to_string(pos)) end, on_metadata_inventory_take = function(pos, listname, index, stack, player) - minetest.log("action", player:get_player_name().. - " takes stuff from bookshelf at "..minetest.pos_to_string(pos)) + minetest.log("action", player:get_player_name() .. + " takes stuff from bookshelf at " .. minetest.pos_to_string(pos)) end, after_dig_node = drop_content, on_blast = on_blast, @@ -453,9 +466,9 @@ minetest.register_node("mcl_books:bookshelf", { minetest.register_craft({ output = "mcl_books:bookshelf", recipe = { - {"group:wood", "group:wood", "group:wood"}, - {"mcl_books:book", "mcl_books:book", "mcl_books:book"}, - {"group:wood", "group:wood", "group:wood"}, + { "group:wood", "group:wood", "group:wood" }, + { "mcl_books:book", "mcl_books:book", "mcl_books:book" }, + { "group:wood", "group:wood", "group:wood" }, } }) @@ -464,4 +477,3 @@ minetest.register_craft({ recipe = "mcl_books:bookshelf", burntime = 15, }) - From 0da1822d26c209ed57b3145f18e0320ae8b7315f Mon Sep 17 00:00:00 2001 From: AFCMS Date: Sat, 10 Sep 2022 18:32:37 +0200 Subject: [PATCH 097/982] Code style fixes in mcl_chests --- mods/ITEMS/mcl_chests/init.lua | 45 +++++++++++++++++----------------- 1 file changed, 22 insertions(+), 23 deletions(-) diff --git a/mods/ITEMS/mcl_chests/init.lua b/mods/ITEMS/mcl_chests/init.lua index fb4850759..8158b0a32 100644 --- a/mods/ITEMS/mcl_chests/init.lua +++ b/mods/ITEMS/mcl_chests/init.lua @@ -96,7 +96,8 @@ minetest.register_entity("mcl_chests:chest", { return end self:set_animation("close") - minetest.sound_play(self.sound_prefix .. "_close", { pos = self.node_pos, gain = 0.3, max_hear_distance = 16 }, + minetest.sound_play(self.sound_prefix .. "_close", + { pos = self.node_pos, gain = 0.3, max_hear_distance = 16 }, true) self.is_open = false end @@ -148,7 +149,8 @@ minetest.register_entity("mcl_chests:chest", { }) local function get_entity_pos(pos, dir, double) - pos = vector.new(pos) + pos = vector.copy(pos) + pos.y = pos.y - 0.49 if double then local add, mul, vec, cross = vector.add, vector.multiply, vector.new, vector.cross pos = add(pos, mul(cross(dir, vec(0, 1, 0)), -0.5)) @@ -398,10 +400,9 @@ local function register_chest(basename, desc, longdesc, usagehelp, tt_help, tile drawtype = "mesh", mesh = "mcl_chests_chest.b3d", tiles = small_textures, - use_texture_alpha = minetest.features.use_texture_alpha_string_modes and "opaque" or false, + use_texture_alpha = "opaque", paramtype = "light", paramtype2 = "facedir", - stack_max = 64, sounds = mcl_sounds.node_sound_wood_defaults(), groups = { deco_block = 1 }, on_construct = function(pos, node) @@ -436,14 +437,13 @@ local function register_chest(basename, desc, longdesc, usagehelp, tt_help, tile fixed = { -0.4375, -0.5, -0.4375, 0.4375, 0.375, 0.4375 }, }, tiles = { "blank.png^[resize:16x16" }, - use_texture_alpha = minetest.features.use_texture_alpha_string_modes and "clip" or true, + use_texture_alpha = "clip", _chest_entity_textures = small_textures, _chest_entity_sound = "default_chest", _chest_entity_mesh = "mcl_chests_chest", _chest_entity_animation_type = "chest", paramtype = "light", paramtype2 = "facedir", - stack_max = 64, drop = drop, groups = { handy = 1, @@ -585,7 +585,7 @@ local function register_chest(basename, desc, longdesc, usagehelp, tt_help, tile fixed = { -0.4375, -0.5, -0.4375, 0.5, 0.375, 0.4375 }, }, tiles = { "blank.png^[resize:16x16" }, - use_texture_alpha = minetest.features.use_texture_alpha_string_modes and "clip" or true, + use_texture_alpha = "clip", _chest_entity_textures = left_textures, _chest_entity_sound = "default_chest", _chest_entity_mesh = "mcl_chests_chest", @@ -761,7 +761,7 @@ local function register_chest(basename, desc, longdesc, usagehelp, tt_help, tile fixed = { -0.5, -0.5, -0.4375, 0.4375, 0.375, 0.4375 }, }, tiles = { "blank.png^[resize:16x16" }, - use_texture_alpha = minetest.features.use_texture_alpha_string_modes and "clip" or true, + use_texture_alpha = "clip", groups = { handy = 1, axey = 1, @@ -930,7 +930,7 @@ local chestusage = S("To access its inventory, rightclick it. When broken, the i register_chest("chest", S("Chest"), S( - "Chests are containers which provide 27 inventory slots. Chests can be turned into large chests with double the capacity by placing two chests next to each other.") + "Chests are containers which provide 27 inventory slots. Chests can be turned into large chests with double the capacity by placing two chests next to each other.") , chestusage, S("27 inventory slots") .. "\n" .. S("Can be combined to a large chest"), @@ -958,7 +958,7 @@ local traptiles = { register_chest("trapped_chest", S("Trapped Chest"), S( - "A trapped chest is a container which provides 27 inventory slots. When it is opened, it sends a redstone signal to its adjacent blocks as long it stays open. Trapped chests can be turned into large trapped chests with double the capacity by placing two trapped chests next to each other.") + "A trapped chest is a container which provides 27 inventory slots. When it is opened, it sends a redstone signal to its adjacent blocks as long it stays open. Trapped chests can be turned into large trapped chests with double the capacity by placing two trapped chests next to each other.") , chestusage, S("27 inventory slots") .. @@ -1086,20 +1086,19 @@ minetest.register_craft({ minetest.register_node("mcl_chests:ender_chest", { description = S("Ender Chest"), _tt_help = S("27 interdimensional inventory slots") .. - "\n" .. S("Put items inside, retrieve them from any ender chest"), + "\n" .. S("Put items inside, retrieve them from any ender chest"), _doc_items_longdesc = S( - "Ender chests grant you access to a single personal interdimensional inventory with 27 slots. This inventory is the same no matter from which ender chest you access it from. If you put one item into one ender chest, you will find it in all other ender chests. Each player will only see their own items, but not the items of other players."), + "Ender chests grant you access to a single personal interdimensional inventory with 27 slots. This inventory is the same no matter from which ender chest you access it from. If you put one item into one ender chest, you will find it in all other ender chests. Each player will only see their own items, but not the items of other players."), _doc_items_usagehelp = S("Rightclick the ender chest to access your personal interdimensional inventory."), drawtype = "mesh", mesh = "mcl_chests_chest.b3d", tiles = tiles_chest_ender_small, - use_texture_alpha = minetest.features.use_texture_alpha_string_modes and "opaque" or false, + use_texture_alpha = "opaque", paramtype = "light", paramtype2 = "facedir", - stack_max = 64, groups = { deco_block = 1 }, sounds = mcl_sounds.node_sound_stone_defaults(), - on_construct = function(pos, node) + on_construct = function(pos) local node = minetest.get_node(pos) node.name = "mcl_chests:ender_chest_small" minetest.set_node(pos, node) @@ -1128,9 +1127,9 @@ local formspec_ender_chest = table.concat({ minetest.register_node("mcl_chests:ender_chest_small", { description = S("Ender Chest"), _tt_help = S("27 interdimensional inventory slots") .. - "\n" .. S("Put items inside, retrieve them from any ender chest"), + "\n" .. S("Put items inside, retrieve them from any ender chest"), _doc_items_longdesc = S( - "Ender chests grant you access to a single personal interdimensional inventory with 27 slots. This inventory is the same no matter from which ender chest you access it from. If you put one item into one ender chest, you will find it in all other ender chests. Each player will only see their own items, but not the items of other players."), + "Ender chests grant you access to a single personal interdimensional inventory with 27 slots. This inventory is the same no matter from which ender chest you access it from. If you put one item into one ender chest, you will find it in all other ender chests. Each player will only see their own items, but not the items of other players."), _doc_items_usagehelp = S("Rightclick the ender chest to access your personal interdimensional inventory."), drawtype = "nodebox", node_box = { @@ -1142,7 +1141,7 @@ minetest.register_node("mcl_chests:ender_chest_small", { _chest_entity_mesh = "mcl_chests_chest", _chest_entity_animation_type = "chest", tiles = { "blank.png^[resize:16x16" }, - use_texture_alpha = minetest.features.use_texture_alpha_string_modes and "clip" or true, + use_texture_alpha = "clip", -- Note: The “container” group is missing here because the ender chest does not -- have an inventory on its own groups = { pickaxey = 1, deco_block = 1, material_stone = 1, chest_entity = 1, not_in_creative_inventory = 1 }, @@ -1157,7 +1156,7 @@ minetest.register_node("mcl_chests:ender_chest_small", { "mcl_chests_enderchest", "mcl_chests_chest", "chest") end, on_rightclick = function(pos, node, clicker) - if minetest.registered_nodes[minetest.get_node({ x = pos.x, y = pos.y + 1, z = pos.z }).name].groups.opaque == 1 then + if minetest.registered_nodes[minetest.get_node(vector.offset(pos, 0, 1, 0)).name].groups.opaque == 1 then -- won't open if there is no space from the top return false end @@ -1284,9 +1283,9 @@ for color, desc in pairs(boxtypes) do if mod_doc then if is_canonical then longdesc = S( - "A shulker box is a portable container which provides 27 inventory slots for any item except shulker boxes. Shulker boxes keep their inventory when broken, so shulker boxes as well as their contents can be taken as a single item. Shulker boxes come in many different colors.") + "A shulker box is a portable container which provides 27 inventory slots for any item except shulker boxes. Shulker boxes keep their inventory when broken, so shulker boxes as well as their contents can be taken as a single item. Shulker boxes come in many different colors.") usagehelp = S( - "To access the inventory of a shulker box, place and right-click it. To take a shulker box and its contents with you, just break and collect it, the items will not fall out. Place the shulker box again to be able to retrieve its contents.") + "To access the inventory of a shulker box, place and right-click it. To take a shulker box and its contents with you, just break and collect it, the items will not fall out. Place the shulker box again to be able to retrieve its contents.") entry_name = S("Shulker Box") else create_entry = false @@ -1303,7 +1302,7 @@ for color, desc in pairs(boxtypes) do _doc_items_longdesc = longdesc, _doc_items_usagehelp = usagehelp, tiles = { mob_texture }, - use_texture_alpha = minetest.features.use_texture_alpha_string_modes and "opaque" or false, + use_texture_alpha = "opaque", drawtype = "mesh", mesh = "mcl_chests_shulker.b3d", groups = { @@ -1374,7 +1373,7 @@ for color, desc in pairs(boxtypes) do fixed = { -0.48, -0.5, -0.48, 0.48, 0.489, 0.48 }, }, tiles = { "blank.png^[resize:16x16" }, - use_texture_alpha = minetest.features.use_texture_alpha_string_modes and "clip" or true, + use_texture_alpha = "clip", _chest_entity_textures = { mob_texture }, _chest_entity_sound = "mcl_chests_shulker", _chest_entity_mesh = "mcl_chests_shulker", From 093d55861ca47410b8c73419b6a49a46086f6720 Mon Sep 17 00:00:00 2001 From: AFCMS Date: Sat, 10 Sep 2022 18:38:46 +0200 Subject: [PATCH 098/982] Basic mcl_gamemode documentation --- mods/PLAYER/mcl_gamemode/API.md | 27 +++++++++++++++++++++++++++ 1 file changed, 27 insertions(+) create mode 100644 mods/PLAYER/mcl_gamemode/API.md diff --git a/mods/PLAYER/mcl_gamemode/API.md b/mods/PLAYER/mcl_gamemode/API.md new file mode 100644 index 000000000..24651301e --- /dev/null +++ b/mods/PLAYER/mcl_gamemode/API.md @@ -0,0 +1,27 @@ +# `mcl_gamemode` + +## `mcl_gamemode.gamemodes` + +List of availlable gamemodes. + +Currently `{"survival", "creative"}` + +## `mcl_gamemode.get_gamemode(player)` + +Get the player's gamemode. + +Returns "survival" or "creative". + +## `mcl_gamemode.set_gamemode(player, gamemode)` + +Set the player's gamemode. + +gamemode: "survival" or "creative" + +## `mcl_gamemode.register_on_gamemode_change(function(player, old_gamemode, new_gamemode))` + +Register a function that will be called when `mcl_gamemode.set_gamemode` is called. + +## `mcl_gamemode.registered_on_gamemode_change` + +Map of registered on_gamemode_change. From bf57cf3aa34a50554a90aa298dcc4fb522a30c91 Mon Sep 17 00:00:00 2001 From: AFCMS Date: Sat, 10 Sep 2022 21:51:40 +0200 Subject: [PATCH 099/982] Barrel formspec --- mods/ITEMS/mcl_barrels/init.lua | 94 ++++++++++++++++++++------------- 1 file changed, 56 insertions(+), 38 deletions(-) diff --git a/mods/ITEMS/mcl_barrels/init.lua b/mods/ITEMS/mcl_barrels/init.lua index 714a80f09..e2f46be28 100644 --- a/mods/ITEMS/mcl_barrels/init.lua +++ b/mods/ITEMS/mcl_barrels/init.lua @@ -8,6 +8,7 @@ local open_barrels = {} local drop_content = mcl_util.drop_items_from_meta_container("main") +---@param pos Vector local function on_blast(pos) local node = minetest.get_node(pos) drop_content(pos, node) @@ -45,30 +46,34 @@ local function barrel_open(pos, node, clicker) local playername = clicker:get_player_name() minetest.show_formspec(playername, - "mcl_barrels:barrel_"..pos.x.."_"..pos.y.."_"..pos.z, + "mcl_barrels:barrel_" .. pos.x .. "_" .. pos.y .. "_" .. pos.z, table.concat({ - "size[9,8.75]", - "label[0,0;"..F(C("#313131", name)).."]", - "list[nodemeta:"..pos.x..","..pos.y..","..pos.z..";main;0,0.5;9,3;]", - mcl_formspec.get_itemslot_bg(0, 0.5, 9, 3), - "label[0,4.0;"..F(C("#313131", S("Inventory"))).."]", - "list[current_player;main;0,4.5;9,3;9]", - mcl_formspec.get_itemslot_bg(0, 4.5, 9, 3), - "list[current_player;main;0,7.74;9,1;]", - mcl_formspec.get_itemslot_bg(0, 7.74, 9, 1), - "listring[nodemeta:"..pos.x..","..pos.y..","..pos.z..";main]", + "formspec_version[4]", + "size[11.75,10.425]", + + "label[0.375,0.375;" .. F(C(mcl_formspec.label_color, name)) .. "]", + mcl_formspec.get_itemslot_bg_v4(0.375, 0.75, 9, 3), + "list[nodemeta:" .. pos.x .. "," .. pos.y .. "," .. pos.z .. ";main;0.375,0.75;9,3;]", + "label[0.375,4.7;" .. F(C(mcl_formspec.label_color, S("Inventory"))) .. "]", + mcl_formspec.get_itemslot_bg_v4(0.375, 5.1, 9, 3), + "list[current_player;main;0.375,5.1;9,3;9]", + + mcl_formspec.get_itemslot_bg_v4(0.375, 9.05, 9, 1), + "list[current_player;main;0.375,9.05;9,1;]", + "listring[nodemeta:" .. pos.x .. "," .. pos.y .. "," .. pos.z .. ";main]", "listring[current_player;main]", }) ) - minetest.swap_node(pos, { name = "mcl_barrels:barrel_open", param2 = node.param2 }) + minetest.swap_node(pos, { name = "mcl_barrels:barrel_open", param2 = node.param2 }) open_barrels[playername] = pos - minetest.sound_play({name="mcl_barrels_default_barrel_open", pos=pos, gain=0.5, max_hear_distance=16}, true) + minetest.sound_play({ name = "mcl_barrels_default_barrel_open", pos = pos, gain = 0.5, max_hear_distance = 16 }, true) end +---@param pos Vector local function close_forms(pos) local players = minetest.get_connected_players() - local formname = "mcl_barrels:barrel_"..pos.x.."_"..pos.y.."_"..pos.z + local formname = "mcl_barrels:barrel_" .. pos.x .. "_" .. pos.y .. "_" .. pos.z for p = 1, #players do if vector.distance(players[p]:get_pos(), pos) <= 30 then minetest.close_formspec(players[p]:get_player_name(), formname) @@ -76,15 +81,18 @@ local function close_forms(pos) end end +---@param pos Vector local function update_after_close(pos) local node = minetest.get_node_or_nil(pos) if not node then return end if node.name == "mcl_barrels:barrel_open" then - minetest.swap_node(pos, {name = "mcl_barrels:barrel_closed", param2 = node.param2}) - minetest.sound_play({name="mcl_barrels_default_barrel_close", pos=pos, gain=0.5, max_hear_distance=16}, true) + minetest.swap_node(pos, { name = "mcl_barrels:barrel_closed", param2 = node.param2 }) + minetest.sound_play({ name = "mcl_barrels_default_barrel_close", pos = pos, gain = 0.5, max_hear_distance = 16 }, + true) end end +---@param player ObjectRef local function close_barrel(player) local name = player:get_player_name() local open = open_barrels[name] @@ -102,20 +110,22 @@ minetest.register_node("mcl_barrels:barrel_closed", { _tt_help = S("27 inventory slots"), _doc_items_longdesc = S("Barrels are containers which provide 27 inventory slots."), _doc_items_usagehelp = S("To access its inventory, rightclick it. When broken, the items will drop out."), - tiles = {"mcl_barrels_barrel_top.png^[transformR270", "mcl_barrels_barrel_bottom.png", "mcl_barrels_barrel_side.png"}, + tiles = { "mcl_barrels_barrel_top.png^[transformR270", "mcl_barrels_barrel_bottom.png", "mcl_barrels_barrel_side.png" }, paramtype = "light", paramtype2 = "facedir", on_place = function(itemstack, placer, pointed_thing) - minetest.rotate_and_place(itemstack, placer, pointed_thing, minetest.is_creative_enabled(placer:get_player_name()), {}, false) + minetest.rotate_and_place(itemstack, placer, pointed_thing, + minetest.is_creative_enabled(placer:get_player_name()), {} + , false) return itemstack end, stack_max = 64, sounds = mcl_sounds.node_sound_wood_defaults(), - groups = {handy = 1, axey = 1, container = 2, material_wood = 1, flammable = -1, deco_block = 1}, + groups = { handy = 1, axey = 1, container = 2, material_wood = 1, flammable = -1, deco_block = 1 }, on_construct = function(pos) local meta = minetest.get_meta(pos) local inv = meta:get_inventory() - inv:set_size("main", 9*3) + inv:set_size("main", 9 * 3) end, after_place_node = function(pos, placer, itemstack, pointed_thing) minetest.get_meta(pos):set_string("name", itemstack:get_meta():get_string("name")) @@ -124,16 +134,16 @@ minetest.register_node("mcl_barrels:barrel_closed", { allow_metadata_inventory_take = protection_check_put_take, allow_metadata_inventory_put = protection_check_put_take, on_metadata_inventory_move = function(pos, from_list, from_index, to_list, to_index, count, player) - minetest.log("action", player:get_player_name().. - " moves stuff in barrel at "..minetest.pos_to_string(pos)) + minetest.log("action", player:get_player_name() .. + " moves stuff in barrel at " .. minetest.pos_to_string(pos)) end, on_metadata_inventory_put = function(pos, listname, index, stack, player) - minetest.log("action", player:get_player_name().. - " moves stuff to barrel at "..minetest.pos_to_string(pos)) + minetest.log("action", player:get_player_name() .. + " moves stuff to barrel at " .. minetest.pos_to_string(pos)) end, on_metadata_inventory_take = function(pos, listname, index, stack, player) - minetest.log("action", player:get_player_name().. - " takes stuff from barrel at "..minetest.pos_to_string(pos)) + minetest.log("action", player:get_player_name() .. + " takes stuff from barrel at " .. minetest.pos_to_string(pos)) end, after_dig_node = drop_content, on_blast = on_blast, @@ -149,27 +159,35 @@ minetest.register_node("mcl_barrels:barrel_open", { _doc_items_longdesc = S("Barrels are containers which provide 27 inventory slots."), _doc_items_usagehelp = S("To access its inventory, rightclick it. When broken, the items will drop out."), _doc_items_create_entry = false, - tiles = {"mcl_barrels_barrel_top_open.png", "mcl_barrels_barrel_bottom.png", "mcl_barrels_barrel_side.png"}, + tiles = { "mcl_barrels_barrel_top_open.png", "mcl_barrels_barrel_bottom.png", "mcl_barrels_barrel_side.png" }, paramtype = "light", paramtype2 = "facedir", drop = "mcl_barrels:barrel_closed", stack_max = 64, sounds = mcl_sounds.node_sound_wood_defaults(), - groups = {handy = 1, axey = 1, container = 2, material_wood = 1, flammable = -1, deco_block = 1, not_in_creative_inventory = 1}, + groups = { + handy = 1, + axey = 1, + container = 2, + material_wood = 1, + flammable = -1, + deco_block = 1, + not_in_creative_inventory = 1 + }, allow_metadata_inventory_move = protection_check_move, allow_metadata_inventory_take = protection_check_put_take, allow_metadata_inventory_put = protection_check_put_take, on_metadata_inventory_move = function(pos, from_list, from_index, to_list, to_index, count, player) - minetest.log("action", player:get_player_name().. - " moves stuff in barrel at "..minetest.pos_to_string(pos)) + minetest.log("action", player:get_player_name() .. + " moves stuff in barrel at " .. minetest.pos_to_string(pos)) end, on_metadata_inventory_put = function(pos, listname, index, stack, player) - minetest.log("action", player:get_player_name().. - " moves stuff to barrel at "..minetest.pos_to_string(pos)) + minetest.log("action", player:get_player_name() .. + " moves stuff to barrel at " .. minetest.pos_to_string(pos)) end, on_metadata_inventory_take = function(pos, listname, index, stack, player) - minetest.log("action", player:get_player_name().. - " takes stuff from barrel at "..minetest.pos_to_string(pos)) + minetest.log("action", player:get_player_name() .. + " takes stuff from barrel at " .. minetest.pos_to_string(pos)) end, after_dig_node = drop_content, on_blast = on_blast, @@ -193,10 +211,10 @@ end) minetest.register_craft({ output = "mcl_barrels:barrel_closed", recipe = { - {"group:wood", "group:wood_slab", "group:wood"}, - {"group:wood", "", "group:wood"}, - {"group:wood", "group:wood_slab", "group:wood"}, - } + { "group:wood", "group:wood_slab", "group:wood" }, + { "group:wood", "", "group:wood" }, + { "group:wood", "group:wood_slab", "group:wood" }, + }, }) minetest.register_craft({ From f6804600ba24965d7598f4c86559fea2438d49b5 Mon Sep 17 00:00:00 2001 From: AFCMS Date: Sat, 10 Sep 2022 22:34:31 +0200 Subject: [PATCH 100/982] Grindstone menu --- .luacheckrc | 24 ++++--- mods/ITEMS/mcl_grindstone/init.lua | 110 +++++++++++++++++------------ textures/grindstone_gui_9.png | Bin 0 -> 100 bytes 3 files changed, 76 insertions(+), 58 deletions(-) create mode 100644 textures/grindstone_gui_9.png diff --git a/.luacheckrc b/.luacheckrc index 9d0b8cb2a..69c015665 100644 --- a/.luacheckrc +++ b/.luacheckrc @@ -1,10 +1,12 @@ +---@diagnostic disable + unused_args = false allow_defined_top = true max_line_length = false redefined = false globals = { - "minetest", "core", + "minetest", "core", } read_globals = { @@ -40,16 +42,16 @@ read_globals = { "factorial" } }, - ------ - --MODS - ------ + ------ + --MODS + ------ - --GENERAL - "default", + --GENERAL + "default", - --ENTITIES - "cmi", + --ENTITIES + "cmi", - --HUD - "sfinv", "sfinv_buttons", "unified_inventory", "cmsg", "inventory_plus", -} \ No newline at end of file + --HUD + "sfinv", "sfinv_buttons", "unified_inventory", "cmsg", "inventory_plus", +} diff --git a/mods/ITEMS/mcl_grindstone/init.lua b/mods/ITEMS/mcl_grindstone/init.lua index 00c373536..ddd1e8812 100644 --- a/mods/ITEMS/mcl_grindstone/init.lua +++ b/mods/ITEMS/mcl_grindstone/init.lua @@ -1,37 +1,52 @@ -- Code based from mcl_anvils local S = minetest.get_translator(minetest.get_current_modname()) +local F = minetest.formspec_escape +local C = minetest.colorize local MAX_WEAR = 65535 --- formspecs -local function get_grindstone_formspec() - return "size[9,8.75]".. - "image[3,1.5;1.5,1;gui_crafting_arrow.png]".. - "label[0,4.0;"..minetest.formspec_escape(minetest.colorize("#313131", S("Inventory"))).."]".. - "label[1,0.1;"..minetest.formspec_escape(minetest.colorize("#313131", S("Repair & Disenchant"))).."]".. - "list[context;main;0,0;8,4;]".. - "list[current_player;main;0,4.5;9,3;9]".. - mcl_formspec.get_itemslot_bg(0,4.5,9,3).. - "list[current_player;main;0,7.74;9,1;]".. - mcl_formspec.get_itemslot_bg(0,7.74,9,1).. - "list[context;input;1,1;1,1;]".. - mcl_formspec.get_itemslot_bg(1,1,1,1).. - "list[context;input;1,2;1,1;1]".. - mcl_formspec.get_itemslot_bg(1,2,1,1).. - "list[context;output;6,1.5;1,1;]".. - mcl_formspec.get_itemslot_bg(6,1.5,1,1).. - "listring[context;output]".. - "listring[current_player;main]".. - "listring[context;input]".. - "listring[current_player;main]" -end +local grindstone_formspec = table.concat({ + "formspec_version[6]", + "size[11.75,10.425]", + + "label[0.375,0.375;" .. F(C(mcl_formspec.label_color, S("Repair & Disenchant"))) .. "]", + + mcl_formspec.get_itemslot_bg_v4(2.875, 1.25, 1, 1), + "list[context;input;2.875,1.25;1,1;]", + + mcl_formspec.get_itemslot_bg_v4(2.875, 2.625, 1, 1), + "list[context;input;2.875,2.625;1,1;1]", + + "image[2.375,1;2,2.875;grindstone_gui_9.png;2]", + + "image[1.875,1.5;0.5,2.875;grindstone_gui_9.png;2]", + "image[4.375,1.5;0.5,2.875;grindstone_gui_9.png;2]", + + "image[5.5,1.95;1.5,1;gui_crafting_arrow.png]", + + mcl_formspec.get_itemslot_bg_v4(7.875, 1.9375, 1, 1), + "list[context;output;7.875,1.9375;1,1;]", + + "label[0.375,4.7;" .. F(C(mcl_formspec.label_color, S("Inventory"))) .. "]", + + mcl_formspec.get_itemslot_bg_v4(0.375, 5.1, 9, 3), + "list[current_player;main;0.375,5.1;9,3;9]", + + mcl_formspec.get_itemslot_bg_v4(0.375, 9.05, 9, 1), + "list[current_player;main;0.375,9.05;9,1;]", + + "listring[context;output]", + "listring[current_player;main]", + "listring[context;input]", + "listring[current_player;main]", +}) -- Creates a new item with the wear of the items and custom name local function create_new_item(name_item, meta, wear) local new_item = ItemStack(name_item) if wear ~= nil then - new_item:set_wear(wear) + new_item:set_wear(wear) end local new_meta = new_item:get_meta() new_meta:set_string("name", meta:get_string("name")) @@ -86,7 +101,6 @@ local function fix_stack_size(stack) return count end - -- Update the inventory slots of an grindstone node. -- meta: Metadata of grindstone node local function update_grindstone_slots(meta) @@ -122,8 +136,8 @@ local function update_grindstone_slots(meta) else new_output = "" end - -- Check if at least one input has an item - -- Check if the item is's an enchanted book or tool + -- Check if at least one input has an item + -- Check if the item is's an enchanted book or tool elseif (not input1:is_empty() and input2:is_empty()) or (input1:is_empty() and not input2:is_empty()) then if input2:is_empty() then local def1 = input1:get_definition() @@ -168,10 +182,10 @@ end -- Drop any items inside the grindstone if destroyed local function drop_grindstone_items(pos, meta) local inv = meta:get_inventory() - for i=1, inv:get_size("input") do + for i = 1, inv:get_size("input") do local stack = inv:get_stack("input", i) if not stack:is_empty() then - local p = {x=pos.x+math.random(0, 10)/10-0.5, y=pos.y, z=pos.z+math.random(0, 10)/10-0.5} + local p = { x = pos.x + math.random(0, 10) / 10 - 0.5, y = pos.y, z = pos.z + math.random(0, 10) / 10 - 0.5 } minetest.add_item(p, stack) end end @@ -181,11 +195,11 @@ local node_box = { type = "fixed", -- created with nodebox editor fixed = { - {-0.25, -0.25, -0.375, 0.25, 0.5, 0.375}, - {-0.375, -0.0625, -0.1875, -0.25, 0.3125, 0.1875}, - {0.25, -0.0625, -0.1875, 0.375, 0.3125, 0.1875}, - {0.25, -0.5, -0.125, 0.375, -0.0625, 0.125}, - {-0.375, -0.5, -0.125, -0.25, -0.0625, 0.125}, + { -0.25, -0.25, -0.375, 0.25, 0.5, 0.375 }, + { -0.375, -0.0625, -0.1875, -0.25, 0.3125, 0.1875 }, + { 0.25, -0.0625, -0.1875, 0.375, 0.3125, 0.1875 }, + { 0.25, -0.5, -0.125, 0.375, -0.0625, 0.125 }, + { -0.375, -0.5, -0.125, -0.25, -0.0625, 0.125 }, } } @@ -193,11 +207,14 @@ minetest.register_node("mcl_grindstone:grindstone", { description = S("Grindstone"), _tt_help = S("Used to disenchant/fix tools"), _doc_items_longdesc = S("Grindstone disenchants tools and armour except for curses, and repairs two items of the same type it is also the weapon smith's work station."), - _doc_items_usagehelp = S("To use the grindstone, rightclick it, Two input slots (on the left) and a single output slot.").."\n".. - S("To disenchant an item place enchanted item in one of the input slots and take the disenchanted item from the output.").."\n".. - S("To repair a tool you need a tool of the same type and material, put both items in the input slot and the output slot will combine two items durabilities with 5% bonus.").."\n".. - S("If both items have enchantments the player will get xp from both items from the disenchant.").."\n".. - S("Curses cannot be removed and will be transfered to the new repaired item, if both items have a different curse the curses will be combined."), + _doc_items_usagehelp = S("To use the grindstone, rightclick it, Two input slots (on the left) and a single output slot.") + .. "\n" .. + S("To disenchant an item place enchanted item in one of the input slots and take the disenchanted item from the output.") + .. "\n" .. + S("To repair a tool you need a tool of the same type and material, put both items in the input slot and the output slot will combine two items durabilities with 5% bonus.") + .. "\n" .. + S("If both items have enchantments the player will get xp from both items from the disenchant.") .. "\n" .. + S("Curses cannot be removed and will be transfered to the new repaired item, if both items have a different curse the curses will be combined."), tiles = { "grindstone_top.png", "grindstone_top.png", @@ -212,7 +229,7 @@ minetest.register_node("mcl_grindstone:grindstone", { selection_box = node_box, collision_box = node_box, sounds = mcl_sounds.node_sound_stone_defaults(), - groups = {pickaxey = 1, deco_block = 1}, + groups = { pickaxey = 1, deco_block = 1 }, after_dig_node = function(pos, oldnode, oldmetadata, digger) local meta = minetest.get_meta(pos) @@ -268,7 +285,7 @@ minetest.register_node("mcl_grindstone:grindstone", { local meta = minetest.get_meta(pos) if from_list == "output" and to_list == "input" then local inv = meta:get_inventory() - for i=1, inv:get_size("input") do + for i = 1, inv:get_size("input") do if i ~= to_index then local istack = inv:get_stack("input", i) istack:set_count(math.max(0, istack:get_count() - count)) @@ -289,8 +306,8 @@ minetest.register_node("mcl_grindstone:grindstone", { if not input1:is_empty() and not input2:is_empty() then -- Get xp earnt from the enchanted items xp_earnt = calculate_xp(input1) + calculate_xp(input1) - input1:take_item() - input2:take_item() + input1:take_item(1) + input2:take_item(1) inv:set_stack("input", 1, input1) inv:set_stack("input", 2, input2) else @@ -320,14 +337,13 @@ minetest.register_node("mcl_grindstone:grindstone", { local inv = meta:get_inventory() inv:set_size("input", 2) inv:set_size("output", 1) - local form = get_grindstone_formspec() - meta:set_string("formspec", form) + meta:set_string("formspec", grindstone_formspec) end, on_rightclick = function(pos, node, player, itemstack) if not player:get_player_control().sneak then local meta = minetest.get_meta(pos) update_grindstone_slots(meta) - meta:set_string("formspec", get_grindstone_formspec()) + meta:set_string("formspec", grindstone_formspec) end end, _mcl_blast_resistance = 6, @@ -337,7 +353,7 @@ minetest.register_node("mcl_grindstone:grindstone", { minetest.register_craft({ output = "mcl_grindstone:grindstone", recipe = { - { "mcl_core:stick", "mcl_stairs:slab_stone_rough", "mcl_core:stick"}, - { "group:wood", "", "group:wood"}, + { "mcl_core:stick", "mcl_stairs:slab_stone_rough", "mcl_core:stick" }, + { "group:wood", "", "group:wood" }, } }) diff --git a/textures/grindstone_gui_9.png b/textures/grindstone_gui_9.png new file mode 100644 index 0000000000000000000000000000000000000000..b2fffcb56dde72da4bd92a0c432c7df377a91611 GIT binary patch literal 100 zcmeAS@N?(olHy`uVBq!ia0vp^AT}2V8<6ZZI=>f4X?wajhDd}bCnO~N@K;Iu@&4Vr xK4Ja1Jrbdc%zPi@Iog&x1qeJ~E@(ZHzz~^JYWtJ-#%`cC22WQ%mvv4FO#tBC9g6?} literal 0 HcmV?d00001 From 5011e1220909155693de7bf5daeb871059fcd36d Mon Sep 17 00:00:00 2001 From: AFCMS Date: Sat, 10 Sep 2022 23:33:16 +0200 Subject: [PATCH 101/982] mcl_inventory API documentation + fix --- mods/HUD/mcl_inventory/API.md | 35 +++++++++++++++++++++++++++++ mods/HUD/mcl_inventory/survival.lua | 5 +++++ 2 files changed, 40 insertions(+) diff --git a/mods/HUD/mcl_inventory/API.md b/mods/HUD/mcl_inventory/API.md index e69de29bb..5fc5a8d6e 100644 --- a/mods/HUD/mcl_inventory/API.md +++ b/mods/HUD/mcl_inventory/API.md @@ -0,0 +1,35 @@ +# `mcl_inventory` + +## `mcl_inventory.register_survival_inventory_tab(def)` + +```lua +mcl_inventory.register_survival_inventory_tab({ + -- Page identifier + -- Used to uniquely identify the tab + id = "test", + + -- The tab description, can be translated + description = "Test", + + -- The name of the item that will be used as icon + item_icon = "mcl_core:stone", + + -- If true, the main inventory will be shown at the bottom of the tab + -- Listrings need to be added by hand + show_inventory = true, + + -- This function must return the tab's formspec for the player + build = function(player) + return "label[1,1;Hello hello]button[2,2;2,2;Hello;hey]" + end, + + -- This function will be called in the on_player_receive_fields callback if the tab is currently open + handle = function(player, fields) + print(dump(fields)) + end, + + -- This function will be called to know if a player can see the tab + -- Returns true by default + access = function(player) + end, +``` diff --git a/mods/HUD/mcl_inventory/survival.lua b/mods/HUD/mcl_inventory/survival.lua index 0ca22d119..5b5c6032c 100644 --- a/mods/HUD/mcl_inventory/survival.lua +++ b/mods/HUD/mcl_inventory/survival.lua @@ -21,6 +21,10 @@ function mcl_inventory.register_survival_inventory_tab(def) assert(def.build) assert(def.handle) + for _, d in ipairs(mcl_inventory.registered_survival_inventory_tabs) do + assert(d.id ~= def.id, "Another tab exists with the same name!") + end + if not def.access then function def.access(player) return true @@ -62,6 +66,7 @@ local function build_page(player, content, inventory, tabname) ",-1.34;1.5,1.44;" .. (tabname == d.id and "crafting_creative_active.png" or "crafting_creative_inactive.png") .. "]", "item_image_button[" .. (0.44 + (i - 1) * 1.6) .. ",-1.1;1,1;" .. d.item_icon .. ";" .. btn_name .. ";]", + "tooltip[" .. btn_name .. ";" .. F(d.description) .. "]" }) end end From 7c15fe6ac956a392987deb3e14902f1d281a3468 Mon Sep 17 00:00:00 2001 From: AFCMS Date: Sun, 18 Sep 2022 16:56:26 +0200 Subject: [PATCH 102/982] Furnaces formspec redo --- mods/ITEMS/mcl_blast_furnace/init.lua | 181 +++++++++++++++----------- mods/ITEMS/mcl_furnaces/init.lua | 165 +++++++++++++---------- mods/ITEMS/mcl_smoker/init.lua | 180 ++++++++++++++----------- 3 files changed, 309 insertions(+), 217 deletions(-) diff --git a/mods/ITEMS/mcl_blast_furnace/init.lua b/mods/ITEMS/mcl_blast_furnace/init.lua index e8e6e81c8..7e625989f 100644 --- a/mods/ITEMS/mcl_blast_furnace/init.lua +++ b/mods/ITEMS/mcl_blast_furnace/init.lua @@ -1,5 +1,6 @@ - local S = minetest.get_translator(minetest.get_current_modname()) +local C = minetest.colorize +local F = minetest.formspec_escape local LIGHT_ACTIVE_FURNACE = 13 @@ -8,60 +9,82 @@ local LIGHT_ACTIVE_FURNACE = 13 -- local function active_formspec(fuel_percent, item_percent) - return "size[9,8.75]".. - "label[0,4;"..minetest.formspec_escape(minetest.colorize("#313131", S("Inventory"))).."]".. - "list[current_player;main;0,4.5;9,3;9]".. - mcl_formspec.get_itemslot_bg(0,4.5,9,3).. - "list[current_player;main;0,7.74;9,1;]".. - mcl_formspec.get_itemslot_bg(0,7.74,9,1).. - "label[2.75,0;"..minetest.formspec_escape(minetest.colorize("#313131", S("Blast Furnace"))).."]".. - "list[context;src;2.75,0.5;1,1;]".. - mcl_formspec.get_itemslot_bg(2.75,0.5,1,1).. - "list[context;fuel;2.75,2.5;1,1;]".. - mcl_formspec.get_itemslot_bg(2.75,2.5,1,1).. - "list[context;dst;5.75,1.5;1,1;]".. - mcl_formspec.get_itemslot_bg(5.75,1.5,1,1).. - "image[2.75,1.5;1,1;default_furnace_fire_bg.png^[lowpart:".. - (100-fuel_percent)..":default_furnace_fire_fg.png]".. - "image[4.1,1.5;1.5,1;gui_furnace_arrow_bg.png^[lowpart:".. - (item_percent)..":gui_furnace_arrow_fg.png^[transformR270]".. - -- Craft guide button temporarily removed due to Minetest bug. - -- TODO: Add it back when the Minetest bug is fixed. - --"image_button[8,0;1,1;craftguide_book.png;craftguide;]".. - --"tooltip[craftguide;"..minetest.formspec_escape(S("Recipe book")).."]".. - "listring[context;dst]".. - "listring[current_player;main]".. - "listring[context;src]".. - "listring[current_player;main]".. - "listring[context;fuel]".. - "listring[current_player;main]" + return table.concat({ + "formspec_version[4]", + "size[11.75,10.425]", + "label[0.375,0.375;" .. F(C(mcl_formspec.label_color, S("Blast Furnace"))) .. "]", + mcl_formspec.get_itemslot_bg_v4(3.5, 0.75, 1, 1), + "list[context;src;3.5,0.75;1,1;]", + + "image[3.5,2;1,1;default_furnace_fire_bg.png^[lowpart:" .. + (100 - fuel_percent) .. ":default_furnace_fire_fg.png]", + + mcl_formspec.get_itemslot_bg_v4(3.5, 3.25, 1, 1), + "list[context;fuel;3.5,3.25;1,1;]", + + "image[5.25,2;1.5,1;gui_furnace_arrow_bg.png^[lowpart:" .. + (item_percent) .. ":gui_furnace_arrow_fg.png^[transformR270]", + mcl_formspec.get_itemslot_bg_v4(7.875, 2, 1, 1, 0.2), + "list[context;dst;7.875,2;1,1;]", + + "label[0.375,4.7;" .. F(C(mcl_formspec.label_color, S("Inventory"))) .. "]", + mcl_formspec.get_itemslot_bg_v4(0.375, 5.1, 9, 3), + "list[current_player;main;0.375,5.1;9,3;9]", + + mcl_formspec.get_itemslot_bg_v4(0.375, 9.05, 9, 1), + "list[current_player;main;0.375,9.05;9,1;]", + + -- Craft guide button temporarily removed due to Minetest bug. + -- TODO: Add it back when the Minetest bug is fixed. + --"image_button[8,0;1,1;craftguide_book.png;craftguide;]".. + --"tooltip[craftguide;"..minetest.formspec_escape(S("Recipe book")).."]".. + + "listring[context;dst]", + "listring[current_player;main]", + "listring[context;src]", + "listring[current_player;main]", + "listring[context;fuel]", + "listring[current_player;main]", + }) end -local inactive_formspec = "size[9,8.75]".. - "label[0,4;"..minetest.formspec_escape(minetest.colorize("#313131", S("Inventory"))).."]".. - "list[current_player;main;0,4.5;9,3;9]".. - mcl_formspec.get_itemslot_bg(0,4.5,9,3).. - "list[current_player;main;0,7.74;9,1;]".. - mcl_formspec.get_itemslot_bg(0,7.74,9,1).. - "label[2.75,0;"..minetest.formspec_escape(minetest.colorize("#313131", S("Blast Furnace"))).."]".. - "list[context;src;2.75,0.5;1,1;]".. - mcl_formspec.get_itemslot_bg(2.75,0.5,1,1).. - "list[context;fuel;2.75,2.5;1,1;]".. - mcl_formspec.get_itemslot_bg(2.75,2.5,1,1).. - "list[context;dst;5.75,1.5;1,1;]".. - mcl_formspec.get_itemslot_bg(5.75,1.5,1,1).. - "image[2.75,1.5;1,1;default_furnace_fire_bg.png]".. - "image[4.1,1.5;1.5,1;gui_furnace_arrow_bg.png^[transformR270]".. +local inactive_formspec = table.concat({ + "formspec_version[4]", + "size[11.75,10.425]", + "label[0.375,0.375;" .. F(C(mcl_formspec.label_color, S("Blast Furnace"))) .. "]", + mcl_formspec.get_itemslot_bg_v4(3.5, 0.75, 1, 1), + "list[context;src;3.5,0.75;1,1;]", + + "image[3.5,2;1,1;default_furnace_fire_bg.png]", + + mcl_formspec.get_itemslot_bg_v4(3.5, 3.25, 1, 1), + "list[context;fuel;3.5,3.25;1,1;]", + + "image[5.25,2;1.5,1;gui_furnace_arrow_bg.png^[transformR270]", + + mcl_formspec.get_itemslot_bg_v4(7.875, 2, 1, 1, 0.2), + "list[context;dst;7.875,2;1,1;]", + + "label[0.375,4.7;" .. F(C(mcl_formspec.label_color, S("Inventory"))) .. "]", + mcl_formspec.get_itemslot_bg_v4(0.375, 5.1, 9, 3), + "list[current_player;main;0.375,5.1;9,3;9]", + + mcl_formspec.get_itemslot_bg_v4(0.375, 9.05, 9, 1), + "list[current_player;main;0.375,9.05;9,1;]", + -- Craft guide button temporarily removed due to Minetest bug. -- TODO: Add it back when the Minetest bug is fixed. --"image_button[8,0;1,1;craftguide_book.png;craftguide;]".. --"tooltip[craftguide;"..minetest.formspec_escape(S("Recipe book")).."]".. - "listring[context;dst]".. - "listring[current_player;main]".. - "listring[context;src]".. - "listring[current_player;main]".. - "listring[context;fuel]".. - "listring[current_player;main]" + + "listring[context;dst]", + "listring[current_player;main]", + "listring[context;src]", + "listring[current_player;main]", + "listring[context;fuel]", + "listring[current_player;main]", +}) + local receive_fields = function(pos, formname, fields, sender) if fields.craftguide then @@ -71,7 +94,7 @@ end local function give_xp(pos, player) local meta = minetest.get_meta(pos) - local dir = vector.divide(minetest.facedir_to_dir(minetest.get_node(pos).param2),-1.95) + local dir = vector.divide(minetest.facedir_to_dir(minetest.get_node(pos).param2), -1.95) local xp = meta:get_int("xp") if xp > 0 then if player then @@ -99,7 +122,7 @@ local function allow_metadata_inventory_put(pos, listname, index, stack, player) -- Test stack with size 1 because we burn one fuel at a time local teststack = ItemStack(stack) teststack:set_count(1) - local output, decremented_input = minetest.get_craft_result({method="fuel", width=1, items={teststack}}) + local output, decremented_input = minetest.get_craft_result({ method = "fuel", width = 1, items = { teststack } }) if output.time ~= 0 then -- Only allow to place 1 item if fuel get replaced by recipe. -- This is the case for lava buckets. @@ -293,7 +316,7 @@ local function blast_furnace_node_timer(pos, elapsed) -- Check if we have cookable content: cookable local aftercooked - cooked, aftercooked = minetest.get_craft_result({method = "cooking", width = 1, items = srclist}) + cooked, aftercooked = minetest.get_craft_result({ method = "cooking", width = 1, items = srclist }) cookable = minetest.get_item_group(inv:get_stack("src", 1):get_name(), "blast_furnace_smeltable") == 1 if cookable then -- Successful cooking requires space in dst slot and time @@ -311,7 +334,7 @@ local function blast_furnace_node_timer(pos, elapsed) if cookable and not active then -- We need to get new fuel local afterfuel - fuel, afterfuel = minetest.get_craft_result({method = "fuel", width = 1, items = fuellist}) + fuel, afterfuel = minetest.get_craft_result({ method = "fuel", width = 1, items = fuellist }) if fuel.time == 0 then -- No valid fuel in fuel list -- stop @@ -343,7 +366,7 @@ local function blast_furnace_node_timer(pos, elapsed) srclist = inv:get_list("src") src_time = 0 - meta:set_int("xp", meta:get_int("xp") + 1) -- ToDo give each recipe an idividial XP count + meta:set_int("xp", meta:get_int("xp") + 1) -- ToDo give each recipe an idividial XP count end end @@ -390,9 +413,9 @@ local function blast_furnace_node_timer(pos, elapsed) meta:set_float("fuel_time", fuel_time) meta:set_float("src_time", src_time) if srclist then - meta:set_string("src_item", src_item) + meta:set_string("src_item", src_item) else - meta:set_string("src_item", "") + meta:set_string("src_item", "") end meta:set_string("formspec", formspec) @@ -415,13 +438,14 @@ end minetest.register_node("mcl_blast_furnace:blast_furnace", { description = S("Blast Furnace"), _tt_help = S("Smelts ores faster than furnace"), - _doc_items_longdesc = S("Blast Furnaces smelt several items, mainly ores and armor, using a furnace fuel, but twice as fast as a normal furnace."), + _doc_items_longdesc = S( + "Blast Furnaces smelt several items, mainly ores and armor, using a furnace fuel, but twice as fast as a normal furnace."), _doc_items_usagehelp = - S("Use the blast furnace to open the furnace menu.").."\n".. - S("Place a furnace fuel in the lower slot and the source material in the upper slot.").."\n".. - S("The blast furnace will slowly use its fuel to smelt the item.").."\n".. - S("The result will be placed into the output slot at the right side.").."\n".. - S("Use the recipe book to see what ores you can smelt, what you can use as fuel and how long it will burn."), + S("Use the blast furnace to open the furnace menu.") .. "\n" .. + S("Place a furnace fuel in the lower slot and the source material in the upper slot.") .. "\n" .. + S("The blast furnace will slowly use its fuel to smelt the item.") .. "\n" .. + S("The result will be placed into the output slot at the right side.") .. "\n" .. + S("Use the recipe book to see what ores you can smelt, what you can use as fuel and how long it will burn."), _doc_items_hidden = false, tiles = { "blast_furnace_top.png", "blast_furnace_top.png", @@ -429,7 +453,7 @@ minetest.register_node("mcl_blast_furnace:blast_furnace", { "blast_furnace_side.png", "blast_furnace_front.png" }, paramtype2 = "facedir", - groups = {pickaxey=1, container=4, deco_block=1, material_stone=1}, + groups = { pickaxey = 1, container = 4, deco_block = 1, material_stone = 1 }, is_ground_content = false, sounds = mcl_sounds.node_sound_stone_defaults(), @@ -439,10 +463,14 @@ minetest.register_node("mcl_blast_furnace:blast_furnace", { local meta2 = meta:to_table() meta:from_table(oldmetadata) local inv = meta:get_inventory() - for _, listname in ipairs({"src", "dst", "fuel"}) do + for _, listname in ipairs({ "src", "dst", "fuel" }) do local stack = inv:get_stack(listname, 1) if not stack:is_empty() then - local p = {x=pos.x+math.random(0, 10)/10-0.5, y=pos.y, z=pos.z+math.random(0, 10)/10-0.5} + local p = { + x = pos.x + math.random(0, 10) / 10 - 0.5, + y = pos.y, + z = pos.z + math.random(0, 10) / 10 - 0.5 + } minetest.add_item(p, stack) end end @@ -499,14 +527,16 @@ minetest.register_node("mcl_blast_furnace:blast_furnace_active", { tiles = { "blast_furnace_top.png", "blast_furnace_top.png", "blast_furnace_side.png", "blast_furnace_side.png", - "blast_furnace_side.png", {name = "blast_furnace_front_on.png", - animation = {type = "vertical_frames", aspect_w = 16, aspect_h = 16, length = 48}}, + "blast_furnace_side.png", { + name = "blast_furnace_front_on.png", + animation = { type = "vertical_frames", aspect_w = 16, aspect_h = 16, length = 48 } + }, }, paramtype2 = "facedir", paramtype = "light", light_source = LIGHT_ACTIVE_FURNACE, drop = "mcl_blast_furnace:blast_furnace", - groups = {pickaxey=1, container=4, deco_block=1, not_in_creative_inventory=1, material_stone=1}, + groups = { pickaxey = 1, container = 4, deco_block = 1, not_in_creative_inventory = 1, material_stone = 1 }, is_ground_content = false, sounds = mcl_sounds.node_sound_stone_defaults(), on_timer = blast_furnace_node_timer, @@ -516,10 +546,14 @@ minetest.register_node("mcl_blast_furnace:blast_furnace_active", { local meta2 = meta meta:from_table(oldmetadata) local inv = meta:get_inventory() - for _, listname in ipairs({"src", "dst", "fuel"}) do + for _, listname in ipairs({ "src", "dst", "fuel" }) do local stack = inv:get_stack(listname, 1) if not stack:is_empty() then - local p = {x=pos.x+math.random(0, 10)/10-0.5, y=pos.y, z=pos.z+math.random(0, 10)/10-0.5} + local p = { + x = pos.x + math.random(0, 10) / 10 - 0.5, + y = pos.y, + z = pos.z + math.random(0, 10) / 10 - 0.5 + } minetest.add_item(p, stack) end end @@ -550,8 +584,8 @@ minetest.register_node("mcl_blast_furnace:blast_furnace_active", { minetest.register_craft({ output = "mcl_blast_furnace:blast_furnace", recipe = { - { "mcl_core:iron_ingot", "mcl_core:iron_ingot", "mcl_core:iron_ingot" }, - { "mcl_core:iron_ingot", "mcl_furnaces:furnace", "mcl_core:iron_ingot" }, + { "mcl_core:iron_ingot", "mcl_core:iron_ingot", "mcl_core:iron_ingot" }, + { "mcl_core:iron_ingot", "mcl_furnaces:furnace", "mcl_core:iron_ingot" }, { "mcl_core:stone_smooth", "mcl_core:stone_smooth", "mcl_core:stone_smooth" }, } }) @@ -564,10 +598,9 @@ end minetest.register_lbm({ label = "Active blast_furnace flame particles", name = "mcl_blast_furnace:flames", - nodenames = {"mcl_blast_furnace:blast_furnace_active"}, + nodenames = { "mcl_blast_furnace:blast_furnace_active" }, run_at_every_load = true, action = function(pos, node) spawn_flames(pos, node.param2) end, }) - diff --git a/mods/ITEMS/mcl_furnaces/init.lua b/mods/ITEMS/mcl_furnaces/init.lua index 8cb8ad5a0..9cb8ffb16 100644 --- a/mods/ITEMS/mcl_furnaces/init.lua +++ b/mods/ITEMS/mcl_furnaces/init.lua @@ -1,5 +1,6 @@ - local S = minetest.get_translator(minetest.get_current_modname()) +local C = minetest.colorize +local F = minetest.formspec_escape local LIGHT_ACTIVE_FURNACE = 13 @@ -8,60 +9,82 @@ local LIGHT_ACTIVE_FURNACE = 13 -- local function active_formspec(fuel_percent, item_percent) - return "size[9,8.75]".. - "label[0,4;"..minetest.formspec_escape(minetest.colorize("#313131", S("Inventory"))).."]".. - "list[current_player;main;0,4.5;9,3;9]".. - mcl_formspec.get_itemslot_bg(0,4.5,9,3).. - "list[current_player;main;0,7.74;9,1;]".. - mcl_formspec.get_itemslot_bg(0,7.74,9,1).. - "label[2.75,0;"..minetest.formspec_escape(minetest.colorize("#313131", S("Furnace"))).."]".. - "list[context;src;2.75,0.5;1,1;]".. - mcl_formspec.get_itemslot_bg(2.75,0.5,1,1).. - "list[context;fuel;2.75,2.5;1,1;]".. - mcl_formspec.get_itemslot_bg(2.75,2.5,1,1).. - "list[context;dst;5.75,1.5;1,1;]".. - mcl_formspec.get_itemslot_bg(5.75,1.5,1,1).. - "image[2.75,1.5;1,1;default_furnace_fire_bg.png^[lowpart:".. - (100-fuel_percent)..":default_furnace_fire_fg.png]".. - "image[4.1,1.5;1.5,1;gui_furnace_arrow_bg.png^[lowpart:".. - (item_percent)..":gui_furnace_arrow_fg.png^[transformR270]".. - -- Craft guide button temporarily removed due to Minetest bug. - -- TODO: Add it back when the Minetest bug is fixed. - --"image_button[8,0;1,1;craftguide_book.png;craftguide;]".. - --"tooltip[craftguide;"..minetest.formspec_escape(S("Recipe book")).."]".. - "listring[context;dst]".. - "listring[current_player;main]".. - "listring[context;src]".. - "listring[current_player;main]".. - "listring[context;fuel]".. - "listring[current_player;main]" + return table.concat({ + "formspec_version[4]", + "size[11.75,10.425]", + "label[0.375,0.375;" .. F(C(mcl_formspec.label_color, S("Furnace"))) .. "]", + mcl_formspec.get_itemslot_bg_v4(3.5, 0.75, 1, 1), + "list[context;src;3.5,0.75;1,1;]", + + "image[3.5,2;1,1;default_furnace_fire_bg.png^[lowpart:" .. + (100 - fuel_percent) .. ":default_furnace_fire_fg.png]", + + mcl_formspec.get_itemslot_bg_v4(3.5, 3.25, 1, 1), + "list[context;fuel;3.5,3.25;1,1;]", + + "image[5.25,2;1.5,1;gui_furnace_arrow_bg.png^[lowpart:" .. + (item_percent) .. ":gui_furnace_arrow_fg.png^[transformR270]", + mcl_formspec.get_itemslot_bg_v4(7.875, 2, 1, 1, 0.2), + "list[context;dst;7.875,2;1,1;]", + + "label[0.375,4.7;" .. F(C(mcl_formspec.label_color, S("Inventory"))) .. "]", + mcl_formspec.get_itemslot_bg_v4(0.375, 5.1, 9, 3), + "list[current_player;main;0.375,5.1;9,3;9]", + + mcl_formspec.get_itemslot_bg_v4(0.375, 9.05, 9, 1), + "list[current_player;main;0.375,9.05;9,1;]", + + -- Craft guide button temporarily removed due to Minetest bug. + -- TODO: Add it back when the Minetest bug is fixed. + --"image_button[8,0;1,1;craftguide_book.png;craftguide;]".. + --"tooltip[craftguide;"..minetest.formspec_escape(S("Recipe book")).."]".. + + "listring[context;dst]", + "listring[current_player;main]", + "listring[context;src]", + "listring[current_player;main]", + "listring[context;fuel]", + "listring[current_player;main]", + }) end -local inactive_formspec = "size[9,8.75]".. - "label[0,4;"..minetest.formspec_escape(minetest.colorize("#313131", S("Inventory"))).."]".. - "list[current_player;main;0,4.5;9,3;9]".. - mcl_formspec.get_itemslot_bg(0,4.5,9,3).. - "list[current_player;main;0,7.74;9,1;]".. - mcl_formspec.get_itemslot_bg(0,7.74,9,1).. - "label[2.75,0;"..minetest.formspec_escape(minetest.colorize("#313131", S("Furnace"))).."]".. - "list[context;src;2.75,0.5;1,1;]".. - mcl_formspec.get_itemslot_bg(2.75,0.5,1,1).. - "list[context;fuel;2.75,2.5;1,1;]".. - mcl_formspec.get_itemslot_bg(2.75,2.5,1,1).. - "list[context;dst;5.75,1.5;1,1;]".. - mcl_formspec.get_itemslot_bg(5.75,1.5,1,1).. - "image[2.75,1.5;1,1;default_furnace_fire_bg.png]".. - "image[4.1,1.5;1.5,1;gui_furnace_arrow_bg.png^[transformR270]".. +local inactive_formspec = table.concat({ + "formspec_version[4]", + "size[11.75,10.425]", + "label[0.375,0.375;" .. F(C(mcl_formspec.label_color, S("Furnace"))) .. "]", + mcl_formspec.get_itemslot_bg_v4(3.5, 0.75, 1, 1), + "list[context;src;3.5,0.75;1,1;]", + + "image[3.5,2;1,1;default_furnace_fire_bg.png]", + + mcl_formspec.get_itemslot_bg_v4(3.5, 3.25, 1, 1), + "list[context;fuel;3.5,3.25;1,1;]", + + "image[5.25,2;1.5,1;gui_furnace_arrow_bg.png^[transformR270]", + + mcl_formspec.get_itemslot_bg_v4(7.875, 2, 1, 1, 0.2), + "list[context;dst;7.875,2;1,1;]", + + "label[0.375,4.7;" .. F(C(mcl_formspec.label_color, S("Inventory"))) .. "]", + mcl_formspec.get_itemslot_bg_v4(0.375, 5.1, 9, 3), + "list[current_player;main;0.375,5.1;9,3;9]", + + mcl_formspec.get_itemslot_bg_v4(0.375, 9.05, 9, 1), + "list[current_player;main;0.375,9.05;9,1;]", + -- Craft guide button temporarily removed due to Minetest bug. -- TODO: Add it back when the Minetest bug is fixed. --"image_button[8,0;1,1;craftguide_book.png;craftguide;]".. --"tooltip[craftguide;"..minetest.formspec_escape(S("Recipe book")).."]".. - "listring[context;dst]".. - "listring[current_player;main]".. - "listring[context;src]".. - "listring[current_player;main]".. - "listring[context;fuel]".. - "listring[current_player;main]" + + "listring[context;dst]", + "listring[current_player;main]", + "listring[context;src]", + "listring[current_player;main]", + "listring[context;fuel]", + "listring[current_player;main]", +}) + local receive_fields = function(pos, formname, fields, sender) if fields.craftguide then @@ -71,7 +94,7 @@ end local function give_xp(pos, player) local meta = minetest.get_meta(pos) - local dir = vector.divide(minetest.facedir_to_dir(minetest.get_node(pos).param2),-1.95) + local dir = vector.divide(minetest.facedir_to_dir(minetest.get_node(pos).param2), -1.95) local xp = meta:get_int("xp") if xp > 0 then if player then @@ -108,7 +131,7 @@ local function allow_metadata_inventory_put(pos, listname, index, stack, player) -- Test stack with size 1 because we burn one fuel at a time local teststack = ItemStack(stack) teststack:set_count(1) - local output, decremented_input = minetest.get_craft_result({method="fuel", width=1, items={teststack}}) + local output, decremented_input = minetest.get_craft_result({ method = "fuel", width = 1, items = { teststack } }) if output.time ~= 0 then -- Only allow to place 1 item if fuel get replaced by recipe. -- This is the case for lava buckets. @@ -303,7 +326,7 @@ local function furnace_node_timer(pos, elapsed) -- Check if we have cookable content: cookable local aftercooked - cooked, aftercooked = minetest.get_craft_result({method = "cooking", width = 1, items = srclist}) + cooked, aftercooked = minetest.get_craft_result({ method = "cooking", width = 1, items = srclist }) cookable = cooked.time ~= 0 if cookable then -- Successful cooking requires space in dst slot and time @@ -321,7 +344,7 @@ local function furnace_node_timer(pos, elapsed) if cookable and not active then -- We need to get new fuel local afterfuel - fuel, afterfuel = minetest.get_craft_result({method = "fuel", width = 1, items = fuellist}) + fuel, afterfuel = minetest.get_craft_result({ method = "fuel", width = 1, items = fuellist }) if fuel.time == 0 then -- No valid fuel in fuel list -- stop @@ -356,7 +379,7 @@ local function furnace_node_timer(pos, elapsed) if srclist[1]:get_name() == "mcl_sponges:sponge_wet" then inv:set_stack("fuel", 1, "mcl_buckets:bucket_water") fuellist = inv:get_list("fuel") - -- Also for river water + -- Also for river water elseif srclist[1]:get_name() == "mcl_sponges:sponge_wet_river_water" then inv:set_stack("fuel", 1, "mcl_buckets:bucket_river_water") fuellist = inv:get_list("fuel") @@ -366,7 +389,7 @@ local function furnace_node_timer(pos, elapsed) srclist = inv:get_list("src") src_time = 0 - meta:set_int("xp", meta:get_int("xp") + 1) -- ToDo give each recipe an idividial XP count + meta:set_int("xp", meta:get_int("xp") + 1) -- ToDo give each recipe an idividial XP count end end @@ -413,9 +436,9 @@ local function furnace_node_timer(pos, elapsed) meta:set_float("fuel_time", fuel_time) meta:set_float("src_time", src_time) if srclist then - meta:set_string("src_item", src_item) + meta:set_string("src_item", src_item) else - meta:set_string("src_item", "") + meta:set_string("src_item", "") end meta:set_string("formspec", formspec) @@ -440,11 +463,11 @@ minetest.register_node("mcl_furnaces:furnace", { _tt_help = S("Uses fuel to smelt or cook items"), _doc_items_longdesc = S("Furnaces cook or smelt several items, using a furnace fuel, into something else."), _doc_items_usagehelp = - S("Use the furnace to open the furnace menu.").."\n".. - S("Place a furnace fuel in the lower slot and the source material in the upper slot.").."\n".. - S("The furnace will slowly use its fuel to smelt the item.").."\n".. - S("The result will be placed into the output slot at the right side.").."\n".. - S("Use the recipe book to see what you can smelt, what you can use as fuel and how long it will burn."), + S("Use the furnace to open the furnace menu.") .. "\n" .. + S("Place a furnace fuel in the lower slot and the source material in the upper slot.") .. "\n" .. + S("The furnace will slowly use its fuel to smelt the item.") .. "\n" .. + S("The result will be placed into the output slot at the right side.") .. "\n" .. + S("Use the recipe book to see what you can smelt, what you can use as fuel and how long it will burn."), _doc_items_hidden = false, tiles = { "default_furnace_top.png", "default_furnace_bottom.png", @@ -452,7 +475,7 @@ minetest.register_node("mcl_furnaces:furnace", { "default_furnace_side.png", "default_furnace_front.png" }, paramtype2 = "facedir", - groups = {pickaxey=1, container=4, deco_block=1, material_stone=1}, + groups = { pickaxey = 1, container = 4, deco_block = 1, material_stone = 1 }, is_ground_content = false, sounds = mcl_sounds.node_sound_stone_defaults(), @@ -462,10 +485,11 @@ minetest.register_node("mcl_furnaces:furnace", { local meta2 = meta:to_table() meta:from_table(oldmetadata) local inv = meta:get_inventory() - for _, listname in ipairs({"src", "dst", "fuel"}) do + for _, listname in ipairs({ "src", "dst", "fuel" }) do local stack = inv:get_stack(listname, 1) if not stack:is_empty() then - local p = {x=pos.x+math.random(0, 10)/10-0.5, y=pos.y, z=pos.z+math.random(0, 10)/10-0.5} + local p = { x = pos.x + math.random(0, 10) / 10 - 0.5, y = pos.y, + z = pos.z + math.random(0, 10) / 10 - 0.5 } minetest.add_item(p, stack) end end @@ -528,7 +552,7 @@ minetest.register_node("mcl_furnaces:furnace_active", { paramtype = "light", light_source = LIGHT_ACTIVE_FURNACE, drop = "mcl_furnaces:furnace", - groups = {pickaxey=1, container=4, deco_block=1, not_in_creative_inventory=1, material_stone=1}, + groups = { pickaxey = 1, container = 4, deco_block = 1, not_in_creative_inventory = 1, material_stone = 1 }, is_ground_content = false, sounds = mcl_sounds.node_sound_stone_defaults(), on_timer = furnace_node_timer, @@ -538,10 +562,11 @@ minetest.register_node("mcl_furnaces:furnace_active", { local meta2 = meta meta:from_table(oldmetadata) local inv = meta:get_inventory() - for _, listname in ipairs({"src", "dst", "fuel"}) do + for _, listname in ipairs({ "src", "dst", "fuel" }) do local stack = inv:get_stack(listname, 1) if not stack:is_empty() then - local p = {x=pos.x+math.random(0, 10)/10-0.5, y=pos.y, z=pos.z+math.random(0, 10)/10-0.5} + local p = { x = pos.x + math.random(0, 10) / 10 - 0.5, y = pos.y, + z = pos.z + math.random(0, 10) / 10 - 0.5 } minetest.add_item(p, stack) end end @@ -573,7 +598,7 @@ minetest.register_craft({ output = "mcl_furnaces:furnace", recipe = { { "group:cobble", "group:cobble", "group:cobble" }, - { "group:cobble", "", "group:cobble" }, + { "group:cobble", "", "group:cobble" }, { "group:cobble", "group:cobble", "group:cobble" }, } }) @@ -586,7 +611,7 @@ end minetest.register_lbm({ label = "Active furnace flame particles", name = "mcl_furnaces:flames", - nodenames = {"mcl_furnaces:furnace_active"}, + nodenames = { "mcl_furnaces:furnace_active" }, run_at_every_load = true, action = function(pos, node) spawn_flames(pos, node.param2) diff --git a/mods/ITEMS/mcl_smoker/init.lua b/mods/ITEMS/mcl_smoker/init.lua index 4a4cfca15..757f13054 100644 --- a/mods/ITEMS/mcl_smoker/init.lua +++ b/mods/ITEMS/mcl_smoker/init.lua @@ -1,5 +1,6 @@ - local S = minetest.get_translator(minetest.get_current_modname()) +local C = minetest.colorize +local F = minetest.formspec_escape local LIGHT_ACTIVE_FURNACE = 13 @@ -8,60 +9,82 @@ local LIGHT_ACTIVE_FURNACE = 13 -- local function active_formspec(fuel_percent, item_percent) - return "size[9,8.75]".. - "label[0,4;"..minetest.formspec_escape(minetest.colorize("#313131", S("Inventory"))).."]".. - "list[current_player;main;0,4.5;9,3;9]".. - mcl_formspec.get_itemslot_bg(0,4.5,9,3).. - "list[current_player;main;0,7.74;9,1;]".. - mcl_formspec.get_itemslot_bg(0,7.74,9,1).. - "label[2.75,0;"..minetest.formspec_escape(minetest.colorize("#313131", S("Smoker"))).."]".. - "list[context;src;2.75,0.5;1,1;]".. - mcl_formspec.get_itemslot_bg(2.75,0.5,1,1).. - "list[context;fuel;2.75,2.5;1,1;]".. - mcl_formspec.get_itemslot_bg(2.75,2.5,1,1).. - "list[context;dst;5.75,1.5;1,1;]".. - mcl_formspec.get_itemslot_bg(5.75,1.5,1,1).. - "image[2.75,1.5;1,1;default_furnace_fire_bg.png^[lowpart:".. - (100-fuel_percent)..":default_furnace_fire_fg.png]".. - "image[4.1,1.5;1.5,1;gui_furnace_arrow_bg.png^[lowpart:".. - (item_percent)..":gui_furnace_arrow_fg.png^[transformR270]".. - -- Craft guide button temporarily removed due to Minetest bug. - -- TODO: Add it back when the Minetest bug is fixed. - --"image_button[8,0;1,1;craftguide_book.png;craftguide;]".. - --"tooltip[craftguide;"..minetest.formspec_escape(S("Recipe book")).."]".. - "listring[context;dst]".. - "listring[current_player;main]".. - "listring[context;src]".. - "listring[current_player;main]".. - "listring[context;fuel]".. - "listring[current_player;main]" + return table.concat({ + "formspec_version[4]", + "size[11.75,10.425]", + "label[0.375,0.375;" .. F(C(mcl_formspec.label_color, S("Smoker"))) .. "]", + mcl_formspec.get_itemslot_bg_v4(3.5, 0.75, 1, 1), + "list[context;src;3.5,0.75;1,1;]", + + "image[3.5,2;1,1;default_furnace_fire_bg.png^[lowpart:" .. + (100 - fuel_percent) .. ":default_furnace_fire_fg.png]", + + mcl_formspec.get_itemslot_bg_v4(3.5, 3.25, 1, 1), + "list[context;fuel;3.5,3.25;1,1;]", + + "image[5.25,2;1.5,1;gui_furnace_arrow_bg.png^[lowpart:" .. + (item_percent) .. ":gui_furnace_arrow_fg.png^[transformR270]", + mcl_formspec.get_itemslot_bg_v4(7.875, 2, 1, 1, 0.2), + "list[context;dst;7.875,2;1,1;]", + + "label[0.375,4.7;" .. F(C(mcl_formspec.label_color, S("Inventory"))) .. "]", + mcl_formspec.get_itemslot_bg_v4(0.375, 5.1, 9, 3), + "list[current_player;main;0.375,5.1;9,3;9]", + + mcl_formspec.get_itemslot_bg_v4(0.375, 9.05, 9, 1), + "list[current_player;main;0.375,9.05;9,1;]", + + -- Craft guide button temporarily removed due to Minetest bug. + -- TODO: Add it back when the Minetest bug is fixed. + --"image_button[8,0;1,1;craftguide_book.png;craftguide;]".. + --"tooltip[craftguide;"..minetest.formspec_escape(S("Recipe book")).."]".. + + "listring[context;dst]", + "listring[current_player;main]", + "listring[context;src]", + "listring[current_player;main]", + "listring[context;fuel]", + "listring[current_player;main]", + }) end -local inactive_formspec = "size[9,8.75]".. - "label[0,4;"..minetest.formspec_escape(minetest.colorize("#313131", S("Inventory"))).."]".. - "list[current_player;main;0,4.5;9,3;9]".. - mcl_formspec.get_itemslot_bg(0,4.5,9,3).. - "list[current_player;main;0,7.74;9,1;]".. - mcl_formspec.get_itemslot_bg(0,7.74,9,1).. - "label[2.75,0;"..minetest.formspec_escape(minetest.colorize("#313131", S("Smoker"))).."]".. - "list[context;src;2.75,0.5;1,1;]".. - mcl_formspec.get_itemslot_bg(2.75,0.5,1,1).. - "list[context;fuel;2.75,2.5;1,1;]".. - mcl_formspec.get_itemslot_bg(2.75,2.5,1,1).. - "list[context;dst;5.75,1.5;1,1;]".. - mcl_formspec.get_itemslot_bg(5.75,1.5,1,1).. - "image[2.75,1.5;1,1;default_furnace_fire_bg.png]".. - "image[4.1,1.5;1.5,1;gui_furnace_arrow_bg.png^[transformR270]".. +local inactive_formspec = table.concat({ + "formspec_version[4]", + "size[11.75,10.425]", + "label[0.375,0.375;" .. F(C(mcl_formspec.label_color, S("Smoker"))) .. "]", + mcl_formspec.get_itemslot_bg_v4(3.5, 0.75, 1, 1), + "list[context;src;3.5,0.75;1,1;]", + + "image[3.5,2;1,1;default_furnace_fire_bg.png]", + + mcl_formspec.get_itemslot_bg_v4(3.5, 3.25, 1, 1), + "list[context;fuel;3.5,3.25;1,1;]", + + "image[5.25,2;1.5,1;gui_furnace_arrow_bg.png^[transformR270]", + + mcl_formspec.get_itemslot_bg_v4(7.875, 2, 1, 1, 0.2), + "list[context;dst;7.875,2;1,1;]", + + "label[0.375,4.7;" .. F(C(mcl_formspec.label_color, S("Inventory"))) .. "]", + mcl_formspec.get_itemslot_bg_v4(0.375, 5.1, 9, 3), + "list[current_player;main;0.375,5.1;9,3;9]", + + mcl_formspec.get_itemslot_bg_v4(0.375, 9.05, 9, 1), + "list[current_player;main;0.375,9.05;9,1;]", + -- Craft guide button temporarily removed due to Minetest bug. -- TODO: Add it back when the Minetest bug is fixed. --"image_button[8,0;1,1;craftguide_book.png;craftguide;]".. --"tooltip[craftguide;"..minetest.formspec_escape(S("Recipe book")).."]".. - "listring[context;dst]".. - "listring[current_player;main]".. - "listring[context;src]".. - "listring[current_player;main]".. - "listring[context;fuel]".. - "listring[current_player;main]" + + "listring[context;dst]", + "listring[current_player;main]", + "listring[context;src]", + "listring[current_player;main]", + "listring[context;fuel]", + "listring[current_player;main]", +}) + local receive_fields = function(pos, formname, fields, sender) if fields.craftguide then @@ -71,7 +94,7 @@ end local function give_xp(pos, player) local meta = minetest.get_meta(pos) - local dir = vector.divide(minetest.facedir_to_dir(minetest.get_node(pos).param2),-1.95) + local dir = vector.divide(minetest.facedir_to_dir(minetest.get_node(pos).param2), -1.95) local xp = meta:get_int("xp") if xp > 0 then if player then @@ -98,7 +121,7 @@ local function allow_metadata_inventory_put(pos, listname, index, stack, player) -- Test stack with size 1 because we burn one fuel at a time local teststack = ItemStack(stack) teststack:set_count(1) - local output, decremented_input = minetest.get_craft_result({method="fuel", width=1, items={teststack}}) + local output, decremented_input = minetest.get_craft_result({ method = "fuel", width = 1, items = { teststack } }) if output.time ~= 0 then -- Only allow to place 1 item if fuel get replaced by recipe. -- This is the case for lava buckets. @@ -292,7 +315,7 @@ local function smoker_node_timer(pos, elapsed) -- Check if we have cookable content: cookable local aftercooked - cooked, aftercooked = minetest.get_craft_result({method = "cooking", width = 1, items = srclist}) + cooked, aftercooked = minetest.get_craft_result({ method = "cooking", width = 1, items = srclist }) cookable = minetest.get_item_group(inv:get_stack("src", 1):get_name(), "smoker_cookable") == 1 if cookable then -- Successful cooking requires space in dst slot and time @@ -310,7 +333,7 @@ local function smoker_node_timer(pos, elapsed) if cookable and not active then -- We need to get new fuel local afterfuel - fuel, afterfuel = minetest.get_craft_result({method = "fuel", width = 1, items = fuellist}) + fuel, afterfuel = minetest.get_craft_result({ method = "fuel", width = 1, items = fuellist }) if fuel.time == 0 then -- No valid fuel in fuel list -- stop @@ -343,7 +366,7 @@ local function smoker_node_timer(pos, elapsed) srclist = inv:get_list("src") src_time = 0 - meta:set_int("xp", meta:get_int("xp") + 1) -- ToDo give each recipe an idividial XP count + meta:set_int("xp", meta:get_int("xp") + 1) -- ToDo give each recipe an idividial XP count end end @@ -390,9 +413,9 @@ local function smoker_node_timer(pos, elapsed) meta:set_float("fuel_time", fuel_time) meta:set_float("src_time", src_time) if srclist then - meta:set_string("src_item", src_item) + meta:set_string("src_item", src_item) else - meta:set_string("src_item", "") + meta:set_string("src_item", "") end meta:set_string("formspec", formspec) @@ -415,13 +438,14 @@ end minetest.register_node("mcl_smoker:smoker", { description = S("Smoker"), _tt_help = S("Cooks food faster than furnace"), - _doc_items_longdesc = S("Smokers cook several items, mainly raw foods, into cooked foods, but twice as fast as a normal furnace."), + _doc_items_longdesc = S( + "Smokers cook several items, mainly raw foods, into cooked foods, but twice as fast as a normal furnace."), _doc_items_usagehelp = - S("Use the smoker to open the furnace menu.").."\n".. - S("Place a furnace fuel in the lower slot and the source material in the upper slot.").."\n".. - S("The smoker will slowly use its fuel to smelt the item.").."\n".. - S("The result will be placed into the output slot at the right side.").."\n".. - S("Use the recipe book to see what foods you can smelt, what you can use as fuel and how long it will burn."), + S("Use the smoker to open the furnace menu.") .. "\n" .. + S("Place a furnace fuel in the lower slot and the source material in the upper slot.") .. "\n" .. + S("The smoker will slowly use its fuel to smelt the item.") .. "\n" .. + S("The result will be placed into the output slot at the right side.") .. "\n" .. + S("Use the recipe book to see what foods you can smelt, what you can use as fuel and how long it will burn."), _doc_items_hidden = false, tiles = { "smoker_top.png", "smoker_bottom.png", @@ -429,7 +453,7 @@ minetest.register_node("mcl_smoker:smoker", { "smoker_side.png", "smoker_front.png" }, paramtype2 = "facedir", - groups = {pickaxey=1, container=4, deco_block=1, material_stone=1}, + groups = { pickaxey = 1, container = 4, deco_block = 1, material_stone = 1 }, is_ground_content = false, sounds = mcl_sounds.node_sound_stone_defaults(), @@ -439,10 +463,14 @@ minetest.register_node("mcl_smoker:smoker", { local meta2 = meta:to_table() meta:from_table(oldmetadata) local inv = meta:get_inventory() - for _, listname in ipairs({"src", "dst", "fuel"}) do + for _, listname in ipairs({ "src", "dst", "fuel" }) do local stack = inv:get_stack(listname, 1) if not stack:is_empty() then - local p = {x=pos.x+math.random(0, 10)/10-0.5, y=pos.y, z=pos.z+math.random(0, 10)/10-0.5} + local p = { + x = pos.x + math.random(0, 10) / 10 - 0.5, + y = pos.y, + z = pos.z + math.random(0, 10) / 10 - 0.5 + } minetest.add_item(p, stack) end end @@ -499,14 +527,16 @@ minetest.register_node("mcl_smoker:smoker_active", { tiles = { "smoker_top.png", "smoker_bottom.png", "smoker_side.png", "smoker_side.png", - "smoker_side.png", {name = "smoker_front_on.png", - animation = {type = "vertical_frames", aspect_w = 16, aspect_h = 16, length = 48}}, + "smoker_side.png", { + name = "smoker_front_on.png", + animation = { type = "vertical_frames", aspect_w = 16, aspect_h = 16, length = 48 } + }, }, paramtype2 = "facedir", paramtype = "light", light_source = LIGHT_ACTIVE_FURNACE, drop = "mcl_smoker:smoker", - groups = {pickaxey=1, container=4, deco_block=1, not_in_creative_inventory=1, material_stone=1}, + groups = { pickaxey = 1, container = 4, deco_block = 1, not_in_creative_inventory = 1, material_stone = 1 }, is_ground_content = false, sounds = mcl_sounds.node_sound_stone_defaults(), on_timer = smoker_node_timer, @@ -516,10 +546,14 @@ minetest.register_node("mcl_smoker:smoker_active", { local meta2 = meta meta:from_table(oldmetadata) local inv = meta:get_inventory() - for _, listname in ipairs({"src", "dst", "fuel"}) do + for _, listname in ipairs({ "src", "dst", "fuel" }) do local stack = inv:get_stack(listname, 1) if not stack:is_empty() then - local p = {x=pos.x+math.random(0, 10)/10-0.5, y=pos.y, z=pos.z+math.random(0, 10)/10-0.5} + local p = { + x = pos.x + math.random(0, 10) / 10 - 0.5, + y = pos.y, + z = pos.z + math.random(0, 10) / 10 - 0.5 + } minetest.add_item(p, stack) end end @@ -550,9 +584,9 @@ minetest.register_node("mcl_smoker:smoker_active", { minetest.register_craft({ output = "mcl_smoker:smoker", recipe = { - { "", "group:tree", "" }, + { "", "group:tree", "" }, { "group:tree", "mcl_furnaces:furnace", "group:tree" }, - { "", "group:tree", "" }, + { "", "group:tree", "" }, } }) @@ -564,7 +598,7 @@ end minetest.register_lbm({ label = "Active smoker flame particles", name = "mcl_smoker:flames", - nodenames = {"mcl_smoker:smoker_active"}, + nodenames = { "mcl_smoker:smoker_active" }, run_at_every_load = true, action = function(pos, node) spawn_flames(pos, node.param2) From 4055555ec18de5edec3fba44ed98b14ee84743b4 Mon Sep 17 00:00:00 2001 From: AFCMS Date: Sat, 8 Oct 2022 00:02:35 +0200 Subject: [PATCH 103/982] Redo Creative Inventory --- mods/HUD/mcl_formspec/init.lua | 14 +- mods/HUD/mcl_inventory/creative.lua | 282 ++++++++++++++-------------- 2 files changed, 145 insertions(+), 151 deletions(-) diff --git a/mods/HUD/mcl_formspec/init.lua b/mods/HUD/mcl_formspec/init.lua index 00fa7560e..69ef23e08 100644 --- a/mods/HUD/mcl_formspec/init.lua +++ b/mods/HUD/mcl_formspec/init.lua @@ -21,10 +21,12 @@ end ---@param x number ---@param y number ---@param size number +---@param texture? string ---@return string -local function get_slot(x, y, size) +---@nodiscard +local function get_slot(x, y, size, texture) local t = "image[" .. x - size .. "," .. y - size .. ";" .. 1 + (size * 2) .. - "," .. 1 + (size * 2) .. ";mcl_formspec_itemslot.png]" + "," .. 1 + (size * 2) .. ";" .. (texture and texture or "mcl_formspec_itemslot.png") .. "]" return t end @@ -34,16 +36,18 @@ mcl_formspec.itemslot_border_size = 0.05 ---@param y number ---@param w integer ---@param h integer ----@param size? number +---@param size? number Optional size of the slot border (default: 0.05) +---@param texture? string Optional texture to replace the default one ---@return string -function mcl_formspec.get_itemslot_bg_v4(x, y, w, h, size) +---@nodiscard +function mcl_formspec.get_itemslot_bg_v4(x, y, w, h, size, texture) if not size then size = mcl_formspec.itemslot_border_size end local out = "" for i = 0, w - 1, 1 do for j = 0, h - 1, 1 do - out = out .. get_slot(x + i + (i * 0.25), y + j + (j * 0.25), size) + out = out .. get_slot(x + i + (i * 0.25), y + j + (j * 0.25), size, texture) end end return out diff --git a/mods/HUD/mcl_inventory/creative.lua b/mods/HUD/mcl_inventory/creative.lua index c18b559b1..1e0b493e3 100644 --- a/mods/HUD/mcl_inventory/creative.lua +++ b/mods/HUD/mcl_inventory/creative.lua @@ -37,7 +37,7 @@ minetest.register_on_mods_loaded(function() def.description ~= "" then local function is_redstone(def) return def.mesecons or def.groups.mesecon or def.groups.mesecon_conductor_craftable or - def.groups.mesecon_effecor_off + def.groups.mesecon_effecor_off end local function is_tool(def) @@ -217,15 +217,15 @@ local hoch = {} local filtername = {} --local bg = {} -local noffset_x_start = -0.24 +local noffset_x_start = 0.2 local noffset_x = noffset_x_start -local noffset_y = -0.25 +local noffset_y = -1.34 local function next_noffset(id, right) if right then - noffset[id] = { 8.94, noffset_y } + noffset[id] = { 11.3, noffset_y } else noffset[id] = { noffset_x, noffset_y } - noffset_x = noffset_x + 1.25 + noffset_x = noffset_x + 1.6 end end @@ -239,7 +239,7 @@ next_noffset("misc") next_noffset("nix", true) noffset_x = noffset_x_start -noffset_y = 8.12 +noffset_y = 8.64 -- Lower row next_noffset("food") @@ -251,7 +251,7 @@ next_noffset("inv", true) for k, v in pairs(noffset) do offset[k] = tostring(v[1]) .. "," .. tostring(v[2]) - boffset[k] = tostring(v[1] + 0.19) .. "," .. tostring(v[2] + 0.25) + boffset[k] = tostring(v[1] + 0.24) .. "," .. tostring(v[2] + 0.25) end hoch["blocks"] = "" @@ -302,10 +302,30 @@ filtername["inv"] = S("Survival Inventory") bg["default"] = dark_bg end]] +local tab_icon = { + blocks = "mcl_core:brick_block", + deco = "mcl_flowers:peony", + redstone = "mesecons:redstone", + rail = "mcl_minecarts:golden_rail", + misc = "mcl_buckets:bucket_lava", + nix = "mcl_compass:compass", + food = "mcl_core:apple", + tools = "mcl_core:axe_iron", + combat = "mcl_core:sword_gold", + mobs = "mobs_mc:cow", + brew = "mcl_potions:dragon_breath", + matr = "mcl_core:stick", + inv = "mcl_chests:chest", +} + +---@param player ObjectRef +---@return integer local function get_stack_size(player) return player:get_meta():get_int("mcl_inventory:switch_stack") end +---@param player ObjectRef +---@param n integer local function set_stack_size(player, n) player:get_meta():set_int("mcl_inventory:switch_stack", n) end @@ -322,7 +342,7 @@ function mcl_inventory.set_creative_formspec(player) local start_i = players[playername].start_i local pagenum = start_i / (9 * 5) + 1 - local name = players[playername].page + local page = players[playername].page local inv_size = players[playername].inv_size local filter = players[playername].filter @@ -339,80 +359,89 @@ function mcl_inventory.set_creative_formspec(player) local pagemax = math.max(1, math.floor((inv_size - 1) / (9 * 5) + 1)) local name = "nix" local main_list - local listrings = "listring[detached:creative_" .. playername .. ";main]" .. - "listring[current_player;main]" .. - "listring[detached:trash;main]" + local listrings = table.concat({ + "listring[detached:creative_" .. playername .. ";main]", + "listring[current_player;main]", + "listring[detached:trash;main]", + }) + + if page then + name = page + if players[playername] then + players[playername].page = page + end + end - local inv_bg = "crafting_inventory_creative.png" if name == "inv" then - inv_bg = "crafting_inventory_creative_survival.png" - -- Background images for armor slots (hide if occupied) local armor_slot_imgs = "" local inv = player:get_inventory() if inv:get_stack("armor", 2):is_empty() then - armor_slot_imgs = armor_slot_imgs .. "image[2.5,1.3;1,1;mcl_inventory_empty_armor_slot_helmet.png]" + armor_slot_imgs = armor_slot_imgs .. "image[3.5,0.375;1,1;mcl_inventory_empty_armor_slot_helmet.png]" end if inv:get_stack("armor", 3):is_empty() then - armor_slot_imgs = armor_slot_imgs .. "image[2.5,2.75;1,1;mcl_inventory_empty_armor_slot_chestplate.png]" + armor_slot_imgs = armor_slot_imgs .. "image[3.5,2.125;1,1;mcl_inventory_empty_armor_slot_chestplate.png]" end if inv:get_stack("armor", 4):is_empty() then - armor_slot_imgs = armor_slot_imgs .. "image[5.5,1.3;1,1;mcl_inventory_empty_armor_slot_leggings.png]" + armor_slot_imgs = armor_slot_imgs .. "image[7.25,0.375;1,1;mcl_inventory_empty_armor_slot_leggings.png]" end if inv:get_stack("armor", 5):is_empty() then - armor_slot_imgs = armor_slot_imgs .. "image[5.5,2.75;1,1;mcl_inventory_empty_armor_slot_boots.png]" + armor_slot_imgs = armor_slot_imgs .. "image[7.25,2.125;1,1;mcl_inventory_empty_armor_slot_boots.png]" end if inv:get_stack("offhand", 1):is_empty() then - armor_slot_imgs = armor_slot_imgs .. "image[1.5,2.025;1,1;mcl_inventory_empty_armor_slot_shield.png]" + armor_slot_imgs = armor_slot_imgs .. "image[2.25,1.25;1,1;mcl_inventory_empty_armor_slot_shield.png]" end local stack_size = get_stack_size(player) -- Survival inventory slots - main_list = "list[current_player;main;0,3.75;9,3;9]" .. - mcl_formspec.get_itemslot_bg(0, 3.75, 9, 3) .. + main_list = table.concat({ + mcl_formspec.get_itemslot_bg_v4(0.375, 3.375, 9, 3), + "list[current_player;main;0.375,3.375;9,3;9]", -- Armor - "list[current_player;armor;2.5,1.3;1,1;1]" .. - "list[current_player;armor;2.5,2.75;1,1;2]" .. - "list[current_player;armor;5.5,1.3;1,1;3]" .. - "list[current_player;armor;5.5,2.75;1,1;4]" .. - mcl_formspec.get_itemslot_bg(2.5, 1.3, 1, 1) .. - mcl_formspec.get_itemslot_bg(2.5, 2.75, 1, 1) .. - mcl_formspec.get_itemslot_bg(5.5, 1.3, 1, 1) .. - mcl_formspec.get_itemslot_bg(5.5, 2.75, 1, 1) .. - "list[current_player;offhand;1.5,2.025;1,1]" .. - mcl_formspec.get_itemslot_bg(1.5, 2.025, 1, 1) .. - armor_slot_imgs .. + mcl_formspec.get_itemslot_bg_v4(3.5, 0.375, 1, 1), + mcl_formspec.get_itemslot_bg_v4(3.5, 2.125, 1, 1), + mcl_formspec.get_itemslot_bg_v4(7.25, 0.375, 1, 1), + mcl_formspec.get_itemslot_bg_v4(7.25, 2.125, 1, 1), + "list[current_player;armor;3.5,0.375;1,1;1]", + "list[current_player;armor;3.5,2.125;1,1;2]", + "list[current_player;armor;7.25,0.375;1,1;3]", + "list[current_player;armor;7.25,2.125;1,1;4]", + + -- Offhand + mcl_formspec.get_itemslot_bg_v4(2.25, 1.25, 1, 1), + "list[current_player;offhand;2.25,1.25;1,1]", + + armor_slot_imgs, -- Player preview - mcl_player.get_player_formspec_model(player, 3.9, 1.4, 1.2333, 2.4666, "") .. + "image[4.75,0.33;2.25,2.83;mcl_inventory_background9.png;2]", + mcl_player.get_player_formspec_model(player, 4.75, 0.45, 2.25, 2.75, ""), -- Crafting guide button - "image_button[9,1;1,1;craftguide_book.png;__mcl_craftguide;]" .. - "tooltip[__mcl_craftguide;" .. F(S("Recipe book")) .. "]" .. + "image_button[11.575,0.825;1.1,1.1;craftguide_book.png;__mcl_craftguide;]", + "tooltip[__mcl_craftguide;" .. F(S("Recipe book")) .. "]", -- Help button - "image_button[9,2;1,1;doc_button_icon_lores.png;__mcl_doc;]" .. - "tooltip[__mcl_doc;" .. F(S("Help")) .. "]" .. + "image_button[11.575,2.075;1.1,1.1;doc_button_icon_lores.png;__mcl_doc;]", + "tooltip[__mcl_doc;" .. F(S("Help")) .. "]", -- Advancements button - "image_button[9,3;1,1;mcl_achievements_button.png;__mcl_achievements;]" .. + "image_button[11.575,3.3;1.1,1.1;mcl_achievements_button.png;__mcl_achievements;]" .. --"style_type[image_button;border=;bgimg=;bgimg_pressed=]" .. "tooltip[__mcl_achievements;" .. F(S("Advancements")) .. "]" .. -- Switch stack size button - "image_button[9,4;1,1;default_apple.png;__switch_stack;]" .. - "label[9.4,4.4;" .. F(C("#FFFFFF", stack_size ~= 1 and stack_size or "")) .. "]" .. - "tooltip[__switch_stack;" .. F(S("Switch stack size")) .. "]" + "image_button[11.575,4.575;1.1,1.1;default_apple.png;__switch_stack;]", + "label[12.275,5.28;" .. F(C("#FFFFFF", tostring(stack_size ~= 1 and stack_size or ""))) .. "]", + "tooltip[__switch_stack;" .. F(S("Switch stack size")) .. "]", - -- Skins button - if minetest.global_exists("mcl_skins") then - main_list = main_list .. - "image_button[9,5;1,1;mcl_skins_button.png;__mcl_skins;]" .. - "tooltip[__mcl_skins;" .. F(S("Select player skin")) .. "]" - end + -- Skins button + "image_button[11.575,5.825;1.1,1.1;mcl_skins_button.png;__mcl_skins;]", + "tooltip[__mcl_skins;" .. F(S("Select player skin")) .. "]", + }) -- For shortcuts listrings = listrings .. @@ -420,29 +449,16 @@ function mcl_inventory.set_creative_formspec(player) "listring[current_player;main]" else -- Creative inventory slots - main_list = "list[detached:creative_" .. playername .. ";main;0,1.75;9,5;" .. tostring(start_i) .. "]" .. - mcl_formspec.get_itemslot_bg(0, 1.75, 9, 5) .. + main_list = table.concat({ + mcl_formspec.get_itemslot_bg_v4(0.375, 0.875, 9, 5), + "list[detached:creative_" .. playername .. ";main;0.375,0.875;9,5;" .. tostring(start_i) .. "]", -- Page buttons - "label[9.0,5.5;" .. F(S("@1/@2", pagenum, pagemax)) .. "]" .. - "image_button[9.0,6.0;0.7,0.7;crafting_creative_prev.png;creative_prev;]" .. - "image_button[9.5,6.0;0.7,0.7;crafting_creative_next.png;creative_next;]" + "label[11.65,5.6;" .. F(S("@1 / @2", pagenum, pagemax)) .. "]", + "image_button[11.575,5.83;0.55,1.1;crafting_creative_prev.png;creative_prev;]", + "image_button[12.075,5.83;0.55,1.1;crafting_creative_next.png;creative_next;]", + }) end - local tab_icon = { - blocks = "mcl_core:brick_block", - deco = "mcl_flowers:peony", - redstone = "mesecons:redstone", - rail = "mcl_minecarts:golden_rail", - misc = "mcl_buckets:bucket_lava", - nix = "mcl_compass:compass", - food = "mcl_core:apple", - tools = "mcl_core:axe_iron", - combat = "mcl_core:sword_gold", - mobs = "mobs_mc:cow", - brew = "mcl_potions:dragon_breath", - matr = "mcl_core:stick", - inv = "mcl_chests:chest", - } local function tab(current_tab, this_tab) local bg_img if current_tab == this_tab then @@ -450,59 +466,66 @@ function mcl_inventory.set_creative_formspec(player) else bg_img = "crafting_creative_inactive" .. hoch[this_tab] .. ".png" end - return "style[" .. this_tab .. ";border=false;bgimg=;bgimg_pressed=]" .. - "item_image_button[" .. boffset[this_tab] .. ";1,1;" .. tab_icon[this_tab] .. ";" .. this_tab .. ";]" .. - "image[" .. offset[this_tab] .. ";1.5,1.44;" .. bg_img .. "]" + return table.concat({ + "style[" .. this_tab .. ";border=false;bgimg=;bgimg_pressed=;noclip=true]", + "image[" .. offset[this_tab] .. ";1.5,1.44;" .. bg_img .. "]", + "item_image_button[" .. boffset[this_tab] .. ";1,1;" .. tab_icon[this_tab] .. ";" .. this_tab .. ";]", + "tooltip[blocks;" .. F(filtername[this_tab]) .. "]" + }) end local caption = "" if name ~= "inv" and filtername[name] then - caption = "label[0,1.2;" .. F(minetest.colorize("#313131", filtername[name])) .. "]" + caption = "label[0.375,0.375;" .. F(minetest.colorize("#313131", filtername[name])) .. "]" end - local formspec = "size[10,9.3]" .. - "no_prepend[]" .. - mcl_vars.gui_nonbg .. mcl_vars.gui_bg_color .. - "background[-0.19,-0.25;10.5,9.87;" .. inv_bg .. "]" .. - "label[-5,-5;" .. name .. "]" .. - tab(name, "blocks") .. - "tooltip[blocks;" .. F(filtername["blocks"]) .. "]" .. - tab(name, "deco") .. - "tooltip[deco;" .. F(filtername["deco"]) .. "]" .. - tab(name, "redstone") .. - "tooltip[redstone;" .. F(filtername["redstone"]) .. "]" .. - tab(name, "rail") .. - "tooltip[rail;" .. F(filtername["rail"]) .. "]" .. - tab(name, "misc") .. - "tooltip[misc;" .. F(filtername["misc"]) .. "]" .. - tab(name, "nix") .. - "tooltip[nix;" .. F(filtername["nix"]) .. "]" .. - caption .. - "list[current_player;main;0,7;9,1;]" .. - mcl_formspec.get_itemslot_bg(0, 7, 9, 1) .. - main_list .. - tab(name, "food") .. - "tooltip[food;" .. F(filtername["food"]) .. "]" .. - tab(name, "tools") .. - "tooltip[tools;" .. F(filtername["tools"]) .. "]" .. - tab(name, "combat") .. - "tooltip[combat;" .. F(filtername["combat"]) .. "]" .. - tab(name, "mobs") .. - "tooltip[mobs;" .. F(filtername["mobs"]) .. "]" .. - tab(name, "brew") .. - "tooltip[brew;" .. F(filtername["brew"]) .. "]" .. - tab(name, "matr") .. - "tooltip[matr;" .. F(filtername["matr"]) .. "]" .. - tab(name, "inv") .. - "tooltip[inv;" .. F(filtername["inv"]) .. "]" .. - "list[detached:trash;main;9,7;1,1;]" .. - mcl_formspec.get_itemslot_bg(9, 7, 1, 1) .. - "image[9,7;1,1;crafting_creative_trash.png]" .. - listrings + local formspec = table.concat({ + "formspec_version[6]", + "size[13,8.75]", + + "style_type[image;noclip=true]", + + -- Hotbar + mcl_formspec.get_itemslot_bg_v4(0.375, 7.375, 9, 1), + "list[current_player;main;0.375,7.375;9,1;]", + + -- Trash + mcl_formspec.get_itemslot_bg_v4(11.625, 7.375, 1, 1, mcl_formspec.itemslot_border_size, + "crafting_creative_trash.png"), + "list[detached:trash;main;11.625,7.375;1,1;]", + + main_list, + + caption, + + listrings, + + tab(name, "blocks"), + tab(name, "deco"), + tab(name, "redstone"), + tab(name, "rail"), + tab(name, "misc"), + tab(name, "nix"), + + tab(name, "food"), + tab(name, "tools"), + tab(name, "combat"), + tab(name, "mobs"), + tab(name, "brew"), + tab(name, "matr"), + tab(name, "inv"), + }) if name == "nix" then - formspec = formspec .. "field[5.3,1.34;4,0.75;search;;" .. minetest.formspec_escape(filter) .. "]" - formspec = formspec .. "field_close_on_enter[search;false]" + if filter == nil then + filter = "" + end + + formspec = formspec .. table.concat({ + "field[5.325,0.15;6.1,0.6;search;;" .. minetest.formspec_escape(filter) .. "]", + "field_close_on_enter[search;false]", + "set_focus[search;true]", + }) end if pagenum then formspec = formspec .. "p" .. tostring(pagenum) end player:set_inventory_formspec(formspec) @@ -629,7 +652,7 @@ minetest.register_on_player_receive_fields(function(player, formname, fields) players[name].filter = "" end - mcl_inventory.set_creative_formspec(player, start_i, start_i / (9 * 5) + 1, inv_size, false, page, filter) + mcl_inventory.set_creative_formspec(player) end) @@ -655,39 +678,6 @@ if minetest.is_creative_enabled("") then end end end - - mcl_inventory.update_inventory_formspec = function(player) - local page - - local name = player:get_player_name() - - if players[name].page then - page = players[name].page - else - page = "nix" - end - - -- Figure out current scroll bar from formspec - --local formspec = player:get_inventory_formspec() - local start_i = players[name].start_i - - local inv_size - if page == "nix" then - local inv = minetest.get_inventory({ type = "detached", name = "creative_" .. name }) - inv_size = inv:get_size("main") - elseif page and page ~= "inv" then - inv_size = #(inventory_lists[page]) - else - inv_size = 0 - end - - local filter = players[name].filter - if filter == nil then - filter = "" - end - - mcl_inventory.set_creative_formspec(player, start_i, start_i / (9 * 5) + 1, inv_size, false, page, filter) - end end minetest.register_on_joinplayer(function(player) From 9831f2c25be98dfa5cf371a14c9c25d671ca703a Mon Sep 17 00:00:00 2001 From: AFCMS Date: Sat, 8 Oct 2022 00:15:38 +0200 Subject: [PATCH 104/982] Document `mcl_formspec` API --- mods/HUD/mcl_formspec/API.md | 40 ++++++++++++++++++++++++++++++++++ mods/HUD/mcl_formspec/init.lua | 2 ++ 2 files changed, 42 insertions(+) diff --git a/mods/HUD/mcl_formspec/API.md b/mods/HUD/mcl_formspec/API.md index e69de29bb..64795f8c3 100644 --- a/mods/HUD/mcl_formspec/API.md +++ b/mods/HUD/mcl_formspec/API.md @@ -0,0 +1,40 @@ +# MineClone2 Formspec API + +## `mcl_formspec.label_color` + +Contains the color used for formspec labels, currently `#313131`. + +## `mcl_formspec.get_itemslot_bg(x, y, w, h)` + +Get the background of inventory slots (formspec version = 1) + +ex: + +```lua +local formspec = table.concat({ + mcl_formspec.get_itemslot_bg(0, 0, 5, 2), + "list[current_player;super_inventory;0,0;5,2;]", +}) +``` + +## `mcl_formspec.get_itemslot_bg_v4(x, y, w, h, size, texture)` + +Get the background of inventory slots (formspec version > 1) + +Works basically the same as `mcl_formspec.get_itemslot_bg(x, y, w, h)` but have more customisation options: + +- `size`: allow you to customize the size of the slot borders, default is 0.05 +- `texture`: allow you to specify a custom texture tu use instead of the default one + +ex: + +```lua +local formspec = table.concat({ + mcl_formspec.get_itemslot_bg_v4(0.375, 0.375, 5, 2, 0.1, "super_slot_background.png"), + "list[current_player;super_inventory;0.375,0.375;5,2;]", +}) +``` + +## `mcl_formspec.itemslot_border_size` + +Contains the default item slot border size used by `mcl_formspec.get_itemslot_bg_v4`, currently 0.05 diff --git a/mods/HUD/mcl_formspec/init.lua b/mods/HUD/mcl_formspec/init.lua index 69ef23e08..d449e937f 100644 --- a/mods/HUD/mcl_formspec/init.lua +++ b/mods/HUD/mcl_formspec/init.lua @@ -2,6 +2,7 @@ mcl_formspec = {} mcl_formspec.label_color = "#313131" +---Get the background of inventory slots (formspec version = 1) ---@param x number ---@param y number ---@param w number @@ -32,6 +33,7 @@ end mcl_formspec.itemslot_border_size = 0.05 +---Get the background of inventory slots (formspec version > 1) ---@param x number ---@param y number ---@param w integer From ecb4c82600d153acb47d0d346d0d3dbbcc7d22a6 Mon Sep 17 00:00:00 2001 From: AFCMS Date: Sat, 15 Oct 2022 12:37:00 +0200 Subject: [PATCH 105/982] Anvil Formspec - anvil formspec - hammer icon - use new vectors - add some type annotations - optimize textures (some of them by 95%) --- mods/ITEMS/mcl_anvils/init.lua | 188 ++++++++++++++--------- textures/mcl_anvils_inventory_arrow.png | Bin 0 -> 238 bytes textures/mcl_anvils_inventory_cross.png | Bin 0 -> 133 bytes textures/mcl_anvils_inventory_hammer.png | Bin 0 -> 177 bytes 4 files changed, 117 insertions(+), 71 deletions(-) create mode 100644 textures/mcl_anvils_inventory_arrow.png create mode 100644 textures/mcl_anvils_inventory_cross.png create mode 100644 textures/mcl_anvils_inventory_hammer.png diff --git a/mods/ITEMS/mcl_anvils/init.lua b/mods/ITEMS/mcl_anvils/init.lua index a56299cd9..9ff9f7750 100644 --- a/mods/ITEMS/mcl_anvils/init.lua +++ b/mods/ITEMS/mcl_anvils/init.lua @@ -1,4 +1,6 @@ local S = minetest.get_translator(minetest.get_current_modname()) +local F = minetest.formspec_escape +local C = minetest.colorize local MAX_NAME_LENGTH = 35 local MAX_WEAR = 65535 @@ -10,41 +12,65 @@ local MATERIAL_TOOL_REPAIR_BOOST = { MAX_WEAR, -- 100% } +---@param set_name? string local function get_anvil_formspec(set_name) if not set_name then set_name = "" end - return "size[9,8.75]".. - "background[-0.19,-0.25;9.41,9.49;mcl_anvils_inventory.png]".. - "label[0,4.0;"..minetest.formspec_escape(minetest.colorize("#313131", S("Inventory"))).."]".. - "list[current_player;main;0,4.5;9,3;9]".. - mcl_formspec.get_itemslot_bg(0,4.5,9,3).. - "list[current_player;main;0,7.74;9,1;]".. - mcl_formspec.get_itemslot_bg(0,7.74,9,1).. - "list[context;input;1,2.5;1,1;]".. - mcl_formspec.get_itemslot_bg(1,2.5,1,1).. - "list[context;input;4,2.5;1,1;1]".. - mcl_formspec.get_itemslot_bg(4,2.5,1,1).. - "list[context;output;8,2.5;1,1;]".. - mcl_formspec.get_itemslot_bg(8,2.5,1,1).. - "label[3,0.1;"..minetest.formspec_escape(minetest.colorize("#313131", S("Repair and Name"))).."]".. - "field[3.25,1;4,1;name;;"..minetest.formspec_escape(set_name).."]".. - "field_close_on_enter[name;false]".. - "button[7,0.7;2,1;name_button;"..minetest.formspec_escape(S("Set Name")).."]".. - "listring[context;output]".. - "listring[current_player;main]".. - "listring[context;input]".. - "listring[current_player;main]" + + return table.concat({ + "formspec_version[4]", + "size[11.75,10.425]", + + "label[4.125,0.375;" .. F(C(mcl_formspec.label_color, S("Repair and Name"))) .. "]", + + "image[0.875,0.375;1.75,1.75;mcl_anvils_inventory_hammer.png]", + + "field[4.125,0.75;7.25,1;name;;" .. F(set_name) .. "]", + "field_close_on_enter[name;false]", + "set_focus[name;true]", + + mcl_formspec.get_itemslot_bg_v4(1.625, 2.6, 1, 1), + "list[context;input;1.625,2.6;1,1;]", + + "image[3.5,2.6;1,1;mcl_anvils_inventory_cross.png]", + + mcl_formspec.get_itemslot_bg_v4(5.375, 2.6, 1, 1), + "list[context;input;5.375,2.6;1,1;1]", + + "image[6.75,2.6;2,1;mcl_anvils_inventory_arrow.png]", + + mcl_formspec.get_itemslot_bg_v4(9.125, 2.6, 1, 1), + "list[context;output;9.125,2.6;1,1;]", + + -- Player Inventory + + mcl_formspec.get_itemslot_bg_v4(0.375, 5.1, 9, 3), + "list[current_player;main;0.375,5.1;9,3;9]", + + mcl_formspec.get_itemslot_bg_v4(0.375, 9.05, 9, 1), + "list[current_player;main;0.375,9.05;9,1;]", + + -- Listrings + + "listring[context;output]", + "listring[current_player;main]", + "listring[context;input]", + "listring[current_player;main]", + }) end -- Given a tool and material stack, returns how many items of the material stack -- needs to be used up to repair the tool. +---@param tool ItemStack +---@param material ItemStack +---@return integer local function get_consumed_materials(tool, material) local wear = tool:get_wear() --local health = (MAX_WEAR - wear) local matsize = material:get_count() local materials_used = 0 - for m=1, math.min(4, matsize) do + for m = 1, math.min(4, matsize) do materials_used = materials_used + 1 if (wear - MATERIAL_TOOL_REPAIR_BOOST[m]) <= 0 then break @@ -53,6 +79,9 @@ local function get_consumed_materials(tool, material) return materials_used end +---@param table table +---@param value any +---@return boolean local function contains(table, value) for _, i in pairs(table) do if i == value then @@ -66,6 +95,8 @@ end -- Returns ("tool", input1, input2) if input1 is tool and input2 is material. -- Returns ("material", input2, input1) if input1 is material and input2 is tool. -- Returns nil otherwise. +---@param input1 ItemStack +---@param input2 ItemStack local function distinguish_tool_and_material(input1, input2) local def1 = input1:get_definition() local def2 = input2:get_definition() @@ -84,7 +115,8 @@ local function distinguish_tool_and_material(input1, input2) end end --- Helper function to make sure update_anvil_slots NEVER overstacks the output slot +---Helper function to make sure update_anvil_slots NEVER overstacks the output slot +---@param stack ItemStack local function fix_stack_size(stack) if not stack or stack == "" then return "" end local count = stack:get_count() @@ -99,6 +131,7 @@ end -- Update the inventory slots of an anvil node. -- meta: Metadata of anvil node +---@param meta NodeMetaRef local function update_anvil_slots(meta) local inv = meta:get_inventory() local new_name = meta:get_string("set_name") @@ -137,7 +170,7 @@ local function update_anvil_slots(meta) name_item = input1 new_output = name_item - -- Tool + repair item + -- Tool + repair item else -- Any tool can have a repair item. This may be defined in the tool's item definition -- as an itemstring in the field `_repair_material`. Only if this field is set, the @@ -185,7 +218,7 @@ local function update_anvil_slots(meta) new_output = "" end end - -- Exactly 1 input slot occupied + -- Exactly 1 input slot occupied elseif (not input1:is_empty() and input2:is_empty()) or (input1:is_empty() and not input2:is_empty()) then -- Just rename item if input1:is_empty() then @@ -231,28 +264,32 @@ local function update_anvil_slots(meta) end end --- Drop input items of anvil at pos with metadata meta +---Drop input items of anvil at pos with metadata meta +---@param pos Vector +---@param meta NodeMetaRef local function drop_anvil_items(pos, meta) local inv = meta:get_inventory() - for i=1, inv:get_size("input") do + for i = 1, inv:get_size("input") do local stack = inv:get_stack("input", i) if not stack:is_empty() then - local p = {x=pos.x+math.random(0, 10)/10-0.5, y=pos.y, z=pos.z+math.random(0, 10)/10-0.5} + local p = vector.offset(pos, math.random(0, 10) / 10 - 0.5, 0, math.random(0, 10) / 10 - 0.5) minetest.add_item(p, stack) end end end +---@param pos Vector +---@param node node local function damage_particles(pos, node) minetest.add_particlespawner({ amount = 30, time = 0.1, - minpos = vector.add(pos, {x=-0.5, y=-0.5, z=-0.5}), - maxpos = vector.add(pos, {x=0.5, y=-0.25, z=0.5}), - minvel = {x=-0.5, y=0.05, z=-0.5}, - maxvel = {x=0.5, y=0.3, z=0.5}, - minacc = {x=0, y=-9.81, z=0}, - maxacc = {x=0, y=-9.81, z=0}, + minpos = vector.offset(pos, -0.5, -0.5, -0.5), + maxpos = vector.offset(pos, 0.5, -0.25, 0.5), + minvel = vector.new(-0.5, 0.05, -0.5), + maxvel = vector.new(0.5, 0.3, 0.5), + minacc = vector.new(0, -9.81, 0), + maxacc = vector.new(0, -9.81, 0), minexptime = 0.1, maxexptime = 0.5, minsize = 0.4, @@ -267,12 +304,12 @@ local function destroy_particles(pos, node) minetest.add_particlespawner({ amount = math.random(20, 30), time = 0.1, - minpos = vector.add(pos, {x=-0.4, y=-0.4, z=-0.4}), - maxpos = vector.add(pos, {x=0.4, y=0.4, z=0.4}), - minvel = {x=-0.5, y=-0.1, z=-0.5}, - maxvel = {x=0.5, y=0.2, z=0.5}, - minacc = {x=0, y=-9.81, z=0}, - maxacc = {x=0, y=-9.81, z=0}, + minpos = vector.offset(pos, -0.4, -0.4, -0.4), + maxpos = vector.offset(pos, 0.4, 0.4, 0.4), + minvel = vector.new(-0.5, -0.1, -0.5), + maxvel = vector.new(0.5, 0.2, 0.5), + minacc = vector.new(0, -9.81, 0), + maxacc = vector.new(0, -9.81, 0), minexptime = 0.2, maxexptime = 0.65, minsize = 0.8, @@ -289,28 +326,29 @@ end local function damage_anvil(pos) local node = minetest.get_node(pos) if node.name == "mcl_anvils:anvil" then - minetest.swap_node(pos, {name="mcl_anvils:anvil_damage_1", param2=node.param2}) + minetest.swap_node(pos, { name = "mcl_anvils:anvil_damage_1", param2 = node.param2 }) damage_particles(pos, node) - minetest.sound_play(mcl_sounds.node_sound_metal_defaults().dig, {pos=pos, max_hear_distance=16}, true) + minetest.sound_play(mcl_sounds.node_sound_metal_defaults().dig, { pos = pos, max_hear_distance = 16 }, true) return false elseif node.name == "mcl_anvils:anvil_damage_1" then - minetest.swap_node(pos, {name="mcl_anvils:anvil_damage_2", param2=node.param2}) + minetest.swap_node(pos, { name = "mcl_anvils:anvil_damage_2", param2 = node.param2 }) damage_particles(pos, node) - minetest.sound_play(mcl_sounds.node_sound_metal_defaults().dig, {pos=pos, max_hear_distance=16}, true) + minetest.sound_play(mcl_sounds.node_sound_metal_defaults().dig, { pos = pos, max_hear_distance = 16 }, true) return false elseif node.name == "mcl_anvils:anvil_damage_2" then -- Destroy anvil local meta = minetest.get_meta(pos) drop_anvil_items(pos, meta) - minetest.sound_play(mcl_sounds.node_sound_metal_defaults().dug, {pos=pos, max_hear_distance=16}, true) + minetest.sound_play(mcl_sounds.node_sound_metal_defaults().dug, { pos = pos, max_hear_distance = 16 }, true) minetest.remove_node(pos) destroy_particles(pos, node) - minetest.check_single_for_falling({x=pos.x, y=pos.y+1, z=pos.z}) + minetest.check_single_for_falling(vector.offset(pos, 0, 1, 0)) return true end end --- Roll a virtual dice and damage anvil at a low chance. +---Roll a virtual dice and damage anvil at a low chance. +---@param pos Vector local function damage_anvil_by_using(pos) local r = math.random(1, 100) -- 12% chance @@ -321,25 +359,30 @@ local function damage_anvil_by_using(pos) end end +---@param pos Vector +---@param distance number local function damage_anvil_by_falling(pos, distance) local r = math.random(1, 100) if distance > 1 then - if r <= (5*distance) then + if r <= (5 * distance) then damage_anvil(pos) end end end +---@type nodebox local anvilbox = { type = "fixed", fixed = { { -8 / 16, -8 / 16, -6 / 16, 8 / 16, 8 / 16, 6 / 16 }, }, } + +---@type node_definition local anvildef = { - groups = {pickaxey=1, falling_node=1, falling_node_damage=1, crush_after_fall=1, deco_block=1, anvil=1}, - tiles = {"mcl_anvils_anvil_top_damaged_0.png^[transformR90", "mcl_anvils_anvil_base.png", "mcl_anvils_anvil_side.png"}, - use_texture_alpha = minetest.features.use_texture_alpha_string_modes and "opaque" or false, + groups = { pickaxey = 1, falling_node = 1, falling_node_damage = 1, crush_after_fall = 1, deco_block = 1, anvil = 1 }, + tiles = { "mcl_anvils_anvil_top_damaged_0.png^[transformR90", "mcl_anvils_anvil_base.png", "mcl_anvils_anvil_side.png" }, + use_texture_alpha = "opaque", _tt_help = S("Repair and rename items"), paramtype = "light", sunlight_propagates = true, @@ -353,7 +396,7 @@ local anvildef = { { -5 / 16, -4 / 16, -4 / 16, 5 / 16, -3 / 16, 4 / 16 }, { -4 / 16, -3 / 16, -2 / 16, 4 / 16, 2 / 16, 2 / 16 }, { -8 / 16, 2 / 16, -5 / 16, 8 / 16, 8 / 16, 5 / 16 }, - } + }, }, selection_box = anvilbox, collision_box = anvilbox, @@ -416,7 +459,7 @@ local anvildef = { local meta = minetest.get_meta(pos) if from_list == "output" and to_list == "input" then local inv = meta:get_inventory() - for i=1, inv:get_size("input") do + for i = 1, inv:get_size("input") do if i ~= to_index then local istack = inv:get_stack("input", i) istack:set_count(math.max(0, istack:get_count() - count)) @@ -504,22 +547,20 @@ local anvildef = { minetest.record_protection_violation(pos, sender_name) return end - if fields.name_button or fields.name then - local set_name - if fields.name == nil then - set_name = "" - else - set_name = fields.name - end + + if fields.name then local meta = minetest.get_meta(pos) + -- Limit name length - set_name = string.sub(set_name, 1, MAX_NAME_LENGTH) + local set_name = string.sub(fields.name, 1, MAX_NAME_LENGTH) + meta:set_string("set_name", set_name) update_anvil_slots(meta) meta:set_string("formspec", get_anvil_formspec(set_name)) end end, } + if minetest.get_modpath("screwdriver") then anvildef.on_rotate = screwdriver.rotate_simple end @@ -529,27 +570,32 @@ anvildef0.description = S("Anvil") anvildef0._doc_items_longdesc = S("The anvil allows you to repair tools and armor, and to give names to items. It has a limited durability, however. Don't let it fall on your head, it could be quite painful!") anvildef0._doc_items_usagehelp = -S("To use an anvil, rightclick it. An anvil has 2 input slots (on the left) and one output slot.").."\n".. -S("To rename items, put an item stack in one of the item slots while keeping the other input slot empty. Type in a name, hit enter or “Set Name”, then take the renamed item from the output slot.").."\n".. -S("There are two possibilities to repair tools (and armor):").."\n".. -S("• Tool + Tool: Place two tools of the same type in the input slots. The “health” of the repaired tool is the sum of the “health” of both input tools, plus a 12% bonus.").."\n".. -S("• Tool + Material: Some tools can also be repaired by combining them with an item that it's made of. For example, iron pickaxes can be repaired with iron ingots. This repairs the tool by 25%.").."\n".. -S("Armor counts as a tool. It is possible to repair and rename a tool in a single step.").."\n\n".. -S("The anvil has limited durability and 3 damage levels: undamaged, slightly damaged and very damaged. Each time you repair or rename something, there is a 12% chance the anvil gets damaged. Anvils also have a chance of being damaged when they fall by more than 1 block. If a very damaged anvil is damaged again, it is destroyed.") +S("To use an anvil, rightclick it. An anvil has 2 input slots (on the left) and one output slot.") .. "\n" .. + S("To rename items, put an item stack in one of the item slots while keeping the other input slot empty. Type in a name, hit enter or “Set Name”, then take the renamed item from the output slot.") + .. "\n" .. + S("There are two possibilities to repair tools (and armor):") .. "\n" .. + S("• Tool + Tool: Place two tools of the same type in the input slots. The “health” of the repaired tool is the sum of the “health” of both input tools, plus a 12% bonus.") + .. "\n" .. + S("• Tool + Material: Some tools can also be repaired by combining them with an item that it's made of. For example, iron pickaxes can be repaired with iron ingots. This repairs the tool by 25%.") + .. "\n" .. + S("Armor counts as a tool. It is possible to repair and rename a tool in a single step.") .. "\n\n" .. + S("The anvil has limited durability and 3 damage levels: undamaged, slightly damaged and very damaged. Each time you repair or rename something, there is a 12% chance the anvil gets damaged. Anvils also have a chance of being damaged when they fall by more than 1 block. If a very damaged anvil is damaged again, it is destroyed.") local anvildef1 = table.copy(anvildef) anvildef1.description = S("Slightly Damaged Anvil") anvildef1._doc_items_create_entry = false anvildef1.groups.anvil = 2 anvildef1._doc_items_create_entry = false -anvildef1.tiles = {"mcl_anvils_anvil_top_damaged_1.png^[transformR90", "mcl_anvils_anvil_base.png", "mcl_anvils_anvil_side.png"} +anvildef1.tiles = { "mcl_anvils_anvil_top_damaged_1.png^[transformR90", "mcl_anvils_anvil_base.png", + "mcl_anvils_anvil_side.png" } local anvildef2 = table.copy(anvildef) anvildef2.description = S("Very Damaged Anvil") anvildef2._doc_items_create_entry = false anvildef2.groups.anvil = 3 anvildef2._doc_items_create_entry = false -anvildef2.tiles = {"mcl_anvils_anvil_top_damaged_2.png^[transformR90", "mcl_anvils_anvil_base.png", "mcl_anvils_anvil_side.png"} +anvildef2.tiles = { "mcl_anvils_anvil_top_damaged_2.png^[transformR90", "mcl_anvils_anvil_base.png", + "mcl_anvils_anvil_side.png" } minetest.register_node("mcl_anvils:anvil", anvildef0) minetest.register_node("mcl_anvils:anvil_damage_1", anvildef1) @@ -562,7 +608,7 @@ if minetest.get_modpath("mcl_core") then { "mcl_core:ironblock", "mcl_core:ironblock", "mcl_core:ironblock" }, { "", "mcl_core:iron_ingot", "" }, { "mcl_core:iron_ingot", "mcl_core:iron_ingot", "mcl_core:iron_ingot" }, - } + }, }) end diff --git a/textures/mcl_anvils_inventory_arrow.png b/textures/mcl_anvils_inventory_arrow.png new file mode 100644 index 0000000000000000000000000000000000000000..722d6f636d97361752db430b0273faaeb298d183 GIT binary patch literal 238 zcmeAS@N?(olHy`uVBq!ia0vp^EkNwV!VDx+ZYSFUDWL$L5ZC;oT!#D{AkW?1eevSO zbLY;@4+vTg~xS9->MWKHV~Ye8cRrGAA? jl1j^!jDFw!-_5(@h?COJbP0l+XkK?t@pv literal 0 HcmV?d00001 diff --git a/textures/mcl_anvils_inventory_cross.png b/textures/mcl_anvils_inventory_cross.png new file mode 100644 index 0000000000000000000000000000000000000000..ec13632caa7499717fb7ee1b6460672fe86c03fe GIT binary patch literal 133 zcmeAS@N?(olHy`uVBq!ia0vp^1|ZDB3?!H8JlO)IgaUj*T=R=^8S-<0Ja>2Z#fulu zojW%_AZR&|&sY-V7tG-B>_!@pqv+}47-DfcIiaC3z#!oO%VMGCXeAMLiKz#sNch@0 b$1pJjzE~c)yqBj3sF=ai)z4*}Q$iB}g&ZXD literal 0 HcmV?d00001 diff --git a/textures/mcl_anvils_inventory_hammer.png b/textures/mcl_anvils_inventory_hammer.png new file mode 100644 index 0000000000000000000000000000000000000000..66c1f5f918a13a368deaa98c5062e6f4c8ae07a8 GIT binary patch literal 177 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`6`n4RAr_~T6BHPnnEw7Zp1|!e z%f9Z%hxt0r39}q49Wg(sOzo}%Y4%VCzR@7Dj5=NNHj9s`=|*yvV&c7ua*wDD2~ ZhRUgDYq(n``~kXw!PC{xWt~$(699$=J)Qsn literal 0 HcmV?d00001 From 7d8a1e1e5f322af2eb199c3199d76715d31f4a1d Mon Sep 17 00:00:00 2001 From: AFCMS Date: Sun, 16 Oct 2022 20:27:51 +0200 Subject: [PATCH 106/982] Fix some merging stuff --- mods/HUD/mcl_inventory/creative.lua | 6 +++--- mods/PLAYER/mcl_gamemode/init.lua | 6 +++--- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/mods/HUD/mcl_inventory/creative.lua b/mods/HUD/mcl_inventory/creative.lua index 1e0b493e3..f5e52c443 100644 --- a/mods/HUD/mcl_inventory/creative.lua +++ b/mods/HUD/mcl_inventory/creative.lua @@ -429,9 +429,9 @@ function mcl_inventory.set_creative_formspec(player) "tooltip[__mcl_doc;" .. F(S("Help")) .. "]", -- Advancements button - "image_button[11.575,3.3;1.1,1.1;mcl_achievements_button.png;__mcl_achievements;]" .. - --"style_type[image_button;border=;bgimg=;bgimg_pressed=]" .. - "tooltip[__mcl_achievements;" .. F(S("Advancements")) .. "]" .. + "image_button[11.575,3.325;1.1,1.1;mcl_achievements_button.png;__mcl_achievements;]", + --"style_type[image_button;border=;bgimg=;bgimg_pressed=]", + "tooltip[__mcl_achievements;" .. F(S("Advancements")) .. "]", -- Switch stack size button "image_button[11.575,4.575;1.1,1.1;default_apple.png;__switch_stack;]", diff --git a/mods/PLAYER/mcl_gamemode/init.lua b/mods/PLAYER/mcl_gamemode/init.lua index 7ac814073..5d9267a8c 100644 --- a/mods/PLAYER/mcl_gamemode/init.lua +++ b/mods/PLAYER/mcl_gamemode/init.lua @@ -93,14 +93,14 @@ minetest.register_chatcommand("gamemode", { if not p then return false, S("Player not online") end - if args[1] ~= nil and not in_table(args[1], gamemodes) then + if args[1] ~= nil and not in_table(args[1], mcl_gamemode.gamemodes) then return false, S("Gamemode " .. args[1] .. " does not exist.") elseif args[1] ~= nil then - mcl_inventory.player_set_gamemode(p, args[1]) + mcl_gamemode.set_gamemode(p, args[1]) end --Result message - show effective game mode local gm = p:get_meta():get_string("gamemode") - if gm == "" then gm = gamemodes[1] end + if gm == "" then gm = mcl_gamemode.gamemodes[1] end return true, S("Gamemode for player ") .. n .. S(": " .. gm) end }) From 6a2ad4e6182401c6931b6f0f26e07fd46d7a51ed Mon Sep 17 00:00:00 2001 From: AFCMS Date: Sun, 16 Oct 2022 20:41:35 +0200 Subject: [PATCH 107/982] Materialize the fact that bookshelves only store books --- mods/ITEMS/mcl_books/init.lua | 1 + textures/mcl_book_book_empty_slot.png | Bin 0 -> 115 bytes 2 files changed, 1 insertion(+) create mode 100644 textures/mcl_book_book_empty_slot.png diff --git a/mods/ITEMS/mcl_books/init.lua b/mods/ITEMS/mcl_books/init.lua index e8c53ed8a..7c223030c 100644 --- a/mods/ITEMS/mcl_books/init.lua +++ b/mods/ITEMS/mcl_books/init.lua @@ -392,6 +392,7 @@ local function bookshelf_gui(pos, node, clicker) "label[0.375,0.375;" .. F(C(mcl_formspec.label_color, name)) .. "]", mcl_formspec.get_itemslot_bg_v4(0.375, 0.75, 9, 3), + mcl_formspec.get_itemslot_bg_v4(0.375, 0.75, 9, 3, 0, "mcl_book_book_empty_slot.png"), "list[nodemeta:" .. pos.x .. "," .. pos.y .. "," .. pos.z .. ";main;0.375,0.75;9,3;]", "label[0.375,4.7;" .. F(C(mcl_formspec.label_color, S("Inventory"))) .. "]", diff --git a/textures/mcl_book_book_empty_slot.png b/textures/mcl_book_book_empty_slot.png new file mode 100644 index 0000000000000000000000000000000000000000..e6a50bd9e63f4781283fca8eed19641e3a384734 GIT binary patch literal 115 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`R-P`7Ar`&K2@-Qj;=31C1C&n literal 0 HcmV?d00001 From c8620685c0d94ae0f34cab26948d3fc853d72a23 Mon Sep 17 00:00:00 2001 From: AFCMS Date: Sun, 16 Oct 2022 20:53:25 +0200 Subject: [PATCH 108/982] Move stack size button label lower --- mods/HUD/mcl_inventory/creative.lua | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mods/HUD/mcl_inventory/creative.lua b/mods/HUD/mcl_inventory/creative.lua index f5e52c443..c7567189d 100644 --- a/mods/HUD/mcl_inventory/creative.lua +++ b/mods/HUD/mcl_inventory/creative.lua @@ -435,7 +435,7 @@ function mcl_inventory.set_creative_formspec(player) -- Switch stack size button "image_button[11.575,4.575;1.1,1.1;default_apple.png;__switch_stack;]", - "label[12.275,5.28;" .. F(C("#FFFFFF", tostring(stack_size ~= 1 and stack_size or ""))) .. "]", + "label[12.275,5.35;" .. F(C("#FFFFFF", tostring(stack_size ~= 1 and stack_size or ""))) .. "]", "tooltip[__switch_stack;" .. F(S("Switch stack size")) .. "]", -- Skins button From 7cf91c79cb1813089874460b821176eaea83d7a8 Mon Sep 17 00:00:00 2001 From: AFCMS Date: Tue, 18 Oct 2022 14:49:21 +0200 Subject: [PATCH 109/982] Smithing Table --- .luarc.json | 22 +++++ mods/ITEMS/mcl_smithing_table/init.lua | 86 +++++++++++------- mods/ITEMS/mcl_smithing_table/mod.conf | 2 +- textures/mcl_smithing_table_bottom.png | Bin 240 -> 284 bytes textures/mcl_smithing_table_front.png | Bin 263 -> 298 bytes .../mcl_smithing_table_inventory_hammer.png | Bin 0 -> 178 bytes textures/mcl_smithing_table_side.png | Bin 241 -> 283 bytes textures/mcl_smithing_table_top.png | Bin 283 -> 320 bytes 8 files changed, 77 insertions(+), 33 deletions(-) create mode 100644 .luarc.json create mode 100644 textures/mcl_smithing_table_inventory_hammer.png diff --git a/.luarc.json b/.luarc.json new file mode 100644 index 000000000..7e9e92042 --- /dev/null +++ b/.luarc.json @@ -0,0 +1,22 @@ +{ + "runtime.version": "LuaJIT", + "diagnostics": { "disable": ["lowercase-global"] }, + "diagnostics.globals": [ + "minetest", + "dump", + "dump2", + "Raycast", + "Settings", + "PseudoRandom", + "PerlinNoise", + "VoxelManip", + "SecureRandom", + "VoxelArea", + "PerlinNoiseMap", + "PcgRandom", + "ItemStack", + "AreaStore", + "vector" + ], + "workspace.ignoreDir": [".luacheckrc"] +} diff --git a/mods/ITEMS/mcl_smithing_table/init.lua b/mods/ITEMS/mcl_smithing_table/init.lua index dbb6c620f..5d0becad7 100644 --- a/mods/ITEMS/mcl_smithing_table/init.lua +++ b/mods/ITEMS/mcl_smithing_table/init.lua @@ -1,11 +1,13 @@ ---[[ -By EliasFleckenstein03 and Code-Sploit -]] +-- By EliasFleckenstein03 and Code-Sploit local S = minetest.get_translator("mcl_smithing_table") +local F = minetest.formspec_escape +local C = minetest.colorize + mcl_smithing_table = {} --- Function to upgrade diamond tool/armor to netherite tool/armor +---Function to upgrade diamond tool/armor to netherite tool/armor +---@param itemstack ItemStack function mcl_smithing_table.upgrade_item(itemstack) local def = itemstack:get_definition() @@ -29,28 +31,48 @@ function mcl_smithing_table.upgrade_item(itemstack) return itemstack end --- Badly copied over from mcl_anvils --- ToDo: Make better formspec +local formspec = table.concat({ + "formspec_version[4]", + "size[11.75,10.425]", -local formspec = "size[9,9]" .. - "background[-0.19,-0.25;9.41,9.49;mcl_smithing_table_inventory.png]".. - "label[0,4.0;" .. minetest.formspec_escape(minetest.colorize(mcl_colors.DARK_GRAY, S("Inventory"))) .. "]" .. - "list[current_player;main;0,4.5;9,3;9]" .. - mcl_formspec.get_itemslot_bg(0,4.5,9,3) .. - "list[current_player;main;0,7.74;9,1;]" .. - mcl_formspec.get_itemslot_bg(0,7.74,9,1) .. - "list[context;diamond_item;1,2.5;1,1;]" .. - mcl_formspec.get_itemslot_bg(1,2.5,1,1) .. - "list[context;netherite;4,2.5;1,1;]" .. - mcl_formspec.get_itemslot_bg(4,2.5,1,1) .. - "list[context;upgraded_item;8,2.5;1,1;]" .. - mcl_formspec.get_itemslot_bg(8,2.5,1,1) .. - "label[3,0.1;" .. minetest.formspec_escape(minetest.colorize(mcl_colors.DARK_GRAY, S("Upgrade Gear"))) .. "]" .. - "listring[context;output]".. - "listring[current_player;main]".. - "listring[context;input]".. - "listring[current_player;main]" + "label[4.125,0.375;" .. F(C(mcl_formspec.label_color, S("Upgrade Gear"))) .. "]", + "image[0.875,0.375;1.75,1.75;mcl_smithing_table_inventory_hammer.png]", + + mcl_formspec.get_itemslot_bg_v4(1.625, 2.6, 1, 1), + "list[context;diamond_item;1.625,2.6;1,1;]", + + "image[3.5,2.6;1,1;mcl_anvils_inventory_cross.png]", + + mcl_formspec.get_itemslot_bg_v4(5.375, 2.6, 1, 1), + "list[context;netherite;5.375,2.6;1,1;]", + + "image[6.75,2.6;2,1;mcl_anvils_inventory_arrow.png]", + + mcl_formspec.get_itemslot_bg_v4(9.125, 2.6, 1, 1), + "list[context;upgraded_item;9.125,2.6;1,1;]", + + -- Player Inventory + + mcl_formspec.get_itemslot_bg_v4(0.375, 5.1, 9, 3), + "list[current_player;main;0.375,5.1;9,3;9]", + + mcl_formspec.get_itemslot_bg_v4(0.375, 9.05, 9, 1), + "list[current_player;main;0.375,9.05;9,1;]", + + -- Listrings + + "listring[context;diamond_item]", + "listring[current_player;main]", + "listring[context;netherite]", + "listring[current_player;main]", + "listring[context;upgraded_item]", + "listring[current_player;main]", + "listring[current_player;main]", + "listring[context;diamond_item]", +}) + +---@param pos Vector local function reset_upgraded_item(pos) local inv = minetest.get_meta(pos):get_inventory() local upgraded_item @@ -66,8 +88,7 @@ minetest.register_node("mcl_smithing_table:table", { description = S("Smithing table"), -- ToDo: Add _doc_items_longdesc and _doc_items_usagehelp - stack_max = 64, - groups = {pickaxey = 2, deco_block = 1}, + groups = { pickaxey = 2, deco_block = 1 }, tiles = { "mcl_smithing_table_top.png", @@ -92,7 +113,8 @@ minetest.register_node("mcl_smithing_table:table", { end, allow_metadata_inventory_put = function(pos, listname, index, stack, player) - if listname == "diamond_item" and mcl_smithing_table.upgrade_item(stack) or listname == "netherite" and stack:get_name() == "mcl_nether:netherite_ingot" then + if listname == "diamond_item" and mcl_smithing_table.upgrade_item(stack) or + listname == "netherite" and stack:get_name() == "mcl_nether:netherite_ingot" then return stack:get_count() end @@ -119,7 +141,7 @@ minetest.register_node("mcl_smithing_table:table", { take_item("netherite") -- ToDo: make epic sound - minetest.sound_play("mcl_smithing_table_upgrade", {pos = pos, max_hear_distance = 16}) + minetest.sound_play("mcl_smithing_table_upgrade", { pos = pos, max_hear_distance = 16 }) end if listname == "upgraded_item" then if stack:get_name() == "mcl_farming:hoe_netherite" then @@ -138,8 +160,8 @@ minetest.register_node("mcl_smithing_table:table", { minetest.register_craft({ output = "mcl_smithing_table:table", recipe = { - {"mcl_core:iron_ingot", "mcl_core:iron_ingot", ""}, - {"group:wood", "group:wood", ""}, - {"group:wood", "group:wood", ""} - } + { "mcl_core:iron_ingot", "mcl_core:iron_ingot", "" }, + { "group:wood", "group:wood", "" }, + { "group:wood", "group:wood", "" } + }, }) diff --git a/mods/ITEMS/mcl_smithing_table/mod.conf b/mods/ITEMS/mcl_smithing_table/mod.conf index aee93fa65..1c12cb483 100644 --- a/mods/ITEMS/mcl_smithing_table/mod.conf +++ b/mods/ITEMS/mcl_smithing_table/mod.conf @@ -1,2 +1,2 @@ name = mcl_smithing_table -depends = mcl_colors, mcl_formspec +depends = mcl_colors, mcl_formspec, mcl_anvils diff --git a/textures/mcl_smithing_table_bottom.png b/textures/mcl_smithing_table_bottom.png index d44c0773ea51d8f2b95c5cfa02d5f54ba6ca1e34..cca0ebf1428aea62b5de7844d76df482482ead40 100644 GIT binary patch delta 269 zcmV+o0rLLv0h|Jm7=H)?0001xk!Usm0084jL_t(2Q+<-L3IZ_@MDqzD<^6%3gtr`4kT*Jw$r;?h zsMT)a9%h_Cp{GfY8z3`UllSx{&-Y0?vq)VYSQH`9SfSJTCRvd`JFRsOj_9}^`e2+? zp5**UR*(=6mesG3OO*;G0Pxm+ON3X{@?IqZSvli=LzLCT#ORc+9q=F0B(kR*)R$iq a8;^gOpes$)gLioV0000(V2XOTbd`kb`f6ZO51%Eu$C85T6hh_gO*zJ zrVw!p1yT%Wr~T@0fjrN%EE{W$vwZsKVpp7@0{BPB3|xF?OBR5~kPOgn3_j{wz#BleBp;hwvVgZ% g7|Y}7ZVA8-;1k#23E5OqA^-pY07*qoM6N<$f^D9B0RR91 delta 246 zcmV%CMPE+C@3f? zDJd!{DlRTAFE1}NG&DFF7eGKjLn0tfJ}^&DPgX4}Sw=T;Rz!SXOp4^0)!m~`z+V5@y<**%XLA(y7vNa6#e5J4^*PhCjzV+_0i};>m9hP`B0a% wQ_43Of1;;Wm!eC!=rx|=5>8=0)sM0K16gc3WlB;-mjD0&07*qoM6N<$f@QZ_0ssI2 diff --git a/textures/mcl_smithing_table_inventory_hammer.png b/textures/mcl_smithing_table_inventory_hammer.png new file mode 100644 index 0000000000000000000000000000000000000000..48a21e97dbb3f3ed76930150de82b93bd2ff227a GIT binary patch literal 178 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`m7Xq+Ar_~T6BHO!RFC{Op1|!e z%eR;3-{e#dA7hT!S(y#IonN>7^xu?L;(Vz&ro)_N3FmA@m7Ofp64sjF(t0y~$Yhcm9(po*u?=43~JgOnzmzu}a;X brOC>0sGz1VDWvBa&=Cxtu6{1-oD!M<5duKG literal 0 HcmV?d00001 diff --git a/textures/mcl_smithing_table_side.png b/textures/mcl_smithing_table_side.png index fbc1a9a23610d4afd2a51f565058a50f74f24e40..d93a7906ce77f831ff3509f956e2114a141308fb 100644 GIT binary patch delta 267 zcmV+m0rdXy0hMA%%S6zJoSKq*=^lNjC>3PKvN-oKlKbquu?wsp4(rYB}xLSB7Y9XUq25rG( z3nf~NSg{yyrbGJ`6-LAZWD~gVW>HnfchKzHX&qH%z5oL#fPW`22$4V<+g3|kfTYWI zE_oQj`~k{hDF8+QR3iZ}oB${;yRJS-kiC5ec6!~9s_)17R{^pt^Btb$K2Xbxhq`H+ zwg6fmRudfqgQt$<0r?|zhv-?+79dyBm|WA|R{-k90Xe81w-f04k?dIkKE;jKtGmh> R+yDRo07*qoL>-||3@o88ogw8JZ5N;woH^!2I4dkX|0KgVGhO01z9+CI^vO)fIjm|0-KGP zl?(R8wLt<&g1ZE522EsC<|hL9{V(w`n827Wxcl$v=PTXRcr7IA>08Gix*005AYXf^-<0S8G$K~yMHb&|^tf-n$8`4SQlS@^2b5DbPy zUAS`N!j&6${{J6%+Dpa?@unribk01WnR9L#HTxBwMbtd1EK6+s83(WXnWx{aFGr94 zyq#?EijyOvv5TU}K$Xl*QeyXg z9~$amXsj1|Tc|Y=#q{GXt!3^aH5EG|04!eSU%W<7ySA!p}$q&*bl3QlP4}hx(TB9G> Ro&W#<07*qoL Date: Sun, 23 Oct 2022 01:03:51 +0200 Subject: [PATCH 110/982] Fix rebase breaking creative digging --- mods/PLAYER/mcl_gamemode/init.lua | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mods/PLAYER/mcl_gamemode/init.lua b/mods/PLAYER/mcl_gamemode/init.lua index 5d9267a8c..baee7ca45 100644 --- a/mods/PLAYER/mcl_gamemode/init.lua +++ b/mods/PLAYER/mcl_gamemode/init.lua @@ -69,7 +69,7 @@ minetest.register_on_punchnode(function(pos, node, puncher, pointed_thing) local def = minetest.registered_nodes[node.name] if def then if def.on_destruct then def.on_destruct(pos) end - minetest.remove_node(pos) + minetest.dig_node(pos) return true end end) From 3bbae86bafd476dc4838987381dc7dcb91ae130d Mon Sep 17 00:00:00 2001 From: AFCMS Date: Wed, 9 Nov 2022 20:48:51 +0100 Subject: [PATCH 111/982] Fix this stupid merge conflict --- mods/HUD/mcl_inventory/init.lua | 301 +----------------------------- mods/PLAYER/mcl_gamemode/init.lua | 2 +- 2 files changed, 4 insertions(+), 299 deletions(-) diff --git a/mods/HUD/mcl_inventory/init.lua b/mods/HUD/mcl_inventory/init.lua index 6edfc3d78..52fbd268b 100644 --- a/mods/HUD/mcl_inventory/init.lua +++ b/mods/HUD/mcl_inventory/init.lua @@ -1,300 +1,6 @@ local S = minetest.get_translator(minetest.get_current_modname()) local F = minetest.formspec_escape -mcl_inventory = {} - ---local mod_player = minetest.get_modpath("mcl_player") ---local mod_craftguide = minetest.get_modpath("mcl_craftguide") - ----Returns a single itemstack in the given inventory to the main inventory, or drop it when there's no space left. ----@param itemstack ItemStack ----@param dropper ObjectRef ----@param pos Vector ----@param inv InvRef -local function return_item(itemstack, dropper, pos, inv) - if dropper:is_player() then - -- Return to main inventory - if inv:room_for_item("main", itemstack) then - inv:add_item("main", itemstack) - else - -- Drop item on the ground - local v = dropper:get_look_dir() - local p = vector.offset(pos, 0, 1.2, 0) - p.x = p.x + (math.random(1, 3) * 0.2) - p.z = p.z + (math.random(1, 3) * 0.2) - local obj = minetest.add_item(p, itemstack) - if obj then - v.x = v.x * 4 - v.y = v.y * 4 + 2 - v.z = v.z * 4 - obj:set_velocity(v) - obj:get_luaentity()._insta_collect = false - end - end - else - -- Fallback for unexpected cases - minetest.add_item(pos, itemstack) - end - return itemstack -end - ----Return items in the given inventory list (name) to the main inventory, or drop them if there is no space left. ----@param player ObjectRef ----@param name string -local function return_fields(player, name) - local inv = player:get_inventory() - - ---@diagnostic disable need-check-nil - - local list = inv:get_list(name) - if not list then return end - for i, stack in ipairs(list) do - return_item(stack, player, player:get_pos(), inv) - stack:clear() - inv:set_stack(name, i, stack) - end - - ---@diagnostic enable need-check-nil -end - ----@param player ObjectRef -local function set_inventory(player) - if minetest.is_creative_enabled(player:get_player_name()) then - mcl_inventory.set_creative_formspec(player) - return - end - - local inv = player:get_inventory() - - ---@diagnostic disable need-check-nil - inv:set_width("craft", 2) - inv:set_size("craft", 4) - - local armor_slots = { "helmet", "chestplate", "leggings", "boots" } - local armor_slot_imgs = "" - - for a = 1, 4 do - if inv:get_stack("armor", a + 1):is_empty() then - armor_slot_imgs = armor_slot_imgs .. - "image[0.375," .. - (0.375 + (a - 1) * 1.25) .. ";1,1;mcl_inventory_empty_armor_slot_" .. armor_slots[a] .. ".png]" - end - end - - if inv:get_stack("offhand", 1):is_empty() then - armor_slot_imgs = armor_slot_imgs .. "image[5.375,4.125;1,1;mcl_inventory_empty_armor_slot_shield.png]" - end - - ---@diagnostic enable need-check-nil - - local form = table.concat({ - "formspec_version[6]", - "size[11.75,10.9]", - - --Armor slots - mcl_formspec.get_itemslot_bg_v4(0.375, 0.375, 1, 4), - "list[current_player;armor;0.375,0.375;1,1;1]", - "list[current_player;armor;0.375,1.625;1,1;2]", - "list[current_player;armor;0.375,2.875;1,1;3]", - "list[current_player;armor;0.375,4.125;1,1;4]", - - --Main inventory - mcl_formspec.get_itemslot_bg_v4(0.375, 5.575, 9, 3), - "list[current_player;main;0.375,5.575;9,3;9]", - - --Hotbar - mcl_formspec.get_itemslot_bg_v4(0.375, 9.525, 9, 1), - "list[current_player;main;0.375,9.525;9,1;]", - - --Player model - "image[1.57,0.343;3.62,4.85;mcl_inventory_background9.png;2]", - mcl_player.get_player_formspec_model(player, 1.57, 0.4, 3.62, 4.85, ""), - - --Offhand - mcl_formspec.get_itemslot_bg_v4(5.375, 4.125, 1, 1), - "list[current_player;offhand;5.375,4.125;1,1]", - - armor_slot_imgs, - - --Craft grid - "label[6.61,0.5;" .. F(minetest.colorize(mcl_formspec.label_color, S("Crafting"))) .. "]", - mcl_formspec.get_itemslot_bg_v4(6.625, 0.875, 2, 2), - "list[current_player;craft;6.625,0.875;2,2]", - - "image[9.125,1.5;1,1;crafting_formspec_arrow.png]", - - mcl_formspec.get_itemslot_bg_v4(10.375, 1.5, 1, 1), - "list[current_player;craftpreview;10.375,1.5;1,1;]", - - --Crafting guide button - "image_button[6.575,4.075;1.1,1.1;craftguide_book.png;__mcl_craftguide;]", - "tooltip[__mcl_craftguide;" .. F(S("Recipe book")) .. "]", - - --Help button - "image_button[7.825,4.075;1.1,1.1;doc_button_icon_lores.png;__mcl_doc;]", - "tooltip[__mcl_doc;" .. F(S("Help")) .. "]", - - --Skins button - "image_button[9.075,4.075;1.1,1.1;mcl_skins_button.png;__mcl_skins;]", - "tooltip[__mcl_skins;" .. F(S("Select player skin")) .. "]", - - --Advancements button - "image_button[10.325,4.075;1.1,1.1;mcl_achievements_button.png;__mcl_achievements;]", - "tooltip[__mcl_achievements;" .. F(S("Advancements")) .. "]", - - --Listring - "listring[current_player;main]", - "listring[current_player;armor]", - "listring[current_player;main]", - "listring[current_player;craft]", - "listring[current_player;main]", - }) - - player:set_inventory_formspec(form) -end - --- Drop items in craft grid and reset inventory on closing -minetest.register_on_player_receive_fields(function(player, formname, fields) - if fields.quit then - return_fields(player, "craft") - return_fields(player, "enchanting_lapis") - return_fields(player, "enchanting_item") - if not minetest.is_creative_enabled(player:get_player_name()) and (formname == "" or formname == "main") then - set_inventory(player) - end - end -end) - -mcl_inventory.update_inventory_formspec = set_inventory - --- Drop crafting grid items on leaving -minetest.register_on_leaveplayer(function(player) - return_fields(player, "craft") - return_fields(player, "enchanting_lapis") - return_fields(player, "enchanting_item") -end) - -minetest.register_on_joinplayer(function(player) - --init inventory - local inv = player:get_inventory() - - ---get_inventory can return nil if object isn't a player, but we are sure this is one :) - ---@diagnostic disable need-check-nil - inv:set_width("main", 9) - inv:set_size("main", 36) - inv:set_size("offhand", 1) - ---@diagnostic enable need-check-nil - - --set hotbar size - player:hud_set_hotbar_itemcount(9) - --add hotbar images - player:hud_set_hotbar_image("mcl_inventory_hotbar.png") - player:hud_set_hotbar_selected_image("mcl_inventory_hotbar_selected.png") - - -- In Creative Mode, the initial inventory setup is handled in creative.lua - if not minetest.is_creative_enabled(player:get_player_name()) then - set_inventory(player) - end - - --[[ Make sure the crafting grid is empty. Why? Because the player might have - items remaining in the crafting grid from the previous join; this is likely - when the server has been shutdown and the server didn't clean up the player - inventories. ]] - return_fields(player, "craft") - return_fields(player, "enchanting_item") - return_fields(player, "enchanting_lapis") -end) - - -dofile(minetest.get_modpath(minetest.get_current_modname()) .. "/creative.lua") - -local mt_is_creative_enabled = minetest.is_creative_enabled - -function minetest.is_creative_enabled(name) - if mt_is_creative_enabled(name) then return true end - if not name then return false end - local p = minetest.get_player_by_name(name) - if p then - return p:get_meta():get_string("gamemode") == "creative" - end - return false -end - ---Insta "digging" nodes in gamemode-creative -minetest.register_on_punchnode(function(pos, node, puncher, pointed_thing) - if not puncher or not puncher:is_player() then return end - local name = puncher:get_player_name() - if not minetest.is_creative_enabled(name) then return end - if pointed_thing.type ~= "node" then return end - local def = minetest.registered_nodes[node.name] - if def then - minetest.node_dig(pos, node, puncher) - return true - end -end) - ---Don't subtract from inv when placing in gamemode-creative -minetest.register_on_placenode(function(pos, newnode, placer, oldnode, itemstack, pointed_thing) - if placer and placer:is_player() and minetest.is_creative_enabled(placer:get_player_name()) then return true end -end) - -local function in_table(n, h) - for k, v in pairs(h) do - if v == n then return true end - end - return false -end - -local gamemodes = { - "survival", - "creative" -} - -function mcl_inventory.player_set_gamemode(p, g) - local m = p:get_meta() - m:set_string("gamemode", g) - if g == "survival" then - mcl_experience.setup_hud(p) - mcl_experience.update(p) - elseif g == "creative" then - mcl_experience.remove_hud(p) - end - mcl_meshhand.update_player(p) - set_inventory(p) -end - -minetest.register_chatcommand("gamemode", { - params = S("[] []"), - description = S("Change gamemode (survival/creative) for yourself or player"), - privs = { server = true }, - func = function(n, param) - -- Full input validation ( just for @erlehmann <3 ) - local p - local args = param:split(" ") - if args[2] ~= nil then - p = minetest.get_player_by_name(args[2]) - n = args[2] - else - p = minetest.get_player_by_name(n) - end - if not p then - return false, S("Player not online") - end - if args[1] ~= nil and not in_table(args[1], gamemodes) then - return false, S("Gamemode " .. args[1] .. " does not exist.") - elseif args[1] ~= nil then - mcl_inventory.player_set_gamemode(p, args[1]) - end - - --Result message - show effective game mode - local gm = p:get_meta():get_string("gamemode") - if gm == "" then gm = gamemodes[1] end - return true, S("Gamemode for player ") .. n .. S(": " .. gm) - end -}) -local S = minetest.get_translator(minetest.get_current_modname()) -local F = minetest.formspec_escape - ---get_inventory can return nil if object isn't a player, but we are sure sometimes this is one :) ---@diagnostic disable need-check-nil @@ -381,10 +87,9 @@ minetest.register_on_player_receive_fields(function(player, formname, fields) end end) -if not minetest.is_creative_enabled("") then - function mcl_inventory.update_inventory_formspec(player) - set_inventory(player) - end + +function mcl_inventory.update_inventory_formspec(player) + set_inventory(player) end -- Drop crafting grid items on leaving diff --git a/mods/PLAYER/mcl_gamemode/init.lua b/mods/PLAYER/mcl_gamemode/init.lua index baee7ca45..9b23922a4 100644 --- a/mods/PLAYER/mcl_gamemode/init.lua +++ b/mods/PLAYER/mcl_gamemode/init.lua @@ -69,7 +69,7 @@ minetest.register_on_punchnode(function(pos, node, puncher, pointed_thing) local def = minetest.registered_nodes[node.name] if def then if def.on_destruct then def.on_destruct(pos) end - minetest.dig_node(pos) + minetest.node_dig(pos, node, puncher) return true end end) From 653f82198ee88253e13a6cf77a723e6f51d7702d Mon Sep 17 00:00:00 2001 From: AFCMS Date: Tue, 15 Nov 2022 22:06:53 +0100 Subject: [PATCH 112/982] Apply MysticTempest fixes to enchanting table --- mods/ITEMS/mcl_enchanting/engine.lua | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/mods/ITEMS/mcl_enchanting/engine.lua b/mods/ITEMS/mcl_enchanting/engine.lua index 57fde4dd5..01ef51a54 100644 --- a/mods/ITEMS/mcl_enchanting/engine.lua +++ b/mods/ITEMS/mcl_enchanting/engine.lua @@ -516,10 +516,10 @@ function mcl_enchanting.show_enchanting_formspec(player) mcl_formspec.get_itemslot_bg_v4(1, 3.25, 1, 1), "list[current_player;enchanting_item;1,3.25;1,1]", mcl_formspec.get_itemslot_bg_v4(2.25, 3.25, 1, 1), + "image[2.25,3.25;1,1;mcl_enchanting_lapis_background.png]", "list[current_player;enchanting_lapis;2.25,3.25;1,1]", - "image[2.25,2.4;1,1;mcl_enchanting_lapis_background.png]", - "image[4.125,0.375;7.25,4.1;mcl_enchanting_button_background.png]", + "image[4.125,0.56;7.25,4.1;mcl_enchanting_button_background.png]", "label[0.375,4.7;" .. F(C(mcl_formspec.label_color) .. S("Inventory")) .. "]", @@ -574,7 +574,7 @@ function mcl_enchanting.show_enchanting_formspec(player) ending .. ".png;bgimg_hovered=mcl_enchanting_button" .. hover_ending .. ".png;bgimg_pressed=mcl_enchanting_button" .. hover_ending .. ".png]" - .. "button[0,0;7.5,1.3;button_" .. i .. ";]" + .. "button[0,0;7.25,1.3;button_" .. i .. ";]" .. (slot and "image[0,0;1.3,1.3;mcl_enchanting_number_" .. i .. ending .. ".png]" or "") .. (slot and "label[6.8,1;" .. C(can_enchant and "#80FF20" or "#407F10") .. slot.level_requirement .. "]" or "") .. (slot and slot.glyphs or "") From cd6dd4d851e5be504adc0f2c852e939cf9070565 Mon Sep 17 00:00:00 2001 From: AFCMS Date: Wed, 28 Jun 2023 16:16:26 +0200 Subject: [PATCH 113/982] Fix merge conflict (huge chests) --- mods/ITEMS/mcl_chests/init.lua | 2 -- 1 file changed, 2 deletions(-) diff --git a/mods/ITEMS/mcl_chests/init.lua b/mods/ITEMS/mcl_chests/init.lua index 8158b0a32..9e058af2d 100644 --- a/mods/ITEMS/mcl_chests/init.lua +++ b/mods/ITEMS/mcl_chests/init.lua @@ -65,7 +65,6 @@ local entity_animations = { minetest.register_entity("mcl_chests:chest", { initial_properties = { visual = "mesh", - visual_size = { x = 3, y = 3 }, pointable = false, physical = false, static_save = false, @@ -150,7 +149,6 @@ minetest.register_entity("mcl_chests:chest", { local function get_entity_pos(pos, dir, double) pos = vector.copy(pos) - pos.y = pos.y - 0.49 if double then local add, mul, vec, cross = vector.add, vector.multiply, vector.new, vector.cross pos = add(pos, mul(cross(dir, vec(0, 1, 0)), -0.5)) From 0e13190ea48656a3d30e2c75796a1f8a4e3ebbfe Mon Sep 17 00:00:00 2001 From: AFCMS Date: Thu, 29 Jun 2023 08:23:44 +0200 Subject: [PATCH 114/982] Fix reabse problem with `mcl_inventory` --- mods/HUD/mcl_inventory/mod.conf | 5 ----- 1 file changed, 5 deletions(-) diff --git a/mods/HUD/mcl_inventory/mod.conf b/mods/HUD/mcl_inventory/mod.conf index 80aab2ab1..66f175c3b 100644 --- a/mods/HUD/mcl_inventory/mod.conf +++ b/mods/HUD/mcl_inventory/mod.conf @@ -1,10 +1,5 @@ name = mcl_inventory author = BlockMen description = Adds the player inventory and creative inventory. -<<<<<<< HEAD -depends = mcl_init, mcl_formspec, mcl_enchanting, mcl_player -optional_depends = mcl_armor, mcl_brewing, mcl_potions, mcl_enchanting, mcl_craftguide -======= depends = mcl_init, mcl_formspec, mcl_enchanting, mcl_gamemode optional_depends = mcl_armor, mcl_brewing, mcl_potions, mcl_enchanting, mcl_craftguide, mcl_player ->>>>>>> a2429154d (survival inventory tabs API + mcl_gamemode) From 4db0631133f32a7d46fe1604037dfaa2aa2b8a4c Mon Sep 17 00:00:00 2001 From: AFCMS Date: Thu, 29 Jun 2023 08:39:58 +0200 Subject: [PATCH 115/982] `mcl_inventory` creative fixes - Add many comments (I had a really hard time understanding the code) - Add some more type annotations (https://github.com/minetest-toolkit/minetest-lsp-api) - Rename non english variable --- mods/HUD/mcl_inventory/creative.lua | 121 ++++++++++++++++++++-------- mods/PLAYER/mcl_player/init.lua | 2 +- 2 files changed, 90 insertions(+), 33 deletions(-) diff --git a/mods/HUD/mcl_inventory/creative.lua b/mods/HUD/mcl_inventory/creative.lua index c7567189d..a896fa0de 100644 --- a/mods/HUD/mcl_inventory/creative.lua +++ b/mods/HUD/mcl_inventory/creative.lua @@ -3,20 +3,35 @@ local F = minetest.formspec_escape local C = minetest.colorize -- Prepare player info table +---@type table local players = {} -- Containing all the items for each Creative Mode tab +---@type table local inventory_lists = {} ---local mod_player = minetest.get_modpath("mcl_player") - -- Create tables -local builtin_filter_ids = { "blocks", "deco", "redstone", "rail", "food", "tools", "combat", "mobs", "brew", "matr", - "misc", "all" } +---@type string[] +local builtin_filter_ids = { + "blocks", + "deco", + "redstone", + "rail", + "food", + "tools", + "combat", + "mobs", + "brew", + "matr", + "misc", + "all" +} + for _, f in pairs(builtin_filter_ids) do inventory_lists[f] = {} end +---@param tbl string[] local function replace_enchanted_books(tbl) for k, item in ipairs(tbl) do if item:find("mcl_enchanting:book_enchanted") == 1 then @@ -29,21 +44,24 @@ local function replace_enchanted_books(tbl) end end ---[[ Populate all the item tables. We only do this once. Note this code must be -executed after loading all the other mods in order to work. ]] +-- Populate all the item tables. We only do this once. +-- Note this code must be executed after loading all the other mods in order to work. minetest.register_on_mods_loaded(function() for name, def in pairs(minetest.registered_items) do if (not def.groups.not_in_creative_inventory or def.groups.not_in_creative_inventory == 0) and def.description and def.description ~= "" then + ---@param def mt.ItemDef|mt.NodeDef local function is_redstone(def) return def.mesecons or def.groups.mesecon or def.groups.mesecon_conductor_craftable or def.groups.mesecon_effecor_off end + ---@param def mt.ItemDef|mt.NodeDef local function is_tool(def) return def.groups.tool or (def.tool_capabilities and def.tool_capabilities.damage_groups == nil) end + ---@param def mt.ItemDef|mt.NodeDef local function is_weapon_or_armor(def) return def.groups.weapon or def.groups.weapon_ranged or def.groups.ammo or def.groups.combat_item or ( @@ -120,6 +138,11 @@ minetest.register_on_mods_loaded(function() end end) +---@param name string +---@param description string +---@param lang mt.LangCode +---@param filter string +---@return integer local function filter_item(name, description, lang, filter) local desc if not lang then @@ -130,6 +153,8 @@ local function filter_item(name, description, lang, filter) return string.find(name, filter, nil, true) or string.find(desc, filter, nil, true) end +---@param filter string +---@param player mt.PlayerObjectRef local function set_inv_search(filter, player) local playername = player:get_player_name() local inv = minetest.get_inventory({ type = "detached", name = "creative_" .. playername }) @@ -158,6 +183,8 @@ local function set_inv_search(filter, player) inv:set_list("main", creative_list) end +---@param page string +---@param player mt.PlayerObjectRef local function set_inv_page(page, player) local playername = player:get_player_name() local inv = minetest.get_inventory({ type = "detached", name = "creative_" .. playername }) @@ -171,6 +198,8 @@ local function set_inv_page(page, player) inv:set_list("main", creative_list) end + +---@param player mt.PlayerObjectRef local function init(player) local playername = player:get_player_name() minetest.create_detached_inventory("creative_" .. playername, { @@ -208,18 +237,39 @@ local trash = minetest.create_detached_inventory("trash", { inv:set_stack(listname, index, "") end, }) + trash:set_size("main", 1) -local noffset = {} -- numeric tab offset -local offset = {} -- string offset: -local boffset = {} -- -local hoch = {} +------------------------------ +-- Formspec Precalculations -- +------------------------------ + +-- Numeric position of tab background image, indexed by tab name +---@type table +local noffset = {} + +-- String position of tab button background image, indexed by tab name +---@type table +local offset = {} + +-- String position of tab button, indexed by tab name +---@type table +local boffset = {} + +-- Used to determine the tab button background image +---@type table +local button_bg_postfix = {} + +-- Tab caption/tooltip translated string, indexed by tab name +---@type table local filtername = {} ---local bg = {} local noffset_x_start = 0.2 local noffset_x = noffset_x_start local noffset_y = -1.34 + +---@param id string +---@param right? boolean local function next_noffset(id, right) if right then noffset[id] = { 11.3, noffset_y } @@ -254,20 +304,20 @@ for k, v in pairs(noffset) do boffset[k] = tostring(v[1] + 0.24) .. "," .. tostring(v[2] + 0.25) end -hoch["blocks"] = "" -hoch["deco"] = "" -hoch["redstone"] = "" -hoch["rail"] = "" -hoch["brew"] = "" -hoch["misc"] = "" -hoch["nix"] = "" -hoch["default"] = "" -hoch["food"] = "_down" -hoch["tools"] = "_down" -hoch["combat"] = "_down" -hoch["mobs"] = "_down" -hoch["matr"] = "_down" -hoch["inv"] = "_down" +button_bg_postfix["blocks"] = "" +button_bg_postfix["deco"] = "" +button_bg_postfix["redstone"] = "" +button_bg_postfix["rail"] = "" +button_bg_postfix["brew"] = "" +button_bg_postfix["misc"] = "" +button_bg_postfix["nix"] = "" +button_bg_postfix["default"] = "" +button_bg_postfix["food"] = "_down" +button_bg_postfix["tools"] = "_down" +button_bg_postfix["combat"] = "_down" +button_bg_postfix["mobs"] = "_down" +button_bg_postfix["matr"] = "_down" +button_bg_postfix["inv"] = "_down" filtername["blocks"] = S("Building Blocks") filtername["deco"] = S("Decoration Blocks") @@ -302,6 +352,8 @@ filtername["inv"] = S("Survival Inventory") bg["default"] = dark_bg end]] +-- Item name representing a tab, indexed by tab name +---@type table local tab_icon = { blocks = "mcl_core:brick_block", deco = "mcl_flowers:peony", @@ -318,13 +370,15 @@ local tab_icon = { inv = "mcl_chests:chest", } ----@param player ObjectRef +-- Get the player configured stack size when taking items from creative inventory +---@param player mt.PlayerObjectRef ---@return integer local function get_stack_size(player) return player:get_meta():get_int("mcl_inventory:switch_stack") end ----@param player ObjectRef +-- Set the player configured stack size when taking items from creative inventory +---@param player mt.PlayerObjectRef ---@param n integer local function set_stack_size(player, n) player:get_meta():set_int("mcl_inventory:switch_stack", n) @@ -336,6 +390,7 @@ minetest.register_on_joinplayer(function(player) end end) +---@param player mt.PlayerObjectRef function mcl_inventory.set_creative_formspec(player) local playername = player:get_player_name() if not players[playername] then return end @@ -459,12 +514,15 @@ function mcl_inventory.set_creative_formspec(player) }) end + ---@param current_tab string + ---@param this_tab string + ---@return string local function tab(current_tab, this_tab) local bg_img if current_tab == this_tab then - bg_img = "crafting_creative_active" .. hoch[this_tab] .. ".png" + bg_img = "crafting_creative_active" .. button_bg_postfix[this_tab] .. ".png" else - bg_img = "crafting_creative_inactive" .. hoch[this_tab] .. ".png" + bg_img = "crafting_creative_inactive" .. button_bg_postfix[this_tab] .. ".png" end return table.concat({ "style[" .. this_tab .. ";border=false;bgimg=;bgimg_pressed=;noclip=true]", @@ -476,7 +534,7 @@ function mcl_inventory.set_creative_formspec(player) local caption = "" if name ~= "inv" and filtername[name] then - caption = "label[0.375,0.375;" .. F(minetest.colorize("#313131", filtername[name])) .. "]" + caption = "label[0.375,0.375;" .. F(C(mcl_formspec.label_color, filtername[name])) .. "]" end local formspec = table.concat({ @@ -490,8 +548,7 @@ function mcl_inventory.set_creative_formspec(player) "list[current_player;main;0.375,7.375;9,1;]", -- Trash - mcl_formspec.get_itemslot_bg_v4(11.625, 7.375, 1, 1, mcl_formspec.itemslot_border_size, - "crafting_creative_trash.png"), + mcl_formspec.get_itemslot_bg_v4(11.625, 7.375, 1, 1, nil, "crafting_creative_trash.png"), "list[detached:trash;main;11.625,7.375;1,1;]", main_list, diff --git a/mods/PLAYER/mcl_player/init.lua b/mods/PLAYER/mcl_player/init.lua index 757d33c0a..288b697e1 100644 --- a/mods/PLAYER/mcl_player/init.lua +++ b/mods/PLAYER/mcl_player/init.lua @@ -135,7 +135,7 @@ function mcl_player.player_set_armor(player, texture) update_player_textures(player) end ----@param player ObjectRef +---@param player mt.PlayerObjectRef ---@param x number ---@param y number ---@param w number From ae632fe773df6f27191999c4ef4dfef637fbe839 Mon Sep 17 00:00:00 2001 From: AFCMS Date: Thu, 29 Jun 2023 09:03:48 +0200 Subject: [PATCH 116/982] Fixes in `mcl_inventory` - Fix (yet another) rebase conflict - Remove unused code and annotations - Fix annotations in `mcl_gamemode` to https://github.com/minetest-toolkit/minetest-lsp-api --- mods/HUD/mcl_inventory/init.lua | 30 +++++++++--------------------- mods/PLAYER/mcl_gamemode/init.lua | 10 ++++------ 2 files changed, 13 insertions(+), 27 deletions(-) diff --git a/mods/HUD/mcl_inventory/init.lua b/mods/HUD/mcl_inventory/init.lua index 52fbd268b..c99f8c386 100644 --- a/mods/HUD/mcl_inventory/init.lua +++ b/mods/HUD/mcl_inventory/init.lua @@ -1,9 +1,3 @@ -local S = minetest.get_translator(minetest.get_current_modname()) -local F = minetest.formspec_escape - ----get_inventory can return nil if object isn't a player, but we are sure sometimes this is one :) ----@diagnostic disable need-check-nil - mcl_inventory = {} dofile(minetest.get_modpath(minetest.get_current_modname()) .. "/creative.lua") @@ -13,10 +7,10 @@ dofile(minetest.get_modpath(minetest.get_current_modname()) .. "/survival.lua") --local mod_craftguide = minetest.get_modpath("mcl_craftguide") ---Returns a single itemstack in the given inventory to the main inventory, or drop it when there's no space left. ----@param itemstack ItemStack ----@param dropper ObjectRef ----@param pos Vector ----@param inv InvRef +---@param itemstack mt.ItemStack +---@param dropper mt.ObjectRef +---@param pos mt.Vector +---@param inv mt.InvRef local function return_item(itemstack, dropper, pos, inv) if dropper:is_player() then -- Return to main inventory @@ -45,7 +39,7 @@ local function return_item(itemstack, dropper, pos, inv) end ---Return items in the given inventory list (name) to the main inventory, or drop them if there is no space left. ----@param player ObjectRef +---@param player mt.PlayerObjectRef ---@param name string local function return_fields(player, name) local inv = player:get_inventory() @@ -59,7 +53,7 @@ local function return_fields(player, name) end end ----@param player ObjectRef +---@param player mt.PlayerObjectRef ---@param armor_change_only? boolean local function set_inventory(player, armor_change_only) if minetest.is_creative_enabled(player:get_player_name()) then @@ -133,17 +127,11 @@ minetest.register_on_joinplayer(function(player) return_fields(player, "enchanting_lapis") end) ----@param player ObjectRef ----@param armor_change_only? boolean -function mcl_inventory.update_inventory(player, armor_change_only) +---@param player mt.PlayerObjectRef +function mcl_inventory.update_inventory(player) local player_gamemode = mcl_gamemode.get_gamemode(player) if player_gamemode == "creative" then - if armor_change_only then - -- Stay on survival inventory page if only the armor has been changed - mcl_inventory.set_creative_formspec(player, 0, 0, nil, nil, "inv") - else - mcl_inventory.set_creative_formspec(player, 0, 1) - end + mcl_inventory.set_creative_formspec(player) elseif player_gamemode == "survival" then player:set_inventory_formspec(mcl_inventory.build_survival_formspec(player)) end diff --git a/mods/PLAYER/mcl_gamemode/init.lua b/mods/PLAYER/mcl_gamemode/init.lua index 9b23922a4..aa2c2ba0c 100644 --- a/mods/PLAYER/mcl_gamemode/init.lua +++ b/mods/PLAYER/mcl_gamemode/init.lua @@ -1,5 +1,3 @@ ----@diagnostic disable lowercase-global - local S = minetest.get_translator("mcl_gamemode") mcl_gamemode = {} @@ -19,15 +17,15 @@ local function in_table(n, h) return false end ----@type fun(player: ObjectRef, old_gamemode: '"survival"'|'"creative"', new_gamemode: '"survival"'|'"creative"')[] +---@type fun(player: mt.PlayerObjectRef, old_gamemode: '"survival"'|'"creative"', new_gamemode: '"survival"'|'"creative"')[] mcl_gamemode.registered_on_gamemode_change = {} ----@param func fun(player: ObjectRef, old_gamemode: '"survival"'|'"creative"', new_gamemode: '"survival"'|'"creative"') +---@param func fun(player: mt.PlayerObjectRef, old_gamemode: '"survival"'|'"creative"', new_gamemode: '"survival"'|'"creative"') function mcl_gamemode.register_on_gamemode_change(func) table.insert(mcl_gamemode.registered_on_gamemode_change, func) end ----@param player ObjectRef +---@param player mt.PlayerObjectRef ---@param gamemode '"survival"'|'"creative"' function mcl_gamemode.set_gamemode(player, gamemode) local meta = player:get_meta() @@ -40,7 +38,7 @@ end local mt_is_creative_enabled = minetest.is_creative_enabled ----@param player ObjectRef +---@param player mt.PlayerObjectRef ---@return '"survival"'|'"creative"' function mcl_gamemode.get_gamemode(player) if mt_is_creative_enabled(player:get_player_name()) then From 2cb9eca8e165084445d4d478d3f42e4aaac300cf Mon Sep 17 00:00:00 2001 From: AFCMS Date: Thu, 29 Jun 2023 21:10:31 +0200 Subject: [PATCH 117/982] Use new vectors in `mcl_blast_furnace` --- mods/ITEMS/mcl_blast_furnace/init.lua | 30 +++++++++++++-------------- 1 file changed, 15 insertions(+), 15 deletions(-) diff --git a/mods/ITEMS/mcl_blast_furnace/init.lua b/mods/ITEMS/mcl_blast_furnace/init.lua index 7e625989f..108411083 100644 --- a/mods/ITEMS/mcl_blast_furnace/init.lua +++ b/mods/ITEMS/mcl_blast_furnace/init.lua @@ -183,17 +183,17 @@ local function spawn_flames(pos, param2) local minrelpos, maxrelpos local dir = minetest.facedir_to_dir(param2) if dir.x > 0 then - minrelpos = { x = -0.6, y = -0.05, z = -0.25 } - maxrelpos = { x = -0.55, y = -0.45, z = 0.25 } + minrelpos = vector.new(-0.6, -0.05, -0.25) + maxrelpos = vector.new(-0.55, -0.45, 0.25) elseif dir.x < 0 then - minrelpos = { x = 0.55, y = -0.05, z = -0.25 } - maxrelpos = { x = 0.6, y = -0.45, z = 0.25 } + minrelpos = vector.new(0.55, -0.05, -0.25) + maxrelpos = vector.new(0.6, -0.45, 0.25) elseif dir.z > 0 then - minrelpos = { x = -0.25, y = -0.05, z = -0.6 } - maxrelpos = { x = 0.25, y = -0.45, z = -0.55 } + minrelpos = vector.new(-0.25, -0.05, -0.6) + maxrelpos = vector.new(0.25, 0.45, -0.55) elseif dir.z < 0 then - minrelpos = { x = -0.25, y = -0.05, z = 0.55 } - maxrelpos = { x = 0.25, y = -0.45, z = 0.6 } + minrelpos = vector.new(-0.25, -0.05, 0.55) + maxrelpos = vector.new(0.25, -0.45, 0.6) else return end @@ -202,8 +202,8 @@ local function spawn_flames(pos, param2) time = 0, minpos = vector.add(pos, minrelpos), maxpos = vector.add(pos, maxrelpos), - minvel = { x = -0.01, y = 0, z = -0.01 }, - maxvel = { x = 0.01, y = 0.1, z = 0.01 }, + minvel = vector.new(-0.01, 0, -0.01), + maxvel = vector.new(0.01, 0.1, 0.01), minexptime = 0.3, maxexptime = 0.6, minsize = 0.4, @@ -549,11 +549,11 @@ minetest.register_node("mcl_blast_furnace:blast_furnace_active", { for _, listname in ipairs({ "src", "dst", "fuel" }) do local stack = inv:get_stack(listname, 1) if not stack:is_empty() then - local p = { - x = pos.x + math.random(0, 10) / 10 - 0.5, - y = pos.y, - z = pos.z + math.random(0, 10) / 10 - 0.5 - } + local p = vector.new( + pos.x + math.random(0, 10) / 10 - 0.5, + pos.y, + pos.z + math.random(0, 10) / 10 - 0.5 + ) minetest.add_item(p, stack) end end From 06e2022c6da0c32ae5df710ffd10f3dd67c58bee Mon Sep 17 00:00:00 2001 From: AFCMS Date: Thu, 29 Jun 2023 21:11:58 +0200 Subject: [PATCH 118/982] Fix `mcl_enchanting` formating --- mods/ITEMS/mcl_enchanting/engine.lua | 34 +++++++++++++--------------- 1 file changed, 16 insertions(+), 18 deletions(-) diff --git a/mods/ITEMS/mcl_enchanting/engine.lua b/mods/ITEMS/mcl_enchanting/engine.lua index 01ef51a54..ec168b87f 100644 --- a/mods/ITEMS/mcl_enchanting/engine.lua +++ b/mods/ITEMS/mcl_enchanting/engine.lua @@ -82,7 +82,8 @@ function mcl_enchanting.not_enchantable_on_enchanting_table(itemname) end function mcl_enchanting.is_enchantable(itemname) - return mcl_enchanting.get_enchantability(itemname) > 0 or mcl_enchanting.not_enchantable_on_enchanting_table(itemname) + return mcl_enchanting.get_enchantability(itemname) > 0 or + mcl_enchanting.not_enchantable_on_enchanting_table(itemname) end function mcl_enchanting.can_enchant_freshly(itemname) @@ -153,7 +154,8 @@ function mcl_enchanting.can_enchant(itemstack, enchantment, level) for incompatible in pairs(enchantment_def.incompatible) do local incompatible_level = item_enchantments[incompatible] if incompatible_level then - return false, "incompatible", mcl_enchanting.get_enchantment_description(incompatible, incompatible_level) + return false, "incompatible", + mcl_enchanting.get_enchantment_description(incompatible, incompatible_level) end end end @@ -334,7 +336,7 @@ function mcl_enchanting.get_random_enchantment(itemstack, treasure, weighted, ex end function mcl_enchanting.generate_random_enchantments(itemstack, enchantment_level, treasure, no_reduced_bonus_chance, - ignore_already_enchanted, pr) + ignore_already_enchanted, pr) local itemname = itemstack:get_name() if (not mcl_enchanting.can_enchant_freshly(itemname) and not ignore_already_enchanted) or @@ -396,14 +398,13 @@ function mcl_enchanting.generate_random_enchantments(itemstack, enchantment_leve enchantments[selected_enchantment] = enchantment_power mcl_enchanting.enchant(itemstack, selected_enchantment, enchantment_power) end - until not no_reduced_bonus_chance and mcl_enchanting.random(pr) >= (enchantment_level + 1) / 50 return enchantments, description end function mcl_enchanting.generate_random_enchantments_reliable(itemstack, enchantment_level, treasure, - no_reduced_bonus_chance, ignore_already_enchanted, pr) + no_reduced_bonus_chance, ignore_already_enchanted, pr) local enchantments repeat @@ -415,7 +416,7 @@ function mcl_enchanting.generate_random_enchantments_reliable(itemstack, enchant end function mcl_enchanting.enchant_randomly(itemstack, enchantment_level, treasure, no_reduced_bonus_chance, - ignore_already_enchanted, pr) + ignore_already_enchanted, pr) local enchantments = mcl_enchanting.generate_random_enchantments_reliable(itemstack, enchantment_level, treasure, no_reduced_bonus_chance, ignore_already_enchanted, pr) @@ -512,17 +513,13 @@ function mcl_enchanting.show_enchanting_formspec(player) "size[11.75,10.425]", "label[0.375,0.375;" .. F(C(mcl_formspec.label_color) .. table_name) .. "]", - mcl_formspec.get_itemslot_bg_v4(1, 3.25, 1, 1), "list[current_player;enchanting_item;1,3.25;1,1]", mcl_formspec.get_itemslot_bg_v4(2.25, 3.25, 1, 1), "image[2.25,3.25;1,1;mcl_enchanting_lapis_background.png]", "list[current_player;enchanting_lapis;2.25,3.25;1,1]", - "image[4.125,0.56;7.25,4.1;mcl_enchanting_button_background.png]", - "label[0.375,4.7;" .. F(C(mcl_formspec.label_color) .. S("Inventory")) .. "]", - mcl_formspec.get_itemslot_bg_v4(0.375, 5.1, 9, 3), "list[current_player;main;0.375,5.1;9,3;9]", @@ -544,7 +541,7 @@ function mcl_enchanting.show_enchanting_formspec(player) local table_slots = mcl_enchanting.get_table_slots(player, itemstack, num_bookshelves) for i, slot in ipairs(table_slots) do any_enchantment = any_enchantment or slot - local enough_lapis = inv:contains_item("enchanting_lapis", ItemStack({name = "mcl_core:lapis", count = i})) + local enough_lapis = inv:contains_item("enchanting_lapis", ItemStack({ name = "mcl_core:lapis", count = i })) local enough_levels = slot and slot.level_requirement <= player_levels local can_enchant = (slot and enough_lapis and enough_levels) local ending = (can_enchant and "" or "_off") @@ -553,7 +550,7 @@ function mcl_enchanting.show_enchanting_formspec(player) .. "container[4.125," .. y .. "]" .. ( - slot and + slot and "tooltip[button_" .. i .. ";" .. @@ -563,7 +560,7 @@ function mcl_enchanting.show_enchanting_formspec(player) C("#FFFFFF") .. " . . . ?\n\n" .. ( - enough_levels and + enough_levels and C(enough_lapis and "#818181" or "#FC5454") .. F(S("@1 Lapis Lazuli", i)) .. "\n" .. C("#818181") .. F(S("@1 Enchantment Levels", i)) or C("#FC5454") .. F(S("Level requirement: @1", slot.level_requirement))) .. "]" or "") @@ -586,7 +583,8 @@ function mcl_enchanting.show_enchanting_formspec(player) "image[" .. (any_enchantment and 1.1 or 1.67) .. ",1.2;" .. - (any_enchantment and 2 or 0.87) .. ",1.43;mcl_enchanting_book_" .. (any_enchantment and "open" or "closed") .. ".png]" + (any_enchantment and 2 or 0.87) .. + ",1.43;mcl_enchanting_book_" .. (any_enchantment and "open" or "closed") .. ".png]" minetest.show_formspec(name, "mcl_enchanting:table", formspec) end @@ -604,7 +602,7 @@ function mcl_enchanting.handle_formspec_fields(player, formname, fields) local meta = player:get_meta() local num_bookshelfes = meta:get_int("mcl_enchanting:num_bookshelves") local itemstack = inv:get_stack("enchanting_item", 1) - local cost = ItemStack({name = "mcl_core:lapis", count = button_pressed}) + local cost = ItemStack({ name = "mcl_core:lapis", count = button_pressed }) if not inv:contains_item("enchanting_lapis", cost) then return end @@ -652,7 +650,8 @@ function mcl_enchanting.is_enchanting_inventory_action(action, inventory, invent end function mcl_enchanting.allow_inventory_action(player, action, inventory, inventory_info) - local is_enchanting_action, do_limit = mcl_enchanting.is_enchanting_inventory_action(action, inventory, inventory_info) + local is_enchanting_action, do_limit = mcl_enchanting.is_enchanting_inventory_action(action, inventory, + inventory_info) if is_enchanting_action and do_limit then if action == "move" then local listname = inventory_info.to_list @@ -700,8 +699,7 @@ end function mcl_enchanting.set_book_animation(self, anim) local anim_index = mcl_enchanting.book_animations[anim] local start, stop = mcl_enchanting.book_animation_steps[anim_index], - mcl_enchanting.book_animation_steps[anim_index + 1 - ] + mcl_enchanting.book_animation_steps[anim_index + 1] self.object:set_animation({ x = start, y = stop }, mcl_enchanting.book_animation_speed, 0, mcl_enchanting.book_animation_loop[anim] or false) self.scheduled_anim = nil From 054dc22432327776a96a08d62e3d1b1885c1c0f9 Mon Sep 17 00:00:00 2001 From: AFCMS Date: Thu, 29 Jun 2023 21:14:47 +0200 Subject: [PATCH 119/982] Use new vectors in `mcl_chests` --- mods/ITEMS/mcl_chests/init.lua | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/mods/ITEMS/mcl_chests/init.lua b/mods/ITEMS/mcl_chests/init.lua index 9e058af2d..a9011a805 100644 --- a/mods/ITEMS/mcl_chests/init.lua +++ b/mods/ITEMS/mcl_chests/init.lua @@ -859,9 +859,9 @@ local function register_chest(basename, desc, longdesc, usagehelp, tt_help, tile on_rightclick = function(pos, node, clicker) local pos_other = mcl_util.get_double_container_neighbor_pos(pos, node.param2, "right") - if minetest.registered_nodes[minetest.get_node({ x = pos.x, y = pos.y + 1, z = pos.z }).name].groups.opaque == 1 + if minetest.registered_nodes[minetest.get_node(vector.offset(pos, 0, 1, 0)).name].groups.opaque == 1 or - minetest.registered_nodes[minetest.get_node({ x = pos_other.x, y = pos_other.y + 1, z = pos_other.z }).name].groups.opaque + minetest.registered_nodes[minetest.get_node(vector.offset(pos_other, 0, 1, 0)).name].groups.opaque == 1 then -- won't open if there is no space from the top return false From 40bc219a86ff2f48ee419c82aef62c0ee000c429 Mon Sep 17 00:00:00 2001 From: AFCMS Date: Thu, 29 Jun 2023 21:18:26 +0200 Subject: [PATCH 120/982] Fix `mcl_books` formating? --- mods/ITEMS/mcl_books/init.lua | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/mods/ITEMS/mcl_books/init.lua b/mods/ITEMS/mcl_books/init.lua index 7c223030c..8fbd6aad2 100644 --- a/mods/ITEMS/mcl_books/init.lua +++ b/mods/ITEMS/mcl_books/init.lua @@ -205,10 +205,14 @@ end -- Written Book minetest.register_craftitem("mcl_books:written_book", { description = S("Written Book"), - _doc_items_longdesc = S("Written books contain some text written by someone. They can be read and copied, but not edited."), - _doc_items_usagehelp = S("Hold it in your hand, then rightclick to read the book.") .. "\n\n" .. - - S("To copy the text of the written book, place it into the crafting grid together with a book and quill (or multiple of those) and craft. The written book will not be consumed. Copies of copies can not be copied."), + _doc_items_longdesc = S( + "Written books contain some text written by someone. They can be read and copied, but not edited." + ), + _doc_items_usagehelp = S("Hold it in your hand, then rightclick to read the book.") .. + "\n\n" .. + S( + "To copy the text of the written book, place it into the crafting grid together with a book and quill (or multiple of those) and craft. The written book will not be consumed. Copies of copies can not be copied." + ), inventory_image = "mcl_books_book_written.png", groups = { not_in_creative_inventory = 1, book = 1, no_rename = 1 }, stack_max = 16, From bb3771c0d24c70d78f9d224f03d37e8de913ad5b Mon Sep 17 00:00:00 2001 From: AFCMS Date: Thu, 29 Jun 2023 21:20:42 +0200 Subject: [PATCH 121/982] Fix formating in `mcl_anvils` --- mods/ITEMS/mcl_anvils/init.lua | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/mods/ITEMS/mcl_anvils/init.lua b/mods/ITEMS/mcl_anvils/init.lua index 9ff9f7750..9c2e25371 100644 --- a/mods/ITEMS/mcl_anvils/init.lua +++ b/mods/ITEMS/mcl_anvils/init.lua @@ -568,9 +568,9 @@ end local anvildef0 = table.copy(anvildef) anvildef0.description = S("Anvil") anvildef0._doc_items_longdesc = -S("The anvil allows you to repair tools and armor, and to give names to items. It has a limited durability, however. Don't let it fall on your head, it could be quite painful!") + S("The anvil allows you to repair tools and armor, and to give names to items. It has a limited durability, however. Don't let it fall on your head, it could be quite painful!") anvildef0._doc_items_usagehelp = -S("To use an anvil, rightclick it. An anvil has 2 input slots (on the left) and one output slot.") .. "\n" .. + S("To use an anvil, rightclick it. An anvil has 2 input slots (on the left) and one output slot.") .. "\n" .. S("To rename items, put an item stack in one of the item slots while keeping the other input slot empty. Type in a name, hit enter or “Set Name”, then take the renamed item from the output slot.") .. "\n" .. S("There are two possibilities to repair tools (and armor):") .. "\n" .. From a77930d4a1feae28f98f3ed72d2c1dd894c96a92 Mon Sep 17 00:00:00 2001 From: AFCMS Date: Thu, 13 Jul 2023 23:40:07 +0200 Subject: [PATCH 122/982] Fix `mcl_chests` auto formating --- mods/ITEMS/mcl_chests/init.lua | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-) diff --git a/mods/ITEMS/mcl_chests/init.lua b/mods/ITEMS/mcl_chests/init.lua index a9011a805..59ed2ba09 100644 --- a/mods/ITEMS/mcl_chests/init.lua +++ b/mods/ITEMS/mcl_chests/init.lua @@ -927,9 +927,7 @@ local chestusage = S("To access its inventory, rightclick it. When broken, the i register_chest("chest", S("Chest"), - S( - "Chests are containers which provide 27 inventory slots. Chests can be turned into large chests with double the capacity by placing two chests next to each other.") - , + S("Chests are containers which provide 27 inventory slots. Chests can be turned into large chests with double the capacity by placing two chests next to each other."), chestusage, S("27 inventory slots") .. "\n" .. S("Can be combined to a large chest"), { @@ -955,9 +953,7 @@ local traptiles = { register_chest("trapped_chest", S("Trapped Chest"), - S( - "A trapped chest is a container which provides 27 inventory slots. When it is opened, it sends a redstone signal to its adjacent blocks as long it stays open. Trapped chests can be turned into large trapped chests with double the capacity by placing two trapped chests next to each other.") - , + S("A trapped chest is a container which provides 27 inventory slots. When it is opened, it sends a redstone signal to its adjacent blocks as long it stays open. Trapped chests can be turned into large trapped chests with double the capacity by placing two trapped chests next to each other."), chestusage, S("27 inventory slots") .. "\n" .. S("Can be combined to a large chest") .. "\n" .. S("Emits a redstone signal when opened"), From 1bdbdc365d83db713912a429fac59336c514c795 Mon Sep 17 00:00:00 2001 From: AFCMS Date: Thu, 13 Jul 2023 23:41:51 +0200 Subject: [PATCH 123/982] Fix `mcl_enchanting` auto formating --- mods/ITEMS/mcl_enchanting/engine.lua | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/mods/ITEMS/mcl_enchanting/engine.lua b/mods/ITEMS/mcl_enchanting/engine.lua index ec168b87f..b5766dd28 100644 --- a/mods/ITEMS/mcl_enchanting/engine.lua +++ b/mods/ITEMS/mcl_enchanting/engine.lua @@ -403,8 +403,7 @@ function mcl_enchanting.generate_random_enchantments(itemstack, enchantment_leve return enchantments, description end -function mcl_enchanting.generate_random_enchantments_reliable(itemstack, enchantment_level, treasure, - no_reduced_bonus_chance, ignore_already_enchanted, pr) +function mcl_enchanting.generate_random_enchantments_reliable(itemstack, enchantment_level, treasure, no_reduced_bonus_chance, ignore_already_enchanted, pr) local enchantments repeat @@ -417,8 +416,7 @@ end function mcl_enchanting.enchant_randomly(itemstack, enchantment_level, treasure, no_reduced_bonus_chance, ignore_already_enchanted, pr) - local enchantments = mcl_enchanting.generate_random_enchantments_reliable(itemstack, enchantment_level, treasure, - no_reduced_bonus_chance, ignore_already_enchanted, pr) + local enchantments = mcl_enchanting.generate_random_enchantments_reliable(itemstack, enchantment_level, treasure, no_reduced_bonus_chance, ignore_already_enchanted, pr) mcl_enchanting.set_enchanted_itemstring(itemstack) mcl_enchanting.set_enchantments(itemstack, enchantments) From f7c251e7f214e5b2e59b82e5d2714cdb8bc350c3 Mon Sep 17 00:00:00 2001 From: AFCMS Date: Thu, 13 Jul 2023 23:43:39 +0200 Subject: [PATCH 124/982] Fix `mcl_grindstone` auto formating --- mods/ITEMS/mcl_grindstone/init.lua | 9 +++------ 1 file changed, 3 insertions(+), 6 deletions(-) diff --git a/mods/ITEMS/mcl_grindstone/init.lua b/mods/ITEMS/mcl_grindstone/init.lua index ddd1e8812..e0137dcd1 100644 --- a/mods/ITEMS/mcl_grindstone/init.lua +++ b/mods/ITEMS/mcl_grindstone/init.lua @@ -207,12 +207,9 @@ minetest.register_node("mcl_grindstone:grindstone", { description = S("Grindstone"), _tt_help = S("Used to disenchant/fix tools"), _doc_items_longdesc = S("Grindstone disenchants tools and armour except for curses, and repairs two items of the same type it is also the weapon smith's work station."), - _doc_items_usagehelp = S("To use the grindstone, rightclick it, Two input slots (on the left) and a single output slot.") - .. "\n" .. - S("To disenchant an item place enchanted item in one of the input slots and take the disenchanted item from the output.") - .. "\n" .. - S("To repair a tool you need a tool of the same type and material, put both items in the input slot and the output slot will combine two items durabilities with 5% bonus.") - .. "\n" .. + _doc_items_usagehelp = S("To use the grindstone, rightclick it, Two input slots (on the left) and a single output slot.") .. "\n" .. + S("To disenchant an item place enchanted item in one of the input slots and take the disenchanted item from the output.") .. "\n" .. + S("To repair a tool you need a tool of the same type and material, put both items in the input slot and the output slot will combine two items durabilities with 5% bonus.") .. "\n" .. S("If both items have enchantments the player will get xp from both items from the disenchant.") .. "\n" .. S("Curses cannot be removed and will be transfered to the new repaired item, if both items have a different curse the curses will be combined."), tiles = { From bf28bab427afb5f5167ebf62ae7afa977e13698a Mon Sep 17 00:00:00 2001 From: AFCMS Date: Thu, 13 Jul 2023 23:52:36 +0200 Subject: [PATCH 125/982] Remove duplicated creacode --- mods/PLAYER/mcl_gamemode/init.lua | 15 --------------- 1 file changed, 15 deletions(-) diff --git a/mods/PLAYER/mcl_gamemode/init.lua b/mods/PLAYER/mcl_gamemode/init.lua index aa2c2ba0c..cce6c0b46 100644 --- a/mods/PLAYER/mcl_gamemode/init.lua +++ b/mods/PLAYER/mcl_gamemode/init.lua @@ -57,21 +57,6 @@ function minetest.is_creative_enabled(name) return false end --- Insta "digging" nodes in gamemode-creative -minetest.register_on_punchnode(function(pos, node, puncher, pointed_thing) - if not puncher or not puncher:is_player() then return end - if minetest.is_creative_enabled() then return end - local name = puncher:get_player_name() - if not minetest.is_creative_enabled(name) then return end - if pointed_thing.type ~= "node" then return end - local def = minetest.registered_nodes[node.name] - if def then - if def.on_destruct then def.on_destruct(pos) end - minetest.node_dig(pos, node, puncher) - return true - end -end) - -- Don't subtract from inv when placing in gamemode-creative minetest.register_on_placenode(function(pos, newnode, placer, oldnode, itemstack, pointed_thing) if placer and placer:is_player() and minetest.is_creative_enabled(placer:get_player_name()) then return true end From 3fe3153a408bab6fa0bf5aa29aac2a1ebbdac290 Mon Sep 17 00:00:00 2001 From: AFCMS Date: Thu, 13 Jul 2023 23:52:57 +0200 Subject: [PATCH 126/982] Remove duplicated creative digging code --- mods/ITEMS/mcl_books/init.lua | 34 ++++++++++++++++++++-------------- 1 file changed, 20 insertions(+), 14 deletions(-) diff --git a/mods/ITEMS/mcl_books/init.lua b/mods/ITEMS/mcl_books/init.lua index 8fbd6aad2..e2f391b17 100644 --- a/mods/ITEMS/mcl_books/init.lua +++ b/mods/ITEMS/mcl_books/init.lua @@ -85,7 +85,8 @@ local function write(itemstack, user, pointed_thing) local node = minetest.get_node(pointed_thing.under) if user and not user:get_player_control().sneak then if minetest.registered_nodes[node.name] and minetest.registered_nodes[node.name].on_rightclick then - return minetest.registered_nodes[node.name].on_rightclick(pointed_thing.under, node, user, itemstack) or itemstack + return minetest.registered_nodes[node.name].on_rightclick(pointed_thing.under, node, user, itemstack) or + itemstack end end end @@ -106,7 +107,8 @@ local function read(itemstack, user, pointed_thing) local node = minetest.get_node(pointed_thing.under) if user and not user:get_player_control().sneak then if minetest.registered_nodes[node.name] and minetest.registered_nodes[node.name].on_rightclick then - return minetest.registered_nodes[node.name].on_rightclick(pointed_thing.under, node, user, itemstack) or itemstack + return minetest.registered_nodes[node.name].on_rightclick(pointed_thing.under, node, user, itemstack) or + itemstack end end end @@ -125,7 +127,8 @@ minetest.register_craftitem("mcl_books:writable_book", { description = S("Book and Quill"), _tt_help = S("Write down some notes"), _doc_items_longdesc = S("This item can be used to write down some notes."), - _doc_items_usagehelp = S("Hold it in the hand, then rightclick to read the current notes and edit then. You can edit the text as often as you like. You can also sign the book which turns it into a written book which you can stack, but it can't be edited anymore.") + _doc_items_usagehelp = S( + "Hold it in the hand, then rightclick to read the current notes and edit then. You can edit the text as often as you like. You can also sign the book which turns it into a written book which you can stack, but it can't be edited anymore.") .. "\n" .. S("A book can hold up to 4500 characters. The title length is limited to 64 characters."), inventory_image = "mcl_books_book_writable.png", @@ -154,7 +157,8 @@ minetest.register_on_player_receive_fields(function(player, formname, fields) "background[-0.5,-0.5;9,10;mcl_books_book_bg.png]" .. "field[0.75,1;7.25,1;title;" .. minetest.formspec_escape(minetest.colorize("#000000", S("Enter book title:"))) .. ";]" .. - "label[0.75,1.5;" .. minetest.formspec_escape(minetest.colorize("#404040", S("by @1", name))) .. "]" .. + "label[0.75,1.5;" .. + minetest.formspec_escape(minetest.colorize("#404040", S("by @1", name))) .. "]" .. "button_exit[0.75,7.95;3,1;sign;" .. minetest.formspec_escape(S("Sign and Close")) .. "]" .. "tooltip[sign;" .. minetest.formspec_escape(S("Note: The book will no longer be editable after signing")) .. "]" .. @@ -226,9 +230,9 @@ minetest.register_craftitem("mcl_books:written_book", { local baq = "mcl_books:writable_book" local wb = "mcl_books:written_book" local recipes = { - { wb, baq }, + { wb, baq }, { baq, baq, wb }, - { baq, baq, wb, baq }, + { baq, baq, wb, baq }, { baq, baq, baq, baq, wb }, { baq, baq, baq, baq, wb, baq }, { baq, baq, baq, baq, wb, baq, baq }, @@ -394,19 +398,15 @@ local function bookshelf_gui(pos, node, clicker) "size[11.75,10.425]", "label[0.375,0.375;" .. F(C(mcl_formspec.label_color, name)) .. "]", - mcl_formspec.get_itemslot_bg_v4(0.375, 0.75, 9, 3), mcl_formspec.get_itemslot_bg_v4(0.375, 0.75, 9, 3, 0, "mcl_book_book_empty_slot.png"), "list[nodemeta:" .. pos.x .. "," .. pos.y .. "," .. pos.z .. ";main;0.375,0.75;9,3;]", - "label[0.375,4.7;" .. F(C(mcl_formspec.label_color, S("Inventory"))) .. "]", - mcl_formspec.get_itemslot_bg_v4(0.375, 5.1, 9, 3), "list[current_player;main;0.375,5.1;9,3;9]", mcl_formspec.get_itemslot_bg_v4(0.375, 9.05, 9, 1), "list[current_player;main;0.375,9.05;9,1;]", - "listring[nodemeta:" .. pos.x .. "," .. pos.y .. "," .. pos.z .. ";main]", "listring[current_player;main]", }) @@ -431,8 +431,14 @@ minetest.register_node("mcl_books:bookshelf", { stack_max = 64, is_ground_content = false, groups = { - handy = 1, axey = 1, deco_block = 1, material_wood = 1, - flammable = 3, fire_encouragement = 30, fire_flammability = 20, container = 1 + handy = 1, + axey = 1, + deco_block = 1, + material_wood = 1, + flammable = 3, + fire_encouragement = 30, + fire_flammability = 20, + container = 1 }, drop = "mcl_books:book 3", sounds = wood_sound, @@ -471,9 +477,9 @@ minetest.register_node("mcl_books:bookshelf", { minetest.register_craft({ output = "mcl_books:bookshelf", recipe = { - { "group:wood", "group:wood", "group:wood" }, + { "group:wood", "group:wood", "group:wood" }, { "mcl_books:book", "mcl_books:book", "mcl_books:book" }, - { "group:wood", "group:wood", "group:wood" }, + { "group:wood", "group:wood", "group:wood" }, } }) From 9d184e98977ce05b4023b45fbf0068c5d1cb44ba Mon Sep 17 00:00:00 2001 From: AFCMS Date: Thu, 13 Jul 2023 23:57:18 +0200 Subject: [PATCH 127/982] Remove duplicated creative inventory code --- mods/PLAYER/mcl_gamemode/init.lua | 5 ----- 1 file changed, 5 deletions(-) diff --git a/mods/PLAYER/mcl_gamemode/init.lua b/mods/PLAYER/mcl_gamemode/init.lua index cce6c0b46..a43a9c1ff 100644 --- a/mods/PLAYER/mcl_gamemode/init.lua +++ b/mods/PLAYER/mcl_gamemode/init.lua @@ -57,11 +57,6 @@ function minetest.is_creative_enabled(name) return false end --- Don't subtract from inv when placing in gamemode-creative -minetest.register_on_placenode(function(pos, newnode, placer, oldnode, itemstack, pointed_thing) - if placer and placer:is_player() and minetest.is_creative_enabled(placer:get_player_name()) then return true end -end) - minetest.register_chatcommand("gamemode", { params = S("[] []"), description = S("Change gamemode (survival/creative) for yourself or player"), From dc20267b4fa10c0584e450743cbff11cb2e5c310 Mon Sep 17 00:00:00 2001 From: AFCMS Date: Fri, 14 Jul 2023 00:05:01 +0200 Subject: [PATCH 128/982] Update inventory when player visuals change --- mods/HUD/mcl_inventory/init.lua | 2 ++ 1 file changed, 2 insertions(+) diff --git a/mods/HUD/mcl_inventory/init.lua b/mods/HUD/mcl_inventory/init.lua index c99f8c386..4bb3ea0a9 100644 --- a/mods/HUD/mcl_inventory/init.lua +++ b/mods/HUD/mcl_inventory/init.lua @@ -140,3 +140,5 @@ end mcl_gamemode.register_on_gamemode_change(function(player, old_gamemode, new_gamemode) set_inventory(player) end) + +mcl_player.register_on_visual_change(mcl_inventory.update_inventory_formspec) From df2ab1fd8cc8130fc7646a047d9e2415e82688b1 Mon Sep 17 00:00:00 2001 From: AFCMS Date: Fri, 14 Jul 2023 00:12:47 +0200 Subject: [PATCH 129/982] Remove duplicated armor update code --- mods/HUD/mcl_inventory/init.lua | 6 ------ 1 file changed, 6 deletions(-) diff --git a/mods/HUD/mcl_inventory/init.lua b/mods/HUD/mcl_inventory/init.lua index 4bb3ea0a9..cf484101c 100644 --- a/mods/HUD/mcl_inventory/init.lua +++ b/mods/HUD/mcl_inventory/init.lua @@ -107,12 +107,6 @@ minetest.register_on_joinplayer(function(player) player:hud_set_hotbar_image("mcl_inventory_hotbar.png") player:hud_set_hotbar_selected_image("mcl_inventory_hotbar_selected.png") - local old_update_player = mcl_armor.update_player - function mcl_armor.update_player(player, info) - old_update_player(player, info) - set_inventory(player, true) - end - -- In Creative Mode, the initial inventory setup is handled in creative.lua if not minetest.is_creative_enabled(player:get_player_name()) then set_inventory(player) From e936cede037d6d1befdf12ab58c444e35c22f0ff Mon Sep 17 00:00:00 2001 From: AFCMS Date: Fri, 14 Jul 2023 00:17:51 +0200 Subject: [PATCH 130/982] Update meshhand --- mods/HUD/mcl_inventory/init.lua | 1 + mods/HUD/mcl_inventory/mod.conf | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/mods/HUD/mcl_inventory/init.lua b/mods/HUD/mcl_inventory/init.lua index cf484101c..8762213c8 100644 --- a/mods/HUD/mcl_inventory/init.lua +++ b/mods/HUD/mcl_inventory/init.lua @@ -129,6 +129,7 @@ function mcl_inventory.update_inventory(player) elseif player_gamemode == "survival" then player:set_inventory_formspec(mcl_inventory.build_survival_formspec(player)) end + mcl_meshhand.update_player(player) end mcl_gamemode.register_on_gamemode_change(function(player, old_gamemode, new_gamemode) diff --git a/mods/HUD/mcl_inventory/mod.conf b/mods/HUD/mcl_inventory/mod.conf index 66f175c3b..d37a3e372 100644 --- a/mods/HUD/mcl_inventory/mod.conf +++ b/mods/HUD/mcl_inventory/mod.conf @@ -1,5 +1,5 @@ name = mcl_inventory author = BlockMen description = Adds the player inventory and creative inventory. -depends = mcl_init, mcl_formspec, mcl_enchanting, mcl_gamemode +depends = mcl_init, mcl_formspec, mcl_enchanting, mcl_gamemode, mcl_meshhand optional_depends = mcl_armor, mcl_brewing, mcl_potions, mcl_enchanting, mcl_craftguide, mcl_player From 158ff8e8601b6ada23a9a978a5120a8082686682 Mon Sep 17 00:00:00 2001 From: AFCMS Date: Fri, 28 Jul 2023 16:39:57 +0200 Subject: [PATCH 131/982] Add commented basic scrollbar support to replace pages system --- mods/HUD/mcl_inventory/creative.lua | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/mods/HUD/mcl_inventory/creative.lua b/mods/HUD/mcl_inventory/creative.lua index a896fa0de..02e0d99ec 100644 --- a/mods/HUD/mcl_inventory/creative.lua +++ b/mods/HUD/mcl_inventory/creative.lua @@ -503,10 +503,23 @@ function mcl_inventory.set_creative_formspec(player) "listring[detached:" .. playername .. "_armor;armor]" .. "listring[current_player;main]" else + + --local nb_lines = math.ceil(inv_size / 9) -- Creative inventory slots main_list = table.concat({ mcl_formspec.get_itemslot_bg_v4(0.375, 0.875, 9, 5), + + -- Basic code to replace buttons by scrollbar + -- Require Minetest 5.8 + -- + --"scroll_container[0.375,0.875;11.575,6;scroll;vertical;1.25]", + --"list[detached:creative_" .. playername .. ";main;0,0;9," .. nb_lines .. ";]", + --"scroll_container_end[]", + --"scrollbaroptions[min=0;max=" .. math.max(nb_lines - 5, 0) .. ";smallstep=1;largesteps=1;arrows=hide]", + --"scrollbar[11.75,0.825;0.75,6.1;vertical;scroll;0]", + "list[detached:creative_" .. playername .. ";main;0.375,0.875;9,5;" .. tostring(start_i) .. "]", + -- Page buttons "label[11.65,5.6;" .. F(S("@1 / @2", pagenum, pagemax)) .. "]", "image_button[11.575,5.83;0.55,1.1;crafting_creative_prev.png;creative_prev;]", From 4efb5bf8b9afc367abb0a80b7c57efb49994c8b4 Mon Sep 17 00:00:00 2001 From: AFCMS Date: Fri, 28 Jul 2023 16:49:56 +0200 Subject: [PATCH 132/982] Make creative inventory page buttons vertical --- mods/HUD/mcl_inventory/creative.lua | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/mods/HUD/mcl_inventory/creative.lua b/mods/HUD/mcl_inventory/creative.lua index 02e0d99ec..3e4c3d4d6 100644 --- a/mods/HUD/mcl_inventory/creative.lua +++ b/mods/HUD/mcl_inventory/creative.lua @@ -521,9 +521,9 @@ function mcl_inventory.set_creative_formspec(player) "list[detached:creative_" .. playername .. ";main;0.375,0.875;9,5;" .. tostring(start_i) .. "]", -- Page buttons - "label[11.65,5.6;" .. F(S("@1 / @2", pagenum, pagemax)) .. "]", - "image_button[11.575,5.83;0.55,1.1;crafting_creative_prev.png;creative_prev;]", - "image_button[12.075,5.83;0.55,1.1;crafting_creative_next.png;creative_next;]", + "label[11.65,4.33;" .. F(S("@1 / @2", pagenum, pagemax)) .. "]", + "image_button[11.575,4.58;1.1,1.1;crafting_creative_prev.png^[transformR270;creative_prev;]", + "image_button[11.575,5.83;1.1,1.1;crafting_creative_next.png^[transformR270;creative_next;]", }) end From 4f0620c7c1d8ea7b253b40f42dd34efd06610549 Mon Sep 17 00:00:00 2001 From: AFCMS Date: Fri, 28 Jul 2023 17:15:41 +0200 Subject: [PATCH 133/982] Fix meshhand not updating correctly --- mods/HUD/mcl_inventory/init.lua | 1 - mods/HUD/mcl_inventory/mod.conf | 2 +- mods/PLAYER/mcl_meshhand/init.lua | 4 ++++ mods/PLAYER/mcl_meshhand/mod.conf | 2 +- 4 files changed, 6 insertions(+), 3 deletions(-) diff --git a/mods/HUD/mcl_inventory/init.lua b/mods/HUD/mcl_inventory/init.lua index 8762213c8..cf484101c 100644 --- a/mods/HUD/mcl_inventory/init.lua +++ b/mods/HUD/mcl_inventory/init.lua @@ -129,7 +129,6 @@ function mcl_inventory.update_inventory(player) elseif player_gamemode == "survival" then player:set_inventory_formspec(mcl_inventory.build_survival_formspec(player)) end - mcl_meshhand.update_player(player) end mcl_gamemode.register_on_gamemode_change(function(player, old_gamemode, new_gamemode) diff --git a/mods/HUD/mcl_inventory/mod.conf b/mods/HUD/mcl_inventory/mod.conf index d37a3e372..66f175c3b 100644 --- a/mods/HUD/mcl_inventory/mod.conf +++ b/mods/HUD/mcl_inventory/mod.conf @@ -1,5 +1,5 @@ name = mcl_inventory author = BlockMen description = Adds the player inventory and creative inventory. -depends = mcl_init, mcl_formspec, mcl_enchanting, mcl_gamemode, mcl_meshhand +depends = mcl_init, mcl_formspec, mcl_enchanting, mcl_gamemode optional_depends = mcl_armor, mcl_brewing, mcl_potions, mcl_enchanting, mcl_craftguide, mcl_player diff --git a/mods/PLAYER/mcl_meshhand/init.lua b/mods/PLAYER/mcl_meshhand/init.lua index 6d1177b18..c42ff8081 100644 --- a/mods/PLAYER/mcl_meshhand/init.lua +++ b/mods/PLAYER/mcl_meshhand/init.lua @@ -89,6 +89,10 @@ minetest.register_on_joinplayer(function(player) player:get_inventory():set_size("hand", 1) end) +mcl_gamemode.register_on_gamemode_change(function(player) + mcl_meshhand.update_player(player) +end) + if mcl_skins_enabled then mcl_player.register_on_visual_change(mcl_meshhand.update_player) else diff --git a/mods/PLAYER/mcl_meshhand/mod.conf b/mods/PLAYER/mcl_meshhand/mod.conf index 687932514..fd10c259c 100644 --- a/mods/PLAYER/mcl_meshhand/mod.conf +++ b/mods/PLAYER/mcl_meshhand/mod.conf @@ -1,5 +1,5 @@ name = mcl_meshhand author = jordan4ibanez description = Applies the player skin texture to the hand. -depends = mcl_tools, mcl_player +depends = mcl_tools, mcl_player, mcl_gamemode optional_depends = mcl_skins, mcl_custom_skins From 438998de6ae44f7cf9c9858ca173a8a155b5cd3e Mon Sep 17 00:00:00 2001 From: AFCMS Date: Tue, 1 Aug 2023 16:37:04 +0200 Subject: [PATCH 134/982] Remove unused files --- textures/crafting_inventory_creative.png | Bin 1180 -> 0 bytes .../crafting_inventory_creative_survival.png | Bin 1236 -> 0 bytes 2 files changed, 0 insertions(+), 0 deletions(-) delete mode 100644 textures/crafting_inventory_creative.png delete mode 100644 textures/crafting_inventory_creative_survival.png diff --git a/textures/crafting_inventory_creative.png b/textures/crafting_inventory_creative.png deleted file mode 100644 index 43664452b34a9cf748974be42ce8f33ecfec0f5a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1180 zcmeAS@N?(olHy`uVBq!ia0y~yVBQGCMl8%g5l_u%86YJT;1lAS2xNf4|Ns9lT)2>t zk-;!6-v%hcSQ6wH%;50sMj8VHi-o6)V@SoVx0f9SnHU9_4|?2;ayY2?a6-YqwI3Xq z^qsc1_^2{M4I+-JyAhN=No9Mp*<_W~IrC+wzb)xIJ#E_ElW#5Nsi&^p%8tN8qeM;j!>G=Q!j z^*-r|1|F~@GWLHjPn@c&xBL5b*ST|DZn{lQkuO`ZCudR4^VG>p&n?#>E@LC9IxziS X!J_jXOJ66w1c`dO`njxgN@xNA%W@VN diff --git a/textures/crafting_inventory_creative_survival.png b/textures/crafting_inventory_creative_survival.png deleted file mode 100644 index ad53b5f4f275476241a05d7dbc98a18cf52cc30d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1236 zcmeAS@N?(olHy`uVBq!ia0y~yVBQGCMl8%g5l_u%86YJQ;1lAS2xNf4|Ns9lT)2>t zk>T#{zIgHCbz3EF0>v3ig8YIR9G=}sV_;y(@^o~!eTK_C9aWpoQqQz+(&_=*ag=GckvWV zA*geHUM*TsK39Bi&NSuRZ^^GxH*2icIkgCkw7NHGfDx3xXbqH)M~TiUa&*BB?%qU# zU2t7+7Zc+`OkHpn Date: Sat, 19 Aug 2023 18:18:27 +0200 Subject: [PATCH 135/982] Use `table.indexof` in `mcl_anvils` --- mods/ITEMS/mcl_anvils/init.lua | 18 +++--------------- 1 file changed, 3 insertions(+), 15 deletions(-) diff --git a/mods/ITEMS/mcl_anvils/init.lua b/mods/ITEMS/mcl_anvils/init.lua index 9c2e25371..b41411f15 100644 --- a/mods/ITEMS/mcl_anvils/init.lua +++ b/mods/ITEMS/mcl_anvils/init.lua @@ -79,18 +79,6 @@ local function get_consumed_materials(tool, material) return materials_used end ----@param table table ----@param value any ----@return boolean -local function contains(table, value) - for _, i in pairs(table) do - if i == value then - return true - end - end - return false -end - -- Given 2 input stacks, tells you which is the tool and which is the material. -- Returns ("tool", input1, input2) if input1 is tool and input2 is material. -- Returns ("material", input2, input1) if input1 is material and input2 is tool. @@ -102,9 +90,9 @@ local function distinguish_tool_and_material(input1, input2) local def2 = input2:get_definition() local r1 = def1._repair_material local r2 = def2._repair_material - if def1.type == "tool" and r1 and type(r1) == "table" and contains(r1, input2) then + if def1.type == "tool" and r1 and type(r1) == "table" and table.indexof(r1, input2) ~= -1 then return "tool", input1, input2 - elseif def2.type == "tool" and r2 and type(r2) == "table" and contains(r2, input1) then + elseif def2.type == "tool" and r2 and type(r2) == "table" and table.indexof(r1, input1) ~= -1 then return "material", input2, input1 elseif def1.type == "tool" and r1 then return "tool", input1, input2 @@ -192,7 +180,7 @@ local function update_anvil_slots(meta) has_correct_material = true end else - if contains(repair, material_name) then + if table.indexof(repair, material_name) ~= -1 then has_correct_material = true else for _, r in pairs(repair) do From 1b5b2e4dc7fc2660f6858f2df92543ed9fa00367 Mon Sep 17 00:00:00 2001 From: AFCMS Date: Sat, 19 Aug 2023 18:27:00 +0200 Subject: [PATCH 136/982] Use new vectors in several places --- mods/ITEMS/REDSTONE/mcl_dispensers/init.lua | 13 ++++++------- mods/ITEMS/REDSTONE/mcl_droppers/init.lua | 17 ++++++++--------- mods/ITEMS/mcl_blast_furnace/init.lua | 7 +------ 3 files changed, 15 insertions(+), 22 deletions(-) diff --git a/mods/ITEMS/REDSTONE/mcl_dispensers/init.lua b/mods/ITEMS/REDSTONE/mcl_dispensers/init.lua index fa8ecc779..ae419a512 100644 --- a/mods/ITEMS/REDSTONE/mcl_dispensers/init.lua +++ b/mods/ITEMS/REDSTONE/mcl_dispensers/init.lua @@ -101,8 +101,7 @@ local dispenserdef = { for i = 1, inv:get_size("main") do local stack = inv:get_stack("main", i) if not stack:is_empty() then - local p = { x = pos.x + math.random(0, 10) / 10 - 0.5, y = pos.y, z = pos.z + math.random(0, 10) / 10 - 0.5 } - minetest.add_item(p, stack) + minetest.add_item(vector.offset(pos, math.random(0, 10) / 10 - 0.5, 0, math.random(0, 10) / 10 - 0.5), stack) end end meta:from_table(meta2) @@ -120,11 +119,11 @@ local dispenserdef = { dropdir = vector.multiply(minetest.facedir_to_dir(node.param2), -1) droppos = vector.add(pos, dropdir) elseif node.name == "mcl_dispensers:dispenser_up" then - dropdir = { x = 0, y = 1, z = 0 } - droppos = { x = pos.x, y = pos.y + 1, z = pos.z } + dropdir = vector.new(0, 1, 0) + droppos = vector.offset(pos, 0, 1, 0) elseif node.name == "mcl_dispensers:dispenser_down" then - dropdir = { x = 0, y = -1, z = 0 } - droppos = { x = pos.x, y = pos.y - 1, z = pos.z } + dropdir = vector.new(0, -1, 0) + droppos = vector.offset(pos, 0, -1, 0) end local dropnode = minetest.get_node(droppos) local dropnodedef = minetest.registered_nodes[dropnode.name] @@ -156,7 +155,7 @@ local dispenserdef = { -- Armor, mob heads and pumpkins if igroups.armor then - local droppos_below = { x = droppos.x, y = droppos.y - 1, z = droppos.z } + local droppos_below = vector.offset(droppos, 0, -1, 0) for _, objs in ipairs({ minetest.get_objects_inside_radius(droppos, 1), minetest.get_objects_inside_radius(droppos_below, 1) }) do diff --git a/mods/ITEMS/REDSTONE/mcl_droppers/init.lua b/mods/ITEMS/REDSTONE/mcl_droppers/init.lua index 78a9a773b..09e221a4d 100644 --- a/mods/ITEMS/REDSTONE/mcl_droppers/init.lua +++ b/mods/ITEMS/REDSTONE/mcl_droppers/init.lua @@ -74,8 +74,7 @@ local dropperdef = { for i = 1, inv:get_size("main") do local stack = inv:get_stack("main", i) if not stack:is_empty() then - local p = { x = pos.x + math.random(0, 10) / 10 - 0.5, y = pos.y, z = pos.z + math.random(0, 10) / 10 - 0.5 } - minetest.add_item(p, stack) + minetest.add_item(vector.offset(pos, math.random(0, 10) / 10 - 0.5, 0, math.random(0, 10) / 10 - 0.5), stack) end end meta:from_table(meta2) @@ -119,9 +118,9 @@ local dropperdef = { if node.name == "mcl_droppers:dropper" then droppos = vector.subtract(pos, minetest.facedir_to_dir(node.param2)) elseif node.name == "mcl_droppers:dropper_up" then - droppos = { x = pos.x, y = pos.y + 1, z = pos.z } + droppos = vector.offset(pos, 0, 1, 0) elseif node.name == "mcl_droppers:dropper_down" then - droppos = { x = pos.x, y = pos.y - 1, z = pos.z } + droppos = vector.offset(pos, 0, -1, 0) end local dropnode = minetest.get_node(droppos) -- Do not drop into solid nodes, unless they are containers @@ -149,11 +148,11 @@ local dropperdef = { if not dropped and not dropnodedef.groups.container then -- Drop item normally local pos_variation = 100 - droppos = { - x = droppos.x + math.random(-pos_variation, pos_variation) / 1000, - y = droppos.y + math.random(-pos_variation, pos_variation) / 1000, - z = droppos.z + math.random(-pos_variation, pos_variation) / 1000, - } + droppos = vector.offset(droppos, + math.random(-pos_variation, pos_variation) / 1000, + math.random(-pos_variation, pos_variation) / 1000, + math.random(-pos_variation, pos_variation) / 1000 + ) local item_entity = minetest.add_item(droppos, dropitem) local drop_vel = vector.subtract(droppos, pos) local speed = 3 diff --git a/mods/ITEMS/mcl_blast_furnace/init.lua b/mods/ITEMS/mcl_blast_furnace/init.lua index 108411083..51a8f193a 100644 --- a/mods/ITEMS/mcl_blast_furnace/init.lua +++ b/mods/ITEMS/mcl_blast_furnace/init.lua @@ -466,12 +466,7 @@ minetest.register_node("mcl_blast_furnace:blast_furnace", { for _, listname in ipairs({ "src", "dst", "fuel" }) do local stack = inv:get_stack(listname, 1) if not stack:is_empty() then - local p = { - x = pos.x + math.random(0, 10) / 10 - 0.5, - y = pos.y, - z = pos.z + math.random(0, 10) / 10 - 0.5 - } - minetest.add_item(p, stack) + minetest.add_item(vector.offset(pos, math.random(0, 10) / 10 - 0.5, 0, math.random(0, 10) / 10 - 0.5), stack) end end meta:from_table(meta2) From 149cb5d17c64703441727220d596ec060c5fd38f Mon Sep 17 00:00:00 2001 From: AFCMS Date: Sat, 19 Aug 2023 18:30:03 +0200 Subject: [PATCH 137/982] Fix gramar mistakes --- mods/HUD/mcl_formspec/FORMSPEC_GUIDE.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/mods/HUD/mcl_formspec/FORMSPEC_GUIDE.md b/mods/HUD/mcl_formspec/FORMSPEC_GUIDE.md index f8576070f..a5f3d4745 100644 --- a/mods/HUD/mcl_formspec/FORMSPEC_GUIDE.md +++ b/mods/HUD/mcl_formspec/FORMSPEC_GUIDE.md @@ -1,6 +1,6 @@ # MineClone2 Formspec Guide -**_This guide will learn you rules about creation of formspecs for the MineClone2 game._** +**_This guide will teach you the rules for creating formspecs for the MineClone2 game._** Formspecs are an important part of game and mod development. @@ -8,7 +8,7 @@ First of all, MineClone2 aims to support ONLY last formspec version. Many utilit The typical width of an 9 slots width inventory formspec is `0.375 + 9 + ((9-1) * 0.25) + 0.375 = 11.75` -Margins is 0.375. +Margins are 0.375. The labels color is `mcl_formspec.label_color` From 28d77a3e5beec9bb3eb747f48b4e39e874033a42 Mon Sep 17 00:00:00 2001 From: Sebastian Riedel Date: Sun, 20 Aug 2023 03:19:17 +0200 Subject: [PATCH 138/982] Replace spaces in itemstrings with underscore --- mods/ITEMS/mcl_crimson/alias.lua | 4 ++++ mods/ITEMS/mcl_crimson/init.lua | 10 ++++++---- 2 files changed, 10 insertions(+), 4 deletions(-) create mode 100644 mods/ITEMS/mcl_crimson/alias.lua diff --git a/mods/ITEMS/mcl_crimson/alias.lua b/mods/ITEMS/mcl_crimson/alias.lua new file mode 100644 index 000000000..cbc76ef2e --- /dev/null +++ b/mods/ITEMS/mcl_crimson/alias.lua @@ -0,0 +1,4 @@ +minetest.register_alias("mcl_flowerpots:flower_pot_crimson fungus", "mcl_flowerpots:flower_pot_crimson_fungus") +minetest.register_alias("mcl_flowerpots:flower_pot_crimson roots", "mcl_flowerpots:flower_pot_crimson_roots") +minetest.register_alias("mcl_flowerpots:flower_pot_warped fungus", "mcl_flowerpots:flower_pot_warped_fungus") +minetest.register_alias("mcl_flowerpots:flower_pot_warped roots", "mcl_flowerpots:flower_pot_warped_roots") diff --git a/mods/ITEMS/mcl_crimson/init.lua b/mods/ITEMS/mcl_crimson/init.lua index 3ec6d60e4..cd9c9354c 100644 --- a/mods/ITEMS/mcl_crimson/init.lua +++ b/mods/ITEMS/mcl_crimson/init.lua @@ -99,7 +99,7 @@ minetest.register_node("mcl_crimson:warped_fungus", { }) mcl_flowerpots.register_potted_flower("mcl_crimson:warped_fungus", { - name = "warped fungus", + name = "warped_fungus", desc = S("Warped Fungus"), image = "mcl_crimson_warped_fungus.png", }) @@ -297,7 +297,7 @@ minetest.register_node("mcl_crimson:warped_roots", { }) mcl_flowerpots.register_potted_flower("mcl_crimson:warped_roots", { - name = "warped roots", + name = "warped_roots", desc = S("Warped Roots"), image = "mcl_crimson_warped_roots.png", }) @@ -490,7 +490,7 @@ minetest.register_node("mcl_crimson:crimson_fungus", { }) mcl_flowerpots.register_potted_flower("mcl_crimson:crimson_fungus", { - name = "crimson fungus", + name = "crimson_fungus", desc = S("Crimson Fungus"), image = "mcl_crimson_crimson_fungus.png", }) @@ -516,7 +516,7 @@ minetest.register_node("mcl_crimson:crimson_roots", { }) mcl_flowerpots.register_potted_flower("mcl_crimson:crimson_roots", { - name = "crimson roots", + name = "crimson_roots", desc = S("Crimson Roots"), image = "mcl_crimson_crimson_roots.png", }) @@ -807,3 +807,5 @@ minetest.register_craft({ {"mcl_core:stick", warped_wood, "mcl_core:stick"}, } }) + +dofile(modpath.."/alias.lua") \ No newline at end of file From 2eabeb119a73c8b69cdc19af7be1e9eee35cc08c Mon Sep 17 00:00:00 2001 From: AFCMS Date: Wed, 23 Aug 2023 21:48:49 +0200 Subject: [PATCH 139/982] Fix creative node placement --- mods/HUD/mcl_inventory/creative.lua | 3 +++ 1 file changed, 3 insertions(+) diff --git a/mods/HUD/mcl_inventory/creative.lua b/mods/HUD/mcl_inventory/creative.lua index 3e4c3d4d6..bb2f226a2 100644 --- a/mods/HUD/mcl_inventory/creative.lua +++ b/mods/HUD/mcl_inventory/creative.lua @@ -725,6 +725,9 @@ minetest.register_on_player_receive_fields(function(player, formname, fields) mcl_inventory.set_creative_formspec(player) end) +minetest.register_on_placenode(function(pos, newnode, placer, oldnode, itemstack) + return placer and placer:is_player() and minetest.is_creative_enabled(placer:get_player_name()) +end) if minetest.is_creative_enabled("") then minetest.register_on_placenode(function(pos, newnode, placer, oldnode, itemstack) From 5bf0e79c6f8e05fd40d0ecd0b3ca41b4c27aea36 Mon Sep 17 00:00:00 2001 From: Nils Dagsson Moskopp Date: Sun, 27 Aug 2023 15:10:31 +0200 Subject: [PATCH 140/982] Add example code to generate TGA logo MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The tiny logo is a 12×12 TGA image. The huge logo is a 1200×1200 TGA image. --- logo.lua | 51 +++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 51 insertions(+) create mode 100644 logo.lua diff --git a/logo.lua b/logo.lua new file mode 100644 index 000000000..49bec0571 --- /dev/null +++ b/logo.lua @@ -0,0 +1,51 @@ +dofile("init.lua") + +local colormap = { + { 0, 0, 0 }, -- black + { 255, 255, 255 }, -- white + { 255, 0, 0 }, -- red + { 0, 255, 0 }, -- green + { 0, 0, 255 }, -- blue +} + +local _ = { 0 } +local W = { 1 } +local R = { 2 } +local G = { 3 } +local B = { 4 } + +local pixels_tiny = { + { W, W, W, W, W, W, W, W, W, W, W, W, }, + { W, _, _, _, _, _, _, _, _, _, _, W, }, + { W, _, _, _, _, _, _, B, _, B, _, W, }, + { W, _, _, _, _, _, _, B, B, B, _, W, }, + { W, _, _, _, G, G, G, B, _, B, _, W, }, + { W, _, _, _, G, _, G, B, B, B, _, W, }, + { W, _, _, R, G, _, _, _, _, _, _, W, }, + { W, _, _, R, G, G, G, _, _, _, _, W, }, + { W, _, _, R, _, _, _, _, _, _, _, W, }, + { W, _, R, R, R, _, _, _, _, _, _, W, }, + { W, _, _, _, _, _, _, _, _, _, _, W, }, + { W, W, W, W, W, W, W, W, W, W, W, W, }, +} + +local pixels_huge = {} + +local size_tiny = #pixels_tiny +local size_huge = 1200 +local scale = size_huge / size_tiny + +for x_huge = 1,size_huge,1 do + local x_tiny = math.ceil( x_huge / scale ) + for z_huge = 1,size_huge,1 do + local z_tiny = math.ceil( z_huge / scale ) + if nil == pixels_huge[z_huge] then + pixels_huge[z_huge] = {} + end + pixels_huge[z_huge][x_huge] = pixels_tiny[z_tiny][x_tiny] + end +end + +tga_encoder.image(pixels_tiny):save("logo_tiny.tga", {colormap=colormap}) +tga_encoder.image(pixels_huge):save("logo_huge.tga", {colormap=colormap}) + From 8176e7319fbc2f046ac20ceb9433fee5752bd13a Mon Sep 17 00:00:00 2001 From: chmodsayshello Date: Sun, 27 Aug 2023 19:42:40 +0200 Subject: [PATCH 141/982] update 'armor trim credits' --- CREDITS.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CREDITS.md b/CREDITS.md index 4873adf1d..e45fcd7d6 100644 --- a/CREDITS.md +++ b/CREDITS.md @@ -175,7 +175,7 @@ * Faerraven / Michieal * Nicu * Exhale -* Aeonix_Aeon +* Aeonix_Aeon (armor trim models) https://www.curseforge.com/minecraft/texture-packs/ozocraft-remix (CC BY 4.0) ## Translations * Wuzzy From 2f8bb9726b785574befb393862b8469507ab40d2 Mon Sep 17 00:00:00 2001 From: chmodsayshello Date: Sun, 27 Aug 2023 21:44:43 +0200 Subject: [PATCH 142/982] meta based: proof of concept --- mods/ITEMS/mcl_armor_trims/init.lua | 106 +++++++++++++++---------- mods/ITEMS/mcl_smithing_table/init.lua | 4 +- 2 files changed, 66 insertions(+), 44 deletions(-) diff --git a/mods/ITEMS/mcl_armor_trims/init.lua b/mods/ITEMS/mcl_armor_trims/init.lua index d7ea3ba74..dd9ca8785 100644 --- a/mods/ITEMS/mcl_armor_trims/init.lua +++ b/mods/ITEMS/mcl_armor_trims/init.lua @@ -1,57 +1,77 @@ +--TODO: put this mod entirely into mcl_armor + mcl_armor_trims = { - blacklisted = {["mcl_farming:pumpkin_face"]=true, ["mcl_armor:elytra"]=true, ["mcl_armor:elytra_enchanted"]=true}, - overlays = {"sentry","dune","coast","wild","tide","ward","vex","rib","snout","eye","spire"}, - colors = {["amethyst"]="#8246a5",["gold"]="#ce9627",["emerald"]="#1b9958",["copper"]="#c36447",["diamond"]="#5faed8",["iron"]="#938e88",["lapis"]="#1c306b",["netherite"]="#302a26",["quartz"]="#c9bcb9",["redstone"]="#af2c23"} + blacklisted = {["mcl_farming:pumpkin_face"]=true, ["mcl_armor:elytra"]=true, ["mcl_armor:elytra_enchanted"]=true}, + overlays = {"sentry","dune","coast","wild","tide","ward","vex","rib","snout","eye","spire"}, + colors = {["amethyst"]="#8246a5",["gold"]="#ce9627",["emerald"]="#1b9958",["copper"]="#c36447",["diamond"]="#5faed8",["iron"]="#938e88",["lapis"]="#1c306b",["netherite"]="#302a26",["quartz"]="#c9bcb9",["redstone"]="#af2c23"}, + old_textures = {} } -local function define_items() - local register_list = {} +local function override_items() for itemname, itemdef in pairs(minetest.registered_tools) do if itemdef._mcl_armor_texture and type(itemdef._mcl_armor_texture) == "string" and not mcl_armor_trims.blacklisted[itemname] then - for _, overlay in pairs(mcl_armor_trims.overlays) do - for mineral, color in pairs(mcl_armor_trims.colors) do - local new_name = itemname .. "_trimmed_" .. overlay .. "_" .. mineral - local new_def = table.copy(itemdef) - - local piece_overlay = overlay - local invOverlay = "" - if string.find(itemname,"helmet") then - invOverlay = "^(helmet_trim.png" - piece_overlay = piece_overlay .. "_helmet" - elseif string.find(itemname,"chestplate") then - invOverlay = "^(chestplate_trim.png" - piece_overlay = piece_overlay .. "_chestplate" - elseif string.find(itemname,"leggings") then - invOverlay = "^(leggings_trim.png" - piece_overlay = piece_overlay .. "_leggings" - elseif string.find(itemname,"boots") then - invOverlay = "^(boots_trim.png" - piece_overlay = piece_overlay .. "_boots" + mcl_armor_trims.old_textures[itemname] = itemdef._mcl_armor_texture + minetest.override_item(itemname, { + _mcl_armor_texture = function(obj, itemstack) + local overlay = itemstack:get_meta():get_string("mcl_armor_trims:trim_overlay") + local old_armor_texture = mcl_armor_trims.old_textures[itemstack:get_name()] + if type(old_armor_texture) == "function" then + old_armor_texture = old_armor_texture(obj, itemstack) end - invOverlay = invOverlay .. "^[colorize:" .. color .. ":150)" - piece_overlay = piece_overlay .. ".png" - - new_def.groups.not_in_creative_inventory = 1 - new_def.groups.not_in_craft_guide = 1 - new_def._mcl_armor_texture = new_def._mcl_armor_texture .. "^(" .. piece_overlay .. "^[colorize:" .. color .. ":150)" - new_def.inventory_image = itemdef.inventory_image .. invOverlay - - if string.find(itemname, "_enchanted") then - new_def._mcl_enchanting_enchanted_tool = new_name - else - new_def._mcl_enchanting_enchanted_tool = itemname .. "_enchanted_trimmed_" .. overlay .. "_" .. mineral + if overlay == "" then -- key not present; armor not trimmed + return old_armor_texture end - register_list[":" .. new_name] = new_def + + return old_armor_texture .. overlay end - end + }) end end - - for new_name, new_def in pairs(register_list) do - minetest.register_tool(new_name, new_def) - end end -minetest.register_on_mods_loaded(define_items) +function mcl_armor_trims.trim(itemstack, overlay, color_string) + local def = itemstack:get_definition() + if not def._mcl_armor_texture and not mcl_armor_trims.blacklisted[itemstack:get_name()] then + return + end + local meta = itemstack:get_meta() + + local piece_overlay = overlay + local inv_overlay = "" + local piece_type = def._mcl_armor_element + + if piece_type == "head" then --helmet + inv_overlay = "^(helmet_trim.png" + piece_overlay = piece_overlay .. "_helmet" + elseif piece_type == "torso" then --chestplate + inv_overlay = "^(chestplate_trim.png" + piece_overlay = piece_overlay .. "_chestplate" + elseif piece_type == "legs" then --leggings + inv_overlay = "^(leggings_trim.png" + piece_overlay = piece_overlay .. "_leggings" + elseif piece_type == "feet" then --boots + inv_overlay = "^(boots_trim.png" + piece_overlay = piece_overlay .. "_boots" + end + local color = mcl_armor_trims.colors[color_string] + inv_overlay = inv_overlay .. "^[colorize:" .. color .. ":150)" + piece_overlay = piece_overlay .. ".png" + + piece_overlay = "^(" .. piece_overlay .. "^[colorize:" .. color .. ":150)" + + meta:set_string("mcl_armor_trims:trim_overlay" , piece_overlay) -- set textures to render on the player, will work for clients below 5.8 as well + meta:set_string("mcl_armor_trims:inv", inv_overlay) -- make 5.8+ clients display the fancy inv image, older ones will see no change in the *inventory* image + meta:set_string("inventory_image", def.inventory_image .. inv_overlay) -- dont use reload_inv_image as it's a one liner in this enviorment +end + +function mcl_armor_trims.reload_inv_image(itemstack) + local meta = itemstack:get_meta() + local inv_overlay = meta:get_string("mcl_armor_trims:inv") + local def = itemstack:get_definition() + if inv_overlay == "" then return end + meta:set_string("inventory_image", def.inventory_image .. inv_overlay) +end + +minetest.register_on_mods_loaded(override_items) dofile(minetest.get_modpath(minetest.get_current_modname()).."/templates.lua") \ No newline at end of file diff --git a/mods/ITEMS/mcl_smithing_table/init.lua b/mods/ITEMS/mcl_smithing_table/init.lua index 33e118bf3..541f46159 100644 --- a/mods/ITEMS/mcl_smithing_table/init.lua +++ b/mods/ITEMS/mcl_smithing_table/init.lua @@ -20,6 +20,7 @@ function mcl_smithing_table.upgrade_item_netherite(itemstack) end itemstack:set_name(upgrade_item) + mcl_armor_trims.reload_inv_image(itemstack) -- Reload the ToolTips of the tool @@ -74,7 +75,8 @@ function mcl_smithing_table.upgrade_trimmed(itemstack, color_mineral, template) local overlay = template:get_name():gsub("mcl_armor_trims:","") --trimming process - itemstack:set_name(itemstack:get_name() .. "_trimmed_" .. overlay .. "_" .. material_name) + mcl_armor_trims.trim(itemstack, overlay, material_name) + --itemstack:set_name(itemstack:get_name() .. "_trimmed_" .. overlay .. "_" .. material_name) tt.reload_itemstack_description(itemstack) return itemstack From da024bb4b8bb1dedf584283fa7754a4bf07dbecf Mon Sep 17 00:00:00 2001 From: chmodsayshello Date: Mon, 28 Aug 2023 15:09:48 +0200 Subject: [PATCH 143/982] move mcl_armor_trims to mcl_armor --- mods/ITEMS/mcl_armor/api.lua | 58 +++++++++++++- mods/ITEMS/mcl_armor/init.lua | 7 ++ mods/ITEMS/mcl_armor/locale/mcl_armor.de.tr | 3 + mods/ITEMS/mcl_armor/locale/template.txt | 5 +- .../templates.lua => mcl_armor/trims.lua} | 2 +- mods/ITEMS/mcl_armor_trims/init.lua | 77 ------------------- .../locale/mcl_armor_trims.de.tr | 2 - .../ITEMS/mcl_armor_trims/locale/template.txt | 2 - mods/ITEMS/mcl_armor_trims/mod.conf | 4 - mods/ITEMS/mcl_smithing_table/init.lua | 10 +-- mods/ITEMS/mcl_smithing_table/mod.conf | 2 +- 11 files changed, 78 insertions(+), 94 deletions(-) rename mods/ITEMS/{mcl_armor_trims/templates.lua => mcl_armor/trims.lua} (96%) delete mode 100644 mods/ITEMS/mcl_armor_trims/init.lua delete mode 100644 mods/ITEMS/mcl_armor_trims/locale/mcl_armor_trims.de.tr delete mode 100644 mods/ITEMS/mcl_armor_trims/locale/template.txt delete mode 100644 mods/ITEMS/mcl_armor_trims/mod.conf diff --git a/mods/ITEMS/mcl_armor/api.lua b/mods/ITEMS/mcl_armor/api.lua index 1b9aa4f73..0d82ca440 100644 --- a/mods/ITEMS/mcl_armor/api.lua +++ b/mods/ITEMS/mcl_armor/api.lua @@ -85,6 +85,22 @@ function mcl_armor.equip_on_use(itemstack, player, pointed_thing) return mcl_armor.equip(itemstack, player) end +local function get_armor_texture(textures, name, modname, itemname, itemstring) + local core_texture = textures[name] or modname .. "_" .. itemname .. ".png" + if type(core_texture) == "function" then return core_texture end + mcl_armor.trims.core_textures[itemstring] = core_texture + local func = function(obj, itemstack) + local overlay = itemstack:get_meta():get_string("mcl_armor:trim_overlay") + local core_armor_texture = mcl_armor.trims.core_textures[itemstack:get_name()] + + if overlay == "" then return core_armor_texture end -- key not present; armor not trimmed + + return core_armor_texture .. overlay + end + + return func +end + function mcl_armor.register_set(def) local modname = minetest.get_current_modname() local S = minetest.get_translator(modname) @@ -136,7 +152,7 @@ function mcl_armor.register_set(def) _on_unequip = on_unequip_callbacks[name] or def.on_unequip, _on_break = on_break_callbacks[name] or def.on_break, _mcl_armor_element = name, - _mcl_armor_texture = textures[name] or modname .. "_" .. itemname .. ".png", + _mcl_armor_texture = get_armor_texture(textures, name, modname, itemname, itemstring), _mcl_upgradable = def._mcl_upgradable, _mcl_upgrade_item = upgrade_item }) @@ -257,3 +273,43 @@ function mcl_armor.update(obj) end end +function mcl_armor.trim(itemstack, overlay, color_string) + local def = itemstack:get_definition() + if not def._mcl_armor_texture and not mcl_armor.trims.blacklisted[itemstack:get_name()] then return end + local meta = itemstack:get_meta() + + local piece_overlay = overlay + local inv_overlay = "" + local piece_type = def._mcl_armor_element + + if piece_type == "head" then --helmet + inv_overlay = "^(helmet_trim.png" + piece_overlay = piece_overlay .. "_helmet" + elseif piece_type == "torso" then --chestplate + inv_overlay = "^(chestplate_trim.png" + piece_overlay = piece_overlay .. "_chestplate" + elseif piece_type == "legs" then --leggings + inv_overlay = "^(leggings_trim.png" + piece_overlay = piece_overlay .. "_leggings" + elseif piece_type == "feet" then --boots + inv_overlay = "^(boots_trim.png" + piece_overlay = piece_overlay .. "_boots" + end + local color = mcl_armor.trims.colors[color_string] + inv_overlay = inv_overlay .. "^[colorize:" .. color .. ":150)" + piece_overlay = piece_overlay .. ".png" + + piece_overlay = "^(" .. piece_overlay .. "^[colorize:" .. color .. ":150)" + + meta:set_string("mcl_armor:trim_overlay" , piece_overlay) -- set textures to render on the player, will work for clients below 5.8 as well + meta:set_string("mcl_armor:inv", inv_overlay) -- make 5.8+ clients display the fancy inv image, older ones will see no change in the *inventory* image + meta:set_string("inventory_image", def.inventory_image .. inv_overlay) -- dont use reload_inv_image as it's a one liner in this enviorment +end + +function mcl_armor.reload_trim_inv_image(itemstack) + local meta = itemstack:get_meta() + local inv_overlay = meta:get_string("mcl_armor:inv") + local def = itemstack:get_definition() + if inv_overlay == "" then return end + meta:set_string("inventory_image", def.inventory_image .. inv_overlay) +end \ No newline at end of file diff --git a/mods/ITEMS/mcl_armor/init.lua b/mods/ITEMS/mcl_armor/init.lua index 799bf2e9c..e85158f6c 100644 --- a/mods/ITEMS/mcl_armor/init.lua +++ b/mods/ITEMS/mcl_armor/init.lua @@ -57,6 +57,12 @@ mcl_armor = { } }, player_view_range_factors = {}, + trims = { + core_textures = {}, + blacklisted = {["mcl_armor:elytra"]=true, ["mcl_armor:elytra_enchanted"]=true}, + overlays = {"sentry","dune","coast","wild","tide","ward","vex","rib","snout","eye","spire"}, + colors = {["amethyst"]="#8246a5",["gold"]="#ce9627",["emerald"]="#1b9958",["copper"]="#c36447",["diamond"]="#5faed8",["iron"]="#938e88",["lapis"]="#1c306b",["netherite"]="#302a26",["quartz"]="#c9bcb9",["redstone"]="#af2c23"}, + }, } local modpath = minetest.get_modpath("mcl_armor") @@ -66,3 +72,4 @@ dofile(modpath .. "/player.lua") dofile(modpath .. "/damage.lua") dofile(modpath .. "/register.lua") dofile(modpath .. "/alias.lua") +dofile(modpath .. "/trims.lua") diff --git a/mods/ITEMS/mcl_armor/locale/mcl_armor.de.tr b/mods/ITEMS/mcl_armor/locale/mcl_armor.de.tr index 09da3a9cc..312b9fafb 100644 --- a/mods/ITEMS/mcl_armor/locale/mcl_armor.de.tr +++ b/mods/ITEMS/mcl_armor/locale/mcl_armor.de.tr @@ -21,3 +21,6 @@ Iron Boots=Eisenstiefel Golden Boots=Goldstiefel Diamond Boots=Diamantstiefel Chain Boots=Kettenstiefel + + +Smithing Template '@1'=Schiedevorlage '@1' \ No newline at end of file diff --git a/mods/ITEMS/mcl_armor/locale/template.txt b/mods/ITEMS/mcl_armor/locale/template.txt index 4b4ad8385..64318f41b 100644 --- a/mods/ITEMS/mcl_armor/locale/template.txt +++ b/mods/ITEMS/mcl_armor/locale/template.txt @@ -45,4 +45,7 @@ Protection= Reduces most types of damage by 4% for each level.= Thorns= Reflects some of the damage taken when hit, at the cost of reducing durability with each proc.= -Aqua Affinity= \ No newline at end of file +Aqua Affinity= + +#Translations for armor trims +Smithing Template '@1'= \ No newline at end of file diff --git a/mods/ITEMS/mcl_armor_trims/templates.lua b/mods/ITEMS/mcl_armor/trims.lua similarity index 96% rename from mods/ITEMS/mcl_armor_trims/templates.lua rename to mods/ITEMS/mcl_armor/trims.lua index 6a8c23667..c29d16bb6 100644 --- a/mods/ITEMS/mcl_armor_trims/templates.lua +++ b/mods/ITEMS/mcl_armor/trims.lua @@ -1,7 +1,7 @@ local mod_registername = minetest.get_current_modname() .. ":" local S = minetest.get_translator(modname) -for _, template_name in pairs(mcl_armor_trims.overlays) do +for _, template_name in pairs(mcl_armor.trims.overlays) do minetest.register_craftitem(mod_registername .. template_name, { description = S("Smithing Template '@1'", template_name), inventory_image = template_name .. "_armor_trim_smithing_template.png", diff --git a/mods/ITEMS/mcl_armor_trims/init.lua b/mods/ITEMS/mcl_armor_trims/init.lua deleted file mode 100644 index dd9ca8785..000000000 --- a/mods/ITEMS/mcl_armor_trims/init.lua +++ /dev/null @@ -1,77 +0,0 @@ ---TODO: put this mod entirely into mcl_armor - -mcl_armor_trims = { - blacklisted = {["mcl_farming:pumpkin_face"]=true, ["mcl_armor:elytra"]=true, ["mcl_armor:elytra_enchanted"]=true}, - overlays = {"sentry","dune","coast","wild","tide","ward","vex","rib","snout","eye","spire"}, - colors = {["amethyst"]="#8246a5",["gold"]="#ce9627",["emerald"]="#1b9958",["copper"]="#c36447",["diamond"]="#5faed8",["iron"]="#938e88",["lapis"]="#1c306b",["netherite"]="#302a26",["quartz"]="#c9bcb9",["redstone"]="#af2c23"}, - old_textures = {} -} - -local function override_items() - for itemname, itemdef in pairs(minetest.registered_tools) do - if itemdef._mcl_armor_texture and type(itemdef._mcl_armor_texture) == "string" and not mcl_armor_trims.blacklisted[itemname] then - mcl_armor_trims.old_textures[itemname] = itemdef._mcl_armor_texture - minetest.override_item(itemname, { - _mcl_armor_texture = function(obj, itemstack) - local overlay = itemstack:get_meta():get_string("mcl_armor_trims:trim_overlay") - local old_armor_texture = mcl_armor_trims.old_textures[itemstack:get_name()] - if type(old_armor_texture) == "function" then - old_armor_texture = old_armor_texture(obj, itemstack) - end - - if overlay == "" then -- key not present; armor not trimmed - return old_armor_texture - end - - return old_armor_texture .. overlay - end - }) - end - end -end - -function mcl_armor_trims.trim(itemstack, overlay, color_string) - local def = itemstack:get_definition() - if not def._mcl_armor_texture and not mcl_armor_trims.blacklisted[itemstack:get_name()] then - return - end - local meta = itemstack:get_meta() - - local piece_overlay = overlay - local inv_overlay = "" - local piece_type = def._mcl_armor_element - - if piece_type == "head" then --helmet - inv_overlay = "^(helmet_trim.png" - piece_overlay = piece_overlay .. "_helmet" - elseif piece_type == "torso" then --chestplate - inv_overlay = "^(chestplate_trim.png" - piece_overlay = piece_overlay .. "_chestplate" - elseif piece_type == "legs" then --leggings - inv_overlay = "^(leggings_trim.png" - piece_overlay = piece_overlay .. "_leggings" - elseif piece_type == "feet" then --boots - inv_overlay = "^(boots_trim.png" - piece_overlay = piece_overlay .. "_boots" - end - local color = mcl_armor_trims.colors[color_string] - inv_overlay = inv_overlay .. "^[colorize:" .. color .. ":150)" - piece_overlay = piece_overlay .. ".png" - - piece_overlay = "^(" .. piece_overlay .. "^[colorize:" .. color .. ":150)" - - meta:set_string("mcl_armor_trims:trim_overlay" , piece_overlay) -- set textures to render on the player, will work for clients below 5.8 as well - meta:set_string("mcl_armor_trims:inv", inv_overlay) -- make 5.8+ clients display the fancy inv image, older ones will see no change in the *inventory* image - meta:set_string("inventory_image", def.inventory_image .. inv_overlay) -- dont use reload_inv_image as it's a one liner in this enviorment -end - -function mcl_armor_trims.reload_inv_image(itemstack) - local meta = itemstack:get_meta() - local inv_overlay = meta:get_string("mcl_armor_trims:inv") - local def = itemstack:get_definition() - if inv_overlay == "" then return end - meta:set_string("inventory_image", def.inventory_image .. inv_overlay) -end - -minetest.register_on_mods_loaded(override_items) -dofile(minetest.get_modpath(minetest.get_current_modname()).."/templates.lua") \ No newline at end of file diff --git a/mods/ITEMS/mcl_armor_trims/locale/mcl_armor_trims.de.tr b/mods/ITEMS/mcl_armor_trims/locale/mcl_armor_trims.de.tr deleted file mode 100644 index 71b363ec6..000000000 --- a/mods/ITEMS/mcl_armor_trims/locale/mcl_armor_trims.de.tr +++ /dev/null @@ -1,2 +0,0 @@ -# textdomain: mcl_armor_trims -Smithing Template '@1'=Schiedevorlage '@1' diff --git a/mods/ITEMS/mcl_armor_trims/locale/template.txt b/mods/ITEMS/mcl_armor_trims/locale/template.txt deleted file mode 100644 index 58eef9444..000000000 --- a/mods/ITEMS/mcl_armor_trims/locale/template.txt +++ /dev/null @@ -1,2 +0,0 @@ -# textdomain: mcl_armor_trims -Smithing Template '@1' diff --git a/mods/ITEMS/mcl_armor_trims/mod.conf b/mods/ITEMS/mcl_armor_trims/mod.conf deleted file mode 100644 index de381b16f..000000000 --- a/mods/ITEMS/mcl_armor_trims/mod.conf +++ /dev/null @@ -1,4 +0,0 @@ -name = mcl_armor_trims -author = chmodsayshello -optional_depends = mcl_armor -depends = mcl_enchanting, mcl_core, mcl_end \ No newline at end of file diff --git a/mods/ITEMS/mcl_smithing_table/init.lua b/mods/ITEMS/mcl_smithing_table/init.lua index 541f46159..528b6843d 100644 --- a/mods/ITEMS/mcl_smithing_table/init.lua +++ b/mods/ITEMS/mcl_smithing_table/init.lua @@ -20,7 +20,7 @@ function mcl_smithing_table.upgrade_item_netherite(itemstack) end itemstack:set_name(upgrade_item) - mcl_armor_trims.reload_inv_image(itemstack) + mcl_armor.reload_trim_inv_image(itemstack) -- Reload the ToolTips of the tool @@ -72,10 +72,10 @@ function mcl_smithing_table.upgrade_trimmed(itemstack, color_mineral, template) local material_name = color_mineral:get_name() material_name = smithing_materials[material_name] - local overlay = template:get_name():gsub("mcl_armor_trims:","") + local overlay = template:get_name():gsub("mcl_armor:","") --trimming process - mcl_armor_trims.trim(itemstack, overlay, material_name) + mcl_armor.trim(itemstack, overlay, material_name) --itemstack:set_name(itemstack:get_name() .. "_trimmed_" .. overlay .. "_" .. material_name) tt.reload_itemstack_description(itemstack) @@ -137,13 +137,13 @@ minetest.register_node("mcl_smithing_table:table", { if listname == "upgrade_item" and string.find(stack:get_name(),"mcl_armor:") -- allow any armor piece to go in (in case the player wants to trim them) - and not mcl_armor_trims.blacklisted[stack:get_name()] + and not mcl_armor.trims.blacklisted[stack:get_name()] or listname == "mineral" and mcl_smithing_table.is_smithing_mineral(stack:get_name()) or listname == "template" - and string.find(stack:get_name(),"mcl_armor_trims") + and string.find(stack:get_name(),"mcl_armor") then return stack:get_count() end diff --git a/mods/ITEMS/mcl_smithing_table/mod.conf b/mods/ITEMS/mcl_smithing_table/mod.conf index c38c8ef36..d947b850e 100644 --- a/mods/ITEMS/mcl_smithing_table/mod.conf +++ b/mods/ITEMS/mcl_smithing_table/mod.conf @@ -1,2 +1,2 @@ name = mcl_smithing_table -depends = mcl_colors, mcl_formspec, mcl_armor_trims +depends = mcl_colors, mcl_formspec, mcl_armor From 291cbaf434f4363bdc99cb25f301b1b8b012185c Mon Sep 17 00:00:00 2001 From: chmodsayshello Date: Mon, 28 Aug 2023 18:48:37 +0200 Subject: [PATCH 144/982] move armor trim license info to LEGAL.md --- CREDITS.md | 2 +- LEGAL.md | 4 ++++ 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/CREDITS.md b/CREDITS.md index fda075e79..39eed70e1 100644 --- a/CREDITS.md +++ b/CREDITS.md @@ -178,7 +178,7 @@ * Faerraven / Michieal * Nicu * Exhale -* Aeonix_Aeon (armor trim models) https://www.curseforge.com/minecraft/texture-packs/ozocraft-remix (CC BY 4.0) +* Aeonix_Aeon * Wbjitscool * SmokeyDope diff --git a/LEGAL.md b/LEGAL.md index e378c1b59..a181da398 100644 --- a/LEGAL.md +++ b/LEGAL.md @@ -42,6 +42,10 @@ The glazed terracotta textures have been created by [MysticTempest](https://gith Source: License: [CC BY-SA 4.0](http://creativecommons.org/licenses/by-sa/4.0/) +Armor trim models were created by Aeonix_Aeon +Source: +License: [CC BY 4.0](https://creativecommons.org/licenses/by/4.0/) + The main menu images are released under: [CC0](https://creativecommons.org/publicdomain/zero/1.0/) All other files, unless mentioned otherwise, fall under: From 5b4a79a26d2d380b42245a97c965d09dc2da4613 Mon Sep 17 00:00:00 2001 From: Sab Pyrope Date: Sun, 20 Aug 2023 21:28:25 +0800 Subject: [PATCH 145/982] Update russian translation --- README_locale/README.ru.md | 193 +++++++ .../locale/mcl_explosions.ru.tr | 2 + .../ENTITIES/mcl_boats/locale/mcl_boats.ru.tr | 20 +- .../locale/mcl_falling_nodes.ru.tr | 3 + .../mcl_minecarts/locale/mcl_minecarts.ru.tr | 60 +-- mods/ENTITIES/mcl_mobs/locale/mcl_mobs.ru.tr | 22 +- .../mcl_paintings/locale/mcl_paintings.ru.tr | 2 +- mods/ENTITIES/mobs_mc/locale/mobs_mc.ru.tr | 35 +- mods/ENTITIES/mobs_mc/locale/template.txt | 7 +- .../lightning/locale/lightning.ru.tr | 3 +- .../mcl_raids/locale/mcl_raids.ru.tr | 2 + .../ENVIRONMENT/mcl_raids/locale/template.txt | 2 + .../mcl_weather/locale/mcl_weather.ru.tr | 1 - mods/HELP/doc/doc/locale/doc.ru.tr | 2 +- .../locale/doc_identifier.ru.tr | 6 +- .../HELP/doc/doc_items/locale/doc_items.ru.tr | 116 ++--- .../locale/mcl_craftguide.ru.tr | 20 +- mods/HELP/mcl_doc/locale/mcl_doc.ru.tr | 70 +-- mods/HELP/mcl_doc/locale/template.txt | 1 - .../locale/mcl_doc_basics.ru.tr | 472 +++++++++--------- mods/HELP/mcl_tt/locale/mcl_tt.ru.tr | 59 +-- mods/HUD/awards/locale/awards.de.tr | 2 +- mods/HUD/awards/locale/awards.es.tr | 2 +- mods/HUD/awards/locale/awards.fr.tr | 2 +- mods/HUD/awards/locale/awards.ja.tr | 2 +- mods/HUD/awards/locale/awards.pl.tr | 2 +- mods/HUD/awards/locale/awards.ru.tr | 52 +- mods/HUD/awards/locale/template.txt | 2 +- mods/HUD/hudbars/locale/hudbars.ru.tr | 6 +- .../locale/mcl_achievements.ru.tr | 214 ++++---- mods/HUD/mcl_credits/locale/mcl_credits.ru.tr | 31 +- mods/HUD/mcl_credits/locale/template.txt | 5 + .../locale/mcl_death_messages.ru.tr | 114 ++--- .../locale/mcl_experience.ru.tr | 7 +- .../mcl_inventory/locale/mcl_inventory.ru.tr | 17 +- .../mcl_ver_info/locale/mcl_ver_info.ru.tr | 3 + mods/HUD/mcl_ver_info/locale/template.txt | 3 +- .../locale/mcl_comparators.ru.tr | 16 +- .../locale/mcl_dispensers.ru.tr | 34 +- .../mcl_droppers/locale/mcl_droppers.ru.tr | 8 +- .../mcl_observers/locale/mcl_observers.ru.tr | 6 +- .../mcl_target/locale/mcl_target.ru.tr | 4 + .../locale/mesecons_button.ru.tr | 16 +- .../locale/mesecons_commandblock.ru.tr | 26 +- .../locale/mesecons_delayer.ru.tr | 8 +- .../locale/mesecons_lightstone.ru.tr | 6 +- .../locale/mesecons_noteblock.ru.tr | 22 +- .../locale/mesecons_pistons.ru.tr | 10 +- .../locale/mesecons_pressureplates.ru.tr | 29 +- .../locale/mesecons_solarpanel.ru.tr | 8 +- .../locale/mesecons_torch.ru.tr | 16 +- .../locale/mesecons_walllever.ru.tr | 6 +- .../locale/mesecons_wires.ru.tr | 14 +- .../mcl_amethyst/locale/mcl_amethyst.ru.tr | 8 +- mods/ITEMS/mcl_anvils/locale/mcl_anvils.ru.tr | 18 +- mods/ITEMS/mcl_armor/locale/mcl_armor.ru.tr | 51 +- .../locale/mcl_armor_stand.ru.tr | 8 +- mods/ITEMS/mcl_bamboo/bamboo_items.lua | 4 +- mods/ITEMS/mcl_bamboo/locale/mcl_bamboo.dk.tr | 2 +- mods/ITEMS/mcl_bamboo/locale/mcl_bamboo.es.tr | 2 +- mods/ITEMS/mcl_bamboo/locale/mcl_bamboo.fr.tr | 2 +- mods/ITEMS/mcl_bamboo/locale/mcl_bamboo.ru.tr | 38 +- mods/ITEMS/mcl_bamboo/locale/template.txt | 3 +- mods/ITEMS/mcl_banners/init.lua | 2 +- .../mcl_banners/locale/mcl_banners.ru.tr | 104 ++-- mods/ITEMS/mcl_banners/locale/template.txt | 1 + .../mcl_barrels/locale/mcl_barrels.ru.tr | 6 +- mods/ITEMS/mcl_beds/locale/mcl_beds.ru.tr | 40 +- .../mcl_beehives/locale/mcl_beehives.ru.tr | 5 + mods/ITEMS/mcl_bells/locale/mcl_bells.ru.tr | 2 + .../locale/mcl_blackstone.ru.tr | 46 +- .../locale/mcl_blast_furnace.ru.tr | 11 + mods/ITEMS/mcl_books/locale/mcl_books.ru.tr | 12 +- mods/ITEMS/mcl_bows/crossbow.lua | 2 +- mods/ITEMS/mcl_bows/locale/mcl_bows.ru.tr | 19 +- mods/ITEMS/mcl_bows/locale/template.txt | 2 +- .../mcl_brewing/locale/mcl_brewing.ru.tr | 12 +- .../mcl_buckets/locale/mcl_buckets.ru.tr | 16 +- mods/ITEMS/mcl_cake/locale/mcl_cake.ru.tr | 8 +- .../mcl_campfires/locale/mcl_campfires.ru.tr | 5 + .../locale/mcl_cartography_table.ru.tr | 4 + ...cl_chaudrons.ru.tr => mcl_cauldrons.ru.tr} | 4 +- .../locale/mcl_cherry_blossom.ru.tr | 16 +- mods/ITEMS/mcl_chests/locale/mcl_chests.ru.tr | 34 +- mods/ITEMS/mcl_clock/locale/mcl_clock.ru.tr | 2 +- mods/ITEMS/mcl_cocoas/locale/mcl_cocoas.ru.tr | 6 +- .../locale/mcl_colorblocks.ru.tr | 50 +- .../mcl_compass/locale/mcl_compass.ru.tr | 19 +- .../locale/mcl_composters.ru.tr | 12 +- mods/ITEMS/mcl_copper/locale/mcl_copper.ru.tr | 57 +++ mods/ITEMS/mcl_core/locale/mcl_core.ru.tr | 323 ++++++------ .../locale/mcl_crafting_table.ru.tr | 8 +- .../mcl_crimson/locale/mcl_crimson.ru.tr | 51 ++ .../mcl_deepslate/locale/mcl_deepslate.ru.tr | 53 ++ mods/ITEMS/mcl_doors/locale/mcl_doors.ru.tr | 20 +- mods/ITEMS/mcl_doors/locale/template.txt | 2 + mods/ITEMS/mcl_dye/locale/mcl_dye.ru.tr | 20 +- .../locale/mcl_enchanting.ru.tr | 220 ++++---- mods/ITEMS/mcl_end/locale/mcl_end.ru.tr | 46 +- .../mcl_farming/locale/mcl_farming.ru.tr | 94 ++-- mods/ITEMS/mcl_fences/locale/mcl_fences.ru.tr | 16 +- mods/ITEMS/mcl_fire/locale/mcl_fire.ru.tr | 26 +- .../mcl_fireworks/locale/mcl_fireworks.ru.tr | 4 +- .../mcl_fishing/locale/mcl_fishing.ru.tr | 20 +- .../locale/mcl_fletching_table.ru.tr | 4 + .../locale/mcl_flowerpots.ru.tr | 11 +- .../mcl_flowers/locale/mcl_flowers.ru.tr | 15 +- .../mcl_furnaces/locale/mcl_furnaces.ru.tr | 11 +- .../locale/mcl_grindstone.ru.tr | 11 + .../mcl_hamburger/locale/mcl_hamburger.ru.tr | 8 +- mods/ITEMS/mcl_heads/locale/mcl_heads.ru.tr | 6 +- mods/ITEMS/mcl_honey/locale/mcl_honey.ru.tr | 11 + .../mcl_hoppers/locale/mcl_hoppers.ru.tr | 14 +- .../locale/mcl_itemframes.ru.tr | 14 +- .../mcl_jukebox/locale/mcl_jukebox.ru.tr | 14 +- .../mcl_lanterns/locale/mcl_lanterns.ru.tr | 6 + .../mcl_lectern/locale/mcl_lectern.ru.tr | 4 + .../locale/mcl_lightning_rods.ru.tr | 3 + mods/ITEMS/mcl_loom/locale/mcl_loom.ru.tr | 2 +- .../mcl_mangrove/locale/mcl_mangrove.fr.tr | 4 +- .../mcl_mangrove/locale/mcl_mangrove.ja.tr | 4 +- .../mcl_mangrove/locale/mcl_mangrove.ru.tr | 36 ++ mods/ITEMS/mcl_mangrove/locale/template.txt | 4 +- mods/ITEMS/mcl_maps/locale/mcl_maps.ru.tr | 7 +- .../mcl_mobitems/locale/mcl_mobitems.ru.tr | 99 ++-- .../locale/mcl_mobspawners.ru.tr | 6 +- .../locale/mcl_monster_eggs.ru.tr | 16 +- mods/ITEMS/mcl_mud/locale/mcl_mud.ru.tr | 7 + .../mcl_mushrooms/locale/mcl_mushrooms.ru.tr | 40 +- mods/ITEMS/mcl_nether/locale/mcl_nether.ru.tr | 44 +- mods/ITEMS/mcl_ocean/locale/mcl_ocean.ru.tr | 80 +-- .../mcl_portals/locale/mcl_portals.de.tr | 10 +- .../mcl_portals/locale/mcl_portals.es.tr | 10 +- .../mcl_portals/locale/mcl_portals.fr.tr | 10 +- .../mcl_portals/locale/mcl_portals.ja.tr | 10 +- .../mcl_portals/locale/mcl_portals.pl.tr | 10 +- .../mcl_portals/locale/mcl_portals.ru.tr | 32 +- .../mcl_portals/locale/mcl_portals.zh_TW.tr | 10 +- mods/ITEMS/mcl_portals/locale/template.txt | 10 +- .../mcl_potions/locale/mcl_potions.ru.tr | 104 ++-- .../mcl_raw_ores/locale/mcl_raw_ores.ru.tr | 9 + mods/ITEMS/mcl_sculk/locale/mcl_sculk.ru.tr | 7 + .../mcl_shields/locale/mcl_shields.ru.tr | 19 + mods/ITEMS/mcl_signs/locale/mcl_signs.ru.tr | 27 +- .../locale/mcl_smithing_table.ru.tr | 4 + mods/ITEMS/mcl_smoker/locale/mcl_smoker.ru.tr | 11 + .../mcl_sponges/locale/mcl_sponges.ru.tr | 12 +- mods/ITEMS/mcl_stairs/locale/mcl_stairs.ru.tr | 107 ++-- .../locale/mcl_stonecutter.ru.tr | 4 + mods/ITEMS/mcl_sus_stew/init.lua | 3 +- .../mcl_sus_stew/locale/mcl_sus_stew.ru.tr | 2 + mods/ITEMS/mcl_sus_stew/locale/template.txt | 2 + .../mcl_throwing/locale/mcl_throwing.ru.tr | 14 +- mods/ITEMS/mcl_tnt/locale/mcl_tnt.ru.tr | 12 +- mods/ITEMS/mcl_tools/locale/mcl_tools.ru.tr | 24 +- .../mcl_torches/locale/mcl_torches.ru.tr | 2 +- mods/ITEMS/mcl_totems/locale/mcl_totems.ru.tr | 4 +- mods/ITEMS/mcl_walls/locale/mcl_walls.ru.tr | 13 +- mods/ITEMS/mcl_wool/locale/mcl_wool.ru.tr | 20 +- mods/ITEMS/mclx_core/locale/mclx_core.ru.tr | 2 +- .../mclx_fences/locale/mclx_fences.ru.tr | 4 +- .../mclx_stairs/locale/mclx_stairs.ru.tr | 138 ++--- mods/ITEMS/xpanes/locale/xpanes.ru.tr | 40 +- .../locale/mcl_structures.ru.tr | 8 +- .../mcl_villages/locale/mcl_villages.ru.tr | 3 +- mods/MISC/findbiome/locale/findbiome.ru.tr | 2 +- .../mcl_commands/locale/mcl_commands.ru.tr | 8 +- mods/MISC/mcl_privs/locale/mcl_privs.ru.tr | 2 +- .../PLAYER/mcl_hunger/locale/mcl_hunger.ru.tr | 4 +- mods/PLAYER/mcl_music/locale/mcl_music.ru.tr | 7 + mods/PLAYER/mcl_skins/locale/mcl_skins.ru.tr | 6 +- mods/PLAYER/mcl_spawn/locale/mcl_spawn.ru.tr | 3 +- 172 files changed, 2677 insertions(+), 1860 deletions(-) create mode 100644 README_locale/README.ru.md create mode 100644 mods/CORE/mcl_explosions/locale/mcl_explosions.ru.tr create mode 100644 mods/ENTITIES/mcl_falling_nodes/locale/mcl_falling_nodes.ru.tr create mode 100644 mods/ENVIRONMENT/mcl_raids/locale/mcl_raids.ru.tr create mode 100644 mods/ENVIRONMENT/mcl_raids/locale/template.txt create mode 100644 mods/HUD/mcl_ver_info/locale/mcl_ver_info.ru.tr create mode 100644 mods/ITEMS/REDSTONE/mcl_target/locale/mcl_target.ru.tr create mode 100644 mods/ITEMS/mcl_beehives/locale/mcl_beehives.ru.tr create mode 100644 mods/ITEMS/mcl_bells/locale/mcl_bells.ru.tr create mode 100644 mods/ITEMS/mcl_blast_furnace/locale/mcl_blast_furnace.ru.tr create mode 100644 mods/ITEMS/mcl_campfires/locale/mcl_campfires.ru.tr create mode 100644 mods/ITEMS/mcl_cartography_table/locale/mcl_cartography_table.ru.tr rename mods/ITEMS/mcl_cauldrons/locale/{mcl_chaudrons.ru.tr => mcl_cauldrons.ru.tr} (58%) create mode 100644 mods/ITEMS/mcl_copper/locale/mcl_copper.ru.tr create mode 100644 mods/ITEMS/mcl_crimson/locale/mcl_crimson.ru.tr create mode 100644 mods/ITEMS/mcl_deepslate/locale/mcl_deepslate.ru.tr create mode 100644 mods/ITEMS/mcl_fletching_table/locale/mcl_fletching_table.ru.tr create mode 100644 mods/ITEMS/mcl_grindstone/locale/mcl_grindstone.ru.tr create mode 100644 mods/ITEMS/mcl_honey/locale/mcl_honey.ru.tr create mode 100644 mods/ITEMS/mcl_lanterns/locale/mcl_lanterns.ru.tr create mode 100644 mods/ITEMS/mcl_lectern/locale/mcl_lectern.ru.tr create mode 100644 mods/ITEMS/mcl_lightning_rods/locale/mcl_lightning_rods.ru.tr create mode 100644 mods/ITEMS/mcl_mangrove/locale/mcl_mangrove.ru.tr create mode 100644 mods/ITEMS/mcl_mud/locale/mcl_mud.ru.tr create mode 100644 mods/ITEMS/mcl_raw_ores/locale/mcl_raw_ores.ru.tr create mode 100644 mods/ITEMS/mcl_sculk/locale/mcl_sculk.ru.tr create mode 100644 mods/ITEMS/mcl_shields/locale/mcl_shields.ru.tr create mode 100644 mods/ITEMS/mcl_smithing_table/locale/mcl_smithing_table.ru.tr create mode 100644 mods/ITEMS/mcl_smoker/locale/mcl_smoker.ru.tr create mode 100644 mods/ITEMS/mcl_stonecutter/locale/mcl_stonecutter.ru.tr create mode 100644 mods/ITEMS/mcl_sus_stew/locale/mcl_sus_stew.ru.tr create mode 100644 mods/ITEMS/mcl_sus_stew/locale/template.txt create mode 100644 mods/PLAYER/mcl_music/locale/mcl_music.ru.tr diff --git a/README_locale/README.ru.md b/README_locale/README.ru.md new file mode 100644 index 000000000..101e14095 --- /dev/null +++ b/README_locale/README.ru.md @@ -0,0 +1,193 @@ +# MineClone2 +Неофициальная игра в стиле Minecraft для Minetest. Форк MineClone от davedevils. +Разработана многими людьми. Не разработана и не одобрена Mojang AB. + +### Игровой процесс +Вы начинаете в случайно сгенерированном мире созданном целиком из кубов. Вы можете +исследовать мир, выкопать и поставить почти каждый блок в мире, чтобы создавать новые +структуры. Вы можете играть в “режиме выживания” в котором вам придется бороться с +монстрами и голодом за выживание и медленно проходить через различные аспекты игры, +такие как копание, фермерство, постройка механизмов и так далее. Или вы можете играть +в “творческом режиме” в котором вы сразу можете строить что угодно. + +#### Итоги геймплея + +* Геймплей в стиле песочницы, без целей +* Выживайте: сражайтесь с враждебными монстрами и голодом +* Добывайте руды и прочие ценные предметы +* Магия: получайте опыт и зачаруйте ваше снаряжение +* Создавайте из собранных блоков величественные постройки ограниченные только воображением +* Собирайте цветы и другие красители, чтобы раскрасить ваш мир +* Найдите семена и заведите ферму +* Найдите или создайте один из сотен предметов +* Проложите рельсы и повеселитесь с вагонетками +* Постройте сложные механизмы со схемами из редстоуна +* В творческом режиме вы можете свободно строить всё без лимитов + +## Как играть (быстрый старт) +### Начнем + +* **Бейте по стволу дерева** пока оно не сломается и соберите древесину +* Поставьте **древесину в сетку 2×2** (“сетка крафта” в вашем инвентаре) и скрафтите 4 доски +* Разложите 4 доски в форме 2×2 в сетке крафта, чтобы **сделать верстак** +* **Правым кликом по верстаку**, чтобы открыть сетку крафта 3×3 для более сложных предметов +* Используйте **книгу рецептов** (иконка книги), чтобы узнать все возможные рецепты крафтов +* **Скрафтите деревянную кирку**, чтобы вы могли копать камень +* Разные инструменты добывают разные виды блоков. Опробуйте их все! +* Продолжайте играть как пожелаете. Повеселитесь! + +### Фермерство +* Найдите семена +* Скрафтите мотыгу +* Правой кнопкой мотыгой по земле или похожему блоку, чтобы создать грядку +* Посадите семена на грядку и ждите пока они вырастут +* Соберите растение когда оно полностью созреет +* Рядом с водой грядка становится влажной и растения растут быстрее + +### Переплавка +* Скрафтите печь +* Печь позволит вам получить больше предметов +* Верхний слот должен содержать переплавляемый предмет (например: железную руду) +* Нижний слот должен содержать топливо (например: уголь) +* Смотрите книгу рецептов, чтобы узнать о других переплавляемых предметах и топливе + +### Дополнительная помощь +Больше информации о геймплее, блоках, предметах и многое другое можно найти во +внутриигровой справке. Вы можете перейти в неё через ваш инвентарь. + +### Особые предметы +Следующие предметы интересны для творческого режима и для строителей приключенческих +карт. Их нельзя получить в игре или через творческий инвентарь. + +* Барьер: `mcl_core:barrier` + +Используйте чат-команду `/giveme`, чтобы получить их. +Смотрите справку для дальнейшей информации. + +## Установка +Эта игра требует [Minetest](http://minetest.net) для запуска (версия 5.4.1 или +выше). Вам нужно сперва установить Minetest. Только стабильные версии поддерживаются +официально. Не поддерживается запуск MineClone2 на разрабатываемых версиях Minetest. + +Чтобы установить MineClone2 (если вы этого еще не сделали), переместите эту папку в +“games” в папке данных Minetest. Смотрите справку Minetest, чтобы узнать больше. + +## Полезные ссылки +Репозиторий MineClone2 хранится на Mesehub. Зайдите туда, чтобы оставить запрос или +поучаствовать в разработке. + +* Mesehub: +* Discord: +* YouTube: +* ContentDB: +* OpenCollective: +* Mastodon: +* Lemmy: +* Matrix space: +* Форум Minetest: +* Reddit: +* IRC (едва используется): + +## Цели +- Создать стабильную, модифицируемую, бесплатную и свободную игру основанную на +Minecraft на движке Minetest с проработанными возможностями для одиночной игры и +для мультиплеера. На данный момент множество возможностей **Minecraft Java +Edition** уже реализовано и доработка имеющегося контента в приоритете над +добавлением нового. +- Реализовать возможности на уровне **текущей версии Minecraft + OptiFine** (OptiFine +настолько, насколько это поддерживается движком Minetest). +- Добиться производительности для запуска на действительно слабых компьютерах. + +## Готовность +Игра сейчас в **бета** стадии. Она играбельна, но еще не имеет всех возможностей. +Обратная совместимость целиком не гарантируется, обновление вашего мира может повлечь +за собой небольшие ошибки. Если вы хотите использовать разрабатываемую версию +Mineclone2, то ветка master обычно относительно стабильна. + +Следущие возможности уже доступны: + +* Инструменты, оружие, броня +* Система крафта: сетка 2×2, верстак (сетка 3×3) и книга рецептов +* Сундуки, большие сундуки, эндер-сундуки, ящики шалкера +* Печи и воронки +* Система голода +* Большинство монстров и животных +* Все руды из Minecraft +* Большинство блоков из Верхнего мира +* Вода и лава +* Погода +* 28 биомов + 5 биомов в Незере +* Незер, пылающий подземный мир в другом измерении +* Схемы из редстоуна (частично) +* Вагонетки (частично) +* Статусные эффекты (частично) +* Опыт +* Зачарование +* Зельеварение, зелья, смоченные стрелы (частично) +* Лодки +* Огонь +* Строительные блоки: ступени, плиты, двери, люки, заборы, калитки, стены +* Часы +* Компас +* Губки +* Блоки слизи +* Растения и саженцы +* Красители +* Флаги +* Декоративные блоки: стекло, окрашенное стекло, стеклянные панели, железные решетки, цветная керамика, головы и многое другое +* Рамки для предметов +* Прогрыватели +* Кровати +* Меню инвентаря +* Творческий инвентарь +* Фермерство +* Книги с пером +* Команды +* Деревни +* Измерение Края +* И многое другое! + +Следующие возможности еще не завершены: + +* Некоторые монстры и животные +* Предметы связанные с редстоуном +* Некоторые вагонетки (с сундуком и с воронкой уже работают) +* Пара нетривиальных блоков и предметов + +Бонусные воронкой (нет в Minecraft-е): + +* Встроенный гайд для крафта покажет вам рецепты крафта и переплавки +* Внутриигровая справка содержит всестороннюю информацию об основах игры, блоках, предметах и прочее +* Временные рецепты крафта. Они существуют, чтобы получить доступ к ранее недоступным предметам вне творческого режима. Они будут удалены как только разработка позволит им стать доступными +* Саженцы в сундуках мапгена v6 +* Полностью модифицируема (благодаря мощному Lua API в Minetest) +* Новые блоки и предметы: + * Инструмент просмотра покажет справку о том чего коснется + * Больше ступеней и плит + * Калитки и заборы из адских кирпичей +* Замены структур - малые верии структур из Minecraft пока большие структуры не будут сделаны: + * Лесная хижина (Особняк) + * Форт Незера (Крепости) + +Технические отличия от Minecraft: + +* Лимит высоты 31000 блоков (намного больше чем в Minecraft) +* Горизонтальный размер мира 62000×62000 блоков (намного меньше чем в Minecraft, но всё еще очень большой) +* Всё еще не завершен и содержит много багов +* Недостающие блоки, предметы, мобы +* Некоторые предметы с другими названиями, чтобы лучше их различать +* Другая музыка для проигрывателей +* Другие текступы (Pixel Perfection) +* Другие звуки (разные источники) +* Другой движок (Minetest) +* Другие пасхалки + +… и наконец, MineClone2 это свободное программное обеспечение! + +## Другие readme файлы + +* `LICENSE.txt`: текст лицензии GPLv3 +* `CONTRIBUTING.md`: информация для тех кто хочет поучаствовать в разработке +* `API.md`: для моддеров Minetest кто хочет изменить эту игру +* `LEGAL.md`: юридическая информация +* `CREDITS.md`: список участников проекта diff --git a/mods/CORE/mcl_explosions/locale/mcl_explosions.ru.tr b/mods/CORE/mcl_explosions/locale/mcl_explosions.ru.tr new file mode 100644 index 000000000..0ef0dcd5f --- /dev/null +++ b/mods/CORE/mcl_explosions/locale/mcl_explosions.ru.tr @@ -0,0 +1,2 @@ +# textdomain:mcl_explosions +@1 was caught in an explosion.=@1 попал(а) под взрыв. \ No newline at end of file diff --git a/mods/ENTITIES/mcl_boats/locale/mcl_boats.ru.tr b/mods/ENTITIES/mcl_boats/locale/mcl_boats.ru.tr index 5bd6e4c4d..d1e966976 100644 --- a/mods/ENTITIES/mcl_boats/locale/mcl_boats.ru.tr +++ b/mods/ENTITIES/mcl_boats/locale/mcl_boats.ru.tr @@ -1,11 +1,23 @@ # textdomain: mcl_boats -Acacia Boat=Лодка из акации +Acacia Boat=Акациевая лодка Birch Boat=Берёзовая лодка Boat=Лодка -Boats are used to travel on the surface of water.=С помощью лодки можно путешествовать по водной поверхности. +Boats are used to travel on the surface of water.=На лодке можно плыть по водной поверхности. Dark Oak Boat=Лодка из тёмного дуба -Jungle Boat=Лодка из дерева джунглей +Jungle Boat=Лодка из тропического дерева Oak Boat=Дубовая лодка -Rightclick on a water source to place the boat. Rightclick the boat to enter it. Use [Left] and [Right] to steer, [Forwards] to speed up and [Backwards] to slow down or move backwards. Rightclick the boat again to leave it, punch the boat to make it drop as an item.=Правый клик по воде спустит лодку на воду. Правый клик по лодке разместит вас в ней. [Влево] и [Вправо] - рулить, [Вперед] - разгоняться, [Назад] - тормозить или плыть назад. Правый клик по лодке, когда вы в ней, позволит выйти из неё. Удар по лодке превратит её обратно в предмет. +Rightclick on a water source to place the boat. Rightclick the boat to enter it. Use [Left] and [Right] to steer, [Forwards] to speed up and [Backwards] to slow down or move backwards. Use [Sneak] to leave the boat, punch the boat to make it drop as an item.=Правый клик на воде, чтобы установить лодку. Правый клик по лодке, чтобы сесть в нее. [Влево] и [Вправо] - рулить, [Вперед] - разгоняться, [Назад] - тормозить или плыть назад. Нажмите [Красться] для высадки, бейте по лодке, чтобы забрать её. Spruce Boat=Еловая лодка Water vehicle=Водный транспорт +Sneak to dismount=Нажмите [Красться] для высадки +Obsidian Boat=Обсидиановая лодка +Mangrove Boat=Мангровая лодка +Cherry Boat=Вишнёвая лодка +Oak Chest Boat=Дубовая лодка с сундуком +Spruce Chest Boat=Еловая лодка с сундуком +Birch Chest Boat=Берёзовая лодка с сундуком +Jungle Chest Boat=Лодка из тропического дерева с сундуком +Acacia Chest Boat=Акациевая лодка с сундуком +Dark Oak Chest Boat=Лодка из тёмного дуба с сундуком +Mangrove Chest Boat=Мангровая лодка с сундуком +Cherry Chest Boat=Вишнёвая лодка с сундуком \ No newline at end of file diff --git a/mods/ENTITIES/mcl_falling_nodes/locale/mcl_falling_nodes.ru.tr b/mods/ENTITIES/mcl_falling_nodes/locale/mcl_falling_nodes.ru.tr new file mode 100644 index 000000000..6c4081b50 --- /dev/null +++ b/mods/ENTITIES/mcl_falling_nodes/locale/mcl_falling_nodes.ru.tr @@ -0,0 +1,3 @@ +# textdomain: mcl_falling_nodes +@1 was smashed by a falling anvil.=@1 был(а) раздавлен(а) падающей наковальней. +@1 was smashed by a falling block.=@1 был(а) раздавлен(а) падающим блоком. diff --git a/mods/ENTITIES/mcl_minecarts/locale/mcl_minecarts.ru.tr b/mods/ENTITIES/mcl_minecarts/locale/mcl_minecarts.ru.tr index 6189bac84..89760a0c4 100644 --- a/mods/ENTITIES/mcl_minecarts/locale/mcl_minecarts.ru.tr +++ b/mods/ENTITIES/mcl_minecarts/locale/mcl_minecarts.ru.tr @@ -1,36 +1,36 @@ # textdomain: mcl_minecarts Minecart=Вагонетка -Minecarts can be used for a quick transportion on rails.=Вагонетки нужны, чтобы быстро перемещаться по рельсам. -Minecarts only ride on rails and always follow the tracks. At a T-junction with no straight way ahead, they turn left. The speed is affected by the rail type.=Вагонетки едут строго по проложенному железнодорожному пути. На Т-образной развилке они поворачивают налево. Скорость зависит от типа рельсов. -You can place the minecart on rails. Right-click it to enter it. Punch it to get it moving.=Вы ставите вагонетку на рельсы. Правым кликом садитесь в неё. Стукаете, чтобы начать движение. -To obtain the minecart, punch it while holding down the sneak key.=Чтобы взять вагонетку, стукните её, удерживая клавишу [Красться]. -A minecart with TNT is an explosive vehicle that travels on rail.=Вагон тротила это подрывной железнодорожный транспорт. -Place it on rails. Punch it to move it. The TNT is ignited with a flint and steel or when the minecart is on an powered activator rail.=Поместите его на рельсы. Стукните, чтобы он поехал. Тротил воспламеняется, если его поджечь огнивом, либо при попадании на подключенный рельсовый активатор. -To obtain the minecart and TNT, punch them while holding down the sneak key. You can't do this if the TNT was ignited.=Чтобы взять вагон тротила, стукните его, удерживая клавишу [Красться]. Если тротил воспламенён, сделать это нельзя. -A minecart with furnace is a vehicle that travels on rails. It can propel itself with fuel.=Вагон с печью - это железнодорожный транспорт. Он может двигаться за счёт топлива. -Place it on rails. If you give it some coal, the furnace will start burning for a long time and the minecart will be able to move itself. Punch it to get it moving.=Поставьте его на рельсы. Если добавить немного угля, то печь зажжётся на продолжительное время и вагон сможет ехать. Стукните вагон для начала движения. -To obtain the minecart and furnace, punch them while holding down the sneak key.=Чтобы взять вагон с печью, стукните его, удерживая клавишу [Красться]. -Minecart with Chest=Вагон с сундуком -Minecart with Furnace=Вагон с печью -Minecart with Command Block=Вагон с командным блоком -Minecart with Hopper=Вагон с бункером -Minecart with TNT=Вагон тротила -Place them on the ground to build your railway, the rails will automatically connect to each other and will turn into curves, T-junctions, crossings and slopes as needed.=Поместите на землю, чтобы сделать железную дорогу, рельсы автоматически соединятся между собой и будут превращаться в плавный повороты, T-образные развилки, перекрёстки и уклоны там, где это потребуется. +Minecarts can be used for a quick transportion on rails.=Вагонетка может быть использована для быстрого перемещения по рельсам. +Minecarts only ride on rails and always follow the tracks. At a T-junction with no straight way ahead, they turn left. The speed is affected by the rail type.=Вагонетки едут только по проложенным рельсам. На Т-образной развилке они поворачивают налево. Скорость зависит от типа рельсов. +You can place the minecart on rails. Right-click it to enter it. Punch it to get it moving.=Вы можете поставить вагонетку на рельсы. Правым кликом сядьте в неё. Ударьте по ней, чтобы она поехала. +To obtain the minecart, punch it while holding down the sneak key.=Чтобы забрать вагонетку, ударьте по ней, удерживая клавишу [Красться]. +A minecart with TNT is an explosive vehicle that travels on rail.=Вагонетка с ТНТ это взрывающийся железнодорожный транспорт. +Place it on rails. Punch it to move it. The TNT is ignited with a flint and steel or when the minecart is on an powered activator rail.=Поместите вагонетку на рельсы. Ударьте по ней, чтобы она поехала. ТНТ активируется, если его поджечь огнивом или когда вагонетка проедет через подключенные активирующие рельсы. +To obtain the minecart and TNT, punch them while holding down the sneak key. You can't do this if the TNT was ignited.=Чтобы забрать вагонетку с ТНТ, ударьте по ней, удерживая клавишу [Красться]. Если ТНТ подожжён, сделать это нельзя. +A minecart with furnace is a vehicle that travels on rails. It can propel itself with fuel.=Вагонетка с печью это железнодорожный транспорт. Она может ехать сама за счёт топлива. +Place it on rails. If you give it some coal, the furnace will start burning for a long time and the minecart will be able to move itself. Punch it to get it moving.=Поставьте вагонетку на рельсы. Если добавить в неё угля, то печь будет гореть продолжительное время и вагонетка сможет поехать сама. Ударьте по ней, чтобы она поехала. +To obtain the minecart and furnace, punch them while holding down the sneak key.=Чтобы забрать вагонетку с печью, ударьте по ней, удерживая клавишу [Красться]. +Minecart with Chest=Вагонетка с сундуком +Minecart with Furnace=Вагонетка с печью +Minecart with Command Block=Вагонетка с командным блоком +Minecart with Hopper=Вагонетка с воронкой +Minecart with TNT=Вагонетка с ТНТ +Place them on the ground to build your railway, the rails will automatically connect to each other and will turn into curves, T-junctions, crossings and slopes as needed.=Поместите рельсы на землю, чтобы сделать железную дорогу, рельсы автоматически соединятся между собой и будут образовывать повороты, T-образные развилки, перекрёстки и склоны там, где это потребуется. Rail=Рельсы Rails can be used to build transport tracks for minecarts. Normal rails slightly slow down minecarts due to friction.=Рельсы используются для строительства железной дороги. Обычные рельсы немного замедляют движение вагонеток из-за трения. -Powered Rail=Подключаемые рельсы -Rails can be used to build transport tracks for minecarts. Powered rails are able to accelerate and brake minecarts.=Рельсы используются для строительства железной дороги. Подключённые рельсы могут разгонять и тормозить вагонетки. -Without redstone power, the rail will brake minecarts. To make this rail accelerate minecarts, power it with redstone power.=Без энергии редстоуна рельсы будут тормозить вагонетки. -Activator Rail=Рельсовый активатор -Rails can be used to build transport tracks for minecarts. Activator rails are used to activate special minecarts.=Рельсы используются для строительства железной дороги. Рельсовый активатор активирует особые вагонетки. -To make this rail activate minecarts, power it with redstone power and send a minecart over this piece of rail.=Чтобы этот блок рельсов активировал вагонетку, подключите его к энергии редстоуна и направьте вагонетку через него. -Detector Rail=Рельсовый детектор -Rails can be used to build transport tracks for minecarts. A detector rail is able to detect a minecart above it and powers redstone mechanisms.=Рельсы используются для строительства железной дороги. Рельсовый детектор может обнаруживать вагонетку у себя наверху и подключать механизмы редстоуна. -To detect a minecart and provide redstone power, connect it to redstone trails or redstone mechanisms and send any minecart over the rail.=Чтобы обнаруживать вагонетку и подавать энергию редстоуна, подключите его к дорожке редстоуна или механизму редстоуна, после чего направьте любую вагонетку через него. +Powered Rail=Энергорельсы +Rails can be used to build transport tracks for minecarts. Powered rails are able to accelerate and brake minecarts.=Энергорельсы используются для строительства железной дороги. Энергорельсы могут ускорять и тормозить вагонетки. +Without redstone power, the rail will brake minecarts. To make this rail accelerate minecarts, power it with redstone power.=Неподключенные энергорельсы замедляют вагонетки. Чтобы энергорельсы ускоряли вагонетки, проведите к ним сигнал редстоуна. +Activator Rail=Активирующие рельсы +Rails can be used to build transport tracks for minecarts. Activator rails are used to activate special minecarts.=Активирующие рельсы используются для строительства железной дороги. Активирующие рельсы активируют некоторые особые вагонетки. +To make this rail activate minecarts, power it with redstone power and send a minecart over this piece of rail.=Чтобы эти рельсы активировали вагонетки, подключите активирующие рельсы к сигналу редстоуна и направьте вагонетку через них. +Detector Rail=Нажимные рельсы +Rails can be used to build transport tracks for minecarts. A detector rail is able to detect a minecart above it and powers redstone mechanisms.=Нажимные рельсы используются для строительства железной дороги. Нажимные рельсы реагируют на проезжающие по ним вагонетки и выдают сигнал для механизмов из редстоуна. +To detect a minecart and provide redstone power, connect it to redstone trails or redstone mechanisms and send any minecart over the rail.=Подсоедините к нажимным рельсам редстоун или редстоуновые механизмы, чтобы активировать их когда по рельсам проезжает вагонетка. Track for minecarts=Железная дорога -Speed up when powered, slow down when not powered=Разгоняет, если подключён, тормозит, если не подключён -Activates minecarts when powered=Активирует особые вагонетки, если подключён -Emits redstone power when a minecart is detected=Испускает энергию редстоуна при обнаружении вагонетки -Vehicle for fast travel on rails=Быстрый железнодорожный транспорт -Can be ignited by tools or powered activator rail=Можно воспламенить с помощью инструмента или подключенного рельсового активатора +Speed up when powered, slow down when not powered=Если подключены - ускоряют, если нет - тормозят +Activates minecarts when powered=Активирует особые вагонетки, если подключены +Emits redstone power when a minecart is detected=Подает сигнал редстоуна при обнаружении вагонетки +Vehicle for fast travel on rails=Железнодорожный транспорт +Can be ignited by tools or powered activator rail=Можно поджечь инструментом или активирующими рельсами Sneak to dismount=Нажмите [Красться] для высадки diff --git a/mods/ENTITIES/mcl_mobs/locale/mcl_mobs.ru.tr b/mods/ENTITIES/mcl_mobs/locale/mcl_mobs.ru.tr index 477d3d642..0491672f1 100644 --- a/mods/ENTITIES/mcl_mobs/locale/mcl_mobs.ru.tr +++ b/mods/ENTITIES/mcl_mobs/locale/mcl_mobs.ru.tr @@ -1,11 +1,13 @@ # textdomain: mcl_mobs -Peaceful mode active! No monsters will spawn.=Мирный режим включён! Чудовища не будут появляться. -This allows you to place a single mob.=Позволяет вам породить одно существо. -Just place it where you want the mob to appear. Animals will spawn tamed, unless you hold down the sneak key while placing. If you place this on a mob spawner, you change the mob it spawns.=Просто нажмите на блок, где хотите, чтобы появилось существо. Животные будут появляться уже прирученные, если это не нужно, удерживайте клавишу [Красться] при размещении. Если использовать на порождателе, тогда существо будет изменено. -You need the “maphack” privilege to change the mob spawner.=Вам нужно обладать привилегией «maphack», чтобы изменить порождатель существ. -Name Tag=Именная бирка -A name tag is an item to name a mob.=Именная бирка — это предмет, чтобы дать существу имя. -Before you use the name tag, you need to set a name at an anvil. Then you can use the name tag to name a mob. This uses up the name tag.=Прежде чем использовать именную бирку, нужно задать имя на наковальне. Тогда вы сможете использовать бирку, чтобы дать имя мобу. -Only peaceful mobs allowed!=Разрешены только мирные существа! -Give names to mobs=Даёт имена существам -Set name at anvil=Задайте имя при помощи наковальни +Peaceful mode active! No monsters will spawn.=Мирный режим включён! Монстры не будут спавниться. +This allows you to place a single mob.=Позволяет вам создать одного моба. +Just place it where you want the mob to appear. Animals will spawn tamed, unless you hold down the sneak key while placing. If you place this on a mob spawner, you change the mob it spawns.=Используйте предмет там, где вы хотите, чтобы появился моб. Животные будут появляться уже прирученные, если только вы не удерживаете клавишу [Красться] при размещении. Если использовать на спаунере мобов, изменится создаваемый им моб. +You need the “maphack” privilege to change the mob spawner.=Вам нужна привилегия “maphack”, чтобы изменить спаунер мобов. +Name Tag=Бирка +A name tag is an item to name a mob.=Бирка это предмет, дающий мобу имя. +Before you use the name tag, you need to set a name at an anvil. Then you can use the name tag to name a mob. This uses up the name tag.=Прежде чем использовать бирку, нужно задать ей имя на наковальне. Тогда вы сможете использовать бирку, чтобы дать имя мобу. +Only peaceful mobs allowed!=Разрешены только мирные мобы! +Give names to mobs=Даёт имена мобам +Set name at anvil=Переименуйте на наковальне +Removes specified mobs except nametagged and tamed ones. For the second parameter, use nametagged/tamed to select only nametagged/tamed mobs, or a range to specify a maximum distance from the player.=Удаляет указанных мобов кроме именованных и прирученных. Для второго параметра используйте nametagged/tamed, чтобы выбрать именованных/прирученных мобов или радиус указывающий максимальную дистанцию от игрока. +Default usage. Clearing hostile mobs. For more options please type: /help clearmobs=Параметры по умолчанию. Удаляем враждебных мобов. Для больших опций введите: /help clearmobs diff --git a/mods/ENTITIES/mcl_paintings/locale/mcl_paintings.ru.tr b/mods/ENTITIES/mcl_paintings/locale/mcl_paintings.ru.tr index cc2f52778..3cd8ebca7 100644 --- a/mods/ENTITIES/mcl_paintings/locale/mcl_paintings.ru.tr +++ b/mods/ENTITIES/mcl_paintings/locale/mcl_paintings.ru.tr @@ -1,2 +1,2 @@ # textdomain:mcl_paintings -Painting=Рисование +Painting=Картина diff --git a/mods/ENTITIES/mobs_mc/locale/mobs_mc.ru.tr b/mods/ENTITIES/mobs_mc/locale/mobs_mc.ru.tr index 62fe69a97..3a1af1dde 100644 --- a/mods/ENTITIES/mobs_mc/locale/mobs_mc.ru.tr +++ b/mods/ENTITIES/mobs_mc/locale/mobs_mc.ru.tr @@ -1,25 +1,27 @@ # textdomain: mobs_mc Agent=Агент +Axolotl=Аксолотль Bat=Летучая мышь Blaze=Ифрит Chicken=Курица Cow=Корова -Mooshroom=Гриб +Mooshroom=Грибная корова Creeper=Крипер -Ender Dragon=Дракон Предела +Ender Dragon=Дракон Края Enderman=Эндермен Endermite=Эндермит Ghast=Гаст Elder Guardian=Древний страж Guardian=Страж Horse=Лошадь -Skeleton Horse=Скелет лошади -Zombie Horse=Зомби-лошадь +Skeleton Horse=Лошадь-скелет +Zombie Horse=Лошадь-зомби Donkey=Ослик Mule=Мул Iron Golem=Железный голем Llama=Лама Ocelot=Оцелот +Cat=Кошка Parrot=Попугай Pig=Свинья Polar Bear=Полярный медведь @@ -32,13 +34,13 @@ Skeleton=Скелет Stray=Странник Wither Skeleton=Скелет-иссушитель Magma Cube=Лавовый куб -Slime=Слизняк +Slime=Слизень Snow Golem=Снежный голем Spider=Паук Cave Spider=Пещерный паук -Squid=Кальмар +Squid=Спрут Vex=Досаждатель -Evoker=Маг +Evoker=Вызыватель Illusioner=Иллюзор Villager=Житель Vindicator=Поборник @@ -47,8 +49,15 @@ Witch=Ведьма Wither=Иссушитель Wolf=Волк Husk=Кадавр +Baby Husk=Кадавр-ребёнок Zombie=Зомби -Zombie Pigman=Зомби-свиночеловек +Baby Zombie=Зомби-ребёнок +Piglin=Пиглин +Baby Piglin=Пиглин-ребёнок +Zombie Piglin=Зомби-пиглин +Baby Zombie Piglin=Зомби-пиглин-ребёнок +Sword Piglin=Пиглин-мечник +Piglin Brute=Жестокий пиглин Farmer=Фермер Fisherman=Рыбак Fletcher=Лучник @@ -62,3 +71,13 @@ Weapon Smith=Оружейник Tool Smith=Инструментальщик Cleric=Церковник Nitwit=Нищий +Cod=Треска +Salmon=Лосось +Dolphin=Дельфин +Pillager=Разбойник +Tropical fish=Тропическая рыба +Hoglin=Хоглин +Baby hoglin=Детёныш хоглина +Zoglin=Зоглин +Strider=Страйдер +Glow Squid=Светящийся спрут diff --git a/mods/ENTITIES/mobs_mc/locale/template.txt b/mods/ENTITIES/mobs_mc/locale/template.txt index 589a1a3c4..b783681ee 100644 --- a/mods/ENTITIES/mobs_mc/locale/template.txt +++ b/mods/ENTITIES/mobs_mc/locale/template.txt @@ -21,6 +21,7 @@ Mule= Iron Golem= Llama= Ocelot= +Cat= Parrot= Pig= Polar Bear= @@ -48,7 +49,9 @@ Witch= Wither= Wolf= Husk= +Baby Husk= Zombie= +Baby Zombie= Piglin= Baby Piglin= Zombie Piglin= @@ -74,5 +77,7 @@ Dolphin= Pillager= Tropical fish= Hoglin= +Baby hoglin= +Zoglin= Strider= -Glow Squid= \ No newline at end of file +Glow Squid= diff --git a/mods/ENVIRONMENT/lightning/locale/lightning.ru.tr b/mods/ENVIRONMENT/lightning/locale/lightning.ru.tr index 68bcf3555..7b535ac81 100644 --- a/mods/ENVIRONMENT/lightning/locale/lightning.ru.tr +++ b/mods/ENVIRONMENT/lightning/locale/lightning.ru.tr @@ -1,4 +1,3 @@ # textdomain: lightning -@1 was struck by lightning.=@1 убило молнией. -Let lightning strike at the specified position or yourself=Позволяет молнии бить в заданную позицию или в вас +Let lightning strike at the specified position or player. No parameter will strike yourself.=Бьёт молнией в заданную позицию или в игрока. Без указанного параметра ударит по вам. No position specified and unknown player=Позиция не задана и игрок неизвестен diff --git a/mods/ENVIRONMENT/mcl_raids/locale/mcl_raids.ru.tr b/mods/ENVIRONMENT/mcl_raids/locale/mcl_raids.ru.tr new file mode 100644 index 000000000..64ea21aba --- /dev/null +++ b/mods/ENVIRONMENT/mcl_raids/locale/mcl_raids.ru.tr @@ -0,0 +1,2 @@ +# textdomain: mcl_raids +Ominous Banner=Зловещий флаг diff --git a/mods/ENVIRONMENT/mcl_raids/locale/template.txt b/mods/ENVIRONMENT/mcl_raids/locale/template.txt new file mode 100644 index 000000000..afab805d3 --- /dev/null +++ b/mods/ENVIRONMENT/mcl_raids/locale/template.txt @@ -0,0 +1,2 @@ +# textdomain: mcl_raids +Ominous Banner= diff --git a/mods/ENVIRONMENT/mcl_weather/locale/mcl_weather.ru.tr b/mods/ENVIRONMENT/mcl_weather/locale/mcl_weather.ru.tr index 0c3773b7a..00a9e778e 100644 --- a/mods/ENVIRONMENT/mcl_weather/locale/mcl_weather.ru.tr +++ b/mods/ENVIRONMENT/mcl_weather/locale/mcl_weather.ru.tr @@ -6,4 +6,3 @@ Error: Invalid parameters.=Ошибка: Недопустимые парамет Error: Duration can't be less than 1 second.=Ошибка: длительность не может быть менее 1 секунды. Error: Invalid weather specified. Use “clear”, “rain”, “snow” or “thunder”.=Ошибка: Указана неправильная погода. Возможны варианты: “clear” (ясная), “rain” (дождь), “snow” (снег) или “thunder” (гроза). Toggles between clear weather and weather with downfall (randomly rain, thunderstorm or snow)=Переключает между ясной погодой и осадками (случайно выбирается дождь, грозовой шторм или снег) - diff --git a/mods/HELP/doc/doc/locale/doc.ru.tr b/mods/HELP/doc/doc/locale/doc.ru.tr index 105f92b11..74ab5839f 100644 --- a/mods/HELP/doc/doc/locale/doc.ru.tr +++ b/mods/HELP/doc/doc/locale/doc.ru.tr @@ -27,7 +27,7 @@ New help entry unlocked: @1 > @2=Новая подсказка разблоки No categories have been registered, but they are required to provide help.=Для предоставления помощи требуются зарегистрированные категории, но они отсутствуют. The Documentation System [doc] does not come with help contents on its own, it needs additional mods to add help content. Please make sure such mods are enabled on for this world, and try again.=Система документации [doc] не предоставляет помощи сама по себе, нужны дополнительные моды для добавления справочной информации. Пожалуйста, убедитесь, что моды включены для этого мира, после чего попробуйте снова. Number of entries: @1=Количество записей: @1 -OK=О'кей +OK=ОК Open a window providing help entries about Minetest and more=Открыть окно с подсказками о игре Minetest и т. п. Please select a category you wish to learn more about:=Пожалуйста, выберите категорию, о которой хотите узнать больше: Recommended mods: doc_basics, doc_items, doc_identifier, doc_encyclopedia.=Рекомендованные моды: doc_basics, doc_items, doc_identifier, doc_encyclopedia. diff --git a/mods/HELP/doc/doc_identifier/locale/doc_identifier.ru.tr b/mods/HELP/doc/doc_identifier/locale/doc_identifier.ru.tr index 1080a3186..3fb9bb99f 100644 --- a/mods/HELP/doc/doc_identifier/locale/doc_identifier.ru.tr +++ b/mods/HELP/doc/doc_identifier/locale/doc_identifier.ru.tr @@ -1,7 +1,7 @@ # textdomain:doc_identifier Error: This node, item or object is undefined. This is always an error.=Ошибка: Данный узел, предмет или объект не определён. Это всегда вызывает ошибку. This can happen for the following reasons:=Это может произойти по одной из причин: -• The mod which is required for it is not enabled=• Не включён мод, требуемый для этого +• The mod which is required for it is not enabled=• Не включён требуемый мод • The author of the game or a mod has made a mistake=• Автор игры или мода допустил ошибку It appears to originate from the mod “@1”, which is enabled.=Это, вероятно, случилось в моде “@1”, который включён. It appears to originate from the mod “@1”, which is not enabled!=Это, вероятно, случилось в моде “@1”, который не включён! @@ -10,8 +10,8 @@ Lookup Tool=Инструмент просмотра No help entry for this block could be found.=Не удаётся найти справочной записи для этого блока. No help entry for this item could be found.=Не удаётся найти справочной записи для этого предмета. No help entry for this object could be found.=Не удаётся найти справочной записи для этого объекта. -OK=О'кей -Punch any block, item or other thing about you wish to learn more about. This will open up the appropriate help entry. The tool comes in two modes which are changed by using. In liquid mode, this tool points to liquids as well while in solid mode this is not the case.=Стукните любой блок, предмет или другую вещь, про которую хотите узнать больше. Откроется соответствующая справочная запись. Инструмент работает в двух режимах, меняющихся при использовании. В жидком режиме инструмент указывает на жидкости, в твёрдом режиме нет. +OK=ОК +Punch any block, item or other thing about you wish to learn more about. This will open up the appropriate help entry. The tool comes in two modes which are changed by using. In liquid mode, this tool points to liquids as well while in solid mode this is not the case.=Ударьте по любому блоку, предмету и прочим вещам, про который вы хотите узнать больше. Откроется соответствующая справочная запись. Инструмент работает в двух режимах, меняющихся при использовании. В жидком режиме инструмент указывает на жидкости, в твёрдом режиме нет. This block cannot be identified because the world has not materialized at this point yet. Try again in a few seconds.=Этот блок не может быть идентифицирован, потому что мир не ещё материализовался в этой точке. This is a player.=Это игрок. This useful little helper can be used to quickly learn more about about one's closer environment. It identifies and analyzes blocks, items and other things and it shows extensive information about the thing on which it is used.=Этот маленький помощник выдаст вам быструю справку о чём-то из ближайшего окружения. Он идентифицирует и анализирует блоки, предметы и другие вещи и показывает подробную информацию о вещах, к которым они применимы. diff --git a/mods/HELP/doc/doc_items/locale/doc_items.ru.tr b/mods/HELP/doc/doc_items/locale/doc_items.ru.tr index 08d038592..28fa9f479 100644 --- a/mods/HELP/doc/doc_items/locale/doc_items.ru.tr +++ b/mods/HELP/doc/doc_items/locale/doc_items.ru.tr @@ -1,8 +1,8 @@ # textdomain:doc_items -Using it as fuel turns it into: @1.=Использование в качестве топлива превращает его в: @1. +Using it as fuel turns it into: @1.=Использование в качестве топлива превращает это в: @1. @1 seconds=@1 секунд(ы) # Item count times item name -%@1×@2=%@1×@2 +@1×@2=@1×@2 # Itemname (25%) @1 (@2%)=@1 (@2%) # Itemname (<0.5%) @@ -14,111 +14,111 @@ Using it as fuel turns it into: @1.=Использование в качеств # Final list separator (e.g. “One, two and three”) and = и 1 second=1 секунда -A transparent block, basically empty space. It is usually left behind after digging something.=Один прозрачный блок, основное пустое пространство. Обычно оно остаётся, если выкопать что-то. +A transparent block, basically empty space. It is usually left behind after digging something.=Прозрачный блок, проще говоря, пустое пространство. Обычно оно остаётся, если выкопать что-то. Air=Воздух Blocks=Блоки Building another block at this block will place it inside and replace it.=Возведение другого блока на этом блоке поместит его внутрь и заменит. -Building this block is completely silent.=Строительство этого блока абсолютно бесшумное. +Building this block is completely silent.=Строительство этого блока не издает звука. Collidable: @1=Непроходимый: @1 Description: @1=Описание: @1 Falling blocks can go through this block; they destroy it when doing so.=Падающие блоки могут пройти сквозь этот блок; при этом они уничтожат его. Full punch interval: @1 s=Интервал полного удара: @1 с Hand=Рука -Hold it in your hand, then leftclick to eat it.=Возьмите это в руку и кликните левой, чтобы съесть. -Hold it in your hand, then leftclick to eat it. But why would you want to do this?=Возьмите это в руку и кликните левой, чтобы съесть. Но вам правда этого хочется? +Hold it in your hand, then leftclick to eat it.=Возьмите это в руку и кликните левой кнопкой мыши, чтобы съесть. +Hold it in your hand, then leftclick to eat it. But why would you want to do this?=Возьмите это в руку и кликните левой кнопкой мыши, чтобы съесть. Но зачем вы хотите это сделать? Item reference of all wieldable tools and weapons=Справка по всем носимым инструментам и оружию Item reference of blocks and other things which are capable of occupying space=Справка по всем блокам и другим вещам, способным занимать место -Item reference of items which are neither blocks, tools or weapons (esp. crafting items)=Справка по остальным предметам (не блокам, не инструментам и не оружию) +Item reference of items which are neither blocks, tools or weapons (esp. crafting items)=Справка по остальным предметам - не блокам, не инструментам и не оружию (так называемые материалы для крафта) Liquids can flow into this block and destroy it.=Жидкости могут затекать в этот блок, уничтожая его. -Maximum stack size: @1=Максимальный размер стека: @1 -Mining level: @1=Уровень добываемости: @1 -Mining ratings:=Рейтинг добываемости: +Maximum stack size: @1=Максимальный размер стака: @1 +Mining level: @1=Уровень добывания: @1 +Mining ratings:=Рейтинг добывания: • @1, rating @2: @3 s - @4 s=• @1, рейтинг @2: @3 с - @4 с • @1, rating @2: @3 s=• @1, рейтинг @2: @3 с -Mining times:=Время добывания: -Mining this block is completely silent.=Добывание этого блока происходит абсолютно бесшумно. +Mining times:=Добыто раз: +Mining this block is completely silent.=Добывание этого блока не издает звука. Miscellaneous items=Дополнительные предметы No=Нет -Pointable: No=Ориентируемый: Нет -Pointable: Only by special items=Ориентируемый: Только специальными предметами -Pointable: Yes=Ориентируемый: Да -Punches with this block don't work as usual; melee combat and mining are either not possible or work differently.=Удар этого блока не работает так, как это обычно бывает; рукопашный бой и майнинг либо невозможны, либо работают по-другому. -Punches with this item don't work as usual; melee combat and mining are either not possible or work differently.=Удар этого предмета не работает так, как это обычно бывает; рукопашный бой и майнинг либо невозможны, либо работают по-другому. -Punches with this tool don't work as usual; melee combat and mining are either not possible or work differently.=Удар этого инструмента не работает так, как это обычно бывает; рукопашный бой и майнинг либо невозможны, либо работают по-другому. +Pointable: No=Поворачиваемый: Нет +Pointable: Only by special items=Поворачиваемый: Только специальными предметами +Pointable: Yes=Поворачиваемый: Да +Punches with this block don't work as usual; melee combat and mining are either not possible or work differently.=Удар этим блоком работает не так, как обычно; ближний бой и копание либо невозможны, либо работают по-другому. +Punches with this item don't work as usual; melee combat and mining are either not possible or work differently.=Удар этим предметом работает не так, как обычно; ближний бой и копание либо невозможны, либо работают по-другому. +Punches with this tool don't work as usual; melee combat and mining are either not possible or work differently.=Удар этим инструментом работает не так, как обычно; ближний бой и копание либо невозможны, либо работают по-другому. Range: @1=Дальность: @1 # Range: () Range: @1 (@2)=Дальность: @1 (@2) Range: 4=Дальность: 4 # Rating used for digging times -Rating @1=Скорость копания @1 +Rating @1=Скорость добывания @1 # @1 is minimal rating, @2 is maximum rating -Rating @1-@2=Скорость копания @1-@2= -The fall damage on this block is increased by @1%.=Повреждение при падении на этот блок увеличивается на @1%. -The fall damage on this block is reduced by @1%.=Повреждение при падении на этот блок уменьшается на @1%. +Rating @1-@2=Скорость добывания @1-@2= +The fall damage on this block is increased by @1%.=При падении на этот блок получаемый урон увеличивается на @1%. +The fall damage on this block is reduced by @1%.=При падении на этот блок получаемый урон уменьшается на @1%. This block allows light to propagate with a small loss of brightness, and sunlight can even go through losslessly.=Этот блок позволяет свету распространяться с небольшой потерей яркости, а солнечный свет может проходить без потерь. This block allows light to propagate with a small loss of brightness.=Этот блок позволяет свету распространяться с небольшой потерей яркости. This block allows sunlight to propagate without loss in brightness.=Этот блок позволяет солнечному свету распространяться без потери яркости. This block belongs to the @1 group.=Этот блок принадлежит группе @1. This block belongs to these groups: @1.=Этот блок принадлежит группам: @1. -This block can be climbed.=На этот блок можно залезть. +This block can be climbed.=По этому блоку можно карабкаться. This block can be destroyed by any mining tool immediately.=Этот блок можно мгновенно уничтожить любым добывающим инструментом. This block can be destroyed by any mining tool in half a second.=Этот блок можно уничтожить любым добывающим инструментом за полсекунды. This block can be mined by any mining tool immediately.=Этот блок можно мгновенно добыть любым добывающим инструментом. This block can be mined by any mining tool in half a second.=Этот блок можно добыть любым добывающим инструментом за полсекунды. -This block can be mined by mining tools which match any of the following mining ratings and its toughness level.=Этот блок можно добыть любым инструментами добычи, соответствующим одному из следующих рейтингов и уровней жёсткости. -This block can not be destroyed by ordinary mining tools.=Этот блок нельзя уничтожить обычным инструментом добычи. -This block can not be mined by ordinary mining tools.=Этот блок нельзя добыть обычным инструментом добычи. -This block can serve as a smelting fuel with a burning time of @1.=Этот блок может служить плавящимся топливом с временем горения @1. -This block causes a damage of @1 hit point per second.=Этот блок вызывает повреждение на @1 HP в секунду. -This block causes a damage of @1 hit points per second.=Этот блок вызывает повреждения на @1 HP в секунду. +This block can be mined by mining tools which match any of the following mining ratings and its toughness level.=Этот блок можно добыть любым добывающим инструментом, соответствующим одному из следующих рейтингов и его уровню твёрдости. +This block can not be destroyed by ordinary mining tools.=Этот блок нельзя уничтожить добывающим инструментом. +This block can not be mined by ordinary mining tools.=Этот блок нельзя добыть обычным добывающим инструментом. +This block can serve as a smelting fuel with a burning time of @1.=Этот блок можно использовать как топливо со временем горения @1. +This block causes a damage of @1 hit point per second.=Этот блок наносит урон в @1 единицу здоровья в секунду. +This block causes a damage of @1 hit points per second.=Этот блок наносит урон в @1 единиц здоровья в секунду. This block connects to blocks of the @1 group.=Этот блок соединяется с блоками группы @1. This block connects to blocks of the following groups: @1.=Этот блок соединяется с блоками групп: @1. This block connects to these blocks: @1.=Этот блок соединяется со следующими блоками: @1. This block connects to this block: @1.=Этот блок соединяется с этим блоком: @1. -This block decreases your breath and causes a drowning damage of @1 hit point every 2 seconds.=Этот блок уменьшает ваш кислород и вызывает повреждение от погружения на @1 HP каждые 2 секунды. -This block decreases your breath and causes a drowning damage of @1 hit points every 2 seconds.=Этот блок уменьшает ваш кислород и вызывает повреждения от погружения на @1 HP каждые 2 секунды. +This block decreases your breath and causes a drowning damage of @1 hit point every 2 seconds.=Этот блок уменьшает ваш запас кислорода и наносит урон от утопления в @1 единицу здоровья каждые 2 секунды. +This block decreases your breath and causes a drowning damage of @1 hit points every 2 seconds.=Этот блок уменьшает ваш запас кислорода и наносит урон от утопления в @1 единиц здоровья каждые 2 секунды. This block is a light source with a light level of @1.=Этот блок является источником света уровня @1. This block glows faintly with a light level of @1.=Этот блок мерцает с уровнем света: @1. -This block is a building block for creating various buildings.=Это строительный блок для создания разных конструкций и зданий. -This block is a liquid with these properties:=Это жидкий блок с такими свойствами: +This block is a building block for creating various buildings.=Это строительный блок для создания разных конструкций. +This block is a liquid with these properties:=Это жидкий блок со следующими свойствами: This block is affected by gravity and can fall.=На этот блок действует гравитация, он может падать. -This block is completely silent when mined or built.=Этот блок абсолютно бесшумно добывается и устанавливается при строительстве. -This block is completely silent when walked on, mined or built.=Этот блок абсолютно тихий, он не шумит, если вы идёте по нему, добываете его или строите что-либо из него. +This block is completely silent when mined or built.=Этот блок не издает звуков когда добывается и устанавливается при строительстве. +This block is completely silent when walked on, mined or built.=Этот блок не издает звуков когда вы идёте по нему, добываете его или строите из него. This block is destroyed when a falling block ends up inside it.=Этот блок уничтожается, когда падающий блок попадает в него. This block negates all fall damage.=Этот блок отменяет весь урон от падения. This block points to liquids.=Этот блок указывает на жидкости. This block will drop as an item when a falling block ends up inside it.=Этот блок выпадет как предмет, когда падающий блок попадёт в него. This block will drop as an item when it is not attached to a surrounding block.=Этот блок выпадет как предмет, если он не прикреплён к окружающим блокам. This block will drop as an item when no collidable block is below it.=Этот блок выпадет как предмет, если нет непроходимого блока прямо под ним. -This block will drop the following items when mined: @1.=Этот блок будет выдавать следующие предметы при его добыче: @1. -This block will drop the following when mined: @1×@2.=Этот блок будет выдавать при его добыче: @1×@2. -This block will drop the following when mined: @1.=Этот блок будет выдавать при его добыче: @1. -This block will drop the following when mined: @1.=Этот блок будет выдавать при его добыче: @1. +This block will drop the following items when mined: @1.=При добыче из этого блока выпадут следующие предметы: @1. +This block will drop the following when mined: @1×@2.=При добыче из этого блока выпадет следующее: @1×@2. +This block will drop the following when mined: @1.=При добыче из этого блока выпадет следующее: @1. +This block will drop the following when mined: @1.=При добыче из этого блока выпадет следующее: @1. This block will make you bounce off with an elasticity of @1%.=Этот блок заставит вас отскакивать с упругостью @1%. -This block will randomly drop one of the following when mined: @1.=При добыче этот блок случайным образом выдаёт что-то из списка: @1. -This block will randomly drop up to @1 drops of the following possible drops when mined: @2.=Этот блок случайным образом выдаст до @1 из следующих возможных выдач при добыче: @2. -This block won't drop anything when mined.=Этот блок ничего не выдаст при его добыче. +This block will randomly drop one of the following when mined: @1.=При добыче из этого блока случайным образом выпадает что-то одно из списка: @1. +This block will randomly drop up to @1 drops of the following possible drops when mined: @2.=При добыче из этого блока случайным образом выпадает до @1 из следующих возможных выдач: @2. +This block won't drop anything when mined.=При добыче из этого блока не выпадет ничего. This is a decorational block.=Это декоративный блок. This is a melee weapon which deals damage by punching.=Это орудие ближнего боя, наносящее урон при ударе. Maximum damage per hit:=Максимальный урон за один удар: This item belongs to the @1 group.=Этот предмет относится к группе @1. This item belongs to these groups: @1.=Этот предмет относится к группам: @1. -This item can serve as a smelting fuel with a burning time of @1.=Этот предмет может служить плавящимся топливом с временем горения @1. -This item is primarily used for crafting other items.=Этот предмет в основном используется для создания других предметов. +This item can serve as a smelting fuel with a burning time of @1.=Этот предмет можно использовать как топливо со временем горения @1. +This item is primarily used for crafting other items.=Этот предмет в основном используется для крафта других предметов. This item points to liquids.=Этот предмет указывает на жидкости. This tool belongs to the @1 group.=Этот инструмент относится к группе @1. This tool belongs to these groups: @1.=Этот инструмент относится к группам: @1. -This tool can serve as a smelting fuel with a burning time of @1.=Этот инструмент может служить плавящимся топливом с временем горения @1. +This tool can serve as a smelting fuel with a burning time of @1.=Этот инструмент можно использовать как топливо со временем горения @1. This tool is capable of mining.=Этот инструмент используется для добычи. -Maximum toughness levels:=Максимальный уровень жёсткости: +Maximum toughness levels:=Максимальный уровень твёрдости: This tool points to liquids.=Этот инструмент указывает на жидкости. Tools and weapons=Инструменты и оружие -Unknown Node=Неизвестный узел -Usage help: @1=Использование помощи: @1 -Walking on this block is completely silent.=Хождение по этому блоку абсолютно бесшумное. +Unknown Node=Неизвестный блок +Usage help: @1=Помощь по использованию: @1 +Walking on this block is completely silent.=Хождение по этому блоку не издает звуков. Whenever you are not wielding any item, you use the hand which acts as a tool with its own capabilities. When you are wielding an item which is not a mining tool or a weapon it will behave as if it would be the hand.=Даже если вы не держите никакого предмета, ваша рука - сама по себе инструмент, обладающий определёнными свойствами. Когда в вашей руке предмет, не являющийся инструментом добычи или оружием, он будет иметь свойства вашей пустой руки. Yes=Да -You can not jump while standing on this block.=Вы не можете прыгать, стоя на этом блоке. +You can not jump while standing on this block.=Вы не можете прыгать, пока стоите на этом блоке. any level=любой уровень level 0=уровень 0 level 0-@1=уровень 0-@1 @@ -129,15 +129,15 @@ Unknown item (@1)=Неизвестный предмет (@1) • @1: @2, @3=• @1: @2, @3 • Flowing range: @1=• Дальность потока: @1 • No flowing=• Не текучее -• Not renewable=• Необновляемое -• Renewable=• Обновляемое +• Not renewable=• Невозобновляемое +• Renewable=• Возобновляемое • Viscosity: @1=• Вязкость: @1 -Itemstring: "@1"=Айтемстринг: "@1" -Durability: @1 uses=Долговечность: @1 раз(а) -Durability: @1=Долговечность: @1 -Mining durability:=Долговечность при майнинге: +Itemstring: "@1"=Техническое название: "@1" +Durability: @1 uses=Прочность: @1 использований +Durability: @1=Прочность: @1 +Mining durability:=Прочность при добыче: • @1, level @2: @3 uses=• @1, уровень @2: @3 раз(а) • @1, level @2: Unlimited=• @1, уровень @2: Неограниченно -This block's rotation is affected by the way you place it: Place it on the floor or ceiling for a vertical orientation; place it at the side for a horizontal orientation. Sneaking while placing it leads to a perpendicular orientation instead.=Вращение этого блока зависит от способа размещения: положите его на пол или потолок для вертикальной ориентации; поместите на стену для горизонтальной ориентации. Удерживайте [Красться] при размещении для перпендикулярной ориентации. -Toughness level: @1=Уровень жёсткости: @1 +This block's rotation is affected by the way you place it: Place it on the floor or ceiling for a vertical orientation; place it at the side for a horizontal orientation. Sneaking while placing it leads to a perpendicular orientation instead.=Поворот этого блока зависит от того как вы его ставите: поставьте его на пол или потолок для вертикальной ориентации; поместите на стену для горизонтальной ориентации. Удерживайте [Красться] при размещении для перпендикулярной ориентации. +Toughness level: @1=Уровень твёрдости: @1 This block is slippery.=Этот блок скользкий. diff --git a/mods/HELP/mcl_craftguide/locale/mcl_craftguide.ru.tr b/mods/HELP/mcl_craftguide/locale/mcl_craftguide.ru.tr index ae2f28a9c..58f7cf5a9 100644 --- a/mods/HELP/mcl_craftguide/locale/mcl_craftguide.ru.tr +++ b/mods/HELP/mcl_craftguide/locale/mcl_craftguide.ru.tr @@ -2,29 +2,29 @@ Any shulker box=Любой ящик шалкера Any wool=Любая шерсть Any wood planks=Любые доски -Any wood=Любое дерево +Any wood=Любая древесина Any sand=Любой песок Any normal sandstone=Любой обычный песчаник Any red sandstone=Любой красный песчаник -Any carpet=Любое покрытие +Any carpet=Любой ковёр Any dye=Любой краситель Any water bucket=Любое ведро воды Any flower=Любой цветок Any mushroom=Любой гриб Any wooden slab=Любая деревянная плита -Any wooden stairs=Любые деревянные ступеньки +Any wooden stairs=Любые деревянные ступени Any coal=Любой уголь Any kind of quartz block=Любой кварцевый блок -Any kind of purpur block=Любой фиолетовый блок -Any stone bricks=Любые каменные блоки +Any kind of purpur block=Любой пурпурный блок +Any stone bricks=Любые каменные кирпичи Any stick=Любая палка -Any item belonging to the @1 group=Любой предмет, относящийся к группе @1 -Any item belonging to the groups: @1=Любой предмет, относящийся к группам: @1 +Any item belonging to the @1 group=Любой предмет из группы @1 +Any item belonging to the groups: @1=Любой предмет из группам: @1 Search=Поиск Reset=Сброс Previous page=Предыдущая страница Next page=Следующая страница -Usage @1 of @2=Использование @1 из @2 +Usage @1 of @2=Использование @1 из @2 Recipe @1 of @2=Рецепт @1 из @2 Burning time: @1=Время горения: @1 Cooking time: @1=Время приготовления: @1 @@ -33,5 +33,5 @@ Shapeless=Бесформенный Cooking=Приготовление Increase window size=Увеличить окно Decrease window size=Уменьшить окно -No item to show=Нет элемента для показа -Collect items to reveal more recipes=Для рецептов нужны предметы +No item to show=Нет предмета для показа +Collect items to reveal more recipes=Собирайте предметы, чтобы открыть больше рецептов diff --git a/mods/HELP/mcl_doc/locale/mcl_doc.ru.tr b/mods/HELP/mcl_doc/locale/mcl_doc.ru.tr index 2deeb8e73..741c0742c 100644 --- a/mods/HELP/mcl_doc/locale/mcl_doc.ru.tr +++ b/mods/HELP/mcl_doc/locale/mcl_doc.ru.tr @@ -1,33 +1,33 @@ # textdomain: mcl_doc Water can flow into this block and cause it to drop as an item.=Вода может затечь в этот блок и вызвать его выпадение в качестве предмета. -This block can be turned into dirt with a hoe.=Этот блок можно превратить в грязь с помощью мотыги. +This block can be turned into dirt with a hoe.=Этот блок можно превратить в землю с помощью мотыги. This block can be turned into farmland with a hoe.=Этот блок можно превратить в грядку с помощью мотыги. This block acts as a soil for all saplings.=Этот блок служит почвой для всех саженцев. This block acts as a soil for some saplings.=Этот блок служит почвой для некоторых саженцев. Sugar canes will grow on this block.=На этом блоке будет расти сахарный тростник. -Nether wart will grow on this block.=Адский нарост будет расти на этом блоке. -This block quickly decays when there is no wood block of any species within a distance of @1. When decaying, it disappears and may drop one of its regular drops. The block does not decay when the block has been placed by a player.=Этот блок быстро разрушается, когда на расстоянии @1 нет древесных блоков любого вида. При распаде он исчезает и может уронить одну из своих обычных капель. Блок не разрушается, если он размещен игроком. -This block quickly decays and disappears when there is no wood block of any species within a distance of @1. The block does not decay when the block has been placed by a player.=Этот блок быстро распадается и исчезает, если на расстоянии @1 нет древесных блоков любого типа. Блок не разрушается, если он размещен игроком. -This plant can only grow on grass blocks and dirt. To survive, it needs to have an unobstructed view to the sky above or be exposed to a light level of 8 or higher.=Это растение может расти только на блоках травы и грязи. Чтобы выжить, ему нужно иметь беспрепятственный обзор неба или подвергаться воздействию света уровня 8 или выше. -This plant can grow on grass blocks, podzol, dirt and coarse dirt. To survive, it needs to have an unobstructed view to the sky above or be exposed to a light level of 8 or higher.=Это растение может расти на блоках травы, подзола и твёрдой грязи. Чтобы выжить, ему нужно иметь беспрепятственный обзор неба или подвергаться воздействию света уровня 8 или выше. -This block is flammable.=Этот блок легковоспламеним. -This block destroys any item it touches.=Этот блок уничтожает всё, к чему прикасается. -To eat it, wield it, then rightclick.=Чтобы съесть это, возьмите в руки и кликните правой клавишей. +Nether wart will grow on this block.=На этом блоке будет расти адский нарост. +This block quickly decays when there is no wood block of any species within a distance of @1. When decaying, it disappears and may drop one of its regular drops. The block does not decay when the block has been placed by a player.=Этот блок быстро саморазрушается, если на дистанции @1 метров отсутствуют блоки дерева любого типа. При разрушении может выпасть его обычный дроп. Блок не саморазрушается если он был поставлен игроком. +This block quickly decays and disappears when there is no wood block of any species within a distance of @1. The block does not decay when the block has been placed by a player.=Этот блок быстро саморазрушается и исчезает, если на дистанции @1 метров отсутствуют блоки дерева любого типа. Блок не саморазрушается если он был поставлен игроком. +This plant can only grow on grass blocks and dirt. To survive, it needs to have an unobstructed view to the sky above or be exposed to a light level of 8 or higher.=Это растение может расти только на блоках дёрна и грязи. Для жизни ему нужно иметь беспрепятственный обзор на небо сверху, либо уровень света 8 и выше. +This plant can grow on grass blocks, podzol, dirt and coarse dirt. To survive, it needs to have an unobstructed view to the sky above or be exposed to a light level of 8 or higher.=Это растение может расти только на блоках дёрна, грязи, подзола и твёрдой земли. Для жизни ему нужно иметь беспрепятственный обзор на небо сверху, либо уровень света 8 и выше. +This block is flammable.=Этот блок воспламеним. +This block destroys any item it touches.=Этот блок уничтожает любой предмет, который его касается. +To eat it, wield it, then rightclick.=Чтобы съесть это, возьмите в руки и кликните правой кнопкой мыши. You can eat this even when your hunger bar is full.=Вы можете есть это, даже когда ваша полоска голода заполнена. You cannot eat this when your hunger bar is full.=Вы не можете есть это, когда ваша полоска голода заполнена. -To drink it, wield it, then rightclick.=Чтобы выпить это, возьмите его в руки и кликните правой клавишей мыши. +To drink it, wield it, then rightclick.=Чтобы выпить это, возьмите его в руки и кликните правой кнопкой мыши. You cannot drink this when your hunger bar is full.=Вы не можете пить это, когда ваша полоска голода заполнена. -To consume it, wield it, then rightclick.=Чтобы употребить это, возьмите в руки и кликните правой клавишей мыши. +To consume it, wield it, then rightclick.=Чтобы употребить это, возьмите в руки и кликните правой кнопкой мыши. You cannot consume this when your hunger bar is full.=Вы не можете употребить это, когда ваша полоска голода заполнена. You have to wait for about 2 seconds before you can eat or drink again.=Вам нужно подождать 2 секунды, прежде чем снова пить или есть. -Hunger points restored: @1=Восстановлено единиц голода: @1 -Saturation points restored: @1%.1f=Восстановлено единиц сытости: @1 +Hunger points restored: @1=Восстанавливает очков голода: @1 +Saturation points restored: @1%.1f=Восстанавливает очков насыщения: @1 This item can be repaired at an anvil with: @1.=Этот предмет можно починить на наковальне при помощи: @1. This item can be repaired at an anvil with any wooden planks.=Этот предмет можно починить на наковальне с помощью любых деревянных досок. This item can be repaired at an anvil with any item in the “@1” group.=Этот предмет можно починить на наковальне с помощью любого предмета из группы “@1”. -This item cannot be renamed at an anvil.=Этот предмет нельзя починить в наковальне. -This block crushes any block it falls into.=Этот блок сокрушает любой блок, на который падает. -When this block falls deeper than 1 block, it causes damage to any player it hits. The damage dealt is B×2−2 hit points with B @= number of blocks fallen. The damage can never be more than 40 HP.=Когда этот блок падает 1 блока, то наносит урон задеваемому игроку. Повреждение составляет B×2–2 единиц удара, где B @= количество упавших блоков. Урон не может превышать 40 HP. +This item cannot be renamed at an anvil.=Этот предмет нельзя переименовать на наковальне. +This block crushes any block it falls into.=Этот блок ломает любой блок, на который падает. +When this block falls deeper than 1 block, it causes damage to any player it hits. The damage dealt is B×2−2 hit points with B @= number of blocks fallen. The damage can never be more than 40 HP.=Когда этот блок падает вниз на 1 блок, он наносит урон игроку, который заденет этот блок. Урон рассчитывается как Z×2–2 единиц здоровья, где Z это высота полета в блоках. Урон не может превышать 40 единиц здоровья. Diamond Pickaxe=Алмазная кирка Iron Pickaxe=Железная кирка Stone Pickaxe=Каменная кирка @@ -45,35 +45,35 @@ Golden Shovel=Золотая лопата Wooden Shovel=Деревянная лопата This block can be mined by any tool instantly.=Этот блок можно мгновенно добыть любым инструментом. This block can be mined by:=Этот блок можно добыть при помощи: -Hardness: ∞=Твердость: ∞ -Hardness: @1=Твердость: @1 -This block will not be destroyed by TNT explosions.=Этот блок не уничтожат взрывы тротила. -This block drops itself when mined by shears.=Этот блок сбрасывается сам при добыче ножницами. +Hardness: ∞=Твёрдость: ∞ +Hardness: @1=Твёрдость: @1 +This block will not be destroyed by TNT explosions.=Этот блок не будет уничтожен при взрыве ТНТ. +This block drops itself when mined by shears.=При добыче этого блока ножницами выпадает этот же блок. @1×@2=@1×@2 -This blocks drops the following when mined by shears: @1=Этот блок при добыче ножницами выбрасывает следующее: @1 +This blocks drops the following when mined by shears: @1=При добыче этого блока ножницами выпадает следующее: @1 , = , • Shears=• Ножницы • Sword=• Меч • Hand=• Рука This is a melee weapon which deals damage by punching.=Это оружие ближнего боя, оно наносит урон при ударе. Maximum damage: @1 HP=Максимальный урон: @1 HP -Full punch interval: @1 s=Интервал полного удара: @1 с +Full punch interval: @1 s=Интервал удара: @1 с This tool is capable of mining.=Этим инструментом можно добывать Mining speed: @1=Скорость добычи: @1 -Painfully slow=Мучительно медленно -Very slow=Очень медленно -Slow=Медленно -Fast=Быстро -Very fast=Очень быстро -Extremely fast=Ужасно быстро -Instantaneous=Мгновенно -@1 uses=@1 раз(а) +Painfully slow=крайне медленно +Very slow=очень медленно +Slow=медленно +Fast=быстро +Very fast=очень быстро +Extremely fast=экстремально быстро +Instantaneous=мгновенно +@1 uses=@1 Unlimited uses=не ограничено -Block breaking strength: @1=Прочность блока на разрыв: @1 -Mining durability: @1=Долговечность при добыче: @1 -Armor points: @1=Эффективность защиты: @1 -Armor durability: @1=Долговечность защиты: @1 +Block breaking strength: @1=Сила добычи: @1 +Mining durability: @1=Прочность при добыче: @1 +Armor points: @1=Очки брони: @1 +Armor durability: @1=Прочность брони: @1 It can be worn on the head.=Это можно носить на голове. -It can be worn on the torso.=Это можно носить на теле. +It can be worn on the torso.=Это можно носить на торсе. It can be worn on the legs.=Это можно носить на ногах. It can be worn on the feet.=Это можно носить на ступнях. diff --git a/mods/HELP/mcl_doc/locale/template.txt b/mods/HELP/mcl_doc/locale/template.txt index ec825644c..de652f05e 100644 --- a/mods/HELP/mcl_doc/locale/template.txt +++ b/mods/HELP/mcl_doc/locale/template.txt @@ -2,7 +2,6 @@ Water can flow into this block and cause it to drop as an item.= This block can be turned into dirt with a hoe.= This block can be turned into farmland with a hoe.= -This block can be turned into grass path with a shovel.= This block acts as a soil for all saplings.= This block acts as a soil for some saplings.= Sugar canes will grow on this block.= diff --git a/mods/HELP/mcl_doc_basics/locale/mcl_doc_basics.ru.tr b/mods/HELP/mcl_doc_basics/locale/mcl_doc_basics.ru.tr index cf598fb43..95739f7d5 100644 --- a/mods/HELP/mcl_doc_basics/locale/mcl_doc_basics.ru.tr +++ b/mods/HELP/mcl_doc_basics/locale/mcl_doc_basics.ru.tr @@ -4,134 +4,134 @@ Everything you need to know to get started with playing=Всё, что вам н Advanced usage=Продвинутое использование Advanced information which may be nice to know, but is not crucial to gameplay=Дополнительная информация, которую хорошо было бы знать, но не критично для хода игры Quick start=Быстрый старт -This is a very brief introduction to the basic gameplay:=Это максимально сжатое введение в основы игрового процесса +This is a very brief introduction to the basic gameplay:=Это краткое введение в основы игрового процесса: Basic controls:=Основное управление: -• Move mouse to look=• Мышь - осматриваться +• Move mouse to look=• [Движение мышью] - осматриваться • [W], [A], [S] and [D] to move=• [W], [A], [S] и [D] - идти • [E] to sprint=• [E] - бежать -• [Space] to jump or move upwards=• [Пробел] - прыгнуть или двигаться вверх -• [Shift] to sneak or move downwards=• [Shift] - красться или двигаться вниз -• Mouse wheel or [1]-[9] to select item=• Колёсико или [1]-[9] - выбор предмета -• Left-click to mine blocks or attack=• Левый клик - добывать блок или атаковать -• Recover from swings to deal full damage=• Бейте без колебаний, чтобы нанести максимальный урон -• Right-click to build blocks and use things=• Правый клик - строить блоки и использовать вещи +• [Space] to jump or move upwards=• [Пробел] - прыгнуть или карабкаться вверх +• [Shift] to sneak or move downwards=• [Shift] - красться или карабкаться вниз +• Mouse wheel or [1]-[9] to select item=• [Колёсико мыши] или [1]-[9] - выбор предмета +• Left-click to mine blocks or attack=• [Левая кнопка мыши] - добывать блок или атаковать +• Recover from swings to deal full damage=• Чтобы нанести максимальный урон, делайте небольшой интервал между ударами +• Right-click to build blocks and use things=• [Правая кнопка мыши] - строить блоки и использовать вещи • [I] for the inventory=• [I] - открыть инвентарь -• First items in inventory appear in hotbar below=• Первые предметы в инвентаре появляются на панели быстрого доступа внизу -• Lowest row in inventory appears in hotbar below=• Нижний ряд в инвентаре появляется на панели быстрого доступа внизу +• First items in inventory appear in hotbar below=• Первые поднятые предметы появляются в хотбаре (9 ячеек инвентаря) внизу экрана +• Lowest row in inventory appears in hotbar below=• Нижний ряд инвентаря это и есть хотбар • [Esc] to close this window=• [Esc] - закрыть это окно How to play:=Как играть: -• Punch a tree trunk until it breaks and collect wood=• Бейте дерево по стволу, пока оно не сломается, и собирайте древесину -• Place the wood into the 2×2 grid (your “crafting grid”) in your inventory menu and craft 4 wood planks=• Поместите кусок дерева в решётку 2×2 (вашу личную “крафт-сетку”) в меню инвентаря и скрафтите из него 4 доски +• Punch a tree trunk until it breaks and collect wood=• Бейте дерево по стволу пока оно не сломается и соберите выпавшую древесину +• Place the wood into the 2×2 grid (your “crafting grid”) in your inventory menu and craft 4 wood planks=• Поместите древесину в решётку 2×2 (вашу “сетку крафта”) в меню инвентаря и скрафтите из него 4 доски • Place them in a 2×2 shape in the crafting grid to craft a crafting table=• Разместите их в виде квадрата 2×2 в крафт-сетке, чтобы сделать верстак • Place the crafting table on the ground=• Поставьте верстак на землю -• Rightclick it for a 3×3 crafting grid=• Кликните правой по верстаку для работы с крафт-сеткой 3×3 -• Use the crafting guide (book icon) to learn all the possible crafting recipes=Используйте крафт-гид (значок книги) рецептов для изучения всех доступных рецептов -• Craft a wooden pickaxe so you can dig stone=• Создайте деревянную кирку, чтобы добыть камни +• Rightclick it for a 3×3 crafting grid=• Кликните правой кнопкой мыши по верстаку для работы с сеткой крафта 3×3 +• Use the crafting guide (book icon) to learn all the possible crafting recipes=Используйте книгу рецептов для изучения всех доступных рецептов +• Craft a wooden pickaxe so you can dig stone=• Создайте деревянную кирку, чтобы добыть камень • Different tools break different kinds of blocks. Try them out!=• Разные инструменты могут ломать разные виды блоков. Опробуйте их! -• Read entries in this help to learn the rest=Читайте записи в этой справке, чтобы узнать всё -• Continue playing as you wish. There's no goal. Have fun!=Продолжайте играть, как вам нравится. Игра не имеет конечной цели. Наслаждайтесь! -Minetest=Майнтест -Minetest is a free software game engine for games based on voxel gameplay, inspired by InfiniMiner, Minecraft, and the like. Minetest was originally created by Perttu Ahola (alias “celeron55”).=Майнтест - бесплатный программный движок для игр, основанных на воксельных мирах, источником вдохновения послужили игры InfiniMiner, Minecraft и подобные. Майнтест изначально создан Пертту Ахолой (под псевдонимом “celeron55”). -The player is thrown into a huge world made out of cubes or blocks. These cubes usually make the landscape they blocks can be removed and placed almost entirely freely. Using the collected items, new tools and other items can be crafted. Games in Minetest can, however, be much more complex than this.=Игрок попадает в огромный мир из кубиков-блоков. Из этих кубиков состоит ландшафт, их можно убирать и снова размещать практически свободно. Используя собранные предметы, вы можете создать («скрафтить») новые инструменты и предметы. Игры для Майнтеста могут быть и гораздо сложнее. -A core feature of Minetest is the built-in modding capability. Mods modify existing gameplay. They can be as simple as adding a few decorational blocks or be very complex by e.g. introducing completely new gameplay concepts, generating a completely different kind of world, and many other things.=Основной особенностью Майнтеста является встроенная возможность моддинга. Моды изменяют привычный игровой процесс. Они могут быть очень простыми, например, добавлять нескольких декоративных блоков, или очень сложными - полностью изменяющими игровой процесс, генерирующими новые виды миров и т. д. -Minetest can be played alone or online together with multiple players. Online play will work out of the box with any mods, with no need for additional software as they are entirely provided by the server.=В Майнтест можно играть в одиночку или онлайн вместе с несколькими игроками. Онлайн-игра будет работать «из коробки» с любыми модами без необходимости установки дополнительного программного обеспечения, так как всё необходимое предоставляется сервером. -Minetest is usually bundled with a simple default game, named “Minetest Game” (shown in images 1 and 2). You probably already have it. Other games for Minetest can be downloaded from the official Minetest forums .=Обычно Майнтест поставляется в комплекте с простой игрой по умолчанию, которая называется «Игра Майнтест» (показана на рисунках 1 и 2). У вас она, вероятно, есть. Другие игры для Майнтеста можно скачать с официального форума . -Minetest as well as Minetest Game are both unfinished at the moment, so please forgive us when not everything works out perfectly.=Как Майнтест, так и «Игра Майнтест» в данный момент еще не завершены, поэтому, пожалуйста, простите, если что-то не заработает идеально. +• Read entries in this help to learn the rest=Читайте записи в этой справке, чтобы узнать всё остальное +• Continue playing as you wish. There's no goal. Have fun!=Продолжайте играть, как вам захочется. Эта игра не имеет конечной цели. Наслаждайтесь! +Minetest=Minetest +Minetest is a free software game engine for games based on voxel gameplay, inspired by InfiniMiner, Minecraft, and the like. Minetest was originally created by Perttu Ahola (alias “celeron55”).=Minetest - свободный игровой движок для воксельных игр, вдохновлённый играми InfiniMiner, Minecraft и подобным. Minetest изначально создан Пертту Ахолой (под псевдонимом “celeron55”). +The player is thrown into a huge world made out of cubes or blocks. These cubes usually make the landscape they blocks can be removed and placed almost entirely freely. Using the collected items, new tools and other items can be crafted. Games in Minetest can, however, be much more complex than this.=Игрок попадает в огромный мир из кубиков-блоков. Из этих кубиков состоит ландшафт, их можно убирать и снова размещать как угодно. Используя собранные предметы, вы можете создать(скрафтить) новые инструменты и предметы. Игры для Minetest могут быть и гораздо сложнее и комплекснее чем эта. +A core feature of Minetest is the built-in modding capability. Mods modify existing gameplay. They can be as simple as adding a few decorational blocks or be very complex by e.g. introducing completely new gameplay concepts, generating a completely different kind of world, and many other things.=Основной особенностью Minetest является встроенная возможность моддинга. Моды изменяют привычный игровой процесс. Они могут быть очень простыми, например, добавлять нескольких декоративных блоков, или очень сложными - полностью изменяющими игровой процесс, генерирующими новые виды миров и т. д. +Minetest can be played alone or online together with multiple players. Online play will work out of the box with any mods, with no need for additional software as they are entirely provided by the server.=В Minetest можно играть в одиночку или онлайн вместе с другими игроками. Онлайн-игра будет работать “из коробки” с любыми модами без необходимости установки дополнительного программного обеспечения, так как всё необходимое предоставляется сервером. +Minetest is usually bundled with a simple default game, named “Minetest Game” (shown in images 1 and 2). You probably already have it. Other games for Minetest can be downloaded from the official Minetest forums .=Обычно Minetest поставляется в комплекте с простой игрой по умолчанию, которая называется “Minetest Game” ( рис. 1 и 2). У вас она, вероятно, есть. Другие игры для Minetest можно скачать с официального форума . +Minetest as well as Minetest Game are both unfinished at the moment, so please forgive us when not everything works out perfectly.=Minetest и “Minetest Game” в данный момент еще не завершены, поэтому, пожалуйста, простите, если что-то работает неидеально. Sneaking=Подкрадывание Sneaking makes you walk slower and prevents you from falling off the edge of a block.=Подкрадывание замедляет ход и предотвращает падение с края блока. To sneak, hold down the sneak key (default: [Shift]). When you release it, you stop sneaking. Careful: When you release the sneak key at a ledge, you might fall!=Чтобы красться, удерживайте нажатой клавишу [Красться] (по умолчанию: [Shift]). Когда вы отпускаете её, то перестаете красться. Будьте осторожны: если отпустить клавишу, стоя на краю выступа, то можете оттуда упасть! -• Sneak: [Shift]=• Красться: [Shift] +• Sneak: [Shift]=• [Shift] - красться Sneaking only works when you stand on solid ground, are not in a liquid and don't climb.=Подкрадывание работает только когда вы стоите на твердой земле, не находитесь в жидкости и не карабкаетесь. If you jump while holding the sneak key, you also jump slightly higher than usual.=Если вы прыгаете, удерживая нажатой клавишу [Красться], вы также прыгаете немного выше, чем обычно. -Sneaking might be disabled by mods. In this case, you still walk slower by sneaking, but you will no longer be stopped at ledges.=Подкрадывание может быть отключено модами. В этом случае вы все равно идете медленнее, крадясь, но вас больше ничто не останавливает на выступах. +Sneaking might be disabled by mods. In this case, you still walk slower by sneaking, but you will no longer be stopped at ledges.=Подкрадывание может быть отключено модами. В этом случае, крадясь вы все равно идете медленнее, но вас больше ничто не останавливает на выступах. Controls=Управление These are the default controls:=Вот стандартное управление: Basic movement:=Основное движение: -• Moving the mouse around: Look around=• Движение мыши: осматриваться вокруг -• W: Move forwards=• W: двигаться вперед -• A: Move to the left=• A: двигаться влево -• D: Move to the right=• D: двигаться вправо -• S: Move backwards=• S: двигаться назад -• E: Sprint=• E: Бег +• Moving the mouse around: Look around=• [Движение мышью] - осматриваться вокруг +• W: Move forwards=• [W] - двигаться вперед +• A: Move to the left=• [A] - двигаться влево +• D: Move to the right=• [D] - двигаться вправо +• S: Move backwards=• [S] - двигаться назад +• E: Sprint=• [E] - Бег While standing on solid ground:=Если стоите на твердой земле: -• Space: Jump=• Пробел: прыгать -• Shift: Sneak=• Shift: красться -While on a ladder, swimming in a liquid or fly mode is active=Стоя на лестнице, плывя в режиме жидкости или находясь в режиме полёта -• Space: Move up=• Пробел: двигаться вверх -• Shift: Move down=• Shift: двигаться вниз +• Space: Jump=• [Пробел] - прыгать +• Shift: Sneak=• [Shift] - красться +While on a ladder, swimming in a liquid or fly mode is active=Стоя на лестнице, плывя в жидкости или находясь в режиме полёта: +• Space: Move up=• [Пробел] - двигаться вверх +• Shift: Move down=• [Shift] - двигаться вниз Extended movement (requires privileges):=Расширенное движение (требуются привилегии): -• J: Toggle fast mode, makes you run or fly fast (requires “fast” privilege)=• J: включает/выключает быстрый режим для бега/полёта (требуется привилегия “fast”) -• K: Toggle fly mode, makes you move freely in all directions (requires “fly” privilege)=• K: включает/выключает режим полёта, позволяющий свободно перемещаться во всех направлениях (требуется привилегия “fly”) -• H: Toggle noclip mode, makes you go through walls in fly mode (requires “noclip” privilege)=• H: включает/выключает режим отсутствия препятствий, позволяющий проходить сквозь стены в режиме полёта (требуется привилегия “noclip”) -• E: Move even faster when in fast mode=• E: двигаться даже быстрее, чем в быстром режиме -• E: Walk fast in fast mode=• E: идти быстро в быстром режиме +• J: Toggle fast mode, makes you run or fly fast (requires “fast” privilege)=• [J] - переключает быстрый бег/полёт (требуется привилегия “fast”) +• K: Toggle fly mode, makes you move freely in all directions (requires “fly” privilege)=• [K] - переключает режим полёта, позволяющий свободно перемещаться во всех направлениях (требуется привилегия “fly”) +• H: Toggle noclip mode, makes you go through walls in fly mode (requires “noclip” privilege)=• [H] - переключает режим, позволяющий проходить сквозь стены в режиме полёта (требуется привилегия “noclip”) +• E: Move even faster when in fast mode=• [E] - вы в быстром режиме, ускорит вас еще сильнее +• E: Walk fast in fast mode=• [E] - идти быстрее в быстром режиме World interaction:=Взаимодействие с миром: -• Left mouse button: Punch / mine blocks / take items=• Левая кнопка мыши: Бить / добывать блоки / брать предметы -• Left mouse button: Punch / mine blocks=• Левая кнопка мыши: Бить / добывать блоки -• Right mouse button: Build or use pointed block=• Правая кнопка мыши: Строить или использовать указанный блок -• Shift+Right mouse button: Build=• Shift+Правая кнопка мыши: Строить -• Roll mouse wheel: Select next/previous item in hotbar=• Вращение колёсика мыши: Выбор следующего/предыдущего предмета на панели быстрого доступа -• Roll mouse wheel / B / N: Select next/previous item in hotbar=• Вращение колёсика мыши / B / N: Выбор следующего/предыдущего предмета на панели быстрого доступа -• 1-9: Select item in hotbar directly=• 1-9: Быстрый и прямой выбор предмета на панели быстрого доступа -• Q: Drop item stack=• Q: выбросить всю стопку предметов -• Shift+Q: Drop 1 item=• Shift+Q: выбросить только 1 предмет -• I: Show/hide inventory menu=• I: Показать/скрыть меню вашего инвентаря +• Left mouse button: Punch / mine blocks / take items=• [Левая кнопка мыши] - бить / добывать блоки / брать предметы +• Left mouse button: Punch / mine blocks=• [Левая кнопка мыши] - бить / добывать блоки +• Right mouse button: Build or use pointed block=• [Правая кнопка мыши] - построить или использовать выбранный блок +• Shift+Right mouse button: Build=• [Shift]+[Правая кнопка мыши] - построить +• Roll mouse wheel: Select next/previous item in hotbar=• [Колёсико мыши] - выбор следующего/предыдущего предмета на хотбаре +• Roll mouse wheel / B / N: Select next/previous item in hotbar=• [Колёсико мыши] / [B] / [N] - выбор следующего/предыдущего предмета в хотбаре +• 1-9: Select item in hotbar directly=• [1-9] - выбор предмета в хотбаре +• Q: Drop item stack=• [Q] - выбросить весь стак предметов +• Shift+Q: Drop 1 item=• [Shift]+[Q] - выбросить только 1 предмет +• I: Show/hide inventory menu=• [I] - показать/скрыть ваш инвентарь Inventory interaction:=Взаимодействие с инвентарём: See the entry “Basics > Inventory”.=Смотрите запись “Основы > Инвентарь”. Camera:=Камера: -• Z: Zoom=• Z: Увеличение -• F7: Toggle camera mode=• F7: Смена режима камеры -• F8: Toggle cinematic mode=• F8: Кинематографический режим +• Z: Zoom=• [Z] - приблизить +• F7: Toggle camera mode=• [F7] - смена камеры +• F8: Toggle cinematic mode=• [F8] - кинематографический режим Interface:=Интерфейс: -• Esc: Open menu window (pauses in single-player mode) or close window=• Esc: Открыть/закрыть меню (пауза в режиме одиночной игры) -• F1: Show/hide HUD=• F1: Показать/убрать игровой интерфейс (HUD) -• F2: Show/hide chat=• F2: Показать/убрать чат -• F9: Toggle minimap=• F9: Включить/выключить миникарту -• Shift+F9: Toggle minimap rotation mode=• Shift+F9: Смена режима вращения мини-карты -• F10: Open/close console/chat log=• F10: Открыть/закрыть консоль/историю чата -• F12: Take a screenshot=• F12: Сделать снимок экрана +• Esc: Open menu window (pauses in single-player mode) or close window=• [Esc] - открыть/закрыть меню (ставит на паузу в одиночной игре) +• F1: Show/hide HUD=• [F1] - показать/убрать игровой интерфейс (HUD) +• F2: Show/hide chat=• [F2] - показать/убрать чат +• F9: Toggle minimap=• [F9] - включить/выключить миникарту +• Shift+F9: Toggle minimap rotation mode=• [Shift]+[F9] - смена режима вращения мини-карты +• F10: Open/close console/chat log=• [F10] - открыть/закрыть консоль/историю чата +• F12: Take a screenshot=• [F12] - сделать снимок экрана Server interaction:=Взаимодействие с сервером: -• T: Open chat window (chat requires the “shout” privilege)=• T: Открыть окно чата (чат требует привилегию “shout”) -• /: Start issuing a server command=• /: Начать ввод серверной команды +• T: Open chat window (chat requires the “shout” privilege)=• [T] - открыть окно чата (чтобы писать нужна привилегия “shout”) +• /: Start issuing a server command=• [/] - начать ввод серверной команды Technical:=Технические: -• R: Toggle far view (disables all fog and allows viewing far away, can make game very slow)=• R: Включить/выключить дальний обзор (отключает туман и позволяет смотреть очень далеко, может замедлять игру) -• +: Increase minimal viewing distance=• +: Увеличить минимальное расстояние просмотра -• -: Decrease minimal viewing distance=• -: Уменьшить минимальное расстояние просмотра -• F3: Enable/disable fog=• F3: Включить/отключить туман -• F5: Enable/disable debug screen which also shows your coordinates=• F5: Включить/отключить экран отладки, который также показывает ваши координаты -• F6: Only useful for developers. Enables/disables profiler=• F6: Полезно только для разработчиков. Включает/отключает профайлер -• P: Only useful for developers. Writes current stack traces=• P: Полезно только для разработчиков. Записывает текущие трассировки стека +• R: Toggle far view (disables all fog and allows viewing far away, can make game very slow)=• [R] - переключить дальний обзор (отключает туман и позволяет смотреть очень далеко, может замедлять игру) +• +: Increase minimal viewing distance=• [+] - увеличить минимальную дистанцию видимости +• -: Decrease minimal viewing distance=• [-] - уменьшить минимальную дистанцию видимости +• F3: Enable/disable fog=• [F3] - включить/выключить туман +• F5: Enable/disable debug screen which also shows your coordinates=• [F5] - переключить экран отладки, который также показывает ваши координаты +• F6: Only useful for developers. Enables/disables profiler=• [F6] - полезно только для разработчиков. Включает/отключает профайлер +• P: Only useful for developers. Writes current stack traces=• [P] - полезно только для разработчиков. Записывает текущие трассировки стека Players=Игроки -Players (actually: “player characters”) are the characters which users control.=Игроки (на самом деле «персонажи игроков») - персонажи, которыми управляют пользователи. +Players (actually: “player characters”) are the characters which users control.=Игроки (на самом деле “игровые персонажи”) - персонажи, которыми управляют пользователи. Players are living beings. They start with a number of health points (HP) and a number of breath points (BP).=Игроки это живые существа. Они появляются с определённым количеством очков здоровья (HP) и дыхания (BP). Players are capable of walking, sneaking, jumping, climbing, swimming, diving, mining, building, fighting and using tools and blocks.=Игроки могут ходить, красться, прыгать, карабкаться, плавать, нырять, добывать, строить, сражаться и использовать инструменты и блоки. Players can take damage for a variety of reasons, here are some:=Игроки могут получить урон по разным причинам, вот некоторые: • Taking fall damage=• Получение урона от падения -• Touching a block which causes direct damage=• Прикосновение к блоку, который наносит прямой ущерб +• Touching a block which causes direct damage=• Прикосновение к блоку, который наносит урон • Drowning=• Утопление -• Being attacked by another player=• Быть атакованным другим игроком -• Being attacked by a computer enemy=• Быть атакованным компьютерным врагом -At a health of 0, the player dies. The player can just respawn in the world.=На отметке здоровья HP@=0 игрок умирает. Но он может возродиться в этом же мире. -Other consequences of death depend on the game. The player could lose all items, or lose the round in a competitive game.=Другие последствия смерти зависят от игры. Игрок может потерять все предметы или проиграть в соревновательной игре. -Some blocks reduce breath. While being with the head in a block which causes drowning, the breath points are reduced by 1 for every 2 seconds. When all breath is gone, the player starts to suffer drowning damage. Breath is quickly restored in any other block.=Некоторые блоки не допускают дыхания. При нахождении с головой в блоке, который вызывает утопление, точки дыхания уменьшаются на 1 каждые 2 секунды. Когда все очки дыхания уходят, игрок начинает получать урон утопающего. Очки дыхания быстро восстановятся в любом другом блоке. -Damage can be disabled on any world. Without damage, players are immortal and health and breath are unimportant.=Урон можно отключить в любом мире. Без повреждений игроки бессмертны, а здоровье и дыхание неважны. +• Being attacked by another player=• Нападение другого игрока +• Being attacked by a computer enemy=• Нападение компьютерного врага +At a health of 0, the player dies. The player can just respawn in the world.=Когда здоровье достигает нуля, игрок умирает. Но он может возродиться в этом же мире. +Other consequences of death depend on the game. The player could lose all items, or lose the round in a competitive game.=Другие последствия смерти зависят от игры-мода. Игрок может потерять все предметы или проиграть в соревновании. +Some blocks reduce breath. While being with the head in a block which causes drowning, the breath points are reduced by 1 for every 2 seconds. When all breath is gone, the player starts to suffer drowning damage. Breath is quickly restored in any other block.=Некоторые блоки уменьшают дыхание. При нахождении с головой в блоке, который вызывает утопление, очки дыхания уменьшаются на 1 каждые 2 секунды. Когда все очки дыхания пропадают, игрок начинает получать урон от утопления. Очки дыхания быстро восстанавливаются в любом другом блоке. +Damage can be disabled on any world. Without damage, players are immortal and health and breath are unimportant.=Урон можно отключить в любом мире. Без включенного урона игроки бессмертны, и здоровье и дыхание для них неважны. In multi-player mode, the name of other players is written above their head.=В многопользовательском режиме имена других игроков написаны над их головами. Items=Предметы -Items are things you can carry along and store in inventories. They can be used for crafting, smelting, building, mining, and more. Types of items include blocks, tools, weapons and items only used for crafting.=Предметы - это вещи, которые вы можете носить с собой и хранить в инвентаре. Их можно использовать для крафтинга (создания чего-либо), плавки, строительства, добычи и многого другого. Типы предметов: блоки, инструменты, оружие, а также предметы, используемые только для крафтинга. -An item stack is a collection of items of the same type which fits into a single item slot. Item stacks can be dropped on the ground. Items which drop into the same coordinates will form an item stack.=Стопка предметов - это набор предметов одного типа, который помещается в один слот. Стопки предметов можно выбрасывать на землю полностью. Предметы, попавшие в одни и те же координаты, образуют стопку. -Dropped item stacks will be collected automatically when you stand close to them.=Стопки брошенных предметов подбираются автоматически, если вы стоите рядом с ними. +Items are things you can carry along and store in inventories. They can be used for crafting, smelting, building, mining, and more. Types of items include blocks, tools, weapons and items only used for crafting.=Предметы это вещи, которые вы можете носить с собой и хранить в инвентаре. Их можно использовать для крафтинга, переплавки, строительства, добычи и многого другого. Предметы включают в себя блоки, инструменты, оружие, а также предметы, используемые только для крафта. +An item stack is a collection of items of the same type which fits into a single item slot. Item stacks can be dropped on the ground. Items which drop into the same coordinates will form an item stack.=Стак предметов это набор предметов одного типа, который помещается в один слот. Стак предметов можно выбрасывать на землю полностью. Предметы, попавшие в одни и те же координаты, образуют стак. +Dropped item stacks will be collected automatically when you stand close to them.=Стаки брошенных предметов подбираются автоматически, если вы стоите рядом с ними. Items have several properties, including the following:=Предметы имеют несколько свойств, в том числе следующие: -• Maximum stack size: Number of items which fit on 1 item stack=• Максимальный размер стопки: количество, которое помещается в 1 стопку предметов +• Maximum stack size: Number of items which fit on 1 item stack=• Максимальный размер стака: количество, которое помещается в 1 стак предметов • Pointing range: How close things must be to be pointed while wielding this item=• Дальность прицела: насколько близко должна находиться цель, чтобы можно было навести на неё этот предмет и использовать • Group memberships: See “Basics > Groups”=• Членство в группах: См. “Основы > Группы” -• May be used for crafting or cooking=• Может быть использовано для крафтинга или приготовления пищи +• May be used for crafting or cooking=• Может быть использовано для крафта или приготовления пищи Tools=Инструменты -Some items may serve as a tool when wielded. Any item which has some special use which can be directly used by its wielder is considered a tool.=Некоторые предметы могут служить вам в качестве инструментов. Любой предмет, которым вы можете напрямую воспользоваться, чтобы сделать какое-то особое действие, считается инструментом. -A common subset of tools is mining tools. These are important to break all kinds of blocks. Weapons are a kind of tool. There are of course many other possible tools. Special actions of tools are usually done by left-click or right-click.=Распространенной разновидностью инструментов являются инструменты майнинга. Они позволяют ломать все виды блоков. Оружие - тоже своего рода инструмент. Есть и много других инструментов. Особое действие инструмента обычно выполняются по нажатию левой или правой кнопки мыши. +Some items may serve as a tool when wielded. Any item which has some special use which can be directly used by its wielder is considered a tool.=Некоторые предметы могут служить вам в качестве инструментов. Любой предмет, который имеет своё специальное назначение и используется напрямую владельцем, считается инструментом. +A common subset of tools is mining tools. These are important to break all kinds of blocks. Weapons are a kind of tool. There are of course many other possible tools. Special actions of tools are usually done by left-click or right-click.=Распространенной разновидностью инструментов являются инструменты для добычи блоков. Они позволяют ломать все виды блоков. Оружие - тоже своего рода инструмент. Есть и много других инструментов. Особое действие инструмента обычно выполняются по нажатию левой или правой кнопки мыши. When nothing is wielded, players use their hand which may act as tool and weapon.=Когда у вас в руке нет никакого предмета, инструментом, либо даже оружием, выступает сама рука. -Mining tools are important to break all kinds of blocks. Weapons are another kind of tool. There are some other more specialized tools. Special actions of tools are usually done by right-click.=Инструменты добычи позволяют ломать все виды блоков. Оружие - тоже своеобразный инструмент, хотя есть и другие, более специализированные. Особое действие инструментов обычно включается правой клавишей мыши. -When nothing is wielded, players use their hand which may act as tool and weapon. The hand is capable of punching and deals minimum damage.=При отсутствии предметов игроки используют свою руку, которая может выступать в качестве инструмента и оружия. Рука способна ударять и даже наносить небольшой урон. -Many tools will wear off when using them and may eventually get destroyed. The damage is displayed in a damage bar below the tool icon. If no damage bar is shown, the tool is in mint condition. Tools may be repairable by crafting, see “Basics > Crafting”.=Многие инструменты изнашиваются при использовании и со временем могут разрушиться. Износ отображается в строке повреждений под значком инструмента. Если полоса повреждений не отображается, значит инструмент находится в отличном состоянии. Инструменты могут быть восстановлены путем крафтинга, см. “Основы > Крафтинг”. +Mining tools are important to break all kinds of blocks. Weapons are another kind of tool. There are some other more specialized tools. Special actions of tools are usually done by right-click.=Инструменты добычи позволяют ломать все виды блоков. Оружие - тоже своеобразный инструмент, хотя есть и другие, более специализированные. Особое действие инструментов обычно используется правой кнопкой мыши. +When nothing is wielded, players use their hand which may act as tool and weapon. The hand is capable of punching and deals minimum damage.=Когда никакой предмет не держится в руках, игроки используют саму руку, которая может выступать в качестве инструмента и оружия. Рукой также можно ломать блоки и даже наносить небольшой урон. +Many tools will wear off when using them and may eventually get destroyed. The damage is displayed in a damage bar below the tool icon. If no damage bar is shown, the tool is in mint condition. Tools may be repairable by crafting, see “Basics > Crafting”.=Многие инструменты изнашиваются при использовании и со временем могут разрушиться. Прочность отображается полоской под иконкой инструмента. Если полоска повреждений не отображается, значит инструмент находится в первоначальном состоянии. Инструменты могут быть восстановлены путем крафтинга, см. “Основы > Крафтинг”. Weapons=Оружие Some items are usable as a melee weapon when wielded. Weapons share most of the properties of tools.=Некоторые предметы можно использовать в качестве оружия ближнего боя. Оружие сохраняет большинство свойств инструментов. Melee weapons deal damage by punching players and other animate objects. There are two ways to attack:=Оружие ближнего боя наносит урон при ударе по игрокам и другим живым объектам. Есть два способа атаковать: @@ -140,11 +140,11 @@ Melee weapons deal damage by punching players and other animate objects. There a There are two core attributes of melee weapons:=Есть два основных атрибута оружия ближнего боя: • Maximum damage: Damage which is dealt after a hit when the weapon was fully recovered=• Максимальный урон: урон, который наносится после удара, когда оружие полностью восстановлено • Full punch interval: Time it takes for fully recovering from a punch=• Интервал полного удара: время, необходимое для полного восстановления после удара -A weapon only deals full damage when it has fully recovered from a previous punch. Otherwise, the weapon will deal only reduced damage. This means, quick punching is very fast, but also deals rather low damage. Note the full punch interval does not limit how fast you can attack.=Оружие наносит полный урон только тогда, когда оно полностью восстановилось после предыдущего удара. В противном случае оружие будет наносить меньший урон. Это означает, что быстрый удар очень быстр, но наносит довольно низкий урон. Обратите внимание, что интервал полного удара не ограничивает скорость атаки. -There is a rule which sometimes makes attacks impossible: Players, animate objects and weapons belong to damage groups. A weapon only deals damage to those who share at least one damage group with it. So if you're using the wrong weapon, you might not deal any damage at all.=Есть правило, иногда делающее атаки невозможными: игроки, живые объекты и оружие принадлежат к некоторым к группам повреждений. Оружие наносит урон только тем, кто имеет хотя бы одну общую группу с ним. Так что, если вы используете «неправильное» оружие, то можете не нанести совсем никакого урона. +A weapon only deals full damage when it has fully recovered from a previous punch. Otherwise, the weapon will deal only reduced damage. This means, quick punching is very fast, but also deals rather low damage. Note the full punch interval does not limit how fast you can attack.=Оружие наносит полный урон только тогда, когда оно полностью восстановилось после предыдущего удара. В противном случае оружие будет наносить меньший урон. Это означает, что быстрые удары наносят довольно низкий урон. Обратите внимание, что интервал полного удара не ограничивает скорость атаки. +There is a rule which sometimes makes attacks impossible: Players, animate objects and weapons belong to damage groups. A weapon only deals damage to those who share at least one damage group with it. So if you're using the wrong weapon, you might not deal any damage at all.=Есть правило, иногда делающее атаки невозможными: игроки, живые объекты и оружие принадлежат к некоторым к группам повреждений. Оружие наносит урон только тем, кто имеет хотя бы одну общую группу с ним. Так что, если вы используете “неправильное” оружие, то можете не нанести совсем никакого урона. Pointing=Прицел -“Pointing” means looking at something in range with the crosshair. Pointing is needed for interaction, like mining, punching, using, etc. Pointable things include blocks, players, computer enemies and objects.=“Прицел” означает, что вы смотрите на цель через область с крестиком. Прицелиться нужно для таких вещей, как добыча, удар, использование и так далее. Нацеливаемыми вещами являются блоки, игроки, компьютерные враги и объекты. -To point something, it must be in the pointing range (also just called “range”) of your wielded item. There's a default range when you are not wielding anything. A pointed thing will be outlined or highlighted (depending on your settings). Pointing is not possible with the 3rd person front camera.=Чтобы прицелиться на что-то, это должно быть в пределах расстояния прицела (по-простому: «дальности») предмета, который вы держите в руках. Существует дальность по умолчанию, когда вы ничего не держите. Вещь под прицелом будет очерчена или подсвечена (в зависимости от настроек). Наведение невозможно выполнить с помощью фронтальной камеры 3-го лица. +“Pointing” means looking at something in range with the crosshair. Pointing is needed for interaction, like mining, punching, using, etc. Pointable things include blocks, players, computer enemies and objects.=“Прицел” означает, что вы смотрите на цель через область с крестиком. Прицеливание нужно для таких вещей, как добыча, удар, использование и так далее. Нацеливаемыми вещами являются блоки, игроки, компьютерные враги и объекты. +To point something, it must be in the pointing range (also just called “range”) of your wielded item. There's a default range when you are not wielding anything. A pointed thing will be outlined or highlighted (depending on your settings). Pointing is not possible with the 3rd person front camera.=Чтобы прицелиться на что-то, это должно быть в пределах расстояния прицела предмета, который вы держите в руках. Существует дальность по умолчанию, когда вы ничего не держите. Вещь под прицелом будет очерчена или подсвечена (в зависимости от настроек). Наведение невозможно выполнить с помощью фронтальной камеры 3-го лица. A few things can not be pointed. Most blocks are pointable. A few blocks, like air, can never be pointed. Other blocks, like liquids can only be pointed by special items.=На некоторые вещи нельзя нацелиться. Большинство блоков нацеливаемые, но некоторые, например, воздух, - нет. На блоки вроде жидкостей можно нацелиться только специальными предметами. Camera=Камера There are 3 different views which determine the way you see the world. The modes are:=Есть 3 различных способа видеть мир: @@ -152,42 +152,42 @@ There are 3 different views which determine the way you see the world. The modes • 2: Third-person view from behind=• 2: вид от третьего лица сзади; • 3: Third-person view from the front=• 3: вид от третьего лица спереди. You can change the camera mode by pressing [F7].=Вы можете изменить режим камеры, нажав клавишу [F7]. -You might be able to zoom with [Z] to zoom the view at the crosshair. This allows you to look further.=Вероятно, вы сможете увеличить масштаб вида в перекрестии с помощью [Z]. Это позволит вам смотреть дальше. +You might be able to zoom with [Z] to zoom the view at the crosshair. This allows you to look further.=Вы можете увеличить масштаб в перекрестии с помощью [Z]. Это позволит вам смотреть дальше. Zooming is a gameplay feature that might be enabled or disabled by the game. By default, zooming is enabled when in Creative Mode but disabled otherwise.=Масштабирование-это функция геймплея, которая может быть включена или отключена игрой. По умолчанию масштабирование включено в творческом режиме, но отключено в обычном. There is also Cinematic Mode which can be toggled with [F8]. With Cinematic Mode enabled, the camera movements become more smooth. Some players don't like it, it is a matter of taste.=Существует также кинематографический режим, который можно переключить с помощью [F8]. При включенном кинематографическом режиме движения камеры становятся более плавными. Некоторым игрокам это не нравится, это дело вкуса. By holding down [Z], you can zoom the view at your crosshair. You need the “zoom” privilege to do this.=Удерживая нажатой клавишу [Z], вы можете увеличить изображение в перекрестии прицела. Для этого вам нужна привилегия “zoom”. -• Switch camera mode: [F7]=• Переключение режима камеры: [F7]; -• Toggle Cinematic Mode: [F8]=• Переключение кинематографического режима: [F8]; -• Zoom: [Z]=• Масштабирование: [Z]. +• Switch camera mode: [F7]=• [F7] - переключение камеры +• Toggle Cinematic Mode: [F8]=• [F8] - переключение кинематографического режима +• Zoom: [Z]=• [Z] - приблизить Blocks=Блоки -The world of MineClone 2 is made entirely out of blocks (voxels, to be precise). Blocks can be added or removed with the correct tools.=Мир MineClone 2 полностью состоит из блоков (вокселей, если быть точными). Блоки могут быть добавлены или удалены с помощью правильно подобранных инструментов. -The world is made entirely out of blocks (voxels, to be precise). Blocks can be added or removed with the correct tools.=Мир целиком состоит из блоков (точнее, вокселей). Блоки могут быть добавлены или удалены с помощью правильно подобранных инструментов. +The world of MineClone 2 is made entirely out of blocks (voxels, to be precise). Blocks can be added or removed with the correct tools.=Мир MineClone 2 полностью состоит из блоков (вокселей, если быть точнее). Блоки могут быть добавлены или удалены с помощью правильных инструментов. +The world is made entirely out of blocks (voxels, to be precise). Blocks can be added or removed with the correct tools.=Мир целиком состоит из блоков (вокселей, если быть точнее). Блоки могут быть добавлены или удалены с помощью правильных инструментов. Blocks can have a wide range of different properties which determine mining times, behavior, looks, shape, and much more. Their properties include:=Блоки могут иметь широкий спектр различных свойств, которые определяют время добычи, поведение, внешний вид, форму и многое другое. Их свойства включают в себя: • Collidable: Collidable blocks can not be passed through; players can walk on them. Non-collidable blocks can be passed through freely=• Непроходимые: непроходимые блоки не могут быть пройдены насквозь; игроки могут ходить по ним. Проходимые блоки могут свободно пропускать вас сквозь себя • Pointable: Pointable blocks show a wireframe or a halo box when pointed. But you will just point through non-pointable blocks. Liquids are usually non-pointable but they can be pointed at by some special tools=• Нацеливаемые: нацеливаемые блоки демонстрируют свой контур или ореол, когда вы на них нацеливаетесь. Но через ненацеливаемые блоки ваш прицел просто пройдёт насквозь. Жидкости обычно не подлежат нацеливанию, но в них всё-таки можно целиться с помощью некоторых специальных инструментов -• Mining properties: By which tools it can be mined, how fast and how much it wears off tools=• Майнинговые свойства: с помощью каких инструментов можно добывать эти блоки и как быстро инструмент при этом изнашивается -• Climbable: While you are at a climbable block, you won't fall and you can move up and down with the jump and sneak keys=• Карабкательные: пока вы находитесь на блоке, по которому можно карабкаться, вы падаете и можете перемещаться вверх и вниз клавишами [Прыжок] и [Красться] +• Mining properties: By which tools it can be mined, how fast and how much it wears off tools=• Свойства добычи: с помощью каких инструментов можно добывать эти блоки и как быстро инструмент при этом изнашивается +• Climbable: While you are at a climbable block, you won't fall and you can move up and down with the jump and sneak keys=• Карабкательные: пока вы находитесь на блоке, по которому можно карабкаться, вы не упадете и можете перемещаться вверх и вниз клавишами [Прыжок] и [Красться] • Drowning damage: See the entry “Basics > Player”=• Наносящие урон как при утоплении: Смотрите запись “Основы > игрок” • Liquids: See the entry “Basics > Liquids”=• Жидкости: Смотрите запись “Основы > Жидкости” -• Group memberships: Group memberships are used to determine mining properties, crafting, interactions between blocks and more=• Членство в группах: Членство в группах используется для определения майнинговых и крафтинговых свойств, взаимодействий между блоками и другого -Mining=Майнинг (добывание) -Mining (or digging) is the process of breaking blocks to remove them. To mine a block, point it and hold down the left mouse button until it breaks.=Добывание (или копание) - это процесс разрушения блоков для их убирания. Чтобы добыть блок, нацельтесь на него указателем и удерживайте левую кнопку мыши, пока он не сломается. -Blocks require a mining tool to be mined. Different blocks are mined by different mining tools, and some blocks can not be mined by any tool. Blocks vary in hardness and tools vary in strength. Mining tools will wear off over time. The mining time and the tool wear depend on the block and the mining tool. The fastest way to find out how efficient your mining tools are is by just trying them out on various blocks. Any items you gather by mining will drop on the ground, ready to be collected.=Для добычи блоков требуется инструмент майнинга. Разные блоки добываются разными инструментами майнинга, а некоторые блоки не могут быть добыты никаким инструментом. Блоки различаются по твердости, а инструменты - по прочности. Майнинговые инструменты со временем изнашиваются. Время добывания и износ зависят и от блока, и от инструмента майнинга. Самый быстрый способ узнать, насколько эффективны ваши инструменты для майнинга, - это просто попробовать их на различных блоках. Любые предметы, которые вы извлечёте из блоков в качестве добычи, упадут на землю, готовые к сбору. -After mining, a block may leave a “drop” behind. This is a number of items you get after mining. Most commonly, you will get the block itself. There are other possibilities for a drop which depends on the block type. The following drops are possible:=При добыче (майнинге) блок может оставить после себя ”кусочек“. Это предметы, которые вы получаете в результате майнинга. Чаще всего вы получаете сам блок, но в зависимости от его типа блока, может быть следующие варианты: +• Group memberships: Group memberships are used to determine mining properties, crafting, interactions between blocks and more=• Членство в группах: Членство в группах используется для определения свойств крафта и добычи, взаимодействий между блоками и многое другое +Mining=Добывание +Mining (or digging) is the process of breaking blocks to remove them. To mine a block, point it and hold down the left mouse button until it breaks.=Добывание (или копание) это процесс разрушения блоков. Чтобы добыть блок, нацельтесь на него указателем и удерживайте левую кнопку мыши, пока он не сломается. +Blocks require a mining tool to be mined. Different blocks are mined by different mining tools, and some blocks can not be mined by any tool. Blocks vary in hardness and tools vary in strength. Mining tools will wear off over time. The mining time and the tool wear depend on the block and the mining tool. The fastest way to find out how efficient your mining tools are is by just trying them out on various blocks. Any items you gather by mining will drop on the ground, ready to be collected.=Для добычи блоков требуется инструмент для добычи. Разные блоки добываются разными инструментами, а некоторые блоки не могут быть добыты никаким инструментом. Блоки различаются по твёрдости, а инструменты - по силе добычи. Инструменты добычи со временем изнашиваются. Время добывания и износ зависят и от блока, и от инструмента. Самый быстрый способ узнать насколько эффективны ваши инструменты это просто попробовать их на различных блоках. Любые предметы, которые вы извлечёте из блоков в качестве добычи, выпадут на землю и их можно будет забрать. +After mining, a block may leave a “drop” behind. This is a number of items you get after mining. Most commonly, you will get the block itself. There are other possibilities for a drop which depends on the block type. The following drops are possible:=После добычи блок может оставить после себя ”дроп“. Это предметы, которые вы получаете в результате добычи. Чаще всего вы получаете сам блок, но в зависимости от его типа блока, может быть следующие варианты: • Always drops itself (the usual case)=• Всегда выпадает сам блок (обычный случай) • Always drops the same items=• Всегда выпадают одни и те же предметы -• Drops items based on probability=• Выпадающие предметы зависят от вероятности +• Drops items based on probability=• Выпадающие с некоторой вероятностью предметы • Drops nothing=• Ничего не выпадает Building=Строительство -Almost all blocks can be built (or placed). Building is very simple and has no delay.=Почти все блоки можно использовать для строительства (размещая их где-то). Это очень просто и происходит без задержек. -To build your wielded block, point at a block in the world and right-click. If this is not possible because the pointed block has a special right-click action, hold down the sneak key before right-clicking.=Чтобы установить блок, который вы держите в руке, нацельтесь на блок в мире и щелкните правой кнопкой мыши. Если это невозможно из-за того, что указательный блок имеет специальное действие щелчка правой кнопкой мыши, то зажмите клавишу [Красться] перед щелчком правой кнопки. +Almost all blocks can be built (or placed). Building is very simple and has no delay.=Почти все блоки можно использовать для строительства. Блоки строятся очень просто и без задержки. +To build your wielded block, point at a block in the world and right-click. If this is not possible because the pointed block has a special right-click action, hold down the sneak key before right-clicking.=Чтобы построить блок, который вы держите в руке, нацельтесь на блок в мире и щелкните правой кнопкой мыши. Если это невозможно из-за того, что нацеленный блок имеет специальное действие по щелчку правой кнопкой мыши, то зажмите клавишу [Красться] перед щелчком правой кнопки. Blocks can almost always be built at pointable blocks. One exception are blocks attached to the floor; these can only be built on the floor.=Блоки почти всегда могут быть построены на нацеливаемых блоках. Исключение составляют блоки, прикрепляемые к полу - они могут быть установлены только на полу. -Normally, blocks are built in front of the pointed side of the pointed block. A few blocks are different: When you try to build at them, they are replaced.=Обычно блоки строятся прямо перед блоком, в который вы целитесь, прямо перед стороной, на которую вы целитесь. Но несколько блоков ведут себя иначе: когда вы пытаетесь строить на них, они заменяются вашими новыми блоками. +Normally, blocks are built in front of the pointed side of the pointed block. A few blocks are different: When you try to build at them, they are replaced.=Обычно блоки строятся прямо перед блоком, в который вы целитесь, на той стороне, на которую вы целитесь. Но несколько блоков ведут себя иначе: когда вы пытаетесь строить на них, они заменяются вашими новыми блоками. Liquids=Жидкости -Liquids are special dynamic blocks. Liquids like to spread and flow to their surrounding blocks. Players can swim and drown in them.=Жидкости - это специальные динамические блоки. Жидкости любят распространяться и стекать по окружающим их блокам. Игроки могут плавать и тонуть в них. +Liquids are special dynamic blocks. Liquids like to spread and flow to their surrounding blocks. Players can swim and drown in them.=Жидкости это специальные динамические блоки. Жидкости распространяются и стекают по окружающим их блокам. Игроки могут плавать и тонуть в них. Liquids usually come in two forms: In source form (S) and in flowing form (F).=Жидкости могут быть двух видов: источник (S) и течение (F). -Liquid sources have the shape of a full cube. A liquid source will generate flowing liquids around it from time to time, and, if the liquid is renewable, it also generates liquid sources. A liquid source can sustain itself. As long it is left alone, a liquid source will normally keep its place and does not drain out.=Источники жидкостей имеют форму полного куба. Источник генерирует течение жидкости вокруг себя время от времени, и, если жидкость является возобновляемой, он также генерирует новые источники. Жидкий источник может поддерживать себя сам. Пока вы не трогаете источник, он, как правило, остаётся на месте и никуда не утекает. -Flowing liquids take a sloped form. Flowing liquids spread around the world until they drain. A flowing liquid can not sustain itself and always comes from a liquid source, either directly or indirectly. Without a liquid source, a flowing liquid will eventually drain out and disappear.=Текущие жидкости принимают наклонную форму. Они распространяются по всему миру, пока не пересохнут. Текучая жидкость не может поддерживать себя и всегда поступает из источника жидкости, прямо или непрямо. Без источника течение в конце концов высыхает и исчезает. +Liquid sources have the shape of a full cube. A liquid source will generate flowing liquids around it from time to time, and, if the liquid is renewable, it also generates liquid sources. A liquid source can sustain itself. As long it is left alone, a liquid source will normally keep its place and does not drain out.=Источники жидкостей имеют форму полного куба. Источник генерирует течение жидкости вокруг себя время от времени, и, если жидкость является возобновляемой, он также генерирует новые источники. Жидкий источник может поддерживать себя сам. Пока вы не трогаете источник, он, как правило, остаётся на месте и никуда сам не утекает. +Flowing liquids take a sloped form. Flowing liquids spread around the world until they drain. A flowing liquid can not sustain itself and always comes from a liquid source, either directly or indirectly. Without a liquid source, a flowing liquid will eventually drain out and disappear.=Текущие жидкости принимают наклонную форму. Они распространяются по всему миру, пока не пересохнут. Текучая жидкость не может поддерживать себя и всегда поступает из источника. Без источника течение в конце концов высыхает и исчезает. All liquids share the following properties:=Все жидкости обладают следующими свойствами: • All properties of blocks (including drowning damage)=• Все свойства блоков (включая урон от утопления) • Renewability: Renewable liquids can create new sources=• Возобновляемость: возобновляемые жидкости могут создавать новые источники @@ -196,69 +196,69 @@ All liquids share the following properties:=Все жидкости облада Renewable liquids create new liquid sources at open spaces (image 2). A new liquid source is created when:=Возобновляемые жидкости создают новые источники жидкости на открытых пространствах (рис.2). Новый источник жидкости создается, когда: • Two renewable liquid blocks of the same type touch each other diagonally=• Два возобновляемых жидкостных блока одного типа касаются друг друга по диагонали • These blocks are also on the same height=• При этом данные блоки находятся на одной высоте -• One of the two “corners” is open space which allows liquids to flow in=• Один из двух “углов” - это открытое пространство, которое позволяет жидкостям затекать в него +• One of the two “corners” is open space which allows liquids to flow in=• Один из двух “углов” это открытое пространство, которое позволяет жидкостям затекать в него When those criteria are met, the open space is filled with a new liquid source of the same type (image 3).=Если эти критерии выполнены, открытое пространство заполняется новым источником жидкости того же типа (рис.3). Swimming in a liquid is fairly straightforward: The usual direction keys for basic movement, the jump key for rising and the sneak key for sinking.=Плавать в жидкости довольно просто: обычные клавиши направления для основного движения, клавиша прыжка для подъема и клавиша подкрадывания для погружения. The physics for swimming and diving in a liquid are:=Физика плавания и погружения в жидкость такова: • The higher the viscosity, the slower you move=• Чем выше вязкость, тем медленнее вы двигаетесь -• If you rest, you'll slowly sink=• Если вы отдыхаете, то постепенно тонете -• There is no fall damage for falling into a liquid as such=Падение в жидкость не причиняет вам повреждений напрямую -• If you fall into a liquid, you will be slowed down on impact (but don't stop instantly). Your impact depth is determined by your speed and the liquid viscosity. For a safe high drop into a liquid, make sure there is enough liquid above the ground, otherwise you might hit the ground and take fall damage=• Если вы упадете в жидкость, вы будете замедлены перед ударом (но не остановлены мгновенно). Итоговая сила удара определяется вашей скоростью и вязкостью жидкости. Для безопасного высокого падения в жидкость убедитесь, что над землей достаточно жидкости, иначе вы можете удариться о землю и получить урон от падения +• If you rest, you'll slowly sink=• Если вы ничего не делаете, то постепенно начнёте тонуть +• There is no fall damage for falling into a liquid as such=Падение в жидкость не наносит урон от самого падения +• If you fall into a liquid, you will be slowed down on impact (but don't stop instantly). Your impact depth is determined by your speed and the liquid viscosity. For a safe high drop into a liquid, make sure there is enough liquid above the ground, otherwise you might hit the ground and take fall damage=• Если вы упадете в жидкость, вы будете замедлены перед ударом (но не остановлены мгновенно). Итоговая сила удара определяется вашей скоростью и вязкостью жидкости. Для безопасного падения в жидкость убедитесь, что над землей достаточно жидкости, иначе вы можете удариться о землю и всё-таки получить урон от падения Liquids are often not pointable. But some special items are able to point all liquids.=Жидкости часто ненацеливаемы. Но некоторые специальные предметы способны указывать на все жидкости. -Crafting=Крафтинг -Crafting is the task of combining several items to form a new item.=Крафтинг это комбинирование нескольких предметов для формирования нового предмета. -To craft something, you need one or more items, a crafting grid (C) and a crafting recipe. A crafting grid is like a normal inventory which can also be used for crafting. Items need to be put in a certain pattern into the crafting grid. Next to the crafting grid is an output slot (O). Here the result will appear when you placed items correctly. This is just a preview, not the actual item. Crafting grids can come in different sizes which limits the possible recipes you can craft.=Чтобы скрафтить что-либо, вам понадобятся исходные предметы, крафтинговая решётка (С) и рецепт. Решётка это как будто бы инвентарь, который можно использовать для крафтинга. Предметы должны быть помещены в решётку в определенном порядке. Результат появится сразу, как только вы правильно разместите предметы. Это ещё не сам предмет, а всего лишь предварительный просмотр. Решётки крафтинга могут быть разных размеров, размер ограничивает рецепты, которые вы можете использовать. -To complete the craft, take the result item from the output slot, which will consume items from the crafting grid and creates a new item. It is not possible to place items into the output slot.=Чтобы завершить крафтинг, возьмите результирующий предмет из выходного отсека. Он будет при этом создан, а предметы из решётки будут использованы для его производства. Выходной отсек предназначен только для извлечения предметов, складывать предметы в него нельзя. -A description on how to craft an item is called a “crafting recipe”. You need this knowledge to craft. There are multiple ways to learn crafting recipes. One way is by using a crafting guide, which contains a list of available crafting recipes. Some games provide crafting guides. There are also some mods which you can download online for installing a crafting guide. Another way is by reading the online manual of the game (if one is available).=Описания того, как создавать предметы, называются “рецептами”. Вам понадобятся эти знания для крафтинга различных предметов. Есть много способов узнавать рецепты. Один из них это использование встроенной книги рецептов, доступных вам с теми предметами, которые вы успели собрать. Некоторые игры предоставляют собственные руководства по крафтингу. Существуют моды, скачав и установив которые, вы получите дополнительные руководства. И, наконец, можно узнавать рецепты из онлайн-руководства к игре (если таковое имеется). -Crafting recipes consist of at least one input item and exactly one stack of output items. When performing a single craft, it will consume exactly one item from each stack of the crafting grid, unless the crafting recipe defines replacements.=Рецепты состоят, как минимум, из одного входного элемента и стопки выходных элементов. При выполнении единичного крафтинга будет употреблён ровно один предмет из каждой стопки в отсеках крафтинговой решётки, если только рецепт не предполагает замены. +Crafting=Крафт +Crafting is the task of combining several items to form a new item.=Крафт это комбинирование нескольких предметов для создания нового предмета. +To craft something, you need one or more items, a crafting grid (C) and a crafting recipe. A crafting grid is like a normal inventory which can also be used for crafting. Items need to be put in a certain pattern into the crafting grid. Next to the crafting grid is an output slot (O). Here the result will appear when you placed items correctly. This is just a preview, not the actual item. Crafting grids can come in different sizes which limits the possible recipes you can craft.=Чтобы скрафтить что-либо, вам понадобятся исходные предметы, сетка крафта и рецепт. Сетка крафта действует как инвентарь, который можно использовать для крафта. Предметы должны быть помещены в сетку крафта в определенном порядке. Результат появится сразу, как только вы правильно разместите предметы. Это ещё не сам предмет, а всего лишь предварительный просмотр. Сетки крафта могут быть разных размеров, размер ограничивает рецепты, которые вы можете использовать. +To complete the craft, take the result item from the output slot, which will consume items from the crafting grid and creates a new item. It is not possible to place items into the output slot.=Чтобы завершить крафт, возьмите получившийся предмет из выходного слота. Предмет будет при этом создан, а предметы из сетки будут использованы для его производства. Выходной слот предназначен только для извлечения предметов, складывать предметы в него нельзя. +A description on how to craft an item is called a “crafting recipe”. You need this knowledge to craft. There are multiple ways to learn crafting recipes. One way is by using a crafting guide, which contains a list of available crafting recipes. Some games provide crafting guides. There are also some mods which you can download online for installing a crafting guide. Another way is by reading the online manual of the game (if one is available).=Описание того, как создавать предметы, называются “рецептами”. Вам понадобятся эти знания для крафта различных предметов. Есть много способов узнавать рецепты. Один из них это использование встроенной книги рецептов, доступных вам с теми предметами, которые вы успели собрать. Некоторые игры предоставляют собственные руководства по крафту. Существуют моды, скачав и установив которые, вы получите дополнительные руководства. И, наконец, можно узнавать рецепты из онлайн-руководства к игре (если таковое имеется). +Crafting recipes consist of at least one input item and exactly one stack of output items. When performing a single craft, it will consume exactly one item from each stack of the crafting grid, unless the crafting recipe defines replacements.=Рецепты состоят, как минимум, из одного входного элемента и стака выходных элементов. При выполнении единичного крафта будет употреблён ровно один предмет из каждого стака в слотах сетки крафта, если только рецепт не предполагает замены. There are multiple types of crafting recipes:=Существует несколько типов рецептов: -• Shaped (image 2): Items need to be placed in a particular shape=• Фигурные (рис. 2): предметы должны быть выложены в виде определенной фигуры -• Shapeless (images 3 and 4): Items need to be placed somewhere in input (both images show the same recipe)=• Простые (изображения 3 и 4): предметы помещаются в произвольных отсеках на входе (оба изображения показывают один и тот же рецепт) +• Shaped (image 2): Items need to be placed in a particular shape=• Форменные (рис. 2): предметы должны быть выложены определенной формой +• Shapeless (images 3 and 4): Items need to be placed somewhere in input (both images show the same recipe)=• Бесформенные (изображения 3 и 4): предметы помещаются в произвольных слотах сетки крафта (оба изображения показывают один и тот же рецепт) • Cooking: Explained in “Basics > Cooking”=• Приготовление пищи: описано в разделе “Основы > Приготовление пищи” -• Repairing (image 5): Place two damaged tools into the crafting grid anywhere to get a tool which is repaired by 5%=• Ремонт (рис. 5): Два поврежденных инструмента помещаются в произвольные отсеки крафт-решётки, и на выходе получается инструмент, отремонтированный на 5% +• Repairing (image 5): Place two damaged tools into the crafting grid anywhere to get a tool which is repaired by 5%=• Ремонт (рис. 5): Два поврежденных инструмента помещаются в произвольные слоты сетки крафта, и на выходе получается инструмент, отремонтированный на 5% In some crafting recipes, some input items do not need to be a concrete item, instead they need to be a member of a group (see “Basics > Groups”). These recipes offer a bit more freedom in the input items. Images 6-8 show the same group-based recipe. Here, 8 items of the “stone” group are required, which is true for all of the shown items.=В некоторых рецептах некоторые предметы должны быть не какими-то конкретными, а просто принадлежать нужной группе предметов (см. “Основы > Группы”). Такие рецепты предлагают немного больше свободы в выборе входных предметов. На рисунках 6-8 показан один и тот же групповой рецепт. Здесь требуется 8 предметов из группы “Камни“, к которой относятся все показанные предметы. -Rarely, crafting recipes have replacements. This means, whenever you perform a craft, some items in the crafting grid will not be consumed, but instead will be replaced by another item.=В редких случаях в рецептах содержатся замены. Это означает, что при каждом крафтинге некоторые предметы из крафтинговой решётки не будут расходоваться, но будут заменяться другими предметами. +Rarely, crafting recipes have replacements. This means, whenever you perform a craft, some items in the crafting grid will not be consumed, but instead will be replaced by another item.=В редких случаях в рецептах содержатся замены. Это означает, что при каждом крафтинге некоторые предметы из сетки крафта не будут расходоваться, а будут заменяться другими предметами. Cooking=Приготовление еды -Cooking (or smelting) is a form of crafting which does not involve a crafting grid. Cooking is done with a special block (like a furnace), an cookable item, a fuel item and time in order to yield a new item.=Приготовление еды (или плавление) это вид крафтинга, для которой не требуется крафтинговая решётка. Приготовление пищи осуществляется с помощью специального блока (например, печи), приготавливаемого предмета, топливного предмета и времени, которое требуется для получения нового предмета. -Each fuel item has a burning time. This is the time a single item of the fuel keeps a furnace burning.=Каждый топливный предмет имеет своё время горения. В течение этого времени печь будет работать. +Cooking (or smelting) is a form of crafting which does not involve a crafting grid. Cooking is done with a special block (like a furnace), an cookable item, a fuel item and time in order to yield a new item.=Приготовление еды (или переплавка) это вид крафта, для которой не требуется сетка крафта. Приготовление пищи осуществляется с помощью специального блока (например, печи), ингредиента, топлива и времени, которое требуется для получения нового предмета. +Each fuel item has a burning time. This is the time a single item of the fuel keeps a furnace burning.=Каждое топливо имеет своё время горения. В течение этого времени печь будет работать. Each cookable item requires time to be cooked. This time is specific to the item type and the item must be “on fire” for the whole cooking time to actually yield the result.=Процесс готовки требует времени. Это время зависит от типа предмета, и продукт должен быть “на огне” в течение всего времени приготовления, чтобы вы получили желаемый результат. -Hotbar=Панель быстрого доступа -At the bottom of the screen you see some squares. This is called the “hotbar”. The hotbar allows you to quickly access the first items from your player inventory.=В нижней части экрана вы видите несколько квадратов. Это так называемая “Панель быстрого доступа“. Она позволяет быстро получать доступ к первым предметам вашего игрового инвентаря. +Hotbar=Хотбар +At the bottom of the screen you see some squares. This is called the “hotbar”. The hotbar allows you to quickly access the first items from your player inventory.=В нижней части экрана вы видите несколько квадратов. Это так называемая “Панель быстрого доступа“ или “Хотбар“. Она позволяет быстро получать доступ к первым предметам вашего инвентаря. You can change the selected item with the mouse wheel or the keyboard.=Вы можете выбирать предмет при помощи колесика мыши или при помощи клавиатуры. -• Select previous item in hotbar: [Mouse wheel up] or [B]=• Выбор предыдущего предмета панели: [Колёсико вверх] или [B] -• Select next item in hotbar: [Mouse wheel down] or [N]=• Выбор следующего предмета панели: [Колёсико вниз] или [N] -• Select item in hotbar directly: [1]-[9]=• Прямой выбор предмета панели: [1] - [9] -The selected item is also your wielded item.=Выбранный предмет на панели быстрого доступа также является вашим носимым предметом, который вы держите в руке. +• Select previous item in hotbar: [Mouse wheel up] or [B]=• [Колёсико вверх] или [B] - выбор предыдущего предмета хотбара +• Select next item in hotbar: [Mouse wheel down] or [N]=• [Колёсико вниз] или [N] - выбор следующего предмета хотбара +• Select item in hotbar directly: [1]-[9]=• [1-9] - прямой выбор предмета хотбара +The selected item is also your wielded item.=Выбранный предмет в хотбаре также является вашим носимым предметом, который вы держите в руке. Minimap=Миникарта -If you have a map item in any of your hotbar slots, you can use the minimap.=Если у вас есть карта (это такой предмет) в любом отсеке панели быстрого доступа, то вы можете пользоваться миникартой. +If you have a map item in any of your hotbar slots, you can use the minimap.=Если у вас есть предмет-карта в любом слоте хотбара, то вы можете пользоваться миникартой. Press [F9] to make a minimap appear on the top right. The minimap helps you to find your way around the world. Press it again to select different minimap modes and zoom levels. The minimap also shows the positions of other players.=Нажмите [F9], чтобы в правом верхнем углу появилась миникарта. Она поможет вам найти свой путь по всему миру. Нажмите его еще раз, чтобы выбирать различные режимы мини-карты и уровни масштабирования. Миникарта также показывает позиции других игроков. There are 2 minimap modes and 3 zoom levels.=Миникарта имеет 2 режима и 3 уровня масштабирования. Surface mode (image 1) is a top-down view of the world, roughly resembling the colors of the blocks this world is made of. It only shows the topmost blocks, everything below is hidden, like a satellite photo. Surface mode is useful if you got lost.=Режим поверхности (рис. 1) это вид на мир сверху с приблизительным воспроизведением цветов блоков из которых этот мир состоит. В этом режиме видны только самые верхние блоки, а всё, что ниже, скрыто, как на спутниковой фотографии. Режим поверхности полезен, если вы заблудились. Radar mode (image 2) is more complicated. It displays the “denseness” of the area around you and changes with your height. Roughly, the more green an area is, the less “dense” it is. Black areas have many blocks. Use the radar to find caverns, hidden areas, walls and more. The rectangular shapes in image 2 clearly expose the position of a dungeon.=Режим радара (рис. 2) более сложный. Он отображает “плотность“ области вокруг вас и изменяется с вашей высотой. Проще говоря, чем больше на карте зелёного цвета, тем данный участок менее “плотный”. Чёрные области содержат много блоков. Используйте радар, чтобы находить пещеры, скрытые области, стены и многое другое. Прямоугольные формы на рисунке 2 ясно показывают местонахождение подземелья. There are also two different rotation modes. In “square mode”, the rotation of the minimap is fixed. If you press [Shift]+[F9] to switch to “circle mode”, the minimap will instead rotate with your looking direction, so “up” is always your looking direction.=Существует также два различных режима вращения. В “квадратном режиме” вращение миникарты фиксируется. Если вы нажмете [Shift]+[F9], чтобы переключиться в “режим круга”, миникарта будет вращаться в соответствии с вашим направлением взгляда, поэтому “вверх” всегда будет вашим направлением взгляда. In some games, the minimap may be disabled.=В некоторых играх миникарта может быть отключена. -• Toggle minimap mode: [F9]=• Переключение режима миникарты: [F9] -• Toggle minimap rotation mode: [Shift]+[F9]=• Переключение режима вращения миникарты: [Shift]+[F9] +• Toggle minimap mode: [F9]=• [F9] - переключение режима миникарты +• Toggle minimap rotation mode: [Shift]+[F9]=• [Shift]+[F9] - Переключение вращения миникарты Inventory=Инвентарь -Inventories are used to store item stacks. There are other uses, such as crafting. An inventory consists of a rectangular grid of item slots. Each item slot can either be empty or hold one item stack. Item stacks can be moved freely between most slots.=Инвентари используются для хранения стопок предметов. Есть и другое их применение, например, крафтинг. Инвентарь состоит из прямоугольной решётки отсеков для предметов. Каждый отсек может быть либо пустым, либо содержать одну стопку предметов. Стопки предметов можно свободно перемещать между большей частью отсеков. -You have your own inventory which is called your “player inventory”, you can open it with the inventory key (default: [I]). The first inventory slots are also used as slots in your hotbar.=У вас есть ваш собственный инвентарь, который называется “инвентарь игрока”, вы можете открыть его нажатием клавиши инвентаря (по умолчанию это [I]). Первый ряд отсеков вашего инвентаря будут отображаться на панели быстрого доступа. +Inventories are used to store item stacks. There are other uses, such as crafting. An inventory consists of a rectangular grid of item slots. Each item slot can either be empty or hold one item stack. Item stacks can be moved freely between most slots.=Инвентари используются для хранения стаков предметов. Есть и другое их применение, например, крафт. Инвентарь состоит из прямоугольной решётки слотов для предметов. Каждый слот может быть либо пустым, либо содержать один стак предметов. Стаки предметов можно свободно перемещать между большей частью слотов. +You have your own inventory which is called your “player inventory”, you can open it with the inventory key (default: [I]). The first inventory slots are also used as slots in your hotbar.=У вас есть ваш собственный инвентарь, который называется “инвентарь игрока”, вы можете открыть его нажатием клавиши инвентаря (по умолчанию это [I]). Первый ряд слотов вашего инвентаря будут отображаться в хотбаре. Blocks can also have their own inventory, e.g. chests and furnaces.=Блоки также могут иметь свой собственный инвентарь, например сундуки и печи. Inventory controls:=Управление инвентарём: -Taking: You can take items from an occupied slot if the cursor holds nothing.=Взятие: вы можете брать предметы из занятого отсека, если не держите предмет курсором в этот момент. -• Left click: take entire item stack=• Клик левой: взятие всей стопки предметов -• Right click: take half from the item stack (rounded up)=• Клик правой: взятие половины стопки предметов (округлённо) -• Middle click: take 10 items from the item stack=• Клик средней: взятие 10 предметов из стопки предметов -• Mouse wheel down: take 1 item from the item stack=• Колесо вниз: взятие 1 предмета из стопки предметов -Putting: You can put items onto a slot if the cursor holds 1 or more items and the slot is either empty or contains an item stack of the same item type.=Выкладывание: вы можете помещать предметы в отсек, если ваш курсор удерживает 1 или более предмет, а отсек пуст, либо содержит стопку таких же предметов. -• Left click: put entire item stack=• Клик левой: положить всю стопку предметов -• Right click: put 1 item of the item stack=• Клик правой: положить только 1 предмет из всей удерживаемой курсором стопки -• Right click or mouse wheel up: put 1 item of the item stack=• Клик правой или колёсико вверх: положить 1 предмет из удерживаемой курсором стопки -• Middle click: put 10 items of the item stack=• Клик средней: положить 10 предметов из удерживаемой курсором стопки -Exchanging: You can exchange items if the cursor holds 1 or more items and the destination slot is occupied by a different item type.=Обмен: Вы можете обменять предметы, если курсор удерживает 1 или более предметов, а целевой отсек занят другими предметами. -• Click: exchange item stacks=• Клик: обмен стопок предметов -Throwing away: If you hold an item stack and click with it somewhere outside the menu, the item stack gets thrown away into the environment.=Выбрасывание: если вы, держа на курсоре стопку предметов, кликнете ей за пределами меню, то вся стопка выбрасывается в окружающую среду. -Quick transfer: You can quickly transfer an item stack to/from the player inventory to/from another item's inventory slot like a furnace, chest, or any other item with an inventory slot when that item's inventory is accessed. The target inventory is generally the most relevant inventory in this context.=Быстрая передача: вы можете быстро передавать стопки предметов между вашим личным инвентарём и инвентарём другого предмета (печи, сундука или любого другого, имеющего инвентарный отсек) во время доступа к эту предмету. Обычно это используется для загрузки/выгрузки нужных предметов. -• Sneak+Left click: Automatically transfer item stack=• [Красться]+Клик левой: автоматическая передача стопки предметов +Taking: You can take items from an occupied slot if the cursor holds nothing.=Взятие: вы можете брать предметы из слота, если не держите предмет курсором в этот момент. +• Left click: take entire item stack=• [Левая кнопка мыши] - взять весь стак предметов +• Right click: take half from the item stack (rounded up)=• [Правая кнопка мыши] - взять половину стака предметов (округляется вверх) +• Middle click: take 10 items from the item stack=• [Средняя кнопка мыши] - взять 10 предметов из стака предметов +• Mouse wheel down: take 1 item from the item stack=• [Колёсико вниз] - взять 1 предмет из стака предметов +Putting: You can put items onto a slot if the cursor holds 1 or more items and the slot is either empty or contains an item stack of the same item type.=Выкладывание: вы можете помещать предметы в слот, если ваш курсор удерживает 1 или более предмет, а слот пуст, либо содержит стак таких же предметов. +• Left click: put entire item stack=• [Левая кнопка мыши] - положить весь стак предметов +• Right click: put 1 item of the item stack=• [Правая кнопка мыши] - положить только 1 предмет из всей удерживаемого курсором стака +• Right click or mouse wheel up: put 1 item of the item stack=• [Правая кнопка мыши] или [Колёсико вверх] - положить 1 предмет из удерживаемого курсором стака +• Middle click: put 10 items of the item stack=• [Средняя кнопка мыши] - положить 10 предметов из удерживаемого курсором стака +Exchanging: You can exchange items if the cursor holds 1 or more items and the destination slot is occupied by a different item type.=Обмен: Вы можете обменять предметы, если курсор удерживает 1 или более предметов, а целевой слот занят другими предметами. +• Click: exchange item stacks=• [Левая кнопка мыши] - обменять стаки предметов +Throwing away: If you hold an item stack and click with it somewhere outside the menu, the item stack gets thrown away into the environment.=Выбрасывание: если вы возьмете стак предметов и кликнете им за пределами меню, то весь стак выбрасывается в окружающую среду. +Quick transfer: You can quickly transfer an item stack to/from the player inventory to/from another item's inventory slot like a furnace, chest, or any other item with an inventory slot when that item's inventory is accessed. The target inventory is generally the most relevant inventory in this context.=Быстрая передача: вы можете быстро передавать стаки предметов между вашим личным инвентарём и инвентарём другого предмета (печи, сундука или любого другого, имеющего инвентарный слот) во время доступа к эту предмету. Обычно это используется для загрузки/выгрузки нужных предметов. +• Sneak+Left click: Automatically transfer item stack=• [Красться]+[Левая кнопка] - автоматическая передача стака предметов Online help=Онлайн-помощь You may want to check out these online resources related to MineClone 2.=Возможно, вы захотите ознакомиться с этими онлайн-ресурсами, связанными с MineClone 2. MineClone 2 download and forum discussion: =Официальный форум MineClone 2: @@ -268,18 +268,18 @@ Report bugs here.=С помощью баг-трекера можно сообщ Minetest links:=Ссылки Minetest: You may want to check out these online resources related to Minetest:=Возможно, вы захотите посетить эти онлайн-ресурсы, связанные с Minetest: Official homepage of Minetest: =Официальная домашняя страница Minetest: -The main place to find the most recent version of Minetest, the engine used by MineClone 2.=Это основное место для скачивания свежих версий Minetest (Minetest это «движок», используемый MineClone 2). +The main place to find the most recent version of Minetest, the engine used by MineClone 2.=Это основное место для скачивания свежих версий Minetest, движка, используемого MineClone 2. The main place to find the most recent version of Minetest.=Это основное место для скачивания свежих версий Minetest. Community wiki: =Wiki сообщества: -A community-based documentation website for Minetest. Anyone with an account can edit it! It also features a documentation of Minetest Game.=Веб-сайт документации сообщества. Любой, у кого есть учетная запись, может её редактировать! Там много документации по игре Minetest. +A community-based documentation website for Minetest. Anyone with an account can edit it! It also features a documentation of Minetest Game.=Веб-сайт документации сообщества. Любой, у кого есть учетная запись, может её редактировать! Там много документации по Minetest Game. Minetest forums: =Форумы Minetest: -A web-based discussion platform where you can discuss everything related to Minetest. This is also a place where player-made mods and games are published and discussed. The discussions are mainly in English, but there is also space for discussion in other languages.=Интернет-форумы, где вы можете обсудить все, что связано с Minetest. Это также место, где публикуются и обсуждаются игры и моды, сделанные игроками. Дискуссии ведутся в основном на английском языке, но есть также место для дискуссий и на других языках. +A web-based discussion platform where you can discuss everything related to Minetest. This is also a place where player-made mods and games are published and discussed. The discussions are mainly in English, but there is also space for discussion in other languages.=Интернет-форумы, где вы можете обсудить все, что связано с Minetest. Это также место, где публикуются и обсуждаются игры и моды, сделанные игроками. Дискуссии ведутся в основном на английском языке, но есть также раздел для дискуссий и на других языках. Chat: =Чат: A generic Internet Relay Chat channel for everything related to Minetest where people can meet to discuss in real-time. If you do not understand IRC, see the Community Wiki for help.=Универсальный IRC-чат-канал для всего, связанного с Minetest, где люди могут встретиться для общения в режиме реального времени. Если вы не разбираетесь в IRC, обратитесь за помощью к Wiki. Groups=Группы -Items, players and objects (animate and inanimate) can be members of any number of groups. Groups serve multiple purposes:=Предметы, игроки и объекты (одушевленные и неодушевленные) могут быть членами любого количества групп. Группы выполняют несколько задач: -• Crafting recipes: Slots in a crafting recipe may not require a specific item, but instead an item which is a member of a particular group, or multiple groups=• Рецепты: один из входных отсеков решётки крафтинга может занять не строго определённый предмет, а один из предметов, принадлежащих одной или нескольким группам -• Digging times: Diggable blocks belong to groups which are used to determine digging times. Mining tools are capable of digging blocks belonging to certain groups=• Время выкапывания: Копаемые блоки принадлежат группам, имеющим определённое время копания. Инструментами майнинга можно добывать блоки, принадлежащие определенным группам +Items, players and objects (animate and inanimate) can be members of any number of groups. Groups serve multiple purposes:=Предметы, игроки и объекты (живые и нет) могут быть членами любого количества групп. Группы выполняют несколько задач: +• Crafting recipes: Slots in a crafting recipe may not require a specific item, but instead an item which is a member of a particular group, or multiple groups=• Рецепты: один из входных слотов сетки крафта может занять не строго определённый предмет, а один из предметов, принадлежащих одной или нескольким группам +• Digging times: Diggable blocks belong to groups which are used to determine digging times. Mining tools are capable of digging blocks belonging to certain groups=• Время добывания: Копаемые блоки принадлежат группам, имеющим определённое время добычи. Инструментами добычи можно добывать блоки, принадлежащие определенным группам • Block behavior: Blocks may show a special behaviour and interact with other blocks when they belong to a particular group=• Поведение блоков: блоки могут вести себя необычным образом и взаимодействовать с другими блоками, если принадлежат определенной группе • Damage and armor: Objects and players have armor groups, weapons have damage groups. These groups determine damage. See also: “Basics > Weapons”=• Урон и защита: у объектов и игроков есть группы защиты, а у оружия - группы причиняемого урона. Эти группы позволяют определить урон. Смотри также: “Основы > Оружие” • Other uses=• И прочее @@ -287,110 +287,110 @@ In the item help, many important groups are usually mentioned and explained.=В Glossary=Глоссарий This is a list of commonly used terms:=Это список часто используемых терминов: Controls:=Управление: -• Wielding: Holding an item in hand=• Wielding (Владеть/Держать/Нести/Удерживать): держать предмет в руке -• Pointing: Looking with the crosshair at something in range=• Pointing (Наведение/Нацеливание/Прицел/Взгляд): смотреть через прицел в виде крестика на что-либо в пределах вашей досягаемости -• Dropping: Throwing an item or item stack to the ground=• Dropping (Выпадание): бросание предмета или стопки предметов на землю -• Punching: Attacking with left-click, is also used on blocks=• Punching (Удар/Стуканье): атака с помощью щелчка левой кнопкой мыши, применяется и к блокам -• Sneaking: Walking slowly while (usually) avoiding to fall over edges=• Sneaking (Красться/Подкрадывание): идти медленно, избегая опасности падения с края блока -• Climbing: Moving up or down a climbable block=• Climbing (Карабкаться/Скалолазание): перемещение вверх или вниз по блоку, позволяющему по нему карабкаться +• Wielding: Holding an item in hand=• Владеть/Держать/Нести/Удерживать: держать предмет в руке +• Pointing: Looking with the crosshair at something in range=• Наведение/Нацеливание/Прицел/Взгляд: смотреть через прицел в виде крестика на что-либо в пределах вашей досягаемости +• Dropping: Throwing an item or item stack to the ground=• Выпадание/Дроп: бросание предмета или стака предметов на землю +• Punching: Attacking with left-click, is also used on blocks=• Удар: атака с помощью щелчка левой кнопкой мыши, применяется и к блокам +• Sneaking: Walking slowly while (usually) avoiding to fall over edges=• Подкрадывание: идти медленно, избегая опасности падения с края блока +• Climbing: Moving up or down a climbable block=• Карабкаться: перемещение вверх или вниз по блоку, позволяющему по нему карабкаться Blocks:=Блоки: • Block: Cubes that the worlds are made of=• Блоки: кубики, из которых состоят миры -• Mining/digging: Using a mining tool to break a block=• Майнинг/копание/добывание: использование инструмента майнинга для разрушения блока -• Building/placing: Putting a block somewhere=• Строительство/размещение/установка/укладывание: установка блока где-либо в мире +• Mining/digging: Using a mining tool to break a block=• Добывание/майнинг/копание: использование добывающего инструмента для разрушения блока +• Building/placing: Putting a block somewhere=• Строительство/размещение/установка/укладывание: постройка блока где-либо в мире • Drop: Items you get after mining a block=• Выбрасывание/Выпадание: появление предметов в результате добывания блоков • Using a block: Right-clicking a block to access its special function=• Использование блока: клик правой по блоку для доступа к его специальной функции Items:=Предметы: -• Item: A single thing that players can possess=• Предмет: единственная вещь, которой могут обладать игроки -• Item stack: A collection of items of the same kind=• Стопка предметов: набор одинаковых предметов -• Maximum stack size: Maximum amount of items in an item stack=• Максимальный размер стопки: максимальное количество предметов в стопке -• Slot / inventory slot: Can hold one item stack=• Отсек / отсек инвентаря: может вместить одну стопку предметов -• Inventory: Provides several inventory slots for storage=• Инвентарь: содержит несколько отсеков инвентаря для хранения +• Item: A single thing that players can possess=• Предмет: вещь, которой могут обладать игроки +• Item stack: A collection of items of the same kind=• Стак предметов: набор одинаковых предметов +• Maximum stack size: Maximum amount of items in an item stack=• Максимальный размер стака: максимальное количество предметов в стаке +• Slot / inventory slot: Can hold one item stack=• Слот инвентаря: может вместить один стак предметов +• Inventory: Provides several inventory slots for storage=• Инвентарь: содержит несколько слотов инвентаря для хранения • Player inventory: The main inventory of a player=• Инвентарь игрока: основной инвентарь игрока, который находится непосредственно при нём • Tool: An item which you can use to do special things with when wielding=• Инструмент: предмет, держа который в руке, можно совершать какие-либо специальные действия с блоками • Range: How far away things can be to be pointed by an item=• Диапазон: как далеко могут находиться вещи, на которые нацелен предмет -• Mining tool: A tool which allows to break blocks=• Инструмент майнинга: инструмент, который позволяет разбивать блоки -• Craftitem: An item which is (primarily or only) used for crafting=• Ингредиент: предмет, который преимущественно используется для крафтинга (создания) новых предметов +• Mining tool: A tool which allows to break blocks=• Добывающий инструмент: инструмент, который позволяет разбивать блоки +• Craftitem: An item which is (primarily or only) used for crafting=• Материал: предмет, который преимущественно используется для крафта (создания) новых предметов Gameplay:=Игровой процесс: -• “heart”: A single health symbol, indicates 2 HP=• “сердечко”: часть индикатора здоровья, обозначает 2 HP -• “bubble”: A single breath symbol, indicates 1 BP=• “пузырёк“: часть индикатора дыхания, обозначает 1 BP -• HP: Hit point (equals half 1 “heart”)=• HP: Hit point (половинка сердечка, переводится как “единица удара”) -• BP: Breath point, indicates breath when diving=• BP: Breath point (целый пузырёк, переводится как “единица дыхания”) отображает состояние дыхания при погружении +• “heart”: A single health symbol, indicates 2 HP=• “Сердечко”: часть индикатора здоровья, обозначает 2 очка здоровья (HP) +• “bubble”: A single breath symbol, indicates 1 BP=• “Пузырёк“: часть индикатора дыхания, обозначает 1 очко дыхания (BP) +• HP: Hit point (equals half 1 “heart”)=• HP: очко здоровья (половинка “сердечка”) +• BP: Breath point, indicates breath when diving=• BP: очко дыхания, отображает состояние дыхания при погружении • Mob: Computer-controlled enemy=• Моб: управляемый компьютером враг -• Crafting: Combining multiple items to create new ones=• Крафтинг: комбинирование нескольких предметов для создания новых +• Crafting: Combining multiple items to create new ones=• Крафт: комбинирование нескольких предметов для создания новых • Crafting guide: A helper which shows available crafting recipes=• Книга рецептов: помощник, который показывает доступные рецепты • Spawning: Appearing in the world=• Спаунинг: появление в мире -• Respawning: Appearing again in the world after death=• Возрождение (респаунинг): появление снова в мире после смерти +• Respawning: Appearing again in the world after death=• Возрождение (респавн): появление снова в мире после смерти • Group: Puts similar things together, often affects gameplay=• Группа: объединяет похожие вещи, часто влияет на игровой процесс • noclip: Allows to fly through walls=• noclip (ноуклип): позволяет летать сквозь стены Interface=Интерфейс -• Hotbar: Inventory slots at the bottom=• Панель быстрого доступа: отсеки для инвентаря внизу +• Hotbar: Inventory slots at the bottom=• Панель быстрого доступа/хотбар: слоты инвентаря внизу • Statbar: Indicator made out of half-symbols, used for health and breath=• Панель состояния: индикатор, сделанный из полусимволов, используемый для здоровья и дыхания • Minimap: The map or radar at the top right=• Миникарта: карта или радар в правом верхнем углу • Crosshair: Seen in the middle, used to point at things=• Перекрестие: видно посередине, используется для нацеливания на предметы Online multiplayer:=Сетевая многопользовательская игра: • PvP: Player vs Player. If active, players can deal damage to each other=• PvP: игрок против игрока. Если включено, игроки могут наносить урон друг другу • Griefing: Destroying the buildings of other players against their will=• Грифинг: разрушение зданий других игроков против их воли -• Protection: Mechanism to own areas of the world, which only allows the owners to modify blocks inside=• Защита: механизм присваивания себе некоторых областей мира, позволяющий владельцам запретить изменять блоки внутри этих областей всем, кроме себя, либо ограниченного списка друзей +• Protection: Mechanism to own areas of the world, which only allows the owners to modify blocks inside=• Защита/приват: механизм присваивания себе некоторых областей мира, позволяющий владельцам запретить изменять блоки внутри этих областей всем, кроме себя, либо ограниченного списка друзей Technical terms:=Технические условия: • Minetest: This game engine=• Minetest: движок этой игры • MineClone 2: What you play right now=• MineClone 2: то, во что вы играете прямо сейчас • Minetest Game: A game for Minetest by the Minetest developers=• Minetest Game: игра для Minetest от разработчиков Minetest • Game: A complete playing experience to be used in Minetest; such as a game or sandbox or similar=• Игра: весь игровой процесс, принятый в Minetest; например, обычная игра, или песочница, или подобное -• Mod: A single subsystem which adds or modifies functionality; is the basic building block of games and can be used to further enhance or modify them=• Мод: отдельная подсистема, которая добавляет или изменяет функциональность; является основным способом конструирования игр и может быть использована для дальнейшего улучшения или изменения их +• Mod: A single subsystem which adds or modifies functionality; is the basic building block of games and can be used to further enhance or modify them=• Мод: отдельная подсистема, которая добавляет или изменяет функциональность; является основным способом конструирования игр и может быть использована для их дальнейшего улучшения или изменения • Privilege: Allows a player to do something=• Привилегия: позволяет игроку что-то делать -• Node: Other word for “block”=• Узел: другое слово для обозначения “блока” +• Node: Other word for “block”=• Узел/нода: другое слово для обозначения “блока” Settings=Настройки There is a large variety of settings to configure Minetest. Pretty much every aspect can be changed that way.=Существует много разнообразных настроек Minetest. Почти каждый аспект игры может быть изменён. These are a few of the most important gameplay settings:=Вот некоторые наиболее важные настройки: • Damage enabled (enable_damage): Enables the health and breath attributes for all players. If disabled, players are immortal=• Урон (enable_damage): включает здоровье и дыхание для всех игроков. Если он выключен, то все игроки бессмертны • Creative Mode (creative_mode): Enables sandbox-style gameplay focusing on creativity rather than a challenging gameplay. The meaning depends on the game; usual changes are: Reduced dig times, easy access to almost all items, tools never wear off, etc.=• Творческий режим (creative_mode): позволяет играть в стиле песочницы, сосредоточившись на творчестве, а не на сложном игровом процессе. Смысл зависит от конкретной игры. Основные черты: ускоренное время копания, мгновенный доступ почти ко всем предметам, отсутствует износ инструментов и пр. -• PvP (enable_pvp): Short for “Player vs Player”. If enabled, players can deal damage to each other=• PvP (enable_pvp): “Игрок против игрока”. Если этот режим включён, игроки могут наносить урон друг другу +• PvP (enable_pvp): Short for “Player vs Player”. If enabled, players can deal damage to each other=• PvP (enable_pvp): “игрок против игрока”. Если этот режим включён, игроки могут наносить урон друг другу For a full list of all available settings, use the “All Settings” dialog in the main menu.=Для получения полного списка настроек вы можете перейти в ”Настройки - Все настройки“ в главном меню Minetest. Movement modes=Режимы передвижения You can enable some special movement modes that change how you move.=Вы можете включать специальные режимы вашего перемещения. -Pitch movement mode:=Движение под уклоном -• Description: If this mode is activated, the movement keys will move you relative to your current view pitch (vertical look angle) when you're in a liquid or in fly mode.=• Описание: при активации этого режима клавиши будут перемещать вас в соответствии с вашим текущим углом обзора, если вы находитесь в жидкости или в режиме полёта. -• Default key: [L]=• Клавиша по умолчанию: [L] +Pitch movement mode:=Режим движения по направлению взгляда +• Description: If this mode is activated, the movement keys will move you relative to your current view pitch (vertical look angle) when you're in a liquid or in fly mode.=• Описание: при активации этого режима клавиши будут перемещать вас относительно направления взгляда игрока когда вы находитесь в жидкости или в режиме полёта. +• Default key: [L]=• [L] - по умолчанию • No privilege required=• Никаких привилегий не требуется Fast mode:=Быстрый режим -• Description: Allows you to move much faster. Hold down the the “Use” key [E] to move faster. In the client configuration, you can further customize fast mode.=• Описание: позволяет двигаться гораздо быстрее. Удерживайте нажатой клавишу “Use “[E], чтобы двигаться быстрее. В конфигурации клиента вы можете дополнительно настроить быстрый режим. -• Default key: [J]=• Клавиша по умолчанию: [J] +• Description: Allows you to move much faster. Hold down the the “Use” key [E] to move faster. In the client configuration, you can further customize fast mode.=• Описание: позволяет двигаться гораздо быстрее. Удерживайте нажатой клавишу [E], чтобы двигаться быстрее. В конфигурации клиента вы можете дополнительно настроить быстрый режим. +• Default key: [J]=• [J] - по умолчанию • Required privilege: fast=• Требуемые привилегии: fast Fly mode:=Режим полёта: -• Description: Gravity doesn't affect you and you can move freely in all directions. Use the jump key to rise and the sneak key to sink.=• Описание: гравитация не влияет на вас, и вы можете свободно перемещаться во всех направлениях. клавишу прыжка, чтобы подниматься, и клавишу [Красться], чтобы опускаться. -• Default key: [K]=• Клавиша по умолчанию: [K] +• Description: Gravity doesn't affect you and you can move freely in all directions. Use the jump key to rise and the sneak key to sink.=• Описание: гравитация не влияет на вас, и вы можете свободно перемещаться во всех направлениях. [Прыжок], чтобы взлететь выше, и клавишу [Красться], чтобы опуститься. +• Default key: [K]=• [K] - по умолчанию • Required privilege: fly=• Требуемые привилегии: fly Noclip mode:=Режим прохождения сквозь стены (Noclip): • Description: Allows you to move through walls. Only works when fly mode is enabled, too.=• Описание: позволяет перемещаться сквозь стены. Работает только тогда, когда включен режим полета. -• Default key: [H]=• Клавиша по умолчанию: [H] +• Default key: [H]=• [H] - по умолчанию • Required privilege: noclip=• Требуемые привилегии: noclip Console=Консоль With [F10] you can open and close the console. The main use of the console is to show the chat log and enter chat messages or server commands.=С помощью [F10] вы можете открывать и закрывать консоль. Основное назначение консоли - показывать журнал чата и вводить сообщения чата или команды сервера. Using the chat or server command key also opens the console, but it is smaller and will be closed after you sent a message.=Использование чата или клавиши для отправки команд также открывает консоль, но меньшего размера, и будет закрываться сразу после отправки сообщения. Use the chat to communicate with other players. This requires you to have the “shout” privilege.=Используйте чат для общения с другими игроками. Для этого требуется привилегия ”shout“. Just type in the message and hit [Enter]. Public chat messages can not begin with “/”.=Просто введите сообщение и нажмите [Enter]. Сообщения чата не могут начинаться с “/“. -You can send private messages: Say “/msg ” in chat to send “” which can only be seen by .=Вы можете отправлять приватные сообщения: скажите “/msg <игрок> <сообщение>” в чате, чтобы отправить “<сообщение>”, который сможет увидеть только <игрок>. +You can send private messages: Say “/msg ” in chat to send “” which can only be seen by .=Вы можете отправлять приватные сообщения: напишите “/msg <игрок> <сообщение>” в чате, чтобы отправить “<сообщение>”, который сможет увидеть только <игрок>. There are some special controls for the console:=Клавиши специального управления консолью: -• [F10] Open/close console=• [F10] открыть/закрыть консоль -• [Enter]: Send message or command=• [Enter]: Отправить сообщение или команду -• [Tab]: Try to auto-complete a partially-entered player name=• [Tab]: попытаться автоматически дополнить частично введённое имя игрока -• [Ctrl]+[Left]: Move cursor to the beginning of the previous word=• [Ctrl]+[Left]: переместить курсор в начало предыдущего слова -• [Ctrl]+[Right]: Move cursor to the beginning of the next word=• [Ctrl]+[Right]: переместить курсор в начало следующего слова -• [Ctrl]+[Backspace]: Delete previous word=• [Ctrl]+[Backspace]: удалить предыдущее слово -• [Ctrl]+[Delete]: Delete next word=• [Ctrl]+[Delete]: удалить следующее слово -• [Ctrl]+[U]: Delete all text before the cursor=• [Ctrl]+[U]: удалить весь текст перед курсором -• [Ctrl]+[K]: Delete all text after the cursor=• [Ctrl]+[K]: удалить весь текст после курсора -• [Page up]: Scroll up=• [Page up]: прокрутка вверх -• [Page down]: Scroll down=• [Page down]: прокрутка вниз +• [F10] Open/close console=• [F10] - открыть/закрыть консоль +• [Enter]: Send message or command=• [Enter] - отправить сообщение или команду +• [Tab]: Try to auto-complete a partially-entered player name=• [Tab] - попытаться автоматически дополнить частично введённое имя игрока +• [Ctrl]+[Left]: Move cursor to the beginning of the previous word=• [Ctrl]+[Left] - переместить курсор в начало предыдущего слова +• [Ctrl]+[Right]: Move cursor to the beginning of the next word=• [Ctrl]+[Right] - переместить курсор в начало следующего слова +• [Ctrl]+[Backspace]: Delete previous word=• [Ctrl]+[Backspace] - удалить предыдущее слово +• [Ctrl]+[Delete]: Delete next word=• [Ctrl]+[Delete] - удалить следующее слово +• [Ctrl]+[U]: Delete all text before the cursor=• [Ctrl]+[U] - удалить весь текст перед курсором +• [Ctrl]+[K]: Delete all text after the cursor=• [Ctrl]+[K] - удалить весь текст после курсора +• [Page up]: Scroll up=• [Page up] - прокрутка вверх +• [Page down]: Scroll down=• [Page down] - прокрутка вниз There is also an input history. Minetest saves your previous console inputs which you can quickly access later:=Существует также история ввода данных. Minetest сохраняет весь ваш консольный ввод, и к нему можно быстро получить доступ в дальнейшем: -• [Up]: Go to previous entry in history=• [Вверх]: перейти к предыдущей записи истории ввода -• [Down]: Go to next entry in history=• [Вниз]: переход к следующей записи истории ввода +• [Up]: Go to previous entry in history=• [Вверх] - перейти к предыдущей записи истории ввода +• [Down]: Go to next entry in history=• [Вниз] - переход к следующей записи истории ввода Server commands=Серверные команды -Server commands (also called “chat commands”) are little helpers for advanced users. You don't need to use these commands when playing. But they might come in handy to perform some more technical tasks. Server commands work both in multi-player and single-player mode.=Серверные команды (также известные как “чат-команды”) - это маленькое подспорье для продвинутых пользователей. Нет необходимости использовать их для игры. Но они могут пригодиться для выполнения технических задач. Серверные команды работают как в многопользовательском, так и в однопользовательском режиме. +Server commands (also called “chat commands”) are little helpers for advanced users. You don't need to use these commands when playing. But they might come in handy to perform some more technical tasks. Server commands work both in multi-player and single-player mode.=Серверные команды (также известные как “чат-команды”) это маленькое подспорье для продвинутых пользователей. Нет необходимости использовать их для игры. Но они могут пригодиться для выполнения технических задач. Серверные команды работают как в многопользовательском, так и в однопользовательском режиме. Server commands can be entered by players using the chat to perform a special server action. There are a few commands which can be issued by everyone, but some commands only work if you have certain privileges granted on the server. There is a small set of basic commands which are always available, other commands can be added by mods.=Серверные команды могут выполнять игроки при помощи чата для выполнения специального действия сервера. Есть несколько команд, которые могут быть выданы всеми, но некоторые команды работают только в том случае, если у вас есть определенные привилегии, предоставленные на сервере. Существует небольшой набор базовых команд, которые доступны всегда, дополнительные команды могут добавляться модами. -To issue a command, simply type it like a chat message or press Minetest's command key (default: [/]). All commands have to begin with “/”, for example “/mods”. The Minetest command key does the same as the chat key, except that the slash is already entered.=Чтобы запустить команду, просто введите ее, как вводите сообщения в чате, или нажмите командную клавишу Minetest (по умолчанию: [/]). Все команды должны начинаться с символа “/”, например “/mods”. Клавиша команды Minetest делает то же самое, что и клавиша чата, за исключением того, что символ слэш (косая черта, наклонённая вправо) уже введён. +To issue a command, simply type it like a chat message or press Minetest's command key (default: [/]). All commands have to begin with “/”, for example “/mods”. The Minetest command key does the same as the chat key, except that the slash is already entered.=Чтобы запустить команду просто введите ее как вводите сообщения в чате, или нажмите командную клавишу Minetest (по умолчанию: [/]). Все команды должны начинаться с символа “/”, например “/mods”. Клавиша команды Minetest делает то же самое, что и клавиша чата, за исключением того, что символ слэш (косая черта, наклонённая вправо) уже введён. Commands may or may not give a response in the chat log, but errors will generally be shown in the chat. Try it for yourselves: Close this window and type in the “/mods” command. This will give you the list of available mods on this server.=Команды могут возвращать или не возвращать ответ в журнале чата, но ошибки, как правило, отображаются. Попробуйте сами: закройте это окно и введите команду “/mods”. Она покажет вам список модов, доступных на этом сервере. -“/help all” is a very important command: You get a list of all available commands on the server, a short explanation and the allowed parameters. This command is also important because the available commands often differ per server.=“/help all“ - это очень важная команда: вы получаете список всех доступных серверных команд, их краткое объяснение и разрешённые параметры. Эта команда также важна, потому что доступные команды часто отличаются на каждом сервере. +“/help all” is a very important command: You get a list of all available commands on the server, a short explanation and the allowed parameters. This command is also important because the available commands often differ per server.=“/help all“ это очень важная команда: вы получаете список всех доступных серверных команд, их краткое объяснение и разрешённые параметры. Эта команда также важна, потому что доступные команды часто отличаются на каждом сервере. Commands are followed by zero or more parameters.=За командами прописывается ноль или более параметров. In the command reference, you see some placeholders which you need to replace with an actual value. Here's an explanation:=В справочнике команд отображаются [<(шаблоны)>|], которые нужно заменять реальными значениями. Вот пояснение: • Text in greater-than and lower-than signs (e.g. “”): Placeholder for a parameter=• Текст в знаках больше и меньше (например, “<игрок>”): шаблон параметра @@ -399,14 +399,14 @@ In the command reference, you see some placeholders which you need to replace wi • Parenthesis: (e.g. “(word1 word2) | word3”): Groups multiple words together, used for alternations=• Скобки (например, “(слово1 слово2) | слово3”): группируют несколько слов вместе, используется для обозначения возможности выбора • Everything else is to be read as literal text=• Все остальное читается буквально как текст команды Here are some examples to illustrate the command syntax:=Вот несколько примеров, иллюстрирующих синтаксис команды: -• /mods: No parameters. Just enter “/mods”=• /mods: Нет параметров. Просто введите “/mods” +• /mods: No parameters. Just enter “/mods”=• /mods: нет параметров. Просто введите “/mods” • /me : 1 parameter. You have to enter “/me ” followed by any text, e.g. “/me orders pizza”=• /me <действие>: 1 параметр. Вы должны ввести “/me“, а затем любой текст, например “/me orders pizza” -• /give : Two parameters. Example: “/give Player default:apple”=• /give <имя> <Айтемстринг>: два параметра. Пример: “/give Player mcl_core:apple” +• /give : Two parameters. Example: “/give Player default:apple”=• /give <имя> <ТехническоеНазвание>: два параметра. Пример: “/give Player mcl_core:apple” • /help [all|privs|]: Valid inputs are “/help”, “/help all”, “/help privs”, or “/help ” followed by a command name, like “/help time”=• /help [all|privs|<команда>]: допустимыми командами будут являться: “/help”, “/help all”, “/help privs” или “/help ” и имя команды, например: “/help time” • /spawnentity [,,]: Valid inputs include “/spawnentity boats:boat” and “/spawnentity boats:boat 0,0,0”=• /spawnentity <ИмяСущности> [<Х>,<У>,]: допустимыми командами будут являться: “/spawnentity mcl_boats:boat” и “/spawnentity mcl_boats:boat 0,0,0” Some final remarks:=Некоторые заключительные замечания: -• For /give and /giveme, you need an itemstring. This is an internally used unique item identifier which you may find in the item help if you have the “give” or “debug” privilege=• Для /give и /giveme вам понадобится значение «Айтемстринг» (ItemString). Это уникальный идентификатор предмета для внутреннего использования, его можно найти в справке по предмету, если у вас есть привилегия “give” (давать) или “debug” (отлаживать) -• For /spawnentity you need an entity name, which is another identifier=• Для /spawnentity вам нужно имя сущности, которое является другим идентификатором +• For /give and /giveme, you need an itemstring. This is an internally used unique item identifier which you may find in the item help if you have the “give” or “debug” privilege=• Для /give и /giveme вам понадобится “техническое название” (ItemString). Это уникальный идентификатор предмета для внутреннего использования, его можно найти в справке по предмету, если у вас есть привилегия “give” или “debug” +• For /spawnentity you need an entity name, which is another identifier=• Для /spawnentity вам нужно имя сущности, которое также является идентификатором Privileges=Привилегии Each player has a set of privileges, which differs from server to server. Your privileges determine what you can and can't do. Privileges can be granted and revoked from other players by any player who has the privilege called “privs”.=Каждый игрок имеет набор привилегий, который отличается от сервера к серверу. Ваши привилегии определяют, что вы можете и чего не можете делать. Привилегии могут быть предоставлены и отозваны у других игроков любым игроком, имеющим привилегию под названием “privs”. On a multiplayer server with the default configuration, new players start with the privileges called “interact” and “shout”. The “interact” privilege is required for the most basic gameplay actions such as building, mining, using, etc. The “shout” privilege allows to chat.=На многопользовательском сервере с конфигурацией по умолчанию новые игроки начинают с привилегиями “interact” (взаимодействовать) и “shout” (кричать). Привилегия “interact” необходима для основных действий игрового процесса, таких как строительство, добыча , использование и т. д. Привилегия “shout” позволяет общаться в чате. @@ -414,14 +414,14 @@ There is a small set of core privileges which you'll find on every server, other To view your own privileges, issue the server command “/privs”.=Чтобы просмотреть свои собственные привилегии, выполните команду сервера “/privs”. Here are a few basic privilege-related commands:=Вот несколько основных команд, связанных с привилегиями: • /privs: Lists your privileges=• /privs: список ваших привилегий -• /privs : Lists the privileges of =• /privs <игрок>: список привилегий игрока с именем <игрок> +• /privs : Lists the privileges of =• /privs <игрок>: список привилегий <игрока> • /help privs: Shows a list and description about all privileges=• /help privs: показывает список и описание всех привилегий Players with the “privs” privilege can modify privileges at will:=Игроки с привилегией “privs” могут предоставлять игрокам привилегии, а также лишать их, по своему усмотрению: • /grant : Grant to =• /grant <игрок> <привилегия>: предоставить <привилегию> <игроку> • /revoke : Revoke from =• /revoke <игрок> <привилегия>: отменить <привилегию> для <игрока> In single-player mode, you can use “/grantme all” to unlock all abilities.=В однопользовательском режиме вы можете использовать “/grantme all“, чтобы сразу разблокировать себе все возможности. Light=Свет -As the world is entirely block-based, so is the light in the world. Each block has its own brightness. The brightness of a block is expressed in a “light level” which ranges from 0 (total darkness) to 15 (as bright as the sun).=Весть мир полностью основан на блоках, и точно так же устроен свет. Каждый блок имеет свою собственную яркость. Яркость блока выражается в “уровне свечения“, который колеблется от 0 (полная темнота) до 15 (такой же яркий, как солнце). +As the world is entirely block-based, so is the light in the world. Each block has its own brightness. The brightness of a block is expressed in a “light level” which ranges from 0 (total darkness) to 15 (as bright as the sun).=Весь мир полностью основан на блоках, и точно так же устроен свет. Каждый блок имеет свою собственную яркость. Яркость блока выражается в “уровне свечения“, который колеблется от 0 (полная темнота) до 15 (такой же яркий, как солнце). There are two types of light: Sunlight and artificial light.=Существует два вида света: солнечный и искусственный. Artificial light is emitted by luminous blocks. Artificial light has a light level from 1-14.=Искусственный свет излучается светящимися блоками. Искусственный свет имеет уровень яркости от 1 до 14. Sunlight is the brightest light and always goes perfectly straight down from the sky at each time of the day. At night, the sunlight will become moonlight instead, which still provides a small amount of light. The light level of sunlight is 15.=Солнечный свет самый яркий и всегда идет совершенно прямо с неба в любое время дня. Ночью свет превращается в лунный, и он тоже даёт небольшое количество света. Уровень яркости солнечного света равен 15. @@ -460,8 +460,8 @@ Enabling Creative Mode in MineClone 2 applies the following changes:=При вк • You can always use the minimap (including radar mode)=• Вы всегда можете использовать миникарту (включая режим радара) Damage is not affected by Creative Mode, it needs to be disabled separately.=На урон творческий режим не влияет, его нужно отключать отдельно. Mobs=Мобы -Mobs are the living beings in the world. This includes animals and monsters.=Мобы - это живые существа в мире. Они включают в себя животных и монстров. -Mobs appear randomly throughout the world. This is called “spawning”. Each mob kind appears on particular block types at a given light level. The height also plays a role. Peaceful mobs tend to spawn at daylight while hostile ones prefer darkness. Most mobs can spawn on any solid block but some mobs only spawn on particular blocks (like grass blocks).=Мобы появляются случайным образом по всему миру. Это называется “спаунинг” (“spawning” – появление, рождение, нерест). Каждый вид мобов появляется на определенных типах блоков при заданном уровне освещенности. Высота тоже играет свою роль. Мирные мобы, как правило, появляются при дневном свете, в то время как враждебные предпочитают темноту. Большинство мобов могут появляться на любом твердом блоке, но некоторые мобы появляются только на определённых блоках (например, травяных). +Mobs are the living beings in the world. This includes animals and monsters.=Мобы это живые существа в мире. Они включают в себя животных и монстров. +Mobs appear randomly throughout the world. This is called “spawning”. Each mob kind appears on particular block types at a given light level. The height also plays a role. Peaceful mobs tend to spawn at daylight while hostile ones prefer darkness. Most mobs can spawn on any solid block but some mobs only spawn on particular blocks (like grass blocks).=Мобы появляются случайным образом по всему миру. Это называется “спаун”. Каждый вид мобов появляется на определенных типах блоков при заданном уровне освещенности. Высота тоже играет свою роль. Мирные мобы, как правило, появляются при дневном свете, в то время как враждебные предпочитают темноту. Большинство мобов могут появляться на любом твердом блоке, но некоторые мобы появляются только на определённых блоках (например, травяных). Like players, mobs have hit points and sometimes armor points, too (which means you need better weapons to deal any damage at all). Also like players, hostile mobs can attack directly or at a distance. Mobs may drop random items after they die.=Как и игроки, мобы имеют очки здоровья, а иногда и очки защиты (что означает, что вам понадобится оружие получше, чтобы нанести им хоть какой-то урон). Так же, как и игроки, враждебные мобы могут атаковать вплотную или с расстояния. Мобы могут выбрасывать случайные предметы, когда умирают. Most animals roam the world aimlessly while most hostile mobs hunt players. Animals can be fed, tamed and bred.=Большинство животных бесцельно бродят по миру, в то время как большинство враждебных мобов охотятся на игроков. Животных можно кормить, приручать и разводить. Animals=Животные @@ -475,9 +475,9 @@ Taming:=Приручение: A few animals can be tamed. You can generally do more things with tamed animals and use other items on them. For example, tame horses can be saddled and tame wolves fight on your side.=Нескольких животных можно приручать. Как правило, с прирученными животными вы можете делать больше вещей, а также использовать на них другие предметы. Например, прирученных лошадей можно оседлать, а прирученные волки сражаются на вашей стороне. Breeding:=Разведение: When you have fed an animal up to its maximum health, then feed it again, you will activate “Love Mode” and many hearts appear around the animal.=Когда вы кормите животное до его максимального здоровья, а затем кормите его снова, вы активируете “режим любви”, и вокруг животного появляется много сердец. -Two animals of the same species will start to breed if they are in Love Mode and close to each other. Soon a baby animal will pop up.=Два животных одного вида начнут размножаться, если они находятся в режиме любви и близко друг к другу. Скоро появится малыш животного. -Baby animals:=Малыш животного -Baby animals are just like their adult couterparts, but they can't be tamed or bred and don't drop anything when they die. They grow to adults after a short time. When fed, they grow to adults faster.=Малыши животных точно такие же, как и взрослые, но их нельзя приручить или разводить, и они ничего не дают вам, когда умирают. Они вырастают до взрослых через короткое время. Если кормить их, то они вырастут быстрее. +Two animals of the same species will start to breed if they are in Love Mode and close to each other. Soon a baby animal will pop up.=Два животных одного вида начнут размножаться, если они находятся в режиме любви и близко друг к другу. Скоро появится детёныш животного. +Baby animals:=Детёныш животного +Baby animals are just like their adult couterparts, but they can't be tamed or bred and don't drop anything when they die. They grow to adults after a short time. When fed, they grow to adults faster.=Детёнышы животных точно такие же, как и взрослые, но их нельзя приручить или разводить, и они ничего не дают вам, когда умирают. Они вырастают до взрослых через короткое время. Если кормить их, то они вырастут быстрее. Hunger=Голод Hunger affects your health and your ability to sprint. Hunger is not in effect when damage is disabled.=Голод влияет на ваше здоровье и способность бегать. Голод не действует, если урон отключён. Core hunger rules:=Основные правила голода: @@ -485,21 +485,21 @@ Core hunger rules:=Основные правила голода: • Actions like combat, jumping, sprinting, etc. decrease hunger points=• Такие действия, такие как бой, прыжки, бег и тому подобные, уменьшают очки голода • Food restores hunger points=• Еда восстанавливает очки голода • If your hunger bar decreases, you're hungry=• Если ваша индикатор голода уменьшается, вы голодны -• At 18-20 hunger points, you regenerate 1 HP every 4 seconds=• При 18-20 очках голода ваше здоровье восстанавливается со скоростью 1 HP каждые 4 секунды +• At 18-20 hunger points, you regenerate 1 HP every 4 seconds=• При 18-20 очках голода ваше здоровье восстанавливается со скоростью 1 очко каждые 4 секунды • At 6 hunger points or less, you can't sprint=• При 6 очках голода и менее меньше вы не можете бежать -• At 0 hunger points, you lose 1 HP every 4 seconds (down to 1 HP)=• При 0 очках голода вы теряете 1 HP 4 секунды (до уровня 1 HP) -• Poisonous food decreases your health=• Ядовитая пища ухудшает ваше здоровье. +• At 0 hunger points, you lose 1 HP every 4 seconds (down to 1 HP)=• При 0 очках голода вы теряете 1 очко здоровья 4 секунды (до тех пор пока здоровье не понизится до 1 HP) +• Poisonous food decreases your health=• Ядовитая пища умешьшает ваше здоровье. Details:=Подробности: -You have 0-20 hunger points, indicated by 20 drumstick half-icons above the hotbar. You also have an invisible attribute: Saturation.=У вас есть 0-20 очков голода, обозначенных 20 куриными ножками над панелью быстрого доступа. У вас также есть невидимый атрибут: сытость. -Hunger points reflect how full you are while saturation points reflect how long it takes until you're hungry again.=Очки голода отражают, насколько вы сыты, а невидимые очки сытости – через какое время вы снова проголодаетесь. -Each food item increases both your hunger level as well your saturation.=Каждый продукт питания увеличивает как очки голода, так и невидимые очки сытости. +You have 0-20 hunger points, indicated by 20 drumstick half-icons above the hotbar. You also have an invisible attribute: Saturation.=У вас есть 0-20 очков голода, обозначенных 20 куриными ножками над хотбаром. У вас также есть невидимый атрибут: насыщение. +Hunger points reflect how full you are while saturation points reflect how long it takes until you're hungry again.=Очки голода отражают, насколько вы сыты, а невидимые очки насыщения – через какое время вы снова проголодаетесь. +Each food item increases both your hunger level as well your saturation.=Каждый продукт питания увеличивает как очки голода, так и невидимые очки насыщения. Food with a high saturation boost has the advantage that it will take longer until you get hungry again.=Таким образом, еда с высоком насыщаемостью имеет преимущество, которое заключается в том, что пройдёт больше времени, прежде чем вы снова проголодаетесь. -A few food items might induce food poisoning by chance. When you're poisoned, the health and hunger symbols turn sickly green. Food poisoning drains your health by 1 HP per second, down to 1 HP. Food poisoning also drains your saturation. Food poisoning goes away after a while or when you drink milk.=Некоторые продукты питания иногда могут вызвать отравление. Когда вы отравлены, символы здоровья и голода становятся болезненно зелёными. Пищевое отравление истощает здоровье на 1 HP в секунду, до уровня 1 HP. Пищевое отравление также уменьшает невидимые очки сытости. Отравление проходит через некоторое время либо при выпивании молока. -You start with 5 saturation points. The maximum saturation is equal to your current hunger level. So with 20 hunger points your maximum saturation is 20. What this means is that food items which restore many saturation points are more effective the more hunger points you have. This is because at low hunger levels, a lot of the saturation boost will be lost due to the low saturation cap.=Вы начинаете с 5 очками сытости. Максимальная сытость равна вашему текущему уровню голода. Таким образом, с 20 очками голода ваша максимальная сытость 20. Это означает, что продукты питания, которые восстанавливают много очков сытости, тем эффективнее, чем больше у вас очков голода. При низком уровне голода большая часть сытости будет потеряна. -If your saturation reaches 0, you're hungry and start to lose hunger points. Whenever you see the hunger bar decrease, it is a good time to eat.=Если ваши невидимые очки сытости достигают 0, вы начинаете испытывать голод постепенно терять очки голода. Если вы видите, что индикатор голода уменьшается, значит, настало время поесть. -Saturation decreases by doing things which exhaust you (highest exhaustion first):=Сытость уменьшается, если вы делаете вещи, которые истощают вас (от высокого к низкому истощению): -• Regenerating 1 HP=• Восстановление 1 HP (единицы здоровья/удара) -• Suffering food poisoning=• Страдание пищевым отравлением +A few food items might induce food poisoning by chance. When you're poisoned, the health and hunger symbols turn sickly green. Food poisoning drains your health by 1 HP per second, down to 1 HP. Food poisoning also drains your saturation. Food poisoning goes away after a while or when you drink milk.=Некоторая пища иногда может вызвать отравление. Когда вы отравлены, символы здоровья и голода становятся болезненно зелёными. Пищевое отравление истощает здоровье на 1 HP в секунду, до уровня 1 HP. Пищевое отравление также уменьшает невидимые очки насыщения. Отравление проходит через некоторое время либо при выпивании молока. +You start with 5 saturation points. The maximum saturation is equal to your current hunger level. So with 20 hunger points your maximum saturation is 20. What this means is that food items which restore many saturation points are more effective the more hunger points you have. This is because at low hunger levels, a lot of the saturation boost will be lost due to the low saturation cap.=Вы начинаете с 5 очками насыщения. Максимальное насыщение равно вашему текущему уровню голода. Таким образом, с 20 очками голода ваше максимальное насыщение равно 20. Это означает, что пища, которая восстанавливает много очков насыщения, тем эффективнее, чем больше у вас очков голода. При низком уровне голода большая часть насыщения будет потеряна. +If your saturation reaches 0, you're hungry and start to lose hunger points. Whenever you see the hunger bar decrease, it is a good time to eat.=Если ваши невидимые очки насыщения достигает 0, вы начинаете постепенно терять очки голода. Если вы видите, что индикатор голода уменьшается, значит, настало время поесть. +Saturation decreases by doing things which exhaust you (highest exhaustion first):=Насыщение уменьшается, если вы делаете вещи, которые истощают вас (от большего к меньшему): +• Regenerating 1 HP=• Восстановление 1 единицы здоровья +• Suffering food poisoning=• Страдание от пищевого отравления • Sprint-jumping=• Прыжки во время бега • Sprinting=• Бег • Attacking=• Атака @@ -508,4 +508,4 @@ Saturation decreases by doing things which exhaust you (highest exhaustion first • Jumping=• Прыжки • Mining a block=• Добывание блоков Other actions, like walking, do not exaust you.=Другие действия, такие как ходьба, не истощают вас. -If you have a map item in any of your hotbar slots, you can use the minimap.=Если у вас есть карта в любом отсеке на панели быстрого доступа, вы можете использовать миникарту. +If you have a map item in any of your hotbar slots, you can use the minimap.=Если у вас есть карта в любом слоте хотбара, вы можете использовать миникарту. diff --git a/mods/HELP/mcl_tt/locale/mcl_tt.ru.tr b/mods/HELP/mcl_tt/locale/mcl_tt.ru.tr index 349b6a5fb..d0a931e51 100644 --- a/mods/HELP/mcl_tt/locale/mcl_tt.ru.tr +++ b/mods/HELP/mcl_tt/locale/mcl_tt.ru.tr @@ -1,47 +1,48 @@ # textdomain: mcl_tt -Head armor=Зашита головы -Torso armor=Защита тела -Legs armor=Защита ног -Feet armor=Защита ступней -Armor points: @1=Эффективность защиты: @1 -Armor durability: @1=Долговечность защиты: @1 -Protection: @1%=Уровень защиты: @1% +Head armor=Броня для головы +Torso armor=Броня для торса +Legs armor=Броня для ног +Feet armor=Броня для ступней +Armor points: @1=Очки защиты: @1 +Armor durability: @1=Прочность брони: @1 +Protection: @1%=Защита: @1% Hunger points: +@1=Очки голода: +@1 -Saturation points: +@1=Очки сытости: +@1 +Saturation points: +@1=Насыщение: +@1 Deals damage when falling=Наносит урон при падении -Grows on grass blocks or dirt=Растёт на блоках травы или грязи -Grows on grass blocks, podzol, dirt or coarse dirt=Растёт на блоках травы, подзола, грязи и твёрдой грязи -Flammable=Легковоспламенимо +Grows on grass blocks or dirt=Растёт на дёрне, земле +Grows on grass blocks, podzol, dirt or coarse dirt=Растёт на дёрне, земле, подзоле, каменистой земли +Flammable=Воспламенимо Zombie view range: -50%=Дальность зрения зомби: -50% Skeleton view range: -50%=Дальность зрения скелета: -50% Creeper view range: -50%=Дальность зрения крипера: -50% Damage: @1=Урон: @1 Damage (@1): @2=Урон (@1): @2 +Durability: @1=Прочность: @1 Healing: @1=Исцеление: @1 Healing (@1): @2=Исцеление (@1): @2 -Full punch interval: @1s=Интервал полного удара: @1 с -Contact damage: @1 per second=Урон при контакте: @1 в секунду -Contact healing: @1 per second=Исцеление при контакте: @1 в секунду -Drowning damage: @1=Урон при падении: @1 -Bouncy (@1%)=Упругость (@1%) +Full punch interval: @1s=Интервал удара: @1 с +Contact damage: @1 per second=Урон при контакте: @1 HP/с +Contact healing: @1 per second=Исцеление при контакте: @1 HP/с +Drowning damage: @1=Урон при утоплении: @1 +Bouncy (@1%)=Упругий блок: @1% Luminance: @1=Свечение: @1 -Slippery=Скользкость +Slippery=Скользкий блок Climbable=Можно карабкаться -Climbable (only downwards)=Можно спускаться +Climbable (only downwards)=Можно спускаться вниз No jumping=Нельзя прыгать No swimming upwards=Нельзя плыть вверх No rising=Нельзя подниматься -Fall damage: @1%=Урон при падении: @1% -Fall damage: +@1%=Урон при падении: +@1% +Fall damage: @1%=Урон от падения: @1% +Fall damage: +@1%=Урон от падения: +@1% No fall damage=Нет урона при падении Mining speed: @1=Скорость добычи: @1 -Very fast=очень высокая -Extremely fast=ужасно высокая -Fast=высокая -Slow=низкая -Very slow=очень низкая -Painfully slow=мучительно низкая -Mining durability: @1=Долговечность добычи: @1 -Block breaking strength: @1=Сила разбиения блоков: @1 -@1 uses=@1 раз(а) +Very fast=Очень высокая +Extremely fast=Экстремально высокая +Fast=Высокая +Slow=Низкая +Very slow=Очень низкая +Painfully slow=Крайне низкая +Mining durability: @1=Прочность при добыче: @1 +Block breaking strength: @1=Сила добычи: @1 +@1 uses=@1 Unlimited uses=не ограничено diff --git a/mods/HUD/awards/locale/awards.de.tr b/mods/HUD/awards/locale/awards.de.tr index 19db5e0be..190a76071 100644 --- a/mods/HUD/awards/locale/awards.de.tr +++ b/mods/HUD/awards/locale/awards.de.tr @@ -2,7 +2,7 @@ @1: @2=@1: @2 @1 (got)=@1 (erhalten) @1’s awards:=Auszeichnungen von @: -(Secret Award)=(Geheime Auszeichnung) +(Secret Advancement)=(Geheime Auszeichnung) Achievement gotten!=Auszeichnung erhalten! Achievement gotten:=Auszeichnung erhalten: Achievement gotten: @1=Auszeichnung erhalten: @1 diff --git a/mods/HUD/awards/locale/awards.es.tr b/mods/HUD/awards/locale/awards.es.tr index 15e8c4670..4058a8b62 100644 --- a/mods/HUD/awards/locale/awards.es.tr +++ b/mods/HUD/awards/locale/awards.es.tr @@ -2,7 +2,7 @@ @1: @2=@1: @2 @1 (got)=@1 (Completado) @1’s awards:=Premios de @1: -(Secret Award)=(Premio secreto) +(Secret Advancement)=(Premio secreto) Achievement gotten!=¡Logro conseguido! Achievement gotten:=Logro conseguido: Achievement gotten: @1=Logro conseguido: @1 diff --git a/mods/HUD/awards/locale/awards.fr.tr b/mods/HUD/awards/locale/awards.fr.tr index 767848a69..567c86818 100644 --- a/mods/HUD/awards/locale/awards.fr.tr +++ b/mods/HUD/awards/locale/awards.fr.tr @@ -8,7 +8,7 @@ @1 (got)=@1 (obtenu) @1: @2=@1 : @2 @1’s awards:=Récompenses de @1: -(Secret Award)=(Récompense secrète) +(Secret Advancement)=(Récompense secrète) = = Advancement Made!=Progrès réalisé ! diff --git a/mods/HUD/awards/locale/awards.ja.tr b/mods/HUD/awards/locale/awards.ja.tr index 5a3b73174..fe1dd5f5e 100644 --- a/mods/HUD/awards/locale/awards.ja.tr +++ b/mods/HUD/awards/locale/awards.ja.tr @@ -8,7 +8,7 @@ @1 (got)=@1(入手した) @1: @2=@1: @2 @1’s awards:=@1 のアワード -(Secret Award)=(シークレットアワード) +(Secret Advancement)=(シークレットアワード) =<実績 ID> =<名前> Advancement Made!=進捗 更新! diff --git a/mods/HUD/awards/locale/awards.pl.tr b/mods/HUD/awards/locale/awards.pl.tr index 76d5b9161..2b48d32c3 100644 --- a/mods/HUD/awards/locale/awards.pl.tr +++ b/mods/HUD/awards/locale/awards.pl.tr @@ -8,7 +8,7 @@ @1 (got)=@1 (zdobyto) @1: @2=@1: @2 @1’s awards:=Nagrody @1: -(Secret Award)=(Sekretna nagroda) +(Secret Advancement)=(Sekretna nagroda) = = Achievement gotten!=Zdobyto osiągnięcie! diff --git a/mods/HUD/awards/locale/awards.ru.tr b/mods/HUD/awards/locale/awards.ru.tr index 6f7a6d1bf..be3d35dad 100644 --- a/mods/HUD/awards/locale/awards.ru.tr +++ b/mods/HUD/awards/locale/awards.ru.tr @@ -3,19 +3,19 @@ @1/@2 crafted=@1/@2 создано @1/@2 deaths=@1/@2 смертей @1/@2 dug=@1/@2 выкопано -@1/@2 game joins=@1/@2 присоединений к игре +@1/@2 game joins=@1/@2 подключений к игре @1/@2 placed=@1/@2 размещено @1 (got)=@1 (получено) @1: @2=@1: @2 @1’s awards:=Награды @1: -(Secret Award)=(Тайная награда) +(Secret Advancement)=(Секретное достижение) =<идентификатор достижения> =<имя> Advancement Made!=Получено достижение! Advancement Made:=Получено достижение: Advancement: @1=Достижение: @1 Achievement not found.=Достижение не найдено. -All your awards and statistics have been cleared. You can now start again.=Ваши награды удалены вместе со всей статистикой. Теперь можно начать всё сначала. +All your awards and statistics have been cleared. You can now start again.=Ваши награды и статистика удалена. Теперь можно начать всё сначала. Awards=Награды Craft: @1×@2=Создано: @1×@2 Craft: @1=Создано: @1 @@ -25,23 +25,23 @@ Get the achievements statistics for the given player or yourself=Получен Join the game @1 times.=Присоединился(ась) к игре @1 раз(а). Join the game.=Присоединился(ась) к игре. List awards in chat (deprecated)=Вывести список наград в чат (устарело). -Place a block: @1=Разметил(а) блок: @1 -Place blocks: @1×@2=Разместил(а) блоки: @1×@2 -Secret Advancement Made!=Тайное достижение получено! -Secret Advancement Made:=Тайное достижение получено: -Secret Advancement Made: @1=Тайное достижение получено: @1 +Place a block: @1=Поставил(а) блок: @1 +Place blocks: @1×@2=Поставил(а) блоки: @1×@2 +Secret Advancement Made!=Секретное достижение получено! +Secret Advancement Made:=Секретное достижение получено: +Secret Advancement Made: @1=Секретное достижение получено: @1 Show details of an achievement=Показать подробности достижения -Show, clear, disable or enable your advancements.=Отобразить, очистить, запретить или разрешить ваши достижения -Make this advancement to find out what it is.=Получите это достижение, чтобы узнать, что это. +Show, clear, disable or enable your advancements.=Показать, очистить, отключить или включить ваши достижения +Make this advancement to find out what it is.=Получите это достижение, чтобы узнать что это. Write @1 chat messages.=Написано @1 сообщений(е,я) в беседе. -Write something in chat.=Написал(а) что-то в беседе. -You have disabled your advancements.=Вы запретили ваши достижения. -You have enabled your advancements.=Вы разрешили ваши достижения. -You have not gotten any awards.=Вы пока не получали наград. -You've disabled awards. Type /awards enable to reenable.=Вы запретили награды. Выполните /awards enable, чтобы разрешить их обратно. -[c|clear|disable|enable]=[c|clear — очистить|disable — запретить|enable — разрешить] -OK=Ладно -Error: No awards available.=Ошибка: награды недоступны +Write something in chat.=Напишите что-нибудь в чат. +You have disabled your advancements.=Вы отключили ваши достижения. +You have enabled your advancements.=Вы включили ваши достижения. +You have not gotten any awards.=Вы пока не получили никаких наград. +You've disabled awards. Type /awards enable to reenable.=Вы отключили награды. Введите /awards enable, чтобы включить их. +[c|clear|disable|enable]=[c|clear — очистить|disable — отключить|enable — включить] +OK=ОК +Error: No awards available.=Ошибка: Нет доступных наград. Eat: @1×@2=Съедено: @1×@2 Eat: @1=Съедено: @1 @1/@2 eaten=@1/@2 съедено @@ -50,14 +50,14 @@ Dig @1 block(s).=Выкопал(а) @1 блок(а,ов). Eat @1 item(s).=Съел(а) @1 предмет(а,ов). Craft @1 item(s).=Сделал(а) @1 предмет(а,ов). Can give advancements to any player=Может выдавать достижения любому игроку -(grant ( | all)) | list=(grant <игрок> (<достижение> | all — всем)) | список +(grant ( | all)) | list=(grant <игрок> (<достижение> | all — всем)) | list — список Give advancement to player or list all advancements=Выдать достижение игроку или отобразить все достижения @1 (@2)=@1 (@2) -Invalid syntax.=Неверное составление. -Invalid action.=Непредусмотренное действие. -Player is not online.=Игрок не подключён. +Invalid syntax.=Неверный синтаксис. +Invalid action.=Неверное действие. +Player is not online.=Игрок не в сети. Done.=Готово. -Advancement “@1” does not exist.=Достижения «@1» не существует. +Advancement “@1” does not exist.=Достижения “@1” не существует. @1 has made the advancement @2=@1 получил(а) достижение @2 Mine a block: @1=Добыл(а) блок: @1 Mine blocks: @1×@2=Добыл(а) блоки: @1×@2 @@ -65,6 +65,6 @@ Awards are disabled, enable them first by using /awards enable!=Награды Goal Completed:=Цель выполнена: Goal Completed!=Цель выполнена! Goal Completed: @1=Цель выполнена: @1 -Challenge Completed:=Задача выполнена: -Challenge Completed!=Задача выполнена! -Challenge Completed: @1=Задача выполнена: @1 \ No newline at end of file +Challenge Completed:=Испытание выполнено: +Challenge Completed!=Испытание выполнено! +Challenge Completed: @1=Испытание выполнено: @1 \ No newline at end of file diff --git a/mods/HUD/awards/locale/template.txt b/mods/HUD/awards/locale/template.txt index 5312c2ba7..af608863b 100644 --- a/mods/HUD/awards/locale/template.txt +++ b/mods/HUD/awards/locale/template.txt @@ -8,7 +8,7 @@ @1 (got)= @1: @2= @1’s awards:= -(Secret Award)= +(Secret Advancement)= = = Advancement Made!= diff --git a/mods/HUD/hudbars/locale/hudbars.ru.tr b/mods/HUD/hudbars/locale/hudbars.ru.tr index 2d278e339..0f9ea4ec4 100644 --- a/mods/HUD/hudbars/locale/hudbars.ru.tr +++ b/mods/HUD/hudbars/locale/hudbars.ru.tr @@ -1,4 +1,6 @@ # textdomain: hudbars -Health=HP -Breath=дыхание +Health=Здоровье +Breath=Дыхание + +# Строка форматирования для прогрессбаров, например: “Здоровье: 5/20” @1: @2/@3=@1: @2/@3 diff --git a/mods/HUD/mcl_achievements/locale/mcl_achievements.ru.tr b/mods/HUD/mcl_achievements/locale/mcl_achievements.ru.tr index 9a180d89b..2549db4d3 100644 --- a/mods/HUD/mcl_achievements/locale/mcl_achievements.ru.tr +++ b/mods/HUD/mcl_achievements/locale/mcl_achievements.ru.tr @@ -1,113 +1,113 @@ # textdomain:mcl_achievements -Acquire Hardware=Куй Железо -Bake Bread=Хлеб всему голова -Benchmarking=Верстак -Cow Tipper=Кожа да кости -Craft a bookshelf.=Создание книжной полки. -Craft a cake using wheat, sugar, milk and an egg.=Создание торта из пшеницы, сахара, молока и яйца. -Craft a crafting table from 4 wooden planks.=Создание верстака из 4 досок. -Craft a stone pickaxe using sticks and cobblestone.=Создание каменного топора из палок и булыжников. -Craft a wooden sword using wooden planks and sticks on a crafting table.=Изготовление деревянного меча из досок и палок на верстаке. +Acquire Hardware=Куй железо... +Bake Bread=Хлеб насущный +Benchmarking=Рабочий стол +Cow Tipper=Мясник +Craft a bookshelf.=Скрафтите книжную полку. +Craft a cake using wheat, sugar, milk and an egg.=Скрафтите торт из пшеницы, сахара, молока и яйца. +Craft a crafting table from 4 wooden planks.=Скрафтите верстак из 4 досок. +Craft a stone pickaxe using sticks and cobblestone.=Скрафтите каменную кирку из палок и булыжников. +Craft a wooden sword using wooden planks and sticks on a crafting table.=Скрафтите на верстаке деревянный меч из досок и палок. DIAMONDS!=АЛМАЗЫ! -Delicious Fish=Вкусная Рыба -Dispense With This=Раздавай Это -Eat a cooked porkchop.=Употребление в пищу приготовленной свиной отбивной. -Eat a cooked rabbit.=Употребление в пищу приготовленного кролика. -Get really desperate and eat rotten flesh.=Отчаянное и необдуманное употребление в пищу гнилого мяса -Getting Wood=Рубка Леса -Getting an Upgrade=Обновка -Hit a skeleton, wither skeleton or stray by bow and arrow from a distance of at least 20 meters.=Попадание по скелету, скелету-иссушителю либо уклонение от стрелы на расстоянии не менее 20 метров. -Hot Topic=Печник жжёт -Into Fire=В огне +Delicious Fish=Вкусная рыбка +Dispense With This=Раздайте с этим +Eat a cooked porkchop.=Съешьте приготовленную свинину. +Eat a cooked rabbit.=Съешьте приготовленную крольчатину. +Get really desperate and eat rotten flesh.=Отчайтесь и съешьте гнилое мясо. +Getting Wood=Нарубить древесины +Getting an Upgrade=Обновка! +Hit a skeleton, wither skeleton or stray by bow and arrow from a distance of at least 20 meters.=Попадите по скелету, скелету-иссушителю или страннику стрелой из лука на расстоянии не менее 20 метров. +Hot Topic=Жаркая тема +Into Fire=Огненные недра We Need to Go Deeper=В глубь Iron Belly=Железный живот Librarian=Библиотекарь -Mine emerald ore.=Добыча изумрудной руды. -On A Rail=На Рельсах -Pick up a blaze rod from the floor.=Поднятие огненного стержня с пола. -Pick up a diamond from the floor.=Поднятие алмаза с пола. -Pick up a wood item from the ground.@nHint: Punch a tree trunk until it pops out as an item.=Поднятие дерева с земли.@nПодсказка: Бейте по стволу, пока он не упадёт на землю, превратившись в предмет. -Pick up leather from the floor.@nHint: Cows and some other animals have a chance to drop leather, when killed.=Поднятие кожи с пола.@nПодсказка: Коровы и некоторые другие животные могут оставлять кожу, если их убивать. -Place a dispenser.=Установка диспенсера. -Place a flower pot.=Установка цветочного горшка. +Mine emerald ore.=Добудьте изумрудную руду. +On A Rail=Стук колёс +Pick up a blaze rod from the floor.=Поднимите огненный стержень. +Pick up a diamond from the floor.=Поднимите алмаз. +Pick up a wood item from the ground.@nHint: Punch a tree trunk until it pops out as an item.=Поднимите бревно с земли.@nПодсказка: Бейте по стволу, пока он не выпадёт на землю, превратившись в предмет. +Pick up leather from the floor.@nHint: Cows and some other animals have a chance to drop leather, when killed.=Поднимите кожу.@nПодсказка: Коровы и некоторые другие животные могут оставлять кожу, если их убить. +Place a dispenser.=Поставьте раздатчик. +Place a flower pot.=Поставьте цветочный горшок. Pork Chop=Свиная отбивная -Pot Planter=Сажатель горшков -Rabbit Season=Заячья пора -Sniper Duel=Лучный бой -Take a cooked fish from a furnace.@nHint: Use a fishing rod to catch a fish and cook it in a furnace.=Приготовление рыбы в печи.@nПодсказка: Ловите рыбу удочкой и готовьте её в печи. -Take an iron ingot from a furnace's output slot.@nHint: To smelt an iron ingot, put a fuel (like coal) and iron ore into a furnace.=Получение слитка железа из печи.@nПодсказка: чтобы переплавить железную руду, нужно положить её в печь и туда же поместить топливо (уголь или другое). -The Haggler=Торговец -The Lie=Тортик -Time to Farm!=Время земледелия! -Time to Mine!=Время добывать! -Time to Strike!=Время сражаться! -Travel by minecart for at least 1000 meters from your starting point in a single ride.=Поездка на вагонетке минимум на 1000 метров от стартовой точки за один раз. -Use 8 cobblestones to craft a furnace.=Создание печи из 8 булыжников. -Use a crafting table to craft a wooden hoe from wooden planks and sticks.=Создание деревянной мотыги из досок и палок на верстаке. -Use a crafting table to craft a wooden pickaxe from wooden planks and sticks.=Создание деревянной кирки из досок и палок на верстаке. -Use obsidian and a fire starter to construct a Nether portal.=Создание при помощи обсидиана и огнива. -Use wheat to craft a bread.=Использование пшеницы для приготовления хлеба. -Who is Cutting Onions?= -Pick up a crying obsidian from the floor.= -Hidden in the Depths= -Pick up an Ancient Debris from the floor.= -The Nether=Преисподняя -Bring summer clothes.@nHint: Enter the Nether.=Возьмите с собой летнюю одежду.@nПодсказка: войдите в преисподнюю. -Isn't It Iron Pick= -Craft a iron pickaxe using sticks and iron.= -Postmortal= -Use a Totem of Undying to cheat death.= -Sweet Dreams= -Sleep in a bed to change your respawn point.= -Not Quite "Nine" Lives= -Charge a Respawn Anchor to the maximum.= -What A Deal!=Вот так сделка! -Successfully trade with a Villager.=Успешная торговля с жителем. -Withering Heights= -Summon the wither from the dead.= -The Cutest Predator= -Catch an Axolotl with a bucket!= -Fishy Business= -Catch a fish.@nHint: Catch a fish, salmon, clownfish, or pufferfish.= -Country Lode, Take Me Home= -Use a compass on a Lodestone.= -Serious Dedication= -Use a Netherite Ingot to upgrade a hoe, and then completely reevaluate your life choices.= -Local Brewery= -Brew a Potion.@nHint: Take a potion or glass bottle out of the brewing stand.= -Enchanter= -Enchant an item using an Enchantment Table.= -Bring Home the Beacon= -Use a beacon.= -Beaconator= -Use a fully powered beacon.= -The Next Generation= -Hold the Dragon Egg.@nHint: Pick up the egg from the ground and have it in your inventory.= -The End... Again...= -Respawn the Ender Dragon.= -Sky's the Limit= -Find the elytra and prepare to fly above and beyond!= -Free the End= -Kill the ender dragon. Good Luck!= -Bee Our Guest= -Use a campfire to collect a bottle of honey from a beehive without aggrivating the bees inside.= -Total Beelocation= -Move a bee nest, with 3 bees inside, using a silk touch enchanted tool.= -Wax On= -Apply honeycomb to a copper block to protect it from the elements.= -Wax Off= -Scrape wax off of a copper block.= -The End?= -Or the beginning?@nHint: Enter an end portal.= -Stone Age= -Mine a stone with new pickaxe.= -Ice Bucket Challenge= -Obtain an obsidian block.= -Hot Stuff= -Put lava in a bucket.= -Hero of the Village= -Successfully defend a village from a raid= -Voluntary Exile= -Kill a raid captain. Maybe consider staying away from the local villages for the time being...= -Tactical Fishing= -Catch a fish... without a fishing rod!= \ No newline at end of file +Pot Planter=Садовод +Rabbit Season=Сезон кроликов +Sniper Duel=Снайперская дуэль +Take a cooked fish from a furnace.@nHint: Use a fishing rod to catch a fish and cook it in a furnace.=Приготовьте рыбу в печи.@nПодсказка: Поймайте рыбу удочкой и приготовьте её в печи. +Take an iron ingot from a furnace's output slot.@nHint: To smelt an iron ingot, put a fuel (like coal) and iron ore into a furnace.=Получите слиток железа из печи.@nПодсказка: чтобы переплавить железную руду, нужно положить в печь руду и топливо (например, уголь). +The Haggler=Торгаш +The Lie=Тортик это ложь +Time to Farm!=Время фермерства! +Time to Mine!=Пора в шахту! +Time to Strike!=К бою готов! +Travel by minecart for at least 1000 meters from your starting point in a single ride.=Прокатитесь на вагонетке минимум на 1000 метров от стартовой точки за один раз. +Use 8 cobblestones to craft a furnace.=Скрафтите печь из 8 булыжников. +Use a crafting table to craft a wooden hoe from wooden planks and sticks.=Скрафтите на верстаке деревянную мотыгу из досок и палок. +Use a crafting table to craft a wooden pickaxe from wooden planks and sticks.=Скрафтите на верстаке деревянную кирку из досок и палок. +Use obsidian and a fire starter to construct a Nether portal.=Создайте портала в Незер при помощи обсидиана и огнива. +Use wheat to craft a bread.=Скрафтите хлеб из пшеницы. +Who is Cutting Onions?=Обсидиановы слёзы +Pick up a crying obsidian from the floor.=Добудьте плачущий обсидиан. +Hidden in the Depths=Осколки прошлого +Pick up an Ancient Debris from the floor.=Добудьте древние обломки. +The Nether=Незер +Bring summer clothes.@nHint: Enter the Nether.=Захватите летнюю одежду.@nПодсказка: войдите в Незер. +Isn't It Iron Pick=И кирка без дела ржавеет +Craft a iron pickaxe using sticks and iron.=Создайте железную кирку из железный слитков и палок. +Postmortal=Свет в конце тоннеля +Use a Totem of Undying to cheat death.=Воспользуйтесь тотемом бессмертия, чтобы перехитрить смерть. +Sweet Dreams=Спи, моя радость, усни +Sleep in a bed to change your respawn point.=Поспите в кровати, чтобы изменить свою точку возрождения. +Not Quite "Nine" Lives=Ларец Кощея +Charge a Respawn Anchor to the maximum.=Полностью зарядите якорь возрождения. +What A Deal!=Не отходя от кассы! +Successfully trade with a Villager.=Купите что-нибудь у крестьян. +Withering Heights=Чудо-юдо +Summon the wither from the dead.=Призовите визера. +The Cutest Predator=Ласковый и нежный зверь +Catch an Axolotl with a bucket!=Поймайте аксолотля в ведро! +Fishy Business=На крючке +Catch a fish.@nHint: Catch a fish, salmon, clownfish, or pufferfish.=Поймайте рыбу.@nПодсказка: Поймайте треску, лосося, тропическую рыбу, или иглобрюха. +Country Lode, Take Me Home=Путеводный камень +Use a compass on a Lodestone.=Настройте компас на магнетит. +Serious Dedication=Заявка на победу +Use a Netherite Ingot to upgrade a hoe, and then completely reevaluate your life choices.=Улучшите мотыгу с помощью незеритового слитка, а потом попробуйте переосмыслить свою жизнь. +Local Brewery=Местный зельевар +Brew a Potion.@nHint: Take a potion or glass bottle out of the brewing stand.=Сварите зелье.@nПодсказка: Заберите зелье или пузырёк из варочной стойки. +Enchanter=Чародей +Enchant an item using an Enchantment Table.=Зачаруйте предмет на столе зачарований. +Bring Home the Beacon=Желанный свет +Use a beacon.=Постройте и установите маяк. +Beaconator=Маяковский +Use a fully powered beacon.=Доведите маяк до полной мощности. +The Next Generation=Новое поколение +Hold the Dragon Egg.@nHint: Pick up the egg from the ground and have it in your inventory.=Подберите яйцо дракона.@nПодсказка: Подберите яйцо с земли в инвентарь. +The End... Again...=Дежавю +Respawn the Ender Dragon.=Возродите Дракона Края. +Sky's the Limit=Где твои крылья? +Find the elytra and prepare to fly above and beyond!=Найдите элитры. +Free the End=Освободите Энд +Kill the ender dragon. Good Luck!=Убейте Дракона Края. Удачи! +Bee Our Guest=Пора подкрепиться +Use a campfire to collect a bottle of honey from a beehive without aggrivating the bees inside.=Поставьте костёр под ульем и соберите мёд в бутылочку, не разозлив пчёл. +Total Beelocation=Полосатый груз +Move a bee nest, with 3 bees inside, using a silk touch enchanted tool.=С помощью “шёлкового касания” переместите пчелиное гнездо с 3 пчёлами внутри. +Wax On=Навести воск +Apply honeycomb to a copper block to protect it from the elements.=Нанесите воск на медный блок с помощью пчелиных сот. +Wax Off=Убрать воск +Scrape wax off of a copper block.=Соскребите воск с медного блока. +The End?=Конец? +Or the beginning?@nHint: Enter an end portal.=Или начало?@nПодсказка: Войдите в портал Энда. +Stone Age=Каменный век +Mine a stone with new pickaxe.=Добудьте камень новой киркой. +Ice Bucket Challenge=Две стихии +Obtain an obsidian block.=Получите обсидиан. +Hot Stuff=Горячая штучка +Put lava in a bucket.=Наберите ведро лавы. +Hero of the Village=Герой деревни +Successfully defend a village from a raid=Успешно отразите нападение на деревню. +Voluntary Exile=Добровольное изгнание +Kill a raid captain. Maybe consider staying away from the local villages for the time being...=Убейте главаря разбойников. Может, стоит пока держаться подальше от деревень... +Tactical Fishing=Рыбацкая хитрость +Catch a fish... without a fishing rod!=Поймайте рыбу... без удочки! \ No newline at end of file diff --git a/mods/HUD/mcl_credits/locale/mcl_credits.ru.tr b/mods/HUD/mcl_credits/locale/mcl_credits.ru.tr index a8886286e..2271a108d 100644 --- a/mods/HUD/mcl_credits/locale/mcl_credits.ru.tr +++ b/mods/HUD/mcl_credits/locale/mcl_credits.ru.tr @@ -1,14 +1,19 @@ # textdomain: mcl_credits -3D Models= -A faithful Open Source clone of Minecraft= -Contributors= -Creator of MineClone= -Creator of MineClone2= -Developers= -Jump to speed up (additionally sprint)= -Maintainers= -MineClone5= -Original Mod Authors= -Sneak to skip= -Textures= -Translations= \ No newline at end of file +3D Models=3D модели +A faithful Open Source clone of Minecraft=Верный открытый клон Minecraft +Contributors=Контрибьюторы +Creator of MineClone=Создатель MineClone +Creator of MineClone2=Создатель MineClone2 +Developers=Разработчики +Past Developers=Бывшие разработчики +Jump to speed up (additionally sprint)=[Прыжок] или [Спринт] для промотки вперед +Maintainers=Мейнтейнеры +Previous Maintainers=Бывшие мейнтейнеры +MineClone5=MineClone5 +Original Mod Authors=Авторы оригинальных модов +Sneak to skip=[Красться] для пропуска +Textures=Текстуры +Translations=Перевод +Music=Музыка +Funders=Спонсоры +Special thanks=Особая благодарность \ No newline at end of file diff --git a/mods/HUD/mcl_credits/locale/template.txt b/mods/HUD/mcl_credits/locale/template.txt index 3ee9fa56c..51bb49873 100644 --- a/mods/HUD/mcl_credits/locale/template.txt +++ b/mods/HUD/mcl_credits/locale/template.txt @@ -5,10 +5,15 @@ Contributors= Creator of MineClone= Creator of MineClone2= Developers= +Past Developers= Jump to speed up (additionally sprint)= Maintainers= +Previous Maintainers= MineClone5= Original Mod Authors= Sneak to skip= Textures= Translations= +Music= +Funders= +Special thanks= diff --git a/mods/HUD/mcl_death_messages/locale/mcl_death_messages.ru.tr b/mods/HUD/mcl_death_messages/locale/mcl_death_messages.ru.tr index 816546e5e..71f47505c 100644 --- a/mods/HUD/mcl_death_messages/locale/mcl_death_messages.ru.tr +++ b/mods/HUD/mcl_death_messages/locale/mcl_death_messages.ru.tr @@ -1,61 +1,55 @@ # textdomain: mcl_death_messages -@1 was fatally hit by an arrow.=@1 застрелил лучник. -@1 has been killed with an arrow.=@1 убило стрелой из лука. -@1 was shot by an arrow from @2.=@1 убило стрелой @2. -@1 was shot by an arrow from a skeleton.=@1 был(а) убит(а) стрелой скелета. -@1 was shot by an arrow from a stray.=@1 был(а) убит(а) стрелой странника. -@1 was shot by an arrow from an illusioner.=@1 был(а) убит(а) стрелой иллюзора. -@1 was shot by an arrow.=@1 был(а) убит(а) стрелой. -@1 forgot to breathe.=@1 забыл(а) подышать. -@1 drowned.=@1 утонул(а). -@1 ran out of oxygen.=У @1 закончился кислород. -@1 was killed by @2.=@1 был(а) убит(а) @2. -@1 was killed.=@1 был(а) убит(а). -@1 was killed by a mob.=@1 был(а) убит(а) мобом. -@1 was burned to death by a blaze's fireball.=@1 до смерти прожарило файерболом ифрита. -@1 was killed by a fireball from a blaze.=@1 был(а) убит(а) файерболом ифрита. -@1 was burned by a fire charge.=@1 сожгло огненным разрядом. -A ghast scared @1 to death.=Гаст напугал @1 до смерти. -@1 has been fireballed by a ghast.=@1 настиг файербол Гаста. -@1 fell from a high cliff.=@1 свалился(ась) с высокого утёса. -@1 took fatal fall damage.=@1 получил(а) смертельный урон от падения. -@1 fell victim to gravity.=@1 стал(а) жертвой гравитации. -@1 died.=@1 умер(ла). -@1 was slain by @2.= -@1 tried to hurt @2 and died by @3=@1 пытался навредить @2 и умер от @3 -@1 went off with a bang due to a firework fired by @2 from @3=@1 взорвался из-за фейерверка, запущенного @2 из @3 -@1 was killed by a zombie.=@1 был(а) убит(а) зомби. -@1 was killed by a baby zombie.=@1 был(а) убит(а) малышом-зомби. -@1 was killed by a blaze.=@1 был(а) убит(а) ифритом. -@1 was killed by a slime.=@1 был(а) убит(а) слизняком. -@1 was killed by a witch.=@1 был(а) убит(а) ведьмой. -@1 was killed by a magma cube.=@1 был(а) убит(а) лавовым кубом. -@1 was killed by a wolf.=@1 был(а) убит(а) волком. -@1 was killed by a cat.=@1 был(а) убит(а) кошкой. -@1 was killed by an ocelot.=@1 был(а) убит(а) оцелотом. -@1 was killed by an ender dragon.=@1 был(а) убит(а) драконом предела. -@1 was killed by a wither.=@1 был(а) убит(а) иссушителем. -@1 was killed by an enderman.=@1 был(а) убит(а) эндерменом. -@1 was killed by an endermite.=@1 был(а) убит(а) эндермитом. -@1 was killed by a ghast.=@1 был(а) убит(а) гастом. -@1 was killed by an elder guardian.=@1 был(а) убит(а) древним стражем. -@1 was killed by a guardian.=@1 был(а) убит(а) стражем. -@1 was killed by an iron golem.=@1 был(а) убит(а) железным големом. -@1 was killed by a polar_bear.=@1 был(а) убит(а) полярным медведем. -@1 was killed by a killer bunny.=@1 был(а) убит(а) кроликом-убийцей. -@1 was killed by a shulker.=@1 был(а) убит(а) шалкером. -@1 was killed by a silverfish.=@1 был(а) убит(а) чешуйницей. -@1 was killed by a skeleton.=@1 был(а) убит(а) скелетом. -@1 was killed by a stray.=@1 был(а) убит(а) странником. -@1 was killed by a slime.=@1 был(а) убит(а) слизняком. -@1 was killed by a spider.=@1 был(а) убит(а) пауком. -@1 was killed by a cave spider.=@1 был(а) убит(а) пещерным пауком. -@1 was killed by a vex.=@1 был(а) убит(а) досаждателем. -@1 was killed by an evoker.=@1 был(а) убит(а) магом. -@1 was killed by an illusioner.=@1 был(а) убит(а) иллюзором. -@1 was killed by a vindicator.=@1 был(а) убит(а) поборником. -@1 was killed by a zombie villager.=@1 был(а) убит(а) зомби-жителем. -@1 was killed by a husk.=@1 был(а) убит(а) кадавром. -@1 was killed by a baby husk.=@1 был(а) убит(а) машылом-кадавром. -@1 was killed by a zombie piglin.=@1 был(а) убит(а) зомби-свиночеловеком. -@1 was killed by a baby zombie piglin.=@1 был(а) убит(а) малышом-зомби-свиночеловеком. +@1 went up in flames=@1 сгорел(а) в языках пламени +@1 walked into fire whilst fighting @2=@1 прошёлся(лась) по огню, сражаясь с @2 +@1 was struck by lightning=@1 был(а) убит(а) молнией +@1 was struck by lightning whilst fighting @2=@1 был(а) убит(а) молнией, сражаясь с @2 +@1 burned to death=@1 сгорел(а) заживо +@1 was burnt to a crisp whilst fighting @2=@1 обгорел(а) до углей, сражаясь с @2 +@1 tried to swim in lava=@1 попытался(ась) поплавать в лаве +@1 tried to swim in lava to escape @2=@1 попытался(ась) переплыть лаву, убегая от @2 +@1 discovered the floor was lava=@1 узнал(а) что пол это лава +@1 walked into danger zone due to @2=@1 прогулялся(лась) в опасной зоне, благодаря @2 +@1 suffocated in a wall=@1 задохнулся(ась) в стене +@1 suffocated in a wall whilst fighting @2=@1 задохнулся(ась) в стене, сражаясь с @2 +@1 drowned=@1 утонул(а) +@1 drowned whilst trying to escape @2=@1 утонул(а), убегая от @2 +@1 starved to death=@1 умер(ла) от голода +@1 starved to death whilst fighting @2=@1 умер(ла) от голода, сражаясь с @2 +@1 was pricked to death=@1 был(а) заколот(а) до смерти +@1 walked into a cactus whilst trying to escape @2=@1 задел(а) кактус, убегая от @2 +@1 hit the ground too hard=@1 слишком сильно ударился(ась) об землю +@1 hit the ground too hard whilst trying to escape @2=@1 слишком сильно ударился(ась) об землю, убегая от @2 +@1 experienced kinetic energy=@1 испытал(а) на себе кинетическую энергию +@1 experienced kinetic energy whilst trying to escape @2=@1 испытал(а) на себе кинетическую энергию, убегая от @2 +@1 fell out of the world=@1 выпал(а) из мира +@1 didn't want to live in the same world as @2=@1 не захотел(а) жить в том же мире, что и @2 +@1 died=@1 погиб(ла) +@1 died because of @2=@1 погиб(ла) из-за @2 +@1 was killed by magic=@1 был(а) убит(а) магией +@1 was killed by magic whilst trying to escape @2=@1 был(а) убит(а) магией, убегая от @2 +@1 was killed by @2 using magic=@1 был(а) убит(а) @2 с помощью магии +@1 was killed by @2 using @3=@1 был(а) убит(а) @2 с помощью @3 +@1 was roasted in dragon breath=@1 поджарился(ась) в драконьем дыхании +@1 was roasted in dragon breath by @2=@1 поджарился(ась) в драконьем дыхании, благодаря @2 +@1 withered away=@1 иссох(ла) +@1 withered away whilst fighting @2=@1 иссох(ла), сражаясь с @2 +@1 was shot by a skull from @2=@1 был(а) застрелен(а) @2 +@1 was squashed by a falling anvil=@1 раздавлен(а) падающей наковальней +@1 was squashed by a falling anvil whilst fighting @2=@1 раздавлен(а) падающей наковальней, сражаясь с @2 +@1 was squashed by a falling block=@1 раздавлен(а) падающим блоком +@1 was squashed by a falling block whilst fighting @2=@1 раздавлен(а) падающим блоком, сражаясь с @2 +@1 was slain by @2=@1 погиб(ла) от @2 +@1 was slain by @2 using @3=@2 убил(а) @1 с помощью своего @3 +@1 was shot by @2=@1 был(а) застрелен @2 +@1 was shot by @2 using @3=@2 застрелил(а) @1 с помощью своего @3 +@1 was fireballed by @2=@1 получил(а) огненным снарядом от @2 +@1 was fireballed by @2 using @3=@1 получил(а) огненным снарядом от @2 из @3 +@1 was killed trying to hurt @2=@1 погиб(ла), пытаясь навредить @2 +@1 tried to hurt @2 and died by @3=@1 убит(а) @3, пытаясь навредить @2 +@1 blew up=@1 взорвался(ась) +@1 was blown up by @2=@1 был(а) взорван(а) @2 +@1 was blown up by @2 using @3=@1 был(а) взорван(а) @2 с помощью @3 +@1 was squished too much=@1 был(а) слишком сильно сдавлен(а) +@1 was squashed by @2=@1 был(а) слишком сильно сдавлен(а), благодаря @2 +@1 went off with a bang=@1 попал(а) в мир иной под звуки салюта +@1 went off with a bang due to a firework fired by @2 from @3=@1 попал(а) в мир иной под звуки салюта, выпущенного из @3 игроком @2 \ No newline at end of file diff --git a/mods/HUD/mcl_experience/locale/mcl_experience.ru.tr b/mods/HUD/mcl_experience/locale/mcl_experience.ru.tr index a87840aff..baacbc472 100644 --- a/mods/HUD/mcl_experience/locale/mcl_experience.ru.tr +++ b/mods/HUD/mcl_experience/locale/mcl_experience.ru.tr @@ -2,6 +2,7 @@ [[] ]=[[<игрок>] ] Gives a player some XP=Даёт игроку XP Error: Too many parameters!=Ошибка: слишком много параметров! -Error: Incorrect value of XP=Ошибка: Недопустимое значение XP -Error: Player not found=Ошибка: Игрок не найден -Added @1 XP to @2, total: @3, experience level: @4=Добавляем @1 XP игроку @2, итого: @3, уровень опыта: @4 +Error: Incorrect value of XP=Ошибка: недопустимое значение XP +Error: Player not found=Ошибка: игрок не найден +Added @1 XP to @2, total: @3, experience level: @4=Добавлено @1 XP игроку @2, итого: @3, уровень опыта: @4 +Bottle o' Enchanting=Пузырёк опыта \ No newline at end of file diff --git a/mods/HUD/mcl_inventory/locale/mcl_inventory.ru.tr b/mods/HUD/mcl_inventory/locale/mcl_inventory.ru.tr index a5c52bc1d..228de6a6d 100644 --- a/mods/HUD/mcl_inventory/locale/mcl_inventory.ru.tr +++ b/mods/HUD/mcl_inventory/locale/mcl_inventory.ru.tr @@ -1,21 +1,22 @@ # textdomain: mcl_inventory Recipe book=Книга рецептов Help=Справка -Select player skin=Выбор внешности -Achievements=Достижения +Select player skin=Выбор скина +Advancements=Достижения Building Blocks=Строительные блоки -Decoration Blocks=Отделочные блоки -Redstone=Красный камень +Decoration Blocks=Декоративные блоки +Redstone=Механизмы Transportation=Транспорт -Brewing=Зелья -Miscellaneous=Прочее +Brewing=Зельеварение +Miscellaneous=Разное Search Items=Поиск предметов -Foodstuffs=Продовольствие +Foodstuffs=Пища Tools=Инструменты -Combat=Битва +Combat=Оружие и броня Mobs=Сущности Materials=Материалы Survival Inventory=Инвентарь выживания Crafting=Создание Inventory=Инвентарь @1/@2=@1/@2 +Switch stack size=Изменить размер стака \ No newline at end of file diff --git a/mods/HUD/mcl_ver_info/locale/mcl_ver_info.ru.tr b/mods/HUD/mcl_ver_info/locale/mcl_ver_info.ru.tr new file mode 100644 index 000000000..bd09a68c5 --- /dev/null +++ b/mods/HUD/mcl_ver_info/locale/mcl_ver_info.ru.tr @@ -0,0 +1,3 @@ +# textdomain: mcl_ver_info +Sorry, but your version of Minetest doesn't support the latest API. Please upgrade your minetest.=Ваша версия Minetest не поддерживает последнюю версию API. Пожалуйста, обновите ваш Minetest. +Display Mineclone 2 game version.=Показать версию Mineclone 2. \ No newline at end of file diff --git a/mods/HUD/mcl_ver_info/locale/template.txt b/mods/HUD/mcl_ver_info/locale/template.txt index 75febe815..92e19c66c 100644 --- a/mods/HUD/mcl_ver_info/locale/template.txt +++ b/mods/HUD/mcl_ver_info/locale/template.txt @@ -1,2 +1,3 @@ # textdomain: mcl_ver_info -Sorry, but your version of Minetest doesn't support the latest API. Please upgrade your minetest.= \ No newline at end of file +Sorry, but your version of Minetest doesn't support the latest API. Please upgrade your minetest.= +Display Mineclone 2 game version.= diff --git a/mods/ITEMS/REDSTONE/mcl_comparators/locale/mcl_comparators.ru.tr b/mods/ITEMS/REDSTONE/mcl_comparators/locale/mcl_comparators.ru.tr index 39a845d6e..352526ed6 100644 --- a/mods/ITEMS/REDSTONE/mcl_comparators/locale/mcl_comparators.ru.tr +++ b/mods/ITEMS/REDSTONE/mcl_comparators/locale/mcl_comparators.ru.tr @@ -1,12 +1,12 @@ # textdomain: mcl_comparators -Redstone comparators are multi-purpose redstone components.=Компаратор это многофункциональный элемент редстоуна. -They can transmit a redstone signal, detect whether a block contains any items and compare multiple signals.=Он может передавать сигнал редстоуна, определять, содержит ли блок какой-либо предмет, и сравнивать сигналы. +Redstone comparators are multi-purpose redstone components.=Компаратор это многофункциональный компонент редстоуна. +They can transmit a redstone signal, detect whether a block contains any items and compare multiple signals.=Он может передавать сигнал редстоуна, определять, хранит ли блок предмет, и сравнивать сигналы. A redstone comparator has 1 main input, 2 side inputs and 1 output. The output is in arrow direction, the main input is in the opposite direction. The other 2 sides are the side inputs.=Компаратор имеет 1 основной вход, 2 боковых входа и 1 выход. Выход расположен по направлению стрелки, основной вход в противоположном направлении. Оставшиеся 2 стороны это боковые входы. -The main input can powered in 2 ways: First, it can be powered directly by redstone power like any other component. Second, it is powered if, and only if a container (like a chest) is placed in front of it and the container contains at least one item.=Основной вход можно подключать 2 способами: 1) напрямую к энергии редстоуна, как и любой другой компонент; 2) перед компаратором можно установить контейнер (например, сундук), тогда сигнал будет поступать, если в нём содержится хотя бы один предмет. -The side inputs are only powered by normal redstone power. The redstone comparator can operate in two modes: Transmission mode and subtraction mode. It starts in transmission mode and the mode can be changed by using the block.=К боковым входам можно подводить только обычную энергию редстоуна. Компаратор может работать в двух режимах: ПЕРЕДАЧА и ВЫЧИТАНИЕ. Он изначально находится в режиме передачи; режим меняется при [Использовании] данного блока. -Transmission mode:@nThe front torch is unlit and lowered. The output is powered if, and only if the main input is powered. The two side inputs are ignored.=Режим ПЕРЕДАЧИ:@nПередний индикатор погашен. На выходе появляется энергия редстоуна, только если она подаётся на основной вход. Состояние боковых входов при этом игнорируются. +The main input can powered in 2 ways: First, it can be powered directly by redstone power like any other component. Second, it is powered if, and only if a container (like a chest) is placed in front of it and the container contains at least one item.=Основной вход можно подключать 2 способами: 1) напрямую от сигнала редстоуна, как и любой другой компонент; 2) перед компаратором можно установить контейнер (например, сундук), тогда сигнал будет поступать, если в нём содержится хотя бы один предмет. +The side inputs are only powered by normal redstone power. The redstone comparator can operate in two modes: Transmission mode and subtraction mode. It starts in transmission mode and the mode can be changed by using the block.=К боковым входам можно подводить только сигнал редстоуна. Компаратор может работать в двух режимах: передача и вычитание. Он изначально находится в режиме передачи; режим меняется при использовании данного блока. +Transmission mode:@nThe front torch is unlit and lowered. The output is powered if, and only if the main input is powered. The two side inputs are ignored.=Режим передачи:@nПередний индикатор погашен. На выходе появляется сигнал редстоуна, только если он подаётся на основной вход. Состояние боковых входов при этом игнорируются. Subtraction mode:@nThe front torch is lit. The output is powered if, and only if the main input is powered and none of the side inputs is powered.=Режим ВЫЧИТАНИЯ:@nПередний индикатор светится. На выходе есть сигнал только в том случае, если сигнал есть на основной входе, но при этом его нет ни на одном из боковых входов. Redstone Comparator=Компаратор -Redstone Comparator (Subtract)=Компаратор (ВЫЧИТАНИЕ) -Redstone Comparator (Powered)=Компаратор (ВКЛЮЧЁН) -Redstone Comparator (Subtract, Powered)=Компаратор (ВЫЧИТАНИЕ, ВКЛЮЧЁН) +Redstone Comparator (Subtract)=Компаратор (вычитание) +Redstone Comparator (Powered)=Компаратор (подключён) +Redstone Comparator (Subtract, Powered)=Компаратор (вычитание, подключён) diff --git a/mods/ITEMS/REDSTONE/mcl_dispensers/locale/mcl_dispensers.ru.tr b/mods/ITEMS/REDSTONE/mcl_dispensers/locale/mcl_dispensers.ru.tr index af4d856ec..4a4d5b4fa 100644 --- a/mods/ITEMS/REDSTONE/mcl_dispensers/locale/mcl_dispensers.ru.tr +++ b/mods/ITEMS/REDSTONE/mcl_dispensers/locale/mcl_dispensers.ru.tr @@ -1,25 +1,25 @@ # textdomain: mcl_dispensers -Dispenser=Диспенсер -A dispenser is a block which acts as a redstone component which, when powered with redstone power, dispenses an item. It has a container with 9 inventory slots.=Диспенсер это элемент редстоуна, который при подаче энергии редстоуна выбрасывает предмет. В нём есть контейнер из 9 отсеков инвентаря. -Place the dispenser in one of 6 possible directions. The “hole” is where items will fly out of the dispenser. Use the dispenser to access its inventory. Insert the items you wish to dispense. Supply the dispenser with redstone energy once to dispense a random item.=Направьте диспенсер в одном из 6 возможных направлений. Предметы будут вылетать из отверстия. [Используйте] диспенсер для доступа к его инвентарю. Загрузите туда предметы, которые должны из него выбрасываться. Подайте однократно на диспенсер энергию редстоуна, чтобы выпал случайный предмет. -The dispenser will do different things, depending on the dispensed item:=Диспенсер будет делать разные вещи, в зависимости от выдаваемых предметов: +Dispenser=Раздатчик +A dispenser is a block which acts as a redstone component which, when powered with redstone power, dispenses an item. It has a container with 9 inventory slots.=Раздатчик это компонент редстоуна, который при подаче сигнала редстоуна выбрасывает предмет. В нём есть контейнер из 9 слотов инвентаря. +Place the dispenser in one of 6 possible directions. The “hole” is where items will fly out of the dispenser. Use the dispenser to access its inventory. Insert the items you wish to dispense. Supply the dispenser with redstone energy once to dispense a random item.=Направьте раздатчик в одном из 6 возможных направлений. Предметы будут вылетать из отверстия. Используйте раздатчик для доступа к его инвентарю. Загрузите туда предметы, которые должны из него выбрасываться. Подайте однократно на раздатчик сигнал редстоуна, чтобы он раздал случайный предмет. +The dispenser will do different things, depending on the dispensed item:=Раздатчик будет делать разные вещи, в зависимости от выдаваемых предметов: • Arrows: Are launched=• Стрелы: выстреливают -• Eggs and snowballs: Are thrown=• Яйца и снежки: происходит бросок +• Eggs and snowballs: Are thrown=• Яйца и снежки: бросаются • Fire charges: Are fired in a straight line=• Огненные шары: стреляют по прямой линии -• Armor: Will be equipped to players and armor stands=• Защита: экипирует игроков или стенд защиты +• Armor: Will be equipped to players and armor stands=• Броня: экипирует игроков или стойку для брони • Boats: Are placed on water or are dropped=• Лодки: спускаются на воду -• Minecart: Are placed on rails or are dropped=• Вагонетка: помещается на рельсы -• Bone meal: Is applied on the block it is facing=• Костная мука: применяется к блоку перед диспенсером +• Minecart: Are placed on rails or are dropped=• Вагонетки: помещаются на рельсы +• Bone meal: Is applied on the block it is facing=• Костная мука: применяется к блоку перед раздатчиком • Empty buckets: Are used to collect a liquid source=• Пустые вёдра: используются для набора источника жидкости • Filled buckets: Are used to place a liquid source=• Полные вёдра: используются для размещения источника жидкости -• Heads, pumpkins: Equipped to players and armor stands, or placed as a block=• Головы, тыквы: экипирует игроков, или стенд защиты, или устанавливаются как блоки +• Heads, pumpkins: Equipped to players and armor stands, or placed as a block=• Головы, тыквы: экипирует игроков, стойку для брони, или устанавливаются как блоки • Shulker boxes: Are placed as a block=• Ящик шалкера: устанавливается как блок -• TNT: Is placed and ignited=• Тротил: устанавливается и поджигается -• Flint and steel: Is used to ignite a fire in air and to ignite TNT=• Огниво: используется для зажигания огня в воздухе и для подрыва тротила -• Spawn eggs: Will summon the mob they contain=• Порождающие яйца: будут вызывать мобов, содержащихся в них -• Other items: Are simply dropped=• Другие предметы: просто выдаются -Downwards-Facing Dispenser=• Диспенсер, направленный вниз -Upwards-Facing Dispenser=• Диспенсер, направленный вверх +• TNT: Is placed and ignited=• ТНТ: устанавливается и поджигается +• Flint and steel: Is used to ignite a fire in air and to ignite TNT=• Огниво: используется для зажигания огня в воздухе и для подрыва ТНТ +• Spawn eggs: Will summon the mob they contain=• Яйца спавна: будут вызывать мобов, содержащихся в них +• Other items: Are simply dropped=• Другие предметы: просто выбрасываются +Downwards-Facing Dispenser=• Раздатчик, направленный вниз +Upwards-Facing Dispenser=• Раздатчик, направленный вверх Inventory=Инвентарь -9 inventory slots=9 отсеков инвентаря -Launches item when powered by redstone power=Выбрасывает предметы при подаче энергии редстоуна +9 inventory slots=9 слотов инвентаря +Launches item when powered by redstone power=Выдаёт предметы при подаче сигнала редстоуна diff --git a/mods/ITEMS/REDSTONE/mcl_droppers/locale/mcl_droppers.ru.tr b/mods/ITEMS/REDSTONE/mcl_droppers/locale/mcl_droppers.ru.tr index 22358678a..c4520caf2 100644 --- a/mods/ITEMS/REDSTONE/mcl_droppers/locale/mcl_droppers.ru.tr +++ b/mods/ITEMS/REDSTONE/mcl_droppers/locale/mcl_droppers.ru.tr @@ -1,9 +1,9 @@ # textdomain: mcl_droppers Dropper=Выбрасыватель -A dropper is a redstone component and a container with 9 inventory slots which, when supplied with redstone power, drops an item or puts it into a container in front of it.=Выбрасыватель это элемент редстоуна и контейнер с 9 отсеками инвентаря, срабатывающий по сигналу редстоуна и выбрасывающий предмет, либо выталкивающий его в контейнер, стоящий перед ним. -Droppers can be placed in 6 possible directions, items will be dropped out of the hole. Use the dropper to access its inventory. Supply it with redstone energy once to make the dropper drop or transfer a random item.=Выбрасыватель может быть установлен в 6 возможных направлениях, предметы будут выбрасываться в соответствующем направлении из отверстия. [Используйте] выбрасыватель для доступа к его инвентарю. Подайте на него энергию редстоуна однократно, чтобы заставить его выбросить либо предать один случайный предмет. +A dropper is a redstone component and a container with 9 inventory slots which, when supplied with redstone power, drops an item or puts it into a container in front of it.=Выбрасыватель это компонент редстоуна и контейнер с 9 слотами инвентаря, срабатывающий по сигналу редстоуна и выбрасывающий предмет, либо выталкивающий его в контейнер, стоящий перед ним. +Droppers can be placed in 6 possible directions, items will be dropped out of the hole. Use the dropper to access its inventory. Supply it with redstone energy once to make the dropper drop or transfer a random item.=Выбрасыватель может быть установлен в 6 возможных направлениях, предметы будут выбрасываться в соответствующем направлении из отверстия. Используйте выбрасыватель для доступа к его инвентарю. Подайте на него сигнал редстоуна однократно, чтобы заставить его выбросить либо передать один случайный предмет. Downwards-Facing Dropper=Выбрасыватель, смотрящий вниз Upwards-Facing Dropper=Выбрасыватель, смотрящий вверх Inventory=Инвентарь -9 inventory slots=9 отсеков инвентаря -Drops item when powered by redstone power=Выбрасывает предмет при подаче энергии редстоуна +9 inventory slots=9 слотов инвентаря +Drops item when powered by redstone power=Выбрасывает предмет при подаче сигнала редстоуна diff --git a/mods/ITEMS/REDSTONE/mcl_observers/locale/mcl_observers.ru.tr b/mods/ITEMS/REDSTONE/mcl_observers/locale/mcl_observers.ru.tr index ac8c658c3..18df6aa72 100644 --- a/mods/ITEMS/REDSTONE/mcl_observers/locale/mcl_observers.ru.tr +++ b/mods/ITEMS/REDSTONE/mcl_observers/locale/mcl_observers.ru.tr @@ -1,5 +1,5 @@ # textdomain: mcl_observers Observer=Наблюдатель -An observer is a redstone component which observes the block in front of it and sends a very short redstone pulse whenever this block changes.=Наблюдатель это элемент редстоуна, который следит за блоком перед собой и посылает короткий импульс редстоуна, если этот блок меняется. -Place the observer directly in front of the block you want to observe with the “face” looking at the block. The arrow points to the side of the output, which is at the opposite side of the “face”. You can place your redstone dust or any other component here.=Поместите наблюдателя прямо перед блоком, за которым хотите наблюдать, так, чтобы “лицо” смотрело на этот блок. Стрелка показывает выходную сторону, находящуюся на противоположной стороне от “лица”. Вы можете разместить там пыль редстоуна или любой другой компонент. -Emits redstone pulse when block in front changes=Генерирует импульс редстоуна при смене блока, находящегося перед ним +An observer is a redstone component which observes the block in front of it and sends a very short redstone pulse whenever this block changes.=Наблюдатель это компонент редстоуна, который следит за блоком перед собой и посылает короткий сигнал редстоуна, если этот блок меняется. +Place the observer directly in front of the block you want to observe with the “face” looking at the block. The arrow points to the side of the output, which is at the opposite side of the “face”. You can place your redstone dust or any other component here.=Поместите наблюдателя прямо перед блоком, за которым хотите наблюдать, так, чтобы “лицо” смотрело на этот блок. Стрелка показывает выход, находящийся на противоположной стороне от “лица”. Вы можете разместить там редстоун или любой другой компонент. +Emits redstone pulse when block in front changes=Генерирует сигнал редстоуна при изменении блока находящегося перед ним diff --git a/mods/ITEMS/REDSTONE/mcl_target/locale/mcl_target.ru.tr b/mods/ITEMS/REDSTONE/mcl_target/locale/mcl_target.ru.tr new file mode 100644 index 000000000..c436211e3 --- /dev/null +++ b/mods/ITEMS/REDSTONE/mcl_target/locale/mcl_target.ru.tr @@ -0,0 +1,4 @@ +# textdomain: mcl_target +Target=Мишень +A target is a block that provides a temporary redstone charge when hit by a projectile.=Мишень это блок который генерирует импульс сигнала редстоуна при попадании снаряда. +Throw a projectile on the target to activate it.=Попадите снарядом в мишень, чтобы активировать её. \ No newline at end of file diff --git a/mods/ITEMS/REDSTONE/mesecons_button/locale/mesecons_button.ru.tr b/mods/ITEMS/REDSTONE/mesecons_button/locale/mesecons_button.ru.tr index a89c8098a..164d58fb2 100644 --- a/mods/ITEMS/REDSTONE/mesecons_button/locale/mesecons_button.ru.tr +++ b/mods/ITEMS/REDSTONE/mesecons_button/locale/mesecons_button.ru.tr @@ -1,14 +1,20 @@ # textdomain: mesecons_button -Use the button to push it.=[Используйте] кнопку, чтобы нажать её. +Use the button to push it.=Используйте кнопку, чтобы нажать её. Stone Button=Каменная кнопка -A stone button is a redstone component made out of stone which can be pushed to provide redstone power. When pushed, it powers adjacent redstone components for 1 second.=Каменная кнопка это элемент редстоуна, сделанный из камня, её можно нажать, чтобы получить энергию редстоуна. При нажатии она включает соседние элементы редстоуна на 1 секунду. +A stone button is a redstone component made out of stone which can be pushed to provide redstone power. When pushed, it powers adjacent redstone components for 1 second.=Каменная кнопка это компонент редстоуна, сделанный из камня, её можно нажать, чтобы получить сигнал редстоуна. При нажатии она включает соседние компоненты редстоуна на 1 секунду. +Polished Blackstone Button=Кнопка из полированного чернокамня +A polished blackstone button is a redstone component made out of polished blackstone which can be pushed to provide redstone power. When pushed, it powers adjacent redstone components for 1 second.=Кнопка из полированного чернокамня это компонент редстоуна, сделанный из полированного чернокамня, её можно нажать, чтобы получить сигнал редстоуна. При нажатии она включает соседние компоненты редстоуна на 1 секунду. Oak Button=Дубовая кнопка Acacia Button=Акациевая кнопка Birch Button=Берёзовая кнопка Dark Oak Button=Кнопка из тёмного дуба Spruce Button=Еловая кнопка -Jungle Button=Кнопка из дерева джунглей -A wooden button is a redstone component made out of wood which can be pushed to provide redstone power. When pushed, it powers adjacent redstone components for 1.5 seconds. Wooden buttons may also be pushed by arrows.=Деревянная кнопка это элемент редстоуна, сделанный из дерева, её можно нажать, чтобы получить энергию редстоуна. При нажатии она включает соседние элементы редстоуна на полторы секунды. Деревянные кнопки можно также активировать стрелами. -Provides redstone power when pushed=Выдаёт энергию редстоуна при нажатии +Jungle Button=Кнопка из тропического дерева +Mangrove Button=Мангровая кнопка +Crimson Button=Багровая кнопка +Warped Button=Искажённая кнопка +A wooden button is a redstone component made out of wood which can be pushed to provide redstone power. When pushed, it powers adjacent redstone components for 1.5 seconds. Wooden buttons may also be pushed by arrows.=Деревянная кнопка это компонент редстоуна, сделанный из дерева, её можно нажать, чтобы получить сигнал редстоуна. При нажатии она включает соседние компоненты редстоуна на 1.5 с. Деревянные кнопки нажимаются от попадания стрелы. +Provides redstone power when pushed=Выдаёт сигнал редстоуна при нажатии Push duration: @1s=Длительность нажатия: @1с Pushable by arrow=Нажимается стрелами +A button is a redstone compent which can be pushed to provide redstone power. When pushed, it powers adjacent redstone components for @1 seconds.=Кнопка это компонент редстоуна, её можно нажать, чтобы получить сигнал редстоуна. При нажатии она включает соседние компоненты редстоуна на @1 с. diff --git a/mods/ITEMS/REDSTONE/mesecons_commandblock/locale/mesecons_commandblock.ru.tr b/mods/ITEMS/REDSTONE/mesecons_commandblock/locale/mesecons_commandblock.ru.tr index 85bed4b95..bbd0a262e 100644 --- a/mods/ITEMS/REDSTONE/mesecons_commandblock/locale/mesecons_commandblock.ru.tr +++ b/mods/ITEMS/REDSTONE/mesecons_commandblock/locale/mesecons_commandblock.ru.tr @@ -1,30 +1,30 @@ # textdomain: mesecons_commandblock -Error: The command “@1” does not exist; your command block has not been changed. Use the “help” chat command for a list of available commands.=Ошибка: Команда “@1” не существует; ваш командный блок не был изменён. Используйте чат-команду “help” для поучения списка доступных команд. -Error: The command “@1” does not exist; your command block has not been changed. Use the “help” chat command for a list of available commands. Hint: Try to remove the leading slash.=Ошибка: Команда “@1” не существует; ваш командный блок не был изменён. Используйте чат-команду “help” для поучения списка доступных команд. Подсказка: Попробуйте убрать ведущий слэш. +Error: The command “@1” does not exist; your command block has not been changed. Use the “help” chat command for a list of available commands.=Ошибка: Команда “@1” не существует; ваш командный блок не был изменён. Используйте чат-команду “help” для получения списка доступных команд. +Error: The command “@1” does not exist; your command block has not been changed. Use the “help” chat command for a list of available commands. Hint: Try to remove the leading slash.=Ошибка: Команда “@1” не существует; ваш командный блок не был изменён. Используйте чат-команду “help” для получения списка доступных команд. Подсказка: Попробуйте убрать ведущий слэш. Error: You have insufficient privileges to use the command “@1” (missing privilege: @2)! The command block has not been changed.=Ошибка: Вы не имеете привилегий для использования команды “@1” (отсутствует привилегия: @2)! Командный блок не был изменён. Error: No commander! Block must be replaced.=Ошибка: Нет командующего! Блок следует заменить. Commander: @1=Командующий: @1 -Submit=Отправить +Submit=Принять No commands.=Нет команд. Commands:=Команды: Help=Помощь Placement denied. You need the “maphack” privilege to place command blocks.=Установка запрещена. Для установки командных блоков нужно иметь привилегию “maphack”. Command Block=Командный блок -Command blocks are mighty redstone components which are able to alter reality itself. In other words, they cause the server to execute server commands when they are supplied with redstone power.=Командные блоки это мощнейшие компоненты редстоуна, способные изменять реальность сами по себе. Другими словами, они могут заставлять сервер выполнять серверные команды, если подать на них энергию редстоуна. -Everyone can activate a command block and look at its commands, but not everyone can edit and place them.=Каждый может активировать командный блок и увидеть его команды, но не все могут редактировать и устанавливать его. -To view the commands in a command block, use it. To activate the command block, just supply it with redstone power. This will execute the commands once. To execute the commands again, turn the redstone power off and on again.=Чтобы увидеть команды в командном блоке, [используйте] его. Чтобы активировать блок, просто подайте на него энергию редстоуна. При этом команды выполнятся однократно. Чтобы выполнить их вновь, выключите и снова включите энергию редстоуна. -To be able to place a command block and change the commands, you need to be in Creative Mode and must have the “maphack” privilege. A new command block does not have any commands and does nothing. Use the command block (in Creative Mode!) to edit its commands. Read the help entry “Advanced usage > Server Commands” to understand how commands work. Each line contains a single command. You enter them like you would in the console, but without the leading slash. The commands will be executed from top to bottom.=Чтобы иметь возможность устанавливать командные блоки и изменять их команды, вы должны находиться в творческом режиме и иметь привилегию “maphack”. Новый командный блок не содержит команд и ничего не делает. [Используйте] командный блок (в творческом режиме!) для редактирования его команд. Изучите справочную запись “Продвинутое использование > Серверные команды”, чтобы понять, как они работают. Каждая строка содержит одну команду. Вы вводите их так, как вводили бы в консоли, но без ведущих символов слэш. Команды выполняются сверху вниз. +Command blocks are mighty redstone components which are able to alter reality itself. In other words, they cause the server to execute server commands when they are supplied with redstone power.=Командные блоки это мощнейшие компоненты редстоуна, способные изменять саму реальность. Другими словами, они могут заставлять сервер выполнять серверные команды, если подать на них сигнал редстоуна. +Everyone can activate a command block and look at its commands, but not everyone can edit and place them.=Каждый может активировать командный блок и увидеть его команды, но не все могут ставить и редактировать его. +To view the commands in a command block, use it. To activate the command block, just supply it with redstone power. This will execute the commands once. To execute the commands again, turn the redstone power off and on again.=Чтобы просмотреть команды в командном блоке, используйте его. Чтобы активировать блок, просто подайте на него сигнал редстоуна. При этом команды выполнятся однократно. Чтобы выполнить их вновь, выключите и снова включите сигнал редстоуна. +To be able to place a command block and change the commands, you need to be in Creative Mode and must have the “maphack” privilege. A new command block does not have any commands and does nothing. Use the command block (in Creative Mode!) to edit its commands. Read the help entry “Advanced usage > Server Commands” to understand how commands work. Each line contains a single command. You enter them like you would in the console, but without the leading slash. The commands will be executed from top to bottom.=Чтобы иметь возможность устанавливать командные блоки и изменять их команды, вы должны находиться в творческом режиме и иметь привилегию “maphack”. Новый командный блок не содержит команд и ничего не делает. Используйте командный блок (в творческом режиме!) для редактирования его команд. Изучите справочную запись “Продвинутое использование > Серверные команды”, чтобы понять, как они работают. Каждая строка содержит одну команду. Вы вводите их так, как вводили бы в консоли, но без ведущих символов слэш. Команды выполняются сверху вниз. All commands will be executed on behalf of the player who placed the command block, as if the player typed in the commands. This player is said to be the “commander” of the block.=Все команды будут выполняться от имени игрока, разместившего командный блок, как будто если бы игрок сам их набирал. Этот игрок является так называемым “командиром” блока. -Command blocks support placeholders, insert one of these placeholders and they will be replaced by some other text:=Командные блоки поддерживаю шаблоны, вставляйте один из них - и они будут заменены на нужный вам текст: +Command blocks support placeholders, insert one of these placeholders and they will be replaced by some other text:=Командные блоки поддерживают шаблоны, вставляйте один из них - и они будут заменены на нужный вам текст: • “@@c”: commander of this command block=• “@@c”: командир данного командного блока • “@@n” or “@@p”: nearest player from the command block=• “@@n” или “@@p”: игрок, находящийся ближе всего к данному командному блоку • “@@f” farthest player from the command block=• “@@f” игрок, находящийся дальше всего от данного командного блока • “@@r”: random player currently in the world=• “@@r”: случайный игрок, в данный момент присутствующий в мире • “@@@@”: literal “@@” sign=• “@@@@”: если нужно использовать символ “@@” сам по себе -Example 1:@n time 12000@nSets the game clock to 12:00=Пример 1:@n time 12000@nУстанавливает игровые часы на 12:00 +Example 1:@n time 12000@nSets the game clock to 12:00=Пример 1:@n time 12000@nУстанавливает игровое время на 12:00 Example 2:@n give @@n mcl_core:apple 5@nGives the nearest player 5 apples=Пример 2:@n give @@n mcl_core:apple 5@nДаёт ближайшему игроку 5 яблок Access denied. You need the “maphack” privilege to edit command blocks.=Доступ запрещён. Вам нужно иметь привилегию “maphack”, чтобы редактировать командные блоки. -Editing the command block has failed! You can only change the command block in Creative Mode!=Попытка редактирования командного блока потерпела неудачу. Вы можете изменять командные блоки только в творческом режиме! -Editing the command block has failed! The command block is gone.=Попытка редактирования командного блока потерпела неудачу. Командный блок исчез. -Executes server commands when powered by redstone power=При подаче энергии редстоуна выполняет серверные команды -Command blocks are not enabled on this server= +Editing the command block has failed! You can only change the command block in Creative Mode!=Попытка редактирования командного блока неудалась. Вы можете изменять командные блоки только в творческом режиме! +Editing the command block has failed! The command block is gone.=Попытка редактирования командного блока неудалась. Командный блок исчез. +Executes server commands when powered by redstone power=При подаче сигнала редстоуна выполняет серверные команды +Command blocks are not enabled on this server=Командные блоки отключены на этом сервере diff --git a/mods/ITEMS/REDSTONE/mesecons_delayer/locale/mesecons_delayer.ru.tr b/mods/ITEMS/REDSTONE/mesecons_delayer/locale/mesecons_delayer.ru.tr index f95d3ee8e..3a6570c98 100644 --- a/mods/ITEMS/REDSTONE/mesecons_delayer/locale/mesecons_delayer.ru.tr +++ b/mods/ITEMS/REDSTONE/mesecons_delayer/locale/mesecons_delayer.ru.tr @@ -1,13 +1,13 @@ # textdomain: mesecons_delayer Redstone repeaters are versatile redstone components with multiple purposes: 1. They only allow signals to travel in one direction. 2. They delay the signal. 3. Optionally, they can lock their output in one state.=Повторители это универсальные компоненты, выполняющие много задач: 1. Разрешают сигналам проходить только в одном направлении. 2. Задерживают сигнал. 3. Опционально они могут зафиксировать свой выходной сигнал в одном состоянии. -To power a redstone repeater, send a signal in “arrow” direction (the input). The signal goes out on the opposite side (the output) with a delay. To change the delay, use the redstone repeater. The delay is between 0.1 and 0.4 seconds long and can be changed in steps of 0.1 seconds. It is indicated by the position of the moving redstone torch.=Чтобы подключить повторитель, подайте сигнал в направлении “стрелки” (на вход). Сигнал выйдет с противоположной стороны (с выхода) с задержкой. Чтобы изменить задержку, [используйте] повторитель. Время задержки лежит между 0.1 и 0.4 секунды и может изменяться с шагом 0.1 секунды. Его отражает положение передвигающегося факела редстоуна. +To power a redstone repeater, send a signal in “arrow” direction (the input). The signal goes out on the opposite side (the output) with a delay. To change the delay, use the redstone repeater. The delay is between 0.1 and 0.4 seconds long and can be changed in steps of 0.1 seconds. It is indicated by the position of the moving redstone torch.=Чтобы подключить повторитель, подайте сигнал на вход в направлении “стрелки”. Сигнал выйдет с противоположной стороны с задержкой. Чтобы изменить задержку, используйте повторитель. Время задержки изменяется от 0.1 до 0.4 секунды и может изменяться с шагом 0.1 секунды. Время задержки отражает положение передвигающегося факела редстоуна. To lock a repeater, send a signal from an adjacent repeater into one of its sides. While locked, the moving redstone torch disappears, the output doesn't change and the input signal is ignored.=Чтобы зафиксировать повторитель, подайте сигнал от соседнего повторителя на одну из его сторон. При фиксации передвижной факел редстоуна исчезает, выходной сигнал не меняется, а входной сигнал игнорируется. Redstone Repeater=Повторитель Redstone Repeater (Powered)=Повторитель (подключённый) -Redstone Repeater (Locked)=Повторитель (зафиксированный) -Redstone Repeater (Locked, Powered)=Повторитель (зафиксированный, подключённый) +Redstone Repeater (Locked)=Повторитель (фиксированный) +Redstone Repeater (Locked, Powered)=Повторитель (фиксированный, подключённый) Redstone Repeater (Delay @1)=Повторитель (задержка @1) Redstone Repeater (Delay @1, Powered)=Повторитель (задержка @1, подключённый) -Transmits redstone power only in one direction=Передаёт энергию редстоуна только в одном направлении +Transmits redstone power only in one direction=Передаёт сигнал редстоуна только в одном направлении Delays signal=Задерживает сигнал Output locks when getting active redstone repeater signal from the side=Выход фиксируется при наличии активного сигнала сбоку diff --git a/mods/ITEMS/REDSTONE/mesecons_lightstone/locale/mesecons_lightstone.ru.tr b/mods/ITEMS/REDSTONE/mesecons_lightstone/locale/mesecons_lightstone.ru.tr index cd1592a28..104b2fc7d 100644 --- a/mods/ITEMS/REDSTONE/mesecons_lightstone/locale/mesecons_lightstone.ru.tr +++ b/mods/ITEMS/REDSTONE/mesecons_lightstone/locale/mesecons_lightstone.ru.tr @@ -1,4 +1,4 @@ # textdomain: mesecons_lightstone -Redstone Lamp=Лампа редстоуна -Redstone lamps are simple redstone components which glow brightly (light level @1) when they receive redstone power.=Лампа редстоуна это простой компонент редстоуна, который ярко светится (уровень света @1) при подаче на него энергии редстоуна. -Glows when powered by redstone power=Светит при подаче энергии редстоуна +Redstone Lamp=Лампа +Redstone lamps are simple redstone components which glow brightly (light level @1) when they receive redstone power.=Лампа это простой компонент редстоуна, который ярко светится (уровень света @1) при подаче на него сигнала редстоуна. +Glows when powered by redstone power=Светится при подаче сигнала редстоуна diff --git a/mods/ITEMS/REDSTONE/mesecons_noteblock/locale/mesecons_noteblock.ru.tr b/mods/ITEMS/REDSTONE/mesecons_noteblock/locale/mesecons_noteblock.ru.tr index fbac4366f..35c44abae 100644 --- a/mods/ITEMS/REDSTONE/mesecons_noteblock/locale/mesecons_noteblock.ru.tr +++ b/mods/ITEMS/REDSTONE/mesecons_noteblock/locale/mesecons_noteblock.ru.tr @@ -1,22 +1,22 @@ # textdomain: mesecons_noteblock Note Block=Нотный блок -A note block is a musical block which plays one of many musical notes and different intruments when it is punched or supplied with redstone power.=Нотный блок это музыкальный блок, который при ударе, а также при подаче энергии редстоуна проигрывает одну из множества музыкальных нот различными инструментами. -Use the note block to choose the next musical note (there are 25 semitones, or 2 octaves). The intrument played depends on the material of the block below the note block:=[Используйте] нотный блок, чтобы выбрать следующую ноту (всего предусмотрено 25 полутонов или 2 октавы). Проигрываемый инструмент зависит от материала, который находится непосредственно под нотным блоком. +A note block is a musical block which plays one of many musical notes and different intruments when it is punched or supplied with redstone power.=Нотный блок это музыкальный блок, который при ударе или при подаче сигнала редстоуна проигрывает одну из множества музыкальных нот различными инструментами. +Use the note block to choose the next musical note (there are 25 semitones, or 2 octaves). The intrument played depends on the material of the block below the note block:=Используйте нотный блок, чтобы выбрать следующую ноту (всего предусмотрено 25 полутонов или 2 октавы). Проигрываемый инструмент зависит от материала, который находится непосредственно под нотным блоком. • Glass: Sticks=• Стекло: палочки -• Wood: Bass guitar=• Дерево: бас-гитара -• Stone: Bass drum=• Камень: бочка -• Sand or gravel: Snare drum=• Песок или гравий: барабан +• Wood: Bass guitar=• Древесина: бас-гитара +• Stone: Bass drum=• Камень: большой барабан +• Sand or gravel: Snare drum=• Песок или гравий: малый барабан • Anything else: Piano=• Что-либо другое: фортепиано • Block of Gold: Bell=• Золотой блок: колокол -• Clay: Flute=• Глина: флейта -• Packed Ice: Chime=• Упакованный лёд: звон +• Clay: Flute=• Блок глины: флейта +• Packed Ice: Chime=• Плотный лёд: звон • Wool: Guitar=• Шерсть: гитара • Bone Block: Xylophne=• Костный блок: ксилофон -• Block of Iron: Iron xylophne=• Железный блок: металлофон +• Block of Iron: Iron xylophne=• Железный блок: металлический ксилофон • Soul Sand: Cow bell=• Песок душ: колокольчик • Pumpkin: Didgeridoo=• Тыква: диджериду • Block of Emerald: Square wave=• Изумрудный блок: прямоугольный сигнал • Hay Bale: Banjo=• Стог сена: банджо -• Glowstone: Electric piano=• Электронное фортепиано -The note block will only play a note when it is below air, otherwise, it stays silent.=Нотный блок проигрывает ноту только когда над ним имеется воздух, в противном случае он остаётся тихим. -Plays a musical note when powered by redstone power=Проигрывает ноту при подключении энергии редстоуна +• Glowstone: Electric piano=• Светокамень: электронное фортепиано +The note block will only play a note when it is below air, otherwise, it stays silent.=Нотный блок проигрывает ноту только когда над ним имеется воздух, в противном случае он звука не издает. +Plays a musical note when powered by redstone power=Проигрывает ноту от сигнала редстоуна diff --git a/mods/ITEMS/REDSTONE/mesecons_pistons/locale/mesecons_pistons.ru.tr b/mods/ITEMS/REDSTONE/mesecons_pistons/locale/mesecons_pistons.ru.tr index d69542e79..2f108ac3e 100644 --- a/mods/ITEMS/REDSTONE/mesecons_pistons/locale/mesecons_pistons.ru.tr +++ b/mods/ITEMS/REDSTONE/mesecons_pistons/locale/mesecons_pistons.ru.tr @@ -1,8 +1,8 @@ # textdomain: mesecons_pistons -This block can have one of 6 possible orientations.=Этот блок быть ориентирован в одном из 6 возможных направлений. +This block can have one of 6 possible orientations.=Этот блок быть повёрнут в одном из 6 возможных направлений. Piston=Поршень -A piston is a redstone component with a pusher which pushes the block or blocks in front of it when it is supplied with redstone power. Not all blocks can be pushed, however.=Поршень это компонент редстоуна с толкателем, который толкает блок или блоки перед собой при подаче энергии редстоуна. Следует отметить, что не все блоки могут быть сдвинуты. +A piston is a redstone component with a pusher which pushes the block or blocks in front of it when it is supplied with redstone power. Not all blocks can be pushed, however.=Поршень это компонент редстоуна с толкателем, который толкает блок или блоки перед собой при подаче сигнала редстоуна. Следует отметить, что не все блоки могут быть сдвинуты. Sticky Piston=Липкий поршень -A sticky piston is a redstone component with a sticky pusher which can be extended and retracted. It extends when it is supplied with redstone power. When the pusher extends, it pushes the block or blocks in front of it. When it retracts, it pulls back the single block in front of it. Note that not all blocks can be pushed or pulled.=Липкий поршень представляет собой компонент редстоуна с липким толкателем, который можно удлинять и втягивать обратно. Он расширяется, когда на него подается энергия красного камня. Когда толкатель выдвигается, он толкает блок или блоки перед собой. Когда он втягивается, он возвращает обратно один блок перед собой. Следует отметить, что не все блоки могут быть сдвинуты. или втянуты. -Pushes block when powered by redstone power=Толкает блок при подаче энергии редстоуна -Pushes or pulls block when powered by redstone power=Толкает или тянет блок при подаче энергии редстоуна +A sticky piston is a redstone component with a sticky pusher which can be extended and retracted. It extends when it is supplied with redstone power. When the pusher extends, it pushes the block or blocks in front of it. When it retracts, it pulls back the single block in front of it. Note that not all blocks can be pushed or pulled.=Липкий поршень представляет собой компонент редстоуна с липким толкателем, который можно выдвигать и втягивать обратно. Он выдвигается, когда на него подается сигнал красного камня. Когда толкатель выдвигается, он толкает блок или блоки перед собой. Когда он втягивается, он возвращает обратно один блок перед собой. Следует отметить, что не все блоки могут быть сдвинуты или втянуты. +Pushes block when powered by redstone power=Толкает блок при подаче сигнала редстоуна +Pushes or pulls block when powered by redstone power=Толкает или втягивает блок при подаче сигнала редстоуна diff --git a/mods/ITEMS/REDSTONE/mesecons_pressureplates/locale/mesecons_pressureplates.ru.tr b/mods/ITEMS/REDSTONE/mesecons_pressureplates/locale/mesecons_pressureplates.ru.tr index fcd81f451..1efeb7805 100644 --- a/mods/ITEMS/REDSTONE/mesecons_pressureplates/locale/mesecons_pressureplates.ru.tr +++ b/mods/ITEMS/REDSTONE/mesecons_pressureplates/locale/mesecons_pressureplates.ru.tr @@ -1,16 +1,21 @@ # textdomain: mesecons_pressureplates -A pressure plate is a redstone component which supplies its surrounding blocks with redstone power while someone or something rests on top of it.=Нажимаемая панель это компонент редстоуна, который начинает снабжать энергией редстоуна окружающие его блоки, когда кто-то или что-то находится прямо на нём. -Oak Pressure Plate=Дубовая нажимная панель -Acacia Pressure Plate=Акациевая нажимная панель -Birch Pressure Plate=Берёзовая нажимная панель -Dark Oak Pressure Plate=Нажимная панель из тёмного дуба -Spruce Pressure Plate=Еловая нажимная панель -Jungle Pressure Plate=Нажимная панель из дерева джунглей -A wooden pressure plate is a redstone component which supplies its surrounding blocks with redstone power while any movable object (including dropped items, players and mobs) rests on top of it.=Деревянная нажимная панель это компонент редстоуна, который начинает снабжать энергией редстоуна окружающие его блоки, когда любой движущийся объект (включая брошенные предметы, игроков и мобов) находится прямо на нём. -Stone Pressure Plate=Каменная нажимная панель -A stone pressure plate is a redstone component which supplies its surrounding blocks with redstone power while a player or mob stands on top of it. It is not triggered by anything else.=Каменная нажимная панель это компонент редстоуна, который начинает снабжать энергией редстоуна окружающие его блоки, когда игрок или моб находится прямо на нём. От чего-то другого он не сработает. -Provides redstone power when pushed=Производит энергию редстоуна при нажимании -Pushable by players, mobs and objects=Нажимается игроками, мобами и объектами +A pressure plate is a redstone component which supplies its surrounding blocks with redstone power while someone or something rests on top of it.=Нажимная плита это компонент редстоуна, который выдает сигнал редстоуна окружающим его блокам, когда кто-то или что-то находится прямо на нём. +Oak Pressure Plate=Дубовая нажимная плита +Acacia Pressure Plate=Акациевая нажимная плита +Birch Pressure Plate=Берёзовая нажимная плита +Dark Oak Pressure Plate=Нажимная плита из тёмного дуба +Spruce Pressure Plate=Еловая нажимная плита +Jungle Pressure Plate=Нажимная плита из тропического дерева +Mangrove Pressure Plate=Мангровая нажимная плита +Crimson Pressure Plate=Багровая нажимная плита +Warped Pressure Plate=Искажённая нажимная плита +A wooden pressure plate is a redstone component which supplies its surrounding blocks with redstone power while any movable object (including dropped items, players and mobs) rests on top of it.=Деревянная нажимная плита это компонент редстоуна, который выдаёт сигнал редстоуна окружающим его блокам, когда любой движущийся объект (включая брошенные предметы, игроков и мобов) находится прямо на нём. +Polished Blackstone Pressure Plate=Нажимная плита из полированного чернокамня +A polished blackstone pressure plate is a redstone component which supplies its surrounding blocks with redstone power while a player or mob stands on top of it. It is not triggered by anything else.=Нажимная плита из полированного чернокамня это компонент редстоуна, который выдает сигнал редстоуна окружающим его блокам, когда игрок или моб находится прямо на нём. От чего-то другого она не сработает. +Stone Pressure Plate=Каменная нажимная плита +A stone pressure plate is a redstone component which supplies its surrounding blocks with redstone power while a player or mob stands on top of it. It is not triggered by anything else.=Каменная нажимная плита это компонент редстоуна, который выдает сигнал редстоуна окружающим его блокам, когда игрок или моб находится прямо на нём. От чего-то другого она не сработает. +Provides redstone power when pushed=Производит сигнал редстоуна при нажатии +Pushable by players, mobs and objects=Нажимается игроками, мобами и предметами Pushable by players and mobs=Нажимается игроками и мобами Pushable by players=Нажимается игроками Pushable by mobs=Нажимается мобами diff --git a/mods/ITEMS/REDSTONE/mesecons_solarpanel/locale/mesecons_solarpanel.ru.tr b/mods/ITEMS/REDSTONE/mesecons_solarpanel/locale/mesecons_solarpanel.ru.tr index 108cb9f75..99859bb89 100644 --- a/mods/ITEMS/REDSTONE/mesecons_solarpanel/locale/mesecons_solarpanel.ru.tr +++ b/mods/ITEMS/REDSTONE/mesecons_solarpanel/locale/mesecons_solarpanel.ru.tr @@ -1,8 +1,8 @@ # textdomain: mesecons_solarpanel Daylight Sensor=Датчик дневного света -Daylight sensors are redstone components which provide redstone power when they are in sunlight and no power otherwise. They can also be inverted.=Датчик дневного света это компонент редстоуна, который производит энергию редстоуна при нахождении в солнечном свете и не производит в противном случае. Он также может быть инвертирован. -Use the daylight sensor to toggle its state.=[Используйте] датчик дневного света для смены его состояния +Daylight sensors are redstone components which provide redstone power when they are in sunlight and no power otherwise. They can also be inverted.=Датчик дневного света это компонент редстоуна, который производит сигнал редстоуна при солнечном свете и не производит в противном случае. Он также может быть инвертирован. +Use the daylight sensor to toggle its state.=Используйте датчик дневного света для смены его состояния Inverted Daylight Sensor=Инвертированный датчик дневного света -In inverted state, they provide redstone power when they are not in sunlight and no power otherwise.=В инвертированном состоянии он производит энергию редстоуна, когда на него не попадает солнечны свет, а когда попадает - перестаёт производить. -Provides redstone power when in sunlight=Генерирует энергию редстоуна в солнечном свете +In inverted state, they provide redstone power when they are not in sunlight and no power otherwise.=В инвертированном состоянии он производит сигнал редстоуна, когда на него не попадает солнечный свет, а когда попадает - перестаёт производить. +Provides redstone power when in sunlight=Генерирует сигнал редстоуна от солнечного света Can be inverted=Может быть инвертирован diff --git a/mods/ITEMS/REDSTONE/mesecons_torch/locale/mesecons_torch.ru.tr b/mods/ITEMS/REDSTONE/mesecons_torch/locale/mesecons_torch.ru.tr index 45d0d7667..c3f365f1b 100644 --- a/mods/ITEMS/REDSTONE/mesecons_torch/locale/mesecons_torch.ru.tr +++ b/mods/ITEMS/REDSTONE/mesecons_torch/locale/mesecons_torch.ru.tr @@ -1,10 +1,10 @@ # textdomain: mesecons_torch -Redstone Torch=Факел редстоуна -Redstone Torch (off)=Факел редстоуна (выкл) -Redstone Torch (overheated)=Факел редстоуна (перегрелся) -A redstone torch is a redstone component which can be used to invert a redstone signal. It supplies its surrounding blocks with redstone power, except for the block it is attached to. A redstone torch is normally lit, but it can also be turned off by powering the block it is attached to. While unlit, a redstone torch does not power anything.=Факел редстоуна это компонент, способный инвертировать сигнал редстоуна. Он обеспечивает энергией редстоуна окружающие блоки, за исключением того блока, к которому он присоединён. Факел редстоуна обычно горит, но он также может быть выключен путём подведения энергии редстоуна к тому блоку, к которому он присоединён. Когда он не горит, то не снабжает энергией окружающие блоки. -Redstone torches can be placed at the side and on the top of full solid opaque blocks.=Факелы редстоуна могут быть установлены по краям и на верхней части любого целого плотного твёрдого блока. +Redstone Torch=Красный факел +Redstone Torch (off)=Красный факел (выкл) +Redstone Torch (overheated)=Красный факел (перегорел) +A redstone torch is a redstone component which can be used to invert a redstone signal. It supplies its surrounding blocks with redstone power, except for the block it is attached to. A redstone torch is normally lit, but it can also be turned off by powering the block it is attached to. While unlit, a redstone torch does not power anything.=Красный факел это компонент, способный инвертировать сигнал редстоуна. Он подает сигнал редстоуна на окружающие блоки, за исключением того блока, к которому он присоединён. Красный факел обычно горит, но он также может быть выключен путём подведения сигнала редстоуна к тому блоку, к которому он присоединён. Когда он не горит, то не снабжает сигналом окружающие блоки. +Redstone torches can be placed at the side and on the top of full solid opaque blocks.=Красный факел может быть установлен по краям и сверху любого целого твёрдого непрозрачного блока. Block of Redstone=Блок редстоуна -A block of redstone permanently supplies redstone power to its surrounding blocks.=Блок редстоуна напрямую снабжает энергией окружающие блоки -Provides redstone power when it's not powered itself=Снабжает энергией редстоуна, если не подключён сам -Provides redstone power=Снабжает энергией редстоуна +A block of redstone permanently supplies redstone power to its surrounding blocks.=Блок редстоуна напрямую снабжает сигналом редстоуна окружающие блоки +Provides redstone power when it's not powered itself=Снабжает сигналом редстоуна, если не подключён сам +Provides redstone power=Снабжает сигналом редстоуна diff --git a/mods/ITEMS/REDSTONE/mesecons_walllever/locale/mesecons_walllever.ru.tr b/mods/ITEMS/REDSTONE/mesecons_walllever/locale/mesecons_walllever.ru.tr index 00a3e84f1..80aff1e84 100644 --- a/mods/ITEMS/REDSTONE/mesecons_walllever/locale/mesecons_walllever.ru.tr +++ b/mods/ITEMS/REDSTONE/mesecons_walllever/locale/mesecons_walllever.ru.tr @@ -1,5 +1,5 @@ # textdomain: mesecons_walllever Lever=Рычаг -A lever is a redstone component which can be flipped on and off. It supplies redstone power to adjacent blocks while it is in the “on” state.=Рычаг это компонент редстоуна, который можно включать и выключать. Он подаёт энергию редстоуна на соседние блоки, пока он находится во «включённом» состоянии. -Use the lever to flip it on or off.=[Используйте] рычаг, чтобы перещёлкнуть его во включённое или выключенное положение . -Provides redstone power while it's turned on=Снабжает энергией редстоуна, когда включён +A lever is a redstone component which can be flipped on and off. It supplies redstone power to adjacent blocks while it is in the “on” state.=Рычаг это компонент редстоуна, который можно включать и выключать. Он подаёт сигнал редстоуна на соседние блоки, пока он находится во включённом состоянии. +Use the lever to flip it on or off.=Используйте рычаг, чтобы перещёлкнуть его во включённое или выключенное положение. +Provides redstone power while it's turned on=Подаёт сигнал редстоуна когда включён diff --git a/mods/ITEMS/REDSTONE/mesecons_wires/locale/mesecons_wires.ru.tr b/mods/ITEMS/REDSTONE/mesecons_wires/locale/mesecons_wires.ru.tr index 4316613b0..9c1b05615 100644 --- a/mods/ITEMS/REDSTONE/mesecons_wires/locale/mesecons_wires.ru.tr +++ b/mods/ITEMS/REDSTONE/mesecons_wires/locale/mesecons_wires.ru.tr @@ -1,11 +1,11 @@ # textdomain: mesecons_wires -Redstone is a versatile conductive mineral which transmits redstone power. It can be placed on the ground as a trail.=Редстоун является универсальным проводящим минералом, который передает энергию красного камня. Он может размещаться на поверхности как дорожка. -A redstone trail can be in two states: Powered or not powered. A powered redstone trail will power (and thus activate) adjacent redstone components.=Дорожка редстоуна может быть в двух состояниях: включена или выключена. Включённая дорожка редстоуна будет снабжать (а значит, активировать) смежные компоненты редстоуна. -Redstone power can be received from various redstone components, such as a block of redstone or a button. Redstone power is used to activate numerous mechanisms, such as redstone lamps or pistons.=Энергию редстоуна можно получать от различных компонентов редстоуна, таких как блок редстоуна или кнопка. Эта энергия используется для активации многочисленных механизмов, таких как лампы редстоуна или поршни. -Place redstone on the ground to build a redstone trail. The trails will connect to each other automatically and it can also go over hills. An easy way to power a redstone trail is by placing a redstone torch.=Поместите редстоун на землю, чтобы создать из него дорожку. Фрагменты дорожек будут соединяться между собой автоматически и могут даже проходить по холмам. Простой способ подать энергию редстоуна к дорожке редстоуна это установка факела редстоуна. +Redstone is a versatile conductive mineral which transmits redstone power. It can be placed on the ground as a trail.=Редстоун является универсальным проводящим минералом, который передает сигнал красного камня. Он может размещаться на поверхности как дорожка. +A redstone trail can be in two states: Powered or not powered. A powered redstone trail will power (and thus activate) adjacent redstone components.=Дорожка редстоуна может быть в двух состояниях: подключенная или отключенная. Подключенная дорожка редстоуна будет снабжать (а значит, активировать) рядом стоящие компоненты редстоуна. +Redstone power can be received from various redstone components, such as a block of redstone or a button. Redstone power is used to activate numerous mechanisms, such as redstone lamps or pistons.=Сигнал редстоуна можно получать от различных компонентов редстоуна, таких как блок редстоуна или кнопка. Этот сигнал используется для активации многочисленных механизмов, таких как лампы или поршни. +Place redstone on the ground to build a redstone trail. The trails will connect to each other automatically and it can also go over hills. An easy way to power a redstone trail is by placing a redstone torch.=Поместите редстоун на землю, чтобы создать из него дорожку. Фрагменты дорожек будут соединяться между собой автоматически и могут даже проходить по холмам. Простой способ подать сигнал редстоуна к дорожке редстоуна это установка красного факела. Read the help entries on the other redstone components to learn how redstone components interact.=Смотрите справочные записи к остальным компонентам редстоуна, чтобы узнать больше об их взаимодействии. Redstone=Редстоун -Powered Redstone Spot (@1)=Подключённое пятно редстоуна (@1) +Powered Redstone Spot (@1)=Подключенное пятно редстоуна (@1) Redstone Trail (@1)=Дорожка редстоуна (@1) -Powered Redstone Trail (@1)=Подключённая дорожка редстоуна (@1) -Transmits redstone power, powers mechanisms=Передаёт энергию редстоуна, подключает механизмы +Powered Redstone Trail (@1)=Подключенная дорожка редстоуна (@1) +Transmits redstone power, powers mechanisms=Передаёт сигнал редстоуна, подключает механизмы diff --git a/mods/ITEMS/mcl_amethyst/locale/mcl_amethyst.ru.tr b/mods/ITEMS/mcl_amethyst/locale/mcl_amethyst.ru.tr index 9f1d0f572..3ca786c68 100644 --- a/mods/ITEMS/mcl_amethyst/locale/mcl_amethyst.ru.tr +++ b/mods/ITEMS/mcl_amethyst/locale/mcl_amethyst.ru.tr @@ -1,8 +1,8 @@ # textdomain: mcl_amethyst Amethyst Cluster=Аметистовая друза -Amethyst Cluster is the final growth of amethyst bud.=Аметистовая друза - это последняя 4-я стадия роста аметистового бутона. -Amethyst Shard=Осколок аметиста -An amethyst shard is a crystalline mineral.=Осколок аметиста - это кристаллический минерал, получаемый в результате разрушения кластеров аметиста. +Amethyst Cluster is the final growth of amethyst bud.=Аметистовая друза это последняя 4-я стадия роста аметистового бутона. +Amethyst Shard=Аметистовый осколок +An amethyst shard is a crystalline mineral.=Осколок аметиста это кристаллический минерал, получаемый в результате разрушения кластеров аметиста. Block of Amethyst=Аметистовый блок Budding Amethyst=Растущий аметист Calcite=Кальцит @@ -13,7 +13,7 @@ Medium Amethyst Bud=Средний росток аметиста Medium Amethyst Bud is the second growth of amethyst bud.=Средний росток - вторая стадия роста аметиста. Small Amethyst Bud=Маленький росток аметиста Small Amethyst Bud is the first growth of amethyst bud.=Маленький росток - первая стадия роста аметиста. -The Block of Amethyst is a decoration block crafted from amethyst shards.=Блок аметиста - декоративный блок, скрафченный из осколков аметиста. +The Block of Amethyst is a decoration block crafted from amethyst shards.=Блок аметиста это декоративный блок, созданный из осколков аметиста. The Budding Amethyst can grow amethyst=Растущий аметист может вырастить аметист Tinted Glass=Тонированное стекло Tinted Glass is a type of glass which blocks lights while it is visually transparent.=Тонированное стекло блокирует свет, но визуально прозрачно. diff --git a/mods/ITEMS/mcl_anvils/locale/mcl_anvils.ru.tr b/mods/ITEMS/mcl_anvils/locale/mcl_anvils.ru.tr index 20281bd6b..40aef2121 100644 --- a/mods/ITEMS/mcl_anvils/locale/mcl_anvils.ru.tr +++ b/mods/ITEMS/mcl_anvils/locale/mcl_anvils.ru.tr @@ -1,16 +1,16 @@ # textdomain: mcl_anvils Set Name=Дать имя -Repair and Name=Починить и дать имя +Repair and Name=Починить и переименовать Inventory=Инвентарь Anvil=Наковальня -The anvil allows you to repair tools and armor, and to give names to items. It has a limited durability, however. Don't let it fall on your head, it could be quite painful!=Наковальня позволяет ремонтировать инструменты и защиту, а также давать имена предметам. Но она имеет ограниченный срок службы. Не дайте ей упасть вам на голову, это может быть больно! -To use an anvil, rightclick it. An anvil has 2 input slots (on the left) and one output slot.=Чтобы воспользоваться наковальней, кликните по ней правой кнопкой. Наковальня имеет два входных отсека (слева) и один выходной. -To rename items, put an item stack in one of the item slots while keeping the other input slot empty. Type in a name, hit enter or “Set Name”, then take the renamed item from the output slot.=Для переименования положите стопку предметов в один отсек, второй оставьте пустым. Наберите имя, нажмите [Enter] или “Дать имя” и заберите переименованные предметы из выходного отсека. -There are two possibilities to repair tools (and armor):=Есть два способа отремонтировать инструменты (и защиту): -• Tool + Tool: Place two tools of the same type in the input slots. The “health” of the repaired tool is the sum of the “health” of both input tools, plus a 12% bonus.=• Инструмент + Инструмент: Положите два инструмента одного типа во входные отсеки. “Здоровье” отремонтированного инструмента будет равно сумме “здоровья” каждого из них, плюс 12% бонус. +The anvil allows you to repair tools and armor, and to give names to items. It has a limited durability, however. Don't let it fall on your head, it could be quite painful!=Наковальня позволяет ремонтировать инструменты и броню, а также давать имена предметам. Но она имеет ограниченную прочность. Не дайте ей упасть вам на голову, это может быть больно! +To use an anvil, rightclick it. An anvil has 2 input slots (on the left) and one output slot.=Чтобы воспользоваться наковальней, кликните по ней правой кнопкой. Наковальня имеет два входных слота (слева) и один выходной. +To rename items, put an item stack in one of the item slots while keeping the other input slot empty. Type in a name, hit enter or “Set Name”, then take the renamed item from the output slot.=Для переименования положите стопку предметов в один слот, второй оставьте пустым. Наберите имя, нажмите [Enter] или “Дать имя” и заберите переименованные предметы из выходного слота. +There are two possibilities to repair tools (and armor):=Есть два способа отремонтировать инструменты (и броню): +• Tool + Tool: Place two tools of the same type in the input slots. The “health” of the repaired tool is the sum of the “health” of both input tools, plus a 12% bonus.=• Инструмент + Инструмент: Положите два инструмента одного типа во входные слоты. “Здоровье” отремонтированного инструмента будет равно сумме “здоровья” каждого из них, плюс 12% бонус. • Tool + Material: Some tools can also be repaired by combining them with an item that it's made of. For example, iron pickaxes can be repaired with iron ingots. This repairs the tool by 25%.=• Инструмент + Материал: Некоторые инструменты можно также ремонтировать, добавляя к ним предмет, из которого они сделаны. Например, железные кирки ремонтируются добавлением слитков железа. Таким способом инструмент восстанавливается на 25%. -Armor counts as a tool. It is possible to repair and rename a tool in a single step.=Защиты считается за инструмент. Можно ремонтировать и переименовывать за одно действие. -The anvil has limited durability and 3 damage levels: undamaged, slightly damaged and very damaged. Each time you repair or rename something, there is a 12% chance the anvil gets damaged. Anvils also have a chance of being damaged when they fall by more than 1 block. If a very damaged anvil is damaged again, it is destroyed.=Наковальня имеет ограниченный срок службы и 3 уровня износа: новая, немного изношенная, сильно повреждённая. Каждый раз, ремонтируя или переименовывая что-либо, вы имеете 12-процентный шанс повредить наковальню. Наковальни также могут повреждаться, когда они падают с высоте более 1 блока. Если повреждённая наковальня повреждается снова, то она уничтожается. -Slightly Damaged Anvil=Немного изношенная наковальня +Armor counts as a tool. It is possible to repair and rename a tool in a single step.=Броня считается за инструмент. Можно аналогично ремонтировать и переименовывать. +The anvil has limited durability and 3 damage levels: undamaged, slightly damaged and very damaged. Each time you repair or rename something, there is a 12% chance the anvil gets damaged. Anvils also have a chance of being damaged when they fall by more than 1 block. If a very damaged anvil is damaged again, it is destroyed.=Наковальня имеет ограниченный прочность и 3 уровня износа: новая, немного изношенная, сильно повреждённая. Каждый раз, ремонтируя или переименовывая что-либо, вы имеете 12-процентный шанс повредить наковальню. Наковальни также могут повреждаться, когда они падают с высоты более 1 блока. Если повреждённая наковальня повреждается снова, то она уничтожается. +Slightly Damaged Anvil=Повреждённая наковальня Very Damaged Anvil=Сильно повреждённая наковальня Repair and rename items=Ремонтирует и переименовывает предметы diff --git a/mods/ITEMS/mcl_armor/locale/mcl_armor.ru.tr b/mods/ITEMS/mcl_armor/locale/mcl_armor.ru.tr index 77ed83d10..79b7957b7 100644 --- a/mods/ITEMS/mcl_armor/locale/mcl_armor.ru.tr +++ b/mods/ITEMS/mcl_armor/locale/mcl_armor.ru.tr @@ -1,23 +1,48 @@ # textdomain: mcl_armor -This is a piece of equippable armor which reduces the amount of damage you receive.=Это часть экипирующей брони, уменьшающая получаемый вами урон. -To equip it, put it on the corresponding armor slot in your inventory menu.=Чтобы надеть, поместите её в соответствующий отсек брони в меню вашего инвентаря. -Leather Cap=Кожаная фуражка +This is a piece of equippable armor which reduces the amount of damage you receive.=Это часть надеваемой брони, уменьшающая получаемый вами урон. +To equip it, put it on the corresponding armor slot in your inventory menu.=Чтобы надеть, поместите в соответствующий слот брони в вашем инвентаря. +Leather Cap=Кожаный шлем Iron Helmet=Железный шлем Golden Helmet=Золотой шлем Diamond Helmet=Алмазный шлем -Chain Helmet=Кольчужный капюшон -Leather Tunic=Кожаная туника -Iron Chestplate=Железные латы -Golden Chestplate=Золотые латы -Diamond Chestplate=Алмазные латы +Chain Helmet=Кольчужный шлем +Netherite Helmet=Незеритовый шлем +Leather Tunic=Кожаная кираса +Iron Chestplate=Железная кираса +Golden Chestplate=Золотая кираса +Diamond Chestplate=Алмазная кираса Chain Chestplate=Кольчуга -Leather Pants=Кожаные штаны -Iron Leggings=Железные штаны -Golden Leggings=Золотые штаны -Diamond Leggings=Алмазные штаны -Chain Leggings=Кольчужные штаны +Netherite Chestplate=Незеритовая кираса +Leather Pants=Кожаные поножи +Iron Leggings=Железные поножи +Golden Leggings=Золотые поножи +Diamond Leggings=Алмазные поножи +Chain Leggings=Кольчужные поножи +Netherite Leggings=Незеритовые поножи Leather Boots=Кожаные ботинки Iron Boots=Железные ботинки Golden Boots=Золотые ботинки Diamond Boots=Алмазные ботинки Chain Boots=Кольчужные ботинки +Netherite Boots=Незеритовые ботинки +Elytra=Элитра + +#Translations of enchantements +Increases underwater mining speed.=Увеличивает скорость добычи под водой. +Blast Protection=Взрывоустойчивость +Reduces explosion damage and knockback.=Уменьшает урон и отбрасывание от взрывов. +Curse of Binding=Проклятие несъёмности +Item cannot be removed from armor slots except due to death, breaking or in Creative Mode.=Броню нельзя снять из слота, кроме как умерев, сломав или в режиме творчества. +Feather Falling=Невесомость +Reduces fall damage.=Уменьшает урон от падения. +Fire Protection=Огнеупорность +Reduces fire damage.=Уменьшает урон от огня. +Shooting consumes no regular arrows.=Для стрельбы не требуются обычные стрелы. +Shoot 3 arrows at the cost of one.=Стреляет за раз 3 стрелами тратя только одну. +Projectile Protection=Защита от снарядов +Reduces projectile damage.=Уменьшает урон от летящих снарядов. +Protection=Защита +Reduces most types of damage by 4% for each level.=Уменьшает большинство типов урона на 4% за каждый уровень. +Thorns=Шипы +Reflects some of the damage taken when hit, at the cost of reducing durability with each proc.=Отражает немного полученного урона при ударе ценой снижения прочности при срабатывании. +Aqua Affinity=Подводник diff --git a/mods/ITEMS/mcl_armor_stand/locale/mcl_armor_stand.ru.tr b/mods/ITEMS/mcl_armor_stand/locale/mcl_armor_stand.ru.tr index 6d05d20fc..12eaab8c1 100644 --- a/mods/ITEMS/mcl_armor_stand/locale/mcl_armor_stand.ru.tr +++ b/mods/ITEMS/mcl_armor_stand/locale/mcl_armor_stand.ru.tr @@ -1,5 +1,5 @@ # textdomain: mcl_armor_stand -Armor Stand=Стенд защиты -An armor stand is a decorative object which can display different pieces of armor. Anything which players can wear as armor can also be put on an armor stand.=Стенд защиты - декоративный объект, демонстрирующий различные части защиты. Всё, что игрок может носить на себе в качестве защиты, может быть также помещено на данный стенд. -Just place an armor item on the armor stand. To take the top piece of armor from the armor stand, select your hand and use the place key on the armor stand.=Просто поместите элемент защиты на защитный стенд. Чтобы взять верхнюю часть защиты со стенда, выберите вашу руку и используйте клавишу размещения. -Displays pieces of armor=Демонстрирует части защиты +Armor Stand=Стойка для брони +An armor stand is a decorative object which can display different pieces of armor. Anything which players can wear as armor can also be put on an armor stand.=Стойки для брони - декоративный объект, который может показывать различные части брони. Всё, что игрок может носить на себе в качестве брони, может быть также помещено на стойку. +Just place an armor item on the armor stand. To take the top piece of armor from the armor stand, select your hand and use the place key on the armor stand.=Просто поместите предмет брони на стойку для брони. Чтобы забрать верхнюю часть брони со стойки щелкните по стойке пустой рукой. +Displays pieces of armor=Демонстрирует элементы брони diff --git a/mods/ITEMS/mcl_bamboo/bamboo_items.lua b/mods/ITEMS/mcl_bamboo/bamboo_items.lua index dbc8e6946..412ec92cb 100644 --- a/mods/ITEMS/mcl_bamboo/bamboo_items.lua +++ b/mods/ITEMS/mcl_bamboo/bamboo_items.lua @@ -179,7 +179,7 @@ if minetest.get_modpath("mcl_signs") then -- Bamboo Signs... mcl_signs.register_sign_custom("mcl_bamboo", "_bamboo", "mcl_bamboo_bamboo_sign.png", "#ffffff", "mcl_bamboo_bamboo_sign_wield.png", "mcl_bamboo_bamboo_sign_wield.png", - "Bamboo Sign") + S("Bamboo Sign")) mcl_signs.register_sign_craft("mcl_bamboo", BAMBOO_PLANK, "_bamboo") minetest.register_alias("bamboo_sign", "mcl_signs:wall_sign_bamboo") end @@ -212,7 +212,7 @@ if minetest.get_modpath("mesecons_button") then { material_wood = 1, handy = 1, pickaxey = 1, flammable = 3, fire_flammability = 20, fire_encouragement = 5, }, 1, false, - S("A bamboo button is a redstone component made out of stone which can be pushed to provide redstone power. When pushed, it powers adjacent redstone components for 1 second."), + S("A bamboo button is a redstone component made out of bamboo which can be pushed to provide redstone power. When pushed, it powers adjacent redstone components for 1 second."), "mesecons_button_push") end end diff --git a/mods/ITEMS/mcl_bamboo/locale/mcl_bamboo.dk.tr b/mods/ITEMS/mcl_bamboo/locale/mcl_bamboo.dk.tr index 5e05302df..a50dbfa70 100644 --- a/mods/ITEMS/mcl_bamboo/locale/mcl_bamboo.dk.tr +++ b/mods/ITEMS/mcl_bamboo/locale/mcl_bamboo.dk.tr @@ -3,7 +3,7 @@ ### init.lua ### -A bamboo button is a redstone component made out of stone which can be pushed to provide redstone power. When pushed, it powers adjacent redstone components for 1 second.=En bambusknap er en rødstenskomponent lavet af sten som giver rødstensenergi når den aktiveres. Når den aktiveres forsyner den tilstøende rødstenskomponenter i 1 sekund. +A bamboo button is a redstone component made out of bamboo which can be pushed to provide redstone power. When pushed, it powers adjacent redstone components for 1 second.=En bambusknap er en rødstenskomponent lavet af sten som giver rødstensenergi når den aktiveres. Når den aktiveres forsyner den tilstøende rødstenskomponenter i 1 sekund. A wooden pressure plate is a redstone component which supplies its surrounding blocks with redstone power while any movable object (including dropped items, players and mobs) rests on top of it.=En trætrykplade er en rødstenskomponent som forsyner omkringliggende blokke med rødstensenergi når et bevægeligt objekt (inklusiv tabte genstande, spillere og monstre) er ovenpå den. diff --git a/mods/ITEMS/mcl_bamboo/locale/mcl_bamboo.es.tr b/mods/ITEMS/mcl_bamboo/locale/mcl_bamboo.es.tr index e21beb760..bef0e03f5 100644 --- a/mods/ITEMS/mcl_bamboo/locale/mcl_bamboo.es.tr +++ b/mods/ITEMS/mcl_bamboo/locale/mcl_bamboo.es.tr @@ -8,7 +8,7 @@ Stripped Bamboo Block=Bloque de bambú sin corteza ### bamboo_items.lua ### -A bamboo button is a redstone component made out of stone which can be pushed to provide redstone power. When pushed, it powers adjacent redstone components for 1 second.=Un botón de bambú es un componente de redstone hecho de piedra que se puede presionar para proporcionar energía de redstone. Cuando se empuja, alimenta los componentes adyacentes de redstone durante 1 segundo. +A bamboo button is a redstone component made out of bamboo which can be pushed to provide redstone power. When pushed, it powers adjacent redstone components for 1 second.=Un botón de bambú es un componente de redstone hecho de piedra que se puede presionar para proporcionar energía de redstone. Cuando se empuja, alimenta los componentes adyacentes de redstone durante 1 segundo. A wooden pressure plate is a redstone component which supplies its surrounding blocks with redstone power while any movable object (including dropped items, players and mobs) rests on top of it.=Una placa de presión de madera es un componente de redstone que proporciona energía de redstone a sus bloques adyacentes mientras cualquier objeto movible (incluyendo objetos en el suelo, jugadores y mobs) descanse encima suya. diff --git a/mods/ITEMS/mcl_bamboo/locale/mcl_bamboo.fr.tr b/mods/ITEMS/mcl_bamboo/locale/mcl_bamboo.fr.tr index 953d08811..e95d16baa 100644 --- a/mods/ITEMS/mcl_bamboo/locale/mcl_bamboo.fr.tr +++ b/mods/ITEMS/mcl_bamboo/locale/mcl_bamboo.fr.tr @@ -10,7 +10,7 @@ Bamboo Block=Bloc de bambou ### bamboo_items.lua ### -A bamboo button is a redstone component made out of stone which can be pushed to provide redstone power. When pushed, it powers adjacent redstone components for 1 second.=Un bouton en bambou est un composant redstone fait de bamboo qui peut être poussé pour fournir un signal redstone. Lorsque poussé, il alimente les composants redstone adjacents pendant 1 seconde. +A bamboo button is a redstone component made out of bamboo which can be pushed to provide redstone power. When pushed, it powers adjacent redstone components for 1 second.=Un bouton en bambou est un composant redstone fait de bamboo qui peut être poussé pour fournir un signal redstone. Lorsque poussé, il alimente les composants redstone adjacents pendant 1 seconde. A wooden pressure plate is a redstone component which supplies its surrounding blocks with redstone power while any movable object (including dropped items, players and mobs) rests on top of it.=Une plaque de pression en bois est un composant redstone qui envoie un signal aux blocs alentours lorsque n'importe quel objet mobile (objet jeté, joueurs et mobs) sont dessus. diff --git a/mods/ITEMS/mcl_bamboo/locale/mcl_bamboo.ru.tr b/mods/ITEMS/mcl_bamboo/locale/mcl_bamboo.ru.tr index 3ae22d3c6..7ba49317c 100644 --- a/mods/ITEMS/mcl_bamboo/locale/mcl_bamboo.ru.tr +++ b/mods/ITEMS/mcl_bamboo/locale/mcl_bamboo.ru.tr @@ -5,14 +5,14 @@ Bamboo=Бамбук Bamboo Mosaic Plank=Бамбуковая мозаика Bamboo Plank=Бамбуковые доски -Stripped Bamboo Block=Блок обтёсанного бамбука -Bamboo Block=Блок бамбука +Stripped Bamboo Block=Обтёсанный бамбуковый блок +Bamboo Block=Бамбуковый блок ### bamboo_items.lua ### -A bamboo button is a redstone component made out of stone which can be pushed to provide redstone power. When pushed, it powers adjacent redstone components for 1 second.=Бамбуковая кнопка - это компонент красного камня, который изготовлен из краснокаменной руды. Ее можно нажать, чтобы обеспечить питание красному камню. При нажатии он приводит в действие соседние компоненты красного камня на 1 секунду. +A bamboo button is a redstone component made out of bamboo which can be pushed to provide redstone power. When pushed, it powers adjacent redstone components for 1 second.=Бамбуковая кнопка это компонент редстоуна, сделанный из бамбука, её можно нажать, чтобы получить сигнал редстоуна. При нажатии она включает соседние компоненты редстоуна на 1 с. -A wooden pressure plate is a redstone component which supplies its surrounding blocks with redstone power while any movable object (including dropped items, players and mobs) rests on top of it.=Деревянная нажимная пластина - это компонент красного камня, который снабжает окружающие блоки энергией красного камня, в то время как любой подвижный объект (включая выпавшие предметы, игроков и мобов) стоит на ней. +A wooden pressure plate is a redstone component which supplies its surrounding blocks with redstone power while any movable object (including dropped items, players and mobs) rests on top of it.=Нажимная плита это компонент редстоуна, который выдает сигнал редстоуна окружающим его блокам, когда кто-то или что-то находится прямо на нём. Bamboo=Бамбук Bamboo Button=Бамбуковая кнопка @@ -20,26 +20,24 @@ Bamboo Door=Бамбуковая дверь Bamboo Fence=Бамбуковый забор Bamboo Fence Gate=Бамбуковая калитка Bamboo Mosaic Slab=Плита из бамбуковой мозаики -Bamboo Mosaic Stair=Ступеньки из бамбуковой мозаики -Bamboo Plank Slab=Бамбуковая плита из досок -Bamboo Plank Stair=Бамбуковые ступеньки из досок +Bamboo Mosaic Stair=Ступени из бамбуковой мозаики +Bamboo Plank Slab=Плита из бамбуковых досок +Bamboo Plank Stair=Ступени из бамбуковых досок Bamboo Pressure Plate=Бамбуковая нажимная плита +Bamboo Sign=Бамбуковая табличка Bamboo Slab=Бамбуковая плита -Bamboo Stair=Бамбуковые ступеньки +Bamboo Stair=Бамбуковые ступени Bamboo Trapdoor=Бамбуковый люк Double Bamboo Mosaic Slab=Двойная бамбуковая мозаичная плита -Double Bamboo Plank Slab=Двойная бамбуковая дощатая плита +Double Bamboo Plank Slab=Двойная плита из бамбуковых досок Double Bamboo Slab=Двойная бамбуковая плита -Double Stripped Bamboo Slab=Двойная обтесанная бамбуковая плита +Double Stripped Bamboo Slab=Двойная обтёсанная бамбуковая плита Scaffolding=Строительные леса -Scaffolding (horizontal)=Строительные леса (горизонтальный) +Scaffolding (horizontal)=Строительные леса (горизонтальные) Scaffolding block used to climb up or out across areas.=Блок строительных лесов, используемый для подъема вверх или перемещения по другим участкам. -Stripped Bamboo Slab=Обтесанная бамбуковая плита -Stripped Bamboo Stair=Обтесанные бамбуковые ступеньки - -To open or close the trapdoor, rightclick it or send a redstone signal to it.=Чтобы открыть или закрыть люк, щелкните по нему правой кнопкой мыши или отправьте на него сигнал redstone. - -Wooden trapdoors are horizontal barriers which can be opened and closed by hand or a redstone signal. They occupy the upper or lower part of a block, depending on how they have been placed. When open, they can be climbed like a ladder.=Деревянные люки - это горизонтальные барьеры, которые можно открывать и закрывать вручную или по сигналу красного камня. Они занимают верхнюю или нижнюю часть блока, в зависимости от того, как они были размещены. Когда они открыты, по ним можно подниматься, как по лестнице. - -Wooden doors are 2-block high barriers which can be opened or closed by hand and by a redstone signal.=Деревянные двери представляют собой барьеры высотой в 2 блока, которые можно открывать или закрывать вручную и по сигналу redstone. -To open or close a wooden door, rightclick it or supply its lower half with a redstone signal.=Чтобы открыть или закрыть деревянную дверь, щелкните по ней правой кнопкой мыши или снабдите ее нижнюю половину сигналом красного камня. +Stripped Bamboo Slab=Обтёсанная бамбуковая плита +Stripped Bamboo Stair=Обтёсанные бамбуковые ступени +To open or close the trapdoor, rightclick it or send a redstone signal to it.=Чтобы открыть или закрыть деревянный люк, кликните по нему правой кнопкой либо подайте на него сигнал редстоуна. +Wooden trapdoors are horizontal barriers which can be opened and closed by hand or a redstone signal. They occupy the upper or lower part of a block, depending on how they have been placed. When open, they can be climbed like a ladder.=Деревянные люки это горизонтальные преграды, которые можно открывать и закрывать вручную и по сигналу редстоуна. Они занимают верхнюю или нижнюю часть блока, в зависимости от того, как они были установлены. В открытом состоянии по ним можно карабкаться, как по лестницам. +Wooden doors are 2-block high barriers which can be opened or closed by hand and by a redstone signal.=Деревянные двери это преграды высотой в 2 блока, которые можно открывать и закрывать вручную и по сигналу редстоуна. +To open or close a wooden door, rightclick it or supply its lower half with a redstone signal.=Чтобы открыть или закрыть деревянную дверь, кликните правой кнопкой или подайте к её нижней части сигнал редстоуна. diff --git a/mods/ITEMS/mcl_bamboo/locale/template.txt b/mods/ITEMS/mcl_bamboo/locale/template.txt index 2d5c69383..0752bf364 100644 --- a/mods/ITEMS/mcl_bamboo/locale/template.txt +++ b/mods/ITEMS/mcl_bamboo/locale/template.txt @@ -10,7 +10,7 @@ Bamboo Block= ### bamboo_items.lua ### -A bamboo button is a redstone component made out of stone which can be pushed to provide redstone power. When pushed, it powers adjacent redstone components for 1 second.= +A bamboo button is a redstone component made out of bamboo which can be pushed to provide redstone power. When pushed, it powers adjacent redstone components for 1 second.= A wooden pressure plate is a redstone component which supplies its surrounding blocks with redstone power while any movable object (including dropped items, players and mobs) rests on top of it.= @@ -24,6 +24,7 @@ Bamboo Mosaic Stair= Bamboo Plank Slab= Bamboo Plank Stair= Bamboo Pressure Plate= +Bamboo Sign= Bamboo Slab= Bamboo Stair= Bamboo Trapdoor= diff --git a/mods/ITEMS/mcl_banners/init.lua b/mods/ITEMS/mcl_banners/init.lua index 18b50928a..fc2262888 100644 --- a/mods/ITEMS/mcl_banners/init.lua +++ b/mods/ITEMS/mcl_banners/init.lua @@ -33,7 +33,7 @@ mcl_banners.colors = { ["unicolor_blue"] = {"blue", S("Blue Banner"), "mcl_wool:blue", "#0000AC", "mcl_dye:blue", N("Blue") }, ["unicolor_red_violet"] = {"magenta", S("Magenta Banner"), "mcl_wool:magenta", "#AC007C", "mcl_dye:magenta", N("Magenta")}, ["unicolor_orange"] = {"orange", S("Orange Banner"), "mcl_wool:orange", "#E67300", "mcl_dye:orange", N("Orange") }, - ["unicolor_violet"] = {"purple", S("Purple Banner"), "mcl_wool:purple", "#6400AC", "mcl_dye:violet", N("Violet") }, + ["unicolor_violet"] = {"purple", S("Purple Banner"), "mcl_wool:purple", "#6400AC", "mcl_dye:violet", N("Purple") }, ["unicolor_brown"] = {"brown", S("Brown Banner"), "mcl_wool:brown", "#603000", "mcl_dye:brown", N("Brown") }, ["unicolor_pink"] = {"pink", S("Pink Banner"), "mcl_wool:pink", "#DE557C", "mcl_dye:pink", N("Pink") }, ["unicolor_lime"] = {"lime", S("Lime Banner"), "mcl_wool:lime", "#30AC00", "mcl_dye:green", N("Lime") }, diff --git a/mods/ITEMS/mcl_banners/locale/mcl_banners.ru.tr b/mods/ITEMS/mcl_banners/locale/mcl_banners.ru.tr index a6cee5a67..410c96687 100644 --- a/mods/ITEMS/mcl_banners/locale/mcl_banners.ru.tr +++ b/mods/ITEMS/mcl_banners/locale/mcl_banners.ru.tr @@ -13,65 +13,67 @@ Yellow Banner=Жёлтый флаг Yellow=Жёлтый Green Banner=Зелёный флаг Green=Зелёный -Cyan Banner=Голубой флаг +Cyan Banner=Бирюзовый флаг Cyan=Голубой Blue Banner=Синий флаг Blue=Синий -Magenta Banner=Фиолетовый флаг -Magenta=Фиолетовый +Magenta Banner=Сиреневый флаг +Magenta=Сиреневый Orange Banner=Оранжевый флаг Orange=Оранжевый -Purple Banner=Пурпурный флаг -Violet=Пурпурный +Purple Banner=Фиолетовый флаг +Violet=Фиолетовый Brown Banner=Коричневый флаг Brown=Коричневый Pink Banner=Розовый флаг Pink=Розовый -Lime Banner=Зелёный лаймовый флаг +Lime Banner=Лаймовый флаг Lime=Зелёный лаймовый -Light Blue Banner=Светло-голубой флаг -Light Blue=Светло-голубой -Banners are tall colorful decorative blocks. They can be placed on the floor and at walls. Banners can be emblazoned with a variety of patterns using a lot of dye in crafting.=Баннеры - высокие цветные декоративные блоки. Их можно размещать на полу и на стенах. Флаги можно украшать разнообразными узорами при помощью красителей во время создания. -Use crafting to draw a pattern on top of the banner. Emblazoned banners can be emblazoned again to combine various patterns. You can draw up to 12 layers on a banner that way. If the banner includes a gradient, only 3 layers are possible.=Используйте крафтинг, чтобы нарисовать узор поверх флага. Украшенные флаги можно украсить повторно, чтобы сочетать разные узоры. Таким способом вы можете нарисовать до 12 слоев на одном флаге. Если флаг содержит градиент, возможно только 3 слоя. -You can copy the pattern of a banner by placing two banners of the same color in the crafting grid—one needs to be emblazoned, the other one must be clean. Finally, you can use a banner on a cauldron with water to wash off its top-most layer.=Вы можете скопировать рисунок флага, поместив два флага одного цвета в крафтинговую решётку - один должен быть украшенный, другой - чистый. Наконец, вы можете [использовать] флаг на котле с водой для смывания верхнего слоя. -@1 Bordure=@1 Кайма -@1 Bricks=@1 Кирпичи -@1 Roundel=@1 Рондо -@1 Creeper Charge=@1 Атака крипера -@1 Saltire=@1 Андреевский крест -@1 Bordure Indented=@1 Кайма с отступом -@1 Per Bend Inverted=@1 Повторяющийся изгиб поворотом -@1 Per Bend Sinister Inverted=@1 Повторяющийся зловещий изгиб с поворотом -@1 Per Bend=@1 Повторяющийся изгиб -@1 Per Bend Sinister=@1 Зловещий изгиб -@1 Flower Charge=@1 Забота о цветке -@1 Gradient=@1 Градиент -@1 Base Gradient=@1 Основной градиент -@1 Per Fess Inverted=@1 Обратное деление щита -@1 Per Fess=@1 Деление щита -@1 Per Pale=@1 Вертикальное деление щита -@1 Per Pale Inverted=@1 Вертикальное обратное деление -@1 Thing Charge=@1 Атака существа -@1 Lozenge=@1 Ромб -@1 Skull Charge=@1 Атака черепа -@1 Paly=@1 Бледный -@1 Base Dexter Canton=@1 Основной правый кант -@1 Base Sinister Canton=@1 Основной зловещий кант -@1 Chief Dexter Canton=@1 Главный правый кант -@1 Chief Sinister Canton=@1 Главный зловещий кант -@1 Cross=@1 Крест -@1 Base=@1 Основа -@1 Pale=@1 Черта -@1 Bend Sinister=@1 Зловещий изгиб -@1 Bend=@1 Изгиб -@1 Pale Dexter=@1 Черты справа +Light Blue Banner=Голубой флаг +Light Blue=Голубой +Banner=Флаг +Banners are tall colorful decorative blocks. They can be placed on the floor and at walls. Banners can be emblazoned with a variety of patterns using a lot of dye in crafting.=Флаги - высокие цветные декоративные блоки. Их можно размещать на полу и на стенах. Флаги можно украшать разнообразными узорами при помощью красителей во время создания. +Use crafting to draw a pattern on top of the banner. Emblazoned banners can be emblazoned again to combine various patterns. You can draw up to 12 layers on a banner that way. If the banner includes a gradient, only 3 layers are possible.=Используйте сетку крафта, чтобы нарисовать узор поверх флага. Украшенные флаги можно украсить повторно, чтобы сочетать разные узоры. Таким способом вы можете нарисовать до 12 слоев на одном флаге. Если флаг содержит градиент, возможно только 3 слоя. +You can copy the pattern of a banner by placing two banners of the same color in the crafting grid—one needs to be emblazoned, the other one must be clean. Finally, you can use a banner on a cauldron with water to wash off its top-most layer.=Вы можете скопировать рисунок флага, поместив два флага одного цвета в сетку крафта - один должен быть украшенный, другой - чистый. Вы можете использовать флаг на котле с водой, чтобы смыть верхний слой. +@1 Bordure=@1 простая кайма +@1 Bricks=@1 кирпичный фон +@1 Roundel=@1 круг в центре +@1 Creeper Charge=@1 лицо крипера +@1 Saltire=@1 диагональный крест +@1 Bordure Indented=@1 рельефная кайма +@1 Per Bend Inverted=@1 нижняя левая половина +@1 Per Bend Sinister Inverted=@1 нижняя правая половина +@1 Per Bend=@1 верхняя правая половина +@1 Per Bend Sinister=@1 верхняя левая половина +@1 Flower Charge=@1 цветок +@1 Gradient=@1 верхний градиент +@1 Base Gradient=@1 нижний градиент +@1 Per Fess Inverted=@1 нижняя половина +@1 Per Fess=@1 верхняя половина +@1 Per Pale=@1 левая половина +@1 Per Pale Inverted=@1 правая половина +@1 Thing Charge=@1 нечто +@1 Lozenge=@1 Ромб в центре +@1 Skull Charge=@1 Весёлый Роджер +@1 Paly=@1 продольные полосы +@1 Base Dexter Canton=@1 нижний левый угол +@1 Base Sinister Canton=@1 нижний правый угол +@1 Chief Dexter Canton=@1 верхний левый угол +@1 Chief Sinister Canton=@1 верхний правый угол +@1 Cross=@1 крест +@1 Base=@1 треть снизу +@1 Pale=@1 вертикальная центральная линия +@1 Bend Sinister=@1 диагональная линия сверху справа +@1 Bend=@1 диагональная линия сверху слева +@1 Pale Dexter=@1 треть слева @1 Fess=@1 Разделение -@1 Pale Sinister=@1 Бледный зловещий -@1 Chief=@1 Главный -@1 Chevron=@1 Шеврон -@1 Chevron Inverted=@1 Инвертированный шеврон -@1 Base Indented=@1 Инвертированный основной -@1 Chief Indented=@1 Инвертированный главный -And one additional layer=И один индивидуальный слой -And @1 additional layers=И @1 дополнительныйх слойёв -Paintable decoration=Художественное украшение +@1 Pale Sinister=@1 треть справа +@1 Chief=@1 треть сверху +@1 Chevron=@1 треугольник снизу +@1 Chevron Inverted=@1 треугольник сверху +@1 Base Indented=@1 гребешки снизу +@1 Chief Indented=@1 гребешки сверху +And one additional layer=И один дополнительный слой +And @1 additional layers=И @1 дополнительных слоёв +Paintable decoration=Раскрашиваемая декорация +Preview Banner=Предпросмотр баннера \ No newline at end of file diff --git a/mods/ITEMS/mcl_banners/locale/template.txt b/mods/ITEMS/mcl_banners/locale/template.txt index 357ff6b08..1c10dbeeb 100644 --- a/mods/ITEMS/mcl_banners/locale/template.txt +++ b/mods/ITEMS/mcl_banners/locale/template.txt @@ -76,3 +76,4 @@ You can copy the pattern of a banner by placing two banners of the same color in And one additional layer= And @1 additional layers= Paintable decoration= +Preview Banner= diff --git a/mods/ITEMS/mcl_barrels/locale/mcl_barrels.ru.tr b/mods/ITEMS/mcl_barrels/locale/mcl_barrels.ru.tr index 2d860c532..680d6874d 100644 --- a/mods/ITEMS/mcl_barrels/locale/mcl_barrels.ru.tr +++ b/mods/ITEMS/mcl_barrels/locale/mcl_barrels.ru.tr @@ -1,5 +1,5 @@ # textdomain: mcl_barrels Barrel=Бочка -Barrels are containers which provide 27 inventory slots.=Бочки — это хранилища, у которых 27 ячеек хранения. -To access its inventory, rightclick it. When broken, the items will drop out.=Чтобы получить доступ к хранилищу, нажмите по нему правой кнопкой мыши. Если его сломать, тогда выпадут предметы. -27 inventory slots=27 ячеек хранения \ No newline at end of file +Barrels are containers which provide 27 inventory slots.=Бочки — это хранилища, у которых 27 слотов инвентаря. +To access its inventory, rightclick it. When broken, the items will drop out.=Чтобы получить доступ к хранилищу, нажмите по нему правой кнопкой мыши. Если его сломать предметы выпадут. +27 inventory slots=27 слотов инвентаря \ No newline at end of file diff --git a/mods/ITEMS/mcl_beds/locale/mcl_beds.ru.tr b/mods/ITEMS/mcl_beds/locale/mcl_beds.ru.tr index 8093e95fb..cf9e285d1 100644 --- a/mods/ITEMS/mcl_beds/locale/mcl_beds.ru.tr +++ b/mods/ITEMS/mcl_beds/locale/mcl_beds.ru.tr @@ -1,28 +1,28 @@ # textdomain: mcl_beds -Beds allow you to sleep at night and make the time pass faster.=На кровати можно спать по ночам и заставлять ночи проходить быстрее. -To use a bed, stand close to it and right-click the bed to sleep in it. Sleeping only works when the sun sets, at night or during a thunderstorm. The bed must also be clear of any danger.=Чтобы использовать кровать, встаньте рядом и кликните по ней правой кнопкой. Вы сможете уснуть, только если солнце в закате, либо уже наступила ночь, либо идёт гроза. Кровать при этом должна в месте, свободном от любых опасностей. +Beds allow you to sleep at night and make the time pass faster.=На кровати можно спать по ночам и заставлять ночь проходить быстрее. +To use a bed, stand close to it and right-click the bed to sleep in it. Sleeping only works when the sun sets, at night or during a thunderstorm. The bed must also be clear of any danger.=Чтобы использовать кровать, встаньте рядом и кликните по ней правой кнопкой. Вы сможете уснуть, только если солнце в закате, либо уже наступила ночь, либо идёт гроза. Кровать при этом должна в безопасном месте. You have heard of other worlds in which a bed would set the start point for your next life. But this world is not one of them.=Вы слышали о других мирах, где кровать становится стартовой точкой для вашей следующей жизни. Но этот мир не такой. By using a bed, you set the starting point for your next life. If you die, you will start your next life at this bed, unless it is obstructed or destroyed.=Воспользовавшись кроватью, вы устанавливаете стартовую точку для вашей следующей жизни. Если вы умрёте, ваша новая жизнь начнётся в этой кровати, если она не уничтожена и не загромождена. -In this world, going to bed won't skip the night, but it will skip thunderstorms.=В этом мире использование кровати не заставит ночь пройти скорее, но может сократить время грозового шторма. -Sleeping allows you to skip the night. The night is skipped when all players in this world went to sleep. The night is skipped after sleeping for a few seconds. Thunderstorms can be skipped in the same manner.=Сон позволяет вам пропустить ночь. Если все игроки в этом мире лягут спать, ночь будет пропущена. Она закончится буквально через несколько секунд. Таким же способом можно пропускать грозы. +In this world, going to bed won't skip the night, but it will skip thunderstorms.=В этом мире использование кровати не заставит ночь пройти быстрее, но может сократить время грозового шторма. +Sleeping allows you to skip the night. The night is skipped when all players in this world went to sleep. The night is skipped after sleeping for a few seconds. Thunderstorms can be skipped in the same manner.=Сон позволяет вам пропустить ночь. Если все игроки в этом мире лягут спать, ночь будет пропущена. Она пропустится через несколько секунд после сна. Таким же способом можно пропускать грозу. Bed=Кровать Red Bed=Красная кровать Blue Bed=Синяя кровать -Cyan Bed=Голубая кровать +Cyan Bed=Бирюзовая кровать Grey Bed=Серая кровать Light Grey Bed=Светло-серая кровать Black Bed=Чёрная кровать Yellow Bed=Жёлтая кровать Green Bed=Зелёная кровать -Magenta Bed=Фиолетовая кровать +Magenta Bed=Сиреневая кровать Orange Bed=Оранжевая кровать -Purple Bed=Пурпурная кровать +Purple Bed=Фиолетовая кровать Brown Bed=Коричневая кровать Pink Bed=Розовая кровать -Lime Bed=Зелёная лаймовая кровать -Light Blue Bed=Светло-голубая кровать +Lime Bed=Лаймовая кровать +Light Blue Bed=Голубая кровать White Bed=Белая кровать -You can't sleep, the bed's too far away!=Не удаётся лечь, кровать слишком далеко! +You can't sleep, the bed's too far away!=Вы не можете спать, кровать слишком далеко! This bed is already occupied!=Эта кровать уже занята! You have to stop moving before going to bed!=Вам нужно перестать двигаться, чтобы лечь! You can't sleep now, monsters are nearby!=Вы не можете спать, монстры слишком близко! @@ -31,11 +31,19 @@ It's too dangerous to sleep here!=Спать здесь слишком опас New respawn position set! But you can only sleep at night or during a thunderstorm.=Новая точка возрождения успешно задана! Но спать вы можете только ночью или во время грозы. You can only sleep at night or during a thunderstorm.=Вы можете спать только ночью или во время грозы. New respawn position set!=Задана новая точка возрождения! -Leave bed=Покинуть кровать -Abort sleep=Прервать сон +Leave bed=Встать с кровати +Abort sleep=Проснуться Players in bed: @1/@2=Игроков в кроватях: @1/@2 -Note: Night skip is disabled.=Предупреждение: Пропускание ночи отключено. -You're sleeping.=Вы спите... -You will fall asleep when all players are in bed.=Вы уснёте, когда лягут все игроки. +Note: Night skip is disabled.=Предупреждение: Пропуск ночи отключен. +You're sleeping.=Вы засыпаете... +You will fall asleep when all players are in bed.=Вы уснёте когда все игроки лягут в кровати. +You will fall asleep when @1% of all players are in bed.=Вы уснёте когда @1% игроков лягут в кровати. You're in bed.=Вы в кровати. -Allows you to sleep=Позволяет вам спать +Allows you to sleep=Можно спать +Respawn Anchor=Якорь возрождения +Chat:=Чат: +send!=Отправить +You are missing the 'shout' privilege! It's required in order to talk in chat...=Вам нужна привилегия “shout”, чтобы писать в чат. +You exceeded the maximum number of messages per 10 seconds!=Вы превысили максимальный лимит сообщений в 10 секунд! +Hey! Would you guys mind sleeping?=Эй, ребята, не хотите поспать? +Sorry, but you have to wait @1 seconds until you may use this button again!=Вам нужно подождать еще @1 с. прежде чем вы сможете нажать эту кнопку снова! \ No newline at end of file diff --git a/mods/ITEMS/mcl_beehives/locale/mcl_beehives.ru.tr b/mods/ITEMS/mcl_beehives/locale/mcl_beehives.ru.tr new file mode 100644 index 000000000..b956967a9 --- /dev/null +++ b/mods/ITEMS/mcl_beehives/locale/mcl_beehives.ru.tr @@ -0,0 +1,5 @@ +# textdomain: mcl_beehives +Beehive=Улей +Artificial bee nest.=Искусственное пчелиное гнездо. +Bee Nest=Пчелиное гнездо +A naturally generating block that houses bees and a tasty treat...if you can get it.=Естественное генерирующийся блок служащий домом пчёлам и вкусному угощению... если вы сможете достать его. diff --git a/mods/ITEMS/mcl_bells/locale/mcl_bells.ru.tr b/mods/ITEMS/mcl_bells/locale/mcl_bells.ru.tr new file mode 100644 index 000000000..eb2df707f --- /dev/null +++ b/mods/ITEMS/mcl_bells/locale/mcl_bells.ru.tr @@ -0,0 +1,2 @@ +# textdomain: mcl_bells +Bell=Колокол diff --git a/mods/ITEMS/mcl_blackstone/locale/mcl_blackstone.ru.tr b/mods/ITEMS/mcl_blackstone/locale/mcl_blackstone.ru.tr index 8e27983ea..3375586a2 100644 --- a/mods/ITEMS/mcl_blackstone/locale/mcl_blackstone.ru.tr +++ b/mods/ITEMS/mcl_blackstone/locale/mcl_blackstone.ru.tr @@ -1,29 +1,29 @@ # textdomain: mcl_blackstone -Blackstone=Чернит -Polished Blackstone=Полированный чернит -Chiseled Polished Blackstone=Резной полированный чернит -Polished Blackstone Bricks=Полированный чернокаменный кирпич +Blackstone=Чернокамень +Polished Blackstone=Полированный чернокамень +Chiseled Polished Blackstone=Резной полированный чернокамень +Polished Blackstone Bricks=Полированные чернокаменные кирпичи Basalt=Базальт Polished Basalt=Полированный базальт -Blackstone Slab=Чернитная плита -Polished Blackstone Slab=Плита из полированного чернита -Chiseled Polished Blackstone Slab=Резная полированная чернитная плита -Polished Blackstone Brick Slab=Плита из полированно-чернитного кирпича -Blackstone Stair=Чернитные ступеньки -Polished Blackstone Stair=Ступеньки из полированно-чернитного кирпича -Chiseled Polished Blackstone Stair=Резные полированные чернитные ступеньки -Polished Blackstone Brick Stair=Ступеньки из полированно-чернитного кирпича +Blackstone Slab=Чернокаменная плита +Polished Blackstone Slab=Полированная чернокаменная плита +Chiseled Polished Blackstone Slab=Плита из резного полированного чернокамня +Polished Blackstone Brick Slab=Плита из полированных чернокаменных кирпичей +Blackstone Stair=Чернокаменные ступени +Polished Blackstone Stair=Полированные чернокаменные ступени +Chiseled Polished Blackstone Stair=Резные полированные чернокаменные ступени +Polished Blackstone Brick Stair=Ступени из полированных чернокаменных кирпичей Quartz Bricks=Кварцевые кирпичи Soul Torch=Факел душ -Torches are light sources which can be placed at the side or on the top of most blocks.=Факелы - это источники света, которые могут быть размещены сбоку или сверху большинства блоков. -Soul Lantern=Фонарь душ -Soul Soil=Почва душ -Eternal Soul Fire=Пламя душ -Gilded Blackstone=Золочёный чернит -Nether Gold Ore=Незерская золотая руда +Torches are light sources which can be placed at the side or on the top of most blocks.=Факелы это источники света, которые могут быть размещены сбоку или сверху большинства блоков. +Soul Lantern=Лампа душ +Soul Soil=Песок душ +Eternal Soul Fire=Вечный огонь душ +Gilded Blackstone=Позолоченный чернокамень +Nether Gold Ore=Золотая руда Незера Smooth Basalt=Гладкий базальт -Blackstone Wall=Чернитная стена -Double Blackstone Slab=Двойная чернитная плита -Polished Double Blackstone Slab=Полированная двойная чернитная плита -Double Chiseled Polished Blackstone Slab=Двойная резная полированная чернитная плита -Double Polished Blackstone Brick Slab=Двойная плита из полированно-чернитного кирпича +Blackstone Wall=Стена из чернокамня +Double Blackstone Slab=Двойная чернокаменная плита +Polished Double Blackstone Slab=Полированная двойная чернокаменная плита +Double Chiseled Polished Blackstone Slab=Двойная резная полированная чернокаменная плита +Double Polished Blackstone Brick Slab=Двойная плита из полированных чернокаменных кирпичей diff --git a/mods/ITEMS/mcl_blast_furnace/locale/mcl_blast_furnace.ru.tr b/mods/ITEMS/mcl_blast_furnace/locale/mcl_blast_furnace.ru.tr new file mode 100644 index 000000000..c4d4ce8ad --- /dev/null +++ b/mods/ITEMS/mcl_blast_furnace/locale/mcl_blast_furnace.ru.tr @@ -0,0 +1,11 @@ +# textdomain: mcl_blast_furnace +Inventory=Инвентарь +Blast Furnace=Плавильная печь +Smelts ores faster than furnace=Переплавляет руды быстрее чем обычная печь +Use the recipe book to see what ores you can smelt, what you can use as fuel and how long it will burn.=Используйте книгу рецептов, чтобы увидеть какие руды можно переплавить, что можно использовать как топливо и как долго оно будет гореть. +Use the blast furnace to open the furnace menu.=Используйте плавильную печь, чтобы открыть меню печи. +Place a furnace fuel in the lower slot and the source material in the upper slot.=Положите топливо в нижний слот и материал в верхний. +The blast furnace will slowly use its fuel to smelt the item.=Плавильная печь будет медленно использовать топливо для переплавки предмета. +The result will be placed into the output slot at the right side.=Результат будет помещен в выходной слот с правой стороны. +Blast Furnaces smelt several items, mainly ores and armor, using a furnace fuel, but twice as fast as a normal furnace.=Плавильная печь плавит некоторые предметы, в основном руды и броню используя топливо, но в два раза быстрее чем обычная печь. +Active Blast Furnace=Горящая плавильная печь diff --git a/mods/ITEMS/mcl_books/locale/mcl_books.ru.tr b/mods/ITEMS/mcl_books/locale/mcl_books.ru.tr index a4cc9804c..4eedf3b57 100644 --- a/mods/ITEMS/mcl_books/locale/mcl_books.ru.tr +++ b/mods/ITEMS/mcl_books/locale/mcl_books.ru.tr @@ -1,5 +1,5 @@ # textdomain: mcl_books -Book=Книги +Book=Книга Books are used to make bookshelves and book and quills.=Из книг можно создавать книжные полки и книги с перьями. “@1”=“@1” Copy of “@1”=Копия “@1” @@ -10,7 +10,7 @@ by @1=игрока @1 Sign=Подписать Done=Готово This item can be used to write down some notes.=Этот предмет можно использовать для записи заметок. -Hold it in the hand, then rightclick to read the current notes and edit then. You can edit the text as often as you like. You can also sign the book which turns it into a written book which you can stack, but it can't be edited anymore.=Удерживая его в руке, кликните правой, чтобы прочитать текущие записи и отредактировать. Вы можете редактировать текст, сколько захотите. Вы также можете подписать книгу, что превратит её в подписанную книгу, её можно будет уложить в стопку с другими такими же, но больше нельзя будет редактировать. +Hold it in the hand, then rightclick to read the current notes and edit then. You can edit the text as often as you like. You can also sign the book which turns it into a written book which you can stack, but it can't be edited anymore.=Удерживая книгу в руке, кликните правой кнопкой мыши, чтобы прочитать текущие записи и отредактировать их. Вы можете редактировать текст сколько угодно. Вы также можете подписать книгу, что превратит её в подписанную книгу, её можно будет уложить в стопку с другими такими же, но больше нельзя будет редактировать. A book can hold up to 4500 characters. The title length is limited to 64 characters.=Книга может содержать до 4500 символов. Длина названия ограничена 64 символами. Enter book title:=Введите название книги by @1=игрока @1 @@ -20,9 +20,9 @@ Cancel=Отмена Nameless Book=Безымянная книга Written Book=Подписанная книга Written books contain some text written by someone. They can be read and copied, but not edited.=Подписанная книга содержит текст, написанный кем-то. Она может быть прочитана и скопирована, но её нельзя редактировать. -Hold it in your hand, then rightclick to read the book.=Удерживая в руке, кликните правой, чтобы прочитать книгу. -To copy the text of the written book, place it into the crafting grid together with a book and quill (or multiple of those) and craft. The written book will not be consumed. Copies of copies can not be copied.=Чтобы скопировать текст подписанной книги, поместите её в крафтинговую решётку вместе с книгой с пером (или сразу несколькими) и скрафтите. Подписанная книга не израсходуется. Не могут быть скопированы копии копий. +Hold it in your hand, then rightclick to read the book.=Удерживая в руке, кликните правой кнопкой мыши, чтобы прочитать книгу. +To copy the text of the written book, place it into the crafting grid together with a book and quill (or multiple of those) and craft. The written book will not be consumed. Copies of copies can not be copied.=Чтобы скопировать текст подписанной книги, поместите её в сетку крафта вместе с книгой с пером (или сразу несколькими) и скрафтите. Подписанная книга не израсходуется. Копии копий нельзя скопировать. Bookshelf=Книжная полка -Bookshelves are used for decoration.=Книжные полки используют в качестве украшений +Bookshelves are used for decoration.=Книжные полки используют в качестве декораций Book and Quill=Книга с пером -Write down some notes=Сделайте какие-нибудь записи +Write down some notes=Сделайте записи diff --git a/mods/ITEMS/mcl_bows/crossbow.lua b/mods/ITEMS/mcl_bows/crossbow.lua index 752ccdc54..df7b5f560 100644 --- a/mods/ITEMS/mcl_bows/crossbow.lua +++ b/mods/ITEMS/mcl_bows/crossbow.lua @@ -132,7 +132,7 @@ minetest.register_tool("mcl_bows:crossbow", { _tt_help = S("Launches arrows"), _doc_items_longdesc = S("Crossbows are ranged weapons to shoot arrows at your foes.").."\n".. S("The speed and damage of the arrow increases the longer you charge. The regular damage of the arrow is between 1 and 9. At full charge, there's also a 20% of a critical hit, dealing 10 damage instead."), - _doc_items_usagehelp = S("To use the crossbow, you first need to have at least one arrow anywhere in your inventory (unless in Creative Mode). Hold down the right mouse button to charge, release to shoot."), + _doc_items_usagehelp = S("To use the crossbow, you first need to have at least one arrow anywhere in your inventory (unless in Creative Mode). Hold down the right mouse button to charge, release to load an arrow into the chamber, then to shoot press left mouse."), _doc_items_durability = BOW_DURABILITY, inventory_image = "mcl_bows_crossbow.png", wield_scale = mcl_vars.tool_wield_scale, diff --git a/mods/ITEMS/mcl_bows/locale/mcl_bows.ru.tr b/mods/ITEMS/mcl_bows/locale/mcl_bows.ru.tr index 6a1b7ed31..87e41fe95 100644 --- a/mods/ITEMS/mcl_bows/locale/mcl_bows.ru.tr +++ b/mods/ITEMS/mcl_bows/locale/mcl_bows.ru.tr @@ -1,15 +1,18 @@ # textdomain: mcl_bows Arrow=Стрела -Arrows are ammunition for bows and dispensers.=Стрелы - это боеприпасы для луков и диспенсеров. -An arrow fired from a bow has a regular damage of 1-9. At full charge, there's a 20% chance of a critical hit dealing 10 damage instead. An arrow fired from a dispenser always deals 3 damage.=Стрела, выпущенная из лука, обычно наносит урон 1-9. При полном натяжении есть 20-процентный шанс критического удара с уроном 10. Стрела из диспенсера всегда наносит урон уровня 3. -Arrows might get stuck on solid blocks and can be retrieved again. They are also capable of pushing wooden buttons.=Стрелы могут застревать в твёрдых блоках, их можно подбирать для повторного использования. Они также способны нажимать деревянные кнопки. -To use arrows as ammunition for a bow, just put them anywhere in your inventory, they will be used up automatically. To use arrows as ammunition for a dispenser, place them in the dispenser's inventory. To retrieve an arrow that sticks in a block, simply walk close to it.=Чтобы использовать стрелы в качестве боеприпасов для лука, просто положите их в любую ячейку вашего инвентаря, и они будут использоваться автоматически. Чтобы использовать стрелы в качестве боеприпасов для диспенсера, поместите их в инвентарь диспенсера. Чтобы взять стрелу, застрявшую в блоке, просто пройдите рядом с ней. +Arrows are ammunition for bows and dispensers.=Стрелы это боеприпасы для луков и раздатчиков. +An arrow fired from a bow has a regular damage of 1-9. At full charge, there's a 20% chance of a critical hit dealing 10 damage instead. An arrow fired from a dispenser always deals 3 damage.=Стрела, выпущенная из лука, обычно наносит урон 1-9. При полном натяжении есть шанс в 20% для критического удара с уроном 10. Стрела из раздатчика всегда наносит урон 3. +Arrows might get stuck on solid blocks and can be retrieved again. They are also capable of pushing wooden buttons.=Стрелы могут застревать в твёрдых блоках, тогда их можно снова подобрать. Стрелы также способны нажимать деревянные кнопки. +To use arrows as ammunition for a bow, just put them anywhere in your inventory, they will be used up automatically. To use arrows as ammunition for a dispenser, place them in the dispenser's inventory. To retrieve an arrow that sticks in a block, simply walk close to it.=Чтобы использовать стрелы в качестве боеприпасов для лука, просто положите их в любую ячейку вашего инвентаря, и они будут использоваться автоматически. Чтобы использовать стрелы в качестве боеприпасов для раздатчика, поместите их в инвентарь раздатчика. Чтобы взять стрелу, застрявшую в блоке, просто пройдите рядом с ней. Bow=Лук -Bows are ranged weapons to shoot arrows at your foes.=Лук - это оружие дальнего боя, чтобы стрелять стрелами по вашим врагам. +Bows are ranged weapons to shoot arrows at your foes.=Лук это оружие дальнего боя, позволяющее стрелять стрелами в ваших врагов. The speed and damage of the arrow increases the longer you charge. The regular damage of the arrow is between 1 and 9. At full charge, there's also a 20% of a critical hit, dealing 10 damage instead.=Скорость и урон стрелы увеличиваются, пока вы её натягиваете. Обычный урон стрелы находится между 1 и 9. При полном натяжении есть 20-процентный шанс критического удара с уроном 10. To use the bow, you first need to have at least one arrow anywhere in your inventory (unless in Creative Mode). Hold down the right mouse button to charge, release to shoot.=Чтобы использовать лук, нужно иметь хотя бы одну стрелу в вашем инвентаре (за исключением творческого режима). Удерживайте правую клавишу мыши, чтобы натягивать тетиву, затем отпустите, чтобы выстрелить. Bow=Лук Ammunition=Боеприпасы -Damage from bow: 1-10=Урон от лука: 1-10 -Damage from dispenser: 3=Урон от диспенсера: 3 -Launches arrows=Пускает стрелы +Damage from bow: 1-10=Урон из лука: 1-10 +Damage from dispenser: 3=Урон из раздатчика: 3 +Launches arrows=Выпускает стрелы +Crossbow=Арбалет +Crossbows are ranged weapons to shoot arrows at your foes.=Арбалет это оружие дальнего боя, позволяющее стрелять стрелами в ваших врагов. +To use the crossbow, you first need to have at least one arrow anywhere in your inventory (unless in Creative Mode). Hold down the right mouse button to charge, release to load an arrow into the chamber, then to shoot press left mouse.=Чтобы использовать арбалет, нужно иметь хотя бы одну стрелу в вашем инвентаре (за исключением творческого режима). Удерживайте правую клавишу мыши, чтобы зарядить стрелу, затем нажмите левую кнопку мыши, чтобы выстрелить. diff --git a/mods/ITEMS/mcl_bows/locale/template.txt b/mods/ITEMS/mcl_bows/locale/template.txt index ebdea9525..0c5565725 100644 --- a/mods/ITEMS/mcl_bows/locale/template.txt +++ b/mods/ITEMS/mcl_bows/locale/template.txt @@ -15,4 +15,4 @@ Damage from dispenser: 3= Launches arrows= Crossbow= Crossbows are ranged weapons to shoot arrows at your foes.= -To use the crossbow, you first need to have at least one arrow anywhere in your inventory (unless in Creative Mode). Hold down the right mouse button to charge, release to shoot.= \ No newline at end of file +To use the crossbow, you first need to have at least one arrow anywhere in your inventory (unless in Creative Mode). Hold down the right mouse button to charge, release to load an arrow into the chamber, then to shoot press left mouse.= diff --git a/mods/ITEMS/mcl_brewing/locale/mcl_brewing.ru.tr b/mods/ITEMS/mcl_brewing/locale/mcl_brewing.ru.tr index 37b96819d..ca0169a08 100644 --- a/mods/ITEMS/mcl_brewing/locale/mcl_brewing.ru.tr +++ b/mods/ITEMS/mcl_brewing/locale/mcl_brewing.ru.tr @@ -1,10 +1,10 @@ # textdomain: mcl_brewing -Brewing Stand=Варочный стенд +Brewing Stand=Варочная стойка Inventory=Инвентарь -To use a brewing stand, rightclick it.=Кликните правой, чтобы использовать варочный стенд. -To brew, you need blaze powder as fuel, a brewing material and at least 1 glass bottle filled with a liquid.=Для приготовления зелья вам понадобится огненный порошок в качестве топлива, исходный материал и как минимум 1 стеклянная бутылка, наполненная жидкостью. -Place the blaze powder in the left slot, the brewing material in the middle slot and 1-3 bottles in the remaining slots.=Поместите огненный порошок в левый отсек, исходный материал в средний отсек и 1-3 бутылки в оставшиеся отсеки. -When you have found a good combination, the brewing will commence automatically and steam starts to appear, using up the fuel and brewing material. The potions will soon be ready.=Когда вы подберёте хорошее сочетание, приготовление зелья начнётся автоматически — появится пар и начнётся расход топлива и исходного материала. Зелья вскоре будут готовы. +To use a brewing stand, rightclick it.=Кликните правой кнопкой мыши, чтобы использовать варочную стойку. +To brew, you need blaze powder as fuel, a brewing material and at least 1 glass bottle filled with a liquid.=Для приготовления зелья вам понадобится огненный порошок в качестве топлива, варочный материал и как минимум 1 стеклянный пузырёк, наполненный жидкостью. +Place the blaze powder in the left slot, the brewing material in the middle slot and 1-3 bottles in the remaining slots.=Поместите огненный порошок в левый слот, варочный материал в средний слот и 1-3 пузырька в оставшиеся слоты. +When you have found a good combination, the brewing will commence automatically and steam starts to appear, using up the fuel and brewing material. The potions will soon be ready.=Когда вы подберёте хорошую комбинацию, варка зелья начнётся автоматически — появится пар и начнётся расход топлива и материала. Зелья вскоре будут готовы. Different combinations of brewing materials and liquids will give different results. Try to experiment!=Разные сочетания варочных материалов и жидкостей будут давать разные результаты. Поэкспериментируйте! -The stand allows you to brew potions!=Стенд позволяет вам варить зелья! +The stand allows you to brew potions!=Стойка позволяет вам варить зелья! Brew Potions=Зельеварение diff --git a/mods/ITEMS/mcl_buckets/locale/mcl_buckets.ru.tr b/mods/ITEMS/mcl_buckets/locale/mcl_buckets.ru.tr index 9c8cd0539..0fadbd06f 100644 --- a/mods/ITEMS/mcl_buckets/locale/mcl_buckets.ru.tr +++ b/mods/ITEMS/mcl_buckets/locale/mcl_buckets.ru.tr @@ -1,17 +1,25 @@ # textdomain: mcl_buckets Empty Bucket=Пустое ведро A bucket can be used to collect and release liquids.=Ведро может быть использовано для набора и выливания жидкостей. -Punch a liquid source to collect it. You can then use the filled bucket to place the liquid somewhere else.=Ударьте источник жидкости, чтобы зачерпнуть его. После этого вы можете в ведре перенести жидкость в другое место. +Punch a liquid source to collect it. You can then use the filled bucket to place the liquid somewhere else.=Ударьте ведром источник жидкости, чтобы зачерпнуть его. После этого вы можете в ведре перенести жидкость в другое место. Lava Bucket=Ведро лавы A bucket can be used to collect and release liquids. This one is filled with hot lava, safely contained inside. Use with caution.=Ведро может быть использовано для набора и выливания жидкостей. Это ведро наполнено лавой, которая безопасно хранится внутри. Используйте с осторожностью. -Get in a safe distance and place the bucket to empty it and create a lava source at this spot. Don't burn yourself!=Стоя на безопасном расстоянии, поместите ведро в пустоту, чтобы создать источник лавы на этом участке. +Get in a safe distance and place the bucket to empty it and create a lava source at this spot. Don't burn yourself!=Стоя на безопасном расстоянии, используйте ведро на пустом месте, чтобы создать источник лавы на этом участке. Water Bucket=Ведро воды A bucket can be used to collect and release liquids. This one is filled with water.=Ведро может быть использовано для набора и выливания жидкостей. Это ведро наполнено водой. -Place it to empty the bucket and create a water source.=Поместите ведро на пустой участок для создания водного источника. +Place it to empty the bucket and create a water source.=Используйте ведро на пустом месте для создания источника воды. River Water Bucket=Ведро речной воды A bucket can be used to collect and release liquids. This one is filled with river water.=Ведро может быть использовано для набора и выливания жидкостей. Это ведро наполнено речной водой. -Place it to empty the bucket and create a river water source.=Поместите ведро на пустой участок для создания источника речной воды. +Place it to empty the bucket and create a river water source.=Используйте ведро на пустом месте для создания источника речной воды. Collects liquids=Набирает жидкости Places a lava source=Переносит источник лавы Places a water source=Переносит источник воды Places a river water source=Переносит источник речной воды +Axolotl=аксолотлем +Cod=треской +Salmon=лососем +Tropical Fish=тропической рыбой +Bucket of @1=Ведро с @1 +This bucket is filled with water and @1.=Это ведро с водой и @1. +Place it to empty the bucket and place a @1. Obtain by right clicking on a @2 with a bucket of water.=Используйте, чтобы опустошить ведро с @1. Можно получить использовав ведро с водой на мобе. +Places a water source and a @1.=Переносит воду с @1 diff --git a/mods/ITEMS/mcl_cake/locale/mcl_cake.ru.tr b/mods/ITEMS/mcl_cake/locale/mcl_cake.ru.tr index 50a5b34c1..9cb85d84c 100644 --- a/mods/ITEMS/mcl_cake/locale/mcl_cake.ru.tr +++ b/mods/ITEMS/mcl_cake/locale/mcl_cake.ru.tr @@ -1,12 +1,12 @@ # textdomain: mcl_cake Cake=Торт -Cakes can be placed and eaten to restore hunger points. A cake has 7 slices. Each slice restores 2 hunger points and 0.4 saturation points. Cakes will be destroyed when dug or when the block below them is broken.=Торты можно есть, восстанавливая очки голода, а также размещать на других блоках. Торт состоит из 7 кусочков. Каждый кусочек восстанавливает 2 очка голода и 0.4 очка сытости. Торты уничтожаются при выкапывании или разрушении нижестоящего блока. -Place the cake anywhere, then rightclick it to eat a single slice. You can't eat from the cake when your hunger bar is full.=Поместите торт куда-нибудь, затем кликните правой, чтобы съесть кусочек. +Cakes can be placed and eaten to restore hunger points. A cake has 7 slices. Each slice restores 2 hunger points and 0.4 saturation points. Cakes will be destroyed when dug or when the block below them is broken.=Торты можно разместить на блоке и съесть, чтобы восстановить очки голода. Торт состоит из 7 кусочков. Каждый кусочек восстанавливает 2 очка голода и 0.4 очка насыщения. Торты уничтожаются при выкапывании или разрушении нижестоящего блока. +Place the cake anywhere, then rightclick it to eat a single slice. You can't eat from the cake when your hunger bar is full.=Поместите торт куда-нибудь, затем кликните правой кнопкой мыши, чтобы съесть кусочек. Cake (6 Slices Left)=Торт (осталось 6 кусочков) Cake (5 Slices Left)=Торт (осталось 5 кусочков) Cake (4 Slices Left)=Торт (осталось 4 кусочка) Cake (3 Slices Left)=Торт (осталось 3 кусочка) Cake (2 Slices Left)=Торт (осталось 2 кусочка) Cake (1 Slice Left)=Торт (остался 1 кусочек) -With 7 tasty slices!=Из 7 вкусных кусочков -Hunger points: +@1 per slice=Очки голода: +@1 с каждым куском +With 7 tasty slices!=Из 7 вкусных кусочков! +Hunger points: +@1 per slice=Очки голода: +@1 на каждый кусочек diff --git a/mods/ITEMS/mcl_campfires/locale/mcl_campfires.ru.tr b/mods/ITEMS/mcl_campfires/locale/mcl_campfires.ru.tr new file mode 100644 index 000000000..f63e18d68 --- /dev/null +++ b/mods/ITEMS/mcl_campfires/locale/mcl_campfires.ru.tr @@ -0,0 +1,5 @@ +# textdomain: mcl_campfires +Campfire=Костёр +Soul Campfire=Костёр душ +Cooks food and keeps bees happy.=Готовит еду и выкуривает пчёл +Campfires have multiple uses, including keeping bees happy, cooking raw meat and fish, and as a trap.=Костры имеют несколько применений, включая выкуривание пчёл, готовка сырого мяса и рыбы, и как ловушка. \ No newline at end of file diff --git a/mods/ITEMS/mcl_cartography_table/locale/mcl_cartography_table.ru.tr b/mods/ITEMS/mcl_cartography_table/locale/mcl_cartography_table.ru.tr new file mode 100644 index 000000000..bc47ab19f --- /dev/null +++ b/mods/ITEMS/mcl_cartography_table/locale/mcl_cartography_table.ru.tr @@ -0,0 +1,4 @@ +# textdomain: mcl_cartography_table +Cartography Table=Картографический стол +Used to create or copy maps=Используется для создания или копирования карт +Is used to create or copy maps for use..=Используется для создания или копирования карт. diff --git a/mods/ITEMS/mcl_cauldrons/locale/mcl_chaudrons.ru.tr b/mods/ITEMS/mcl_cauldrons/locale/mcl_cauldrons.ru.tr similarity index 58% rename from mods/ITEMS/mcl_cauldrons/locale/mcl_chaudrons.ru.tr rename to mods/ITEMS/mcl_cauldrons/locale/mcl_cauldrons.ru.tr index 272ff7c44..b2255594d 100644 --- a/mods/ITEMS/mcl_cauldrons/locale/mcl_chaudrons.ru.tr +++ b/mods/ITEMS/mcl_cauldrons/locale/mcl_cauldrons.ru.tr @@ -1,7 +1,7 @@ # textdomain: mcl_cauldrons Cauldron=Котёл -Cauldrons are used to store water and slowly fill up under rain. They can also be used to wash off banners.=Котлы используются для хранения воды и медленного наполнения под дождём. Они также могут использоваться для промывания флагов. -Place a water bucket into the cauldron to fill it with water. Place an empty bucket on a full cauldron to retrieve the water. Place a water bottle into the cauldron to fill the cauldron to one third with water. Place a glass bottle in a cauldron with water to retrieve one third of the water. Use an emblazoned banner on a cauldron with water to wash off its top layer.=Попытайтесь поместить ведро воды в котёл, чтобы наполнить его водой. Попытка поместить пустое ведро приведёт к освобождению котла. Поместите в котёл бутылку воды, чтобы наполнить его на треть. +Cauldrons are used to store water and slowly fill up under rain. They can also be used to wash off banners.=Котлы используются для хранения воды и могут медленно наполняться под дождём. Котлы можно использовать для смывания узоров с флага. +Place a water bucket into the cauldron to fill it with water. Place an empty bucket on a full cauldron to retrieve the water. Place a water bottle into the cauldron to fill the cauldron to one third with water. Place a glass bottle in a cauldron with water to retrieve one third of the water. Use an emblazoned banner on a cauldron with water to wash off its top layer.=Используйте ведро воды на котле, чтобы наполнить его водой. Забрать воду из котла можно пустым ведром. Пузырёк с водой также наполняет котёл на одну треть. Cauldron (1/3 Water)=Котёл (1/3 воды) Cauldron (2/3 Water)=Котёл (2/3 воды) Cauldron (3/3 Water)=Котёл (3/3 воды) diff --git a/mods/ITEMS/mcl_cherry_blossom/locale/mcl_cherry_blossom.ru.tr b/mods/ITEMS/mcl_cherry_blossom/locale/mcl_cherry_blossom.ru.tr index 408af8b99..1dc530f7a 100644 --- a/mods/ITEMS/mcl_cherry_blossom/locale/mcl_cherry_blossom.ru.tr +++ b/mods/ITEMS/mcl_cherry_blossom/locale/mcl_cherry_blossom.ru.tr @@ -1,20 +1,20 @@ # textdomain: mcl_cherry_blossom -Cherry Log=Вишнёвое бревно -The trunk of a cherry blossom tree.=Ствол цветущего вишневого дерева. -Stripped Cherry Log=Обтёсанное вишнёвое бревно +Cherry Log=Вишнёвая древесина +The trunk of a cherry blossom tree.=Ствол цветущего вишнёвого дерева. +Stripped Cherry Log=Обтёсанная вишнёвая древесина The stripped trunk of a cherry blossom tree.=Обтёсанный ствол цветущей вишни. -Cherry Bark=Вишня +Cherry Bark=Вишнёвая кора This is a decorative block surrounded by the bark of a tree trunk.=Это декоративный блок, окруженный корой ствола дерева. -Stripped Cherry Wood=Обтёсанная вишнёвая древесина +Stripped Cherry Wood=Обтёсанная вишнёвая кора The stripped wood of a cherry blossom tree.=Обтёсанная древесина цветущей вишни. Cherry Wood Planks=Вишнёвые доски Cherry Leaves=Вишнёвые листья -Cherry blossom leaves are grown from cherry blossom trees.=Листья цветущей вишни выращивают на вишневых деревьях. +Cherry blossom leaves are grown from cherry blossom trees.=Листья цветущей вишни растут на вишнёвых деревьях. Cherry Sapling=Саженец вишни -Cherry blossom sapling can be planted to grow cherry trees.=Саженец цветущей вишни можно посадить для выращивания вишневых деревьев. +Cherry blossom sapling can be planted to grow cherry trees.=Саженец цветущей вишни можно посадить для выращивания вишнёвых деревьев. Cherry Door=Вишнёвая дверь Cherry Trapdoor=Вишнёвый люк -Cherry Stairs=Вишнёвые ступеньки +Cherry Stairs=Вишнёвые ступени Cherry Slab=Вишнёвая плита Double Cherry Slab=Двойная вишнёвая плита Cherry Sign=Вишнёвая табличка diff --git a/mods/ITEMS/mcl_chests/locale/mcl_chests.ru.tr b/mods/ITEMS/mcl_chests/locale/mcl_chests.ru.tr index dc25458c2..6bdb1783b 100644 --- a/mods/ITEMS/mcl_chests/locale/mcl_chests.ru.tr +++ b/mods/ITEMS/mcl_chests/locale/mcl_chests.ru.tr @@ -1,36 +1,36 @@ # textdomain: mcl_chests Chest=Сундук -Chests are containers which provide 27 inventory slots. Chests can be turned into large chests with double the capacity by placing two chests next to each other.=Сундуки это хранилища, предоставляющие 27 отсеков инвентаря. Сундук можно превратить в большой сундук, удвоив его вместительность, для этого нужно поставить ещё один сундук рядом с уже имеющимся. -To access its inventory, rightclick it. When broken, the items will drop out.=Чтобы получить доступ к инвентарю, кликните по сундуку правой клавишей. Если сломать сундук, то он превратится в носимый предмет. +Chests are containers which provide 27 inventory slots. Chests can be turned into large chests with double the capacity by placing two chests next to each other.=Сундук это хранилище, предоставляющее 27 слотов инвентаря. Сундук можно превратить в большой сундук с двойной вместительностью, если поставить ещё один сундук рядом с уже имеющимся. +To access its inventory, rightclick it. When broken, the items will drop out.=Чтобы открыть инвентарь сундука, кликните по нему правой кнопкой мыши. Если сломать сундук, вещи из его инвентаря выпадут. Trapped Chest=Сундук-ловушка -A trapped chest is a container which provides 27 inventory slots. When it is opened, it sends a redstone signal to its adjacent blocks as long it stays open. Trapped chests can be turned into large trapped chests with double the capacity by placing two trapped chests next to each other.=Сундук-ловушка - это хранилище, предоставляющее 27 отсеков инвентаря. При открытии он посылает сигнал редстоуна соседним блокам всё время, пока остается открытым. Сундук-ловушку можно превратить в большой сундук-ловушку, удвоив его вместительность, для этого нужно поставить ещё один сундук-ловушку рядом с уже имеющимся. -Ender Chest=Сундук Предела -Ender chests grant you access to a single personal interdimensional inventory with 27 slots. This inventory is the same no matter from which ender chest you access it from. If you put one item into one ender chest, you will find it in all other ender chests. Each player will only see their own items, but not the items of other players.=Сундук Предела предоставляет вам доступ к одиночному персональному межпространственному инвентарю из 27 отсеков. Этот инвентарь остаётся прежним, неважно какой из сундуков Предела вы используете для доступа к нему. Если вы положите предмет в сундук Предела, вы обнаружите его во всех остальных сундуках Предела. Каждый игрок видит только свои собственные предметы и не видит предметы остальных игроков. -Rightclick the ender chest to access your personal interdimensional inventory.=Кликните правой по сундуку Предела, чтобы получить доступ к вашему персональному межпространственному инвентарю. +A trapped chest is a container which provides 27 inventory slots. When it is opened, it sends a redstone signal to its adjacent blocks as long it stays open. Trapped chests can be turned into large trapped chests with double the capacity by placing two trapped chests next to each other.=Сундук-ловушка это хранилище, предоставляющее 27 слотов инвентаря. Когда сундук-ловушка открыт, он посылает сигнал редстоуна рядом стоящим блокам. Сундук-ловушку можно превратить в большой сундук-ловушку с двойной вместительностью, если поставить ещё один сундук-ловушку рядом с уже имеющимся. +Ender Chest=Сундук Края +Ender chests grant you access to a single personal interdimensional inventory with 27 slots. This inventory is the same no matter from which ender chest you access it from. If you put one item into one ender chest, you will find it in all other ender chests. Each player will only see their own items, but not the items of other players.=Сундук Края предоставляет вам доступ к персональному межпространственному инвентарю из 27 слотов. Этот инвентарь остаётся прежним, неважно какой из сундуков Края вы используете для доступа к нему. Если вы положите предмет в сундук Предела, вы обнаружите его во всех остальных сундуках Предела. Каждый игрок видит только свои собственные предметы и не видит предметы остальных игроков. +Rightclick the ender chest to access your personal interdimensional inventory.=Кликните правой кнопкой мыши по сундуку Края, чтобы получить доступ к вашему персональному межпространственному инвентарю. White Shulker Box=Белый ящик шалкера Light Grey Shulker Box=Светло-серый ящик шалкера Orange Shulker Box=Оранжевый ящик шалкера -Cyan Shulker Box=Голубой ящик шалкера -Magenta Shulker Box=Фиолетовый ящик шалкера -Purple Shulker Box=Пурпурный ящик шалкера -Light Blue Shulker Box=Светло-голубой ящик шалкера +Cyan Shulker Box=Бирюзовый ящик шалкера +Magenta Shulker Box=Сиреневый ящик шалкера +Purple Shulker Box=Фиолетовый ящик шалкера +Light Blue Shulker Box=Голубой ящик шалкера Blue Shulker Box=Синий ящик шалкера Yellow Shulker Box=Жёлтый ящик шалкера Brown Shulker Box=Коричневый ящик шалкера -Lime Shulker Box=Зелёный лаймовый ящик шалкера +Lime Shulker Box=Лаймовый ящик шалкера Green Shulker Box=Зелёный ящик шалкера Pink Shulker Box=Розовый ящик шалкера Red Shulker Box=Красный ящик шалкера Grey Shulker Box=Серый ящик шалкера Black Shulker Box=Чёрный ящик шалкера -A shulker box is a portable container which provides 27 inventory slots for any item except shulker boxes. Shulker boxes keep their inventory when broken, so shulker boxes as well as their contents can be taken as a single item. Shulker boxes come in many different colors.=Ящик шалкера это переносное хранилище, предоставляющее 27 отсеков инвентаря для любых предметов, за исключением ящиков шалкера. Ящики шалкера сохраняют в себе инвентарь, если их сломать, так что их вместе со всем инвентарём можно переносить как один предмет. Ящики шалкера могут быть разных цветов. -To access the inventory of a shulker box, place and right-click it. To take a shulker box and its contents with you, just break and collect it, the items will not fall out. Place the shulker box again to be able to retrieve its contents.=Чтобы получить доступ к инвентарю ящика шалкера, поставьте его куда-нибудь и кликните по нему правой клавишей. Чтобы взять с собой ящик шалкера со всем его содержимым, просто сломайте его, а потом подберите, ни один предмет из него не выпадет. Чтобы вновь получить доступ к содержимому, его надо снова поставить. +A shulker box is a portable container which provides 27 inventory slots for any item except shulker boxes. Shulker boxes keep their inventory when broken, so shulker boxes as well as their contents can be taken as a single item. Shulker boxes come in many different colors.=Ящик шалкера это переносное хранилище, предоставляющее 27 слотов инвентаря для любых предметов, за исключением ящиков шалкера. Ящики шалкера сохраняют в себе инвентарь если их сломать, так что их вместе со всем инвентарём можно переносить как один предмет. Ящики шалкера могут быть разных цветов. +To access the inventory of a shulker box, place and right-click it. To take a shulker box and its contents with you, just break and collect it, the items will not fall out. Place the shulker box again to be able to retrieve its contents.=Чтобы получить доступ к инвентарю ящика шалкера поставьте его и кликните по нему правой кнопкой мыши. Чтобы взять с собой ящик шалкера со всем его содержимым просто сломайте его, а потом подберите, ни один предмет из него не выпадет. Чтобы вновь получить доступ к содержимому, его нужно снова поставить. Shulker Box=Ящик шалкера Large Chest=Большой сундук Inventory=Инвентарь -27 inventory slots=27 отсеков инвентаря -Can be carried around with its contents=Можно переносить вместе со всем содержимым +27 inventory slots=27 слотов инвентаря +Can be carried around with its contents=Можно переносить вместе с содержимым Can be combined to a large chest=Можно объединить в большой сундук -27 interdimensional inventory slots=27 межпространственных отсеков инвентаря -Put items inside, retrieve them from any ender chest=Положите внутрь предмет и получите его из любого сундука Предела +27 interdimensional inventory slots=27 межпространственных слотов инвентаря +Put items inside, retrieve them from any ender chest=Положите внутрь предмет и получите его из любого сундука Края Emits a redstone signal when opened=Подаёт сигнал редстоуна, будучи открытым diff --git a/mods/ITEMS/mcl_clock/locale/mcl_clock.ru.tr b/mods/ITEMS/mcl_clock/locale/mcl_clock.ru.tr index dca0f960c..bb24223a2 100644 --- a/mods/ITEMS/mcl_clock/locale/mcl_clock.ru.tr +++ b/mods/ITEMS/mcl_clock/locale/mcl_clock.ru.tr @@ -1,5 +1,5 @@ # textdomain: mcl_clock Clocks are tools which shows the current time of day in the Overworld.=Часы это инструмент, показывающий текущее время Верхнего Мира. -The clock contains a rotating disc with a sun symbol (yellow disc) and moon symbol and a little “pointer” which shows the current time of day by estimating the real position of the sun and the moon in the sky. Noon is represented by the sun symbol and midnight is represented by the moon symbol.=Часы имеют вращающийся диск со значком солнца (жёлтый диск) и луны, а также маленькую стрелку, которая показывает время, обозначая реальное положение солнца и луны в небе. Полдень обозначается символом солнца, а полночь символом луны. +The clock contains a rotating disc with a sun symbol (yellow disc) and moon symbol and a little “pointer” which shows the current time of day by estimating the real position of the sun and the moon in the sky. Noon is represented by the sun symbol and midnight is represented by the moon symbol.=Часы имеют вращающийся диск со значком солнца и луны, а также маленькую стрелку, которая показывает время, обозначая реальное положение солнца и луны в небе. Полдень обозначается символом солнца, а полночь символом луны. Clock=Часы Displays the time of day in the Overworld=Показывают время Верхнего Мира diff --git a/mods/ITEMS/mcl_cocoas/locale/mcl_cocoas.ru.tr b/mods/ITEMS/mcl_cocoas/locale/mcl_cocoas.ru.tr index 064c01fd3..acce2fa83 100644 --- a/mods/ITEMS/mcl_cocoas/locale/mcl_cocoas.ru.tr +++ b/mods/ITEMS/mcl_cocoas/locale/mcl_cocoas.ru.tr @@ -1,10 +1,10 @@ # textdomain: mcl_cocoas Cocoa Beans=Какао-бобы -Grows at the side of jungle trees=Растут на стволах деревьев джунглей +Grows at the side of jungle trees=Растут на стволах тропических деревьев Cocoa beans can be used to plant cocoa, bake cookies or craft brown dye.=Какао-бобы можно использовать для посадки какао, выпечки печенья или изготовления коричневого красителя. -Right click on the side of a jungle tree trunk (Jungle Wood) to plant a young cocoa.=Кликните правой по боковой части ствола дерева джунглей, чтобы посадить молодое какао. +Right click on the side of a jungle tree trunk (Jungle Wood) to plant a young cocoa.=Кликните правой по боковой части ствола тропического дерева, чтобы посадить молодое какао. Premature Cocoa Pod=Молодой стручок какао Cocoa pods grow on the side of jungle trees in 3 stages.=Стручки какао растут на деревьях джунглей в 3 этапа. Medium Cocoa Pod=Средний стручок какао Mature Cocoa Pod=Зрелый стручок какао -A mature cocoa pod grew on a jungle tree to its full size and it is ready to be harvested for cocoa beans. It won't grow any further.=Зрелый стручок какао вырос на дереве джунглей до своего полного размера и готов к сбору в качестве какао-бобов. Дальше ему расти некуда. +A mature cocoa pod grew on a jungle tree to its full size and it is ready to be harvested for cocoa beans. It won't grow any further.=Зрелый стручок какао вырос на тропическом дереве до своего полного размера и готов к сбору в качестве какао-бобов. Стручок не будет расти дальше. diff --git a/mods/ITEMS/mcl_colorblocks/locale/mcl_colorblocks.ru.tr b/mods/ITEMS/mcl_colorblocks/locale/mcl_colorblocks.ru.tr index e1d694457..784154c25 100644 --- a/mods/ITEMS/mcl_colorblocks/locale/mcl_colorblocks.ru.tr +++ b/mods/ITEMS/mcl_colorblocks/locale/mcl_colorblocks.ru.tr @@ -27,26 +27,26 @@ Green Terracotta=Зелёная керамика Green Glazed Terracotta=Зелёная глазурованная керамика Green Concrete Powder=Зелёный цемент Green Concrete=Зелёный бетон -Cyan Terracotta=Голубая керамика -Cyan Glazed Terracotta=Голубая глазурованная керамика -Cyan Concrete Powder=Голубой цемент -Cyan Concrete=Голубой бетон +Cyan Terracotta=Бирюзовая керамика +Cyan Glazed Terracotta=Бирюзовая глазурованная керамика +Cyan Concrete Powder=Бирюзовый цемент +Cyan Concrete=Бирюзовый бетон Blue Terracotta=Синяя керамика Blue Glazed Terracotta=Синяя глазурованная керамика Blue Concrete Powder=Синий цемент Blue Concrete=Синий бетон -Magenta Terracotta=Фиолетовая керамика -Magenta Glazed Terracotta=Фиолетовая глазурованная керамика -Magenta Concrete Powder=Фиолетовый цемент -Magenta Concrete=Фиолетовый бетон +Magenta Terracotta=Сиреневая керамика +Magenta Glazed Terracotta=Сиреневая глазурованная керамика +Magenta Concrete Powder=Сиреневый цемент +Magenta Concrete=Сиреневый бетон Orange Terracotta=Оранжевая керамика Orange Glazed Terracotta=Оранжевая глазурованная керамика Orange Concrete Powder=Оранжевый цемент Orange Concrete=Оранжевый бетон -Purple Terracotta=Пурпурная керамика -Purple Glazed Terracotta=Пурпурная глазурованная керамика -Purple Concrete Powder=Пурпурный цемент -Purple Concrete=Пурпурный бетон +Purple Terracotta=Фиолетовая керамика +Purple Glazed Terracotta=Фиолетовая глазурованная керамика +Purple Concrete Powder=Фиолетовый цемент +Purple Concrete=Фиолетовый бетон Brown Terracotta=Коричневая керамика Brown Glazed Terracotta=Коричневая глазурованная керамика Brown Concrete Powder=Коричневый цемент @@ -55,20 +55,20 @@ Pink Terracotta=Розовая керамика Pink Glazed Terracotta=Розовая глазурованная керамика Pink Concrete Powder=Розовый цемент Pink Concrete=Розовый бетон -Lime Terracotta=Зелёная лаймовая керамика -Lime Glazed Terracotta=Зелёная лаймовая глазурованная керамика -Lime Concrete Powder=Зелёный лаймовый цемент -Lime Concrete=Зелёный лаймовый бетон -Light Blue Terracotta=Светло-голубая керамика -Light Blue Glazed Terracotta=Светло-голубая глазурованная керамика -Light Blue Concrete Powder=Светло-голубой цемент -Light Blue Concrete=Светло-голубой бетон -Terracotta is a basic building material. It comes in many different colors.=Керамика это основной строительный материал. Он бывает разных цветов. +Lime Terracotta=Лаймовая керамика +Lime Glazed Terracotta=Лаймовая глазурованная керамика +Lime Concrete Powder=Лаймовый цемент +Lime Concrete=Лаймовый бетон +Light Blue Terracotta=Голубая керамика +Light Blue Glazed Terracotta=Голубая глазурованная керамика +Light Blue Concrete Powder=Голубой цемент +Light Blue Concrete=Голубой бетон +Terracotta is a basic building material. It comes in many different colors.=Керамика это базовый строительный материал. Она бывает разных цветов. Glazed terracotta is a decorative block with a complex pattern. It can be rotated by placing it in different directions.=Глазурованная керамика это декоративный блок со сложным орнаментом. -Concrete powder is used for creating concrete, but it can also be used as decoration itself. It comes in different colors. Concrete powder turns into concrete of the same color when it comes in contact with water.=Цемент используется для создания бетона, хотя также может быть украшением сам по себе. Он бывает разных цветов. При контакте с водой цемент превращается в бетон, сохраняя свой цвет. -Concrete is a decorative block which comes in many different colors. It is notable for having a very strong and clean color.=Бетон это декоративный блок, который бывает разных цветов. Бетон славится хорошим и чистым цветом. -Terracotta=Керамика -Terracotta is a basic building material which comes in many different colors. This particular block is uncolored.=Керамика - основной строительный материал, который может быть разных цветов. Обычный блок керамики не окрашен. +Concrete powder is used for creating concrete, but it can also be used as decoration itself. It comes in different colors. Concrete powder turns into concrete of the same color when it comes in contact with water.=Цемент используется для создания бетона, хотя также может быть декорацией сам по себе. Он бывает разных цветов. При контакте с водой цемент превращается в бетон того же цвета. +Concrete is a decorative block which comes in many different colors. It is notable for having a very strong and clean color.=Бетон это декоративный блок, который может быть разных цветов. Бетон приметен своим хорошим и чистым цветом. +Terracotta=Терракота +Terracotta is a basic building material which comes in many different colors. This particular block is uncolored.=Терракота это базовый строительный материал, который может быть разных цветов. Конкретно этот блок не окрашен. Colored Terracotta=Окрашенная керамика Glazed Terracotta=Глазурованная керамика Concrete Powder=Цемент diff --git a/mods/ITEMS/mcl_compass/locale/mcl_compass.ru.tr b/mods/ITEMS/mcl_compass/locale/mcl_compass.ru.tr index 7fd98de87..a3631d182 100644 --- a/mods/ITEMS/mcl_compass/locale/mcl_compass.ru.tr +++ b/mods/ITEMS/mcl_compass/locale/mcl_compass.ru.tr @@ -1,9 +1,14 @@ # textdomain: mcl_compass Compass=Компас -Points to the world origin=Указывает на начало мира -Compasses are tools which point to the world origin (X@=0, Z@=0) or the spawn point in the Overworld.=Компас - инструмент, показывающий на начало мира (X@=0, Z@=0) или на точку возрождения в Верхнем Мире. -A Compass always points to the world spawn point when the player is in the overworld. In other dimensions, it spins randomly.= -Lodestone Compass= -Points to a lodestone= -Lodestone compasses resemble regular compasses, but they point to a specific lodestone.= -A Lodestone compass can be made from an ordinary compass by using it on a lodestone. After becoming a lodestone compass, it always points to its linked lodestone, provided that they are in the same dimension. If not in the same dimension, the lodestone compass spins randomly, similarly to a regular compass when outside the overworld. A lodestone compass can be relinked with another lodestone.= +Points to the world origin=Указывает на центр мира +Compasses are tools which point to the world origin (X@=0, Z@=0) or the spawn point in the Overworld.=Компас - инструмент, показывающий на цента мира (X@=0, Z@=0) или на точку возрождения в Верхнем Мире. +A Compass always points to the world spawn point when the player is in the overworld. In other dimensions, it spins randomly.=Компас в Верхнем мире всегда указывает на мировую точку спавна. В других измерениях он крутится случайно. +Lodestone Compass=Магнетитовый компас +Points to a lodestone=Указывает на магнетит +Lodestone compasses resemble regular compasses, but they point to a specific lodestone.=Магнетитовый компас напоминает обычный компас, но указывает на определенный блок магнетита. +A Lodestone compass can be made from an ordinary compass by using it on a lodestone. After becoming a lodestone compass, it always points to its linked lodestone, provided that they are in the same dimension. If not in the same dimension, the lodestone compass spins randomly, similarly to a regular compass when outside the overworld. A lodestone compass can be relinked with another lodestone.=Магнетитовый компас может быть сделан из обычного компаса использовав его на магнетите. После этого он всегда указывает на привязанный блок магнетит если он находится в том же измерении. Если нет, то магнетитовый компас будет крутится случайно, схоже с обычным компасом вне Верхнего мира. Магнетитовый компас может перепривязаться к другому магнетиту. +Lodestone=Магнетит +Recovery Compass=Компас восстановления +Points to your last death location=Указывает на место вашей последней смерти +Recovery Compasses are compasses that point to your last death location=Компас восстановления указывает на место вашей последней смерти +Recovery Compasses always point to the location of your last death, in case you haven't died yet, it will just randomly spin around=Компас восстановления всегда указывает на место вашей последней смерти, если вы еще не умирали, он будет крутится случайно. diff --git a/mods/ITEMS/mcl_composters/locale/mcl_composters.ru.tr b/mods/ITEMS/mcl_composters/locale/mcl_composters.ru.tr index db472dad4..7fc3274d4 100644 --- a/mods/ITEMS/mcl_composters/locale/mcl_composters.ru.tr +++ b/mods/ITEMS/mcl_composters/locale/mcl_composters.ru.tr @@ -1,7 +1,7 @@ # textdomain: mcl_composters -Composter=Перегнойница -Composters can convert various organic items into bonemeal.=Перегнойницы могут превращать многочисленные растительные предметы в костную муку. -Use organic items on the composter to fill it with layers of compost. Every time an item is put in the composter, there is a chance that the composter adds another layer of compost. Some items have a bigger chance of adding an extra layer than other items. After filling up with 7 layers of compost, the composter is full. After a delay of approximately one second the composter becomes ready and bone meal can be retrieved from it. Right-clicking the composter takes out the bone meal empties the composter."=Используйте растительные предметы на перегнойнице, чтобы заполнить её слоями перегноя. Каждый раз, когда какой-либо предмет помещается в перегнойницу, существует вероятность возникновения добавочного слоя перегноя. Некоторые предметы могут чаще, чем другие приводит к появлению добавочного слоя перегноя. После заполнения на семь слоёв перегноя, перегнойница будет полна. После задержки примерно в одну секунду из перегнойницы можно будет извлечь костную муку. Нажатие правой кнопки мыши по перегнойнице извлекает костную муку и опорожняет её. -filled=заполнена -ready for harvest=готов к жатве -Converts organic items into bonemeal=Превращает растительные предметы в костную муку \ No newline at end of file +Composter=Компостер +Composters can convert various organic items into bonemeal.=Компостер может перерабатывать органические предметы в костную муку +Use organic items on the composter to fill it with layers of compost. Every time an item is put in the composter, there is a chance that the composter adds another layer of compost. Some items have a bigger chance of adding an extra layer than other items. After filling up with 7 layers of compost, the composter is full. After a delay of approximately one second the composter becomes ready and bone meal can be retrieved from it. Right-clicking the composter takes out the bone meal empties the composter.=Используйте органические предметы на компостере, чтобы заполнить его слоями перегноя. Каждый раз когда в компостер попадает предмет, есть шанс что в компостере появится новый слой перегноя. Некоторые предметы имеют больший шанс на появление нового слоя. После заполнения 7 слоями перегноя, компостер можно опустошить, забрав из него костную муку. После задержки в одну секунду компостей будет готов и костная мука будет извлечена из него. Правым кликом по компостеру чтобы забрать костную муку. +filled=заполнен +ready for harvest=готов к сбору +Converts organic items into bonemeal=Перерабатывает органику в костную муку diff --git a/mods/ITEMS/mcl_copper/locale/mcl_copper.ru.tr b/mods/ITEMS/mcl_copper/locale/mcl_copper.ru.tr new file mode 100644 index 000000000..50600e57b --- /dev/null +++ b/mods/ITEMS/mcl_copper/locale/mcl_copper.ru.tr @@ -0,0 +1,57 @@ +# textdomain: mcl_copper +A block of copper is mostly a decorative block.=Медный блок — это декоративный блок. +A block used for compact raw copper storage.=Блок используется для компактного хранения необработанной меди. +Block of Copper=Медный блок +Waxed Block of Copper=Вощёный медный блок +Block of Raw Copper=Блок необработанной меди +Copper Ingot=Медный слиток +Copper Ore=Медная руда +Cut copper is a decorative block.=Резной медный блок это декоративный блок. +Cut Copper=Резной медный блок +Waxed Cut Copper=Вощёный резной медный блок +Double Slab of Cut Copper=Двойная плита из резного медного блока +Double Slab of Exposed Cut Copper=Двойная плита из потемневшего резного медного блока +Double Slab of Oxidized Cut Copper=Двойная плита из окисленного резного медного блока +Double Slab of Weathered Cut Copper=Двойная плита из состаренного резного медного блока +Waxed Double Slab of Cut Copper=Вощёная двойная плита из резного медного блока +Waxed Double Slab of Exposed Cut Copper=Вощёная двойная плита из потемневшего резного медного блока +Waxed Double Slab of Oxidized Cut Copper=Вощёная двойная плита из окисленного резного медного блока +Waxed Double Slab of Weathered Cut Copper=Вощёная двойная плита из состаренного резного медного блока +Exposed copper is a decorative block.=Потемневший медный блок это декоративный блок. +Exposed Copper=Потемневший медный блок +Waxed Exposed Copper=Вощёный потемневший медный блок +Exposed cut copper is a decorative block.=Потемневший резной медный блок это декоративный блок. +Exposed Cut Copper=Потемневший резной медный блок +Waxed Exposed Cut Copper=Вощёный потемневший резной медный блок +Molten Raw Copper. It is used to craft blocks.=Медный слиток. Используется для крафта блоков. +Oxidized copper is a decorative block.=Окисленный медный блок это декоративный блок. +Oxidized Copper=Окисленный медный блок +Waxed Oxidized Copper=Вощёный окисленный медный блок +Oxidized cut copper is a decorative block.=Окисленный резной медный блок это декоративный блок. +Oxidized Cut Copper=Окисленный резной медный блок +Waxed Oxidized Cut Copper=Вощёный окисленный резной медный блок +Raw Copper. Mine a Copper Ore to get it.=Необработанная медь. Добудьте медную руду, чтобы получить её. +Raw Copper=Необработанная медь +Slab of Cut Copper=Плита из резного медного блока +Slab of Exposed Cut Copper=Плита из потемневшего резного медного блока +Slab of Oxidized Cut Copper=Плита из окисленного резного медного блока +Slab of Weathered Cut Copper=Плита из состаренного резного медного блока +Waxed Slab of Cut Copper=Вощёная плита из резного медного блока +Waxed Slab of Exposed Cut Copper=Вощёная плита из потемневшего резного медного блока +Waxed Slab of Oxidized Cut Copper=Вощёная плита из окисленного резного медного блока +Waxed Slab of Weathered Cut Copper=Вощёная плита из состаренного резного медного блока +Some copper contained in stone, it is pretty common and can be found below sea level.=Залежи медной руды находятся в камне, медь довольно распространена и может быть найдена ниже уровня моря. +Stairs of Cut Copper=Ступени из резного медного блока +Stairs of Exposed Cut Copper=Ступени из потемневшего резного медного блока +Stairs of Oxidized Cut Copper=Ступени из окисленного резного медного блока +Stairs of Weathered Cut Copper=Ступени из состаренного резного медного блока +Waxed Stairs of Cut Copper=Вощёные ступени из резного медного блока +Waxed Stairs of Exposed Cut Copper=Вощёные ступени из потемневшего резного медного блока +Waxed Stairs of Oxidized Cut Copper=Вощёные ступени из окисленного резного медного блока +Waxed Stairs of Weathered Cut Copper=Вощёные ступени из состаренного резного медного блока +Weathered copper is a decorative block.=Состаренный медный блок это декоративный блок. +Weathered Copper=Состаренный медный блок +Waxed Weathered Copper=Вощёный состаренный медный блок +Weathered cut copper is a decorative block.=Состаренный резной медный блок это декоративный блок. +Weathered Cut Copper=Состаренный резной медный блок +Waxed Weathered Cut Copper=Вощёный состаренный резной медный блок diff --git a/mods/ITEMS/mcl_core/locale/mcl_core.ru.tr b/mods/ITEMS/mcl_core/locale/mcl_core.ru.tr index bf8ce9e4f..6bc76a9ed 100644 --- a/mods/ITEMS/mcl_core/locale/mcl_core.ru.tr +++ b/mods/ITEMS/mcl_core/locale/mcl_core.ru.tr @@ -1,260 +1,291 @@ # textdomain: mcl_core @1 could not survive in lava.=@1 не смог(ла) выжить в лаве. @1 died in lava.=@1 погиб(ла) в лаве. -@1 melted in lava.=@1 расплавился(лась) в лаве. +@1 melted in lava.=@1 был(а) расплавлен(а) в лаве. @1 took a bath in a hot lava tub.=@1 принял(а) ванну с горячей лавой. A block of diamond is mostly a shiny decorative block but also useful as a compact storage of diamonds.=Алмазный блок это, прежде всего, декоративный блок, но он также удобен для компактного хранения алмазов. A block of emerald is mostly a shiny decorative block but also useful as a compact storage of emeralds.=Изумрудный блок это, прежде всего, декоративный блок, но он также удобен для компактного хранения изумрудов. A block of gold is mostly a shiny decorative block but also useful as a compact storage of gold ingots.=Золотой блок это, прежде всего, декоративный блок, но он также удобен для компактного хранения золотых слитков. -A block of iron is mostly a decorative block but also useful as a compact storage of iron ingots.=Алмазный блок это, прежде всего, декоративный блок, но он также удобен для компактного хранения железных слитков. +A block of iron is mostly a decorative block but also useful as a compact storage of iron ingots.=Железный блок это, прежде всего, декоративный блок, но он также удобен для компактного хранения железных слитков. A cactus can only be placed on top of another cactus or any sand.=Кактус можно поставить только на верхушку другого кактуса или на любой песок. A decorative and mostly transparent block.=Декоративный и преимущественно прозрачный блок. -A grass block is dirt with a grass cover. Grass blocks are resourceful blocks which allow the growth of all sorts of plants. They can be turned into farmland with a hoe and turned into grass paths with a shovel. In light, the grass slowly spreads onto dirt nearby. Under an opaque block or a liquid, a grass block may turn back to dirt.=Травяной блок это грязь, покрытая травой. Травяные блоки удобны тем, что позволяют выращивать любые сорта растений. Их можно превратить в грядки при помощи мотыги или в тропинки при помощи лопаты. При наличии света трава понемногу распространяется на грязь по соседству. Под непрозрачным блоком или жидкостью травяной блок может превратиться обратно в грязь. -A lapis lazuli block is mostly a decorative block but also useful as a compact storage of lapis lazuli.=Ляпис-лазурный блок это, прежде всего, декоративный блок, но он также удобен для компактного хранения ляпис-лазури. -A lava source sets fire to a couple of air blocks above when they're next to a flammable block.=Источник лавы поджигает пару воздушных блоков над ним, если они расположены рядом с легковоспламенимым блоком. -A piece of ladder which allows you to climb vertically. Ladders can only be placed on the side of solid blocks and not on glass, leaves, ice, slabs, glowstone, nor sea lanterns.=Сегмент лестницы, позволяющий вам карабкаться вертикально. Лестницы можно устанавливать только на стороны твёрдых блоков. Их нельзя разместить на стекле, листьях, льду, светящемся камне и морских фонарях. -Acacia Bark=Кора акации -Acacia Leaves=Листва акации +A grass block is dirt with a grass cover. Grass blocks are resourceful blocks which allow the growth of all sorts of plants. They can be turned into farmland with a hoe and turned into grass paths with a shovel. In light, the grass slowly spreads onto dirt nearby. Under an opaque block or a liquid, a grass block may turn back to dirt.=Дёрн это блок земли, покрытый травой. Дёрн удобен тем, что на нём могут расти разнообразные растения. Дёрн можно превратить в грядку при помощи мотыги или в тропинку при помощи лопаты. При наличии света дёрн понемногу распространяется на блоки земли по соседству. Под непрозрачным блоком или жидкостью дёрн может превратиться обратно в землю. +A lapis lazuli block is mostly a decorative block but also useful as a compact storage of lapis lazuli.=Блок лазурита это, прежде всего, декоративный блок, но он также удобен для компактного хранения лазурита. +A lava source sets fire to a couple of air blocks above when they're next to a flammable block.=Источник лавы поджигает пару воздушных блоков над ним, если они расположены рядом с воспламенимым блоком. +A piece of ladder which allows you to climb vertically. Ladders can only be placed on the side of solid blocks and not on glass, leaves, ice, slabs, glowstone, nor sea lanterns.=Лестница позволяет вам карабкаться вертикально. Лестницы можно устанавливать только сбоку на твёрдые блокои. Их нельзя разместить на стекле, листьях, льду, светящемся камне и морских фонарях. +Acacia Bark=Акациевая кора +Acacia Leaves=Акациевая листва Acacia Sapling=Саженец акации -Acacia Wood=Акация -Acacia Wood Planks=Доски акации +Acacia Wood=Акациевая древесина +Acacia Wood Planks=Акациевые доски Acacia leaves are grown from acacia trees.=Листва акации произрастает на деревьях акации. Andesite=Андезит Andesite is an igneous rock.=Андезит это камень вулканической природы. Apple=Яблоко -Apples are food items which can be eaten.=Яблоки относятся к продуктовым предметам, которые можно есть. +Apples are food items which can be eaten.=Яблоки это съедобный продукт. Barrier=Барьер -Barriers are invisible walkable blocks. They are used to create boundaries of adventure maps and the like. Monsters and animals won't appear on barriers, and fences do not connect to barriers. Other blocks can be built on barriers like on any other block.=Барьеры это невидимые блоки-препятствия. Они могут использоваться, например, для создания границ карты. Монстры и животные не будут появляться на барьерах. Заборы с барьерами визуально не связываются. Другие блоки могут строиться на барьерах, как на любых других блоках. +Barriers are invisible walkable blocks. They are used to create boundaries of adventure maps and the like. Monsters and animals won't appear on barriers, and fences do not connect to barriers. Other blocks can be built on barriers like on any other block.=Барьеры это невидимые блоки-препятствия. Они могут использоваться, например, для создания границ карты. Монстры и животные не будут появляться на барьерах. Заборы с барьерами не соединяются. Другие блоки могут строиться на барьерах, как на любых других блоках. Bedrock=Бедрок -Bedrock is a very hard type of rock. It can not be broken, destroyed, collected or moved by normal means, unless in Creative Mode.=Бедрок это очень твёрдый камень. Его невозможно сломать, выкопать или сдвинуть обычным способом, за исключением творческого режима. -Birch Bark=Кора берёзы -Birch Leaves=Листва берёзы +Bedrock is a very hard type of rock. It can not be broken, destroyed, collected or moved by normal means, unless in Creative Mode.=Бедрок это очень твёрдый камень. Его невозможно сломать, добыть или сдвинуть обычным способом, за исключением творческого режима. +Birch Bark=Берёзовая кора +Birch Leaves=Берёзовая листва Birch Sapling=Саженец берёзы -Birch Wood=Берёза +Birch Wood=Берёзовая древесина Birch Wood Planks=Берёзовые доски Birch leaves are grown from birch trees.=Листва берёзы произрастает на берёзах. -Black Stained Glass=Чёрное витражное стекло +Black Stained Glass=Чёрное стекло Block of Coal=Угольный блок Block of Diamond=Алмазный блок Block of Emerald=Изумрудный блок Block of Gold=Золотой блок Block of Iron=Железный блок -Blocks of coal are useful as a compact storage of coal and very useful as a furnace fuel. A block of coal is as efficient as 10 coal.=Угольный блок удобен для компактного хранения угля, а также как топливо для печи. -Blue Stained Glass=Синее витражное стекло +Blocks of coal are useful as a compact storage of coal and very useful as a furnace fuel. A block of coal is as efficient as 10 coal.=Угольный блок удобен для компактного хранения угля, а также полезен как топливо для печи. +Blue Stained Glass=Синее стекло Bone Block=Костный блок Bone blocks are decorative blocks and a compact storage of bone meal.=Костные блоки это декоративные блоки, а также способ компактного хранения костной муки. -Bowl=Чаша -Bowls are mainly used to hold tasty soups.=Чаши чаще всего используются для хранения вкусных супов. +Bowl=Миска +Bowls are mainly used to hold tasty soups.=Миски используются для крафта вкусных супов. Brick=Кирпич Brick Block=Кирпичный блок Brick blocks are a good building material for building solid houses and can take quite a punch.=Кирпичные блоки это отличный строительный материал для создания прочных домов, они выдерживают довольно сильные удары. Bricks are used to craft brick blocks.=Кирпичи используются для создания кирпичных блоков. -Brown Stained Glass=Коричневое витражное стекло +Brown Stained Glass=Коричневое стекло Cactus=Кактус Charcoal=Древесный уголь -Charcoal is an alternative furnace fuel created by cooking wood in a furnace. It has the same burning time as coal and also shares many of its crafting recipes, but it can not be used to create coal blocks.=Древесный уголь это альтернативное печное топливо, получаемое путём сжигания дерева в качестве ингредиента в печи. Оно имеет такую же длительность горения, как и каменный уголь, но из него нельзя сделать угольные блоки. -Chiseled Stone Bricks=Точёный каменный блок -Chiseled Red Sandstone=Точёный красный камень -Chiseled Sandstone=Точёный песчаник -Chiseled red sandstone is a decorative building block.=Точёный красный камень это декоративный строительный блок. -Chiseled sandstone is a decorative building block.=Точёный песчаник это декоративный строительный блок. -Clay=Глина -Clay Ball=Глиняный шарик -Clay balls are a raw material, mainly used to create bricks in the furnace.=Глиняные шарики это необработанный материал, в основном используемый для создания кирпичей при помощи печи. -Clay is a versatile kind of earth commonly found at beaches underwater.=Глина это универсальный тип почвы, часто встречающийся под водой возле отмелей. +Charcoal is an alternative furnace fuel created by cooking wood in a furnace. It has the same burning time as coal and also shares many of its crafting recipes, but it can not be used to create coal blocks.=Древесный уголь это альтернативное печное топливо, получаемое путём сжигания древесины в качестве ингредиента в печи. Оно имеет такую же длительность горения, как и каменный уголь, но из него нельзя сделать угольные блоки. +Chiseled Stone Bricks=Декоративные каменные кирпичи +Chiseled Red Sandstone=Декоративный красный песчаник +Chiseled Sandstone=Декоративный песчаник +Chiseled red sandstone is a decorative building block.=Декоративный красный песчаник это декоративный строительный блок. +Chiseled sandstone is a decorative building block.=Декоративный песчаник это декоративный строительный блок. +Clay=Глиняный блок +Clay Ball=Глина +Clay balls are a raw material, mainly used to create bricks in the furnace.=Глина это необработанный материал, в основном используемый для создания кирпичей при помощи печи. +Clay is a versatile kind of earth commonly found at beaches underwater.=Глиняный блок это тип почвы, часто встречающийся на побережьях под водой. Coal=Уголь Coal Ore=Угольная руда -Coarse Dirt=Твёрдая грязь -Coarse dirt acts as a soil for some plants and is similar to dirt, but it will never grow a cover.=Твёрдая грязь равносильна почве для некоторых растений и похожа на обычную грязь, но на ней не растёт трава. +Coarse Dirt=Каменистая земля +Coarse dirt acts as a soil for some plants and is similar to dirt, but it will never grow a cover.=Каменистая земля это почва для некоторых растений и похожа на обычную землю, но на ней никогда не растёт трава. Cobblestone=Булыжник Cobweb=Паутина Cobwebs can be walked through, but significantly slow you down.=Паутину можно пройти насквозь, но она ощутимо снижает вашу скорость. -Cracked Stone Bricks=Треснутые каменные блоки -Cut Red Sandstone=Резной красный камень +Cracked Stone Bricks=Потрескавшиеся каменные кирпичи +Cut Red Sandstone=Резной красный песчаник Cut Sandstone=Резной песчаник -Cut red sandstone is a decorative building block.=Резной красный камень это декоративный строительный блок. +Cut red sandstone is a decorative building block.=Резной красный песчаник это декоративный строительный блок. Cut sandstone is a decorative building block.=Резной песчаник это декоративный строительный блок. -Cyan Stained Glass=Голубое витражное стекло +Cyan Stained Glass=Бирюзовое стекло Dark Oak Bark=Кора тёмного дуба Dark Oak Leaves=Листва тёмного дуба Dark Oak Sapling=Саженец тёмного дуба -Dark Oak Wood=Тёмный дуб +Dark Oak Wood=Древесина тёмного дуба Dark Oak Wood Planks=Доски из тёмного дуба Dark oak leaves are grown from dark oak trees.=Листва тёмного дуба произрастает на деревьях тёмного дуба. -Dark oak saplings can grow into dark oaks, but only in groups. A lonely dark oak sapling won't grow. A group of four dark oak saplings grows into a dark oak after some time when they are placed on soil (such as dirt) in a 2×2 square and exposed to light.=Из саженцев тёмного дуба могут вырастать деревья, но для этого надо высаживать их группами. Одинокие саженцы не будут расти. Группа из четырёх саженцев станет деревом через некоторое время после высадки на освещённый участок почвы (или грязи) в виде квадрата 2*2. +Dark oak saplings can grow into dark oaks, but only in groups. A lonely dark oak sapling won't grow. A group of four dark oak saplings grows into a dark oak after some time when they are placed on soil (such as dirt) in a 2×2 square and exposed to light.=Из саженцев тёмного дуба могут вырастать деревья, но для этого надо высаживать их группами. Одинарные саженцы не будут расти. Группа из четырёх саженцев станет деревом через некоторое время после высадки на освещённый участок почвы в виде квадрата 2×2. Dead Bush=Мёртвый куст Dead bushes are unremarkable plants often found in dry areas. They can be harvested for sticks.=Мёртвые кусты это непримечательные растения, часто встречающиеся в засушливых областях. Их можно собирать, чтобы сделать из них палки. Diamond=Алмаз Diamond Ore=Алмазная руда -Diamond ore is rare and can be found in clusters near the bottom of the world.=Алмазная руда встречается редко, в виде скоплений около дна мира. +Diamond ore is rare and can be found in clusters near the bottom of the world.=Алмазная руда встречается редко, в виде скоплений в нижних слоях мира. Diamonds are precious minerals and useful to create the highest tier of armor and tools.=Алмазы это драгоценные камни, используемые для создания брони и инструментов высшего качества. Diorite=Диорит Diorite is an igneous rock.=Диорит это камень вулканической природы. -Dirt=Грязь -Dirt acts as a soil for a few plants. When in light, this block may grow a grass or mycelium cover if such blocks are nearby.=Грязь то же самое, что почва для некоторых растений. Под освещением на этом блоке может прорасти трава или мицелий, если такие блоки уже есть поблизости. +Dirt=Земля +Dirt acts as a soil for a few plants. When in light, this block may grow a grass or mycelium cover if such blocks are nearby.=Земля это почва для некоторых растений. Под освещением на этом блоке может прорасти трава или мицелий, если такие блоки уже есть поблизости. Emerald=Изумруд Emerald Ore=Изумрудная руда -Emerald ore is the ore of emeralds. It is very rare and can be found alone, not in clusters.=Изумрудная руда встречается очень редко и всегда по одному блоку. -Emeralds are used in villager trades as currency.= +Emerald ore is the ore of emeralds. It is very rare and can be found alone, not in clusters.=Изумрудная руда встречается очень редко и всегда по одному блоку, а не в кластерах. +Emeralds are used in villager trades as currency.=Изумруды используют деревенские жители в качестве валюты. Flint=Кремень Flint is a raw material.=Кремень это необработанный материал. Flowing Lava=Текущая лава Flowing Water=Текущая вода -Frosted Ice=Намёрзший лёд -Frosted ice is a short-lived solid block. It melts into a water source within a few seconds.=Намёрзший лёд это быстро исчезающий твёрдый блок. Он за несколько секунд тает, превращаясь в источник воды. +Frosted Ice=Подмороженный лёд +Frosted ice is a short-lived solid block. It melts into a water source within a few seconds.=Подмороженный лёд это быстро исчезающий твёрдый блок. Он растает через несколько секунд, превратившись в источник воды. Glass=Стекло Gold Ingot=Золотой слиток Gold Nugget=Золотой самородок Gold Ore=Золотая руда Gold nuggets are very small pieces of molten gold; the main purpose is to create gold ingots.=Золотые самородки это мелкие частички чистого золота, которые можно объединять в золотые слитки. Golden Apple=Золотое яблоко -Golden apples are precious food items which can be eaten.=Золотые яблоки это изысканные продуктовые предметы, которые можно есть. +Golden apples are precious food items which can be eaten.=Золотые яблоки это ценный съедобный продукт. Granite=Гранит -Grass Block=Травяной блок +Grass Block=Дёрн Grass Path=Тропинка -Grass paths are a decorative variant of grass blocks. Their top has a different color and they are a bit lower than grass blocks, making them useful to build footpaths. Grass paths can be created with a shovel. A grass path turns into dirt when it is below a solid block.=Тропинки это декоративная разновидность травяных блоков. Их верхняя часть окрашена другим цветом, а они сами чуть ниже, чтобы это смотрелось как притоптанная трава. Такие блоки можно создать при помощи лопаты. При помещении под твёрдый блок данные блоки превращаются в грязь. +Grass paths are a decorative variant of grass blocks. Their top has a different color and they are a bit lower than grass blocks, making them useful to build footpaths. Grass paths can be created with a shovel. A grass path turns into dirt when it is below a solid block.=Тропинки это декоративная разновидность травяных блоков. Их верхняя часть окрашена другим цветом, а они сами чуть ниже, чтобы это смотрелось как притоптанная трава. Такие блоки можно создать при помощи лопаты. При помещении под твёрдый блок данные блоки превращаются в землю. Gravel=Гравий -Green Stained Glass=Зелёное витражное стекло -Grey Stained Glass=Серое витражное стекло +Green Stained Glass=Зелёное стекло +Grey Stained Glass=Серое стекло Ice=Лёд -Ice is a solid block usually found in cold areas. It melts near block light sources at a light level of 12 or higher. When it melts or is broken while resting on top of another block, it will turn into a water source.=Лёд это твёрдый блок, обычно встречающийся в холодных областях. Он плавится, когда рядом имеется источник света уровня 12 и выше. Если он плавится или ломается, будучи расположенным на другом блоке, то превращается в источник воды. -In the End dimension, starting a fire on this block will create an eternal fire.=В измерении Предела разжигание огня на этом блоке создаст вечный огонь. +Ice is a solid block usually found in cold areas. It melts near block light sources at a light level of 12 or higher. When it melts or is broken while resting on top of another block, it will turn into a water source.=Лёд это твёрдый блок, обычно встречающийся в холодных областях. Он тает, когда рядом имеется источник света уровня 12 и выше. Если он тает или ломается, будучи расположенным на другом блоке, то превращается в источник воды. +In the End dimension, starting a fire on this block will create an eternal fire.=В измерении Края разжигание огня на этом блоке создаст вечный огонь. Iron Ingot=Железный слиток Iron Nugget=Железный самородок Iron Ore=Железная руда Iron nuggets are very small pieces of molten iron; the main purpose is to create iron ingots.=Железные самородки это маленькие частички чистого железа, которые можно объединять в железные слитки. -Jungle Bark=Кора дерева джунглей -Jungle Leaves=Листва дерева джунглей -Jungle Sapling=Саженец дерева джунглей -Jungle Wood=Дерево джунглей -Jungle Wood Planks=Доски из дерева джунглей -Jungle leaves are grown from jungle trees.=Листва дерева джунглей произрастает на деревьях джунглей. +Jungle Bark=Кора тропического дерева +Jungle Leaves=Листва тропического дерева +Jungle Sapling=Саженец тропического дерева +Jungle Wood=Древесина тропического дерева +Jungle Wood Planks=Доски из тропического дерева +Jungle leaves are grown from jungle trees.=Листва тропического дерева произрастает на тропических деревьях. Ladder=Лестница -Lapis Lazuli=Ляпис-лазурь -Lapis Lazuli are required for enchanting items on an enchanting table.=Лазурит требуется для зачарования предметов на столе зачаровывания. -Lapis Lazuli Block=Ляпис-лазурный блок -Lapis Lazuli Ore=Ляпис-лазурная руда -Lapis lazuli ore is the ore of lapis lazuli. It can be rarely found in clusters near the bottom of the world.=Ляпис-лазурная руда это руда ляпис-лазури. Она изредка встречается в виде скоплений вблизи дна мира. +Lapis Lazuli=Лазурит +Lapis Lazuli are required for enchanting items on an enchanting table.=Лазурит требуется для зачарования предметов на столе зачарований. +Lapis Lazuli Block=Блок лазурита +Lapis Lazuli Ore=Лазуритовая руда +Lapis lazuli ore is the ore of lapis lazuli. It can be rarely found in clusters near the bottom of the world.=Лазуритовая руда это руда лазурита. Она изредка встречается в виде скоплений в нижних слоях мира. Lava Source=Источник лавы -Lava is hot and rather dangerous. Don't touch it, it will hurt you a lot and it is hard to get out.=Лава горячая и довольно опасная. Не прикасайтесь к ней, это причинит сильную боль, и выбраться из неё сложно. -Light Blue Stained Glass=Светло-голубое витражное стекло -Light Grey Stained Glass=Светло-серое витражное стекло -Lime Stained Glass=Зелёное лаймовое витражное стекло -Lit Redstone Ore=Светящаяся руда красного камня -Magenta Stained Glass=Фиолетовое витражное стекло -Molten gold. It is used to craft armor, tools, and whatnot.=Чистое золото. Используется для создания брони, инструментов и чего угодно. -Molten iron. It is used to craft armor, tools, and whatnot.=Чистое железо. Используется для создания брони, инструментов и чего угодно. -Mossy Cobblestone=Мшистый булыжник -Mossy Stone Bricks=Мшистый каменный блок +Lava is hot and rather dangerous. Don't touch it, it will hurt you a lot and it is hard to get out.=Лава горячая и довольно опасная. Не прикасайтесь к ней, это нанесет вам урон, и выплыть из неё сложно. +Light Blue Stained Glass=Голубое стекло +Light Grey Stained Glass=Светло-серое стекло +Lime Stained Glass=Лаймовое стекло +Lit Redstone Ore=Светящаяся руда редстоуна +Magenta Stained Glass=Сиреневое стекло +Molten gold. It is used to craft armor, tools, and whatnot.=Золотой слиток. Используется для создания брони, инструментов и прочего. +Molten iron. It is used to craft armor, tools, and whatnot.=Железный слиток. Используется для создания брони, инструментов и прочего. +Mossy Cobblestone=Замшелый булыжник +Mossy Stone Bricks=Замшелые каменные кирпичи Mycelium=Мицелий -Mycelium is a type of dirt and the ideal soil for mushrooms. Unlike other dirt-type blocks, it can not be turned into farmland with a hoe. In light, mycelium slowly spreads over nearby dirt. Under an opaque block or a liquid, it eventually turns back into dirt.=Мицелий это тип грязи, идеально подходящий для грибов. В отличие от других грязевых блоков, он не может быть превращён в грядку при помощи мотыги. При наличии освещения мицелий медленно распространяется по соседствующей с ним грязи. Под непрозрачным блоком или жидкостью со временем превращается обратно в грязь. -Oak Bark=Кора дуба -Oak Leaves=Листва дуба +Mycelium is a type of dirt and the ideal soil for mushrooms. Unlike other dirt-type blocks, it can not be turned into farmland with a hoe. In light, mycelium slowly spreads over nearby dirt. Under an opaque block or a liquid, it eventually turns back into dirt.=Мицелий это идеальная почва для грибов. В отличие от других земляных блоков, он не может быть превращён в грядку при помощи мотыги. При наличии освещения мицелий медленно распространяется по соседствующие с ним блоки земли. Под непрозрачным блоком или жидкостью со временем превращается обратно в землю. +Oak Bark=Дубовая кора +Oak Leaves=Дубовая листва Oak Sapling=Саженец дуба -Oak Wood=Дуб +Oak Wood=Дубовая древесина Oak Wood Planks=Дубовые доски Oak leaves are grown from oak trees.=Листва дуба произрастает на дубовых деревьях. Obsidian=Обсидиан Obsidian is an extremely hard mineral with an enourmous blast-resistance. Obsidian is formed when water meets lava.=Обсидиан это чрезвычайно твёрдый минерал с высочайшей взрывоустойчивостью. -One of the most common blocks in the world, almost the entire underground consists of stone. It sometimes contains ores. Stone may be created when water meets lava.=Один из самых обычных блоков мира, почти вся подземная часть состоит из камня. Иногда он содержит руду. Камень может создаться при встрече воды с лавой. -Orange Stained Glass=Оранжевое витражное стекло -Packed Ice=Упакованный лёд -Packed ice is a compressed form of ice. It is opaque and solid.=Упакованный лёд это сжатая форма льда. Он непрозрачный и твёрдый. +One of the most common blocks in the world, almost the entire underground consists of stone. It sometimes contains ores. Stone may be created when water meets lava.=Один из самых распространённых блоков в мире, почти вся подземная часть состоит из камня. Иногда он содержит руду. Камень может создаться при встрече воды с лавой. +Orange Stained Glass=Оранжевое стекло +Packed Ice=Плотный лёд +Packed ice is a compressed form of ice. It is opaque and solid.=Плотный лёд это сжатая форма льда. Он непрозрачный и твёрдый. Paper=Бумага Paper is used to craft books and maps.=Бумага используется для создания книг и карт. -Pink Stained Glass=Розовое витражное стекло +Pink Stained Glass=Розовое стекло Podzol=Подзол -Podzol is a type of dirt found in taiga forests. Only a few plants are able to survive on it.=Подзол это тип грязи, встречающийся в таёжных лесах. Только несколько растений имеют способность выжить на нём. -Polished Andesite=Гладкий андезит -Polished Diorite=Гладкий диорит -Polished Granite=Гладкий гранит -Polished Stone=Гладкий камень -Polished andesite is a decorative building block made from andesite.=Гладкий андезит это декоративный строительный блок, сделанный из андезита. -Polished diorite is a decorative building block made from diorite.=Гладкий диорит это декоративный строительный блок, сделанный из диорита. -Polished granite is a decorative building block made from granite.=Гладкий гранит это декоративный строительный блок, сделанный из гранита. -Purple Stained Glass=Пурпурное витражное стекло +Podzol is a type of dirt found in taiga forests. Only a few plants are able to survive on it.=Подзол это тип земли, встречающийся в таёжных лесах. Только несколько растений имеют способность выжить на нём. +Polished Andesite=Полированный андезит +Polished Diorite=Полированный диорит +Polished Granite=Полированный гранит +Polished Stone=Полированный камень +Polished andesite is a decorative building block made from andesite.=Гладкий андезит это декоративный строительный блок из андезита. +Polished diorite is a decorative building block made from diorite.=Гладкий диорит это декоративный строительный блок из диорита. +Polished granite is a decorative building block made from granite.=Гладкий гранит это декоративный строительный блок из гранита. +Purple Stained Glass=Фиолетовое стекло Realm Barrier=Барьер области Red Sand=Красный песок Red Sandstone=Красный песчаник -Red Stained Glass=Красное витражное стекло +Red Stained Glass=Красное стекло Red sand is found in large quantities in mesa biomes.=Красный песок в больших количествах встречается в биомах столовых гор. -Red sandstone is compressed red sand and is a rather soft kind of stone.=Красный песчаник это сжатый красный песок, мягкая разновидность камня. -Redstone Ore=Краснокаменная руда -Redstone ore is commonly found near the bottom of the world. It glows when it is punched or walked upon.=Краснокаменная руда обычно содержится вблизи дна мира. +Red sandstone is compressed red sand and is a rather soft kind of stone.=Красный песчаник это сжатый красный песок, некая разновидность камня. +Redstone Ore=Редстоуновая руда +Redstone ore is commonly found near the bottom of the world. It glows when it is punched or walked upon.=Редстоуновая руда обычно содержится в нижних слоях мира. Sand=Песок Sand is found in large quantities at beaches and deserts.=Песок в больших количествах встречается на пляжах и в пустынях. Sandstone=Песчаник -Sandstone is compressed sand and is a rather soft kind of stone.=Песчаник это сжатый песок, мягкая разновидность камня. +Sandstone is compressed sand and is a rather soft kind of stone.=Песчаник это сжатый песок, некая разновидность камня. Slime Block=Блок слизи -Slime blocks are very bouncy and prevent fall damage.=Блок слизи очень упруг и спасает от повреждений при падении. -Smooth Red Sandstone=Гладкий красный камень +Slime blocks are very bouncy and prevent fall damage.=Блок слизи очень упругий и спасает от повреждений при падении. +Smooth Red Sandstone=Гладкий красный песчаник Smooth Sandstone=Гладкий песчаник -Smooth red sandstone is a decorative building block.=Гладкий красный камень это декоративный строительный блок. -Smooth sandstone is compressed sand and is a rather soft kind of stone.=Гладкий песчаник это сжатый песок, мягкая разновидность камня. +Smooth red sandstone is a decorative building block.=Гладкий красный песчаник это декоративный строительный блок. +Smooth sandstone is compressed sand and is a rather soft kind of stone.=Гладкий песчаник это сжатый песок, некая разновидность камня. Snow=Снег -Some coal contained in stone, it is very common and can be found inside stone in medium to large clusters at nearly every height.=Немного угля содержится в камне, это обычное явление, скопления таких блоков встречаются около возвышенностей. -Some iron contained in stone, it is prety common and can be found below sea level.=Немного железа содержится в камне, это довольно обычное явление, такие блоки встречаются ниже уровня моря. -Spruce Bark=Кора ели -Spruce Leaves=Хвоя +Some coal contained in stone, it is very common and can be found inside stone in medium to large clusters at nearly every height.=Уголь содержится в камне, он весьма распространён, скопления таких блоков встречаются около возвышенностей. +Some iron contained in stone, it is prety common and can be found below sea level.=Железо содержится в камне, оно весьма распространено, такие блоки встречаются ниже уровня моря. +Spruce Bark=Еловая кора +Spruce Leaves=Еловая хвоя Spruce Sapling=Саженец ели -Spruce Wood=Ель +Spruce Wood=Еловая древесина Spruce Wood Planks=Еловые доски Spruce leaves are grown from spruce trees.=Хвоя растёт на еловых деревьях. -Stained glass is a decorative and mostly transparent block which comes in various different colors.=Витражное стекло это декоративный и в основном прозрачный блок, встречающийся в различных расцветках. +Stained glass is a decorative and mostly transparent block which comes in various different colors.=Окрашенное стекло это декоративный прозрачный блок, встречающийся в различных расцветках. Stick=Палка -Sticks are a very versatile crafting material; used in countless crafting recipes.=Палки это универсальный материал, используемый для создания различных вещей, присутствует во многих рецептах. +Sticks are a very versatile crafting material; used in countless crafting recipes.=Палки это универсальный материал, используемый для крафта различных предметов, присутствует во многих рецептах. Stone=Камень -Stone Bricks=Каменные блоки +Stripped Acacia Log=Обтёсанная акациевая древесина +Stripped Acacia Wood=Обтёсанная акациевая кора +Stripped Birch Log=Обтёсанная берёзовая древесина +Stripped Birch Wood=Обтёсанная берёзовая кора +Stripped Dark Oak Log=Обтёсанная древесина тёмного дуба +Stripped Dark Oak Wood=Обтёсанная кора тёмного дуба +Stripped Jungle Log=Обтёсанная тропическая древесина +Stripped Jungle Wood=Обтёсанная тропическая кора +Stripped Oak Log=Обтёсанная дубовая древесина +Stripped Oak Wood=Обтёсанная дубовая кора +Stripped Spruce Log=Обтёсанная еловая древесина +Stripped Spruce Wood=Обтёсанная еловая кора +Stone Bricks=Каменные кирпичи Sugar=Сахар Sugar Canes=Сахарный тростник -Sugar canes are a plant which has some uses in crafting. Sugar canes will slowly grow up to 3 blocks when they are next to water and are placed on a grass block, dirt, sand, red sand, podzol or coarse dirt. When a sugar cane is broken, all sugar canes connected above will break as well.=Сахарный тростник это растение, имеющее некоторое применение в крафтинге. Если тростник находится по соседству с водой на травяном блоке, грязи, красном песке, подзоле или грубой грязи, он будет медленно расти вверх до 3 блоков. Если сломать тростник, все верхние части также сломаются. +Sugar canes are a plant which has some uses in crafting. Sugar canes will slowly grow up to 3 blocks when they are next to water and are placed on a grass block, dirt, sand, red sand, podzol or coarse dirt. When a sugar cane is broken, all sugar canes connected above will break as well.=Сахарный тростник это растение, используемое в крафте. Если тростник находится по соседству с водой на дёрне, земле, песке, красном песке, подзоле или каменистой земле, он будет медленно расти вверх до 3 блоков. Если сломать тростник, все верхние части также сломаются. Sugar canes can only be placed top of other sugar canes and on top of blocks on which they would grow.=Сахарный тростник может быть помещён только на верхушку другого сахарного тростника, либо на верхнюю часть другого блока, на котором он может расти. Sugar comes from sugar canes and is used to make sweet foods.=Сахар добывают из сахарного тростника и используют для приготовления сладких продуктов. -The trunk of a birch tree.=Берёзовый ствол -The trunk of a dark oak tree.=Ствол тёмного дуба -The trunk of a jungle tree.=Ствол дерева джунглей -The trunk of a spruce tree.=Еловый ствол -The trunk of an acacia.=Ствол акации -The trunk of an oak tree.=Дубовый ствол -This block consists of a couple of loose stones and can't support itself.=Этот блок состоит из пары рыхлых камней и не может удержать себя. -This is a decorative block surrounded by the bark of a tree trunk.=Это декоративный блок, окружённый древесной корой. -This is a full block of snow. Snow of this thickness is usually found in areas of extreme cold.=Это целый блок снега. Снег такой толщины обычно встречается в экстремально холодных зонах. -This is a piece of cactus commonly found in dry areas, especially deserts. Over time, cacti will grow up to 3 blocks high on sand or red sand. A cactus hurts living beings touching it with a damage of 1 HP every half second. When a cactus block is broken, all cactus blocks connected above it will break as well.=Это часть кактуса, обычно встречающегося в засушливых областях, особенно в пустынях. Со временем кактусы растут до 3 блоков вверх на песке или красном песке. Кактус колет живых существ, трогающих его, причиняя урон в 1 HP каждые полсекунды. Если сломать кактус, все вышестоящие блоки сломаются также. +The stripped trunk of an acacia tree.=Обтёсанное акациевое бревно. +The stripped trunk of a birch tree.=Обтёсанное берёзовое бревно. +The stripped trunk of a dark oak tree.=Обтёсанное бревно тёмного дуба. +The stripped trunk of a jungle tree.=Обтёсанное тропическое бревно. +The stripped trunk of an oak tree.=Обтёсанное дубовое бревно. +The stripped trunk of a spruce tree.=Обтёсанное еловое бревно. +The trunk of a birch tree.=Берёзовое бревно. +The trunk of a dark oak tree.=Бревно тёмного дуба. +The trunk of a jungle tree.=Тропическое бревно. +The trunk of a spruce tree.=Еловое бревно. +The trunk of an acacia.=Акациевое бревно. +The trunk of an oak tree.=Дубовое бревно. +The stripped wood of an acacia tree.=Обтёсанная акациевая кора. +The stripped wood of a birch tree.=Обтёсанная берёзовая кора. +The stripped wood of a dark oak tree.=Обтёсанная кора тёмного дуба. +The stripped wood of a jungle tree.=Обтёсанная тропическая кора. +The stripped wood of an oak tree.=Обтёсанная дубовая кора. +The stripped wood of a spruce tree.=Обтёсанная еловая кора. +This block consists of a couple of loose stones and can't support itself.=Этот блок рыхлый и не может поддерживать себя. +This is a decorative block surrounded by the bark of a tree trunk.=Это декоративный блок из древесной коры. +This is a decorative block.=Это декоративный блок. +This is a full block of snow. Snow of this thickness is usually found in areas of extreme cold.=Это блок снега. Снег такой толщины обычно встречается в экстремально холодных зонах. +This is a piece of cactus commonly found in dry areas, especially deserts. Over time, cacti will grow up to 3 blocks high on sand or red sand. A cactus hurts living beings touching it with a damage of 1 HP every half second. When a cactus block is broken, all cactus blocks connected above it will break as well.=Это кактус, обычно встречающийся в засушливых регионах, особенно в пустынях. Со временем кактусы вырастают до 3 блоков вверх на песке или красном песке. Кактус колет живых существ, касающихся его, причиняя урон в 1 единицу здоровья каждые полсекунды. Если сломать кактус, все вышестоящие блоки сломаются также. This stone contains pure gold, a rare metal.=Этот камень содержит чистое золото, редкий металл. -Top Snow=Наст -Top snow is a layer of snow. It melts near light sources other than the sun with a light level of 12 or higher.=Наст это верхний слой снега. Он тает вблизи не солнечных источников света с яркостью уровня 12 и выше. +Top Snow=Слой снега +Top snow is a layer of snow. It melts near light sources other than the sun with a light level of 12 or higher.=Слой снега. Он тает вблизи источников света с яркостью уровня 12 и выше. Vines=Лоза -Vines are climbable blocks which can be placed on the sides of solid full-cube blocks. Vines slowly grow and spread.=Лоза это блок, по которому можно карабкаться, он может быть помещён по сторонам твёрдого кубического блока. +Vines are climbable blocks which can be placed on the sides of solid full-cube blocks. Vines slowly grow and spread.=Лоза это блок, по которому можно карабкаться, он может быть помещён по сторонам твёрдого блока. Void=Пустота Water=Вода Water Source=Источник воды Water is abundant in oceans and also appears in a few springs in the ground. You can swim easily in water, but you need to catch your breath from time to time.=Вода изобилует в океанах и также встречается в виде ключей под землёй. -When placed on soil (such as dirt) and exposed to light, a birch sapling will grow into a birch after some time.=После высадки на почву (например, грязь) при наличии света саженец берёзы вырастет в берёзу через некоторое время. -When placed on soil (such as dirt) and exposed to light, a jungle sapling will grow into a jungle tree after some time. When there are 4 jungle saplings in a 2×2 square, they will grow to a huge jungle tree.=После высадки на почву (например, грязь) при наличии света саженец дерева джунглей вырастет в дерево джунглей через некоторое время. Если высадить 4 саженца по схеме 2*2, вырастет огромное дерево джунглей. -When placed on soil (such as dirt) and exposed to light, a spruce sapling will grow into a spruce after some time. When there are 4 spruce saplings in a 2×2 square, they will grow to a huge spruce.=После высадки на почву (например, грязь) при наличии света саженец ели вырастет в ель через некоторое время. Если высадить 4 саженца по схеме 2*2, вырастет огромная ель. -When placed on soil (such as dirt) and exposed to light, an acacia sapling will grow into an acacia after some time.=После высадки на почву (например, грязь) при наличии света саженец акации вырастет в акацию через некоторое время. -When placed on soil (such as dirt) and exposed to light, an oak sapling will grow into an oak after some time.=После высадки на почву (например, грязь) при наличии света саженец дуба вырастет в дуб через некоторое время. +When placed on soil (such as dirt) and exposed to light, a birch sapling will grow into a birch after some time.=После посадки на почву (например, на землю) при наличии света саженец берёзы вырастет в берёзу через некоторое время. +When placed on soil (such as dirt) and exposed to light, a jungle sapling will grow into a jungle tree after some time. When there are 4 jungle saplings in a 2×2 square, they will grow to a huge jungle tree.=После посадки на почву (например, на землю) при наличии света саженец тропического дерева вырастет в тропическое дерево через некоторое время. Если высадить 4 саженца по схеме 2×2, вырастет огромное тропическое дерево. +When placed on soil (such as dirt) and exposed to light, a spruce sapling will grow into a spruce after some time. When there are 4 spruce saplings in a 2×2 square, they will grow to a huge spruce.=После посадки на почву (например, на землю) при наличии света саженец ели вырастет в ель через некоторое время. Если высадить 4 саженца по схеме 2×2, вырастет огромная ель. +When placed on soil (such as dirt) and exposed to light, an acacia sapling will grow into an acacia after some time.=После посадки на почву (например, на землю) при наличии света саженец акации вырастет в акацию через некоторое время. +When placed on soil (such as dirt) and exposed to light, an oak sapling will grow into an oak after some time.=После посадки на почву (например, на землю) при наличии света саженец дуба вырастет в дуб через некоторое время. When you hold a barrier in hand, you reveal all placed barriers in a short distance around you.=Когда вы держите барьер в руке, вы видите все барьеры, размещённые вокруг вас вблизи. -White Stained Glass=Белое витражное стекло -Yellow Stained Glass=Жёлтое витражное стекло -“Coal” refers to coal lumps obtained by digging coal ore which can be found underground. Coal is your standard furnace fuel, but it can also be used to make torches, coal blocks and a few other things.=“Уголь” относится к угольным кускам, добываемым из угольной руды, которую можно встретить под землёй. Уголь это стандартное печное топливо для вас, но он также нужен, чтобы сделать факелы, угольные блоки и несколько других вещей. +White Stained Glass=Белое стекло +Yellow Stained Glass=Жёлтое стекло +“Coal” refers to coal lumps obtained by digging coal ore which can be found underground. Coal is your standard furnace fuel, but it can also be used to make torches, coal blocks and a few other things.=“Уголь” относится к угольным кускам, добываемым из угольной руды, которую можно встретить под землёй. Уголь это стандартное печное топливо, но он также нужен, чтобы сделать факелы, угольные блоки и некоторые другие предметы. Water interacts with lava in various ways:=Вода взаимодействует с лавой по-разному: -• When water is directly above or horizontally next to a lava source, the lava turns into obsidian.=• Если вода прямо над источником лавы или соседствует с ним в горизонтальном направлении, лава превращается в обсидиан. -• When flowing water touches flowing lava either from above or horizontally, the lava turns into cobblestone.=• Если текущая вода прикасается к текущей лаве сверху или сбоку, лава превращается в булыжник. -• When water is directly below lava, the water turns into stone.=• Если вода попадает прямо под лаву, эта вода превращается в камень. +• When water is directly above or horizontally next to a lava source, the lava turns into obsidian.=• Если вода прямо над источником лавы или соседствует с ним в горизонтальном направлении, источник лавы превращается в обсидиан. +• When flowing water touches flowing lava either from above or horizontally, the lava turns into cobblestone.=• Если текущая вода прикасается к текущей лаве сверху или сбоку, текущая лава превращается в булыжник. +• When water is directly below lava, the water turns into stone.=• Если вода попадает прямо под лаву, этот источник воды превращается в камень. Lava interacts with water various ways:=Лава взаимодействует с водой по-разному: -• When a lava source is directly below or horizontally next to water, the lava turns into obsidian.=• Когда источник лавы прямо под водой, либо вода сбоку от него, лава превращается в обсидиан. -• When lava is directly above water, the water turns into stone.=• Когда лава прямо над водой, вода превращается в камень. -Stained Glass=Витражное стекло -Granite is an igneous rock.=Гранит это камень вулканической природы. -Top snow can be stacked and has one of 8 different height levels. At levels 2-8, top snow is collidable. Top snow drops 2-9 snowballs, depending on its height.=Наст может стыковаться и иметь один из 8 разных уровней высоты. При уровнях 2-8 в снег нельзя провалиться. Верхний снег превращается в 2-9 снежков, в зависимости от его высоты. -This block can only be placed on full solid blocks and on another top snow (which increases its height).=Этот блок можно поместить только на целый твёрдый блок либо на другой наст (что увеличит его высоту). +• When a lava source is directly below or horizontally next to water, the lava turns into obsidian.=• Когда источник лавы прямо под водой, либо вода сбоку от него, источник лавы превращается в обсидиан. +• When lava is directly above water, the water turns into stone.=• Когда лава прямо над водой, источник воды превращается в камень. +Stained Glass=Окрашенное стекло +Granite is an igneous rock.=Гранит это камень вулканической породы. +Top snow can be stacked and has one of 8 different height levels. At levels 2-8, top snow is collidable. Top snow drops 2-9 snowballs, depending on its height.=Слои снега могут наслаиваться друг на друга и иметь один из 8 разных уровней высоты. При уровнях 2-8 слой снега становится непроходиымы. Слой снега дропает 2-9 снежков, в зависимости от его высоты. +This block can only be placed on full solid blocks and on another top snow (which increases its height).=Этот блок можно поместить только на целый твёрдый блок либо на другой слой (что увеличит его высоту). Needs soil and water to grow=Нуждается в почве и воде, чтобы расти Needs soil and light to grow=Нуждается в почве и свете, чтобы расти Grows on sand=Растёт на песке -Contact damage: @1 per half second=Повреждение при контакте: @1 за полсекунды +Contact damage: @1 per half second=Урон при контакте: @1 HP/0.5 с Slows down movement=Замедляет перемещение -2×2 saplings required=Высаживается по схеме 2*2 -2×2 saplings @= large tree=2*2 саженца @= большое дерево -Grows on sand or dirt next to water=Растёт на песке или грязи рядом с водой -Stackable=Можно состыковать +2×2 saplings required=Высаживается по схеме 2×2 +2×2 saplings @= large tree=2×2 саженца @= большое дерево +Grows on sand or dirt next to water=Растёт на песке или земле рядом с водой +Stackable=Наслаивается +Crying Obsidian=Плачущий обсидиан +Crying obsidian is a luminous obsidian that can generate as part of ruined portals.=Плачущий обсидиан это светящийся обсидиан который может сгенерироваться как часть разрушенных порталов. +Enchanted Golden Apple=Зачарованное золотое яблоко +Light=Свет +Lights are invisible blocks. They are used to light up adventure maps and the like.=Свет это невидимые блоки. Используются для подсветки приключенческих карт и всё в этом роде. +When you hold a light in hand, you reveal all placed lights in a short distance around you.=Когда вы держите свет в руке, вы видите все расставленные блоки света на небольшой дистанции от вас. diff --git a/mods/ITEMS/mcl_crafting_table/locale/mcl_crafting_table.ru.tr b/mods/ITEMS/mcl_crafting_table/locale/mcl_crafting_table.ru.tr index 1e4eb560f..c84437a3c 100644 --- a/mods/ITEMS/mcl_crafting_table/locale/mcl_crafting_table.ru.tr +++ b/mods/ITEMS/mcl_crafting_table/locale/mcl_crafting_table.ru.tr @@ -1,8 +1,8 @@ # textdomain: mcl_crafting_table Crafting Table=Верстак -A crafting table is a block which grants you access to a 3×3 crafting grid which allows you to perform advanced crafts.=Верстак это блок, позволяющий крафтить в решётке 3×3, что позволяет выполнять продвинутый крафтинг. -Rightclick the crafting table to access the 3×3 crafting grid.=Кликните правой для получения доступа к решётке крафтинга 3×3. +A crafting table is a block which grants you access to a 3×3 crafting grid which allows you to perform advanced crafts.=Верстак это блок с сеткой крафта 3×3, что позволяет использовать продвинутые рецепты. +Rightclick the crafting table to access the 3×3 crafting grid.=Кликните правой кнопкой мыши для получения доступа к сетке крафта 3×3. Recipe book=Книга рецептов -Crafting=Крафтинг +Crafting=Крафт Inventory=Инвентарь -3×3 crafting grid=Решётка крафтинга 3×3 +3×3 crafting grid=Сетка крафта 3×3 \ No newline at end of file diff --git a/mods/ITEMS/mcl_crimson/locale/mcl_crimson.ru.tr b/mods/ITEMS/mcl_crimson/locale/mcl_crimson.ru.tr new file mode 100644 index 000000000..4f7690442 --- /dev/null +++ b/mods/ITEMS/mcl_crimson/locale/mcl_crimson.ru.tr @@ -0,0 +1,51 @@ +# textdomain: mcl_crimson + +Warped Fungus=Искажённый грибок +Warped fungus is a mushroom found in the nether's warped forest.=Искажённый грибок можно найти в искажённых лесах Незера +Twisting Vines=Извилистые лианы +Weeping Vines=Плакучие лианы +Nether Sprouts=Адские ростки +Warped Roots=Искажённые корни +Warped Wart Block=Искажённый блок адского нароста +Shroomlight=Грибосвет +Warped Hyphae=Искажённая ножка +The stem of a warped hyphae=Ножка искажённого гриба +Warped Hyphae Bark=Искажённые гифы +This is a decorative block surrounded by the bark of an hyphae.=Декоративный блок окруженный корой гифов. +Stripped Warped Hyphae=Обтёсанная искажённая ножка +The stripped hyphae of a warped fungus=Обтёсанная искажённая ножка +Stripped Warped Hyphae Bark=Обтёсанные гифы +The stripped hyphae bark of a warped fungus=Обтёсанные гифы искажённого гриба +Warped Nylium=Искажённый нилий +Warped Checknode - only to check!=Искажённый тестовый блок +Warped Hyphae Wood=Искажённые доски +Warped Stair=Искажённые ступени +Warped Slab=Искажённая плита +Crimson Fungus=Багровый грибок +Crimson fungus is a mushroom found in the nether's crimson forest.=Багровый грибок можно найти в багровых лесах Незера +Crimson Roots=Багровые корни +Crimson Hyphae=Багровая ножка +The stem of a crimson hyphae=Ножка багрового гриба +Crimson Hyphae Bark=Багровые гифы +Stripped Crimson Hyphae=Обтёсанная багровая ножка +The stripped stem of a crimson hyphae=Обтёсанная багровая ножка +Stripped Crimson Hyphae Bark=Обтёсанные багровые гифы +The stripped wood of a crimson hyphae=Обтёсанные багровые гифы +Crimson Hyphae Wood=Багровые доски +Crimson Stair=Багровые ступени +Crimson Slab=Багровая плита +Double Crimson Slab=Двойная багровая плита +Crimson Nylium=Багровый нилий +Crimson Door=Багровая дверь +Crimson Trapdoor=Багровый люк +Crimson Fence=Багровый забор +Crimson Fence Gate=Багровая калитка +Crimson Checknode - only to check!=Багровый тестовый блок +Warped Door=Искажённая дверь +Warped Trapdoor=Искажённый люк +Warped Fence=Искажённый забор +Warped Fence Gate=Искажённая калитка +Wooden doors are 2-block high barriers which can be opened or closed by hand and by a redstone signal.=Деревянные двери это преграды высотой в 2 блока, которые можно открывать и закрывать вручную и по сигналу редстоуна. +To open or close a wooden door, rightclick it or supply its lower half with a redstone signal.=Чтобы открыть или закрыть деревянную дверь, кликните правой либо подайте к её нижней части сигнал редстоуна. +Wooden trapdoors are horizontal barriers which can be opened and closed by hand or a redstone signal. They occupy the upper or lower part of a block, depending on how they have been placed. When open, they can be climbed like a ladder.=Деревянные люки это горизонтальные преграды, которые можно открывать и закрывать вручную и по сигналу редстоуна. Они занимают верхнюю или нижнюю часть блока, в зависимости от того, как они были установлены. В открытом состоянии по ним можно карабкаться, как по лестницам. +To open or close the trapdoor, rightclick it or send a redstone signal to it.=Чтобы открыть или закрыть деревянный люк, кликните по нему правой кнопкой либо подайте на него сигнал редстоуна. diff --git a/mods/ITEMS/mcl_deepslate/locale/mcl_deepslate.ru.tr b/mods/ITEMS/mcl_deepslate/locale/mcl_deepslate.ru.tr new file mode 100644 index 000000000..ee79dc298 --- /dev/null +++ b/mods/ITEMS/mcl_deepslate/locale/mcl_deepslate.ru.tr @@ -0,0 +1,53 @@ +# textdomain: mcl_deepslate +An infested block is a block from which a silverfish will pop out when it is broken. It looks identical to its normal counterpart.=Заражённый блок это блок, после добычи которого из него появляется чешуйница. Блок выглядит идентично своему нормальному варианту. +Chiseled deepslate is the chiseled version of deepslate.=Резной сланец это резной вариант глубинного сланца. +Chiseled Deepslate=Резной сланец +Cobbled deepslate is a stone variant that functions similar to cobblestone or blackstone.=Дроблёный сланец это вариант камня, схожий на булыжник или чернокамень. +Cobbled Deepslate Slab=Плита из дроблёного сланца +Cobbled Deepslate Stairs=Ступени из дроблёного сланца +Cobbled Deepslate Wall=Стена из дроблёного сланца +Cobbled Deepslate=Дроблёный сланец +Cracked Deepslate Bricks=Потрескавшиеся сланцевые кирпичи +Cracked Deepslate Tiles=Потрескавшаяся сланцевая плитка +Deepslate bricks are the brick version of deepslate.=Сланцевые кирпичи это кирпичный вариант глубинного сланца. +Deepslate Bricks Slab=Плита из сланцевых кирпичей +Deepslate Bricks Stairs=Ступени из сланцевых кирпичей +Deepslate Bricks Wall=Стена из сланцевых кирпичей +Deepslate Bricks=Сланцевые кирпичи +Deepslate coal ore is a variant of coal ore that can generate in deepslate and tuff blobs.=Глубинная угольная руда это вариант угольной руды, генерирующийся в глубинном сланце. +Deepslate Coal Ore=Глубинная угольная руда +Deepslate copper ore is a variant of copper ore that can generate in deepslate and tuff blobs.=Глубинная медная руда это вариант медной руды, генерирующийся в глубинном сланце. +Deepslate Copper Ore=Глубинная медная руда +Deepslate diamond ore is a variant of diamond ore that can generate in deepslate and tuff blobs.=Глубинная алмазная руда это вариант алмазной руды, генерирующийся в глубинном сланце. +Deepslate Diamond Ore=Глубинная алмазная руда +Deepslate emerald ore is a variant of emerald ore that can generate in deepslate and tuff blobs.=Глубинная изумрудная руда это вариант изумрудной руды, генерирующийся в глубинном сланце. +Deepslate Emerald Ore=Глубинная изумрудная руда +Deepslate gold ore is a variant of gold ore that can generate in deepslate and tuff blobs.=Глубинная золотая руда это вариант золотой руды, генерирующийся в глубинном сланце. +Deepslate Gold Ore=Глубинная золотая руда +Deepslate iron ore is a variant of iron ore that can generate in deepslate and tuff blobs.=Глубинная железная руда это вариант железной руды, генерирующийся в глубинном сланце. +Deepslate Iron Ore=Глубинная железная руда +Deepslate is a stone type found deep underground in the Overworld that functions similar to regular stone but is harder than the stone.=Глубинный сланец это камень, который можно найти в глубине Верхнего мира. Схож с обычным камнем, но сланец твёрже. +Deepslate Lapis Lazuli Ore=Глубинная лазуритовая руда +Deepslate lapis lazuli ore is a variant of lapis lazuli ore that can generate in deepslate and tuff blobs.=Глубинная лазуритовая руда это вариант лазуритовой руды, генерирующийся в глубинном сланце. +Deepslate redstone ore is a variant of redstone ore that can generate in deepslate and tuff blobs.=Глубинная редстоуновая руда это вариант редстоуновой руды, генерирующийся в глубинном сланце. +Deepslate Redstone Ore=Глубинная редстоуновая руда +Deepslate tiles are a decorative variant of deepslate.=Сланцевая плитка это декоративный вариант глубинного сланца. +Deepslate Tiles Slab=Плита из сланцевой плитки +Deepslate Tiles Stairs=Ступени из сланцевой плитки +Deepslate Tiles Wall=Стена из сланцевой плитки +Deepslate Tiles=Сланцевая плитка +Deepslate=Глубинный сланец +Double Cobbled Deepslate Slab=Двойная плита из дроблёного сланца +Double Deepslate Bricks Slab=Двойная плита из сланцевых кирпичей +Double Deepslate Tiles Slab=Двойная плита из сланцевой плитки +Double Polished Deepslate Slab=Двойная плита из полированного сланца +Hides a silverfish=Прячет в себе чешуйницу +Infested Deepslate=Заражённый глубинный сланец +Lit Deepslate Redstone Ore=Светящаяся глубинная редстоуновая руда +Polished deepslate is the stone-like polished version of deepslate.=Полированный сланец это гладкая версия глубинного сланца. +Polished Deepslate Slab=Плита из полированного сланца +Polished Deepslate Stairs=Ступени из полированного сланца +Polished Deepslate Wall=Стена из полированного сланца +Polished Deepslate=Полированный сланец +Tuff=Туф +Tuff is an ornamental rock formed from volcanic ash, occurring in underground blobs below Y@=16.=Туф орнаментальный камень сформированный из вулканического пепла, появляется в виде подземных скоплений ниже Y@=16. diff --git a/mods/ITEMS/mcl_doors/locale/mcl_doors.ru.tr b/mods/ITEMS/mcl_doors/locale/mcl_doors.ru.tr index 1515a2cd2..525bd075f 100644 --- a/mods/ITEMS/mcl_doors/locale/mcl_doors.ru.tr +++ b/mods/ITEMS/mcl_doors/locale/mcl_doors.ru.tr @@ -1,24 +1,26 @@ # textdomain: mcl_doors -Wooden doors are 2-block high barriers which can be opened or closed by hand and by a redstone signal.=Деревянные двери это сдвоенные блочные преграды, которые можно открывать и закрывать вручную и по сигналу редстоуна. +Wooden doors are 2-block high barriers which can be opened or closed by hand and by a redstone signal.=Деревянные двери это преграды высотой в 2 блока, которые можно открывать и закрывать вручную и по сигналу редстоуна. To open or close a wooden door, rightclick it or supply its lower half with a redstone signal.=Чтобы открыть или закрыть деревянную дверь, кликните правой либо подайте к её нижней части сигнал редстоуна. Oak Door=Дубовая дверь -Acacia Door=Дверь из акации +Acacia Door=Акациевая дверь Birch Door=Берёзовая дверь Dark Oak Door=Дверь из тёмного дуба -Jungle Door=Дверь из дерева джунглей +Jungle Door=Дверь из тропического дерева Spruce Door=Еловая дверь Iron Door=Железная дверь -Iron doors are 2-block high barriers which can only be opened or closed by a redstone signal, but not by hand.=Железные двери это сдвоенные блочные преграды, которые можно открывать и закрывать только по сигналу редстоуна и нельзя вручную. +Iron doors are 2-block high barriers which can only be opened or closed by a redstone signal, but not by hand.=Железные двери это преграды высотой в 2 блока, которые можно открывать и закрывать только по сигналу редстоуна, но не вручную. To open or close an iron door, supply its lower half with a redstone signal.=Чтобы открыть или закрыть железную дверь, подайте на её нижнюю часть сигнал редстоуна. Oak Trapdoor=Дубовый люк -Acacia Trapdoor=Люк из акации +Acacia Trapdoor=Акациевый люк Birch Trapdoor=Берёзовый люк Spruce Trapdoor=Еловый люк Dark Oak Trapdoor=Люк из тёмного дуба -Jungle Trapdoor=Люк из дерева джунглей +Jungle Trapdoor=Люк из тропического дерева Wooden trapdoors are horizontal barriers which can be opened and closed by hand or a redstone signal. They occupy the upper or lower part of a block, depending on how they have been placed. When open, they can be climbed like a ladder.=Деревянные люки это горизонтальные преграды, которые можно открывать и закрывать вручную и по сигналу редстоуна. Они занимают верхнюю или нижнюю часть блока, в зависимости от того, как они были установлены. В открытом состоянии по ним можно карабкаться, как по лестницам. To open or close the trapdoor, rightclick it or send a redstone signal to it.=Чтобы открыть или закрыть деревянные люк, кликните по нему правой клавишей либо подайте на него сигнал редстоуна. Iron Trapdoor=Железный люк -Iron trapdoors are horizontal barriers which can only be opened and closed by redstone signals, but not by hand. They occupy the upper or lower part of a block, depending on how they have been placed. When open, they can be climbed like a ladder.=Железные люки это горизонтальные преграды, которые можно открывать и закрывать только по сигналу редстоуна и нельзя вручную. Они занимают верхнюю или нижнюю часть блока, в зависимости от того, как они были установлены. В открытом состоянии по ним можно карабкаться, как по лестницам. -Openable by players and redstone power=Открывается игроками и действием редстоуна -Openable by redstone power=Открывается действием редстоуна +Iron trapdoors are horizontal barriers which can only be opened and closed by redstone signals, but not by hand. They occupy the upper or lower part of a block, depending on how they have been placed. When open, they can be climbed like a ladder.=Железные люки это горизонтальные преграды, которые можно открывать и закрывать только по сигналу редстоуна, но не вручную. Они занимают верхнюю или нижнюю часть блока, в зависимости от того, как они были установлены. В открытом состоянии по ним можно карабкаться, как по лестницам. +Openable by players and redstone power=Открывается игроками и сигналом редстоуна +Openable by redstone power=Открывается сигналом редстоуна +This door is a 2-block high barrier which can only be opened by redstone power, not by hand.=Эта дверь - преграда высотой в 2 блока, которую можно открывать и закрывать по сигналу редстоуна, но не вручную. +This door is a 2-block high barrier which can be opened or closed by hand or by redstone power.=Эта дверь - преграда высотой в 2 блока, которую можно открывать и закрывать вручную и по сигналу редстоуна. diff --git a/mods/ITEMS/mcl_doors/locale/template.txt b/mods/ITEMS/mcl_doors/locale/template.txt index d8c7c8609..2d21c72ac 100644 --- a/mods/ITEMS/mcl_doors/locale/template.txt +++ b/mods/ITEMS/mcl_doors/locale/template.txt @@ -22,3 +22,5 @@ Iron Trapdoor= Iron trapdoors are horizontal barriers which can only be opened and closed by redstone signals, but not by hand. They occupy the upper or lower part of a block, depending on how they have been placed. When open, they can be climbed like a ladder.= Openable by players and redstone power= Openable by redstone power= +This door is a 2-block high barrier which can only be opened by redstone power, not by hand.= +This door is a 2-block high barrier which can be opened or closed by hand or by redstone power.= diff --git a/mods/ITEMS/mcl_dye/locale/mcl_dye.ru.tr b/mods/ITEMS/mcl_dye/locale/mcl_dye.ru.tr index fc45a4bb4..d595bb6a1 100644 --- a/mods/ITEMS/mcl_dye/locale/mcl_dye.ru.tr +++ b/mods/ITEMS/mcl_dye/locale/mcl_dye.ru.tr @@ -3,25 +3,25 @@ White Dye=Белый краситель Light Grey Dye=Светло-серый краситель Grey Dye=Серый краситель Black Dye=Чёрный краситель -Purple Dye=Пурпурный краситель -Blue Dye=голубой краситель -Light Blue Dye=Светло-голубой краситель -Cyan Dye=Голубой краситель +Purple Dye=Фиолетовый краситель +Blue Dye=Синий краситель +Light Blue Dye=Голубой краситель +Cyan Dye=Бирюзовый краситель Green Dye=Зеленый краситель -Lime Dye=Зелёный лаймовый краситель +Lime Dye=Лаймовый краситель Yellow Dye=Желтый краситель Brown Dye=Коричневый краситель Orange Dye=Оранжевый краситель Red Dye=Красный краситель -Magenta Dye=Фиолетовый краситель +Magenta Dye=Сиреневый краситель Pink Dye=Розовый краситель -This item is a dye which is used for dyeing and crafting.=Это краситель, которые используется, чтобы окрашивать и крафтить. -Rightclick on a sheep to dye its wool. Other things are dyed by crafting.=Кликните правой по овце, чтобы окрасить её шерсть. Остальные вещи окрашиваются путём крафтинга. +This item is a dye which is used for dyeing and crafting.=Это краситель, который используется для окрашивания и крафта. +Rightclick on a sheep to dye its wool. Other things are dyed by crafting.=Кликните правой по овце, чтобы окрасить её шерсть. Остальные вещи окрашиваются путём крафта. Bone Meal=Костная мука Bone meal is a white dye and also useful as a fertilizer to speed up the growth of many plants.=Костная мука является белым красителем. Она также полезна в качестве удобрения, чтобы увеличить скорость роста многих растений. Rightclick a sheep to turn its wool white. Rightclick a plant to speed up its growth. Note that not all plants can be fertilized like this. When you rightclick a grass block, tall grass and flowers will grow all over the place.=Кликните правой по овце, чтобы сделать её шерсть белой. Кликните правой по растению, чтобы ускорить его рост. Имейте в виду, что не все растения можно удобрять таким способом. Если вы кликнете по травяному блоку, то на этом месте вырастет высокая трава и цветы. Cocoa beans are a brown dye and can be used to plant cocoas.=Какао-бобы являются коричневым красителем. Их также можно использовать, чтобы посадить какао. -Rightclick a sheep to turn its wool brown. Rightclick on the side of a jungle tree trunk (Jungle Wood) to plant a young cocoa.=Кликните правой по овце, чтобы сделать её шерсть коричневой. Кликните правой по боковой части ствола дерева джунглей, чтобы посадить молодое какао. +Rightclick a sheep to turn its wool brown. Rightclick on the side of a jungle tree trunk (Jungle Wood) to plant a young cocoa.=Кликните правой по овце, чтобы сделать её шерсть коричневой. Кликните правой по боковой части ствола тропического дерева, чтобы посадить молодое какао. Cocoa Beans=Какао-бобы -Grows at the side of jungle trees=Растут на стволах деревьев джунглей +Grows at the side of jungle trees=Растут на стволах тропических деревьев Speeds up plant growth=Ускоряет рост растений diff --git a/mods/ITEMS/mcl_enchanting/locale/mcl_enchanting.ru.tr b/mods/ITEMS/mcl_enchanting/locale/mcl_enchanting.ru.tr index 6cd1e1db6..66d76b578 100644 --- a/mods/ITEMS/mcl_enchanting/locale/mcl_enchanting.ru.tr +++ b/mods/ITEMS/mcl_enchanting/locale/mcl_enchanting.ru.tr @@ -1,100 +1,144 @@ # textdomain: mcl_enchanting -Aqua Affinity=Родство с водой -Increases underwater mining speed.=Увеличивает скорость добычи под водой. -Bane of Arthropods=Бич членистоногих -Increases damage and applies Slowness IV to arthropod mobs (spiders, cave spiders, silverfish and endermites).=Увеличивает урон и применяет Замедление IV к насекомым и членистоногим (паукам, пещерным паукам, чешуйницам и чешуйницам края). -Blast Protection=Взрывоустойчивость -Reduces explosion damage and knockback.=Уменьшает урон и отдачу от взрывов. -Channeling=Громовержец -Channels a bolt of lightning toward a target. Works only during thunderstorms and if target is unobstructed with opaque blocks.=Бьёт молнией в цель. Работает только во время грозы, когда цель не защищена плотными блоками. -Curse of Binding=Проклятие несъёмности -Item cannot be removed from armor slots except due to death, breaking or in Creative Mode.=Предмет не может быть изъят из слота доспехов, кроме как в результате смерти, разрушения или в креативном режиме. -Curse of Vanishing=Проклятье утраты -Item destroyed on death.=Предмет уничтожается при смерти. -Depth Strider=Покоритель глубин -Increases underwater movement speed.=Увеличивает скорость передвижения под водой. -Efficiency=Эффективность -Increases mining speed.=Увеличивает скорость добычи. -Feather Falling=Невесомость -Reduces fall damage.=Снижает урон от падения. -Fire Aspect=Заговор огня -Sets target on fire.=Поджигает цель. -Fire Protection=Защита от огня -Reduces fire damage.=Уменьшает урон от огня. -Flame=Пламя -Arrows set target on fire.=Стрелы поджигают цель. -Fortune=Удача -Increases certain block drops.=Увеличивает выпадение ресурсов из блоков. -Frost Walker=Ледоход -Turns water beneath the player into frosted ice and prevents the damage from magma blocks.=Превращает воду под игроком в замороженный лёд и предотвращает урон от магмовых блоков. -Impaling=Пронзатель -Trident deals additional damage to ocean mobs.=Трезубец наносит дополнительный урон океаническим мобам. -Infinity=Бесконечность -Shooting consumes no regular arrows.=При стрельбе не расходуются стрелы. -Knockback=Отскок -Increases knockback.=Увеличивает отдачу. -Looting=Добыча -Increases mob loot.=Увеличивает добычу от мобов. -Loyalty=Верность -Trident returns after being thrown. Higher levels reduce return time.=Возвращает трезубец после броска. Более высокие уровни сокращают время возврата. -Luck of the Sea=Везучий рыбак -Increases rate of good loot (enchanting books, etc.)=Увеличивает шанс поймать сокровище (зачарованные книги и т.п.) -Lure=Приманка -Decreases time until rod catches something.=Уменьшает время ожидания клёва. -Mending=Починка -Repair the item while gaining XP orbs.=Предмет чинится при сборе жемчужин опыта. -Multishot=Залп -Shoot 3 arrows at the cost of one.=Выстреливают три стрелы по стоимости одной. -Piercing=Бронебойность + + +### enchantments.lua ### + Arrows passes through multiple objects.=Стрела пробивает насквозь несколько объектов. -Power=Сила -Increases arrow damage.=Увеличивает урон от стрел. -Projectile Protection=Защита от снарядов -Reduces projectile damage.=Уменьшает урон от снарядов. -Protection=Защита -Reduces most types of damage by 4% for each level.=Уменьшает большинство повреждений на 4% за каждый уровень. -Punch=Отбрасывание -Increases arrow knockback.=Увеличивает отбрасывание от стрелы. -Quick Charge=Быстрая перезарядка +Arrows set target on fire.=Стрелы поджигают цель. +Bane of Arthropods=Бич членистоногих +Channeling=Громовержец + +Channels a bolt of lightning toward a target. Works only during thunderstorms and if target is unobstructed with opaque blocks.=Бьёт молнией в цель. Работает только во время грозы, когда цель не защищена плотными блоками. + +Curse of Vanishing=Проклятье утраты Decreases crossbow charging time.=Уменьшает время заряда снаряда. -Respiration=Подводное дыхание +Decreases time until rod catches something.=Уменьшает время ожидания клёва. +Depth Strider=Покоритель глубин +Efficiency=Эффективность Extends underwater breathing time.=Увеличивает время дыхания под водой. -Riptide=Тягун -Trident launches player with itself when thrown. Works only in water or rain.=Трезубец тянет игрока за собой. Работает только в воде или под дождём. -Sharpness=Острота +Fire Aspect=Заговор огня +Flame=Горящая стрела +Fortune=Удача +Frost Walker=Ледоход +Impaling=Пронзатель +Increases arrow damage.=Увеличивает урон от стрел. +Increases arrow knockback.=Увеличивает отбрасывание от стрелы. +Increases certain block drops.=Даёт шанс выпадения большего количества ресурсов из блоков. + +Increases damage and applies Slowness IV to arthropod mobs (spiders, cave spiders, silverfish and endermites).=Увеличивает урон и применяет Замедление IV к насекомым и членистоногим (паукам, пещерным паукам, чешуйницам и чешуйницам Края). + +Increases damage to undead mobs.=Дополнительный урон нежити. Increases damage.=Увеличенный урон. -Silk Touch=Шёлковое касание -Mined blocks drop themselves.=Добываемый блок выпадает сам, даже если из него должно выпадать что-то другое. -Smite=Небесная кара -Increases damage to undead mobs.=Дополнительный урон мертвякам (зомби и т.п.). -Soul Speed=Скорость души -Increases walking speed on soul sand.=Увеличивает скорость ходьбы по песку душ. -Sweeping Edge=Разящий клинок -Increases sweeping attack damage.=Увеличивает урон по мобам, стоящих рядом с целью. -Thorns=Шипы -Reflects some of the damage taken when hit, at the cost of reducing durability with each proc.=Отражают некоторый урон, получаемый от ударов, за счёт снижения прочности с каждым разом. -Unbreaking=Нерушимость Increases item durability.=Увеличивает прочность предмета. +Increases knockback.=Увеличивает отдачу. +Increases mining speed.=Увеличивает скорость добычи. +Increases mob loot.=Увеличивает добычу от мобов. +Increases rate of good loot (enchanting books, etc.)=Увеличивает шанс поймать сокровище (зачарованные книги и т.п.) +Increases sweeping attack damage.=Увеличивает урон по мобам, стоящих рядом с целью. +Increases underwater movement speed.=Увеличивает скорость передвижения под водой. +Increases walking speed on soul sand.=Увеличивает скорость ходьбы по песку душ. +Infinity=Бесконечность +Item destroyed on death.=Предмет уничтожается при смерти. +Knockback=Отдача +Looting=Добыча +Loyalty=Верность +Luck of the Sea=Везучий рыбак +Lure=Приманка +Mending=Починка +Mined blocks drop themselves.=Добываемый блок выпадает сам, даже если из него должно выпадать что-то другое. +Multishot=Залп +Piercing=Бронебойность +Power=Сила +Punch=Отбрасывание +Quick Charge=Быстрая перезарядка +Repair the item while gaining XP orbs.=Предмет чинится при сборе сфер опыта. +Respiration=Подводное дыхание +Riptide=Тягун +Sets target on fire.=Поджигает цель. +Sharpness=Острота +Shoot 3 arrows at the cost of one.=Выстреливают три стрелы по стоимости одной. +Shooting consumes no regular arrows.=При стрельбе не расходуются обычные стрелы. +Silk Touch=Шёлковое касание +Smite=Небесная кара +Soul Speed=Скорость души +Sweeping Edge=Разящий клинок +Trident deals additional damage to ocean mobs.=Трезубец наносит дополнительный урон океаническим мобам. + +Trident launches player with itself when thrown. Works only in water or rain.=Трезубец тянет игрока за собой. Работает только в воде или под дождём. + +Trident returns after being thrown. Higher levels reduce return time.=Возвращает трезубец после броска. Более высокие уровни сокращают время возврата. + +Turns water beneath the player into frosted ice and prevents the damage from magma blocks.=Превращает воду под игроком в подмороженный лёд и предотвращает урон от магмовых блоков. + +Unbreaking=Прочность + +### engine.lua ### + +@1 Enchantment Levels=@1 уровень зачаровывания +@1 Lapis Lazuli=@1 лазурит(а) Inventory=Инвентарь -@1 Lapis Lazuli=@1 Ляпис-лазурь -@1 Enchantment Levels=@1 Уровень зачаровывания Level requirement: @1=Требуемый уровень: @1 -Enchant an item=Зачаровать предмет - []=<игрок> <зачарование> [<уровень>] -Usage: /enchant []=Использование: /enchant <игрок> <зачарование> [<уровень>] -Player '@1' cannot be found.=Не удалось найти игрока '@1'. -There is no such enchantment '@1'.=Нет такого зачаровывания: '@1'. -The target doesn't hold an item.=Цель не держит предмета. -The selected enchantment can't be added to the target item.=Выбранное зачарование не может быть добавлено к целевому предмету. + +### init.lua ### + '@1' is not a valid number='@1' не является допустимым числом -The number you have entered (@1) is too big, it must be at most @2.=Число, которое вы задали (@1), слишком велико, оно может быть максимум @2. -The number you have entered (@1) is too small, it must be at least @2.=Число, которое вы задали (@1), слишком мало, оно может быть минимум @2. -@1 can't be combined with @2.=@1 нельзя сочетать с @2. -Enchanting succeded.=Зачарование выполнено. -Forcefully enchant an item=Принудительно зачаровать предмет -Usage: /forceenchant []=Использование: /forceenchant <игрок> <зачарование> [<уровень>] -The target item is not enchantable.=Указана незачаровываемая цель. '@1' is not a valid number.='@1' не является допустимым числом. + []=<игрок> <зачарование> [<уровень>] +@1 can't be combined with @2.=@1 нельзя сочетать с @2. + +After finally selecting your enchantment; left-click on the selection, and you will see both the lapis lazuli and your experience levels consumed. And, an enchanted item left in its place.=Кликните на выбранное зачарование - ваш опыт и лазурит потратятся, и зачарованный предмет появится слева. + +After placing your items in the slots, the enchanting options will be shown. Hover over the options to read what is available to you.=Варианты зачарований будут показаны как только вы разместите предметы в слоты. Наведите, чтобы прочитать что вам доступно. + +Enchant=Зачаровать +Enchant an item=Зачаровать предмет Enchanted Book=Зачарованная книга Enchanting Table=Стол зачаровывания -Enchant=Зачарование + +Enchanting Tables will let you enchant armors, tools, weapons, and books with various abilities. But, at the cost of some experience, and lapis lazuli.=Стол зачаровывания позволяет зачаровывать броню, инструменты, оружие и книги разными способностями. Но ценой опыта и лазурита. + +Enchanting succeded.=Зачарование выполнено. +Forcefully enchant an item=Принудительно зачаровать предмет + +Place a tool, armor, weapon or book into the top left slot, and then place 1-3 Lapis Lazuli in the slot to the right.=Поместите инстумент, броню, оружие или книгу в верхний левый слот, затем поместите 1-3 лазурита в правый слот. + +Player '@1' cannot be found.=Не удалось найти игрока '@1'. +Rightclick the Enchanting Table to open the enchanting menu.=Правый клик по столу зачаровывания, чтобы открыть меню зачаровывания. +Spend experience, and lapis to enchant various items.=Зачаровывает предметы за опыт и лазурит + +The number you have entered (@1) is too big, it must be at most @2.=Число, которое вы задали (@1), слишком велико, оно должно быть максимум @2. + +The number you have entered (@1) is too small, it must be at least @2.=Число, которое вы задали (@1), слишком мало, оно должно быть минимум @2. + +The selected enchantment can't be added to the target item.=Выбранное зачарование не может быть добавлено к целевому предмету. +The target doesn't hold an item.=Цель не держит предмета. +The target item is not enchantable.=Целевой предмет нельзя зачаровать. +There is no such enchantment '@1'.=Нет такого зачарования: '@1'. + +These options are randomized, and dependent on experience level; but the enchantment strength can be increased.=Эти опции случайны и зависят от уровня опыта; но зачарование может быть усилено. + +To increase the enchantment strength, place bookshelves around the enchanting table. However, you will need to keep 1 air node between the table, & the bookshelves to empower the enchanting table.=Чтобы усилить зачарование, поставьте книжные полки вокруг стола зачаровывания. Но вам нужно сохранять 1 блок пустого пространства между столом и полками. + +Usage: /enchant []=Использование: /enchant <игрок> <зачарование> [<уровень>] +Usage: /forceenchant []=Использование: /forceenchant <игрок> <зачарование> [<уровень>] + + +##### not used anymore ##### + +# textdomain: mcl_enchanting +Aqua Affinity= +Increases underwater mining speed.= +Blast Protection= +Reduces explosion damage and knockback.= +Curse of Binding= +Item cannot be removed from armor slots except due to death, breaking or in Creative Mode.= +Feather Falling= +Reduces fall damage.= +Fire Protection= +Reduces fire damage.= +Projectile Protection= +Reduces projectile damage.= +Protection= +Reduces most types of damage by 4% for each level.= +Thorns= +Reflects some of the damage taken when hit, at the cost of reducing durability with each proc.= diff --git a/mods/ITEMS/mcl_end/locale/mcl_end.ru.tr b/mods/ITEMS/mcl_end/locale/mcl_end.ru.tr index 6ab7a3c67..0f259cdcf 100644 --- a/mods/ITEMS/mcl_end/locale/mcl_end.ru.tr +++ b/mods/ITEMS/mcl_end/locale/mcl_end.ru.tr @@ -1,33 +1,33 @@ # textdomain: mcl_end -End Stone=Камень Предела -End Stone Bricks=Кирпичи из камня Предела +End Stone=Камень Края +End Stone Bricks=Кирпичи из камня Края Purpur Block=Пурпурный блок Purpur Pillar=Пурпурная колонна -End Rod=Стержень Предела -End rods are decorative light sources.=Стержень Предела это декоративный светильник. -Dragon Egg=Драконье яйцо -A dragon egg is a decorative item which can be placed.=Драконье яйцо это декоративный предмет, который можно поставить. +End Rod=Стержень Края +End rods are decorative light sources.=Стержень Края это декоративный источник света. +Dragon Egg=Яйцо дракона +A dragon egg is a decorative item which can be placed.=Яйцо дракона это декоративный предмет, который можно поставить. Chorus Flower=Цветок коруса A chorus flower is the living part of a chorus plant. It can grow into a tall chorus plant, step by step. When it grows, it may die on old age eventually. It also dies when it is unable to grow.=Цветок коруса это живая часть растения коруса. Он может шаг за шагом вырасти в высокое растение коруса. Когда он растёт, то может иногда умирать от старости. Он также умирает, если не может расти. -Place it and wait for it to grow. It can only be placed on top of end stone, on top of a chorus plant stem, or at the side of exactly one chorus plant stem.=Установите его на место и ожидайте роста. Его можно помещать только на верхушку камня предела, а также верхнюю часть либо строго одну сторону стебля растения коруса. +Place it and wait for it to grow. It can only be placed on top of end stone, on top of a chorus plant stem, or at the side of exactly one chorus plant stem.=Установите его и ждите, пока он вырастет. Его можно помещать только на камень Края, а также на верхнюю часть стебля растения коруса. Dead Chorus Flower=Мёртвый цветок коруса -This is a part of a chorus plant. It doesn't grow. Chorus flowers die of old age or when they are unable to grow. A dead chorus flower can be harvested to obtain a fresh chorus flower which is able to grow again.=Это часть растения коруса. Она не растёт. Цветы коруса умирают от старости или когда не могут расти. Мёртвый цветок коруса можно собрать, чтобы получить свежий цветок коруса, который может вырасти вновь. +This is a part of a chorus plant. It doesn't grow. Chorus flowers die of old age or when they are unable to grow. A dead chorus flower can be harvested to obtain a fresh chorus flower which is able to grow again.=Это часть растения коруса. Он не растёт. Цветы коруса умирают от старости или когда не могут расти. Мёртвый цветок коруса можно собрать, чтобы получить свежий цветок коруса, который может вырасти вновь. Chorus Plant Stem=Стебель растения коруса -A chorus plant stem is the part of a chorus plant which holds the whole plant together. It needs end stone as its soil. Stems are grown from chorus flowers.=Стебель растения коруса это часть растения коруса, которая связывает всё растение вместе. Ему нужен камень предела как почва. Стебли растут из цветков коруса. +A chorus plant stem is the part of a chorus plant which holds the whole plant together. It needs end stone as its soil. Stems are grown from chorus flowers.=Стебель растения коруса это часть растения коруса, которая связывает всё растение вместе. Ему нужен камень Края как почва. Стебли растут из цветков коруса. Chorus Fruit=Фрукт коруса -A chorus fruit is an edible fruit from the chorus plant which is home to the End. Eating it teleports you to the top of a random solid block nearby, provided you won't end up inside a liquid, solid or harmful blocks. Teleportation might fail if there are very few or no places to teleport to.=Фрукт коруса это съедобный фрукт растения коруса, домом которого является Предел. Употребление его в пищу телепортирует вас к вершине случайного твёрдого блок поблизости. Вы не закончите жизнь внутри жидкого, твёрдого или опасного блока, но телепортация может потерпеть неудачу, если поблизости слишком мало подходящих мест или такие места отсутствуют. -Popped Chorus Fruit=Лопнувший фрукт коруса -Eye of Ender=Око Предела -This item is used to locate End portal shrines in the Overworld and to activate End portals.=Этот предмет используется для обнаружения храмов порталов в Верхнем Мире и активации порталов Предела. -Use the attack key to release the eye of ender. It will rise and fly in the horizontal direction of the closest end portal shrine. If you're very close, the eye of ender will take the direct path to the End portal shrine instead. After a few seconds, it stops. It may drop as an item, but there's a 20% chance it shatters.=Используйте клавишу [Атаковать], чтобы освободить око Предела. Оно поднимется и полетит в горизонтальном направлении к ближайшему храму портала. Если вы очень близко к храму портала Предела, то око Предела полетит к нему напрямую. Оно остановится через несколько секунд. Оно может превратиться обратно в предмет, но есть 20-процентная вероятность того, что оно разобьётся. -To activate an End portal, eyes of ender need to be placed into each block of an intact End portal frame.=Чтобы активировать портал Предела, нужно поместить по оку Предела на каждый блок целой рамки портала. -NOTE: The End dimension is currently incomplete and might change in future versions.=Предупреждение: Измерение Предела в настоящее время не завершено полностью и может измениться в будущих версиях. -The stem attaches itself to end stone and other chorus blocks.=Стебель присоединяется к камню Предела, а также к другим блокам коруса. -Grows on end stone=Растёт на камнях Предела +A chorus fruit is an edible fruit from the chorus plant which is home to the End. Eating it teleports you to the top of a random solid block nearby, provided you won't end up inside a liquid, solid or harmful blocks. Teleportation might fail if there are very few or no places to teleport to.=Фрукт коруса это съедобный фрукт растения коруса, домом которого является Край. Употребление его в пищу телепортирует вас к вершине случайного твёрдого блок поблизости. Вы не закончите жизнь внутри жидкого, твёрдого или опасного блока, но телепортация может потерпеть неудачу, если поблизости слишком мало подходящих мест или такие места отсутствуют. +Popped Chorus Fruit=Приготовленный плод коруса +Eye of Ender=Око Края +This item is used to locate End portal shrines in the Overworld and to activate End portals.=Этот предмет используется для обнаружения храмов с порталами в Верхнем Мире и для активации порталов Края. +Use the attack key to release the eye of ender. It will rise and fly in the horizontal direction of the closest end portal shrine. If you're very close, the eye of ender will take the direct path to the End portal shrine instead. After a few seconds, it stops. It may drop as an item, but there's a 20% chance it shatters.=Используйте клавишу [Атаковать], чтобы кинуть око Края. Оно поднимется и полетит в горизонтальном направлении к ближайшему храму с порталом. Если вы очень близко к храму портала Края, то око Края полетит к нему напрямую. Оно остановится через несколько секунд. Оно может превратиться обратно в предмет, но есть 20-процентная вероятность того, что око разобьётся. +To activate an End portal, eyes of ender need to be placed into each block of an intact End portal frame.=Чтобы активировать портал Края, нужно поместить по оку Края на каждый блок всей рамки портала. +NOTE: The End dimension is currently incomplete and might change in future versions.=Предупреждение: Измерение Края в настоящее время не завершено полностью и может измениться в будущих версиях. +The stem attaches itself to end stone and other chorus blocks.=Стебель присоединяется к камню Края, а также к другим блокам коруса. +Grows on end stone=Растёт на камне Края Randomly teleports you when eaten=Телепортирует случайным образом при употреблении в пищу -Guides the way to the mysterious End dimension=Показывает путь к загадочному измерению Предела -End Crystal=Кристалл Предела -End Crystals are explosive devices. They can be placed on Obsidian or Bedrock. Ignite them by a punch or a hit with an arrow. End Crystals can also be used the spawn the Ender Dragon by placing one at each side of the End Exit Portal.=Кристаллы Предела - это взрывные устройства. Их можно размещать на обсидиане или бедроке. Подрывайте их ударом или попаданием стрелы. Кристаллы Предела также можно использовать для порождения Дракона Предела, для этого их нужно поместить по одной штуке с каждой стороны выходного портала Предела. +Guides the way to the mysterious End dimension=Показывает путь к загадочному измерению Края +End Crystal=Кристалл Края +End Crystals are explosive devices. They can be placed on Obsidian or Bedrock. Ignite them by a punch or a hit with an arrow. End Crystals can also be used the spawn the Ender Dragon by placing one at each side of the End Exit Portal.=Кристаллы Края это взрывающиеся устройства. Их можно размещать на обсидиане или бедроке. Подрывайте их ударом или попаданием стрелы. Кристаллы Края также можно использовать для возрождения Дракона Края, для этого их нужно поместить по одной штуке с каждой стороны выходного портала Края. Explosion radius: @1=Радиус взрыва: @1 -Ignited by a punch or a hit with an arrow=Поджигается ударом или при попадании стрелы -Place the End Crystal on Obsidian or Bedrock, then punch it or hit it with an arrow to cause an huge and probably deadly explosion. To Spawn the Ender Dragon, place one at each side of the End Exit Portal.=Разместите кристалл Предела на обсидиане или бедроке и ударьте по нему или попадите в него стрелой, чтобы вызвать огромный и, вероятно, смертельный взрыв. Чтобы вызвать Дракона Предела, поместите по одной штуке с каждой стороны портала выходного портала Предела. +Ignited by a punch or a hit with an arrow=Взрывается от удара или при попадании стрелы +Place the End Crystal on Obsidian or Bedrock, then punch it or hit it with an arrow to cause an huge and probably deadly explosion. To Spawn the Ender Dragon, place one at each side of the End Exit Portal.=Разместите кристалл Края на обсидиане или бедроке и ударьте по нему или попадите в него стрелой, чтобы вызвать огромный и смертоносный взрыв. Чтобы привызвать Дракона Края, поместите по одной штуке с каждой стороны выходного портала Края. diff --git a/mods/ITEMS/mcl_farming/locale/mcl_farming.ru.tr b/mods/ITEMS/mcl_farming/locale/mcl_farming.ru.tr index f587fb943..467761f0e 100644 --- a/mods/ITEMS/mcl_farming/locale/mcl_farming.ru.tr +++ b/mods/ITEMS/mcl_farming/locale/mcl_farming.ru.tr @@ -1,99 +1,105 @@ # textdomain: mcl_farming Beetroot Seeds=Семена свёклы -Grows into a beetroot plant. Chickens like beetroot seeds.=Вырастают на свёкле. Куры обожают свекольные семена. -Place the beetroot seeds on farmland (which can be created with a hoe) to plant a beetroot plant. They grow in sunlight and grow faster on hydrated farmland. Rightclick an animal to feed it beetroot seeds.=Положите семена свёклы на грядку (которую можно создать при помощи мотыги), чтобы посадить свёклу. Они прорастают при солнечном свете и растут быстрее на увлажнённой почке. Кликните правой по животному, чтобы накормить его семенами свёклы. +Grows into a beetroot plant. Chickens like beetroot seeds.=Из них вырастает свёкла. Куры любят свекольные семена. +Place the beetroot seeds on farmland (which can be created with a hoe) to plant a beetroot plant. They grow in sunlight and grow faster on hydrated farmland. Rightclick an animal to feed it beetroot seeds.=Положите семена свёклы на грядку (которую можно создать при помощи мотыги), чтобы посадить свёклу. Семена растут при солнечном свете, их рост происходит быстрее на увлажнённой почве. Кликните правой по животному, чтобы покормить его семенами свёклы. Premature Beetroot Plant (Stage 1)=Рассада молодой свёклы (стадия 1) Beetroot plants are plants which grow on farmland under sunlight in 4 stages. On hydrated farmland, they grow a bit faster. They can be harvested at any time but will only yield a profit when mature.=Свёкла растёт в 4 стадии на грядках под действием солнечного света. На увлажнённой грядке процесс пойдёт чуть быстрее. Собирать урожай можно на любой стадии, но выгода будет только при сборе созревших экземпляров. Premature Beetroot Plant=Рассада молодой свёклы Premature Beetroot Plant (Stage 2)=Рассада молодой свёклы (стадия 2) Premature Beetroot Plant (Stage 3)=Рассада молодой свёклы (стадия 3) Mature Beetroot Plant=Созревшая свёкла -A mature beetroot plant is a farming plant which is ready to be harvested for a beetroot and some beetroot seeds. It won't grow any further.=Созревшая свёкла это культивируемое растение, с которого уже можно собирать урожай свёклы и некоторое количество свекольных семян. Дальше расти она уже не будет. +A mature beetroot plant is a farming plant which is ready to be harvested for a beetroot and some beetroot seeds. It won't grow any further.=Созревшая свёкла это культивируемое растение, с которого уже можно собирать урожай свёклы и несколько свекольных семян. Дальше расти она уже не будет. Beetroot=Свёкла Beetroots are both used as food item and a dye ingredient. Pigs like beetroots, too.=Свёкла это еда и ингредиент для красителя. Свёклу также очень любят свиньи. -Hold it in your hand and right-click to eat it. Rightclick an animal to feed it.=Чтобы съесть, кликните правой, держа её в руке. Или кликните правой по животному, чтобы покормить его. -Beetroot Soup=Борщ -Beetroot soup is a food item.=Борщ можно есть, он съедобен. +Hold it in your hand and right-click to eat it. Rightclick an animal to feed it.=Чтобы съесть свёклу, возьмите её в руки с кликните правой кнопкой мыши. Или кликните правой кнопкой мыши по животному, чтобы покормить его. +Beetroot Soup=Свекольный суп +Beetroot soup is a food item.=Свекольный суп можно съесть. Premature Carrot Plant=Рассада молодой моркови -Carrot plants are plants which grow on farmland under sunlight in 8 stages, but only 4 stages can be visually told apart. On hydrated farmland, they grow a bit faster. They can be harvested at any time but will only yield a profit when mature.=Морковь растёт в 8 стадий на грядках под действием солнечного света, но визуально различить можно только 4 стадии. На увлажнённой грядке рост идёт чуть быстрее. Собирать урожай можно на любой стадии, но выгода будет только при сборе созревших экземпляров. +Carrot plants are plants which grow on farmland under sunlight in 8 stages, but only 4 stages can be visually told apart. On hydrated farmland, they grow a bit faster. They can be harvested at any time but will only yield a profit when mature.=Морковь растёт в 8 стадий на грядках под действием солнечного света, но визуально различить можно только 4 стадии. На увлажнённой грядке рост идёт чуть быстрее. Собирать урожай можно на любой стадии, но выгода будет только при сборе созревшей моркови. Premature Carrot Plant (Stage @1)=Рассада молодой моркови (стадия @1) Mature Carrot Plant=Созревшая морковь Mature carrot plants are ready to be harvested for carrots. They won't grow any further.=Созревшая морковь готова к сбору. Дальше расти она уже не будет. Carrot=Морковь Carrots can be eaten and planted. Pigs and rabbits like carrots.=Морковь можно есть и садить. Свиньи и кролики очень любят морковь. -Hold it in your hand and rightclick to eat it. Place it on top of farmland to plant the carrot. It grows in sunlight and grows faster on hydrated farmland. Rightclick an animal to feed it.=Чтобы съесть, кликните правой, держа её в руке. Или поместите её на грядку, чтобы посадить морковь. Она растёт под действием солнечного света, на влажных грядках процесс идёт быстрее. Или кликните правой по животному, чтобы покормить его. +Hold it in your hand and rightclick to eat it. Place it on top of farmland to plant the carrot. It grows in sunlight and grows faster on hydrated farmland. Rightclick an animal to feed it.=Чтобы съесть морковь, возьмите её в руки с кликните правой кнопкой мыши. Или кликните правой кнопкой мыши по животному, чтобы покормить его. Морковь растёт под действием солнечного света, на влажных грядках процесс идёт быстрее. Golden Carrot=Золотая морковь -A golden carrot is a precious food item which can be eaten. It is really, really filling!=Золотая морковь это изысканный продуктовый предмет, которые можно есть. Она отлично, отлично утоляет голод! +A golden carrot is a precious food item which can be eaten. It is really, really filling!=Золотая морковь это ценный съедобный продукт. Она отлично утоляет голод! Hoes are essential tools for growing crops. They are used to create farmland in order to plant seeds on it. Hoes can also be used as very weak weapons in a pinch.=Мотыга это инструмент, необходимый для выращивания урожая. Она используется для создания грядок, на которые потом можно высадить семена. В случае необходимости мотыгу можно использовать и в качестве слабого оружия. -Use the hoe on a cultivatable block (by rightclicking it) to turn it into farmland. Dirt, grass blocks and grass paths are cultivatable blocks. Using a hoe on coarse dirt turns it into dirt.=Примените мотыгу к культивируемому блоку (кликнув правой по нему), чтобы превратить его в грядку. Грязь, травяные блоки и тропинки это культивируемые блоки. Разрыхлив мотыгой грубую грязь, вы получите из её обыкновенную грязь. +Use the hoe on a cultivatable block (by rightclicking it) to turn it into farmland. Dirt, grass blocks and grass paths are cultivatable blocks. Using a hoe on coarse dirt turns it into dirt.=Примените мотыгу к культивируемому блоку (кликнув правой кнопкой мыши по нему), чтобы превратить его в грядку. Земля, дёрн и тропинки это культивируемые блоки. Разрыхлив мотыгой каменистую землю, вы получите из неё обычную землю. Wood Hoe=Деревянная мотыга Stone Hoe=Каменная мотыга Iron Hoe=Железная мотыга Golden Hoe=Золотая мотыга Diamond Hoe=Алмазная мотыга -Melon Seeds=Семена дыни +Netherite Hoe=Незеритовая мотыга +Melon Seeds=Семена арбуза Grows into a melon stem which in turn grows melons. Chickens like melon seeds.=Из них вырастают дыневые стебли, из которых, в свою очередь, вырастают дыни. Семена дыни любят куры. -Place the melon seeds on farmland (which can be created with a hoe) to plant a melon stem. Melon stems grow in sunlight and grow faster on hydrated farmland. When mature, the stem will attempt to grow a melon at the side. Rightclick an animal to feed it melon seeds.=Положите семена дыни на грядку (которую можно создать при помощи мотыги), чтобы посадить дыню. Дыневые стебли прорастают при солнечном свете, они растут быстрее на увлажнённой почке. На боку вызревшего стебля будет пытаться расти дыня. Кликните правой по животному, чтобы накормить его дыневыми семенами. -Melon=Дыня -A melon is a block which can be grown from melon stems, which in turn are grown from melon seeds. It can be harvested for melon slices.=Дыня это блок, который может расти на дыневом стебле, выросшем из семян дыни. -Premature Melon Stem=Созревший дыневый стебель -Melon stems grow on farmland in 8 stages. On hydrated farmland, the growth is a bit quicker. Mature melon stems are able to grow melons.=Стебель дыни растёт на грядке в 8 стадий. На увлажнённой грядке рост происходит немного быстрее. На созревших стеблях могут расти дыни. -Premature Melon Stem (Stage @1)=Молодой стебель дыни (стадия @1) -Mature Melon Stem=Созревший дыневый стебель -A mature melon stem attempts to grow a melon at one of its four adjacent blocks. A melon can only grow on top of farmland, dirt, or a grass block. When a melon is next to a melon stem, the melon stem immediately bends and connects to the melon. While connected, a melon stem can't grow another melon. As soon all melons around the stem have been removed, it loses the connection and is ready to grow another melon.=Зрелый стебель дыни пытается вырастить дыню на одном из четырех соседних блоков. Дыня может расти только на грядках, грязи или на травяном блоке. Когда дыня находится рядом со стеблем, он сразу же изгибается и соединяется с ней. При этом стебель не может выращивать другую дыню. И только когда все дыни вокруг стебля убраны, он будет готов вырастить другую дыню. -Melon Slice=Кусок дыни -This is a food item which can be eaten.=Это продуктовый предмет, его можно есть. +Place the melon seeds on farmland (which can be created with a hoe) to plant a melon stem. Melon stems grow in sunlight and grow faster on hydrated farmland. When mature, the stem will attempt to grow a melon at the side. Rightclick an animal to feed it melon seeds.=Положите семена арбуза на грядку (которую можно создать при помощи мотыги), чтобы посадить арбуз. Стебли арбуза прорастают при солнечном свете, их рост происходит быстрее на увлажнённой почве. Сбоку созревшего стебля будет вырастет арбуз. Кликните правой кнопкой мыши по животному, чтобы покормить его арбузными семенами. +Melon=Арбуз +A melon is a block which can be grown from melon stems, which in turn are grown from melon seeds. It can be harvested for melon slices.=Арбуз это блок, который может расти на арбузном стебле, выросшем из семян арбуза. +Premature Melon Stem=Созревший арбузный стебель +Melon stems grow on farmland in 8 stages. On hydrated farmland, the growth is a bit quicker. Mature melon stems are able to grow melons.=Стебель арбуза растёт на грядке в 8 стадий. На увлажнённой грядке рост происходит немного быстрее. На созревших стеблях могут расти арбузы. +Premature Melon Stem (Stage @1)=Молодой стебель арбуза (стадия @1) +Mature Melon Stem=Созревший арбузный стебель +A mature melon stem attempts to grow a melon at one of its four adjacent blocks. A melon can only grow on top of farmland, dirt, or a grass block. When a melon is next to a melon stem, the melon stem immediately bends and connects to the melon. While connected, a melon stem can't grow another melon. As soon all melons around the stem have been removed, it loses the connection and is ready to grow another melon.=Зрелый стебель арбуза пытается вырастить арбуз на одном из четырех соседних блоков. Арбуз может расти только на грядках, земле или на дёрне. Когда арбуз находится рядом со стеблем, стебель сразу же изгибается и соединяется с ней. При этом стебель не может выращивать другой арбуз. И только когда все арбузы вокруг стебля убраны, он будет готов вырастить другой арбуз. +Melon Slice=Ломтик арбуза +This is a food item which can be eaten.=Это съедобный продукт. Premature Potato Plant=Молодой картофель Potato plants are plants which grow on farmland under sunlight in 8 stages, but only 4 stages can be visually told apart. On hydrated farmland, they grow a bit faster. They can be harvested at any time but will only yield a profit when mature.=Картофель растёт в 8 стадий на грядках под действием солнечного света, но визуально различить можно только 4 стадии. На увлажнённой грядке рост идёт чуть быстрее. Собирать урожай можно на любой стадии, но выгода будет только при сборе созревших экземпляров. Premature Potato Plant (Stage @1)=Саженец молодого картофеля (стадия @1) Mature Potato Plant=Созревший картофель Mature potato plants are ready to be harvested for potatoes. They won't grow any further.=Созревший картофель готов к сбору. Дальше расти он уже не будет. Potato=Картофель -Potatoes are food items which can be eaten, cooked in the furnace and planted. Pigs like potatoes.=Картофель это продуктовый предмет, его можно есть, готовить в печи, а также садить. Картофель любят свиньи. -Hold it in your hand and rightclick to eat it. Place it on top of farmland to plant it. It grows in sunlight and grows faster on hydrated farmland. Rightclick an animal to feed it.=Чтобы съесть, кликните правой, держа его в руке. Или поместите его на грядку, чтобы посадить картофель. Он растёт под действием солнечного света, на влажных грядках процесс идёт быстрее. Или кликните правой по животному, чтобы покормить его. +Potatoes are food items which can be eaten, cooked in the furnace and planted. Pigs like potatoes.=Картофель это съедобный продукт, его можно съесть, готовить в печи, а также садить. Картофель любят свиньи. +Hold it in your hand and rightclick to eat it. Place it on top of farmland to plant it. It grows in sunlight and grows faster on hydrated farmland. Rightclick an animal to feed it.=Чтобы съесть картофель, возьмите его в руки с кликните правой кнопкой мыши. Или кликните картофелем на грядку, чтобы посадить его. Кликните правой кнопкой мыши по животному, чтобы покормить его. Картофель растёт под действием солнечного света, на влажных грядках процесс идёт быстрее. Baked Potato=Печёный картофель -Baked potatoes are food items which are more filling than the unbaked ones.=Печёный картофель это продуктовый предмет, который насыщает лучше, чем сырой картофель. +Baked potatoes are food items which are more filling than the unbaked ones.=Печёный картофель это съедобный продукт, который насыщает лучше, чем сырой картофель. Poisonous Potato=Ядовитый картофель -This potato doesn't look too healthy. You can eat it to restore hunger points, but there's a 60% chance it will poison you briefly.=Этот картофель вреден для здоровья. Его можно есть для восстановления очков голода, но с вероятностью 60% он вас ненадолго отравит. +This potato doesn't look too healthy. You can eat it to restore hunger points, but there's a 60% chance it will poison you briefly.=Этот картофель вреден. Его можно есть для восстановления очков голода, но с вероятностью 60% вы ненадолго отравитесь. Pumpkin Seeds=Семена тыквы Grows into a pumpkin stem which in turn grows pumpkins. Chickens like pumpkin seeds.=Из них вырастают тыквенный стебель, на котором, в свою очередь, растут тыквы. -Place the pumpkin seeds on farmland (which can be created with a hoe) to plant a pumpkin stem. Pumpkin stems grow in sunlight and grow faster on hydrated farmland. When mature, the stem attempts to grow a pumpkin next to it. Rightclick an animal to feed it pumpkin seeds.=Положите семена тыквы на грядку (которую можно создать при помощи мотыги), чтобы посадить тыкву. Тыквенные стебли прорастают при солнечном свете, они растут быстрее на увлажнённой почке. Когда стебель созреет, то попытается вырастить тыкву рядом с собой. Кликните правой по животному, чтобы накормить его тыквенными семенами. +Place the pumpkin seeds on farmland (which can be created with a hoe) to plant a pumpkin stem. Pumpkin stems grow in sunlight and grow faster on hydrated farmland. When mature, the stem attempts to grow a pumpkin next to it. Rightclick an animal to feed it pumpkin seeds.=Положите семена тыквы на грядку (которую можно создать при помощи мотыги), чтобы посадить тыкву. Тыквенные стебли прорастают при солнечном свете, они растут быстрее на увлажнённой почве. Когда стебель созреет, то попытается вырастить тыкву рядом с собой. Кликните правой кнопкой мыши по животному, чтобы покормить его. Premature Pumpkin Stem=Созревший тыквенный стебель Pumpkin stems grow on farmland in 8 stages. On hydrated farmland, the growth is a bit quicker. Mature pumpkin stems are able to grow pumpkins.=Стебель тыквы растёт на грядке в 8 стадий. На увлажнённой грядке рост происходит немного быстрее. На созревших стеблях могут расти тыквы. Premature Pumpkin Stem (Stage @1)=Молодой стебель тыквы (стадия @1) Mature Pumpkin Stem=Созревший тыквенный стебель A mature pumpkin stem attempts to grow a pumpkin at one of its four adjacent blocks. A pumpkin can only grow on top of farmland, dirt or a grass block. When a pumpkin is next to a pumpkin stem, the pumpkin stem immediately bends and connects to the pumpkin. A connected pumpkin stem can't grow another pumpkin. As soon all pumpkins around the stem have been removed, it loses the connection and is ready to grow another pumpkin.=Зрелый стебель тыквы пытается вырастить тыкву на одном из четырех соседних блоков. Тыква может расти только на грядках, грязи или на травяном блоке. Когда тыква находится рядом со стеблем, он сразу же изгибается и соединяется с ней. При этом стебель не может выращивать другую тыкву. И только когда все тыквы вокруг стебля убраны, он будет готов вырастить другую тыкву. -Faceless Pumpkin=Безликая тыква -A faceless pumpkin is a decorative block. It can be carved with shears to obtain pumpkin seeds.=Безликая тыква это декоративный блок. Его можно разрезать ножницами для получения семян тыквы. -Pumpkin=Тыква -A pumpkin can be worn as a helmet. Pumpkins grow from pumpkin stems, which in turn grow from pumpkin seeds.=Тыкву можно носить как шлем. Тыквы растут из тыквенных стеблей, которые растут из семян тыквы. +Faceless Pumpkin=Тыква +A faceless pumpkin is a decorative block. It can be carved with shears to obtain pumpkin seeds.=Тыква это декоративный блок. Её можно разрезать ножницами для получения семян тыквы. +Pumpkin=Вырезанная тыква +A pumpkin can be worn as a helmet. Pumpkins grow from pumpkin stems, which in turn grow from pumpkin seeds.=Вырезанную тыкву можно носить как шлем. Тыквы растут из тыквенных стеблей, которые растут из семян тыквы. Jack o'Lantern=Светильник Джека A jack o'lantern is a traditional Halloween decoration made from a pumpkin. It glows brightly.=Светильник Джека это традиционное украшение на Хеллоуин, изготавливаемое из тыквы. Он ярко светит. Pumpkin Pie=Тыквенный пирог -A pumpkin pie is a tasty food item which can be eaten.=Тыквенный пирог это вкусный продуктовый предмет, который можно съесть. +A pumpkin pie is a tasty food item which can be eaten.=Тыквенный пирог это вкусный съедобный продукт. Farmland=Грядка -Farmland is used for farming, a necessary surface to plant crops. It is created when a hoe is used on dirt or a similar block. Plants are able to grow on farmland, but slowly. Farmland will become hydrated farmland (on which plants grow faster) when it rains or a water source is nearby. This block will turn back to dirt when a solid block appears above it or a piston arm extends above it.=Грядка нужна для земледелия, она представляет собой поверхность для высадки культур. Он создается при применении мотыги к грязи и тому подобным блокам. Растения могут расти на грядках, но медленно. Грядки превратятся в увлажнённые грядки, если пойдёт дождь, либо если поблизости есть источник воды. Этот блок превратится обратно в грязь, если поместить на него твёрдый блок, а также под действием поршневого рычага. +Farmland is used for farming, a necessary surface to plant crops. It is created when a hoe is used on dirt or a similar block. Plants are able to grow on farmland, but slowly. Farmland will become hydrated farmland (on which plants grow faster) when it rains or a water source is nearby. This block will turn back to dirt when a solid block appears above it or a piston arm extends above it.=Грядка нужна для земледелия, она представляет собой поверхность для высадки культур. Он создается при применении мотыги к земле и тому подобным блокам. Растения могут расти на грядках, но медленно. Грядки превратятся в увлажнённые грядки, если пойдёт дождь, либо если поблизости есть источник воды. Этот блок превратится обратно в землю, если поместить на него твёрдый блок, или действовать на блок поршнем. Hydrated Farmland=Увлажнённая грядка -Hydrated farmland is used in farming, this is where you can plant and grow some plants. It is created when farmland is under rain or near water. Without water, this block will dry out eventually. This block will turn back to dirt when a solid block appears above it or a piston arm extends above it.=Увлажнённая грядка нужна для земледелия, на ней вы можете выращивать некоторые растения. Она создается, когда обыкновенная грядка попадает под дождь, либо рядом есть источник воды. Без воды этот блок рано или поздно высохнет. Увлажнённая грядка превратится обратно в грязь, если поместить на неё твёрдый блок, либо она попадёт под действие поршневого рычага. +Hydrated farmland is used in farming, this is where you can plant and grow some plants. It is created when farmland is under rain or near water. Without water, this block will dry out eventually. This block will turn back to dirt when a solid block appears above it or a piston arm extends above it.=Увлажнённая грядка нужна для земледелия, на ней вы можете выращивать некоторые растения. Она создается, когда обыкновенная грядка попадает под дождь, либо рядом есть источник воды. Без воды этот блок рано или поздно высохнет. Этот блок превратится обратно в землю, если поместить на него твёрдый блок, или действовать на блок поршнем. Wheat Seeds=Семена пшеницы Grows into a wheat plant. Chickens like wheat seeds.=Вырастают в пшеницу. Семена пшеницы любят куры. -Place the wheat seeds on farmland (which can be created with a hoe) to plant a wheat plant. They grow in sunlight and grow faster on hydrated farmland. Rightclick an animal to feed it wheat seeds.=Положите семена пшеницы на грядку (которую можно создать при помощи мотыги), чтобы посадить пшеницу. Семена растут при солнечном свете, их рост происходит быстрее на увлажнённой почке. Кликните правой по животному, чтобы накормить его семенами пшеницы. +Place the wheat seeds on farmland (which can be created with a hoe) to plant a wheat plant.=Положите семена пшеницы на грядку (которую можно создать при помощи мотыги), чтобы посадить пшеницу. +They grow in sunlight and grow faster on hydrated farmland. Rightclick an animal to feed it wheat seeds.=Семена растут при солнечном свете, их рост происходит быстрее на увлажнённой почве. Кликните правой кнопкой мыши по животному, чтобы покормить его. Premature Wheat Plant=Ростки молодой пшеницы -Premature wheat plants grow on farmland under sunlight in 8 stages. On hydrated farmland, they grow faster. They can be harvested at any time but will only yield a profit when mature.=Молодая пшеница растёт на грядке под действием солнечного света за 8 стадий. На увлажнённой грядке она растёт быстрее. Собирать урожай можно на любой стадии, но выгода будет только при сборе созревших экземпляров. +Premature wheat plants grow on farmland under sunlight in 8 stages.=Молодая пшеница растёт на грядке под солнечным светов за 8 стадий. +On hydrated farmland, they grow faster. They can be harvested at any time but will only yield a profit when mature.=Семена растут быстрее на увлажнённой почве. Собирать урожай можно на любой стадии, но выгода будет только при сборе созревших экземпляров. Premature Wheat Plant (Stage @1)=Ростки молодой пшеницы (стадия @1) Mature Wheat Plant=Зрелая пшеница -Mature wheat plants are ready to be harvested for wheat and wheat seeds. They won't grow any further.=Зрелая пшеница готова к сбору сена и семян, дальше расти она уже не будет. +Mature wheat plants are ready to be harvested for wheat and wheat seeds.=Зрелая пшеница готова к сбору ради пшеницы и семян. +They won't grow any further.=Растение больше не вырастет. Wheat=Пшеница -Wheat is used in crafting. Some animals like wheat.=Пшеницы используется для крафтинга. Некоторые животные любят пшеницу. +Wheat is used in crafting. Some animals like wheat.=Пшеница используется для крафта. Некоторые животные любят пшеницу. Cookie=Печенье Bread=Хлеб -Hay Bale=Стог сена -Hay bales are decorative blocks made from wheat.=Стог сена - декоративный блок, сделанный из пшеницы. -To carve a face into the pumpkin, use the shears on the side you want to carve.=Чтобы вырезать лицо на тыкве, примените ножницы к выбранной стороне тыквы. -Use the “Place” key on an animal to try to feed it wheat.=Нажмите клавишу “Разместить” на животном, чтобы попытаться покормить его пшеницей. -Grows on farmland=Прорастает(ют) на грядке -Turns block into farmland=Превращает блоки в грядки +Hay Bale=Сноп сена +Hay bales are decorative blocks made from wheat.=Сноп сена - декоративный блок сделанный из пшеницы. +To carve a face into the pumpkin, use the shears on the side you want to carve.=Чтобы вырезать лицо на тыкве примените ножницы к выбранной стороне тыквы. +Use the “Place” key on an animal to try to feed it wheat.=Нажмите клавишу [Использовать] на животном, чтобы попытаться покормить его пшеницей. +Grows on farmland=Прорастает на грядке +Turns block into farmland=Делает из блока грядку 60% chance of poisoning=Вероятность отравления: 60% Surface for crops=Поверхность для культур Can become wet=Может намокать -Uses: @1=Выдерживает: @1 использований(е,я) +Uses: @1=Использований: @1 +Sweet Berry Bush (Stage @1)=Куст сладкой ягоды (стадия @1) +Sweet Berry=Сладкая ягода diff --git a/mods/ITEMS/mcl_fences/locale/mcl_fences.ru.tr b/mods/ITEMS/mcl_fences/locale/mcl_fences.ru.tr index bafd9ba83..bd265b9b6 100644 --- a/mods/ITEMS/mcl_fences/locale/mcl_fences.ru.tr +++ b/mods/ITEMS/mcl_fences/locale/mcl_fences.ru.tr @@ -1,18 +1,18 @@ # textdomain: mcl_fences -Fences are structures which block the way. Fences will connect to each other and solid blocks. They cannot be jumped over with a simple jump.=Заборы это сооружения, преграждающие путь. Блоки заборов соединяются между собой и прикрепляются к твёрдым блокам. Через них нельзя перепрыгивать одиночным прыжком. -Fence gates can be opened or closed and can't be jumped over. Fences will connect nicely to fence gates.=Калитки могут быть открытыми и закрытыми. Их нельзя перепрыгивать. -Right-click the fence gate to open or close it.=Кликните правой по калитке, чтобы открыть или закрыть её. +Fences are structures which block the way. Fences will connect to each other and solid blocks. They cannot be jumped over with a simple jump.=Заборы это сооружения, преграждающие путь. Блоки заборов соединяются между собой и твёрдыми блоками. Через забор нельзя перепрыгнуть. +Fence gates can be opened or closed and can't be jumped over. Fences will connect nicely to fence gates.=Калитки могут быть открыты и закрыты. Калитки нельзя перепрыгивать. +Right-click the fence gate to open or close it.=Кликните правой кнопкой мыши по калитке, чтобы открыть или закрыть её. Oak Fence=Дубовый забор Oak Fence Gate=Дубовая калитка Spruce Fence=Еловый забор Spruce Fence Gate=Еловая калитка Birch Fence=Берёзовый забор Birch Fence Gate=Берёзовая калитка -Jungle Fence=Забор из дерева джунглей -Jungle Fence Gate=Калитка из дерева джунглей +Jungle Fence=Забор из тропического дерева +Jungle Fence Gate=Калитка из тропического дерева Dark Oak Fence=Забор из тёмного дуба Dark Oak Fence Gate=Калитка из тёмного дуба -Acacia Fence=Забор из акации -Acacia Fence Gate=Калитка из акации +Acacia Fence=Акациевый забор +Acacia Fence Gate=Акациевая калитка Nether Brick Fence=Забор из адского кирпича -Openable by players and redstone power=Открываются игроками и сигналами редстоуна +Openable by players and redstone power=Открывается игроками и сигналом редстоуна diff --git a/mods/ITEMS/mcl_fire/locale/mcl_fire.ru.tr b/mods/ITEMS/mcl_fire/locale/mcl_fire.ru.tr index 941a73aaa..957bb6b9b 100644 --- a/mods/ITEMS/mcl_fire/locale/mcl_fire.ru.tr +++ b/mods/ITEMS/mcl_fire/locale/mcl_fire.ru.tr @@ -1,19 +1,19 @@ # textdomain: mcl_fire Fire Charge=Огненный шар -Fire charges are primarily projectiles which can be launched from dispensers, they will fly in a straight line and burst into a fire on impact. Alternatively, they can be used to ignite fires directly.=Огненные шары это прежде всего снаряды, которые могут быть выпущены из диспенсеров, они полетят по прямой линии и превратятся в огонь при ударе. Они также могут быть использованы для непосредственного поджигания блоков. -Put the fire charge into a dispenser and supply it with redstone power to launch it. To ignite a fire directly, simply place the fire charge on the ground, which uses it up.=Положите огненный шар в диспенсер и подайте на него энергию редстоуна для запуска. Чтобы непосредственно поджигать блоки, просто поместите его на поверхность. +Fire charges are primarily projectiles which can be launched from dispensers, they will fly in a straight line and burst into a fire on impact. Alternatively, they can be used to ignite fires directly.=Огненные шары это снаряды, которые могут быть выпущены из раздатчика, они полетят по прямой линии и взорвутся при столкновении. Они также могут быть использованы для непосредственного поджигания блоков. +Put the fire charge into a dispenser and supply it with redstone power to launch it. To ignite a fire directly, simply place the fire charge on the ground, which uses it up.=Положите огненный шар в раздатчик и подайте на него сигнал редстоуна для запуска. Чтобы непосредственно поджигать блоки, просто используйте его на поверхности блока. Flint and Steel=Огниво Flint and steel is a tool to start fires and ignite blocks.=Огниво это инструмент для добывания огня. -Rightclick the surface of a block to attempt to light a fire in front of it or ignite the block. A few blocks have an unique reaction when ignited.=Кликните правой по поверхности блока, чтобы попытаться зажечь огонь перед ней либо поджечь блок. Некоторые блоки реагируют на поджигание индивидуально. -Fire is a damaging and destructive but short-lived kind of block. It will destroy and spread towards near flammable blocks, but fire will disappear when there is nothing to burn left. It will be extinguished by nearby water and rain. Fire can be destroyed safely by punching it, but it is hurtful if you stand directly in it. If a fire is started above netherrack or a magma block, it will immediately turn into an eternal fire.=Огонь - это повреждающий и разрушающий, но недолговечный блок. Он будет уничтожать и переходить на соседние легковоспламенимые блоки, но исчезнет, когда больше будет нечему гореть. Он будет погашен близлежащей водой или дождем. Его можно безопасно убрать, стукнув по нему, но если вы стоите прямо в нём, это причинит вам вред. Если огонь зажжён над адским камнем или блоком магмы, он мгновенно превращается в вечный огонь. -Fire is a damaging but non-destructive short-lived kind of block. It will disappear when there is no flammable block around. Fire does not destroy blocks, at least not in this world. It will be extinguished by nearby water and rain. Fire can be destroyed safely by punching it, but it is hurtful if you stand directly in it. If a fire is started above netherrack or a magma block, it will immediately turn into an eternal fire.=Огонь - это повреждающий, но не разрушающий и недолговечный блок. Он исчезнет, когда вокруг не останется легковоспламенимых блоков. Огонь не уничтожает блоки, по крайней мере, в этом мире. Он будет погашен близлежащей водой или дождем. Его можно безопасно убрать, стукнув по нему, но если вы стоите прямо в нём, это причинит вам вред. Если огонь зажжён над адским камнем или блоком магмы, он мгновенно превращается в вечный огонь. -Eternal fire is a damaging block that might create more fire. It will create fire around it when flammable blocks are nearby. Eternal fire can be extinguished by punches and nearby water blocks. Other than (normal) fire, eternal fire does not get extinguished on its own and also continues to burn under rain. Punching eternal fire is safe, but it hurts if you stand inside.=Вечный огонь - это повреждающий блок, который может создать больше огня. Он будет создавать огонь вокруг себя, если поблизости окажутся легковоспламенимые блоки. Вечный огонь можно потушить ударами и находящимися рядом водными блоками. В отличие от (обычного) огня, вечный огонь не гаснет сам по себе и также продолжает гореть под дождем. Бить вечный огонь безопасно, но он причиняет боль, если вы стоите внутри. -Eternal fire is a damaging block. Eternal fire can be extinguished by punches and nearby water blocks. Other than (normal) fire, eternal fire does not get extinguished on its own and also continues to burn under rain. Punching eternal fire is safe, but it hurts if you stand inside.=Вечный огонь - это повреждающий блок. Вечный огонь можно потушить ударами и находящимися рядом водными блоками. В отличие от (обычного) огня, вечный огонь не гаснет сам по себе и также продолжает гореть под дождем. Бить вечный огонь безопасно, но он причиняет боль, если вы стоите внутри. -@1 has been cooked crisp.=@1 был(а) заживо приготовлен(а). -@1 felt the burn.=@1 испытал(а) ожог. -@1 died in the flames.=@1 умер(ла) в пламени. -@1 died in a fire.=@1 умер(ла) в огне. +Rightclick the surface of a block to attempt to light a fire in front of it or ignite the block. A few blocks have an unique reaction when ignited.=Кликните правой кнопкой мыши по поверхности блока, чтобы попытаться зажечь огонь перед ним, либо поджечь сам блок. Некоторые блоки реагируют на поджигание индивидуально. +Fire is a damaging and destructive but short-lived kind of block. It will destroy and spread towards near flammable blocks, but fire will disappear when there is nothing to burn left. It will be extinguished by nearby water and rain. Fire can be destroyed safely by punching it, but it is hurtful if you stand directly in it. If a fire is started above netherrack or a magma block, it will immediately turn into an eternal fire.=Огонь это уничтожающий и поджигающий, но недолговечный блок. Он будет уничтожать и переходить на соседние воспламенимые блоки, но исчезнет, когда больше будет нечему гореть. Он будет погашен водой или дождем. Его можно безопасно убрать, ударив по нему, но если вы стоите прямо в огне, это причинит вам урон. Если огонь зажжён над адский каменем или блоком магмы, он превращается в вечный огонь. +Fire is a damaging but non-destructive short-lived kind of block. It will disappear when there is no flammable block around. Fire does not destroy blocks, at least not in this world. It will be extinguished by nearby water and rain. Fire can be destroyed safely by punching it, but it is hurtful if you stand directly in it. If a fire is started above netherrack or a magma block, it will immediately turn into an eternal fire.=Огонь это уничтожающий и поджигающий, но недолговечный блок. В этом мире огонь не уничтожает блоки. Он будет погашен водой или дождем. Его можно безопасно убрать, ударив по нему, но если вы стоите прямо в огне, это причинит вам урон. Если огонь зажжён над адский камнем или блоком магмы, он превращается в вечный огонь. +Eternal fire is a damaging block that might create more fire. It will create fire around it when flammable blocks are nearby. Eternal fire can be extinguished by punches and nearby water blocks. Other than (normal) fire, eternal fire does not get extinguished on its own and also continues to burn under rain. Punching eternal fire is safe, but it hurts if you stand inside.=Вечный огонь это поджигающий блок, который может создать еще больше огня. Он будет создавать огонь вокруг себя, если поблизости окажутся воспламенимые блоки. Вечный огонь можно потушить ударом или водой. В отличие от обычного огня, вечный огонь не гаснет сам по себе и также продолжает гореть под дождем. Бить вечный огонь безопасно, но он причиняет урон, если вы стоите внутри огня. +Eternal fire is a damaging block. Eternal fire can be extinguished by punches and nearby water blocks. Other than (normal) fire, eternal fire does not get extinguished on its own and also continues to burn under rain. Punching eternal fire is safe, but it hurts if you stand inside.=Вечный огонь это поджигающий блок. В этом мире огонь не распространяется на соседние блоки. Вечный огонь можно потушить ударом или водой. В отличие от обычного огня, вечный огонь не гаснет сам по себе и также продолжает гореть под дождем. Бить вечный огонь безопасно, но он причиняет урон, если вы стоите внутри огня. +@1 has been cooked crisp.=@1 был(а) зажарен(а) до хрустящей корочки. +@1 felt the burn.=@1 сгорел(а). +@1 died in the flames.=@1 погиб(ла) в пламени. +@1 died in a fire.=@1 погиб(ла) в огне. Fire=Огонь Eternal Fire=Вечный огонь -Dispenser projectile=Диспенсер снаряда -Starts fires and ignites blocks=Высекает огонь, поджигает блоки +Dispenser projectile=Снаряд раздатчика +Starts fires and ignites blocks=Высекает огонь и поджигает блоки diff --git a/mods/ITEMS/mcl_fireworks/locale/mcl_fireworks.ru.tr b/mods/ITEMS/mcl_fireworks/locale/mcl_fireworks.ru.tr index e66eb06a5..d985213b7 100644 --- a/mods/ITEMS/mcl_fireworks/locale/mcl_fireworks.ru.tr +++ b/mods/ITEMS/mcl_fireworks/locale/mcl_fireworks.ru.tr @@ -1,3 +1,3 @@ # textdomain: mcl_fireworks -Firework Rocket= -Flight Duration:= \ No newline at end of file +Firework Rocket=Фейерверк +Flight Duration:=Длительности полёта: \ No newline at end of file diff --git a/mods/ITEMS/mcl_fishing/locale/mcl_fishing.ru.tr b/mods/ITEMS/mcl_fishing/locale/mcl_fishing.ru.tr index 9ed0e4f8d..d432d965f 100644 --- a/mods/ITEMS/mcl_fishing/locale/mcl_fishing.ru.tr +++ b/mods/ITEMS/mcl_fishing/locale/mcl_fishing.ru.tr @@ -1,18 +1,18 @@ # textdomain: mcl_fishing Fishing Rod=Удочка -Fishing rods can be used to catch fish.=Удочка используется при ловле рыбы. -Rightclick to launch the bobber. When it sinks right-click again to reel in an item. Who knows what you're going to catch?=Кликните правой для запуска поплавка. Когда он потонет, кликните снова, чтобы вытащить ваш улов. Кстати, что вы собираетесь поймать? -Raw Fish=Сырая рыба -Raw fish is obtained by fishing and is a food item which can be eaten safely. Cooking it improves its nutritional value.=Сырая рыба добывается при помощи удочки и это продукт, который можно безопасно есть. При приготовлении её питательная ценность растёт. -Cooked Fish=Приготовленная рыба -Mmh, fish! This is a healthy food item.=Ммм, рыба! Это продуктовый предмет здорового питания. +Fishing rods can be used to catch fish.=Удочка используется для ловли рыбы. +Rightclick to launch the bobber. When it sinks right-click again to reel in an item. Who knows what you're going to catch?=Кликните правой кнопкой мыши чтобы закинуть поплавок. Когда он потонет, кликните снова, чтобы вытащить ваш улов. Кто знает что вам может попасться? +Raw Fish=Сырая треска +Raw fish is obtained by fishing and is a food item which can be eaten safely. Cooking it improves its nutritional value.=Сырая треска добывается при помощи удочки и это съедобный продукт. После приготовлении её питательная ценность растёт. +Cooked Fish=Приготовленная треска +Mmh, fish! This is a healthy food item.=Ммм, рыба! Это съедобный продукт. Raw Salmon=Сырой лосось -Raw salmon is obtained by fishing and is a food item which can be eaten safely. Cooking it improves its nutritional value.=Сырой лосось добывается при помощи удочки и это продукт, который можно безопасно есть. При приготовлении его питательная ценность растёт. +Raw salmon is obtained by fishing and is a food item which can be eaten safely. Cooking it improves its nutritional value.=Сырой лосось добывается при помощи удочки и это съедобный продукт. При приготовлении его питательная ценность растёт. Cooked Salmon=Приготовленный лосось -This is a healthy food item which can be eaten.=Это продуктовый предмет здорового питания. +This is a healthy food item which can be eaten.=Это съедобный продукт. Clownfish=Тропическая рыба -Clownfish may be obtained by fishing (and luck) and is a food item which can be eaten safely.=Тропическая рыба добывается при помощи удочки (и удачи) и это продукт, который можно безопасно есть. +Clownfish may be obtained by fishing (and luck) and is a food item which can be eaten safely.=Тропическая рыба добывается при помощи удочки (и удачи) и это съедобный продукт. Pufferfish=Иглобрюх -Pufferfish are a common species of fish and can be obtained by fishing. They can technically be eaten, but they are very bad for humans. Eating a pufferfish only restores 1 hunger point and will poison you very badly (which drains your health non-fatally) and causes serious food poisoning (which increases your hunger).=Иглобрюхи - распространенный вид рыбы и могут быть пойманы на удочку. Технически их можно есть, но они очень вредны для людей. Употребление иглобрюха в пищу восстанавливает всего 1 очко голода, но отравит вас очень тяжело (несмертельно уменьшит ваше здоровье), вы получите серьёзное пищевое отравление (которое увеличивает голод). +Pufferfish are a common species of fish and can be obtained by fishing. They can technically be eaten, but they are very bad for humans. Eating a pufferfish only restores 1 hunger point and will poison you very badly (which drains your health non-fatally) and causes serious food poisoning (which increases your hunger).=Иглобрюх - распространенный вид рыбы, который может быть пойман на удочку. Технически их можно есть, но они очень ядовиты. Употребление иглобрюха в пищу восстанавливает всего 1 очко голода, но сильно отравит вас (несмертельно уменьшит ваше здоровье) и даст сильное пищевое отравление (которое увеличивает голод). Catches fish in water=Ловит рыбу в воде Very poisonous=Очень ядовит diff --git a/mods/ITEMS/mcl_fletching_table/locale/mcl_fletching_table.ru.tr b/mods/ITEMS/mcl_fletching_table/locale/mcl_fletching_table.ru.tr new file mode 100644 index 000000000..d44a333ac --- /dev/null +++ b/mods/ITEMS/mcl_fletching_table/locale/mcl_fletching_table.ru.tr @@ -0,0 +1,4 @@ +# textdomain: mcl_fletching_table +Fletching Table=Стол лучника +A fletching table=Стол лучника +This is the fletcher villager's work station. It currently has no use beyond decoration.=Это рабочее место жителя лучника. На данный момент не имеет применения помимо декоративного. \ No newline at end of file diff --git a/mods/ITEMS/mcl_flowerpots/locale/mcl_flowerpots.ru.tr b/mods/ITEMS/mcl_flowerpots/locale/mcl_flowerpots.ru.tr index 6bb6be923..8ee6ddc26 100644 --- a/mods/ITEMS/mcl_flowerpots/locale/mcl_flowerpots.ru.tr +++ b/mods/ITEMS/mcl_flowerpots/locale/mcl_flowerpots.ru.tr @@ -3,24 +3,25 @@ Dandelion Flower Pot=Одуванчик в горшке Poppy Flower Pot=Мак в горшке Blue Orchid Flower Pot=Голубая орхидея в горшке Allium Flower Pot=Лук в горшке -Azure Bluet Flower Pot=Хоустония Альба в горшке +Azure Bluet Flower Pot=Хаустония серая в горшке Red Tulip Flower Pot=Красный тюльпан в горшке Pink Tulip Flower Pot=Розовый тюльпан в горшке White Tulip Flower Pot=Белый тюльпан в горшке Orange Tulip Flower Pot=Оранжевый тюльпан в горшке -Oxeye Daisy Flower Pot=Нивяник обыкновенный в горшке +Oxeye Daisy Flower Pot=Нивяник в горшке Brown Mushroom Flower Pot=Коричневый гриб в горшке Red Mushroom Flower Pot=Красный гриб в горшке Oak Sapling Flower Pot=Саженец дуба в горшке Acacia Sapling Flower Pot=Саженец акации в горшке -Jungle Sapling Flower Pot=Саженец дерева джунглей в горшке +Jungle Sapling Flower Pot=Саженец тропического дерева в горшке Dark Oak Sapling Flower Pot=Саженец тёмного дуба в горшке Spruce Sapling Flower Pot=Саженец ели в горшке Birch Sapling Flower Pot=Саженец берёзы в горшке Dead Bush Flower Pot=Мёртвый куст в горшке -Fern Flower Pot=Цветок папоротника в горшке +Fern Flower Pot=Папоротник в горшке Cactus Flower Pot=Кактус в горшке Flower Pot=Цветочный горшок Flower pots are decorative blocks in which flowers and other small plants can be placed.=Цветочные горшки это декоративные блоки, в которые можно посадить цветы и другие небольшие растения. Just place a plant on the flower pot. Flower pots can hold small flowers (not higher than 1 block), saplings, ferns, dead bushes, mushrooms and cacti. Rightclick a potted plant to retrieve the plant.=Просто поместите растение в цветочный горшок. Цветочные горшки могут выдержать небольшие цветы (не выше 1 блока), саженцы, папоротники, мёртвые кусты, грибы и кактусы. Кликните правой по горшёчному растению, чтобы вытащить его из горшка. -Can hold a small flower or plant=Можно использовать для высадки небольшого растения или цветка +Can hold a small flower or plant=Можно использовать, чтобы посадить растение или цветок +Cherry Sapling Flower Pot=Саженец вишнёвого дерева в горшке \ No newline at end of file diff --git a/mods/ITEMS/mcl_flowers/locale/mcl_flowers.ru.tr b/mods/ITEMS/mcl_flowers/locale/mcl_flowers.ru.tr index f5cb5e18d..7f1ff3eef 100644 --- a/mods/ITEMS/mcl_flowers/locale/mcl_flowers.ru.tr +++ b/mods/ITEMS/mcl_flowers/locale/mcl_flowers.ru.tr @@ -1,16 +1,19 @@ # textdomain: mcl_flowers -This is a small flower. Small flowers are mainly used for dye production and can also be potted.=Это небольшой цветок. Такие цветы в основном используются для производства красителей. Их можно садить в горшки. -It can only be placed on a block on which it would also survive.=Его можно высаживать только на те блоки, на которых он может расти. +This is a small flower. Small flowers are mainly used for dye production and can also be potted.=Это небольшой цветок. Такие цветы в основном используются для производства красителей. Их можно посадить в горшки. +It can only be placed on a block on which it would also survive.=Это можно высаживать только на те блоки, на которых оно может расти. Poppy=Мак Dandelion=Одуванчик -Oxeye Daisy=Нивяник обыкновенный +Oxeye Daisy=Нивяник Orange Tulip=Оранжевый тюльпан Pink Tulip=Розовый тюльпан Red Tulip=Красный тюльпан White Tulip=Белый тюльпан Allium=Лук -Azure Bluet=Хоустония Альба +Azure Bluet=Хаустония серая Blue Orchid=Голубая орхидея +Wither Rose=Роза иссушения +Lily of the Valley=Ландыш +Cornflower=Василёк Tall Grass=Высокая трава Tall grass is a small plant which often occurs on the surface of grasslands. It can be harvested for wheat seeds. By using bone meal, tall grass can be turned into double tallgrass which is two blocks high.=Высокая трава это маленькое растение, часто встречающееся на поверхности лугов. Их можно собирать, добывая семена пшеницы. С помощью костной муки высокая трава может быть превращена в двойную высокую траву (2 блока в высоту). Fern=Папоротник @@ -28,5 +31,5 @@ Double tallgrass a variant of tall grass and occupies two blocks. It can be harv Large fern is a variant of fern and occupies two blocks. It can be harvested for wheat seeds.=Большой папоротник - вид папоротника, занимающий два блока. Его можно собирать, добывая семена пшеницы. Double Tallgrass=Двойная высокая трава Large Fern=Большой папоротник -Lily Pad=Лилия -A lily pad is a flat plant block which can be walked on. They can be placed on water sources, ice and frosted ice.=Лилия это плоский растительный блок, по которому можно ходить. Он размещается на водных источниках, а также на льду и замороженном льду. +Lily Pad=Кувшинка +A lily pad is a flat plant block which can be walked on. They can be placed on water sources, ice and frosted ice.=Кувшинка это плоский растительный блок, по которому можно ходить. Он размещается на водных источниках, а также на льду и замороженном льду. diff --git a/mods/ITEMS/mcl_furnaces/locale/mcl_furnaces.ru.tr b/mods/ITEMS/mcl_furnaces/locale/mcl_furnaces.ru.tr index 1ba8732df..ab01ce701 100644 --- a/mods/ITEMS/mcl_furnaces/locale/mcl_furnaces.ru.tr +++ b/mods/ITEMS/mcl_furnaces/locale/mcl_furnaces.ru.tr @@ -1,9 +1,12 @@ # textdomain: mcl_furnaces Furnace=Печь -Furnaces cook or smelt several items, using a furnace fuel, into something else.=В печи готовят или переплавляют предметы, но для этого требуется загрузить топливо. -Use the furnace to open the furnace menu. Place a furnace fuel in the lower slot and the source material in the upper slot. The furnace will slowly use its fuel to smelt the item. The result will be placed into the output slot at the right side.=[Используйте] печь, чтобы открыть её меню. Положите печное топливо в нижний отсек, а материал-источник в верхний. Печь будет понемногу расходовать топливо для переплавки предмета. Получившийся в результате предмет будет помещён в выходной отсек справа. -Use the recipe book to see what you can smelt, what you can use as fuel and how long it will burn.=Используйте книгу рецептов, чтобы узнать, что вы можете переплавить в печи, что сгодится в качестве топлива и как долго будет идти процесс. +Furnaces cook or smelt several items, using a furnace fuel, into something else.=В печи готовят или переплавляют предметы, с помощью топлива. +Use the furnace to open the furnace menu.=Используйте печь, чтобы открыть её меню. +Place a furnace fuel in the lower slot and the source material in the upper slot.=Положите топливо в нижний слот и материал в верхний. +The furnace will slowly use its fuel to smelt the item.=Печь будет медленно использовать топливо, чтобы переплавить предмет. +The result will be placed into the output slot at the right side.=Результат будет помещен в выходной слот с правой стороны. +Use the recipe book to see what you can smelt, what you can use as fuel and how long it will burn.=Используйте книгу рецептов, чтобы узнать, что вы можете переплавить в печи, что можно использовать как топливо и как долго оно будет гореть. Burning Furnace=Горящая печь Recipe book=Книга рецептов Inventory=Инвентарь -Uses fuel to smelt or cook items=Расходует топливо для приготовления или переплавки предметов +Uses fuel to smelt or cook items=Расходует топливо для приготовления или переплавки предметов \ No newline at end of file diff --git a/mods/ITEMS/mcl_grindstone/locale/mcl_grindstone.ru.tr b/mods/ITEMS/mcl_grindstone/locale/mcl_grindstone.ru.tr new file mode 100644 index 000000000..aba4d733d --- /dev/null +++ b/mods/ITEMS/mcl_grindstone/locale/mcl_grindstone.ru.tr @@ -0,0 +1,11 @@ +# textdomain: mcl_grindstone +Inventory=Инвентарь +Repair & Disenchant=Починить и снять зачарования +Grindstone=Точило +Used to disenchant/fix tools=Используется для снятия зачарований и для починки инструментов +Grindstone disenchants tools and armour except for curses, and repairs two items of the same type it is also the weapon smith's work station.=Точило снимает все зачарования с инструментов и брони кроме проклятий, чинит два предмета одного типа, а также служит рабочим местом жителя оружейника. +To use the grindstone, rightclick it, Two input slots (on the left) and a single output slot.=Чтобы использовать точило кликните правой кнопкой по нему. Два входных слота слева и один выходной слот справа. +To disenchant an item place enchanted item in one of the input slots and take the disenchanted item from the output.=Чтобы снять зачарования положите предмет в один входной слот и заберите полученный предмет с выходного слота. +To repair a tool you need a tool of the same type and material, put both items in the input slot and the output slot will combine two items durabilities with 5% bonus.=Чтобы починить инструмент вам нужен еще один инструмент того же типа и из того же материала, положите оба инструмента во входные слоты и в выходном слоте их запас прочности соединится с 5% бонусом. +If both items have enchantments the player will get xp from both items from the disenchant.=Если оба предмета имеют зачарования игрок получит XP от снятия зачарований с каждого предмета7 +Curses cannot be removed and will be transfered to the new repaired item, if both items have a different curse the curses will be combined.=Проклятия нельзя снять и они будут переданы на новый предмет, если оба предмета имеют разные проклятия, то они будут совмещены. \ No newline at end of file diff --git a/mods/ITEMS/mcl_hamburger/locale/mcl_hamburger.ru.tr b/mods/ITEMS/mcl_hamburger/locale/mcl_hamburger.ru.tr index 736f182a5..70401678b 100644 --- a/mods/ITEMS/mcl_hamburger/locale/mcl_hamburger.ru.tr +++ b/mods/ITEMS/mcl_hamburger/locale/mcl_hamburger.ru.tr @@ -1,10 +1,10 @@ # textdomain: mcl_hamburger A Hamburger=Гамбургер -A tasty hamburger that is sure to lure villagers around like a lead. Can be eaten.=Вкусный гамбургер, который обязательно привлечет жителей деревни, как наживку. Можно есть. +A tasty hamburger that is sure to lure villagers around like a lead. Can be eaten.=Вкусный гамбургер, который привлечет жителей деревни как наживка. Можно съесть. -A tasty hamburger that is sure to lure villagers. 'I'll gladly pay you Tuesday, for a hamburger today.' - Wimpy.=Вкусный гамбургер, который обязательно привлечет жителей деревни. — Я с радостью заплачу тебе во вторник за гамбургер сегодня. - Вимпи. +A tasty hamburger that is sure to lure villagers. 'I'll gladly pay you Tuesday, for a hamburger today.' - Wimpy.=Вкусный гамбургер, который привлечет жителей деревни. Burger Time!=Время бургеров! -Craft a Hamburger.=Изготовить гамбургер. -Wield this item to pull villagers to you.=Используйте этот предмет, чтобы притягивать к себе жителей деревни. +Craft a Hamburger.=Приготовьте гамбургер. +Wield this item to pull villagers to you.=Возьмите этот предмет, чтобы приманивать к себе деревенских жителей diff --git a/mods/ITEMS/mcl_heads/locale/mcl_heads.ru.tr b/mods/ITEMS/mcl_heads/locale/mcl_heads.ru.tr index 28f2de4ff..f802ae92d 100644 --- a/mods/ITEMS/mcl_heads/locale/mcl_heads.ru.tr +++ b/mods/ITEMS/mcl_heads/locale/mcl_heads.ru.tr @@ -3,9 +3,9 @@ Zombie Head=Голова зомби A zombie head is a small decorative block which resembles the head of a zombie. It can also be worn as a helmet, which reduces the detection range of zombies by 50%.=Голова зомби это небольшой декоративный блок, немного похожий на голову зомби. Его можно носить в качестве шлема, что уменьшит радиус обнаружения вас зомби на 50%. Creeper Head=Голова крипера A creeper head is a small decorative block which resembles the head of a creeper. It can also be worn as a helmet, which reduces the detection range of creepers by 50%.=Голова крипера это небольшой декоративный блок, немного похожий на голову крипера. Его можно носить в качестве шлема, что уменьшит радиус обнаружения вас крипером на 50%. -Human Head=Голова человека -A human head is a small decorative block which resembles the head of a human (i.e. a player character). It can also be worn as a helmet for fun, but does not offer any protection.=Голова человека это небольшой декоративный блок, немного похожий на голову человека (например, игрового персонажа). Его можно носить в качестве шлема просто для смеха, он не даёт никакой защиты. +Human Head=Голова игрока +A human head is a small decorative block which resembles the head of a human (i.e. a player character). It can also be worn as a helmet for fun, but does not offer any protection.=Голова игрока это небольшой декоративный блок, немного похожий на голову игрового персонажа. Его можно носить в качестве шлема просто для веселья, он не даёт никакой защиты. Skeleton Skull=Череп скелета A skeleton skull is a small decorative block which resembles the skull of a skeleton. It can also be worn as a helmet, which reduces the detection range of skeletons by 50%.=Череп скелета это небольшой декоративный блок, немного похожий на череп скелета. Его можно носить в качестве шлема, что уменьшит радиус обнаружения вас скелетом на 50%. Wither Skeleton Skull=Череп скелета-иссушителя -A wither skeleton skull is a small decorative block which resembles the skull of a wither skeleton. It can also be worn as a helmet for fun, but does not offer any protection.=Череп скелета-иссушителя это небольшой декоративный блок, немного похожий на череп скелета-иссушителя. Его можно носить в качестве шлема просто для смеха, он не даёт никакой защиты. +A wither skeleton skull is a small decorative block which resembles the skull of a wither skeleton. It can also be worn as a helmet for fun, but does not offer any protection.=Череп скелета-иссушителя это небольшой декоративный блок, немного похожий на череп скелета-иссушителя. Его можно носить в качестве шлема просто для веселья, он не даёт никакой защиты. diff --git a/mods/ITEMS/mcl_honey/locale/mcl_honey.ru.tr b/mods/ITEMS/mcl_honey/locale/mcl_honey.ru.tr new file mode 100644 index 000000000..ab43afd83 --- /dev/null +++ b/mods/ITEMS/mcl_honey/locale/mcl_honey.ru.tr @@ -0,0 +1,11 @@ +# textdomain: mcl_honey +Honeycomb=Пчелиные соты +Used to craft beehives and protect copper blocks from further oxidation.=Используется для создания ульев и для защиты медных блоков от дальнейшего окисления. +Use on copper blocks to prevent further oxidation.=Используйте на медном блоке, чтобы предотвратить дальнейшеее окисление. +Honeycomb Block=Блок пчелиных сот +Honeycomb Block. Used as a decoration.=Блок пчелиных сот. Декорация. +Honey Bottle=Бутылочка мёда +Honey Bottle is used to craft honey blocks and to restore hunger points.=Бутылочка мёда используется при создании блоков мёда и для восстановления голода. +Drinking will restore 6 hunger points. Can also be used to craft honey blocks.=Выпив вы восстановите 6 очков голода. Также используется при создании блоков мёда. +Honey Block=Блок мёда +Honey Block. Used as a decoration and in redstone. Is sticky on some sides.=Блок мёда. Используется как декорация и в механизмах редстоуна. Липкий по бокам. \ No newline at end of file diff --git a/mods/ITEMS/mcl_hoppers/locale/mcl_hoppers.ru.tr b/mods/ITEMS/mcl_hoppers/locale/mcl_hoppers.ru.tr index ac7e82b17..03dbcad3c 100644 --- a/mods/ITEMS/mcl_hoppers/locale/mcl_hoppers.ru.tr +++ b/mods/ITEMS/mcl_hoppers/locale/mcl_hoppers.ru.tr @@ -1,16 +1,16 @@ # textdomain: mcl_hoppers Hopper=Воронка -Hoppers are containers with 5 inventory slots. They collect dropped items from above, take items from a container above and attempt to put its items it into an adjacent container. Hoppers can go either downwards or sideways. Hoppers interact with chests, droppers, dispensers, shulker boxes, furnaces and hoppers.=Воронка это контейнер с 5 отсеками инвентаря. Она может собирать предметы, брошенные сверху, брать предметы из контейнеров сверху, а также пытаться класть свои предметы в примыкающий контейнер. Воронки могут действовать вниз или вбок. Воронки взаимодействуют с сундуками, выбрасывателями, диспенсерами, ящиками шалкеров, печами и другими воронками. +Hoppers are containers with 5 inventory slots. They collect dropped items from above, take items from a container above and attempt to put its items it into an adjacent container. Hoppers can go either downwards or sideways. Hoppers interact with chests, droppers, dispensers, shulker boxes, furnaces and hoppers.=Воронка это контейнер с 5 слотами инвентаря. Она может собирать предметы, брошенные сверху, брать предметы из контейнеров сверху, а также пытаться положить свои предметы в примыкающий контейнер. Воронки могут действовать вниз или вбок. Воронки взаимодействуют с сундуками, выбрасывателями, раздатчиками, ящиками шалкеров, печами и другими воронками. Hoppers interact with containers the following way:=Воронка взаимодействует с контейнерами следующим образом: -• Furnaces: Hoppers from above will put items into the source slot. Hoppers from below take items from the output slot. They also take items from the fuel slot when they can't be used as a fuel. Sideway hoppers that point to the furnace put items into the fuel slot=• Печи: размещённые выше воронки будут складывать предметы во входной отсек. Воронки, размещённые ниже, будут доставать предметы из выходного отсека. Они также может доставать предметы из топливного отсека, если эти предметы не могут использоваться в качестве топлива. Боковые воронки, нацеленные на печь, помещают предметы в топливный отсек. -• Ender chests: No interaction.=• Сундук Предела: не взаимодействует. -• Other containers: Normal interaction.=• Прочие контейнеры: взаимодействует обычно. -Hoppers can be disabled when supplied with redstone power. Disabled hoppers don't move items.=Воронки могут быть отключены, когда на них подаётся энергия редстоуна. +• Furnaces: Hoppers from above will put items into the source slot. Hoppers from below take items from the output slot. They also take items from the fuel slot when they can't be used as a fuel. Sideway hoppers that point to the furnace put items into the fuel slot=• Печи: размещённые наверху воронки будут складывать предметы во входной слот. Воронки, размещённые снизу, будут брать предметы из выходного слота печи. Они также может доставать предметы из топливного слота, если эти предметы не могут использоваться в качестве топлива. Воронки сбоку, присоединённые к печи, помещают предметы в топливный слот. +• Ender chests: No interaction.=• Сундук Края: не взаимодействует. +• Other containers: Normal interaction.=• Прочие контейнеры: взаимодействует как обычно. +Hoppers can be disabled when supplied with redstone power. Disabled hoppers don't move items.=Воронки могут быть отключены, когда на них подаётся сигнал редстоуна. To place a hopper vertically, place it on the floor or a ceiling. To place it sideways, place it at the side of a block. Use the hopper to access its inventory.=Чтобы установить воронку вертикально, поместите её на пол или потолок. Чтобы установить воронку по направлению в сторону, разместите её на боковой стороне блока. Нажмите [Использовать] для доступа к инвентарю воронки. Disabled Hopper=Отключенная воронка Side Hopper=Боковая воронка Disabled Side Hopper=Отключенная боковая воронка Inventory=Инвентарь -5 inventory slots=5 отсеков инвентаря +5 inventory slots=5 слотов инвентаря Collects items from above, moves items to container below=Собирает предметы сверху, передаёт их в контейнер ниже -Can be disabled with redstone power=Может быть отключена с помощью энергии редстоуна +Can be disabled with redstone power=Может быть отключена с помощью сигнала редстоуна diff --git a/mods/ITEMS/mcl_itemframes/locale/mcl_itemframes.ru.tr b/mods/ITEMS/mcl_itemframes/locale/mcl_itemframes.ru.tr index 73320ce14..84af50ab7 100644 --- a/mods/ITEMS/mcl_itemframes/locale/mcl_itemframes.ru.tr +++ b/mods/ITEMS/mcl_itemframes/locale/mcl_itemframes.ru.tr @@ -1,10 +1,10 @@ # textdomain: mcl_itemframes Item Frame=Рамка -Item frames are decorative blocks in which items can be placed.=Рамки — это отделочные блоки, в которых можно хранить предметы. -Just place any item on the item frame. Use the item frame again to retrieve the item.=Просто вставьте в рамку любой предмет. Нажмите правой кнопкой мыши на рамку, чтобы взять предмет обратно. -Can hold an item.=Может хранить предмет. -Glowing Item Frame=Светящаяся рамка предмета -Glowing item frames are decorative blocks in which items can be placed.=Светящиеся рамки предметов — это отделочные блоки, в которых можно хранить предметы и заставлять их светиться. -Can hold an item and glows.=Может хранить предмет и светится. +Item frames are decorative blocks in which items can be placed.=Рамки это декоративные блоки, в которые можно помещать предметы. +Just place any item on the item frame. Use the item frame again to retrieve the item.=Просто поместите в рамку любой предмет. Используйте рамку вновь, чтобы забрать из неё предмет обратно. +Can hold an item.=Может хранить предмет +Glowing Item Frame=Светящаяся рамка +Glowing item frames are decorative blocks in which items can be placed.=Светящаяся рамка это декоративный блок в который можно положить предметы. +Can hold an item and glows.=Светится и может хранить предмет Glow and Behold!=Сияй и созерцай! -Craft a glow item frame.=Создание светящейся рамки. \ No newline at end of file +Craft a glow item frame.=Создайте светящуюся рамку. \ No newline at end of file diff --git a/mods/ITEMS/mcl_jukebox/locale/mcl_jukebox.ru.tr b/mods/ITEMS/mcl_jukebox/locale/mcl_jukebox.ru.tr index 1787ca229..977b154c7 100644 --- a/mods/ITEMS/mcl_jukebox/locale/mcl_jukebox.ru.tr +++ b/mods/ITEMS/mcl_jukebox/locale/mcl_jukebox.ru.tr @@ -1,11 +1,11 @@ # textdomain: mcl_jukebox -Music Disc=Диск с музыкой -A music disc holds a single music track which can be used in a jukebox to play music.=Диск с музыкой содержит одну музыкальную запись, которую можно прослушивать при помощи проигрывателя. -Place a music disc into an empty jukebox to play the music. Use the jukebox again to retrieve the music disc. The music can only be heard by you, not by other players.=Поместите диск в пустой проигрыватель, чтобы включить музыку. [Используйте] проигрыватель вновь, чтобы вытащить диск. Музыку слышите только вы, другие игроки не слышат. -Music Disc=Диск с музыкой +Music Disc=Пластинка +A music disc holds a single music track which can be used in a jukebox to play music.=Пластинка содержит один музыкальный трек, который можно прослушивать при помощи проигрывателя. +Place a music disc into an empty jukebox to play the music. Use the jukebox again to retrieve the music disc. The music can only be heard by you, not by other players.=Поместите пластинку в пустой проигрыватель, чтобы включить музыку. Используйте проигрыватель снова, чтобы вытащить пластинку. Музыку слышите только вы, другие игроки не слышат. +Music Disc=Пластинка @1—@2=@1—@2 Jukebox=Проигрыватель -Jukeboxes play music when they're supplied with a music disc.=Проигрыватель воспроизводит музыку, если снабдить его музыкальным диском. -Place a music disc into an empty jukebox to insert the music disc and play music. If the jukebox already has a music disc, you will retrieve this music disc first. The music can only be heard by you, not by other players.=Поместите диск в пустой проигрыватель, диск окажется в проигрывателе и заиграет музыка. Если в проигрывателе уже есть диск, вы сначала извлечёте его. Музыку можете услышать только вы, другие игроки не услышат. +Jukeboxes play music when they're supplied with a music disc.=Проигрыватель воспроизводит музыку, если положить в него пластинку +Place a music disc into an empty jukebox to insert the music disc and play music. If the jukebox already has a music disc, you will retrieve this music disc first. The music can only be heard by you, not by other players.=Поместите пластинку в пустой проигрыватель, чтобы включить музыку. Если в проигрывателе уже есть пластинка, вы сначала извлечёте его. Музыку можете услышать только вы, другие игроки её не слышат. Now playing: @1—@2=Сейчас звучит: @1-@2 -Uses music discs to play music=Проигрывает музыку с дисков +Uses music discs to play music=Проигрывает музыку с пластинок diff --git a/mods/ITEMS/mcl_lanterns/locale/mcl_lanterns.ru.tr b/mods/ITEMS/mcl_lanterns/locale/mcl_lanterns.ru.tr new file mode 100644 index 000000000..ce14bd382 --- /dev/null +++ b/mods/ITEMS/mcl_lanterns/locale/mcl_lanterns.ru.tr @@ -0,0 +1,6 @@ +# textdomain: mcl_lanterns +Lantern=Фонарь +Soul Lantern=Фонарь душ +Lanterns are light sources which can be placed on the top or the bottom of most blocks.=Фонари это источники света которые можно поставить сверху или снизу большинства блоков. +Chain=Цепь +Chains are metallic decoration blocks.=Цепи это металлические декоративные блоки. \ No newline at end of file diff --git a/mods/ITEMS/mcl_lectern/locale/mcl_lectern.ru.tr b/mods/ITEMS/mcl_lectern/locale/mcl_lectern.ru.tr new file mode 100644 index 000000000..8728de159 --- /dev/null +++ b/mods/ITEMS/mcl_lectern/locale/mcl_lectern.ru.tr @@ -0,0 +1,4 @@ +# textdomain: mcl_lectern +Lectern=Кафедра +Lecterns not only look good, but are job site blocks for Librarians.=Кафедра не только красиво выглядит, но и служит рабочим местом для жителей библиотекарей +Place the Lectern on a solid node for best results. May attract villagers, so it's best to place outside of where you call 'home'.=Поставьте кафедру на твердый блок. Может привлечь жителей, так что лучше ставить в том месте, которое вы могли бы назвать 'домом'. \ No newline at end of file diff --git a/mods/ITEMS/mcl_lightning_rods/locale/mcl_lightning_rods.ru.tr b/mods/ITEMS/mcl_lightning_rods/locale/mcl_lightning_rods.ru.tr new file mode 100644 index 000000000..80fd8ba68 --- /dev/null +++ b/mods/ITEMS/mcl_lightning_rods/locale/mcl_lightning_rods.ru.tr @@ -0,0 +1,3 @@ +# textdomain: mcl_lightning_rods +Lightning Rod=Громоотвод +A block that attracts lightning=Блок который притягивает молнии \ No newline at end of file diff --git a/mods/ITEMS/mcl_loom/locale/mcl_loom.ru.tr b/mods/ITEMS/mcl_loom/locale/mcl_loom.ru.tr index 2442f76d5..c3a800100 100644 --- a/mods/ITEMS/mcl_loom/locale/mcl_loom.ru.tr +++ b/mods/ITEMS/mcl_loom/locale/mcl_loom.ru.tr @@ -1,4 +1,4 @@ # textdomain: mcl_loom Loom=Ткацкий станок Used to create banner designs=Позволяет создавать узоры на флаге -This is the shepherd villager's work station. It is used to create banner designs.=Это рабочее место пастуха. Позволяет создавать узоры на флаге +This is the shepherd villager's work station. It is used to create banner designs.=Это рабочее место жителя пастуха. Позволяет создавать узоры на флаге diff --git a/mods/ITEMS/mcl_mangrove/locale/mcl_mangrove.fr.tr b/mods/ITEMS/mcl_mangrove/locale/mcl_mangrove.fr.tr index 4d1590dbd..805666f67 100644 --- a/mods/ITEMS/mcl_mangrove/locale/mcl_mangrove.fr.tr +++ b/mods/ITEMS/mcl_mangrove/locale/mcl_mangrove.fr.tr @@ -6,9 +6,9 @@ The bark of a Mangrove tree.=L'écorce d'un palétuvier. Mangrove Wood Planks=Planches de palétuvier Mangrove Leaves=Feuilles de palétuvier Mangrove leaves are grown from mangrove trees.=les feuilles de palétuvier poussent sur les palétuviers. -Stripped Mangrove Wood=Bûche de palétuvier écorcée +Stripped Mangrove Log=Bûche de palétuvier écorcée The stripped wood of a Mangrove tree=La bûche écorcée d'un palétuvier -Stripped Mangrove Bark=Bois de palétuvier écorcé +Stripped Mangrove Wood=Bois de palétuvier écorcé The stripped bark of a Mangrove tree=Le bois écorcé d'un palétuvier Mangrove Roots=Racines de palétuvier Mangrove roots are decorative blocks that form as part of mangrove trees.=Les racines de palétuvier sont des blocs décoratifs qui font partie des palétuviers. diff --git a/mods/ITEMS/mcl_mangrove/locale/mcl_mangrove.ja.tr b/mods/ITEMS/mcl_mangrove/locale/mcl_mangrove.ja.tr index 6df59f6fb..3191b3d7a 100644 --- a/mods/ITEMS/mcl_mangrove/locale/mcl_mangrove.ja.tr +++ b/mods/ITEMS/mcl_mangrove/locale/mcl_mangrove.ja.tr @@ -6,9 +6,9 @@ The bark of a Mangrove tree.=マングローブの木の樹皮です。 Mangrove Wood Planks=マングローブの板材 Mangrove Leaves=マングローブの葉 Mangrove leaves are grown from mangrove trees.=マングローブの葉は、マングローブの木から育ちます。 -Stripped Mangrove Wood=樹皮を剥いだマングローブの木 +Stripped Mangrove Log=樹皮を剥いだマングローブの木 The stripped wood of a Mangrove tree=剥き身となったマングローブの木 -Stripped Mangrove Bark=剥がされたマングローブの樹皮 +Stripped Mangrove Wood=剥がされたマングローブの樹皮 The stripped bark of a Mangrove tree=マングローブの木から剥がされた樹皮 Mangrove Roots=マングローブの根 Mangrove roots are decorative blocks that form as part of mangrove trees.=マングローブの根は、マングローブの木の一部として形成される装飾ブロックです。 diff --git a/mods/ITEMS/mcl_mangrove/locale/mcl_mangrove.ru.tr b/mods/ITEMS/mcl_mangrove/locale/mcl_mangrove.ru.tr new file mode 100644 index 000000000..b36fa5a0d --- /dev/null +++ b/mods/ITEMS/mcl_mangrove/locale/mcl_mangrove.ru.tr @@ -0,0 +1,36 @@ +# textdomain: mcl_mangrove +Mangrove Wood=Мангровая древесина +The trunk of a Mangrove tree.=Ствол мангрового дерева. +Mangrove Bark=Мангровая кора +The bark of a Mangrove tree.=Кора мангрового дерева. +Mangrove Wood Planks=Мангровые доски +Mangrove Leaves=Мангровые листья +Mangrove leaves are grown from mangrove trees.=Мангровые листья растут на мангровых деревьях. +Stripped Mangrove Log=Обтёсанная мангровая древесина +The stripped wood of a Mangrove tree=Обтёсанная мангровая древесина +Stripped Mangrove Wood=Обтёсанная мангровая кора +The stripped bark of a Mangrove tree=Обтёсанная мангровая кора +Mangrove Roots=Мангровые корни +Mangrove roots are decorative blocks that form as part of mangrove trees.=Мангровые корни это декоративный блок который формирует часть мангровых деревьев. +Mangrove Propagule=Мангровый отросток +Needs soil and light to grow=Нуждается в почве и свете, чтобы расти +When placed on soil (such as dirt) and exposed to light, an propagule will grow into an mangrove after some time.=После посадки на почву (например, на землю) при наличии света мангровый отросток вырастет в мангровое дерево через некоторое время. +Hanging Propagule=Свисающий мангровый отросток +Grows on Mangrove leaves=Растет на мангровой листве. +water logged mangrove roots=Затопленные мангровые корни +Mangrove roots, despite being a full block, can be waterlogged and do not flow water out=Мангровые корни, не смотря на то что это полный блок, может быть затоплен и не выпускать воду наружу. +These cannot be crafted yet only occure when get in contact of water.=Нельзя скрафтить, появляется только при контакте с водой. +Muddy Mangrove Roots=Грязные мангровые корни +crafted with Mud and Mangrove roots=Крафтится с помощью грязи и мангровых корней +Muddy Mangrove Roots is a block from mangrove swamp.It drowns player a bit inside it.=Грязные мангровые корни это блок из мангровых болот. Игрок немного погружается внутрь них. +Mangrove Door=Мангровая дверь +Wooden doors are 2-block high barriers which can be opened or closed by hand and by a redstone signal.=Деревянные двери это преграды высотой в 2 блока, которые можно открывать и закрывать вручную и по сигналу редстоуна. +To open or close a wooden door, rightclick it or supply its lower half with a redstone signal.=Чтобы открыть или закрыть деревянную дверь, кликните правой либо подайте к её нижней части сигнал редстоуна. +Mangrove Trapdoor=Мангровый люк +Wooden trapdoors are horizontal barriers which can be opened and closed by hand or a redstone signal. They occupy the upper or lower part of a block, depending on how they have been placed. When open, they can be climbed like a ladder.=Деревянные люки это горизонтальные преграды, которые можно открывать и закрывать вручную и по сигналу редстоуна. Они занимают верхнюю или нижнюю часть блока, в зависимости от того, как они были установлены. В открытом состоянии по ним можно карабкаться, как по лестницам. +To open or close the trapdoor, rightclick it or send a redstone signal to it.=Чтобы открыть или закрыть деревянный люк, кликните по нему правой кнопкой либо подайте на него сигнал редстоуна. +Mangrove Wood Fence=Мангровый забор +Mangrove Wood Fence Gate=Мангровая калитка +Mangrove Wood Stairs=Мангровые ступени +Mangrove Wood Slab=Мангровая плита +Double Mangrove Wood Slab=Двойная мангровая плита diff --git a/mods/ITEMS/mcl_mangrove/locale/template.txt b/mods/ITEMS/mcl_mangrove/locale/template.txt index 3de2b9ced..71c713d16 100644 --- a/mods/ITEMS/mcl_mangrove/locale/template.txt +++ b/mods/ITEMS/mcl_mangrove/locale/template.txt @@ -6,9 +6,9 @@ The bark of a Mangrove tree.= Mangrove Wood Planks= Mangrove Leaves= Mangrove leaves are grown from mangrove trees.= -Stripped Mangrove Wood= +Stripped Mangrove Log= The stripped wood of a Mangrove tree= -Stripped Mangrove Bark= +Stripped Mangrove Wood= The stripped bark of a Mangrove tree= Mangrove Roots= Mangrove roots are decorative blocks that form as part of mangrove trees.= diff --git a/mods/ITEMS/mcl_maps/locale/mcl_maps.ru.tr b/mods/ITEMS/mcl_maps/locale/mcl_maps.ru.tr index 3bb7d6a19..9c3631f37 100644 --- a/mods/ITEMS/mcl_maps/locale/mcl_maps.ru.tr +++ b/mods/ITEMS/mcl_maps/locale/mcl_maps.ru.tr @@ -1,5 +1,8 @@ # textdomain: mcl_maps Empty Map=Пустая карта -Empty maps are not useful as maps, but they can be stacked and turned to maps which can be used.=Пустые карты не могут использоваться в качестве карт, но могут складываться в стопки, а также могут быть превращены в полноценные карты. -Rightclick to start using the map (which can't be stacked anymore).=Нажмите правую кнопку мыши, чтобы начать использовать карту (её больше нельзя будет уложить в стопку). +Empty maps are not useful as maps, but they can be stacked and turned to maps which can be used.=Пустые карты не так полезны как карты, но могут складываться в стопки, а также могут быть превращены в полноценные карты. +Rightclick to create a filled map (which can't be stacked anymore).=Правый клик, чтобы заполнить карту (больше не может складываться в стопки). Map=Карта +Shows a map image.=Показать карту. +When created, the map saves the nearby area as an image that can be viewed any time by holding the map.=После создания карта сохраняет ближайшую местность которую можно посмотеть в любое время взяв карту в руки. +Hold the map in your hand. This will display a map on your screen.=Возьмите карту в руки. Так появится изображение карты на экране. diff --git a/mods/ITEMS/mcl_mobitems/locale/mcl_mobitems.ru.tr b/mods/ITEMS/mcl_mobitems/locale/mcl_mobitems.ru.tr index 4e3fc020b..a8771c238 100644 --- a/mods/ITEMS/mcl_mobitems/locale/mcl_mobitems.ru.tr +++ b/mods/ITEMS/mcl_mobitems/locale/mcl_mobitems.ru.tr @@ -1,105 +1,120 @@ # textdomain: mcl_mobitems -Rotten Flesh=Гнилое мясо -80% chance of food poisoning=Вероятность отравления 80% +Rotten Flesh=Гнилая плоть +80% chance of food poisoning=Вероятность отравления: 80% -Yuck! This piece of flesh clearly has seen better days. If you're really desperate, you can eat it to restore a few hunger points, but there's a 80% chance it causes food poisoning, which increases your hunger for a while.=БУЭ! Этот кусок гнили явно знавал лучшие времена. Если вы отчаялись, то можете съесть его, восстановив несколько очков голода, но с вероятностью 80% вы получите пищевое отравление, которое усилит ваш голод на некоторое время. +Yuck! This piece of flesh clearly has seen better days. If you're really desperate, you can eat it to restore a few hunger points, but there's a 80% chance it causes food poisoning, which increases your hunger for a while.=Буэ! Этот кусок гнили явно знавал лучшие времена. Если вы отчаялись, то можете съесть его, восстановив несколько очков голода, но с вероятностью 80% вы получите пищевое отравление, которое усилит ваш голод на некоторое время. Raw Mutton=Сырая баранина Raw mutton is the flesh from a sheep and can be eaten safely. Cooking it will greatly increase its nutritional value.=Сырая баранина это мясо овцы, его можно безопасно есть. Приготовление значительно увеличивает его питательную ценность. Cooked Mutton=Жареная баранина -Cooked mutton is the cooked flesh from a sheep and is used as food.=Жареная баранина это запечённое мясо овцы, употребляемое в пищу. +Cooked mutton is the cooked flesh from a sheep and is used as food.=Жареная баранина это приготовленное мясо овцы, это съедобный продукт. Raw Beef=Сырая говядина Raw beef is the flesh from cows and can be eaten safely. Cooking it will greatly increase its nutritional value.=Сырая говядина это мясо коровы, его можно безопасно есть. Приготовление значительно увеличивает его питательную ценность. -Steak=Стейк -Steak is cooked beef from cows and can be eaten.=Стейк это приготовленное мясо коровы, его можно есть. -Raw Chicken=Сырая курица -30% chance of food poisoning=Вероятность отравления 30% +Steak=Жареная говядина +Steak is cooked beef from cows and can be eaten.=Жареная говядина это приготовленное мясо коровы, это съедобный продукт. +Raw Chicken=Сырая курятина +30% chance of food poisoning=Вероятность отравления: 30% -Raw chicken is a food item which is not safe to consume. You can eat it to restore a few hunger points, but there's a 30% chance to suffer from food poisoning, which increases your hunger rate for a while. Cooking raw chicken will make it safe to eat and increases its nutritional value.=Сырая курица это продуктовый предмет, небезопасный для употребления. Вы можете его съесть для восстановления нескольких очков голода, но с вероятностью 30% вы пострадаете от пищевого отравление, которое усилит ваш голод на некоторое время. Приготовление сырой курицы сделает её безопасной для еды, значительно увеличив питательную ценность. +Raw chicken is a food item which is not safe to consume. You can eat it to restore a few hunger points, but there's a 30% chance to suffer from food poisoning, which increases your hunger rate for a while. Cooking raw chicken will make it safe to eat and increases its nutritional value.=Сырая курица это съедобный предмет, небезопасный для употребления. Вы можете его съесть для восстановления нескольких очков голода, но с вероятностью 30% вы пострадаете от пищевого отравление, которое усилит ваш голод на некоторое время. Приготовление сырой курицы сделает её безопасной для еды, значительно увеличив питательную ценность. -Cooked Chicken=Жареный цыплёнок -A cooked chicken is a healthy food item which can be eaten.=Жареный цыплёнок это здоровый питательный продукт, его можно есть. +Cooked Chicken=Жареная курятина +A cooked chicken is a healthy food item which can be eaten.=Жареная курица это съедобный продукт. Raw Porkchop=Сырая свинина A raw porkchop is the flesh from a pig and can be eaten safely. Cooking it will greatly increase its nutritional value.=Сырая свинина это мясо свиньи, его можно безопасно есть. Приготовление значительно увеличивает его питательную ценность. -Cooked Porkchop=Свиная отбивная -Cooked porkchop is the cooked flesh of a pig and is used as food.=Свиная отбивная это приготовленное мясо свиньи, его можно есть. +Cooked Porkchop=Жареная свинина +Cooked porkchop is the cooked flesh of a pig and is used as food.=Жареная свинина это приготовленное мясо свиньи, это съедобный продукт. Raw Rabbit=Сырая крольчатина Raw rabbit is a food item from a dead rabbit. It can be eaten safely. Cooking it will increase its nutritional value.=Сырая крольчатина это мясо кролика, его можно безопасно есть. Приготовление значительно увеличивает его питательную ценность. -Cooked Rabbit=Приготовленный кролик -This is a food item which can be eaten.=Это пищевой продукт, его можно есть. +Cooked Rabbit=Жареная крольчатина +This is a food item which can be eaten.=Приготовленная крольчатина это съедобный продукт. Milk=Молоко Removes all status effects=Убирает все эффекты состояния -Milk is very refreshing and can be obtained by using a bucket on a cow. Drinking it will remove all status effects, but restores no hunger points.=Молоко отлично освежает, его можно получить, применив ведро к корове. Выпив молока, вы избавитесь от всех эффектов состояния, но не восстановите очков голода. +Milk is very refreshing and can be obtained by using a bucket on a cow. Drinking it will remove all status effects, but restores no hunger points.=Молоко отлично освежает, его можно получить, использовав ведро на корове. Выпив молока, вы избавитесь от всех эффектов, но не восстановите очков голода. -Use the placement key to drink the milk.=Используйте клавишу размещения, чтобы выпить молоко. +Use the placement key to drink the milk.=Используйте правую кнопку мыши, чтобы выпить молоко. Spider Eye=Паучий глаз Poisonous=Ядовито -Spider eyes are used mainly in crafting. If you're really desperate, you can eat a spider eye, but it will poison you briefly.=Паучьи глаза в основном используются для крафтинга. Если вы отчаялись, то можете съесть их, но они вас на некоторое время отравят. +Spider eyes are used mainly in crafting. If you're really desperate, you can eat a spider eye, but it will poison you briefly.=Паучьи глаза в основном используются для крафта. Если вы отчаялись, то можете съесть их, но они вас на некоторое время отравят. Bone=Кость Bones can be used to tame wolves so they will protect you. They are also useful as a crafting ingredient.=Кости можно использовать для приручения волков, чтобы они защищали вас. -Wield the bone near wolves to attract them. Use the “Place” key on the wolf to give it a bone and tame it. You can then give commands to the tamed wolf by using the “Place” key on it.=Положите кость рядом с волками, чтобы привлечь их. Используйте клавишу “Разместить” на волке, чтобы дать ему кость и приручить его. Вы можете командовать приручёнными волками с помощью клавиши “Разместить”. +Wield the bone near wolves to attract them. Use the “Place” key on the wolf to give it a bone and tame it. You can then give commands to the tamed wolf by using the “Place” key on it.=Возьмите в руку кость рядом с волками, чтобы привлечь их. Используйте кость на волке, чтобы приручить его. Вы можете командовать приручёнными волками с помощи правой кнопки мыши. Squid Ink Sac=Чернильный мешок -This item is dropped by dead squids. Squid ink can be used to as an ingredient to craft book and quill or black dye.= +This item is dropped by dead squids. Squid ink can be used to as an ingredient to craft book and quill or black dye.=Этот предмет выпадает с мёртвых спрутов. Используется для создания книги с пером и чёрного красителя. -String=Нити -Strings are used in crafting.=Нити используются для крафтинга +String=Нить +Strings are used in crafting.=Нить используются для крафта Blaze Rod=Огненный стержень -This is a crafting component dropped from dead blazes.=Это крафтинговый ингредиент, отбрасываемый ифритом +This is a crafting component dropped from dead blazes.=Это материал для крафта, выпадающий из ифрита. Blaze Powder=Огненный порошок -This item is mainly used for crafting.=Этот предмет в основном используется для крафтинга. +This item is mainly used for crafting.=Огненный порошок это материал для крафта и топливо для варочной стойки. Magma Cream=Лавовый крем -Magma cream is a crafting component.=Лавовый крем это крафтинговый компонент. +Magma cream is a crafting component.=Лавовый крем это материал для крафта. Ghast Tear=Слеза гаста Place this item in an item frame as decoration.=Поместите это в рамку как украшение. Nether Star=Звезда Ада -A nether star is dropped when the Wither dies. Place it in an item frame to show the world how hardcore you are! Or just as decoration.=Звезда Ада выбрасывается при смерти иссушителя. Поместите её в рамку, чтобы показать миру ваше величие! Либо просто как украшение. +A nether star is dropped when the Wither dies. Place it in an item frame to show the world how hardcore you are! Or just as decoration.=Звезда Ада выбрасывается при смерти иссушителя. Поместите её в рамку, чтобы показать миру ваше величие! Leather=Кожа -Leather is a versatile crafting component.=Кожа это универсальный крафт-компонент. +Leather is a versatile crafting component.=Кожа это универсальный материал для крафта. Feather=Перо -Feathers are used in crafting and are dropped from chickens.=Перо используется для крафтинга и выпадает из кур. +Feathers are used in crafting and are dropped from chickens.=Перо выпадает из кур и используется для крафта. Rabbit Hide=Кроличья шкурка Rabbit hide is used to create leather.=Кроличья шкурка используется для создания кожи. Rabbit's Foot=Кроличья лапка Must be your lucky day! Place this item in an item frame for decoration.=У вас счастливый день! Поместите этот предмет в рамку как украшение. Saddle=Седло Can be placed on animals to ride them=Можно устанавливать на животных, чтобы ездить на них -Saddles can be put on some animals in order to mount them.=Седло можно поставить на некоторых животных, чтобы закрепляться на них. +Saddles can be put on some animals in order to mount them.=Седло можно поставить на некоторых животных, чтобы сесть на них. -Use the placement key with the saddle in your hand to try to put on the saddle. Saddles fit on horses, mules, donkeys and pigs. Horses, mules and donkeys need to be tamed first, otherwise they'll reject the saddle. Saddled animals can be mounted by using the placement key on them again.=Используйте клавишу размещения, держа седло в руке, чтобы попытаться надеть его. Сёдла подходят для лошадей, мулов, осликов и свиней. Лошади, мулы и ослики должны быть предварительно приручены, иначе они откажутся от седла. На осёдланных животных можно сесть, снова нажав на них клавишу размещения. +Use the placement key with the saddle in your hand to try to put on the saddle. Saddles fit on horses, mules, donkeys and pigs. Horses, mules and donkeys need to be tamed first, otherwise they'll reject the saddle. Saddled animals can be mounted by using the placement key on them again.=Используйте седло на животном, чтобы попытаться надеть его. Сёдла подходят для лошадей, мулов, ослов и свиней. Лошади, мулы и ослы должны быть предварительно приручены, иначе они откажутся от седла. На осёдланных животных можно сесть, снова нажав на них кнопку использования. -Rabbit Stew=Рагу из кролика -Rabbit stew is a very nutricious food item.=Рагу из кролика это очень питательный продукт. +Rabbit Stew=Тушёный кролик +Rabbit stew is a very nutricious food item.=Рагу из кролика это очень питательный съедобный продукт. Shulker Shell=Панцирь шалкера -Shulker shells are used in crafting. They are dropped from dead shulkers.=Панцирь шалкера используется для крафтинга. Он выпадает из мёртвого шалкера. +Shulker shells are used in crafting. They are dropped from dead shulkers.=Панцирь шалкера используется для крафта. Он выпадает из мёртвого шалкера. Slimeball=Слизь -Slimeballs are used in crafting. They are dropped from slimes.=Слизь используется для крафтинга. Она выпадает из слизняков. +Slimeballs are used in crafting. They are dropped from slimes.=Слизь используется для крафта. Она выпадает из слизняков. Gunpowder=Порох Carrot on a Stick=Удочка с морковью Lets you ride a saddled pig=Позволяет вам ездить на осёдланной свинье A carrot on a stick can be used on saddled pigs to ride them.=Удочку с морковью можно использовать, чтобы оседлать свинью и поехать на ней. -Place it on a saddled pig to mount it. You can now ride the pig like a horse. Pigs will also walk towards you when you just wield the carrot on a stick.=Поместите это на осёдланную свинью, чтобы закрепиться на ней. Теперь вы можете ехать на ней, как на лошади. Свиньи также идут вперёд, когда вы просто держите удочку с морковью. +Place it on a saddled pig to mount it. You can now ride the pig like a horse. Pigs will also walk towards you when you just wield the carrot on a stick.=Поместите это на осёдланную свинью, чтобы сесть на неё. Теперь вы можете ехать на ней, как на лошади. Свиньи приманиваются к вам, когда вы просто держите удочку с морковью. -Iron Horse Armor=Железные доспехи лошади -Iron horse armor can be worn by horses to increase their protection from harm a bit.=Железные доспехи лошади, надетые на лошадь, немного защищают её от вреда. -Golden Horse Armor=Золотые доспехи лошади -Golden horse armor can be worn by horses to increase their protection from harm.=Золотые доспехи лошади, надетые на лошадь, защищают её от вреда. -Diamond Horse Armor=Алмазные доспехи лошади -Diamond horse armor can be worn by horses to greatly increase their protection from harm.=Алмазные доспехи лошади, надетые на лошадь, отлично защищают её от вреда. -Place it on a horse to put on the horse armor. Donkeys and mules can't wear horse armor.=Поместите это на лошадь, чтобы одеть лошадь в доспехи. Ослики и мулы не могут носить лошадиные доспехи. +Warped fungus on a Stick=Удочка с искажённым грибком +Lets you ride a strider=Позволяет вам ездить на страйдере +A warped fungus on a stick can be used on saddled striders to ride them.=Удочку с искажённым грибком можно использовать осёдланном страйдере, чтобы поехать на нём. +Place it on a saddled strider to mount it. You can now ride the strider like a horse. Striders will also walk towards you when you just wield the fungus on a stick.=Поместите это на осёдланном страйдере, чтобы сесть на него. Теперь вы можете ехать на нем, как на лошади. Страйдеры приманиваются к вам, когда вы просто держите удочку с искажённым грибком. + +Nautilus Shell=Раковина наутилуса +Used to craft a conduit=Используется при создании морского проводника +The Nautilus Shell is used to craft a conduit. They can be obtained by fishing or killing a drowned that is wielding a shell.=Раковина наутилуса используется при создании морского проводника. Раковины можно получить при рыбалке или при убийстве утопленников держащих раковину. +Heart of the Sea=Сердце моря +The Heart of the Sea is used to craft a conduit. They can be obtained by finding them in a buried treasure chest.=Сердце моря используется при создании морского проводника. Их можно найти в закопанных сундуках с сокровищем. + +Iron Horse Armor=Железная конская броня +Iron horse armor can be worn by horses to increase their protection from harm a bit.=Железную конскую броню можно надеть на лошадь, чтобы немного увеличить её защиту от урона. +Golden Horse Armor=Золотая конская броня +Golden horse armor can be worn by horses to increase their protection from harm.=Золотую конскую броню можно надеть на лошадь, чтобы увеличить её защиту от урона. +Diamond Horse Armor=Алмазная конская броня +Diamond horse armor can be worn by horses to greatly increase their protection from harm.=Алмазную конскую броню можно надеть на лошадь, чтобы значительно увеличить её защиту от урона. +Place it on a horse to put on the horse armor. Donkeys and mules can't wear horse armor.=Используйте конскую броню на лошади, чтобы надеть её. Ослы и мулы не могут носить конскую броню. + +Glow Ink Sac=Светящийся чернильный мешок +Use it to craft the Glow Item Frame.=Используется для создания светящейся рамки. +Use the Glow Ink Sac and the normal Item Frame to craft the Glow Item Frame.=Используйте светящийся чернильный мешок на обычной рамке, чтобы создать светящуюся рамку. diff --git a/mods/ITEMS/mcl_mobspawners/locale/mcl_mobspawners.ru.tr b/mods/ITEMS/mcl_mobspawners/locale/mcl_mobspawners.ru.tr index c018167c0..3074e83ce 100644 --- a/mods/ITEMS/mcl_mobspawners/locale/mcl_mobspawners.ru.tr +++ b/mods/ITEMS/mcl_mobspawners/locale/mcl_mobspawners.ru.tr @@ -1,5 +1,5 @@ # textdomain: mcl_mobspawners -Mob Spawner=Спаунер (порождатель) мобов -A mob spawner regularily causes mobs to appear around it while a player is nearby. Some mob spawners are disabled while in light.=Спаунер постоянно вызывает появление мобов вокруг себя, пока поблизости находится игрок. Некоторые спаунеры отключаются под действием света. -If you have a spawn egg, you can use it to change the mob to spawn. Just place the item on the mob spawner. Player-set mob spawners always spawn mobs regardless of the light level.=Если у вас есть порождающее яйцо, вы можете использовать его, чтобы выбрать моба, который будет появляться. Просто поместите этот предмет на спаунер. Настроенные игроками спаунеры работают всегда, независимо от уровня освещения. +Mob Spawner=Спаунер мобов +A mob spawner regularily causes mobs to appear around it while a player is nearby. Some mob spawners are disabled while in light.=Спаунер постоянно создает мобов вокруг себя, пока поблизости находится игрок. Некоторые спаунеры отключаются под действием света. +If you have a spawn egg, you can use it to change the mob to spawn. Just place the item on the mob spawner. Player-set mob spawners always spawn mobs regardless of the light level.=Если у вас есть яйцо спауна, вы можете использовать его, чтобы выбрать моба, который будет появляться. Просто используйте яйцо на спаунере. Настроенные игроками спаунеры работают всегда, независимо от уровня освещения. Makes mobs appear=Создаёт мобов diff --git a/mods/ITEMS/mcl_monster_eggs/locale/mcl_monster_eggs.ru.tr b/mods/ITEMS/mcl_monster_eggs/locale/mcl_monster_eggs.ru.tr index 6902b610f..a196ac306 100644 --- a/mods/ITEMS/mcl_monster_eggs/locale/mcl_monster_eggs.ru.tr +++ b/mods/ITEMS/mcl_monster_eggs/locale/mcl_monster_eggs.ru.tr @@ -1,9 +1,9 @@ # textdomain: mcl_monster_eggs -An infested block is a block from which a silverfish will pop out when it is broken. It looks identical to its normal counterpart.=Блок с икрой - это блок, из которого вылетает чешуйница, если его сломать. Выглядит идентично своему обычному аналогу. -Infested Stone=Камень с икрой -Infested Cobblestone=Булыжник с икрой -Infested Stone Bricks=Каменные блоки с икрой -Infested Cracked Stone Bricks=Треснутые каменные блоки с икрой -Infested Mossy Stone Bricks=Мшистый каменный блок с икрой -Infested Chiseled Stone Bricks=Точёный каменный блок с икрой -Hides a silverfish=Скрывает чешуйницу +An infested block is a block from which a silverfish will pop out when it is broken. It looks identical to its normal counterpart.=Заражённый блок это блок, после добычи которого из него появляется чешуйница. Блок выглядит идентично своему нормальному варианту. +Infested Stone=Заражённый камень +Infested Cobblestone=Заражённый булыжник +Infested Stone Bricks=Заражённые каменные кирпичи +Infested Cracked Stone Bricks=Заражённые треснутые каменные кирпичи +Infested Mossy Stone Bricks=Заражённые замшелые каменные кирпичи +Infested Chiseled Stone Bricks=Заражённые резные каменные кирпичи +Hides a silverfish=Прячет в себе чешуйницу \ No newline at end of file diff --git a/mods/ITEMS/mcl_mud/locale/mcl_mud.ru.tr b/mods/ITEMS/mcl_mud/locale/mcl_mud.ru.tr new file mode 100644 index 000000000..305a32bf5 --- /dev/null +++ b/mods/ITEMS/mcl_mud/locale/mcl_mud.ru.tr @@ -0,0 +1,7 @@ +# textdomain: mcl_mud +Mud=Грязь +Mud is a decorative block that generates in mangrove swamps. Mud can also be obtained by using water bottles on dirt or coarse dirt.=Декоративный блок генерирующийся в мангровых болотах. Также может быть получена использовав пузырёк воды на земле или каменистой земле. +Packed Mud=Уплотнённая грязь +Packed mud is a decorative block used to craft mud bricks.=Декоративный блок. Используется для создания саманных кирпичей. +Mud Bricks=Саманные кирпичи +Decorative block crafted from packed mud.=Декоративный блок, созданный из уплотнённой грязи. \ No newline at end of file diff --git a/mods/ITEMS/mcl_mushrooms/locale/mcl_mushrooms.ru.tr b/mods/ITEMS/mcl_mushrooms/locale/mcl_mushrooms.ru.tr index ba3cb171e..32c6c107e 100644 --- a/mods/ITEMS/mcl_mushrooms/locale/mcl_mushrooms.ru.tr +++ b/mods/ITEMS/mcl_mushrooms/locale/mcl_mushrooms.ru.tr @@ -1,24 +1,24 @@ # textdomain: mcl_mushrooms -This decorative block is like a huge mushroom stem, but with the stem texture on all sides.=Этот декоративный блок похож на огромную ножку гриба, но имеет структуру ножки с каждой стороны. -Huge red mushroom blocks are the cap parts of huge red mushrooms. It consists of a red skin and can have pores on each of its sides.=Блоки огромных красных грибов это части шляпок огромных красных грибов. Они состоят из красной кожицы и могут иметь поры на каждой стороне. -The stem part of a huge red mushroom.=Часть ножки огромного красного гриба. -Huge Red Mushroom Block=Блок огромного красного гриба -Huge Red Mushroom Stem=Ножка огромного красного гриба -Huge Red Mushroom All-Faces Stem=Многоликая ножка огромного красного гриба -Huge brown mushroom blocks are the cap parts of huge brown mushrooms. It consists of a brown skin and can have pores on each of its sides.=Блоки огромных коричневых грибов это части шляпок огромных коричневых грибов. Они состоят из коричневой кожицы и могут иметь поры на каждой стороне. -The stem part of a huge brown mushroom.=Часть ножки огромного коричневого гриба. -Huge Brown Mushroom Block=Блок огромного коричневого гриба -Huge Brown Mushroom Stem=Ножка огромного коричневого гриба -Huge Brown Mushroom All-Faces Stem=Многоликая ножка огромного коричневого гриба -Brown mushrooms are fungi which grow and spread in darkness, but are sensitive to light. They are inedible as such, but they can be used to craft food items.=Коричневые грибы растут в темноте, но чувствительны к свету. Они несъедобны как таковые, но их можно использовать для приготовления продуктов питания. -Red mushrooms are fungi which grow and spread in darkness, but are sensitive to light. They are inedible as such, but they can be used to craft food items.=Красные грибы растут в темноте, но чувствительны к свету. Они несъедобны как таковые, но их можно использовать для приготовления продуктов питания. -A single mushroom of this species will slowly spread over time towards a random solid opaque block with a light level of 12 or lower in a 3×3×3 cube around the mushroom. It stops spreading when there are 5 or more mushrooms of the same species within an area of 9×3×9 blocks around the mushroom.=Одиночный гриб этого вида со временем будет медленно распространяться в направлении случайного твердого непрозрачного блока при уровне освещённости 12 и ниже пределах куба 3×3×3 вокруг себя. Он перестает распространяться, когда будет уже 5 и более грибов одного и того же вида на участке 9×3×9 блоков вокруг гриба. -Mushrooms will eventually uproot at a light level of 12 or higher. On mycelium or podzol, they survive and spread at any light level.=Грибы вымирают при уровне света 12 и выше. Но на мицелии и подзоле они выживают и распространяются при любом уровне освещенности. -This mushroom can be placed on mycelium and podzol at any light level. It can also be placed on blocks which are both solid and opaque, as long as the light level at daytime is not higher than 12.=Этот гриб можно высадить на мицелий и подзол при любом уровне света. Его также можно размещать на плотных непрозрачных блоках, если уровень освещенности в дневное время не превышает 12. +This decorative block is like a huge mushroom stem, but with the stem texture on all sides.=Этот декоративный блок похож на большую ножку гриба, но имеет текстуру ножки с каждой стороны. +Huge red mushroom blocks are the cap parts of huge red mushrooms. It consists of a red skin and can have pores on each of its sides.=Блоки больших красных грибов это части шляпок больших красных грибов. Они состоят из красной кожицы и могут иметь поры на каждой стороне. +The stem part of a huge red mushroom.=Часть ножки большого красного гриба. +Huge Red Mushroom Block=Блок большого красного гриба +Huge Red Mushroom Stem=Ножка большого красного гриба +Huge Red Mushroom All-Faces Stem=Всесторонняя ножка большого красного гриба +Huge brown mushroom blocks are the cap parts of huge brown mushrooms. It consists of a brown skin and can have pores on each of its sides.=Блоки больших коричневых грибов это части шляпок больших коричневых грибов. Они состоят из коричневой кожицы и могут иметь поры на каждой стороне. +The stem part of a huge brown mushroom.=Часть ножки большого коричневого гриба. +Huge Brown Mushroom Block=Блок большого коричневого гриба +Huge Brown Mushroom Stem=Ножка большого коричневого гриба +Huge Brown Mushroom All-Faces Stem=Всесторонняя ножка большого коричневого гриба +Brown mushrooms are fungi which grow and spread in darkness, but are sensitive to light. They are inedible as such, but they can be used to craft food items.=Коричневые грибы растут в темноте, но чувствительны к свету. Они несъедобны как таковые, но их можно использовать для приготовления съедобных продуктов. +Red mushrooms are fungi which grow and spread in darkness, but are sensitive to light. They are inedible as such, but they can be used to craft food items.=Красные грибы растут в темноте, но чувствительны к свету. Они несъедобны как таковые, но их можно использовать для приготовления съедобных продуктов. +A single mushroom of this species will slowly spread over time towards a random solid opaque block with a light level of 12 or lower in a 3×3×3 cube around the mushroom. It stops spreading when there are 5 or more mushrooms of the same species within an area of 9×3×9 blocks around the mushroom.=Одиночный гриб этого вида со временем будет медленно распространяться в направлении случайного твёрдого непрозрачного блока при уровне освещённости 12 и ниже, в пределах куба 3×3×3 вокруг себя. Он перестает распространяться, когда будет уже 5 и более грибов одного и того же вида на участке 9×3×9 блоков вокруг гриба. +Mushrooms will eventually uproot at a light level of 12 or higher. On mycelium or podzol, they survive and spread at any light level.=Грибы погибают при уровне света 12 и выше. Но на мицелии и подзоле они выживают и распространяются при любом уровне освещенности. +This mushroom can be placed on mycelium and podzol at any light level. It can also be placed on blocks which are both solid and opaque, as long as the light level at daytime is not higher than 12.=Этот гриб можно высадить на мицелий и подзол при любом уровне света. Его также можно размещать на твёрдых непрозрачных блоках, если уровень освещенности в дневное время не превышает 12. Brown Mushroom=Коричневый гриб Red Mushroom=Красный гриб -Mushroom Stew=Грибная похлёбка -Mushroom stew is a healthy soup which can be consumed to restore some hunger points.=Грибная похлёбка - это полезный суп, который можно употребить в пищу для восстановления нескольких очков голода. -By placing huge mushroom blocks of the same species next to each other, the sides that touch each other will turn into pores permanently.=Если поместить блоки огромных грибов одного и того же вида рядом друг с другом, стороны, которыми они соприкасаются друг с другом, сразу превратятся в поры. -Grows on podzol, mycelium and other blocks=Растёт на подзолах, мицелии и других блоках +Mushroom Stew=Тушёные грибы +Mushroom stew is a healthy soup which can be consumed to restore some hunger points.=Тушёные грибы это полезный суп, который можно употребить в пищу для восстановления нескольких очков голода. +By placing huge mushroom blocks of the same species next to each other, the sides that touch each other will turn into pores permanently.=Если поместить блоки больших грибов одного и того же вида рядом друг с другом, стороны, которыми они соприкасаются друг с другом, сразу превратятся в поры. +Grows on podzol, mycelium and other blocks=Растёт на подзоле, мицелии и других блоках Spreads in darkness=Распространяется в темноте diff --git a/mods/ITEMS/mcl_nether/locale/mcl_nether.ru.tr b/mods/ITEMS/mcl_nether/locale/mcl_nether.ru.tr index f546d16ca..8f440cfb3 100644 --- a/mods/ITEMS/mcl_nether/locale/mcl_nether.ru.tr +++ b/mods/ITEMS/mcl_nether/locale/mcl_nether.ru.tr @@ -1,40 +1,46 @@ # textdomain: mcl_nether -Glowstone=Светящийся камень -Glowstone is a naturally-glowing block which is home to the Nether.=Светящийся камень это природный источник света, блок, встречающийся в Аду. +Glowstone=Светокамень +Glowstone is a naturally-glowing block which is home to the Nether.=Светокамень это природный светящийся блок, встречающийся в Незере. Nether Quartz Ore=Кварцевая руда -Nether quartz ore is an ore containing nether quartz. It is commonly found around netherrack in the Nether.=Кварцевая руда это порода, содержащая адский кварц. Часто встречается в Аду вокруг адского камня. +Nether quartz ore is an ore containing nether quartz. It is commonly found around netherrack in the Nether.=Кварцевая руда это порода, содержащая кварц. Часто встречается в Незере вокруг незерита. Netherrack=Адский камень -Netherrack is a stone-like block home to the Nether. Starting a fire on this block will create an eternal fire.=Адский камень это блок, выглядящий как камень, домом которого является Ад. Разжигание огня на этом блоке создаст вечный огонь. +Netherrack is a stone-like block home to the Nether. Starting a fire on this block will create an eternal fire.=Адский камень это блок, выглядящий как камень, домом которого является Незер. Разжигание огня на этом блоке создаст вечный огонь. Magma Block=Блок магмы -Magma blocks are hot solid blocks which hurt anyone standing on it, unless they have fire resistance. Starting a fire on this block will create an eternal fire.=Блоки магмы это горячие твёрдые блоки, причиняющие боль тем, кто на них стоит, если у них нет защиты от огня. Разжигание огня на таком блоке создаст вечный огонь. +Magma blocks are hot solid blocks which hurt anyone standing on it, unless they have fire resistance. Starting a fire on this block will create an eternal fire.=Блоки магмы это горячие твёрдые блоки, причиняющие урон тем, кто на них стоит, если у них нет защиты от огня. Разжигание огня на таком блоке создаст вечный огонь. @1 stood too long on a magma block.=@1 слишком долго стоял(а) на магмовом блоке. Soul Sand=Песок душ -Soul sand is a block from the Nether. One can only slowly walk on soul sand. The slowing effect is amplified when the soul sand is on top of ice, packed ice or a slime block.=Песок душ это блок из Ада. Идти по нему можно только медленно. Замедляющий эффект усиливается, если песок душ лежит на льду, упакованном льду или блоке слизи. +Soul sand is a block from the Nether. One can only slowly walk on soul sand. The slowing effect is amplified when the soul sand is on top of ice, packed ice or a slime block.=Песок душ это блок из Незера. Идти по нему можно только медленно. Замедляющий эффект усиливается, если песок душ стоит на льду, плотном льду или блоке слизи. Nether Brick Block=Блок адского кирпича -Red Nether Brick Block=Красный блок адского кирпича +Red Nether Brick Block=Блок красного адского кирпича Nether Wart Block=Блок адского нароста -A nether wart block is a purely decorative block made from nether wart.=Блок адского нароста это чисто декоративный блок, сделанный из адского нароста. +A nether wart block is a purely decorative block made from nether wart.=Блок адского нароста это декоративный блок, сделанный из адского нароста. Block of Quartz=Кварцевый блок -Chiseled Quartz Block=Точёный кварцевый блок -Pillar Quartz Block=Кварцевый столб +Chiseled Quartz Block=Резной кварцевый блок +Pillar Quartz Block=Кварцевая колонна Smooth Quartz=Гладкий кварц -Glowstone Dust=Светящаяся пыль -Glowstone dust is the dust which comes out of broken glowstones. It is mainly used in crafting.=Светящаяся пыль это пыль, которая получается из сломанного светящегося камня. -Nether Quartz=Адский кварц -Nether quartz is a versatile crafting ingredient.=Адский кварц это универсальный ингредиент для крафтинга. +Glowstone Dust=Светопыль +Glowstone dust is the dust which comes out of broken glowstones. It is mainly used in crafting.=Светопыль это пыль, которая получается из сломанного светящегося камня. +Nether Quartz=Кварц +Nether quartz is a versatile crafting ingredient.=Кварц это универсальный материал для крафта. Nether Brick=Адский кирпич -Nether bricks are the main crafting ingredient for crafting nether brick blocks and nether fences.=Адские кирпичи это главный ингредиент для создания блоков адских кирпичей. +Nether bricks are the main crafting ingredient for crafting nether brick blocks and nether fences.=Адские кирпичи это главный материал для создания блоков адских кирпичей. Nether Lava Source=Адский источник лавы Flowing Nether Lava=Текущая адская лава Premature Nether Wart (Stage 1)=Саженец адского нароста (стадия 1) -A premature nether wart has just recently been planted on soul sand. Nether wart slowly grows on soul sand in 4 stages (the second and third stages look identical). Although nether wart is home to the Nether, it grows in any dimension.=Саженец адского нароста был недавно высажен на песке душ. Его медленный рост происходит 4 стадии (вторая и третья стадии неотличимы на глаз). Хотя домом адского нароста является Ад, он растёт в любом измерении. +A premature nether wart has just recently been planted on soul sand. Nether wart slowly grows on soul sand in 4 stages (the second and third stages look identical). Although nether wart is home to the Nether, it grows in any dimension.=Саженец адского нароста был недавно посажен на песке душ. Его медленный рост происходит 4 стадии (вторая и третья стадии неотличимы на глаз). Хотя домом адского нароста является Ад, он растёт в любом измерении. Premature Nether Wart (Stage 2)=Саженец адского нароста (стадия 2) Premature Nether Wart (Stage 3)=Саженец адского нароста (стадия 3) Mature Nether Wart=Зрелый адский нарост -The mature nether wart is a plant from the Nether and reached its full size and won't grow any further. It is ready to be harvested for its items.=Зрелый адский нарост это растение Ада, достигшее своего полного размера, дальше расти оно уже не будет. Оно готово к сбору в качестве предметов. +The mature nether wart is a plant from the Nether and reached its full size and won't grow any further. It is ready to be harvested for its items.=Зрелый адский нарост это растение Незера, достигшее своего полного размера, дальше расти оно уже не будет. Оно готово к сбору в качестве предметов. Nether Wart=Адский нарост -Nether warts are plants home to the Nether. They can be planted on soul sand and grow in 4 stages.=Адские наросты это растения, домом которых является Ад. Их можно высаживать на песке душ, и они растут в 4 стадии. -Place this item on soul sand to plant it and watch it grow.=Поместите этот предмет на песок душ, чтобы посадить его и наблюдать за его ростом. +Nether warts are plants home to the Nether. They can be planted on soul sand and grow in 4 stages.=Адские наросты это растения, домом которых является Незер. Их можно высаживать на песке душ, и они растут в 4 стадии. +Place this item on soul sand to plant it and watch it grow.=Поместите этот предмет на песок душ, чтобы посадить его для выращивания. Burns your feet=Обжигает ваши ноги Grows on soul sand=Растёт на песке душ Reduces walking speed=Уменьшает скорость ходьбы +Netherite Scrap=Незеритовый скрап +Netherite Ingot=Незеритовый слиток +Ancient Debris=Древние обломки +Ancient debris can be found in the nether and is very very rare.=Древние обломки можно очень редко найти в Незере +Netherite Block=Незеритовый блок +Netherite block is very hard and can be made of 9 netherite ingots.=Незеритовый блок очень крепкий. Может быть создан из 9 незеритовых слитков. diff --git a/mods/ITEMS/mcl_ocean/locale/mcl_ocean.ru.tr b/mods/ITEMS/mcl_ocean/locale/mcl_ocean.ru.tr index e7e5a12e3..d3d5d2db4 100644 --- a/mods/ITEMS/mcl_ocean/locale/mcl_ocean.ru.tr +++ b/mods/ITEMS/mcl_ocean/locale/mcl_ocean.ru.tr @@ -1,59 +1,59 @@ # textdomain: mcl_ocean -Sea Lantern=Морской светильник -Sea lanterns are decorative light sources which look great underwater but can be placed anywhere.=Морской светильник это декоративный источник света. Он отлично смотрится под водой, но размещать его можно в любых местах. +Sea Lantern=Морской фонарь +Sea lanterns are decorative light sources which look great underwater but can be placed anywhere.=Морской фонарь это декоративный источник света. Он отлично смотрится под водой, но размещать его можно в любых местах. Prismarine=Призмарин -Prismarine is used as a building block. It slowly changes its color.=Призмарин хорош как строительный блок. Он медленно меняет свой цвет. +Prismarine is used as a building block. It slowly changes its color.=Призмарин это строительный блок. Он медленно меняет свой цвет. Prismarine Bricks=Призмариновые кирпичи Dark Prismarine=Тёмный призмарин -Prismarine Crystals=Призмариновые кристаллы +Prismarine Crystals=Призмариновый кристалл Prismarine Shard=Осколок призмарина Dried Kelp=Сушёная ламинария -Dried Kelp Block=Блок сухой ламинарии -Brain Coral Block=Блок мозгового коралла -Brain Coral Fan=Вентилятор мозгового коралла +Dried Kelp Block=Блок сушёной ламинарии +Brain Coral Block=Мозговой коралловый блок +Brain Coral Fan=Мозговой веерный коралл Brain Coral=Мозговой коралл -Bubble Coral Block=Блок пузыристого коралла -Bubble Coral Fan=Вентилятор пузыристого коралла -Bubble Coral=Пузыристый коралл -Fire Coral Block=Блок огненного коралла -Fire Coral Fan=Вентилятор огненного коралла +Bubble Coral Block=Пузырчатый коралловый блок +Bubble Coral Fan=Пузырчатый веерный коралл +Bubble Coral=Пузырчатый коралл +Fire Coral Block=Огненный коралловый блок +Fire Coral Fan=Огненный веерный коралл Fire Coral=Огненный коралл -Horn Coral Block=Блок рожкового коралла -Horn Coral Fan=Вентилятор рожкового коралла -Horn Coral=Рожковый коралл -Tube Coral Block=Блок трубного коралла -Tube Coral Fan=Вентилятор трубного коралла -Tube Coral=Трубный коралл -Dead Brain Coral Block=Блок мёртвого мозгового коралла -Dead Brain Coral Fan=Вентилятор мёртвого мозгового коралла +Horn Coral Block=Роговый коралловый блок +Horn Coral Fan=Роговый веерный коралл +Horn Coral=Роговый коралл +Tube Coral Block=Трубчатый коралловый блок +Tube Coral Fan=Трубчатый веерный коралл +Tube Coral=Трубчатый коралл +Dead Brain Coral Block=Мёртвый мозговой коралловый блок +Dead Brain Coral Fan=Мёртвый веерный мозговой коралл Dead Brain Coral=Мёртвый мозговой коралл -Dead Bubble Coral Block=Блок мёртвого пузыристого коралла -Dead Bubble Coral Fan=Вентилятор мёртвого пузыристого коралла -Dead Bubble Coral=Мёртвый пузыристый коралл -Dead Fire Coral Block=Блок мёртвого огненного коралла -Dead Fire Coral Fan=Вентилятор мёртвого огненного коралла +Dead Bubble Coral Block=Мёртвый пузырчатый коралловый блок +Dead Bubble Coral Fan=Мёртвый веерный пузырчатый коралл +Dead Bubble Coral=Мёртвый пузырчатый коралл +Dead Fire Coral Block=Мёртвый огненный коралловый блок +Dead Fire Coral Fan=Мёртвый веерный огненный коралл Dead Fire Coral=Мёртвый огненный коралл -Dead Horn Coral Block=Блок мёртвого рожкового коралла -Dead Horn Coral Fan=Вентилятор мёртвого рожкового коралла -Dead Horn Coral=Мёртвый рожковый коралл -Dead Tube Coral Block=Блок мёртвого трубного коралла -Dead Tube Coral Fan=Вентилятор мёртвого трубного коралла -Dead Tube Coral=Мёртвый трубный коралл +Dead Horn Coral Block=Мёртвый роговый коралловый блок +Dead Horn Coral Fan=Мёртвый веерный роговый коралл +Dead Horn Coral=Мёртвый роговый коралл +Dead Tube Coral Block=Мёртвый трубчатый коралловый блок +Dead Tube Coral Fan=Мёртвый веерный трубчатый коралл +Dead Tube Coral=Мёртвый трубчатый коралл Seagrass=Водоросли Kelp=Ламинария -Kelp grows inside water on top of dirt, sand or gravel.=Водоросли растут в воде поверх грязи, песка или гравия. +Kelp grows inside water on top of dirt, sand or gravel.=Ламинария растет под водой на земле, песке или гравии. Coral blocks live in the oceans and need a water source next to them to survive. Without water, they die off.=Коралловые блоки живут в океанах и нуждаются в источниках воды рядом с ними, чтобы выжить. Без воды они умирают. -Corals grow on top of coral blocks and need to be inside a water source to survive. Without water, it will die off, as well as the coral block below.=Кораллы растут на вершинах коралловых блоков и должны быть внутри источника воды, чтобы жить. Без воды они умирают, как и коралловые блоки внизу. -Corals fans grow on top of coral blocks and need to be inside a water source to survive. Without water, it will die off, as well as the coral block below.=Кораллов вентиляторы растут на вершинах коралловых блоков и должны быть внутри источника воды, чтобы выжить. Без воды они умирают, как и коралловые блоки внизу. -Seagrass grows inside water on top of dirt, sand or gravel.=Водоросли растут в воде поверх грязи, песка или гравия. +Corals grow on top of coral blocks and need to be inside a water source to survive. Without water, it will die off, as well as the coral block below.=Кораллы растут на коралловых блоках и должны быть внутри источника воды, чтобы жить. Без воды они умирают, как и коралловые блоки внизу. +Corals fans grow on top of coral blocks and need to be inside a water source to survive. Without water, it will die off, as well as the coral block below.=Веерные кораллы растут на коралловых блоках и должны быть внутри источника воды, чтобы выжить. Без воды они умирают, как и коралловые блоки внизу. +Seagrass grows inside water on top of dirt, sand or gravel.=Водоросли растут под водой на земле, песке или гравии. A decorative block that serves as a great furnace fuel.=Декоративный блок, служащий отличным топливом для печи. -Dried kelp is a food item.=Сушеная ламинария - это продуктовый предмет. +Dried kelp is a food item.=Сушёная ламинария это съедобный продукт. Grows on coral block of same species=Растет на коралловом блоке того же вида Needs water to live=Нуждается в воде, чтобы жить -Grows in water on dirt, sand, gravel=Растёт в воде на грязи, песке, гравии +Grows in water on dirt, sand, gravel=Растёт под водой на земле, песке, гравии Glows in the water=Светится в воде 4 possible sizes=4 возможных размера -Grows on dead brain coral block=Растёт на блоке мёртвого коралла +Grows on dead brain coral block=Растёт на блоке мёртвого мозгового коралла Sea Pickle=Морской огурец -Sea pickles grow on dead brain coral blocks and provide light when underwater. They come in 4 sizes that vary in brightness.=Морские огурцы растут на мертвых коралловых блоках и дают свет под водой. Они бывают четырёх размеров, которые различаются по яркости. -It can only be placed on top of dead brain coral blocks. Placing a sea pickle on another sea pickle will make it grow and brighter.=Это можно помещать только на верхушку блока мертвого мозгового коралла. Помещение морского огурца на другой морской огурец приведёт к тому, что он вырастет и станет ярче. +Sea pickles grow on dead brain coral blocks and provide light when underwater. They come in 4 sizes that vary in brightness.=Морские огурцы растут на мертвых мозговых коралловых блоках и излучают свет под водой. Они бывают четырёх размеров, которые отличаются яркостью. +It can only be placed on top of dead brain coral blocks. Placing a sea pickle on another sea pickle will make it grow and brighter.=Морской огурец можно помещать только на мёртвый мозговой коралловый блок. Помещение морского огурца на другой морской огурец приведёт к тому, что он вырастет и станет светить ярче. diff --git a/mods/ITEMS/mcl_portals/locale/mcl_portals.de.tr b/mods/ITEMS/mcl_portals/locale/mcl_portals.de.tr index 58478faa4..52408ef95 100644 --- a/mods/ITEMS/mcl_portals/locale/mcl_portals.de.tr +++ b/mods/ITEMS/mcl_portals/locale/mcl_portals.de.tr @@ -1,5 +1,6 @@ # textdomain: mcl_portals End Portal=Endportal +Used to construct end portals=Benutzt zur Konstruktion von Endportalen An End portal teleports creatures and objects to the mysterious End dimension (and back!).=Ein Endportal teleportiert Kreaturen und Objekte zur mysteriösen Ende-Dimension (und wieder zurück!). Hop into the portal to teleport. Entering an End portal in the Overworld teleports you to a fixed position in the End dimension and creates a 5×5 obsidian platform at your destination. End portals in the End will lead back to your spawn point in the Overworld.=Springen Sie ins Portal, um sich zu teleportieren. Von der Oberwelt aus werden Sie zu einer festen Position im Ende hin teleportiert. Eine 5×5-Obsidianplattform wird am Zielort erzeugt. Im Ende werden Sie zurück zu Ihrem Startpunkt in der Oberwelt teleportiert. End Portal Frame=Endportalrahmen @@ -7,13 +8,14 @@ End portal frames are used in the construction of End portals. Each block has a NOTE: The End dimension is currently incomplete and might change in future versions.=ANMERKUNG: Die Ende-Dimension ist momentan unfertig und könnte sich in künftigen Versionen ändern. To create an End portal, you need 12 end portal frames and 12 eyes of ender. The end portal frames have to be arranged around a horizontal 3×3 area with each block facing inward. Any other arrangement will fail.=Um ein Endportal zu bauen, brauchen sie 12 Endportalrahmen und 12 Enderaugen. Die Endportalrahmenblöcke muss um ein horizontales Feld von 3×3 platziert sein, wobei jeder von ihnen nach innen zeigt. Jede andere Anordnung wird nicht funktionieren. Place an eye of ender into each block. The end portal appears in the middle after placing the final eye.=Platzieren Sie ein Enderauge in jeden Block. Das Endportal wird sich in der Mitte öffnen, wenn das letzte Auge platziert wurde. +Once placed, an eye of ender can not be taken back.=Sobald platziert, kann ein Enderauge nicht mehr zurück genommen werden. End Portal Frame with Eye of Ender=Endportalrahmen mit Enderauge +End Gateway Portal= +Used to construct end gateway portals= +An End gateway portal teleports creatures and objects to the outer End (and back!).= +Throw an ender pearl into the portal to teleport. Entering an Gateway portal near the Overworld teleports you to the outer End. At this destination another gateway portal will be constructed, which you can use to get back.= Nether Portal=Netherportal A Nether portal teleports creatures and objects to the hot and dangerous Nether dimension (and back!). Enter at your own risk!=Ein Netherportal teleportiert Kreaturen und Objekte zur heißen und gefährlichen Nether-Dimension (und zurück!). Betreten auf eigene Gefahr! Stand in the portal for a moment to activate the teleportation. Entering a Nether portal for the first time will also create a new portal in the other dimension. If a Nether portal has been built in the Nether, it will lead to the Overworld. A Nether portal is destroyed if the any of the obsidian which surrounds it is destroyed, or if it was caught in an explosion.=Stellen Sie sich ins Portal für einen Moment, um sich zu teleportieren. Beim ersten Mal wird auch ein Portal in der anderen Dimension erschaffen. Wenn ein Netherportal im Nether gebaut wird, wird es zurück zur Oberwelt führen. Ein Netherportal wird zerstört, wenn das Obsidian, das ihn umgibt, zerstört wird, oder, wenn es einer Explosion ausgesetzt war. Obsidian is also used as the frame of Nether portals.=Obsidian wird auch als Rahmen von Netherportalen benutzt. To open a Nether portal, place an upright frame of obsidian with a width of at least 4 blocks and a height of 5 blocks, leaving only air in the center. After placing this frame, light a fire in the obsidian frame. Nether portals only work in the Overworld and the Nether.=Um ein Netherportal zu öffnen, platzieren Sie einen aufrechten Rahmen aus Obsidian mit einer Breite von mindestens 4 Blöcken und einer Höhe von mindestens 5 Blöcken, nur mit Luft in der Mitte. Nachdem Sie den Rahmen gebaut haben, entfachen Sie ein Feuer im Obsidianrahmen. Netherportale funktionieren nur in der Oberwelt und im Nether. -Once placed, an eye of ender can not be taken back.=Sobald platziert, kann ein Enderauge nicht mehr zurück genommen werden. -Used to construct end portals=Benutzt zur Konstruktion von Endportalen -Liquid container=Flüssigkeitsbehälter -No effect=Keine Wirkung diff --git a/mods/ITEMS/mcl_portals/locale/mcl_portals.es.tr b/mods/ITEMS/mcl_portals/locale/mcl_portals.es.tr index 5f8509026..49964bd69 100644 --- a/mods/ITEMS/mcl_portals/locale/mcl_portals.es.tr +++ b/mods/ITEMS/mcl_portals/locale/mcl_portals.es.tr @@ -1,5 +1,6 @@ # textdomain: mcl_portals End Portal=Portal del End +Used to construct end portals= An End portal teleports creatures and objects to the mysterious End dimension (and back!).=Un portal final teletransporta criaturas y objetos a la misteriosa dimensión final (¡y viceversa!). Hop into the portal to teleport. Entering an End portal in the Overworld teleports you to a fixed position in the End dimension and creates a 5×5 obsidian platform at your destination. End portals in the End will lead back to your spawn point in the Overworld.=Salta al portal para teletransportarte. Entrar en un portal final en el Overworld te teletransporta a una posición fija en la dimensión final y crea una plataforma de obsidiana 5 × 5 en tu destino. Los portales finales en el final lo llevarán de regreso a su punto de generación en el mundo terrenal End Portal Frame=Marco de portal del End @@ -7,13 +8,14 @@ End portal frames are used in the construction of End portals. Each block has a NOTE: The End dimension is currently incomplete and might change in future versions.=NOTA: El portal del end está actualmente incompleto y puede cambiar en futuras versiones. To create an End portal, you need 12 end portal frames and 12 eyes of ender. The end portal frames have to be arranged around a horizontal 3×3 area with each block facing inward. Any other arrangement will fail.=Para crear un portal final, necesita 12 marcos de portal final y 12 ojos de ender. Los marcos del portal final deben estar dispuestos alrededor de un área horizontal de 3 × 3 con cada bloque mirando hacia adentro. Cualquier otro arreglo fallará. Place an eye of ender into each block. The end portal appears in the middle after placing the final eye.=Coloque un ojo de ender en cada bloque. El portal final aparece en el medio después de colocar el ojo final. +Once placed, an eye of ender can not be taken back.=Una vez colocado, un ojo de ender no puede ser retirado. End Portal Frame with Eye of Ender=Marco de portal del End con ojo de ender +End Gateway Portal= +Used to construct end gateway portals= +An End gateway portal teleports creatures and objects to the outer End (and back!).= +Throw an ender pearl into the portal to teleport. Entering an Gateway portal near the Overworld teleports you to the outer End. At this destination another gateway portal will be constructed, which you can use to get back.= Nether Portal=Portal del Nether A Nether portal teleports creatures and objects to the hot and dangerous Nether dimension (and back!). Enter at your own risk!=Un portal Nether teletransporta criaturas y objetos a la dimensión Nether ardiente y peligrosa (¡y viceversa!). ¡Entra bajo tu propio riesgo! Stand in the portal for a moment to activate the teleportation. Entering a Nether portal for the first time will also create a new portal in the other dimension. If a Nether portal has been built in the Nether, it will lead to the Overworld. A Nether portal is destroyed if the any of the obsidian which surrounds it is destroyed, or if it was caught in an explosion.=SPárate en el portal por un momento para activar la teletransportación. Entrar en un portal Nether por primera vez también creará un nuevo portal en la otra dimensión. Si se ha construido un portal Nether en Nether, conducirá al Overworld. Un portal abisal se destruye si se destruye cualquiera de las obsidianas que lo rodean, o si quedó atrapado en una explosión. Obsidian is also used as the frame of Nether portals.=La obsidiana también se usa como marco de portal del End. To open a Nether portal, place an upright frame of obsidian with a width of at least 4 blocks and a height of 5 blocks, leaving only air in the center. After placing this frame, light a fire in the obsidian frame. Nether portals only work in the Overworld and the Nether.= -Once placed, an eye of ender can not be taken back.=Una vez colocado, un ojo de ender no puede ser retirado. - -#OUTDATED: -#To open a Nether portal, place an upright frame of obsidian with a width of 4 blocks and a height of 5 blocks, leaving only air in the center. After placing this frame, light a fire in the obsidian frame. Nether portals only work in the Overworld and the Nether.=Para abrir un portal Nether, coloque un marco vertical de obsidiana con un ancho de 4 bloques y una altura de 5 bloques, dejando solo aire en el centro. Después de colocar este marco, enciende un fuego en el marco de obsidiana. Los portales de Nether solo funcionan en Overworld y Nether. diff --git a/mods/ITEMS/mcl_portals/locale/mcl_portals.fr.tr b/mods/ITEMS/mcl_portals/locale/mcl_portals.fr.tr index 714075502..72e939785 100644 --- a/mods/ITEMS/mcl_portals/locale/mcl_portals.fr.tr +++ b/mods/ITEMS/mcl_portals/locale/mcl_portals.fr.tr @@ -1,15 +1,21 @@ # textdomain: mcl_portals End Portal=Portail de l'End +Used to construct end portals=Utilisé pour construire des portails de l'End An End portal teleports creatures and objects to the mysterious End dimension (and back!).=Un portail de l'End téléporte des créatures et des objets dans la mystérieuse dimension de l'End (et vice-versa !). Hop into the portal to teleport. Entering an End portal in the Overworld teleports you to a fixed position in the End dimension and creates a 5×5 obsidian platform at your destination. End portals in the End will lead back to your spawn point in the Overworld.=Sautez dans le portail pour vous téléporter. Entrer dans un portail de l'End dans l'Overworld vous téléporte à une position fixe dans la dimension de l'End et crée une plate-forme d'obsidienne 5×5 à votre destination. Les portails de l'End dans l'End vous ramèneront à votre point d'apparition dans l'Overworld. End Portal Frame=Cadre de portail de l'End End portal frames are used in the construction of End portals. Each block has a socket for an eye of ender.=Les portails de l'End sont utilisés dans la construction de portails de l'End. Chaque bloc a une prise pour un œil d'Ender. NOTE: The End dimension is currently incomplete and might change in future versions.=REMARQUE : la dimension de l'End est actuellement incomplète et pourrait changer dans les futures versions. +To create an End portal, you need 12 end portal frames and 12 eyes of ender. The end portal frames have to be arranged around a horizontal 3×3 area with each block facing inward. Any other arrangement will fail.= +Place an eye of ender into each block. The end portal appears in the middle after placing the final eye.= +Once placed, an eye of ender can not be taken back.=Une fois placé, un œil d'Ender ne peut pas être repris. End Portal Frame with Eye of Ender=Cadre de portail de l'End avec œil d'Ender +End Gateway Portal= +Used to construct end gateway portals= +An End gateway portal teleports creatures and objects to the outer End (and back!).= +Throw an ender pearl into the portal to teleport. Entering an Gateway portal near the Overworld teleports you to the outer End. At this destination another gateway portal will be constructed, which you can use to get back.= Nether Portal=Portail du Nether A Nether portal teleports creatures and objects to the hot and dangerous Nether dimension (and back!). Enter at your own risk!=Un portail du Nether téléporte des créatures et des objets dans la chaude et dangereuse dimension du Nether (et vice-versa !). Entrez à vos risques et périls ! Stand in the portal for a moment to activate the teleportation. Entering a Nether portal for the first time will also create a new portal in the other dimension. If a Nether portal has been built in the Nether, it will lead to the Overworld. A Nether portal is destroyed if the any of the obsidian which surrounds it is destroyed, or if it was caught in an explosion.=Tenez-vous un instant dans le portail pour activer la téléportation. Entrer pour la première fois sur un portail Nether créera également un nouveau portail dans l'Overworld. Si un portail du Nether a été construit dans le Nether, il mènera à l'Overworld. Un portail du Nether est détruit si l'une des obsidiennes qui l'entourent est détruite, ou s'il a été pris dans une explosion. Obsidian is also used as the frame of Nether portals.=L'obsidienne est aussi utilisée comme cadre des portails du Nether. To open a Nether portal, place an upright frame of obsidian with a width of at least 4 blocks and a height of 5 blocks, leaving only air in the center. After placing this frame, light a fire in the obsidian frame. Nether portals only work in the Overworld and the Nether.=Pour ouvrir un portail du Nether, placez un cadre vertical d'obsidienne d'une largeur d'au moins 4 blocs et d'une hauteur de 5 blocs, ne laissant que de l'air au centre. Après avoir placé ce cadre, allumez un feu dans le cadre d'obsidienne. Les portails du Nether ne fonctionnent que dans l'Overworld et le Nether. -Once placed, an eye of ender can not be taken back.=Une fois placé, un œil d'Ender ne peut pas être repris. -Used to construct end portals=Utilisé pour construire des portails de l'End diff --git a/mods/ITEMS/mcl_portals/locale/mcl_portals.ja.tr b/mods/ITEMS/mcl_portals/locale/mcl_portals.ja.tr index aea984691..8daeb9bfc 100644 --- a/mods/ITEMS/mcl_portals/locale/mcl_portals.ja.tr +++ b/mods/ITEMS/mcl_portals/locale/mcl_portals.ja.tr @@ -1,15 +1,21 @@ # textdomain: mcl_portals End Portal=エンドポータル +Used to construct end portals=エンドポータルの構築に使用 An End portal teleports creatures and objects to the mysterious End dimension (and back!).=エンドポータルは、生物や物を不可思議なエンドの次元にテレポートさせます(また戻ってくる事も可能)。 Hop into the portal to teleport. Entering an End portal in the Overworld teleports you to a fixed position in the End dimension and creates a 5×5 obsidian platform at your destination. End portals in the End will lead back to your spawn point in the Overworld.=ポータルに飛び込むとテレポート。(オーバーワールドにあるエンドポータルに入ると、エンド次元の固定位置にテレポートし、目的地に5×5の黒曜石のプラットフォームが作成されます。そのエンドポータルに入れば、オーバーワールドのスポーン地点に戻れます) End Portal Frame=エンドポータル・フレーム End portal frames are used in the construction of End portals. Each block has a socket for an eye of ender.=エンドポータル・フレームは、エンダーアイを入れるソケットがあり、エンドポータルの構築に使われます。 NOTE: The End dimension is currently incomplete and might change in future versions.=注:エンド次元は現在未完成であり、将来のバージョンで変更される可能性があります。 +To create an End portal, you need 12 end portal frames and 12 eyes of ender. The end portal frames have to be arranged around a horizontal 3×3 area with each block facing inward. Any other arrangement will fail.= +Place an eye of ender into each block. The end portal appears in the middle after placing the final eye.= +Once placed, an eye of ender can not be taken back.=エンダーアイは、一度置くと取り戻せません。 End Portal Frame with Eye of Ender=エンドポータル・フレーム(エンダーアイ入り) +End Gateway Portal= +Used to construct end gateway portals= +An End gateway portal teleports creatures and objects to the outer End (and back!).= +Throw an ender pearl into the portal to teleport. Entering an Gateway portal near the Overworld teleports you to the outer End. At this destination another gateway portal will be constructed, which you can use to get back.= Nether Portal=ネザーポータル A Nether portal teleports creatures and objects to the hot and dangerous Nether dimension (and back!). Enter at your own risk!=ネザーポータルは、生物や物を熱くて危険なネザー次元にテレポートさせます(また戻ってくる事も可能)。入るのは自己責任で! Stand in the portal for a moment to activate the teleportation. Entering a Nether portal for the first time will also create a new portal in the other dimension. If a Nether portal has been built in the Nether, it will lead to the Overworld. A Nether portal is destroyed if the any of the obsidian which surrounds it is destroyed, or if it was caught in an explosion.=ポータルの中でしばらく立っていると、テレポートが有効になります。初めて入った時は、異次元の方にも新たなポータルが作られます(それはオーバーワールドに通じています)。ネザーポータルは、それを囲む黒曜石のどれかが破壊されたり、爆発に巻き込まれたりすると壊れます。 Obsidian is also used as the frame of Nether portals.=黒曜石は、ネザーポータルの枠組としても使われます。 To open a Nether portal, place an upright frame of obsidian with a width of at least 4 blocks and a height of 5 blocks, leaving only air in the center. After placing this frame, light a fire in the obsidian frame. Nether portals only work in the Overworld and the Nether.=ネザーポータルを開くには、まず黒曜石で直立した枠組を構築します(幅4ブロック以上、高さ5ブロック以上。内側は中空にして黒曜石を配置)。その後、枠の中に火をつけます。ネザーポータルは、オーバーワールドとネザーでしか使えません。 -Once placed, an eye of ender can not be taken back.=エンダーアイは、一度置くと取り戻せません。 -Used to construct end portals=エンドポータルの構築に使用 diff --git a/mods/ITEMS/mcl_portals/locale/mcl_portals.pl.tr b/mods/ITEMS/mcl_portals/locale/mcl_portals.pl.tr index 18d9b4b7b..4263f6085 100644 --- a/mods/ITEMS/mcl_portals/locale/mcl_portals.pl.tr +++ b/mods/ITEMS/mcl_portals/locale/mcl_portals.pl.tr @@ -1,15 +1,21 @@ # textdomain: mcl_portals End Portal=Portal Kresu +Used to construct end portals=Używane do konstrukcji portali Kresu An End portal teleports creatures and objects to the mysterious End dimension (and back!).=Portal Kresu teleportuje osoby i rzeczy do tajemniczego wymiaru Kresu (i z powrotem!). Hop into the portal to teleport. Entering an End portal in the Overworld teleports you to a fixed position in the End dimension and creates a 5×5 obsidian platform at your destination. End portals in the End will lead back to your spawn point in the Overworld.=Wskocz do portalu by się teleportować. Wejście do portalu Kresu na Powierzchni przeniesie cię do ustalonej pozycji w wymiarze Kresu i tworzy obsydianową platformę 5×5 w tym miejscu. Portal Kresu w Kresie przeniesie cię do twojego miejsca odradzania. End Portal Frame=Rama portalu Kresu End portal frames are used in the construction of End portals. Each block has a socket for an eye of ender.=Ramy portalu Kresu są wykorzystywane do konstrukcji portali Kresu. Każdy blok ma miejsce na oko Kresu. NOTE: The End dimension is currently incomplete and might change in future versions.=UWAGA: Wymiar Kresu jest aktualnie nieukończony i może się zmienić w przyszłych wersjach. +To create an End portal, you need 12 end portal frames and 12 eyes of ender. The end portal frames have to be arranged around a horizontal 3×3 area with each block facing inward. Any other arrangement will fail.= +Place an eye of ender into each block. The end portal appears in the middle after placing the final eye.= +Once placed, an eye of ender can not be taken back.=Raz umieszczone oko Kresu nie może być odzyskane End Portal Frame with Eye of Ender=Rama portalu Kresu z okiem Kresu. +End Gateway Portal= +Used to construct end gateway portals= +An End gateway portal teleports creatures and objects to the outer End (and back!).= +Throw an ender pearl into the portal to teleport. Entering an Gateway portal near the Overworld teleports you to the outer End. At this destination another gateway portal will be constructed, which you can use to get back.= Nether Portal=Portal Netheru A Nether portal teleports creatures and objects to the hot and dangerous Nether dimension (and back!). Enter at your own risk!=Portal Netheru teleportuje osoby i obiekty do gorącego i niebezpiecznego wymiaru Nether (i z powrotem!). Wejdź na własne ryzyko! Stand in the portal for a moment to activate the teleportation. Entering a Nether portal for the first time will also create a new portal in the other dimension. If a Nether portal has been built in the Nether, it will lead to the Overworld. A Nether portal is destroyed if the any of the obsidian which surrounds it is destroyed, or if it was caught in an explosion.=Stań w portalu na krótki moment aby aktywować teleport. Wejście przez portal Netheru po raz pierwszy stworzy również nowy portal w drugim wymiarze. Jeśli portal Netheru został zbudowany w Netherze będzie prowadził z powrotem na Powierzchnię. Portal Netheru przestanie działać jeśli któryś z otaczających go bloków obsydianu zostanie zniszczony lub gdy dosięgnie go wybuch. Obsidian is also used as the frame of Nether portals.=Obsydian jest również wykorzystywany do budowania portali Netheru. To open a Nether portal, place an upright frame of obsidian with a width of at least 4 blocks and a height of 5 blocks, leaving only air in the center. After placing this frame, light a fire in the obsidian frame. Nether portals only work in the Overworld and the Nether.=Aby otworzyć portal Netheru umieść ramę z obsydianu o szerokości co najmniej 4 i wysokości 5 bloków, zostawiając tylko powietrze wewnątrz. Po postawieniu tej ramy rozpal ogień wewnątrz ramy. Portale Netheru działają tylko w Netherze i na Powierzchni. -Once placed, an eye of ender can not be taken back.=Raz umieszczone oko Kresu nie może być odzyskane -Used to construct end portals=Używane do konstrukcji portali Kresu diff --git a/mods/ITEMS/mcl_portals/locale/mcl_portals.ru.tr b/mods/ITEMS/mcl_portals/locale/mcl_portals.ru.tr index 8b6310793..bc6b224f1 100644 --- a/mods/ITEMS/mcl_portals/locale/mcl_portals.ru.tr +++ b/mods/ITEMS/mcl_portals/locale/mcl_portals.ru.tr @@ -1,15 +1,21 @@ # textdomain: mcl_portals -End Portal=Портал Предела -An End portal teleports creatures and objects to the mysterious End dimension (and back!).=Портал Предела телепортирует создания и объекты в загадочное измерение Предел (и обратно!) -Hop into the portal to teleport. Entering an End portal in the Overworld teleports you to a fixed position in the End dimension and creates a 5×5 obsidian platform at your destination. End portals in the End will lead back to your spawn point in the Overworld.=Прыгайте в портал, чтобы телепортироваться. Вход в портал Предела в Верхнем мире телепортирует вас в определённое место в измерении Предела и создаёт обсидиановую платформу 5×5 в пункте вашего назначения. Портал предела в Пределе перебросит вас в вашу точку возрождения в Верхнем мире. -End Portal Frame=Рамка портала Предела -End portal frames are used in the construction of End portals. Each block has a socket for an eye of ender.=Рамка портала Предела используется для построения порталов Предела. Каждый блок имеет отсек для ока Предела. -NOTE: The End dimension is currently incomplete and might change in future versions.=Предупреждение: Измерение Предел в данный момент не завершено и может измениться в будущих версиях. -End Portal Frame with Eye of Ender=Рамка портала Предела с оком Предела +End Portal=Портал Края +Used to construct end portals=Используется для создания порталов Края +An End portal teleports creatures and objects to the mysterious End dimension (and back!).=Портал Края телепортирует существ и объекты в загадочное измерение Края (и обратно!) +Hop into the portal to teleport. Entering an End portal in the Overworld teleports you to a fixed position in the End dimension and creates a 5×5 obsidian platform at your destination. End portals in the End will lead back to your spawn point in the Overworld.=Прыгайте в портал, чтобы телепортироваться. Портал Края в Верхнем мире телепортирует вас в определённое место в измерении Края и создаёт обсидиановую платформу 5×5 в пункте вашего назначения. Портал Края в измерении Края телепортирует вас в вашу точку возрождения в Верхнем мире. +End Portal Frame=Рамка портала Края +End portal frames are used in the construction of End portals. Each block has a socket for an eye of ender.=Рамка портала Края используется для построения порталов Края. Каждый блок имеет слот для ока Края. +NOTE: The End dimension is currently incomplete and might change in future versions.=Предупреждение: Измерение Края в данный момент не завершено и может измениться в будущих версиях. +To create an End portal, you need 12 end portal frames and 12 eyes of ender. The end portal frames have to be arranged around a horizontal 3×3 area with each block facing inward. Any other arrangement will fail.=Чтобы создать портал Края, вам нужны 12 рамок портала Края и 12 ок Края. Рамки портала устанавливаются горизонтально 3×3 с каждым блоком лицом вовнутрь. Любая другая структура ничего не даст. +Place an eye of ender into each block. The end portal appears in the middle after placing the final eye.=Поставьте око Края в каждый блок. Портал Края появится по середине после установки последнего ока. +Once placed, an eye of ender can not be taken back.=Размещенное око Края нельзя забрать обратно. +End Portal Frame with Eye of Ender=Рамка портала Края с оком Края +End Gateway Portal=Врата Края +Used to construct end gateway portals=Используется для постройки врат Края +An End gateway portal teleports creatures and objects to the outer End (and back!).=Врата Края телепортируют мобов и объекты во внешний Край (и обратно!). +Throw an ender pearl into the portal to teleport. Entering an Gateway portal near the Overworld teleports you to the outer End. At this destination another gateway portal will be constructed, which you can use to get back.=Киньте жемчуг Края в портал чтобы телепортироваться. Войдя во портал врат рядом с Верхним миром, вы телепортируетесь во внешний Край. На месте прибытия появится еще одни врата, которые перенесут вас обратно. Nether Portal=Адский портал -A Nether portal teleports creatures and objects to the hot and dangerous Nether dimension (and back!). Enter at your own risk!=Адский портал переносит создания и объекты в горячее и опасное измерение Ад (и обратно!). Используйте на свой страх и риск! -Stand in the portal for a moment to activate the teleportation. Entering a Nether portal for the first time will also create a new portal in the other dimension. If a Nether portal has been built in the Nether, it will lead to the Overworld. A Nether portal is destroyed if the any of the obsidian which surrounds it is destroyed, or if it was caught in an explosion.=Стойте в портале несколько секунд для запуска телепортации. Вход в портал Ада в первый раз приведёт к созданию аналогичного портала в другом измерении. Если Адский портал создан в Аду, он ведёт в Верхний мир. Портал Ада уничтожается, если уничтожается любой блок обсидиана из окружающих его, либо при задевании взрывом. -Obsidian is also used as the frame of Nether portals.=Обсидиан также используется в качестве рамки портала Ада -To open a Nether portal, place an upright frame of obsidian with a width of at least 4 blocks and a height of 5 blocks, leaving only air in the center. After placing this frame, light a fire in the obsidian frame. Nether portals only work in the Overworld and the Nether.=Чтобы открыть портал Ада, постройте рамку из обсидиана шириной не менее 4 блоков и высото не менее 5, оставляя в центре лишь воздух. После создания обсидиановой рамки зажгите в ней огонь. Адские порталы работают только в Верхнем мире и в Аду. -Once placed, an eye of ender can not be taken back.=Однажды размещённое, око Предела нельзя взять обратно. -Used to construct end portals=Используется для создания порталов Предела +A Nether portal teleports creatures and objects to the hot and dangerous Nether dimension (and back!). Enter at your own risk!=Адский портал переносит создания и объекты в горячее и опасное измерение Незера (и обратно!). Используйте на свой страх и риск! +Stand in the portal for a moment to activate the teleportation. Entering a Nether portal for the first time will also create a new portal in the other dimension. If a Nether portal has been built in the Nether, it will lead to the Overworld. A Nether portal is destroyed if the any of the obsidian which surrounds it is destroyed, or if it was caught in an explosion.=Стойте в портале несколько секунд для запуска телепортации. Вход в портал Незера в первый раз приведёт к созданию аналогичного портала в другом измерении. Если Адский портал создан в Незере, он приведёт в Верхний мир. Адский портал уничтожается, если уничтожается любой блок обсидиана из окружающих его, либо при задевании взрывом. +Obsidian is also used as the frame of Nether portals.=Обсидиан также используется в качестве рамки Адского портала +To open a Nether portal, place an upright frame of obsidian with a width of at least 4 blocks and a height of 5 blocks, leaving only air in the center. After placing this frame, light a fire in the obsidian frame. Nether portals only work in the Overworld and the Nether.=Чтобы открыть Адский портал, постройте рамку из обсидиана шириной не менее 4 блоков и высотой не менее 5, оставляя в центре рамки лишь воздух. После создания обсидиановой рамки зажгите в ней огонь. Адские порталы работают только в Верхнем мире и в Незере. diff --git a/mods/ITEMS/mcl_portals/locale/mcl_portals.zh_TW.tr b/mods/ITEMS/mcl_portals/locale/mcl_portals.zh_TW.tr index a6b389036..7d1031459 100644 --- a/mods/ITEMS/mcl_portals/locale/mcl_portals.zh_TW.tr +++ b/mods/ITEMS/mcl_portals/locale/mcl_portals.zh_TW.tr @@ -1,15 +1,21 @@ # textdomain: mcl_portals End Portal=終界傳送門 +Used to construct end portals=用於建造終界傳送門 An End portal teleports creatures and objects to the mysterious End dimension (and back!).=終界傳送門用於將生物和實體到達終末之界(或回來!)。 Hop into the portal to teleport. Entering an End portal in the Overworld teleports you to a fixed position in the End dimension and creates a 5×5 obsidian platform at your destination. End portals in the End will lead back to your spawn point in the Overworld.=跳入傳送門進行傳送。進入終界傳送門會將你傳送到終界的一個固定位置,並在你的目的地創建一個5×5的黑曜石平台。終界的傳送門會將你帶回你在主界的出生點。 End Portal Frame=終界傳送門框架 End portal frames are used in the construction of End portals. Each block has a socket for an eye of ender.=終界傳送門框架用於建造終界傳送門。每個框架都有一個插座,用於放置終界之眼。 NOTE: The End dimension is currently incomplete and might change in future versions.=注意:終界目前還不完整,在未來的版本中可能會有變化。 +To create an End portal, you need 12 end portal frames and 12 eyes of ender. The end portal frames have to be arranged around a horizontal 3×3 area with each block facing inward. Any other arrangement will fail.= +Place an eye of ender into each block. The end portal appears in the middle after placing the final eye.= +Once placed, an eye of ender can not be taken back.=在擺放後,終界之眼無法再取回。 End Portal Frame with Eye of Ender=含終界之眼的終界傳送門框架 +End Gateway Portal= +Used to construct end gateway portals= +An End gateway portal teleports creatures and objects to the outer End (and back!).= +Throw an ender pearl into the portal to teleport. Entering an Gateway portal near the Overworld teleports you to the outer End. At this destination another gateway portal will be constructed, which you can use to get back.= Nether Portal=地獄傳送門 A Nether portal teleports creatures and objects to the hot and dangerous Nether dimension (and back!). Enter at your own risk!=地獄傳送門將生物和實體傳送到炎熱和危險的地獄(或回來!)。進入後風險自負! Stand in the portal for a moment to activate the teleportation. Entering a Nether portal for the first time will also create a new portal in the other dimension. If a Nether portal has been built in the Nether, it will lead to the Overworld. A Nether portal is destroyed if the any of the obsidian which surrounds it is destroyed, or if it was caught in an explosion.=在傳送門中站立片刻以激活傳送。第一次進入地獄傳送門也會在另一維度創建一個新的傳送門。如果在地獄建立了地獄傳送門,它將會通​​向主世界。如果圍繞著它的任何黑曜石被毀壞,或者它被捲入一場爆炸,地獄傳送門就會被破壞。 Obsidian is also used as the frame of Nether portals.=黑曜石也被用來作為地獄傳送門的框架。 To open a Nether portal, place an upright frame of obsidian with a width of at least 4 blocks and a height of 5 blocks, leaving only air in the center. After placing this frame, light a fire in the obsidian frame. Nether portals only work in the Overworld and the Nether.=要打開地獄傳送門,需要放置一個直立的黑曜石框架,寬度至少為4塊,高度為5塊,中間只留有空氣。放置這個框架後,在黑曜石框架中點火。地獄傳送門只在主世界上和地獄起作用。 -Once placed, an eye of ender can not be taken back.=在擺放後,終界之眼無法再取回。 -Used to construct end portals=用於建造終界傳送門 diff --git a/mods/ITEMS/mcl_portals/locale/template.txt b/mods/ITEMS/mcl_portals/locale/template.txt index 21f5e21f8..5a154a698 100644 --- a/mods/ITEMS/mcl_portals/locale/template.txt +++ b/mods/ITEMS/mcl_portals/locale/template.txt @@ -1,15 +1,21 @@ # textdomain: mcl_portals End Portal= +Used to construct end portals= An End portal teleports creatures and objects to the mysterious End dimension (and back!).= Hop into the portal to teleport. Entering an End portal in the Overworld teleports you to a fixed position in the End dimension and creates a 5×5 obsidian platform at your destination. End portals in the End will lead back to your spawn point in the Overworld.= End Portal Frame= End portal frames are used in the construction of End portals. Each block has a socket for an eye of ender.= NOTE: The End dimension is currently incomplete and might change in future versions.= +To create an End portal, you need 12 end portal frames and 12 eyes of ender. The end portal frames have to be arranged around a horizontal 3×3 area with each block facing inward. Any other arrangement will fail.= +Place an eye of ender into each block. The end portal appears in the middle after placing the final eye.= +Once placed, an eye of ender can not be taken back.= End Portal Frame with Eye of Ender= +End Gateway Portal= +Used to construct end gateway portals= +An End gateway portal teleports creatures and objects to the outer End (and back!).= +Throw an ender pearl into the portal to teleport. Entering an Gateway portal near the Overworld teleports you to the outer End. At this destination another gateway portal will be constructed, which you can use to get back.= Nether Portal= A Nether portal teleports creatures and objects to the hot and dangerous Nether dimension (and back!). Enter at your own risk!= Stand in the portal for a moment to activate the teleportation. Entering a Nether portal for the first time will also create a new portal in the other dimension. If a Nether portal has been built in the Nether, it will lead to the Overworld. A Nether portal is destroyed if the any of the obsidian which surrounds it is destroyed, or if it was caught in an explosion.= Obsidian is also used as the frame of Nether portals.= To open a Nether portal, place an upright frame of obsidian with a width of at least 4 blocks and a height of 5 blocks, leaving only air in the center. After placing this frame, light a fire in the obsidian frame. Nether portals only work in the Overworld and the Nether.= -Once placed, an eye of ender can not be taken back.= -Used to construct end portals= diff --git a/mods/ITEMS/mcl_potions/locale/mcl_potions.ru.tr b/mods/ITEMS/mcl_potions/locale/mcl_potions.ru.tr index 2bc4380ec..e97d89593 100644 --- a/mods/ITEMS/mcl_potions/locale/mcl_potions.ru.tr +++ b/mods/ITEMS/mcl_potions/locale/mcl_potions.ru.tr @@ -1,75 +1,75 @@ # textdomain: mcl_potions - []=<эффект> <длительность> [<фактор>] + []=<эффект> <длительность> [<сила>] -Add a status effect to yourself. Arguments: : name of status effect, e.g. poison. : duration in seconds. : effect strength multiplier (1 @= 100%)=Добавляет вам эффект состояния. Параметры: <эффект> - название эффекта состояния, например, poison (отравление). <Длительность> - длительность в секундах. <Фактор> - коэффициент силы эффекта (1 @= 100%) +Add a status effect to yourself. Arguments: : name of status effect, e.g. poison. : duration in seconds. : effect strength multiplier (1 @= 100%)=Добавляет вам эффект. Параметры: <эффект> - название эффекта , например, poison. <Длительность> - длительность в секундах. <Сила> - коэффициент силы эффекта (1 @= 100%) Missing effect parameter!=Отсутствует параметр эффекта! Missing or invalid duration parameter!=Отсутствует либо неправильно задан параметр длительности! -Invalid factor parameter!=Отсутствует параметр фактора! -@1 is not an available status effect.=@1 не является допустимым эффектом состояния. -Fermented Spider Eye=Прокисший паучий глаз -Glass Bottle=Стеклянная бутылка +Invalid factor parameter!=Отсутствует параметр силы! +@1 is not an available status effect.=@1 не является допустимым эффектом. +Fermented Spider Eye=Приготовленный паучий глаз +Glass Bottle=Пузырёк Liquid container=Контейнер для жидкостей -A glass bottle is used as a container for liquids and can be used to collect water directly.=Стеклянная бутылка используется для хранения жидкостей, её также можно использовать для сбора воды. +A glass bottle is used as a container for liquids and can be used to collect water directly.=Стеклянный пузырёк используется для хранения жидкостей, её также можно использовать для сбора воды. -To collect water, use it on a cauldron with water (which removes a level of water) or any water source (which removes no water).=Воду в бутылку можно набрать из котла с помощью команды [Использовать] (это уменьшает уровень воды в котле) или из другого источника (уровень которого не уменьшится). +To collect water, use it on a cauldron with water (which removes a level of water) or any water source (which removes no water).=Воду в пузырёк можно набрать из котла (это уменьшает уровень воды в котле) или из другого источника (уровень которого не уменьшится). -Water Bottle=Бутылка с водой -Water bottles can be used to fill cauldrons. Drinking water has no effect.=Бутылки с водой можно использовать для наполнения котлов. Выпивание воды не даст никакого эффекта. +Water Bottle=Пузырёк с водой +Water bottles can be used to fill cauldrons. Drinking water has no effect.=Пузырёк с водой можно использовать для наполнения котла. Выпивание воды не даст никакого эффекта. -Use the “Place” key to drink. Place this item on a cauldron to pour the water into the cauldron.=Используйте клавишу “Разместить”, чтобы выпить это. Поместите этот предмет на котёл, чтобы вылить воду в котёл. +Use the “Place” key to drink. Place this item on a cauldron to pour the water into the cauldron.=Используйте правую кнопку мыши, чтобы выпить. Используйте этот предмет на котле, чтобы вылить воду в котёл. -River Water Bottle=Бутылка с речной водой -River water bottles can be used to fill cauldrons. Drinking it has no effect.=Бутылки с речной водой можно использовать для наполнения котлов. Выпивание воды не даст никакого эффекта. +River Water Bottle=Пузырёк с речной водой +River water bottles can be used to fill cauldrons. Drinking it has no effect.=Пузырёк с речной водой можно использовать для наполнения котла. Выпивание воды не даст никакого эффекта. -Use the “Place” key to drink. Place this item on a cauldron to pour the river water into the cauldron.=Используйте клавишу “Разместить”, чтобы выпить это. Поместите этот предмет на котёл, чтобы вылить речную воду в котёл. +Use the “Place” key to drink. Place this item on a cauldron to pour the river water into the cauldron.=Используйте правую кнопку мыши, чтобы выпить. Используйте этот предмет на котле, чтобы вылить речную воду в котёл. -Splash Water Bottle=Бутылка со взрывающейся водой +Splash Water Bottle=Взрывное зелье Extinguishes fire and hurts some mobs=Тушит огонь и ранит некоторых мобов -A throwable water bottle that will shatter on impact, where it extinguishes nearby fire and hurts mobs that are vulnerable to water.=Бутылка с водой, которую можно метать. Она разбивается при ударе, тушит ближайший огонь и ранит мобов, уязвимых к воде. +A throwable water bottle that will shatter on impact, where it extinguishes nearby fire and hurts mobs that are vulnerable to water.=Пузырёк с водой, который можно метать. Он разбивается при ударе, тушит ближайший огонь и ранит мобов, уязвимых к воде. -Lingering Water Bottle=Бутылка с оседающей водой +Lingering Water Bottle=Туманное зелье -A throwable water bottle that will shatter on impact, where it creates a cloud of water vapor that lingers on the ground for a while. This cloud extinguishes fire and hurts mobs that are vulnerable to water.=Бутылка с водой, которую можно метать. Она разбивается при ударе, образуя облако пара, которое оседает на землю через некоторое время. Это облако тушит огонь и ранит мобов, уязвимых к воде. +A throwable water bottle that will shatter on impact, where it creates a cloud of water vapor that lingers on the ground for a while. This cloud extinguishes fire and hurts mobs that are vulnerable to water.=Пузырёк с водой, который можно метать. Он разбивается при ударе, образуя облако пара, которое оседает на землю через некоторое время. Это облако тушит огонь и ранит мобов, уязвимых к воде. -Glistering Melon=Искрящаяся дыня +Glistering Melon=Сверкающий ломтик арбуза -This shiny melon is full of tiny gold nuggets and would be nice in an item frame. It isn't edible and not useful for anything else.=Искрящаяся дыня полна маленьких золотых самородков и может отлично смотреться в рамке. Она несъедобна и не годится больше ни для чего. +This shiny melon is full of tiny gold nuggets and would be nice in an item frame. It isn't edible and not useful for anything else.=Сверкающий ломтик арбуза содержит в себе золотые самородки и может отлично смотреться в рамке. Ломтик не съедобен. A throwable potion that will shatter on impact, where it creates a magic cloud that lingers around for a while. Any player or mob inside the cloud will receive the potion's effect, possibly repeatedly.=Зелье, которое можно метать. При ударе оно разбивается, создавая волшебное облако, которое задерживается на некоторое время. Любой игрок или моб внутри облака получит эффект зелья, возможно, неоднократно. -Use the “Punch” key to throw it.=Нажмите [Ударить] для метания. -Use the “Place” key to drink it.=Нажмите [Разместить] для выпивания. -Drinking a potion gives you a particular effect.=Выпивание зелья даёт вам особый эффект. +Use the “Punch” key to throw it.=Нажмите [Ударить], чтобы бросить. +Use the “Place” key to drink it.=Нажмите [Использовать], чтобы выпить. +Drinking a potion gives you a particular effect.=Выпивание зелья даёт вам определённый эффект. 1 HP/@1s | @2=1 HP/@1с | @2 @1 HP=@1 HP @1 Potion=Зелье @1 -Splash @1 Potion=Взрывающееся зелье @1 -Lingering @1 Potion=Оседающее зелье @1 +Splash @1 Potion=Взрывное зелье @1 +Lingering @1 Potion=Туманное зелье @1 Arrow of @1=Стрела @1 II= II IV= IV @1 Potion@2=Зелье @1 @2 -Splash @1@2 Potion=Взрывающееся зелье @1@2 -Lingering @1@2 Potion=Оседающее зелье @1@2 +Splash @1@2 Potion=Взрывное зелье @1@2 +Lingering @1@2 Potion=Туманное зелье @1@2 Arrow of @1@2=Стрела @1@2 @1 + Potion=Зелье @1+ -Splash @1 + Potion=Взрывающееся зелье @1+ -Lingering @1 + Potion=Оседающее зелье @1+ +Splash @1 + Potion=Взрывное зелье @1+ +Lingering @1 + Potion=Туманное зелье @1+ Arrow of @1 +=Стрела @1+ -Awkward Potion=Невкусное зелье -Awkward Splash Potion=Невкусное взрывающееся зелье -Awkward Lingering Potion=Невкусное оседающее зелье +Awkward Potion=Грубое зелье +Awkward Splash Potion=Взрывное грубое зелье +Awkward Lingering Potion=Туманное грубое зелье Has an awkward taste and is used for brewing potions.=Имеет неприятный вкус и используется для приготовления других зелий. -Mundane Potion=Успокоительное зелье -Mundane Splash Potion=Успокоительное взрывающееся зелье -Mundane Lingering Potion=Успокоительное оседающее зелье +Mundane Potion=Непримечательное зелье +Mundane Splash Potion=Взрывное непримечательное взрывное зелье +Mundane Lingering Potion=Туманное непримечательное зелье Has a terrible taste and is not useful for brewing potions.=Имеет отвратительный вкус и используется для приготовления других зелий. Thick Potion=Густое зелье -Thick Splash Potion=Густое взрывающееся зелье -Thick Lingering Potion=Густое оседающее зелье +Thick Splash Potion=Взрывное густое зелье +Thick Lingering Potion=Туманное густое зелье Has a bitter taste and is not useful for brewing potions.=Имеет горький вкус и используется для приготовления других зелий. Dragon's Breath=Дыхание дракона @@ -78,14 +78,14 @@ This item is used in brewing and can be combined with splash potions to create l Healing=исцеления +4 HP=+4 HP +8 HP=+8 HP -Instantly heals.=Лечит мгновенно +Instantly heals.=Мгновенно исцеляет. Harming=урона -6 HP=-6 HP -12 HP=-12 HP -Instantly deals damage.=Вызывает мгновенную смерть. +Instantly deals damage.=Наносит мгновенный урон. Night Vision=ночного зрения -Increases the perceived brightness of light under a dark sky.=Усиливает восприятие яркости освещения под тёмным небом. -Swiftness=ускорения +Increases the perceived brightness of light under a dark sky.=Усиливает восприятие яркости освещения в тёмных местах. +Swiftness=стремительности Increases walking speed.=Увеличивает скорость ходьбы Slowness=замедления Decreases walking speed.=Уменьшает скорость ходьбы @@ -93,24 +93,22 @@ Leaping=прыгучести Increases jump strength.=Увеличивает силу прыжка Poison=отравления Applies the poison effect which deals damage at a regular interval.=Наносит эффект яда, который вызывает урон через равные промежутки времени. -Regeneration=восстановления +Regeneration=регенерации Regenerates health over time.=Восстанавливает здоровье со временем. Invisibility=невидимости Grants invisibility.=Делает невидимым. Water Breathing=подводного дыхания -Grants limitless breath underwater.=Даёт возможность неограниченно дышать под водой. +Grants limitless breath underwater.=Даёт возможность дышать под водой. Fire Resistance=огнестойкости Grants immunity to damage from heat sources like fire.=Делает невосприимчивым к урону от источников тепла, например, от огня. -Weakness=Слабость -Weakness +=Слабость + -Strength=Сила -Strength II=Сила II -Strength +=Сила + +Weakness=слабости+ +Weakness +=слабости+ +Strength=силы +Strength II=силы II +Strength +=силы+ Try different combinations to create potions.=Пробуйте разные сочетания для приготовления зелий. -No effect=Не оказывает эффекта - -A throwable potion that will shatter on impact, where it gives all nearby players and mobs a status effect.=Зелье, которое можно метать. Оно разбивается при ударе и он дает всем ближайшим игрокам и мобам эффект состояния. - -This particular arrow is tipped and will give an effect when it hits a player or mob.=Эта необычная стрела с обработанным наконечником даёт эффект при попадании в игрока или моба. +No effect=без эффекта +A throwable potion that will shatter on impact, where it gives all nearby players and mobs a status effect.=Метательное зелье разобьется при столкновении и даст ближайшим игрокам и мобам эффект. +This particular arrow is tipped and will give an effect when it hits a player or mob.=Эта обмакнутая в зелье стрела даёт эффект при попадании в игрока или моба. diff --git a/mods/ITEMS/mcl_raw_ores/locale/mcl_raw_ores.ru.tr b/mods/ITEMS/mcl_raw_ores/locale/mcl_raw_ores.ru.tr new file mode 100644 index 000000000..0b31319b9 --- /dev/null +++ b/mods/ITEMS/mcl_raw_ores/locale/mcl_raw_ores.ru.tr @@ -0,0 +1,9 @@ +# textdomain: mcl_raw_ores +Raw Iron=Необработанное железо +Raw Gold=Необработанное золото +Raw iron. Mine an iron ore to get it.=Необработанное железо. Добудьте железную руду, чтобы получить это. +Raw gold. Mine a gold ore to get it.=Необработанное золото. Добудьте золотую руду, чтобы получить это. +Block of Raw Iron=Блок необработанного железа +Block of Raw Gold=Блок необработанного золота +A block of raw iron is mostly a decorative block but also useful as a compact storage of raw iron.=Блок необработанного железа. Декоративный блок, но также подходит для компактного хранения необработанного железа. +A block of raw gold is mostly a decorative block but also useful as a compact storage of raw gold.=Блок необработанного золота. Декоративный блок, но также подходит для компактного хранения необработанного золота. \ No newline at end of file diff --git a/mods/ITEMS/mcl_sculk/locale/mcl_sculk.ru.tr b/mods/ITEMS/mcl_sculk/locale/mcl_sculk.ru.tr new file mode 100644 index 000000000..df3a4a792 --- /dev/null +++ b/mods/ITEMS/mcl_sculk/locale/mcl_sculk.ru.tr @@ -0,0 +1,7 @@ +# textdomain: mcl_sculk +Sculk=Скалк +Sculk Vein=Скалк-жила +Sculk vein.=Скалк-жила +Sculk Catalyst=Скалк-катализатор +Sculk Sensor=Скалк-сенсор +Sculk Shrieker=Скалк-крикун \ No newline at end of file diff --git a/mods/ITEMS/mcl_shields/locale/mcl_shields.ru.tr b/mods/ITEMS/mcl_shields/locale/mcl_shields.ru.tr new file mode 100644 index 000000000..bd99547d0 --- /dev/null +++ b/mods/ITEMS/mcl_shields/locale/mcl_shields.ru.tr @@ -0,0 +1,19 @@ +# textdomain: mcl_shields +Shield=Щит +A shield is a tool used for protecting the player against attacks.=Щит это инструмент, используемый для защиты игрока от атак. +White Shield=Белый щит +Grey Shield=Серый щит +Light Grey Shield=Светло-серый щит +Black Shield=Чёрный щит +Red Shield=Красный щит +Yellow Shield=Жёлтый щит +Green Shield=Зелёный щит +Cyan Shield=Бирюзовый щит +Blue Shield=Синий щит +Magenta Shield=Сиреневый щит +Orange Shield=Оранжевый щит +Purple Shield=Фиолетовый щит +Brown Shield=Коричневый щит +Pink Shield=Розовый щит +Lime Shield=Лаймовый щит +Light Blue Shield=Голубой щит diff --git a/mods/ITEMS/mcl_signs/locale/mcl_signs.ru.tr b/mods/ITEMS/mcl_signs/locale/mcl_signs.ru.tr index 279bde614..6e81a7614 100644 --- a/mods/ITEMS/mcl_signs/locale/mcl_signs.ru.tr +++ b/mods/ITEMS/mcl_signs/locale/mcl_signs.ru.tr @@ -1,18 +1,19 @@ # textdomain: mcl_signs Sign=Табличка -Signs can be written and come in two variants: Wall sign and sign on a sign post. Signs can be placed on the top and the sides of other blocks, but not below them.=На табличках можно писать. Таблички бывают двух видов: настенные и отдельно стоящие. Таблички можно размещать на верхушках и сторонах блоков, но не под блоками. -After placing the sign, you can write something on it. You have 4 lines of text with up to 15 characters for each line; anything beyond these limits is lost. Not all characters are supported. The text can not be changed once it has been written; you have to break and place the sign again. Can be colored and made to glow.=После установки таблички вы можете написать на ней что-то. Вам доступны 4 строки текста, до 15 символов в каждой; всё, что вы напишете сверх лимита, потеряется. Поддерживаются не все символы. Текст нельзя изменить. Чтобы изменить его, вам придётся сломать табличку и подписать её снова. Можно раскрасить и заставить светиться. -Enter sign text:=Текст на табличке: +Signs can be written and come in two variants: Wall sign and sign on a sign post. Signs can be placed on the top and the sides of other blocks, but not below them.=На табличках можно писать. Таблички бывают двух видов: настенные и стоящие отдельно. Таблички можно размещать сверху и сбоку на блоках, но не под блоками. +After placing the sign, you can write something on it. You have 4 lines of text with up to 15 characters for each line; anything beyond these limits is lost. Not all characters are supported. The text can not be changed once it has been written; you have to break and place the sign again. Can be colored and made to glow.=После установки таблички вы можете написать на ней что-нибудь. Вам доступны 4 строки текста, до 15 символов в каждой; всё, что вы напишете сверх лимита, потеряется. Поддерживаются не все символы. Текст на уже подписанной табличке нельзя изменить. Чтобы изменить его, вам придётся сломать табличку и подписать её снова. Может быть окрашена и подствечена. +Enter sign text:=Введите текст таблички: Maximum line length: 15=Максимальная длина строки: 15 Maximum lines: 4=Максимум строк: 4 Done=Готово -Can be written=Может быть подписана -Oak Sign=Дубовый знак -Birch Sign=Березовый знак -Spruce Sign=Ель Знак -Dark Oak Sign=Знак темного дуба -Jungle Sign=Знак джунглей -Acacia Sign=Знак акации -Mangrove Sign=Знак мангровых зарослей -Warped Hyphae Sign=Знак искривленных гиф -Crimson Hyphae Sign=Багровый знак гиф +Can be written=Можно написать текст +Oak Sign=Дубовая табличка +Birch Sign=Березовая табличка +Spruce Sign=Еловая табличка +Dark Oak Sign=Табличка из тёмного дуба +Jungle Sign=Табличка из тропического дерева +Acacia Sign=Акациевая табличка +Mangrove Sign=Мангровая табличка +Warped Hyphae Sign=Искаженная табличка +Crimson Hyphae Sign=Багровая табличка +Bamboo Sign=Бамбуковая табличка \ No newline at end of file diff --git a/mods/ITEMS/mcl_smithing_table/locale/mcl_smithing_table.ru.tr b/mods/ITEMS/mcl_smithing_table/locale/mcl_smithing_table.ru.tr new file mode 100644 index 000000000..808643f9c --- /dev/null +++ b/mods/ITEMS/mcl_smithing_table/locale/mcl_smithing_table.ru.tr @@ -0,0 +1,4 @@ +# textdomain: mcl_smithing_table +Inventory=Инвентарь +Upgrade Gear=Улучшить +Smithing table=Кузнечный стол \ No newline at end of file diff --git a/mods/ITEMS/mcl_smoker/locale/mcl_smoker.ru.tr b/mods/ITEMS/mcl_smoker/locale/mcl_smoker.ru.tr new file mode 100644 index 000000000..e65998e64 --- /dev/null +++ b/mods/ITEMS/mcl_smoker/locale/mcl_smoker.ru.tr @@ -0,0 +1,11 @@ +# textdomain: mcl_smoker +Inventory=Инвентарь +Smoker=Коптильня +Cooks food faster than furnace=Готовит еду быстрее чем обычная печь +Use the smoker to open the furnace menu.=Используйте коптильню, чтобы открыть меню печи. +Place a furnace fuel in the lower slot and the source material in the upper slot.=Положите топливо в нижний слот и материал в верхний. +The smoker will slowly use its fuel to smelt the item.=Коптильня будет медленно использовать топливо для переплавки предмета. +The result will be placed into the output slot at the right side.=Результат будет помещен в выходной слот с правой стороны. +Use the recipe book to see what foods you can smelt, what you can use as fuel and how long it will burn.=Используйте книгу рецептов, чтобы увидеть какие еду можно приготовить, что можно использовать как топливо и как долго оно будет гореть. +Smokers cook several items, mainly raw foods, into cooked foods, but twice as fast as a normal furnace.=Коптильня готовит некоторые предметы, в основном сырую еду в приготовленную, но в два раза быстрее чем обычная печь. +Burning Smoker=Горящая коптильня diff --git a/mods/ITEMS/mcl_sponges/locale/mcl_sponges.ru.tr b/mods/ITEMS/mcl_sponges/locale/mcl_sponges.ru.tr index c3b1749d6..b323abc70 100644 --- a/mods/ITEMS/mcl_sponges/locale/mcl_sponges.ru.tr +++ b/mods/ITEMS/mcl_sponges/locale/mcl_sponges.ru.tr @@ -1,10 +1,10 @@ # textdomain: mcl_sponges Sponge=Губка -Sponges are blocks which remove water around them when they are placed or come in contact with water, turning it into a wet sponge.=Губки это блоки, которые убирают воду вокруг себя, превращаясь в намокшие губки. -Waterlogged Sponge=Намокшая губка -A waterlogged sponge can be dried in the furnace to turn it into (dry) sponge. When there's an empty bucket in the fuel slot of a furnace, the water will pour into the bucket.=Намокшая губка может быть высушена в печи, тогда она превратится обратно в (сухую) губку. Если поставить пустое ведро в топливный отсек печи, это ведро наполнится водой. +Sponges are blocks which remove water around them when they are placed or come in contact with water, turning it into a wet sponge.=Губка это блок, который убирает воду вокруг себя, превращаясь в мокрую губку. +Waterlogged Sponge=Мокрая губка +A waterlogged sponge can be dried in the furnace to turn it into (dry) sponge. When there's an empty bucket in the fuel slot of a furnace, the water will pour into the bucket.=Мокрая губка может быть высушена в печи, тогда она превратится обратно в сухую губку. Если поставить пустое ведро в топливный отсек печи, это ведро наполнится водой. Riverwaterlogged Sponge=Губка с речной водой -This is a sponge soaking wet with river water. It can be dried in the furnace to turn it into (dry) sponge. When there's an empty bucket in the fuel slot of the furnace, the river water will pour into the bucket.=Это губка, пропитанная речной водой. Она может быть высушена в печи, тогда она превратится обратно в (сухую) губку. Если поставить пустое ведро в топливный отсек печи, это ведро наполнится речной водой. -A sponge becomes riverwaterlogged (instead of waterlogged) if it sucks up more river water than (normal) water.=Губка становится губкой с речной водой, если она втягивает в себя больше речной воды, чем обыкновенной. -Removes water on contact=Убирает воду при контакте +This is a sponge soaking wet with river water. It can be dried in the furnace to turn it into (dry) sponge. When there's an empty bucket in the fuel slot of the furnace, the river water will pour into the bucket.=Это губка, пропитанная речной водой. Она может быть высушена в печи, тогда она превратится обратно в сухую губку. Если поставить пустое ведро в топливный отсек печи, это ведро наполнится речной водой. +A sponge becomes riverwaterlogged (instead of waterlogged) if it sucks up more river water than (normal) water.=Губка становится мокрой губкой с речной водой, если она втягивает в себя больше речной воды, чем обыкновенной. +Removes water on contact=Убирает воду вблизи Can be dried in furnace=Может быть просушена в печи diff --git a/mods/ITEMS/mcl_stairs/locale/mcl_stairs.ru.tr b/mods/ITEMS/mcl_stairs/locale/mcl_stairs.ru.tr index 10d470fce..4441cc016 100644 --- a/mods/ITEMS/mcl_stairs/locale/mcl_stairs.ru.tr +++ b/mods/ITEMS/mcl_stairs/locale/mcl_stairs.ru.tr @@ -1,101 +1,104 @@ # textdomain: mcl_stairs -Stairs are useful to reach higher places by walking over them; jumping is not required. Placing stairs in a corner pattern will create corner stairs. Stairs placed on the ceiling or at the upper half of the side of a block will be placed upside down.=Ступеньки полезны, чтобы подниматься к высоким местам, идя по ним; прыжки при этом не требуются. Размещение ступенек по углам будет создавать угловые ступеньки. Ступеньки, устанавливаемые на потолке или в верхней половине боковой части блока, будет перевёрнуты вверх ногами. +Stairs are useful to reach higher places by walking over them; jumping is not required. Placing stairs in a corner pattern will create corner stairs. Stairs placed on the ceiling or at the upper half of the side of a block will be placed upside down.=Ступени нужны для подъема; по ним можно идти, прыгать не обязательно. Размещение ступенек на углах будет создавать угловые ступени. Ступени, устанавливаемые на потолке или на верхней половине боковой части блока, будет перевёрнуты вверх ногами. Double @1=Двойная @1 Slabs are half as high as their full block counterparts and occupy either the lower or upper part of a block, depending on how it was placed. Slabs can be easily stepped on without needing to jump. When a slab is placed on another slab of the same type, a double slab is created.=Плиты в два раза ниже, чем их блочные аналоги, и занимают либо нижнюю, либо верхнюю часть блока, в зависимости от того, как они размещались. На плиты можно легко подниматься без необходимости прыгать. Когда плита помещается на другую плиту того же типа, создается двойная плита. Upper @1=Верхняя @1 Double slabs are full blocks which are created by placing two slabs of the same kind on each other.=Двойные плиты это целые блоки, которые создаются путем размещения двух плит одного вида друг на друге. -Oak Wood Stairs=Дубовые ступеньки +Oak Wood Stairs=Дубовые ступени Oak Wood Slab=Дубовая плита Double Oak Wood Slab=Двойная дубовая плита -Jungle Wood Stairs=Ступеньки из дерева джунглей -Jungle Wood Slab=Плита из дерева джунглей -Double Jungle Wood Slab=Двойная плита из дерева джунглей -Acacia Wood Stairs=Ступеньки из акации -Acacia Wood Slab=Плита из акации -Double Acacia Wood Slab=Двойная плита из акации -Spruce Wood Stairs=Еловые ступеньки +Jungle Wood Stairs=Ступени из тропического дерева +Jungle Wood Slab=Плита из тропического дерева +Double Jungle Wood Slab=Двойная плита из тропического дерева +Acacia Wood Stairs=Акациевые ступени +Acacia Wood Slab=Акациевая плита +Double Acacia Wood Slab=Двойная акациевая плита +Spruce Wood Stairs=Еловые ступени Spruce Wood Slab=Еловая плита Double Spruce Wood Slab=Двойная еловая плита -Birch Wood Stairs=Берёзовые ступеньки +Birch Wood Stairs=Берёзовые ступени Birch Wood Slab=Берёзовая плита Double Birch Wood Slab=Двойная берёзовая плита -Dark Oak Wood Stairs=Ступеньки из тёмного дуба +Dark Oak Wood Stairs=Ступени из тёмного дуба Dark Oak Wood Slab=Плита из тёмного дуба Double Dark Oak Wood Slab=Двойная плита из тёмного дуба -Stone Stairs=Каменные ступеньки +Stone Stairs=Каменные ступени Stone Slab=Каменная плита Double Stone Slab=Двойная каменная плита -Polished Stone Slab=Плита из гладкого камня -Double Polished Stone Slab=Двойная плита из гладкого камня -Andesite Stairs=Андезитовые ступеньки +Polished Stone Slab=Плита из полированного камня +Double Polished Stone Slab=Двойная плита из полированного камня +Andesite Stairs=Андезитовые ступени Andesite Slab=Андезитовая плита Double Andesite Slab=Двойная андезитовая плита -Granite Stairs=Гранитные ступеньки +Granite Stairs=Гранитные ступени Granite Slab=Гранитная плита Double Granite Slab=Двойная гранитная плита -Diorite Stairs=Диоритовые ступеньки +Diorite Stairs=Диоритовые ступени Diorite Slab=Диоритовая плита Double Diorite Slab=Двойная диоритовая плита -Cobblestone Stairs=Ступеньки из булыжника +Cobblestone Stairs=Ступени из булыжника Cobblestone Slab=Плита из булыжника Double Cobblestone Slab=Двойная плита из булыжника -Mossy Cobblestone Stairs=Ступеньки из мшистого булыжника -Mossy Cobblestone Slab=Плита из мшистого булыжника -Double Mossy Cobblestone Slab=Двойная плита из мшистого булыжника -Brick Stairs=Кирпичные ступеньки +Mossy Cobblestone Stairs=Ступени из замшелого булыжника +Mossy Cobblestone Slab=Плита из замшелого булыжника +Double Mossy Cobblestone Slab=Двойная плита из замшелого булыжника +Brick Stairs=Кирпичные ступени Brick Slab=Кирпичная плита Double Brick Slab=Двойная кирпичная плита -Sandstone Stairs=Ступеньки из песчаника +Sandstone Stairs=Ступени из песчаника Sandstone Slab=Плита из песчаника Double Sandstone Slab=Двойная плита из песчаника -Smooth Sandstone Stairs=Ступеньки из гладкого песчаника +Smooth Sandstone Stairs=Ступени из гладкого песчаника Smooth Sandstone Slab=Плита из гладкого песчаника Double Smooth Sandstone Slab=Двойная плита из гладкого песчаника -Red Sandstone Stairs=Ступеньки из красного песчаника +Red Sandstone Stairs=Ступени из красного песчаника Red Sandstone Slab=Плита из красного песчаника Double Red Sandstone Slab=Двойная плита из красного песчаника -Smooth Red Sandstone Stairs=Ступеньки из гладкого красного песчаника +Smooth Red Sandstone Stairs=Ступени из гладкого красного песчаника Smooth Red Sandstone Slab=Плита из гладкого красного песчаника Double Smooth Red Sandstone Slab=Двойная плита из гладкого красного песчаника -Stone Bricks Stairs=Ступеньки из каменных блоков -Stone Bricks Slab=Плита из каменных блоков -Double Stone Bricks Slab=Двойная плита из каменных блоков -Quartz Stairs=Кварцевые ступеньки +Stone Bricks Stairs=Ступени из каменных кирпичей +Stone Bricks Slab=Плита из каменных кирпичей +Double Stone Bricks Slab=Двойная плита из каменных кирпичей +Quartz Stairs=Кварцевые ступени Quartz Slab=Кварцевая плита Double Quartz Slab=Двойная кварцевая плита -Smooth Quartz Stairs=Ступеньки из гладкого кварца +Smooth Quartz Stairs=Ступени из гладкого кварца Smooth Quartz Slab=Плита из гладкого кварца Double Smooth Quartz Slab=Двойная плита из гладкого кварца -Nether Brick Stairs=Ступеньки из адского кирпича +Nether Brick Stairs=Ступени из адского кирпича Nether Brick Slab=Плита из адского кирпича Double Nether Brick Slab=Двойная плита из адского кирпича -Red Nether Brick Stairs=Ступеньки из красного адского кирпича +Red Nether Brick Stairs=Ступени из красного адского кирпича Red Nether Brick Slab=Плита из красного адского кирпича Double Red Nether Brick Slab=Двойная из красного адского кирпича -End Stone Brick Stairs=Ступеньки из камня Предела -End Stone Brick Slab=Плита из камня Предела -Double End Stone Brick Slab=Двойная плита из камня Предела -Purpur Stairs=Пурпурные ступеньки +End Stone Brick Stairs=Ступени из камня Края +End Stone Brick Slab=Плита из камня Края +Double End Stone Brick Slab=Двойная плита из камня Края +Purpur Stairs=Пурпурные ступени Purpur Slab=Пурпурная плита Double Purpur Slab=Двойная пурпурная плита -Prismarine Stairs=Призмариновые ступеньки +Prismarine Stairs=Призмариновые ступени Prismarine Slab=Призмариновая плита Double Prismarine Slab=Двойная призмариновая плита -Prismarine Brick Stairs=Ступеньки из призмаринового кирпича +Prismarine Brick Stairs=Ступени из призмаринового кирпича Prismarine Brick Slab=Плита из призмаринового кирпича Double Prismarine Brick Slab=Двойная плита из призмаринового кирпича -Dark Prismarine Stairs=Ступеньки из тёмного призмарина +Dark Prismarine Stairs=Ступени из тёмного призмарина Dark Prismarine Slab=Плита из тёмного призмарина Double Dark Prismarine Slab=Двойная плита из тёмного призмарина -Polished Andesite Slab=Плита из гладкого андезита -Double Polished Andesite Slab=Двойная плита из гладкого андезита -Polished Andesite Stairs=Ступеньки из гладкого андезита -Polished Granite Slab=Плита из гладкого гранита -Double Polished Granite Slab=Двойная плита из гладкого гранита -Polished Granite Stairs=Ступеньки из гладкого гранита -Polished Diorite Slab=Плита из гладкого диорита -Double Polished Diorite Slab=Двойная плита из гладкого диорита -Polished Diorite Stairs=Ступеньки из гладкого диорита -Mossy Stone Brick Stairs=Ступеньки из мшистого каменного блока -Mossy Stone Brick Slab=Плита из мшистого каменного блока -Double Mossy Stone Brick Slab=Двойная плита из мшистого каменного блока +Polished Andesite Slab=Плита из полированного андезита +Double Polished Andesite Slab=Двойная плита из полированного андезита +Polished Andesite Stairs=Ступени из полированного андезита +Polished Granite Slab=Плита из полированного гранита +Double Polished Granite Slab=Двойная плита из полированного гранита +Polished Granite Stairs=Ступени из полированного гранита +Polished Diorite Slab=Плита из полированного диорита +Double Polished Diorite Slab=Двойная плита из полированного диорита +Polished Diorite Stairs=Ступени из полированного диорита +Mossy Stone Brick Stairs=Ступени из замшелых каменных кирпичей +Mossy Stone Brick Slab=Плита из замшелых каменных кирпичей +Double Mossy Stone Brick Slab=Двойная плита из замшелых каменных кирпичей +Mud Brick Stair=Саманные ступени +Mud Brick Slab=Саманная плита +Double Mud Brick Slab=Двойная саманная плита \ No newline at end of file diff --git a/mods/ITEMS/mcl_stonecutter/locale/mcl_stonecutter.ru.tr b/mods/ITEMS/mcl_stonecutter/locale/mcl_stonecutter.ru.tr new file mode 100644 index 000000000..65fcdff81 --- /dev/null +++ b/mods/ITEMS/mcl_stonecutter/locale/mcl_stonecutter.ru.tr @@ -0,0 +1,4 @@ +# textdomain: mcl_stonecutter +Stone Cutter=Камнерез +Used to cut stone like materials.=Используется для резьбы каменных материалов +Stonecutters are used to create stairs and slabs from stone like materials. It is also the jobsite for the Stone Mason Villager.=Камнерез используется для создания ступеней и плит из каменных материалов. Также является рабочим местов жителя каменщика. diff --git a/mods/ITEMS/mcl_sus_stew/init.lua b/mods/ITEMS/mcl_sus_stew/init.lua index cfb294532..d3e03ae48 100644 --- a/mods/ITEMS/mcl_sus_stew/init.lua +++ b/mods/ITEMS/mcl_sus_stew/init.lua @@ -1,3 +1,4 @@ +local S = minetest.get_translator(minetest.get_current_modname()) -- ____________________________ --_________________________________________/ Variables & Functions \_________ @@ -78,7 +79,7 @@ end) -- ________________________ --_________________________________________/ Item Regestration \_________________ minetest.register_craftitem("mcl_sus_stew:stew",{ - description = "Suspicious Stew", + description = S("Suspicious Stew"), inventory_image = "sus_stew.png", stack_max = 1, on_place = eat_stew, diff --git a/mods/ITEMS/mcl_sus_stew/locale/mcl_sus_stew.ru.tr b/mods/ITEMS/mcl_sus_stew/locale/mcl_sus_stew.ru.tr new file mode 100644 index 000000000..9ae7d2cab --- /dev/null +++ b/mods/ITEMS/mcl_sus_stew/locale/mcl_sus_stew.ru.tr @@ -0,0 +1,2 @@ +# textdomain: mcl_sus_stew +Suspicious Stew=Подозрительный суп diff --git a/mods/ITEMS/mcl_sus_stew/locale/template.txt b/mods/ITEMS/mcl_sus_stew/locale/template.txt new file mode 100644 index 000000000..5a69365e2 --- /dev/null +++ b/mods/ITEMS/mcl_sus_stew/locale/template.txt @@ -0,0 +1,2 @@ +# textdomain: mcl_sus_stew +Suspicious Stew= diff --git a/mods/ITEMS/mcl_throwing/locale/mcl_throwing.ru.tr b/mods/ITEMS/mcl_throwing/locale/mcl_throwing.ru.tr index 7670f729c..a58f8da92 100644 --- a/mods/ITEMS/mcl_throwing/locale/mcl_throwing.ru.tr +++ b/mods/ITEMS/mcl_throwing/locale/mcl_throwing.ru.tr @@ -1,12 +1,12 @@ # textdomain: mcl_throwing -@1 used the ender pearl too often.=@1 использовал(а) жемчужину Предела слишком часто. -Use the punch key to throw.=Используй клавишу удара для броска. +@1 used the ender pearl too often.=@1 использовал(а) жемчуг Края слишком часто. +Use the punch key to throw.=Используйте клавишу удара для броска. Snowball=Снежок -Snowballs can be thrown or launched from a dispenser for fun. Hitting something with a snowball does nothing.=Снежки можно бросать или запускать из диспенсера для веселья. Попадание снежком в кого-либо ни к чему не приводит. +Snowballs can be thrown or launched from a dispenser for fun. Hitting something with a snowball does nothing.=Снежки можно бросать или запускать из раздатчика для веселья. Попадание снежком в кого-либо ничего не делает. Egg=Яйцо -Eggs can be thrown or launched from a dispenser and breaks on impact. There is a small chance that 1 or even 4 chicks will pop out of the egg.=Яйца можно бросать или запускать из диспенсера, они ломаются при ударе. Есть небольшой шанс вылупления 1 или даже 4 цыплят из яйца. -Ender Pearl=Жемчужина Предела -An ender pearl is an item which can be used for teleportation at the cost of health. It can be thrown and teleport the thrower to its impact location when it hits a solid block or a plant. Each teleportation hurts the user by 5 hit points.=Жемчужина Предела это предмет, который можно использовать для телепортации за счёт единиц вашего здоровья. Его можно бросить, и это телепортирует бросившего в место удара, когда он попадает в сплошной блок или растение. Каждая телепортация ранит пользователя на 5 очков здоровья (HP). +Eggs can be thrown or launched from a dispenser and breaks on impact. There is a small chance that 1 or even 4 chicks will pop out of the egg.=Яйца можно бросать или запускать из раздатчика, они ломаются при столкновении. Есть небольшой шанс вылупления 1 или даже 4 цыплят из яйца. +Ender Pearl=Жемчуг Края +An ender pearl is an item which can be used for teleportation at the cost of health. It can be thrown and teleport the thrower to its impact location when it hits a solid block or a plant. Each teleportation hurts the user by 5 hit points.=Жемчуг Края это предмет, который можно использовать для телепортации за счёт единиц вашего здоровья. Его можно бросить, и это телепортирует бросившего в то место, куда упадает жемчуг. Каждая телепортация ранит игрока на 5 очков здоровья. Throwable=Можно бросать Chance to hatch chicks when broken=Шанс вылупления цыплят при разбитии -Teleports you on impact for cost of 5 HP=Телепортирует вас при ударе за счёт 5 HP +Teleports you on impact for cost of 5 HP=Телепортирует вас; урон 5 HP от столкновения diff --git a/mods/ITEMS/mcl_tnt/locale/mcl_tnt.ru.tr b/mods/ITEMS/mcl_tnt/locale/mcl_tnt.ru.tr index 9724c7552..366c92cd2 100644 --- a/mods/ITEMS/mcl_tnt/locale/mcl_tnt.ru.tr +++ b/mods/ITEMS/mcl_tnt/locale/mcl_tnt.ru.tr @@ -1,8 +1,8 @@ # textdomain: mcl_tnt -@1 was caught in an explosion.=@1 попал в радиус действия взрыва. -TNT=Тротил -An explosive device. When it explodes, it will hurt living beings and destroy blocks around it. TNT has an explosion radius of @1. With a small chance, blocks may drop as an item (as if being mined) rather than being destroyed. TNT can be ignited by tools, explosions, fire, lava and redstone signals.=Взрывное устройство. Когда оно взрывается, то причиняет вред живым существам и разрушает блоки вокруг себя. Тротил имеет радиус взрыва @1. С небольшой вероятностью блоки могут выпадать в качестве предметов (как при добыче), а не уничтожаться. Тротил может быть подорван инструментами, взрывами, огнём, лавой и сигналами редстоуна. -An explosive device. When it explodes, it will hurt living beings. TNT has an explosion radius of @1. TNT can be ignited by tools, explosions, fire, lava and redstone signals.=Взрывное устройство. Когда оно взрывается, то причиняет вред живым существам и разрушает блоки вокруг себя. Тротил имеет радиус взрыва @1. Тротил может быть подорван инструментами, взрывами, огнём, лавой и сигналами редстоуна. -Place the TNT and ignite it with one of the methods above. Quickly get in safe distance. The TNT will start to be affected by gravity and explodes in 4 seconds.=Разместите тротил, зажгите его одним из методов, описанных выше. Отбегите на безопасное расстояние. Тротил начнет подвергаться воздействию силы тяжести и взорвётся через 4 секунды. -Ignited by tools, explosions, fire, lava, redstone power=Зажигается инструментами, взрывами, огнём, лавой, энергией редстоуна +@1 was caught in an explosion.=@1 попал(а) под взрыв. +TNT=ТНТ +An explosive device. When it explodes, it will hurt living beings and destroy blocks around it. TNT has an explosion radius of @1. With a small chance, blocks may drop as an item (as if being mined) rather than being destroyed. TNT can be ignited by tools, explosions, fire, lava and redstone signals.=Взрывчатка. Когда она взрывается, то причиняет вред живым существам и разрушает блоки вокруг себя. ТНТ имеет радиус взрыва @1. С небольшой вероятностью блоки могут выпадать в качестве предметов (как при добыче), а не уничтожаться. ТНТ может быть подорван инструментами, взрывом, огнём, лавой и сигналом редстоуна. +An explosive device. When it explodes, it will hurt living beings. TNT has an explosion radius of @1. TNT can be ignited by tools, explosions, fire, lava and redstone signals.=Взрывчатка. Когда она взрывается, то причиняет вред живым существам. ТНТ имеет радиус взрыва @1. ТНТ может быть подорван инструментами, взрывом, огнём, лавой и сигналом редстоуна. +Place the TNT and ignite it with one of the methods above. Quickly get in safe distance. The TNT will start to be affected by gravity and explodes in 4 seconds.=Разместите ТНТ, зажгите его одним из методов, описанных выше. Отбегите на безопасное расстояние. ТНТ начнет подвергаться воздействию силы тяжести и взорвётся через 4 секунды. +Ignited by tools, explosions, fire, lava, redstone power=Зажигается инструментами, взрывом, огнём, лавой, сигналом редстоуна Explosion radius: @1=Радиус взрыва: @1 diff --git a/mods/ITEMS/mcl_tools/locale/mcl_tools.ru.tr b/mods/ITEMS/mcl_tools/locale/mcl_tools.ru.tr index e82fa15ef..c19e368fc 100644 --- a/mods/ITEMS/mcl_tools/locale/mcl_tools.ru.tr +++ b/mods/ITEMS/mcl_tools/locale/mcl_tools.ru.tr @@ -1,32 +1,36 @@ # textdomain: mcl_tools -You use your bare hand whenever you are not wielding any item. With your hand you can mine most blocks, but this is the slowest method and only the weakest blocks will yield their useful drop. The hand also deals minor damage by punching. Using the hand is often a last resort, as proper mining tools and weapons are much better.=Вы используете пустую руку, если не держите в ней никакого предмета. Пустой рукой вашей стороны вы можете добывать большинство блоков, но это самый медленный метод, который позволит добыть что-то полезное только из самых слабых блоков Рука также наносит небольшой урон при ударе. Использование пустой руки часто является последним средством, поскольку гораздо предпочтительнее использовать правильные подобранные инструменты и оружие. -When you are wielding an item which is not a mining tool or a weapon, it will behave as if it were the hand when you start mining or punching.=Когда вы держите предмет, не являющийся инструментом майнинга или оружием, то при майнинге или ударах он будет вести себя так, как если бы это была пустая рука. -In Creative Mode, the hand is able to break all blocks instantly.=В творческом режиме пустая рука мгновенно ломает любой блок. -Pickaxes are mining tools to mine hard blocks, such as stone. A pickaxe can also be used as weapon, but it is rather inefficient.=Кирка это инструмент для добычи тяжёлых блоков - камней и т. п. Кирка также может использоваться в качестве оружия, но не особо эффективного. -An axe is your tool of choice to cut down trees, wood-based blocks and other blocks. Axes deal a lot of damage as well, but they are rather slow.=Топор это ваш лучший выбор для рубки деревьев, деревянных и других блоков. Топор также причиняет высокий урон, но бьёт довольно медленно. -Swords are great in melee combat, as they are fast, deal high damage and can endure countless battles. Swords can also be used to cut down a few particular blocks, such as cobwebs.=Меч это оружие ближнего боя, он быстр, он наносит высокий урон и может выдержать множество битв. Меч также можно использовать для разрубания специфических блоков, например, паутины. -Shovels are tools for digging coarse blocks, such as dirt, sand and gravel. They can also be used to turn grass blocks to grass paths. Shovels can be used as weapons, but they are very weak.=Лопата - инструмент для выкапывания заборных блоков, таких как грязь, песок и гравий. Их также можно использовать, чтобы превращать блоки травы в тропинки. Лопату можно использовать и в качестве оружия, но очень слабого. -To turn a grass block into a grass path, hold the shovel in your hand, then use (rightclick) the top or side of a grass block. This only works when there's air above the grass block.=Чтобы превратить блок травы в тропинку, кликните правой по верхней его стороне, держа лопату в руке. Это сработает, только если над блоком травы есть воздух. -Shears are tools to shear sheep and to mine a few block types. Shears are a special mining tool and can be used to obtain the original item from grass, leaves and similar blocks that require cutting.=Ножницы это инструмент для стрижки овец, ими также можно добыть несколько других блоков. Ножницы это специальный инструмент, которым можно добывать оригинальные предметы травы, листьев и тому подобных, требующих стрижки. -To shear sheep or carve faceless pumpkins, use the “place” key on them. Faces can only be carved at the side of faceless pumpkins. Mining works as usual, but the drops are different for a few blocks.=Чтобы остричь овцу или вырезать безликую тыкву, нажмите клавишу “Разместить” на вашей цели. Лица могут быть вырезаны только на сторонах безликих тыкв. Добыча работает как обычно, но полученные предметы будут различаться для нескольких разных блоков. +You use your bare hand whenever you are not wielding any item. With your hand you can mine most blocks, but this is the slowest method and only the weakest blocks will yield their useful drop. The hand also deals minor damage by punching. Using the hand is often a last resort, as proper mining tools and weapons are much better.=Вы используете руку, если не держите в ней никакого предмета. Пустой рукой вы можете добывать большинство блоков, но это самый медленный метод, который позволит добыть что-то полезное только из самых слабых блоков. Рука также наносит небольшой урон при ударе. Использование руки часто является последним средством, поскольку гораздо предпочтительнее использовать правильные подобранные инструменты и оружие. +When you are wielding an item which is not a mining tool or a weapon, it will behave as if it were the hand when you start mining or punching.=Когда вы держите предмет, не являющийся инструментом добычи или оружием, то при добыче или ударах он будет вести себя так, как если бы это была пустая рука. +In Creative Mode, the hand is able to break all blocks instantly.=В творческом режиме рука мгновенно ломает любой блок. +Pickaxes are mining tools to mine hard blocks, such as stone. A pickaxe can also be used as weapon, but it is rather inefficient.=Кирка это инструмент для добычи твёрдых блоков - камней и т. п. Кирка также может использоваться в качестве оружия, но не особо эффективного. +An axe is your tool of choice to cut down trees, wood-based blocks and other blocks. Axes deal a lot of damage as well, but they are rather slow.=Топор это лучший выбор для рубки деревьев, деревянных и подобных блоков. Топор также причиняет высокий урон, но бьёт довольно медленно. +Swords are great in melee combat, as they are fast, deal high damage and can endure countless battles. Swords can also be used to cut down a few particular blocks, such as cobwebs.=Меч это оружие ближнего боя, он быстр, наносит высокий урон и может выдержать множество сражений. Меч также можно использовать для разрубания специфических блоков, например, паутины. +Shovels are tools for digging coarse blocks, such as dirt, sand and gravel. They can also be used to turn grass blocks to grass paths. Shovels can be used as weapons, but they are very weak.=Лопата - инструмент для выкапывания рыхлых блоков, таких как земля, песок и гравий. Лопату также можно использовать, чтобы превращать дёрн в тропинки. Лопату можно использовать и в качестве оружия, но очень слабого. +To turn a grass block into a grass path, hold the shovel in your hand, then use (rightclick) the top or side of a grass block. This only works when there's air above the grass block.=Чтобы превратить блок дёрна в тропинку, кликните правой кнопкой мыши по его верхней стороне, держа лопату в руке. Это сработает, только если над блоком травы есть воздух. +Shears are tools to shear sheep and to mine a few block types. Shears are a special mining tool and can be used to obtain the original item from grass, leaves and similar blocks that require cutting.=Ножницы это инструмент для стрижки овец, но ими также можно добыть несколько блоков. Ножницы это специальный инструмент, которым можно добывать траву, листьея и тому подобные. +To shear sheep or carve faceless pumpkins, use the “place” key on them. Faces can only be carved at the side of faceless pumpkins. Mining works as usual, but the drops are different for a few blocks.=Чтобы остричь овцу или вырезать тыкву, нажмите правую кнопку мыши на вашей цели. Лица могут быть вырезаны только по бокам тыквы. Добывание работает как обычно, но полученные предметы будут различаться для нескольких разных блоков. Wooden Pickaxe=Деревянная кирка Stone Pickaxe=Каменная кирка Iron Pickaxe=Железная кирка Golden Pickaxe=Золотая кирка Diamond Pickaxe=Алмазная кирка +Netherite Pickaxe=Незеритовая кирка Wooden Shovel=Деревянная лопата Stone Shovel=Каменная лопата Iron Shovel=Железная лопата Golden Shovel=Золотая лопата Diamond Shovel=Алмазная лопата +Netherite Shovel=Незеритовая лопата Wooden Axe=Деревянный топор Stone Axe=Каменный топор Iron Axe=Железный топор Golden Axe=Золотой топор Diamond Axe=Алмазный топор +Netherite Axe=Незеритовый топор Wooden Sword=Деревянный меч Stone Sword=Каменный меч Iron Sword=Железный меч Golden Sword=Золотой меч Diamond Sword=Алмазный меч +Netherite Sword=Незеритовый меч Shears=Ножницы diff --git a/mods/ITEMS/mcl_torches/locale/mcl_torches.ru.tr b/mods/ITEMS/mcl_torches/locale/mcl_torches.ru.tr index c3812eaad..a10f21acb 100644 --- a/mods/ITEMS/mcl_torches/locale/mcl_torches.ru.tr +++ b/mods/ITEMS/mcl_torches/locale/mcl_torches.ru.tr @@ -1,3 +1,3 @@ # textdomain: mcl_torches Torch=Факел -Torches are light sources which can be placed at the side or on the top of most blocks.=Факелы это источники света, которые можно вешать на стены или ставить на верхние части большинства блоков. +Torches are light sources which can be placed at the side or on the top of most blocks.=Факел это источник света, который можно поставить на большинство блоков сверху или сбоку. \ No newline at end of file diff --git a/mods/ITEMS/mcl_totems/locale/mcl_totems.ru.tr b/mods/ITEMS/mcl_totems/locale/mcl_totems.ru.tr index d293efe01..e381e283d 100644 --- a/mods/ITEMS/mcl_totems/locale/mcl_totems.ru.tr +++ b/mods/ITEMS/mcl_totems/locale/mcl_totems.ru.tr @@ -1,5 +1,5 @@ # textdomain: mcl_totems Totem of Undying=Тотем бессмертия -A totem of undying is a rare artifact which may safe you from certain death.=Тотем бессмертия это редкий артефакт, способный спасти вас от смерти. +A totem of undying is a rare artifact which may safe you from certain death.=Тотем бессмертия это редкий артефакт способный спасти вас от смерти. The totem only works while you hold it in your hand. If you receive fatal damage, you are saved from death and you get a second chance with 1 HP. The totem is destroyed in the process, however.=Тотем работает только когда вы держите его в руке. Если вы получаете смертельный урон, вы спасаетесь от смерти и получаете второй шанс с 1 HP. Однако тотем при этом уничтожается. -Protects you from death while wielding it=Защищает вас от смерти, пока вы владеете им +Protects you from death while wielding it=Защищает вас от смерти пока вы держите его diff --git a/mods/ITEMS/mcl_walls/locale/mcl_walls.ru.tr b/mods/ITEMS/mcl_walls/locale/mcl_walls.ru.tr index deb0fa289..57654101f 100644 --- a/mods/ITEMS/mcl_walls/locale/mcl_walls.ru.tr +++ b/mods/ITEMS/mcl_walls/locale/mcl_walls.ru.tr @@ -1,16 +1,17 @@ # textdomain: mcl_walls -A piece of wall. It cannot be jumped over with a simple jump. When multiple of these are placed to next to each other, they will automatically build a nice wall structure.=Часть стены. Её нельзя перепрыгнуть простым прыжком. Когда несколько из них будут расположены рядом друг с другом, они автоматически создадут хорошую структуру стены. +A piece of wall. It cannot be jumped over with a simple jump. When multiple of these are placed to next to each other, they will automatically build a nice wall structure.=Часть стены. Её нельзя перепрыгнуть. Когда несколько блоков стены расположены по соседству, они визуально соединяются друг с другом в структуру. Cobblestone Wall=Стена из булыжника -Mossy Cobblestone Wall=Стена из мшистого булыжника +Mossy Cobblestone Wall=Стена из замшелого булыжника Andesite Wall=Андезитовая стена Granite Wall=Гранитная стена Diorite Wall=Диоритовая стена Brick Wall=Кирпичная стена Sandstone Wall=Стена из песчаника Red Sandstone Wall=Стена из красного песчаника -Stone Brick Wall=Стена из каменного блока -Mossy Stone Brick Wall=Стена из мшистого каменного блока +Stone Brick Wall=Стена из каменных кирпичей +Mossy Stone Brick Wall=Стена из замшелого каменного блока Prismarine Wall=Призмариновая стена -End Stone Brick Wall=Стена из камня Предела +End Stone Brick Wall=Стена из кирпичей Края Nether Brick Wall=Стена из адского кирпича -Red Nether Brick Wall=Стена из красного адского кирпича +Red Nether Brick Wall=Стена из адского красного кирпича +Mud Brick Wall=Стена из саманных кирпичей \ No newline at end of file diff --git a/mods/ITEMS/mcl_wool/locale/mcl_wool.ru.tr b/mods/ITEMS/mcl_wool/locale/mcl_wool.ru.tr index 6b05812a2..1a6a3ad37 100644 --- a/mods/ITEMS/mcl_wool/locale/mcl_wool.ru.tr +++ b/mods/ITEMS/mcl_wool/locale/mcl_wool.ru.tr @@ -15,23 +15,23 @@ Yellow Wool=Жёлтая шерсть Yellow Carpet=Жёлтый ковёр Green Wool=Зелёная шерсть Green Carpet=Зелёный ковёр -Cyan Wool=Голубая шерсть -Cyan Carpet=Голубой ковёр +Cyan Wool=Бирюзовая шерсть +Cyan Carpet=Бирюзовый ковёр Blue Wool=Синяя шерсть Blue Carpet=Синий ковёр -Magenta Wool=Фиолетовая шерсть -Magenta Carpet=Фиолетовый ковёр +Magenta Wool=Сиреневая шерсть +Magenta Carpet=Сиреневый ковёр Orange Wool=Оранжевая шерсть Orange Carpet=Оранжевый ковёр -Purple Wool=Пурпурная шерсть -Purple Carpet=Пурпурный ковёр +Purple Wool=Фиолетовая шерсть +Purple Carpet=Фиолетовый ковёр Brown Wool=Коричневая шерсть Brown Carpet=Коричневый ковёр Pink Wool=Розовая шерсть Pink Carpet=Розовый ковёр -Lime Wool=Зелёная лаймовая шерсть -Lime Carpet=Зелёный лаймовый ковёр -Light Blue Wool=Светло-голубая шерсть -Light Blue Carpet=Светло-голубой ковёр +Lime Wool=Лаймовая шерсть +Lime Carpet=Лаймовый ковёр +Light Blue Wool=Голубая шерсть +Light Blue Carpet=Голубой ковёр Wool is a decorative block which comes in many different colors.=Шерсть это декоративный блок, который может быть разных цветов. Carpets are thin floor covers which come in many different colors.=Ковры это тонкие напольные покрытия, которые бывают разных цветов. diff --git a/mods/ITEMS/mclx_core/locale/mclx_core.ru.tr b/mods/ITEMS/mclx_core/locale/mclx_core.ru.tr index 1f3155b58..3435b945a 100644 --- a/mods/ITEMS/mclx_core/locale/mclx_core.ru.tr +++ b/mods/ITEMS/mclx_core/locale/mclx_core.ru.tr @@ -1,5 +1,5 @@ # textdomain: mclx_core River Water Source=Источник речной воды -River water has the same properties as water, but has a reduced flowing distance and is not renewable.=Речная вода имеет все свойства простой воды, но течёт не так далеко и не возобновляется. +River water has the same properties as water, but has a reduced flowing distance and is not renewable.=Речная вода имеет все свойства обычной воды, но течёт не так далеко и не возобновляема. River Water=Речная вода Flowing River Water=Текущая речная вода diff --git a/mods/ITEMS/mclx_fences/locale/mclx_fences.ru.tr b/mods/ITEMS/mclx_fences/locale/mclx_fences.ru.tr index 146fb4dd7..32874b9e0 100644 --- a/mods/ITEMS/mclx_fences/locale/mclx_fences.ru.tr +++ b/mods/ITEMS/mclx_fences/locale/mclx_fences.ru.tr @@ -1,4 +1,4 @@ # textdomain: mclx_fences Red Nether Brick Fence=Забор из красного адского кирпича -Red Nether Brick Fence Gate=Ворота из красного адского кирпича -Nether Brick Fence Gate=Ворота из адского кирпича +Red Nether Brick Fence Gate=Калитка из красного адского кирпича +Nether Brick Fence Gate=Калитка из адского кирпича diff --git a/mods/ITEMS/mclx_stairs/locale/mclx_stairs.ru.tr b/mods/ITEMS/mclx_stairs/locale/mclx_stairs.ru.tr index 7dca54dd1..d5f973cde 100644 --- a/mods/ITEMS/mclx_stairs/locale/mclx_stairs.ru.tr +++ b/mods/ITEMS/mclx_stairs/locale/mclx_stairs.ru.tr @@ -1,82 +1,82 @@ # textdomain: mclx_stairs -Oak Bark Stairs=Ступеньки из дубовой коры +Oak Bark Stairs=Ступени из дубовой коры Oak Bark Slab=Плита из дубовой коры Double Oak Bark Slab=Двойная плита из дубовой коры -Acacia Bark Stairs=Ступеньки из коры акации -Acacia Bark Slab=Плита из коры акации -Double Acacia Bark Slab=Двойная плита из коры акации -Spruce Bark Stairs=Ступеньки из еловой коры +Acacia Bark Stairs=Ступени из акациевой коры +Acacia Bark Slab=Плита из акациевой коры +Double Acacia Bark Slab=Двойная плита из акациевой коры +Spruce Bark Stairs=Ступени из еловой коры Spruce Bark Slab=Плита из еловой коры Double Spruce Bark Slab=Двойная плита из еловой коры -Birch Bark Stairs=Ступеньки из берёзовой коры +Birch Bark Stairs=Ступени из берёзовой коры Birch Bark Slab=Плита из берёзовой коры Double Birch Bark Slab=Двойная плита из берёзовой коры -Jungle Bark Stairs=Ступеньки из коры дерева джунглей -Jungle Bark Slab=Плита из коры дерева джунглей -Double Jungle Bark Slab=Двойная плита из коры дерева джунглей -Dark Oak Bark Stairs=Ступеньки из коры тёмного дуба +Jungle Bark Stairs=Ступени из коры тропического дерева +Jungle Bark Slab=Плита из коры тропического дерева +Double Jungle Bark Slab=Двойная плита из коры тропического дерева +Dark Oak Bark Stairs=Ступени из коры тёмного дуба Dark Oak Bark Slab=Плита из коры тёмного дуба Double Dark Oak Bark Slab=Двойная плита из коры тёмного дуба -Lapis Lazuli Slab=Ляпис-лазурная плита -Double Lapis Lazuli Slab=Двойная ляпис-лазурная плита -Lapis Lazuli Stairs=Ляпис-лазурные ступеньки +Lapis Lazuli Slab=Лазуритовая плита +Double Lapis Lazuli Slab=Двойная лазуритовая плита +Lapis Lazuli Stairs=Лазуритовые ступени Slab of Gold=Золотая плита Double Slab of Gold=Двойная золотая плита -Stairs of Gold=Золотые ступеньки +Stairs of Gold=Золотые ступени Slab of Iron=Железная плита Double Slab of Iron=Двойная железная плита -Stairs of Iron=Железные ступеньки -Cracked Stone Brick Stairs=Ступеньки из треснутого камня -Cracked Stone Brick Slab=Плита из треснутого камня -Double Cracked Stone Brick Slab=Двойная плита из треснутого камня -White Concrete Stairs=Белые бетонные ступеньки -White Concrete Slab=Белая бетонная панель -Double White Concrete Slab=Белая двойная бетонная панель -Grey Concrete Stairs=Серые бетонные ступеньки -Grey Concrete Slab=Серая бетонная панель -Double Grey Concrete Slab=Серая двойная бетонная панель -Light Grey Concrete Stairs=Светло-серые бетонные ступеньки -Light Grey Concrete Slab=Светло-серая бетонная панель -Double Light Grey Concrete Slab=Светло-серая двойная бетонная панель -Black Concrete Stairs=Чёрные бетонные ступеньки -Black Concrete Slab=Чёрная бетонная панель -Double Black Concrete Slab=Черная двойная бетонная панель -Red Concrete Stairs=Красные бетонные ступеньки -Red Concrete Slab=Красная бетонная панель -Double Red Concrete Slab=Красная двойная бетонная панель -Yellow Concrete Stairs=Жёлтые бетонные ступеньки -Yellow Concrete Slab=Жёлтая бетонная панель -Double Yellow Concrete Slab=Жёлтая двойная бетонная панель -Green Concrete Stairs=Зелёные бетонные ступеньки -Green Concrete Slab=Зелёная бетонная панель -Double Green Concrete Slab=Зелёная двойная бетонная панель -Cyan Concrete Stairs=Голубые бетонные ступеньки -Cyan Concrete Slab=Голубая бетонная панель -Double Cyan Concrete Slab=Голубая двойная бетонная панель -Blue Concrete Stairs=Синие бетонные ступеньки -Blue Concrete Slab=Синяя бетонная панель -Double Blue Concrete Slab=Синяя двойная бетонная панель -Magenta Concrete Stairs=Фиолетовые бетонные ступеньки -Magenta Concrete Slab=Фиолетовая бетонная панель -Double Magenta Concrete Slab=Фиолетовая двойная бетонная панель -Orange Concrete Stairs=Оранжевые бетонные ступеньки -Orange Concrete Slab=Оранжевая бетонная панель -Double Orange Concrete Slab=Оранжевая двойная бетонная панель -Purple Concrete Stairs=Пурпурные бетонные ступеньки -Purple Concrete Slab=Пурпурная бетонная панель -Double Purple Concrete Slab=Пурпурная двойная бетонная панель -Brown Concrete Stairs=Коричневые бетонные ступеньки -Brown Concrete Slab=Коричневая бетонная панель -Double Brown Concrete Slab=Коричневая двойная бетонная панель -Pink Concrete Stairs=Розовые бетонные ступеньки -Pink Concrete Slab=Розовая бетонная панель -Double Pink Concrete Slab=Розовая двойная бетонная панель -Lime Concrete Stairs=Зелёные лаймовые бетонные ступеньки -Lime Concrete Slab=Зелёная лаймовая бетонная панель -Double Lime Concrete Slab=Зелёная лаймовая двойная бетонная панель -Light Blue Concrete Stairs=Светло-голубые бетонные ступеньки -Light Blue Concrete Slab=Светло-голубая бетонная панель -Double Light Blue Concrete Slab=Светло-голубая двойная бетонная панель -Concrete Slab=Бетонная панель -Double Concrete Slab=Двойная бетонная панель -Concrete Stairs=Бетонные ступеньки +Stairs of Iron=Железные ступени +Cracked Stone Brick Stairs=Ступени из потрескавшихся каменных кирпичей +Cracked Stone Brick Slab=Плита из потрескавшихся каменных кирпичей +Double Cracked Stone Brick Slab=Двойная плита из потрескавшихся каменных кирпичей +White Concrete Stairs=Белые бетонные ступени +White Concrete Slab=Белая бетонная плита +Double White Concrete Slab=Двойная белая бетонная плита +Grey Concrete Stairs=Серые бетонные ступени +Grey Concrete Slab=Серая бетонная плита +Double Grey Concrete Slab=Двойная серая бетонная плита +Light Grey Concrete Stairs=Светло-серые бетонные ступени +Light Grey Concrete Slab=Светло-серая бетонная плита +Double Light Grey Concrete Slab=Двойная светло-серая бетонная плита +Black Concrete Stairs=Чёрные бетонные ступени +Black Concrete Slab=Чёрная бетонная плита +Double Black Concrete Slab=Двойная чёрная бетонная плита +Red Concrete Stairs=Красные бетонные ступени +Red Concrete Slab=Красная бетонная плита +Double Red Concrete Slab=Двойная красная бетонная плита +Yellow Concrete Stairs=Жёлтые бетонные ступени +Yellow Concrete Slab=Жёлтая бетонная плита +Double Yellow Concrete Slab=Двойная жёлтая бетонная плита +Green Concrete Stairs=Зелёные бетонные ступени +Green Concrete Slab=Зелёная бетонная плита +Double Green Concrete Slab=Двойная зелёная бетонная плита +Cyan Concrete Stairs=Бирюзовые бетонные ступени +Cyan Concrete Slab=Бирюзоваябетонная плита +Double Cyan Concrete Slab=Двойная бирюзовая бетонная плита +Blue Concrete Stairs=Синие бетонные ступени +Blue Concrete Slab=Синяя бетонная плита +Double Blue Concrete Slab=Двойная синяя бетонная плита +Magenta Concrete Stairs=Сиреневые бетонные ступени +Magenta Concrete Slab=Сиреневая бетонная плита +Double Magenta Concrete Slab=Двойная сиреневая бетонная плита +Orange Concrete Stairs=Оранжевые бетонные ступени +Orange Concrete Slab=Оранжевая бетонная плита +Double Orange Concrete Slab=Двойная оранжевая бетонная плита +Purple Concrete Stairs=Фиолетовые бетонные ступени +Purple Concrete Slab=Фиолетовая бетонная плита +Double Purple Concrete Slab=Двойная фиолетовая бетонная плита +Brown Concrete Stairs=Коричневые бетонные ступени +Brown Concrete Slab=Коричневая бетонная плита +Double Brown Concrete Slab=Двойная коричневая бетонная плита +Pink Concrete Stairs=Розовые бетонные ступени +Pink Concrete Slab=Розовая бетонная плита +Double Pink Concrete Slab=Двойная розовая бетонная плита +Lime Concrete Stairs=Лаймовые бетонные ступени +Lime Concrete Slab=Лаймовая бетонная плита +Double Lime Concrete Slab=Двойная лаймовая бетонная плита +Light Blue Concrete Stairs=Голубые бетонные ступени +Light Blue Concrete Slab=Голубая бетонная плита +Double Light Blue Concrete Slab=Двойная голубая бетонная плита +Concrete Slab=Бетонная плита +Double Concrete Slab=Двойная бетонная плита +Concrete Stairs=Бетонные ступени diff --git a/mods/ITEMS/xpanes/locale/xpanes.ru.tr b/mods/ITEMS/xpanes/locale/xpanes.ru.tr index 47702516d..0102c73df 100644 --- a/mods/ITEMS/xpanes/locale/xpanes.ru.tr +++ b/mods/ITEMS/xpanes/locale/xpanes.ru.tr @@ -1,23 +1,23 @@ # textdomain: xpanes Glass panes are thin layers of glass which neatly connect to their neighbors as you build them.=Стеклянные панели это тонкие стёкла, которые аккуратно присоединяются к соседним блокам, когда вы устанавливаете их. -Stained glass panes are thin layers of stained glass which neatly connect to their neighbors as you build them. They come in many different colors.=Витражи это тонкие стёкла, которые аккуратно присоединяются к соседним блокам, когда вы устанавливаете их. Они могут быть разных цветов. -Iron Bars=Железные слитки -Iron bars neatly connect to their neighbors as you build them.=Железные слитки аккуратно присоединяются к соседним блокам, когда вы устанавливаете их. +Stained glass panes are thin layers of stained glass which neatly connect to their neighbors as you build them. They come in many different colors.=Окрашенная стеклянная панель это тонкое стёкло, которое аккуратно присоединяется к соседним блокам, когда вы устанавливаете его. Может быть разных цветов. +Iron Bars=Железная решётка +Iron bars neatly connect to their neighbors as you build them.=Железная решётка аккуратно присоединяется к соседним блокам, когда вы устанавливаете её. Glass Pane=Стеклянная панель -Stained Glass Pane=Витраж -Red Stained Glass Pane=Красный витраж -Green Stained Glass Pane=Зелёный витраж -Blue Stained Glass Pane=Синий витраж -Light Blue Stained Glass Pane=Светло-голубой витраж -Black Stained Glass Pane=Чёрный витраж -White Stained Glass Pane=Белый витраж -Yellow Stained Glass Pane=Жёлтый витраж -Brown Stained Glass Pane=Коричневый витраж -Orange Stained Glass Pane=Оранжевый витраж -Pink Stained Glass Pane=Розовый витраж -Grey Stained Glass Pane=Серый витраж -Lime Stained Glass Pane=Зелёный лаймовый витраж -Light Grey Stained Glass Pane=Светло-серый витраж -Magenta Stained Glass Pane=Фиолетовый витраж -Purple Stained Glass Pane=Пурпурный витраж -Cyan Stained Glass Pane=Голубой витраж +Stained Glass Pane=Цветное стекло +Red Stained Glass Pane=Красная стеклянная панель +Green Stained Glass Pane=Зелёная стеклянная панель +Blue Stained Glass Pane=Синяя стеклянная панель +Light Blue Stained Glass Pane=Голубая стеклянная панель +Black Stained Glass Pane=Чёрная стеклянная панель +White Stained Glass Pane=Белая стеклянная панель +Yellow Stained Glass Pane=Жёлтая стеклянная панель +Brown Stained Glass Pane=Коричневая стеклянная панель +Orange Stained Glass Pane=Оранжевая стеклянная панель +Pink Stained Glass Pane=Розовая стеклянная панель +Grey Stained Glass Pane=Серая стеклянная панель +Lime Stained Glass Pane=Лаймовая стеклянная панель +Light Grey Stained Glass Pane=Светло-серая стеклянная панель +Magenta Stained Glass Pane=Сиреневая стеклянная панель +Purple Stained Glass Pane=Фиолетовая стеклянная панель +Cyan Stained Glass Pane=Бирюзовая стеклянная панель \ No newline at end of file diff --git a/mods/MAPGEN/mcl_structures/locale/mcl_structures.ru.tr b/mods/MAPGEN/mcl_structures/locale/mcl_structures.ru.tr index 248de695c..21186c96a 100644 --- a/mods/MAPGEN/mcl_structures/locale/mcl_structures.ru.tr +++ b/mods/MAPGEN/mcl_structures/locale/mcl_structures.ru.tr @@ -1,7 +1,7 @@ # textdomain: mcl_structures -Generate a pre-defined structure near your position.=Генерирует поблизости заранее определённое строение. -Structure placed.=Строение размещено. +Generate a pre-defined structure near your position.=Генерирует поблизости заранее определённую структуру. +Structure placed.=Структура размещена. Village built. WARNING: Villages are experimental and might have bugs.=Деревня построена. ВНИМАНИЕ: Деревни экспериментальны и могут содержать ошибки. -Error: No structure type given. Please use “/spawnstruct ”.=Ошибка: Не задан тип строения. Пожалуйста, используйте “/spawnstruct <тип>”. -Error: Unknown structure type. Please use “/spawnstruct ”.=Ошибка: Неизвестный тип строения. Пожалуйста, используйте “/spawnstruct <тип>”. +Error: No structure type given. Please use “/spawnstruct ”.=Ошибка: Не задан тип структуры. Пожалуйста, используйте “/spawnstruct <тип>”. +Error: Unknown structure type. Please use “/spawnstruct ”.=Ошибка: Неизвестный тип структуы. Пожалуйста, используйте “/spawnstruct <тип>”. Use /help spawnstruct to see a list of avaiable types.=Используйте /help spawnstruct, чтобы увидеть список доступных типов. diff --git a/mods/MAPGEN/mcl_villages/locale/mcl_villages.ru.tr b/mods/MAPGEN/mcl_villages/locale/mcl_villages.ru.tr index 467f31121..525e5811b 100644 --- a/mods/MAPGEN/mcl_villages/locale/mcl_villages.ru.tr +++ b/mods/MAPGEN/mcl_villages/locale/mcl_villages.ru.tr @@ -1,2 +1,3 @@ # textdomain: mcl_villages -Chiseled Stone Village Bricks=Точёный каменный блок из деревни +Chiseled Stone Village Bricks=Резные деревенские каменные кирпичи +mcl_villages build tool=Инструмент постройки деревни \ No newline at end of file diff --git a/mods/MISC/findbiome/locale/findbiome.ru.tr b/mods/MISC/findbiome/locale/findbiome.ru.tr index c37371820..98f2be522 100644 --- a/mods/MISC/findbiome/locale/findbiome.ru.tr +++ b/mods/MISC/findbiome/locale/findbiome.ru.tr @@ -7,4 +7,4 @@ Biome found at @1.=Биом найден в @1. No biome found!=Биом не найден! List all biomes=Список всех биомов No biomes.=Нет биомов. -Not supported. The “biomeinfo” mod is required for v6 mapgen support!=Не поддерживается. Для поддержки мэпгена v6 требуется мод “biomeinfo”! +Not supported. The “biomeinfo” mod is required for v6 mapgen support!=Не поддерживается. Для поддержки мапгена v6 требуется мод “biomeinfo”! diff --git a/mods/MISC/mcl_commands/locale/mcl_commands.ru.tr b/mods/MISC/mcl_commands/locale/mcl_commands.ru.tr index 77ff7d4f9..09cd4a049 100644 --- a/mods/MISC/mcl_commands/locale/mcl_commands.ru.tr +++ b/mods/MISC/mcl_commands/locale/mcl_commands.ru.tr @@ -1,6 +1,6 @@ # textdomain: mcl_commands Players can't be killed right now, damage has been disabled.=Игроки не могут быть убиты прямо сейчас, урон отключён. -Player @1 does not exist.=Игрок @1 не существует. +Player @1 does not exist.=Игрока @1 не существует. You are already dead=Вы уже мертвы @1 is already dead=@1 уже мертв(а) @1 committed suicide.=@1 совершил(а) самоубийство. @@ -17,7 +17,7 @@ Invalid node=Неправильный блок @1 spawned.=@1 возродился(ась). Invalid parameters (see /help setblock)=Недопустимые параметры (см. /help setblock) List bans=Список банов -Ban list: @1=Бан-лист: @1 -Show who is logged on=Показывает, кто подключён -Displays the world seed=Показывает значение зерна мира +Ban list: @1=Список банов: @1 +Show who is logged on=Показывает игроков в сети +Displays the world seed=Показать значение зерна мира Only peaceful mobs allowed!=Разрешены только мирные сущности! diff --git a/mods/MISC/mcl_privs/locale/mcl_privs.ru.tr b/mods/MISC/mcl_privs/locale/mcl_privs.ru.tr index 678ebf4e0..6e301d3dc 100644 --- a/mods/MISC/mcl_privs/locale/mcl_privs.ru.tr +++ b/mods/MISC/mcl_privs/locale/mcl_privs.ru.tr @@ -1,2 +1,2 @@ # textdomain: mcl_privs -Can place and use advanced blocks like mob spawners, command blocks and barriers.=Позволяет размещать и использовать продвинутые блоки, такие как порождатели существ, блоки команд и барьеры. \ No newline at end of file +Can place and use advanced blocks like mob spawners, command blocks and barriers.=Позволяет размещать и использовать продвинутые блоки, такие как спаунеры мобов, командные блоки и барьеры. \ No newline at end of file diff --git a/mods/PLAYER/mcl_hunger/locale/mcl_hunger.ru.tr b/mods/PLAYER/mcl_hunger/locale/mcl_hunger.ru.tr index a91a4db75..bc0b33a67 100644 --- a/mods/PLAYER/mcl_hunger/locale/mcl_hunger.ru.tr +++ b/mods/PLAYER/mcl_hunger/locale/mcl_hunger.ru.tr @@ -1,8 +1,8 @@ # textdomain: mcl_hunger @1 succumbed to the poison.=@1 умер(ла) от яда. -Food=Продукт +Food=Еда Saturation=Насыщение %s: %.1f/%d=%s: %.1f/%d -Exhaust.=Истощ. +Exhaust.=Истощение %s: %d/%d=%s: %d/%d @1 starved to death.=@1 умер(ла) от голода. diff --git a/mods/PLAYER/mcl_music/locale/mcl_music.ru.tr b/mods/PLAYER/mcl_music/locale/mcl_music.ru.tr new file mode 100644 index 000000000..acdb7678d --- /dev/null +++ b/mods/PLAYER/mcl_music/locale/mcl_music.ru.tr @@ -0,0 +1,7 @@ +# textdomain: mcl_music +You need the debug privilege in order to turn ingame music on or off for somebody else!=Вам нужна привилегия “debug”, чтобы переключать внутриигровую музыку для кого-то другого! +Couldn't find player @1!=Игрок @1 не найден! +Set music for @1 to: @2=Установить музыку для @1 на: +Turns music for yourself or another player on or off.=Включить или выключить музыку для себе или другого игрока. +on=вкл +off=выкл \ No newline at end of file diff --git a/mods/PLAYER/mcl_skins/locale/mcl_skins.ru.tr b/mods/PLAYER/mcl_skins/locale/mcl_skins.ru.tr index fda9330d6..96c97dc31 100644 --- a/mods/PLAYER/mcl_skins/locale/mcl_skins.ru.tr +++ b/mods/PLAYER/mcl_skins/locale/mcl_skins.ru.tr @@ -1,6 +1,6 @@ # textdomain: mcl_skins -Skins=Облики -Templates=Образцы +Skins=Скины +Templates=Шаблоны Arm size=Толщина рук Bases=Цвета кожи Footwears=Обувь @@ -10,5 +10,5 @@ Bottoms=Ноги Tops=Туловища Hairs=Причёски Headwears=Головные уборы -Open skin configuration screen.=Открыть экран настройки облика. +Open skin configuration screen.=Открыть настройки скина. Select=Выбрать diff --git a/mods/PLAYER/mcl_spawn/locale/mcl_spawn.ru.tr b/mods/PLAYER/mcl_spawn/locale/mcl_spawn.ru.tr index eec1bcd65..35d0b07c2 100644 --- a/mods/PLAYER/mcl_spawn/locale/mcl_spawn.ru.tr +++ b/mods/PLAYER/mcl_spawn/locale/mcl_spawn.ru.tr @@ -1,4 +1,5 @@ # textdomain: mcl_spawn New respawn position set!=Задана новая точка возрождения! Respawn position cleared!=Точка возрождения удалена! -Your spawn bed was missing or blocked.=Точка вашего возрождения не задана либо заблокирована. +Couldn't get level of your respawn anchor!=Невозможно получить уровень вашего якоря возрождения! +Your spawn bed was missing or blocked, and you had no charged respawn anchor!=Ваша кровать пропала или заблокирована, и у вас нет заряженного якоря возрождения! \ No newline at end of file From 7c43c15fda1f57f1305443d9be3129ec491f0218 Mon Sep 17 00:00:00 2001 From: chmodsayshello Date: Thu, 31 Aug 2023 17:17:38 +0200 Subject: [PATCH 146/982] update loottables --- mods/MAPGEN/mcl_nether_fortresses/init.lua | 2 +- mods/MAPGEN/mcl_structures/desert_temple.lua | 2 +- mods/MAPGEN/mcl_structures/end_city.lua | 2 +- mods/MAPGEN/mcl_structures/jungle_temple.lua | 2 +- mods/MAPGEN/mcl_structures/pillager_outpost.lua | 2 +- mods/MAPGEN/mcl_structures/shipwrecks.lua | 2 +- mods/MAPGEN/mcl_structures/woodland_mansion.lua | 2 +- 7 files changed, 7 insertions(+), 7 deletions(-) diff --git a/mods/MAPGEN/mcl_nether_fortresses/init.lua b/mods/MAPGEN/mcl_nether_fortresses/init.lua index 478b20e4f..84823d106 100644 --- a/mods/MAPGEN/mcl_nether_fortresses/init.lua +++ b/mods/MAPGEN/mcl_nether_fortresses/init.lua @@ -188,7 +188,7 @@ mcl_structures.register_structure("nether_bulwark",{ stacks_max = 1, items = { { itemstring = "mcl_compass:lodestone" }, - { itemstring = "mcl_armor_trims:rib" }, + { itemstring = "mcl_armor:rib" }, } }} }, diff --git a/mods/MAPGEN/mcl_structures/desert_temple.lua b/mods/MAPGEN/mcl_structures/desert_temple.lua index 6f196bf8c..74ae20d37 100644 --- a/mods/MAPGEN/mcl_structures/desert_temple.lua +++ b/mods/MAPGEN/mcl_structures/desert_temple.lua @@ -69,7 +69,7 @@ mcl_structures.register_structure("desert_temple",{ { itemstring = "mcl_mobitems:diamond_horse_armor", weight = 5, }, { itemstring = "mcl_core:diamond", weight = 5, amount_min = 1, amount_max = 3 }, { itemstring = "mcl_core:apple_gold_enchanted", weight = 2, }, - { itemstring = "mcl_armor_trims:dune", weight = 20, amount_min = 2, amount_max = 2}, + { itemstring = "mcl_armor:dune", weight = 20, amount_min = 2, amount_max = 2}, } }, { diff --git a/mods/MAPGEN/mcl_structures/end_city.lua b/mods/MAPGEN/mcl_structures/end_city.lua index 2f9d847e8..e40f90c21 100644 --- a/mods/MAPGEN/mcl_structures/end_city.lua +++ b/mods/MAPGEN/mcl_structures/end_city.lua @@ -58,7 +58,7 @@ mcl_structures.register_structure("end_shipwreck",{ { itemstring = "mcl_core:diamond", weight = 3, amount_min = 2, amount_max = 7 }, { itemstring = "mcl_mobitems:saddle", weight = 3, }, { itemstring = "mcl_core:emerald", weight = 2, amount_min = 1, amount_max = 3 }, - { itemstring = "mcl_armor_trims:spire", amount_min = 1, amount_max = 1 }, + { itemstring = "mcl_armor:spire", amount_min = 1, amount_max = 1 }, { itemstring = "mcl_books:book", weight = 1, func = function(stack, pr) mcl_enchanting.enchant_uniform_randomly(stack, {"soul_speed"}, pr) end }, diff --git a/mods/MAPGEN/mcl_structures/jungle_temple.lua b/mods/MAPGEN/mcl_structures/jungle_temple.lua index cb2887395..ed7067c6c 100644 --- a/mods/MAPGEN/mcl_structures/jungle_temple.lua +++ b/mods/MAPGEN/mcl_structures/jungle_temple.lua @@ -38,7 +38,7 @@ mcl_structures.register_structure("jungle_temple",{ { itemstring = "mcl_mobitems:gold_horse_armor", weight = 1, }, { itemstring = "mcl_mobitems:diamond_horse_armor", weight = 1, }, { itemstring = "mcl_core:apple_gold_enchanted", weight = 2, }, - { itemstring = "mcl_armor_trims:wild", amount_min = 1, amount_max = 1, }, + { itemstring = "mcl_armor:wild", amount_min = 1, amount_max = 1, }, } }} } diff --git a/mods/MAPGEN/mcl_structures/pillager_outpost.lua b/mods/MAPGEN/mcl_structures/pillager_outpost.lua index 22ec743bc..dfee8fae3 100644 --- a/mods/MAPGEN/mcl_structures/pillager_outpost.lua +++ b/mods/MAPGEN/mcl_structures/pillager_outpost.lua @@ -44,7 +44,7 @@ mcl_structures.register_structure("pillager_outpost",{ { itemstring = "mcl_books:book", weight = 1, func = function(stack, pr) mcl_enchanting.enchant_uniform_randomly(stack, {"soul_speed"}, pr) end }, - { itemstring = "mcl_armor_trims:sentry"}, + { itemstring = "mcl_armor:sentry"}, } }, { diff --git a/mods/MAPGEN/mcl_structures/shipwrecks.lua b/mods/MAPGEN/mcl_structures/shipwrecks.lua index a9c58ea64..134b99517 100644 --- a/mods/MAPGEN/mcl_structures/shipwrecks.lua +++ b/mods/MAPGEN/mcl_structures/shipwrecks.lua @@ -166,7 +166,7 @@ mcl_structures.register_structure("shipwreck",{ { itemstring = "mcl_clock:clock", weight = 1, amount_min = 1, amount_max = 1 }, { itemstring = "mcl_compass:compass", weight = 1, amount_min = 1, amount_max = 1 }, { itemstring = "mcl_maps:empty_map", weight = 1, amount_min = 1, amount_max = 1 }, - { itemstring = "mcl_armor_trims:coast", weight = 20, amount_min = 2, amount_max = 2}, + { itemstring = "mcl_armor:coast", weight = 20, amount_min = 2, amount_max = 2}, } }, } diff --git a/mods/MAPGEN/mcl_structures/woodland_mansion.lua b/mods/MAPGEN/mcl_structures/woodland_mansion.lua index ef50ac714..15e9167fc 100644 --- a/mods/MAPGEN/mcl_structures/woodland_mansion.lua +++ b/mods/MAPGEN/mcl_structures/woodland_mansion.lua @@ -63,7 +63,7 @@ mcl_structures.register_structure("woodland_cabin",{ { itemstring = "mcl_armor:chestplate_chain", weight = 1, }, { itemstring = "mcl_armor:chestplate_diamond", weight = 1, }, { itemstring = "mcl_core:apple_gold_enchanted", weight = 2, }, - { itemstring = "mcl_armor_trims:vex", amount_max = 1, }, + { itemstring = "mcl_armor:vex", amount_max = 1, }, } }} } From 6c107ce9901639acc765b49a2d1e1953329637c3 Mon Sep 17 00:00:00 2001 From: chmodsayshello Date: Thu, 31 Aug 2023 17:59:46 +0200 Subject: [PATCH 147/982] fix for enchanted items --- mods/ITEMS/mcl_armor/api.lua | 8 +++++++- mods/ITEMS/mcl_armor/mod.conf | 2 +- mods/ITEMS/mcl_armor/trims.lua | 2 +- mods/ITEMS/mcl_grindstone/init.lua | 12 +++++++----- 4 files changed, 16 insertions(+), 8 deletions(-) diff --git a/mods/ITEMS/mcl_armor/api.lua b/mods/ITEMS/mcl_armor/api.lua index 0d82ca440..5ac172a2a 100644 --- a/mods/ITEMS/mcl_armor/api.lua +++ b/mods/ITEMS/mcl_armor/api.lua @@ -91,7 +91,13 @@ local function get_armor_texture(textures, name, modname, itemname, itemstring) mcl_armor.trims.core_textures[itemstring] = core_texture local func = function(obj, itemstack) local overlay = itemstack:get_meta():get_string("mcl_armor:trim_overlay") - local core_armor_texture = mcl_armor.trims.core_textures[itemstack:get_name()] + local core_armor_texture + local stack_name = mcl_grindstone.remove_enchant_name(itemstack) -- gets original itemstring if enchanted, no need to store (nearly) identical values + local core_armor_texture = mcl_armor.trims.core_textures[stack_name] + + if mcl_enchanting.is_enchanted(itemstack:get_name()) then -- working with the original stack to know wether to apply enchanting overlay or not + core_armor_texture = core_armor_texture .. mcl_enchanting.overlay + end if overlay == "" then return core_armor_texture end -- key not present; armor not trimmed diff --git a/mods/ITEMS/mcl_armor/mod.conf b/mods/ITEMS/mcl_armor/mod.conf index fad2e494c..cfbaa831f 100644 --- a/mods/ITEMS/mcl_armor/mod.conf +++ b/mods/ITEMS/mcl_armor/mod.conf @@ -1,5 +1,5 @@ name = mcl_armor author = stu description = Adds craftable armor that is visible to other players. -depends = mcl_core, mcl_player, mcl_enchanting, mcl_damage +depends = mcl_core, mcl_player, mcl_enchanting, mcl_damage, mcl_grindstone optional_depends = mcl_fire, ethereal, bakedclay diff --git a/mods/ITEMS/mcl_armor/trims.lua b/mods/ITEMS/mcl_armor/trims.lua index c29d16bb6..9e8e32625 100644 --- a/mods/ITEMS/mcl_armor/trims.lua +++ b/mods/ITEMS/mcl_armor/trims.lua @@ -1,5 +1,5 @@ local mod_registername = minetest.get_current_modname() .. ":" -local S = minetest.get_translator(modname) +local S = minetest.get_translator(minetest.get_current_modname()) for _, template_name in pairs(mcl_armor.trims.overlays) do minetest.register_craftitem(mod_registername .. template_name, { diff --git a/mods/ITEMS/mcl_grindstone/init.lua b/mods/ITEMS/mcl_grindstone/init.lua index e0137dcd1..f3ceaf825 100644 --- a/mods/ITEMS/mcl_grindstone/init.lua +++ b/mods/ITEMS/mcl_grindstone/init.lua @@ -1,5 +1,7 @@ -- Code based from mcl_anvils +mcl_grindstone = {} + local S = minetest.get_translator(minetest.get_current_modname()) local F = minetest.formspec_escape local C = minetest.colorize @@ -55,7 +57,7 @@ local function create_new_item(name_item, meta, wear) end -- If an item has an enchanment then remove "_enchanted" from the name -local function remove_enchant_name(stack) +function mcl_grindstone.remove_enchant_name(stack) if mcl_enchanting.is_enchanted(stack:get_name()) then local name = stack:get_name() return name.sub(name, 1, -11) @@ -116,8 +118,8 @@ local function update_grindstone_slots(meta) local def1 = input1:get_definition() local def2 = input2:get_definition() -- Remove enchant name if they have one - local name1 = remove_enchant_name(input1) - local name2 = remove_enchant_name(input2) + local name1 = mcl_grindstone.remove_enchant_name(input1) + local name2 = mcl_grindstone.remove_enchant_name(input2) -- Calculate repair local function calculate_repair(dur1, dur2) @@ -143,7 +145,7 @@ local function update_grindstone_slots(meta) local def1 = input1:get_definition() local meta = input1:get_meta() if def1.type == "tool" and mcl_enchanting.is_enchanted(input1:get_name()) then - local name = remove_enchant_name(input1) + local name = mcl_grindstone.remove_enchant_name(input1) local wear = input1:get_wear() local new_item = create_new_item(name, meta, wear) new_output = transfer_curse(input1, new_item) @@ -157,7 +159,7 @@ local function update_grindstone_slots(meta) local def2 = input2:get_definition() local meta = input2:get_meta() if def2.type == "tool" and mcl_enchanting.is_enchanted(input2:get_name()) then - local name = remove_enchant_name(input2) + local name = mcl_grindstone.remove_enchant_name(input2) local wear = input2:get_wear() local new_item = create_new_item(name, meta, wear) new_output = transfer_curse(input2, new_item) From 49bd28e1097b26c18038f5e7367a641b5fa84369 Mon Sep 17 00:00:00 2001 From: chmodsayshello Date: Thu, 31 Aug 2023 18:14:28 +0200 Subject: [PATCH 148/982] add/remove comments --- mods/ITEMS/mcl_armor/api.lua | 3 +++ mods/ITEMS/mcl_smithing_table/init.lua | 1 - 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/mods/ITEMS/mcl_armor/api.lua b/mods/ITEMS/mcl_armor/api.lua index 5ac172a2a..8551201b3 100644 --- a/mods/ITEMS/mcl_armor/api.lua +++ b/mods/ITEMS/mcl_armor/api.lua @@ -96,6 +96,9 @@ local function get_armor_texture(textures, name, modname, itemname, itemstring) local core_armor_texture = mcl_armor.trims.core_textures[stack_name] if mcl_enchanting.is_enchanted(itemstack:get_name()) then -- working with the original stack to know wether to apply enchanting overlay or not + --[[Far, Far in the future we may no longer _enchanted itemstrings... + To fix this code, simply put the unmodified itemstring in stack_name's place + DO NOT REMOVE THIS if UNLESS YOU KNOW WHAT YOU'RE TRYING TO ACHIEVE!--]] core_armor_texture = core_armor_texture .. mcl_enchanting.overlay end diff --git a/mods/ITEMS/mcl_smithing_table/init.lua b/mods/ITEMS/mcl_smithing_table/init.lua index 0c091080f..f6bfe91fb 100644 --- a/mods/ITEMS/mcl_smithing_table/init.lua +++ b/mods/ITEMS/mcl_smithing_table/init.lua @@ -98,7 +98,6 @@ function mcl_smithing_table.upgrade_trimmed(itemstack, color_mineral, template) --trimming process mcl_armor.trim(itemstack, overlay, material_name) - --itemstack:set_name(itemstack:get_name() .. "_trimmed_" .. overlay .. "_" .. material_name) tt.reload_itemstack_description(itemstack) return itemstack From 7b764adbc0c90a8909d2132379ceb352b620e24c Mon Sep 17 00:00:00 2001 From: Van Date: Thu, 31 Aug 2023 22:27:08 +0000 Subject: [PATCH 149/982] Banners color editing (#3868) ### Changing banner colors Reason: I think the current colors of the banners do not match the palette of the surrounding world. Solution: Muting Banner Tones ### Testing Check out the new colors on 12 color banners. ### Attachments Changed banner colors/Current banner appearance UPDATE: Adjusted colors, see the third attachment UPDATE: Changed the color of the white flag. Fixed a bug with different colors of patterns and banners, increased the contrast of folds. The last four attachments display all. Reviewed-on: https://git.minetest.land/MineClone2/MineClone2/pulls/3868 Reviewed-by: chmodsayshello Co-authored-by: Van Co-committed-by: Van --- mods/ITEMS/mcl_banners/init.lua | 32 +++++++++++++-------------- textures/mcl_banners_banner_base.png | Bin 791 -> 1126 bytes 2 files changed, 16 insertions(+), 16 deletions(-) diff --git a/mods/ITEMS/mcl_banners/init.lua b/mods/ITEMS/mcl_banners/init.lua index 18b50928a..8c2c1298c 100644 --- a/mods/ITEMS/mcl_banners/init.lua +++ b/mods/ITEMS/mcl_banners/init.lua @@ -22,22 +22,22 @@ mcl_banners = {} mcl_banners.colors = { -- Format: -- [ID] = { banner description, wool, unified dyes color group, overlay color, dye, color name for emblazonings } - ["unicolor_white"] = {"white", S("White Banner"), "mcl_wool:white", "#FFFFFF", "mcl_dye:white", N("White") }, + ["unicolor_white"] = {"white", S("White Banner"), "mcl_wool:white", "#C8C8C8", "mcl_dye:white", N("White") }, ["unicolor_darkgrey"] = {"grey", S("Grey Banner"), "mcl_wool:grey", "#303030", "mcl_dye:dark_grey", N("Grey") }, ["unicolor_grey"] = {"silver", S("Light Grey Banner"), "mcl_wool:silver", "#5B5B5B", "mcl_dye:grey", N("Light Grey") }, ["unicolor_black"] = {"black", S("Black Banner"), "mcl_wool:black", "#000000", "mcl_dye:black", N("Black") }, - ["unicolor_red"] = {"red", S("Red Banner"), "mcl_wool:red", "#BC0000", "mcl_dye:red", N("Red") }, - ["unicolor_yellow"] = {"yellow", S("Yellow Banner"), "mcl_wool:yellow", "#E6CD00", "mcl_dye:yellow", N("Yellow") }, - ["unicolor_dark_green"] = {"green", S("Green Banner"), "mcl_wool:green", "#006000", "mcl_dye:dark_green", N("Green") }, - ["unicolor_cyan"] = {"cyan", S("Cyan Banner"), "mcl_wool:cyan", "#00ACAC", "mcl_dye:cyan", N("Cyan") }, - ["unicolor_blue"] = {"blue", S("Blue Banner"), "mcl_wool:blue", "#0000AC", "mcl_dye:blue", N("Blue") }, - ["unicolor_red_violet"] = {"magenta", S("Magenta Banner"), "mcl_wool:magenta", "#AC007C", "mcl_dye:magenta", N("Magenta")}, - ["unicolor_orange"] = {"orange", S("Orange Banner"), "mcl_wool:orange", "#E67300", "mcl_dye:orange", N("Orange") }, - ["unicolor_violet"] = {"purple", S("Purple Banner"), "mcl_wool:purple", "#6400AC", "mcl_dye:violet", N("Violet") }, - ["unicolor_brown"] = {"brown", S("Brown Banner"), "mcl_wool:brown", "#603000", "mcl_dye:brown", N("Brown") }, - ["unicolor_pink"] = {"pink", S("Pink Banner"), "mcl_wool:pink", "#DE557C", "mcl_dye:pink", N("Pink") }, - ["unicolor_lime"] = {"lime", S("Lime Banner"), "mcl_wool:lime", "#30AC00", "mcl_dye:green", N("Lime") }, - ["unicolor_light_blue"] = {"light_blue", S("Light Blue Banner"), "mcl_wool:light_blue", "#4040CF", "mcl_dye:lightblue", N("Light Blue") }, + ["unicolor_red"] = {"red", S("Red Banner"), "mcl_wool:red", "#760F15", "mcl_dye:red", N("Red") }, + ["unicolor_yellow"] = {"yellow", S("Yellow Banner"), "mcl_wool:yellow", "#E2b43E", "mcl_dye:yellow", N("Yellow") }, + ["unicolor_dark_green"] = {"green", S("Green Banner"), "mcl_wool:green", "#385833", "mcl_dye:dark_green", N("Green") }, + ["unicolor_cyan"] = {"cyan", S("Cyan Banner"), "mcl_wool:cyan", "#114C56", "mcl_dye:cyan", N("Cyan") }, + ["unicolor_blue"] = {"blue", S("Blue Banner"), "mcl_wool:blue", "#20336B", "mcl_dye:blue", N("Blue") }, + ["unicolor_red_violet"] = {"magenta", S("Magenta Banner"), "mcl_wool:magenta", "#B36897", "mcl_dye:magenta", N("Magenta")}, + ["unicolor_orange"] = {"orange", S("Orange Banner"), "mcl_wool:orange", "#B35E2E", "mcl_dye:orange", N("Orange") }, + ["unicolor_violet"] = {"purple", S("Purple Banner"), "mcl_wool:purple", "#764F91", "mcl_dye:violet", N("Violet") }, + ["unicolor_brown"] = {"brown", S("Brown Banner"), "mcl_wool:brown", "#46251A", "mcl_dye:brown", N("Brown") }, + ["unicolor_pink"] = {"pink", S("Pink Banner"), "mcl_wool:pink", "#C98196", "mcl_dye:pink", N("Pink") }, + ["unicolor_lime"] = {"lime", S("Lime Banner"), "mcl_wool:lime", "#7DA553", "mcl_dye:green", N("Lime") }, + ["unicolor_light_blue"] = {"light_blue", S("Light Blue Banner"), "mcl_wool:light_blue", "#5176B2", "mcl_dye:lightblue", N("Light Blue") }, } @@ -96,8 +96,8 @@ end dofile(modpath.."/patterncraft.lua") -- Overlay ratios (0-255) -local base_color_ratio = 224 -local layer_ratio = 255 +local base_color_ratio = 225 +local layer_ratio = 225 local standing_banner_entity_offset = { x=0, y=-0.499, z=0 } local hanging_banner_entity_offset = { x=0, y=-1.7, z=0 } @@ -181,7 +181,7 @@ function mcl_banners.make_banner_texture(base_color, layers) local color = mcl_banners.colors[layerinfo.color][4] -- Generate layer texture - local layer = "(("..pattern.."^[colorize:"..color..":"..layer_ratio..")^[mask:"..pattern..")" + local layer = "((mcl_banners_banner_base.png^[colorize:"..color..":"..layer_ratio..")^[mask:"..pattern..")" finished_banner = finished_banner .. "^" .. layer end diff --git a/textures/mcl_banners_banner_base.png b/textures/mcl_banners_banner_base.png index 3ccd925645bb964163d525a6173a6211aafe1d95..b7824f0ec2a19feee5efc57e33221c5a8585caca 100644 GIT binary patch delta 1117 zcmV-j1fu(w2IdHm7=H)`00020X>r~F00b>bL_t(|+U=UZs#Gx$#`k%w#ZCk(K@e;N zI}2-H!t%a=l}~U>L9A{i+{#LDsoZq~9et&*=|K9o8;|FG<jir z4~Iia(cUwN_4f8QrD(6u-HdM#n(+<7Gytd5>7p4BXxjsDJRUEa0fDw2fM#&hmroyE zRIjJZ02pS0V8gQj7=i_Y4etT?_T|&L>5uPUFRItmmVg@R>6Rs+MtT}8fe-KAo|}ID z`2M1LT>`*HWPc&3@d|*A$U;!#?`#QRdRyx}GG3R80?<*-7_UnO&kIAF6Ksm>rp+l% zbAk~F>%Ip-N8JNq-S=hyjAZ}-vKav4I#1*5sH^el0|0m$XGdL)M<2Qb002M`7E1uw zn5+}z_7(s(ChG*by#kmX1v~(~^{>;O0qFXV!kuTl2Y+CC6i@&#EOLbE`T4#D0ER`5 zP(452w|oFQK`e>V60j1WOxkPBh$sQdq`lURh@t>H#u9+Y+xLv;`%#v+#ds?bVgSux z4uhpA5UqQ!2Jj+5FU_?;ME;=tt^hFNoCK8tZ1Miy=qrFN-rpO21)!NA=LO|FAmja` zXrN9o>wo>DXyD}moC;3?kV$`gqptum>2GiJEdab9fa@{O$X3}U=>k406hqn^Sm9snx=vZ_aJqj|uzYB1Uh%c5Y?KLd*wZL59Y6%ZoBllj5d?4g zdmAF036}Q*Ebs3@h-!iMX>E!1AVjr*l?q#Rz%YQ`ZcwilU@!pC+YRc~0t|)$@Q5pb zp-oW$z=)650<0PWM{5Dr9staUGJug(ShL8{B*@w$>;Yh(PzEqs3q$}$Yk>%W)&kQ2 zz<-Dl<2?W{V#N3?fby1@WkkgfSO7*!V$TOy#n68XfK%fs04lx!pV406Rsi^nYJoBU zEBtMNppMXs|63raBUAuxpyw` z#{gKT#8m*+DRJ+3dLT zH$(MIV1`=z0SaI!4E}4P2P0)4;Jtjrr!MUUgmwmx>-N3f!!;}aU;D}QXB~aE8eQ?paGe*3P-;w$xH9-XM^ggt^=91U?TbSE*eZ(zR1QMFAe) z7r9p2X$A^_Pf@@^+(H9Ddgc~r61LxOCulZqT5d~)p3w8u5}#s!IYEsh5GEZe6$n7l z2++lE7l6PR(g8paIW6LgEg&5N2%x2uNsB$&d+EU^uz$!(>kJgCewYF%gQ2eY49Lhu zb*41wsT4JavnbOSAbp*80C3?fYVYGG-~nU;yodW0Gz;+p%_})o#KgefY-}s-UXU77{z{pr!6f3=32^2%mDYjzrgAfsJN#DoQR)*KZ@EaO*sLe z{{pChF@abBZATB44o43Y|Kr@tZTh?bRcg))jDHiVE}*UHh@0j!!am|n{4VAZ`|=$3 z|9<@c-Iy46!%urOcxk%=Y~TI_7H*u}-> z)w;tbKnEg#iHVEzn#XphR=GGkuUchn^LX767b|B58i7$T3INtS(sSZ#MScJP002ov KP6b4+LSTaU>R}K7 From aa08a176fc60b60739116cc11b2c4350edf6104f Mon Sep 17 00:00:00 2001 From: SmokeyDope Date: Sun, 27 Aug 2023 22:20:54 +0000 Subject: [PATCH 150/982] lower ruined portal structure spawn rate --- mods/MAPGEN/mcl_structures/ruined_portal.lua | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mods/MAPGEN/mcl_structures/ruined_portal.lua b/mods/MAPGEN/mcl_structures/ruined_portal.lua index 0f7df6686..ef8c806ca 100644 --- a/mods/MAPGEN/mcl_structures/ruined_portal.lua +++ b/mods/MAPGEN/mcl_structures/ruined_portal.lua @@ -12,7 +12,7 @@ end local def = { place_on = {"group:grass_block","group:dirt","mcl_core:dirt_with_grass","group:grass_block","group:sand","group:grass_block_snow","mcl_core:snow"}, - fill_ratio = 0.01, + fill_ratio = 0.006, flags = "place_center_x, place_center_z, all_floors", solid_ground = true, make_foundation = true, From b911f99d23d3e4a3051e98375c99635e5d8d32a3 Mon Sep 17 00:00:00 2001 From: SmokeyDope Date: Sun, 27 Aug 2023 04:24:33 +0000 Subject: [PATCH 151/982] fix barrel sound code for proper max hear distance --- mods/ITEMS/mcl_barrels/init.lua | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/mods/ITEMS/mcl_barrels/init.lua b/mods/ITEMS/mcl_barrels/init.lua index e2f46be28..face52d6d 100644 --- a/mods/ITEMS/mcl_barrels/init.lua +++ b/mods/ITEMS/mcl_barrels/init.lua @@ -67,7 +67,10 @@ local function barrel_open(pos, node, clicker) minetest.swap_node(pos, { name = "mcl_barrels:barrel_open", param2 = node.param2 }) open_barrels[playername] = pos - minetest.sound_play({ name = "mcl_barrels_default_barrel_open", pos = pos, gain = 0.5, max_hear_distance = 16 }, true) + minetest.sound_play({name="mcl_barrels_default_barrel_open", gain=0.5}, { + pos = pos, + max_hear_distance = 16, + }, true) end ---@param pos Vector @@ -87,8 +90,11 @@ local function update_after_close(pos) if not node then return end if node.name == "mcl_barrels:barrel_open" then minetest.swap_node(pos, { name = "mcl_barrels:barrel_closed", param2 = node.param2 }) - minetest.sound_play({ name = "mcl_barrels_default_barrel_close", pos = pos, gain = 0.5, max_hear_distance = 16 }, - true) + minetest.sound_play({name="mcl_barrels_default_barrel_close", gain=0.5}, { + pos = pos, + max_hear_distance = 16, + }, true) + end end From 8b7a71f93e5413cb261673758564e3e05b654791 Mon Sep 17 00:00:00 2001 From: Sab Pyrope Date: Sat, 2 Sep 2023 14:57:56 +0800 Subject: [PATCH 152/982] Update Russian translation. Fix 1. --- README_locale/README.ru.md | 6 ++--- mods/ENTITIES/mcl_mobs/locale/mcl_mobs.ru.tr | 10 +++---- .../locale/doc_identifier.ru.tr | 2 +- .../HELP/doc/doc_items/locale/doc_items.ru.tr | 6 ++--- .../locale/mcl_doc_basics.ru.tr | 6 ++--- mods/HELP/mcl_tt/locale/mcl_tt.ru.tr | 4 +-- mods/HUD/awards/locale/awards.ru.tr | 2 +- .../locale/mcl_death_messages.ru.tr | 4 +-- .../locale/mcl_dispensers.ru.tr | 2 +- mods/ITEMS/mcl_anvils/locale/mcl_anvils.ru.tr | 2 +- mods/ITEMS/mcl_banners/init.lua | 26 +++++++++---------- .../mcl_compass/locale/mcl_compass.ru.tr | 2 +- .../locale/mcl_composters.ru.tr | 2 +- mods/ITEMS/mcl_core/locale/mcl_core.ru.tr | 2 +- .../mcl_deepslate/locale/mcl_deepslate.ru.tr | 2 +- .../locale/mcl_mobspawners.ru.tr | 6 ++--- .../locale/mcl_monster_eggs.ru.tr | 2 +- 17 files changed, 43 insertions(+), 43 deletions(-) diff --git a/README_locale/README.ru.md b/README_locale/README.ru.md index 101e14095..ebf7f0b26 100644 --- a/README_locale/README.ru.md +++ b/README_locale/README.ru.md @@ -99,7 +99,7 @@ Edition** уже реализовано и доработка имеющегос - Добиться производительности для запуска на действительно слабых компьютерах. ## Готовность -Игра сейчас в **бета** стадии. Она играбельна, но еще не имеет всех возможностей. +Игра сейчас на стадии **бета**. Она играбельна, но еще не имеет всех возможностей. Обратная совместимость целиком не гарантируется, обновление вашего мира может повлечь за собой небольшие ошибки. Если вы хотите использовать разрабатываемую версию Mineclone2, то ветка master обычно относительно стабильна. @@ -171,8 +171,8 @@ Mineclone2, то ветка master обычно относительно ста Технические отличия от Minecraft: -* Лимит высоты 31000 блоков (намного больше чем в Minecraft) -* Горизонтальный размер мира 62000×62000 блоков (намного меньше чем в Minecraft, но всё еще очень большой) +* Лимит высоты - 31000 блоков (намного больше чем в Minecraft) +* Горизонтальный размер мира - 62000×62000 блоков (намного меньше чем в Minecraft, но всё еще очень большой) * Всё еще не завершен и содержит много багов * Недостающие блоки, предметы, мобы * Некоторые предметы с другими названиями, чтобы лучше их различать diff --git a/mods/ENTITIES/mcl_mobs/locale/mcl_mobs.ru.tr b/mods/ENTITIES/mcl_mobs/locale/mcl_mobs.ru.tr index 0491672f1..7caa4852d 100644 --- a/mods/ENTITIES/mcl_mobs/locale/mcl_mobs.ru.tr +++ b/mods/ENTITIES/mcl_mobs/locale/mcl_mobs.ru.tr @@ -1,13 +1,13 @@ # textdomain: mcl_mobs -Peaceful mode active! No monsters will spawn.=Мирный режим включён! Монстры не будут спавниться. -This allows you to place a single mob.=Позволяет вам создать одного моба. -Just place it where you want the mob to appear. Animals will spawn tamed, unless you hold down the sneak key while placing. If you place this on a mob spawner, you change the mob it spawns.=Используйте предмет там, где вы хотите, чтобы появился моб. Животные будут появляться уже прирученные, если только вы не удерживаете клавишу [Красться] при размещении. Если использовать на спаунере мобов, изменится создаваемый им моб. +Peaceful mode active! No monsters will spawn.=Мирный режим включён! Монстры не будут спауниться. +This allows you to place a single mob.=Позволяет вам заспаунить одного моба. +Just place it where you want the mob to appear. Animals will spawn tamed, unless you hold down the sneak key while placing. If you place this on a mob spawner, you change the mob it spawns.=Используйте предмет там, где вы хотите, чтобы заспаунился моб. Животные будут спауниться уже прирученные, если только вы не удерживаете клавишу [Красться] при размещении. Если использовать на спаунере мобов, изменится создаваемый им моб. You need the “maphack” privilege to change the mob spawner.=Вам нужна привилегия “maphack”, чтобы изменить спаунер мобов. Name Tag=Бирка A name tag is an item to name a mob.=Бирка это предмет, дающий мобу имя. Before you use the name tag, you need to set a name at an anvil. Then you can use the name tag to name a mob. This uses up the name tag.=Прежде чем использовать бирку, нужно задать ей имя на наковальне. Тогда вы сможете использовать бирку, чтобы дать имя мобу. Only peaceful mobs allowed!=Разрешены только мирные мобы! Give names to mobs=Даёт имена мобам -Set name at anvil=Переименуйте на наковальне +Set name at anvil=Задайте имя на наковальне Removes specified mobs except nametagged and tamed ones. For the second parameter, use nametagged/tamed to select only nametagged/tamed mobs, or a range to specify a maximum distance from the player.=Удаляет указанных мобов кроме именованных и прирученных. Для второго параметра используйте nametagged/tamed, чтобы выбрать именованных/прирученных мобов или радиус указывающий максимальную дистанцию от игрока. -Default usage. Clearing hostile mobs. For more options please type: /help clearmobs=Параметры по умолчанию. Удаляем враждебных мобов. Для больших опций введите: /help clearmobs +Default usage. Clearing hostile mobs. For more options please type: /help clearmobs=Параметры по умолчанию. Удаляем враждебных мобов. Для дополнительных опций введите: /help clearmobs diff --git a/mods/HELP/doc/doc_identifier/locale/doc_identifier.ru.tr b/mods/HELP/doc/doc_identifier/locale/doc_identifier.ru.tr index 3fb9bb99f..b4e533142 100644 --- a/mods/HELP/doc/doc_identifier/locale/doc_identifier.ru.tr +++ b/mods/HELP/doc/doc_identifier/locale/doc_identifier.ru.tr @@ -11,7 +11,7 @@ No help entry for this block could be found.=Не удаётся найти сп No help entry for this item could be found.=Не удаётся найти справочной записи для этого предмета. No help entry for this object could be found.=Не удаётся найти справочной записи для этого объекта. OK=ОК -Punch any block, item or other thing about you wish to learn more about. This will open up the appropriate help entry. The tool comes in two modes which are changed by using. In liquid mode, this tool points to liquids as well while in solid mode this is not the case.=Ударьте по любому блоку, предмету и прочим вещам, про который вы хотите узнать больше. Откроется соответствующая справочная запись. Инструмент работает в двух режимах, меняющихся при использовании. В жидком режиме инструмент указывает на жидкости, в твёрдом режиме нет. +Punch any block, item or other thing about you wish to learn more about. This will open up the appropriate help entry. The tool comes in two modes which are changed by using. In liquid mode, this tool points to liquids as well while in solid mode this is not the case.=Ударьте по любому блоку, предмету и прочим вещам, про который вы хотите узнать больше. Откроется соответствующая справочная запись. Инструмент работает в двух режимах, меняющихся при использовании. В жидкостном режиме инструмент указывает на жидкости, в твёрдом режиме нет. This block cannot be identified because the world has not materialized at this point yet. Try again in a few seconds.=Этот блок не может быть идентифицирован, потому что мир не ещё материализовался в этой точке. This is a player.=Это игрок. This useful little helper can be used to quickly learn more about about one's closer environment. It identifies and analyzes blocks, items and other things and it shows extensive information about the thing on which it is used.=Этот маленький помощник выдаст вам быструю справку о чём-то из ближайшего окружения. Он идентифицирует и анализирует блоки, предметы и другие вещи и показывает подробную информацию о вещах, к которым они применимы. diff --git a/mods/HELP/doc/doc_items/locale/doc_items.ru.tr b/mods/HELP/doc/doc_items/locale/doc_items.ru.tr index 28fa9f479..ce5a9ca0a 100644 --- a/mods/HELP/doc/doc_items/locale/doc_items.ru.tr +++ b/mods/HELP/doc/doc_items/locale/doc_items.ru.tr @@ -39,9 +39,9 @@ Mining times:=Добыто раз: Mining this block is completely silent.=Добывание этого блока не издает звука. Miscellaneous items=Дополнительные предметы No=Нет -Pointable: No=Поворачиваемый: Нет -Pointable: Only by special items=Поворачиваемый: Только специальными предметами -Pointable: Yes=Поворачиваемый: Да +Pointable: No=Наводимый: нет +Pointable: Only by special items=Наводимый: только специальными предметами +Pointable: Yes=Наводимый: да Punches with this block don't work as usual; melee combat and mining are either not possible or work differently.=Удар этим блоком работает не так, как обычно; ближний бой и копание либо невозможны, либо работают по-другому. Punches with this item don't work as usual; melee combat and mining are either not possible or work differently.=Удар этим предметом работает не так, как обычно; ближний бой и копание либо невозможны, либо работают по-другому. Punches with this tool don't work as usual; melee combat and mining are either not possible or work differently.=Удар этим инструментом работает не так, как обычно; ближний бой и копание либо невозможны, либо работают по-другому. diff --git a/mods/HELP/mcl_doc_basics/locale/mcl_doc_basics.ru.tr b/mods/HELP/mcl_doc_basics/locale/mcl_doc_basics.ru.tr index 95739f7d5..8e8124f35 100644 --- a/mods/HELP/mcl_doc_basics/locale/mcl_doc_basics.ru.tr +++ b/mods/HELP/mcl_doc_basics/locale/mcl_doc_basics.ru.tr @@ -103,7 +103,7 @@ Technical:=Технические: • P: Only useful for developers. Writes current stack traces=• [P] - полезно только для разработчиков. Записывает текущие трассировки стека Players=Игроки Players (actually: “player characters”) are the characters which users control.=Игроки (на самом деле “игровые персонажи”) - персонажи, которыми управляют пользователи. -Players are living beings. They start with a number of health points (HP) and a number of breath points (BP).=Игроки это живые существа. Они появляются с определённым количеством очков здоровья (HP) и дыхания (BP). +Players are living beings. They start with a number of health points (HP) and a number of breath points (BP).=Игроки это живые существа. Они начинают с определённым количеством очков здоровья (HP) и дыхания (BP). Players are capable of walking, sneaking, jumping, climbing, swimming, diving, mining, building, fighting and using tools and blocks.=Игроки могут ходить, красться, прыгать, карабкаться, плавать, нырять, добывать, строить, сражаться и использовать инструменты и блоки. Players can take damage for a variety of reasons, here are some:=Игроки могут получить урон по разным причинам, вот некоторые: • Taking fall damage=• Получение урона от падения @@ -319,7 +319,7 @@ Gameplay:=Игровой процесс: • Crafting: Combining multiple items to create new ones=• Крафт: комбинирование нескольких предметов для создания новых • Crafting guide: A helper which shows available crafting recipes=• Книга рецептов: помощник, который показывает доступные рецепты • Spawning: Appearing in the world=• Спаунинг: появление в мире -• Respawning: Appearing again in the world after death=• Возрождение (респавн): появление снова в мире после смерти +• Respawning: Appearing again in the world after death=• Возрождение (респаун): появление снова в мире после смерти • Group: Puts similar things together, often affects gameplay=• Группа: объединяет похожие вещи, часто влияет на игровой процесс • noclip: Allows to fly through walls=• noclip (ноуклип): позволяет летать сквозь стены Interface=Интерфейс @@ -461,7 +461,7 @@ Enabling Creative Mode in MineClone 2 applies the following changes:=При вк Damage is not affected by Creative Mode, it needs to be disabled separately.=На урон творческий режим не влияет, его нужно отключать отдельно. Mobs=Мобы Mobs are the living beings in the world. This includes animals and monsters.=Мобы это живые существа в мире. Они включают в себя животных и монстров. -Mobs appear randomly throughout the world. This is called “spawning”. Each mob kind appears on particular block types at a given light level. The height also plays a role. Peaceful mobs tend to spawn at daylight while hostile ones prefer darkness. Most mobs can spawn on any solid block but some mobs only spawn on particular blocks (like grass blocks).=Мобы появляются случайным образом по всему миру. Это называется “спаун”. Каждый вид мобов появляется на определенных типах блоков при заданном уровне освещенности. Высота тоже играет свою роль. Мирные мобы, как правило, появляются при дневном свете, в то время как враждебные предпочитают темноту. Большинство мобов могут появляться на любом твердом блоке, но некоторые мобы появляются только на определённых блоках (например, травяных). +Mobs appear randomly throughout the world. This is called “spawning”. Each mob kind appears on particular block types at a given light level. The height also plays a role. Peaceful mobs tend to spawn at daylight while hostile ones prefer darkness. Most mobs can spawn on any solid block but some mobs only spawn on particular blocks (like grass blocks).=Мобы появляются случайным образом по всему миру. Это называется “спаун”. Каждый вид мобов спаунится на определенных типах блоков при заданном уровне освещенности. Высота тоже играет свою роль. Мирные мобы, как правило, спаунятся при дневном свете, в то время как враждебные предпочитают темноту. Большинство мобов могут заспаунится на любом твердом блоке, но некоторые мобы только на определённых блоках (например, травяных). Like players, mobs have hit points and sometimes armor points, too (which means you need better weapons to deal any damage at all). Also like players, hostile mobs can attack directly or at a distance. Mobs may drop random items after they die.=Как и игроки, мобы имеют очки здоровья, а иногда и очки защиты (что означает, что вам понадобится оружие получше, чтобы нанести им хоть какой-то урон). Так же, как и игроки, враждебные мобы могут атаковать вплотную или с расстояния. Мобы могут выбрасывать случайные предметы, когда умирают. Most animals roam the world aimlessly while most hostile mobs hunt players. Animals can be fed, tamed and bred.=Большинство животных бесцельно бродят по миру, в то время как большинство враждебных мобов охотятся на игроков. Животных можно кормить, приручать и разводить. Animals=Животные diff --git a/mods/HELP/mcl_tt/locale/mcl_tt.ru.tr b/mods/HELP/mcl_tt/locale/mcl_tt.ru.tr index d0a931e51..def0a6d1d 100644 --- a/mods/HELP/mcl_tt/locale/mcl_tt.ru.tr +++ b/mods/HELP/mcl_tt/locale/mcl_tt.ru.tr @@ -24,9 +24,9 @@ Full punch interval: @1s=Интервал удара: @1 с Contact damage: @1 per second=Урон при контакте: @1 HP/с Contact healing: @1 per second=Исцеление при контакте: @1 HP/с Drowning damage: @1=Урон при утоплении: @1 -Bouncy (@1%)=Упругий блок: @1% +Bouncy (@1%)=Упругий: @1% Luminance: @1=Свечение: @1 -Slippery=Скользкий блок +Slippery=Скользкий Climbable=Можно карабкаться Climbable (only downwards)=Можно спускаться вниз No jumping=Нельзя прыгать diff --git a/mods/HUD/awards/locale/awards.ru.tr b/mods/HUD/awards/locale/awards.ru.tr index be3d35dad..c064061e0 100644 --- a/mods/HUD/awards/locale/awards.ru.tr +++ b/mods/HUD/awards/locale/awards.ru.tr @@ -15,7 +15,7 @@ Advancement Made!=Получено достижение! Advancement Made:=Получено достижение: Advancement: @1=Достижение: @1 Achievement not found.=Достижение не найдено. -All your awards and statistics have been cleared. You can now start again.=Ваши награды и статистика удалена. Теперь можно начать всё сначала. +All your awards and statistics have been cleared. You can now start again.=Ваши награды и статистика удалены. Теперь можно начать всё сначала. Awards=Награды Craft: @1×@2=Создано: @1×@2 Craft: @1=Создано: @1 diff --git a/mods/HUD/mcl_death_messages/locale/mcl_death_messages.ru.tr b/mods/HUD/mcl_death_messages/locale/mcl_death_messages.ru.tr index 71f47505c..23c90fc05 100644 --- a/mods/HUD/mcl_death_messages/locale/mcl_death_messages.ru.tr +++ b/mods/HUD/mcl_death_messages/locale/mcl_death_messages.ru.tr @@ -49,7 +49,7 @@ @1 blew up=@1 взорвался(ась) @1 was blown up by @2=@1 был(а) взорван(а) @2 @1 was blown up by @2 using @3=@1 был(а) взорван(а) @2 с помощью @3 -@1 was squished too much=@1 был(а) слишком сильно сдавлен(а) -@1 was squashed by @2=@1 был(а) слишком сильно сдавлен(а), благодаря @2 +@1 was squished too much=@1 был(а) сдавлен(а) в лепёшку +@1 was squashed by @2=@1 был(а) сдавлен(а) в лепёшку, благодаря @2 @1 went off with a bang=@1 попал(а) в мир иной под звуки салюта @1 went off with a bang due to a firework fired by @2 from @3=@1 попал(а) в мир иной под звуки салюта, выпущенного из @3 игроком @2 \ No newline at end of file diff --git a/mods/ITEMS/REDSTONE/mcl_dispensers/locale/mcl_dispensers.ru.tr b/mods/ITEMS/REDSTONE/mcl_dispensers/locale/mcl_dispensers.ru.tr index 4a4d5b4fa..91438e5f6 100644 --- a/mods/ITEMS/REDSTONE/mcl_dispensers/locale/mcl_dispensers.ru.tr +++ b/mods/ITEMS/REDSTONE/mcl_dispensers/locale/mcl_dispensers.ru.tr @@ -16,7 +16,7 @@ The dispenser will do different things, depending on the dispensed item:=Раз • Shulker boxes: Are placed as a block=• Ящик шалкера: устанавливается как блок • TNT: Is placed and ignited=• ТНТ: устанавливается и поджигается • Flint and steel: Is used to ignite a fire in air and to ignite TNT=• Огниво: используется для зажигания огня в воздухе и для подрыва ТНТ -• Spawn eggs: Will summon the mob they contain=• Яйца спавна: будут вызывать мобов, содержащихся в них +• Spawn eggs: Will summon the mob they contain=• Яйца спауна: будут призывать мобов, содержащихся в них • Other items: Are simply dropped=• Другие предметы: просто выбрасываются Downwards-Facing Dispenser=• Раздатчик, направленный вниз Upwards-Facing Dispenser=• Раздатчик, направленный вверх diff --git a/mods/ITEMS/mcl_anvils/locale/mcl_anvils.ru.tr b/mods/ITEMS/mcl_anvils/locale/mcl_anvils.ru.tr index 40aef2121..e76da3a31 100644 --- a/mods/ITEMS/mcl_anvils/locale/mcl_anvils.ru.tr +++ b/mods/ITEMS/mcl_anvils/locale/mcl_anvils.ru.tr @@ -1,6 +1,6 @@ # textdomain: mcl_anvils Set Name=Дать имя -Repair and Name=Починить и переименовать +Repair and Name=Починить и дать имя Inventory=Инвентарь Anvil=Наковальня The anvil allows you to repair tools and armor, and to give names to items. It has a limited durability, however. Don't let it fall on your head, it could be quite painful!=Наковальня позволяет ремонтировать инструменты и броню, а также давать имена предметам. Но она имеет ограниченную прочность. Не дайте ей упасть вам на голову, это может быть больно! diff --git a/mods/ITEMS/mcl_banners/init.lua b/mods/ITEMS/mcl_banners/init.lua index fc2262888..6d9270b66 100644 --- a/mods/ITEMS/mcl_banners/init.lua +++ b/mods/ITEMS/mcl_banners/init.lua @@ -22,22 +22,22 @@ mcl_banners = {} mcl_banners.colors = { -- Format: -- [ID] = { banner description, wool, unified dyes color group, overlay color, dye, color name for emblazonings } - ["unicolor_white"] = {"white", S("White Banner"), "mcl_wool:white", "#FFFFFF", "mcl_dye:white", N("White") }, + ["unicolor_white"] = {"white", S("White Banner"), "mcl_wool:white", "#C8C8C8", "mcl_dye:white", N("White") }, ["unicolor_darkgrey"] = {"grey", S("Grey Banner"), "mcl_wool:grey", "#303030", "mcl_dye:dark_grey", N("Grey") }, ["unicolor_grey"] = {"silver", S("Light Grey Banner"), "mcl_wool:silver", "#5B5B5B", "mcl_dye:grey", N("Light Grey") }, ["unicolor_black"] = {"black", S("Black Banner"), "mcl_wool:black", "#000000", "mcl_dye:black", N("Black") }, - ["unicolor_red"] = {"red", S("Red Banner"), "mcl_wool:red", "#BC0000", "mcl_dye:red", N("Red") }, - ["unicolor_yellow"] = {"yellow", S("Yellow Banner"), "mcl_wool:yellow", "#E6CD00", "mcl_dye:yellow", N("Yellow") }, - ["unicolor_dark_green"] = {"green", S("Green Banner"), "mcl_wool:green", "#006000", "mcl_dye:dark_green", N("Green") }, - ["unicolor_cyan"] = {"cyan", S("Cyan Banner"), "mcl_wool:cyan", "#00ACAC", "mcl_dye:cyan", N("Cyan") }, - ["unicolor_blue"] = {"blue", S("Blue Banner"), "mcl_wool:blue", "#0000AC", "mcl_dye:blue", N("Blue") }, - ["unicolor_red_violet"] = {"magenta", S("Magenta Banner"), "mcl_wool:magenta", "#AC007C", "mcl_dye:magenta", N("Magenta")}, - ["unicolor_orange"] = {"orange", S("Orange Banner"), "mcl_wool:orange", "#E67300", "mcl_dye:orange", N("Orange") }, - ["unicolor_violet"] = {"purple", S("Purple Banner"), "mcl_wool:purple", "#6400AC", "mcl_dye:violet", N("Purple") }, - ["unicolor_brown"] = {"brown", S("Brown Banner"), "mcl_wool:brown", "#603000", "mcl_dye:brown", N("Brown") }, - ["unicolor_pink"] = {"pink", S("Pink Banner"), "mcl_wool:pink", "#DE557C", "mcl_dye:pink", N("Pink") }, - ["unicolor_lime"] = {"lime", S("Lime Banner"), "mcl_wool:lime", "#30AC00", "mcl_dye:green", N("Lime") }, - ["unicolor_light_blue"] = {"light_blue", S("Light Blue Banner"), "mcl_wool:light_blue", "#4040CF", "mcl_dye:lightblue", N("Light Blue") }, + ["unicolor_red"] = {"red", S("Red Banner"), "mcl_wool:red", "#760F15", "mcl_dye:red", N("Red") }, + ["unicolor_yellow"] = {"yellow", S("Yellow Banner"), "mcl_wool:yellow", "#E2b43E", "mcl_dye:yellow", N("Yellow") }, + ["unicolor_dark_green"] = {"green", S("Green Banner"), "mcl_wool:green", "#385833", "mcl_dye:dark_green", N("Green") }, + ["unicolor_cyan"] = {"cyan", S("Cyan Banner"), "mcl_wool:cyan", "#114C56", "mcl_dye:cyan", N("Cyan") }, + ["unicolor_blue"] = {"blue", S("Blue Banner"), "mcl_wool:blue", "#20336B", "mcl_dye:blue", N("Blue") }, + ["unicolor_red_violet"] = {"magenta", S("Magenta Banner"), "mcl_wool:magenta", "#B36897", "mcl_dye:magenta", N("Magenta")}, + ["unicolor_orange"] = {"orange", S("Orange Banner"), "mcl_wool:orange", "#B35E2E", "mcl_dye:orange", N("Orange") }, + ["unicolor_violet"] = {"purple", S("Purple Banner"), "mcl_wool:purple", "#764F91", "mcl_dye:violet", N("Violet") }, + ["unicolor_brown"] = {"brown", S("Brown Banner"), "mcl_wool:brown", "#46251A", "mcl_dye:brown", N("Brown") }, + ["unicolor_pink"] = {"pink", S("Pink Banner"), "mcl_wool:pink", "#C98196", "mcl_dye:pink", N("Pink") }, + ["unicolor_lime"] = {"lime", S("Lime Banner"), "mcl_wool:lime", "#7DA553", "mcl_dye:green", N("Lime") }, + ["unicolor_light_blue"] = {"light_blue", S("Light Blue Banner"), "mcl_wool:light_blue", "#5176B2", "mcl_dye:lightblue", N("Light Blue") }, } diff --git a/mods/ITEMS/mcl_compass/locale/mcl_compass.ru.tr b/mods/ITEMS/mcl_compass/locale/mcl_compass.ru.tr index a3631d182..a187c3da0 100644 --- a/mods/ITEMS/mcl_compass/locale/mcl_compass.ru.tr +++ b/mods/ITEMS/mcl_compass/locale/mcl_compass.ru.tr @@ -2,7 +2,7 @@ Compass=Компас Points to the world origin=Указывает на центр мира Compasses are tools which point to the world origin (X@=0, Z@=0) or the spawn point in the Overworld.=Компас - инструмент, показывающий на цента мира (X@=0, Z@=0) или на точку возрождения в Верхнем Мире. -A Compass always points to the world spawn point when the player is in the overworld. In other dimensions, it spins randomly.=Компас в Верхнем мире всегда указывает на мировую точку спавна. В других измерениях он крутится случайно. +A Compass always points to the world spawn point when the player is in the overworld. In other dimensions, it spins randomly.=Компас в Верхнем мире всегда указывает на мировую точку спауна. В других измерениях он крутится случайно. Lodestone Compass=Магнетитовый компас Points to a lodestone=Указывает на магнетит Lodestone compasses resemble regular compasses, but they point to a specific lodestone.=Магнетитовый компас напоминает обычный компас, но указывает на определенный блок магнетита. diff --git a/mods/ITEMS/mcl_composters/locale/mcl_composters.ru.tr b/mods/ITEMS/mcl_composters/locale/mcl_composters.ru.tr index 7fc3274d4..39f172199 100644 --- a/mods/ITEMS/mcl_composters/locale/mcl_composters.ru.tr +++ b/mods/ITEMS/mcl_composters/locale/mcl_composters.ru.tr @@ -1,7 +1,7 @@ # textdomain: mcl_composters Composter=Компостер Composters can convert various organic items into bonemeal.=Компостер может перерабатывать органические предметы в костную муку -Use organic items on the composter to fill it with layers of compost. Every time an item is put in the composter, there is a chance that the composter adds another layer of compost. Some items have a bigger chance of adding an extra layer than other items. After filling up with 7 layers of compost, the composter is full. After a delay of approximately one second the composter becomes ready and bone meal can be retrieved from it. Right-clicking the composter takes out the bone meal empties the composter.=Используйте органические предметы на компостере, чтобы заполнить его слоями перегноя. Каждый раз когда в компостер попадает предмет, есть шанс что в компостере появится новый слой перегноя. Некоторые предметы имеют больший шанс на появление нового слоя. После заполнения 7 слоями перегноя, компостер можно опустошить, забрав из него костную муку. После задержки в одну секунду компостей будет готов и костная мука будет извлечена из него. Правым кликом по компостеру чтобы забрать костную муку. +Use organic items on the composter to fill it with layers of compost. Every time an item is put in the composter, there is a chance that the composter adds another layer of compost. Some items have a bigger chance of adding an extra layer than other items. After filling up with 7 layers of compost, the composter is full. After a delay of approximately one second the composter becomes ready and bone meal can be retrieved from it. Right-clicking the composter takes out the bone meal empties the composter.=Используйте органические предметы на компостере, чтобы заполнить его слоями перегноя. Каждый раз когда в компостер попадает предмет, есть шанс что в компостере появится новый слой перегноя. Некоторые предметы имеют больший шанс на появление нового слоя. После заполнения 7 слоями перегноя, компостер можно опустошить, забрав из него костную муку. После задержки в одну секунду компостер будет готов и костная мука будет извлечена из него. Правым кликом по компостеру чтобы забрать костную муку. filled=заполнен ready for harvest=готов к сбору Converts organic items into bonemeal=Перерабатывает органику в костную муку diff --git a/mods/ITEMS/mcl_core/locale/mcl_core.ru.tr b/mods/ITEMS/mcl_core/locale/mcl_core.ru.tr index 6bc76a9ed..6f29bd37e 100644 --- a/mods/ITEMS/mcl_core/locale/mcl_core.ru.tr +++ b/mods/ITEMS/mcl_core/locale/mcl_core.ru.tr @@ -24,7 +24,7 @@ Andesite is an igneous rock.=Андезит это камень вулканич Apple=Яблоко Apples are food items which can be eaten.=Яблоки это съедобный продукт. Barrier=Барьер -Barriers are invisible walkable blocks. They are used to create boundaries of adventure maps and the like. Monsters and animals won't appear on barriers, and fences do not connect to barriers. Other blocks can be built on barriers like on any other block.=Барьеры это невидимые блоки-препятствия. Они могут использоваться, например, для создания границ карты. Монстры и животные не будут появляться на барьерах. Заборы с барьерами не соединяются. Другие блоки могут строиться на барьерах, как на любых других блоках. +Barriers are invisible walkable blocks. They are used to create boundaries of adventure maps and the like. Monsters and animals won't appear on barriers, and fences do not connect to barriers. Other blocks can be built on barriers like on any other block.=Барьеры это невидимые блоки-препятствия. Они могут использоваться, например, для создания границ карты. Монстры и животные не будут спауниться на барьерах. Заборы с барьерами не соединяются. Другие блоки могут строиться на барьерах, как на любых других блоках. Bedrock=Бедрок Bedrock is a very hard type of rock. It can not be broken, destroyed, collected or moved by normal means, unless in Creative Mode.=Бедрок это очень твёрдый камень. Его невозможно сломать, добыть или сдвинуть обычным способом, за исключением творческого режима. Birch Bark=Берёзовая кора diff --git a/mods/ITEMS/mcl_deepslate/locale/mcl_deepslate.ru.tr b/mods/ITEMS/mcl_deepslate/locale/mcl_deepslate.ru.tr index ee79dc298..070f83491 100644 --- a/mods/ITEMS/mcl_deepslate/locale/mcl_deepslate.ru.tr +++ b/mods/ITEMS/mcl_deepslate/locale/mcl_deepslate.ru.tr @@ -1,5 +1,5 @@ # textdomain: mcl_deepslate -An infested block is a block from which a silverfish will pop out when it is broken. It looks identical to its normal counterpart.=Заражённый блок это блок, после добычи которого из него появляется чешуйница. Блок выглядит идентично своему нормальному варианту. +An infested block is a block from which a silverfish will pop out when it is broken. It looks identical to its normal counterpart.=Заражённый блок это блок, после добычи которого спаунится чешуйница. Блок выглядит идентично своему нормальному варианту. Chiseled deepslate is the chiseled version of deepslate.=Резной сланец это резной вариант глубинного сланца. Chiseled Deepslate=Резной сланец Cobbled deepslate is a stone variant that functions similar to cobblestone or blackstone.=Дроблёный сланец это вариант камня, схожий на булыжник или чернокамень. diff --git a/mods/ITEMS/mcl_mobspawners/locale/mcl_mobspawners.ru.tr b/mods/ITEMS/mcl_mobspawners/locale/mcl_mobspawners.ru.tr index 3074e83ce..7c5bce336 100644 --- a/mods/ITEMS/mcl_mobspawners/locale/mcl_mobspawners.ru.tr +++ b/mods/ITEMS/mcl_mobspawners/locale/mcl_mobspawners.ru.tr @@ -1,5 +1,5 @@ # textdomain: mcl_mobspawners Mob Spawner=Спаунер мобов -A mob spawner regularily causes mobs to appear around it while a player is nearby. Some mob spawners are disabled while in light.=Спаунер постоянно создает мобов вокруг себя, пока поблизости находится игрок. Некоторые спаунеры отключаются под действием света. -If you have a spawn egg, you can use it to change the mob to spawn. Just place the item on the mob spawner. Player-set mob spawners always spawn mobs regardless of the light level.=Если у вас есть яйцо спауна, вы можете использовать его, чтобы выбрать моба, который будет появляться. Просто используйте яйцо на спаунере. Настроенные игроками спаунеры работают всегда, независимо от уровня освещения. -Makes mobs appear=Создаёт мобов +A mob spawner regularily causes mobs to appear around it while a player is nearby. Some mob spawners are disabled while in light.=Спаунер постоянно спаунит мобов вокруг себя, пока поблизости находится игрок. Некоторые спаунеры отключаются под действием света. +If you have a spawn egg, you can use it to change the mob to spawn. Just place the item on the mob spawner. Player-set mob spawners always spawn mobs regardless of the light level.=Если у вас есть яйцо спауна, вы можете использовать его, чтобы выбрать моба, который будет спауниться. Просто используйте яйцо на спаунере. Настроенные игроками спаунеры работают всегда, независимо от уровня освещения. +Makes mobs appear=Спаунит мобов diff --git a/mods/ITEMS/mcl_monster_eggs/locale/mcl_monster_eggs.ru.tr b/mods/ITEMS/mcl_monster_eggs/locale/mcl_monster_eggs.ru.tr index a196ac306..25d135d7b 100644 --- a/mods/ITEMS/mcl_monster_eggs/locale/mcl_monster_eggs.ru.tr +++ b/mods/ITEMS/mcl_monster_eggs/locale/mcl_monster_eggs.ru.tr @@ -1,5 +1,5 @@ # textdomain: mcl_monster_eggs -An infested block is a block from which a silverfish will pop out when it is broken. It looks identical to its normal counterpart.=Заражённый блок это блок, после добычи которого из него появляется чешуйница. Блок выглядит идентично своему нормальному варианту. +An infested block is a block from which a silverfish will pop out when it is broken. It looks identical to its normal counterpart.=Заражённый блок это блок, после добычи которого спаунится чешуйница. Блок выглядит идентично своему нормальному варианту. Infested Stone=Заражённый камень Infested Cobblestone=Заражённый булыжник Infested Stone Bricks=Заражённые каменные кирпичи From 8c41fb53e39805600b408f4c1e0fe189e3e792da Mon Sep 17 00:00:00 2001 From: Johannes Fritz Date: Mon, 31 Jul 2023 10:28:28 -0500 Subject: [PATCH 153/982] Fix cherry chest boat inv texture --- textures/mcl_boats_cherry_boat.png | Bin 250 -> 413 bytes textures/mcl_boats_cherry_chest_boat.png | Bin 317 -> 489 bytes 2 files changed, 0 insertions(+), 0 deletions(-) diff --git a/textures/mcl_boats_cherry_boat.png b/textures/mcl_boats_cherry_boat.png index 118baddfda5b21d337e46b5b068976e5de633044..0929c1455256ae158dceb210db969c47ad6c8c26 100644 GIT binary patch delta 387 zcmV-}0et@Y0i6SoBYy#8NklM3 zH)9JA!)_pkt)>)K2>|JiQ?l{qtVa$R(?nFN;LVZlnAOC^sMT4&x#+8j3lmojE0|5u z60laTz`_GiN_-5vfpo`cdlq_j-%3>tdR>;iE_$Jec66+iiF{5;UymHLJ&Q`aBlOVs zql?)c_?m1iTRJalaB+Kpf&p|OnsT^gx|555TB?^t z?qW^jn-k<;T2FOD?u1ina()kL?DyN;RR0ZMY$28bA`DvST9y+OkH_(aJNlVA;%M=& Z=M6skqh%m`b2R_}002ovPDHLkV1n60XCMFo diff --git a/textures/mcl_boats_cherry_chest_boat.png b/textures/mcl_boats_cherry_chest_boat.png index 8bc3725e6c39cca93504ebdeb801f61fd46aee38..e45c2ac3812f68b3409bbadee15da31a64d78a78 100644 GIT binary patch delta 463 zcmV;=0Wki(0_g*gB!93;L_t(I%f*wyY71clU36Cqf+3iu-6Rt!m};goiJe>*L$5~dq9FKh&-u>z zf9|>Pza_3KG@DITsZ^+%8Ln+0S1i6HbIx*?;c!U5-xmPZb$@UehSZF&+^+g0X+}Kx zMkcEadp)F-x_4q zH!7_BE~nKl;D6H|vsW+vtX-r~l8EEIT_u7V04g4_$TDr4G$B73V7M-#u>om*c{dvx9xCvWI!6 zshx?E)YkKp0p?mjrETaUy2+3h2yI#i;$hIU0D!VNF6CS@1An74K|W4~PJqpjIA`71 z34kHNUsel~Ad3L+gz(t!%=3PAVj=+kyqv!sq%BFJ4jGZG83NY9X*#wANzDf8+h%1? z?)2qOEe@DD2l{QAEZgX52ME#k(p$A4cT&5Q&6Z3E@V;F;kl0SAxO8L@fP_Gnb@^D@ oLE`7p_QkIEZ5wEdpRhlV7rl3xj&|nCDgXcg07*qoM6N<$f<`=qpa1{> From 878480d01076dc2ab4574fc983c1dcb5df1cfcb1 Mon Sep 17 00:00:00 2001 From: Julien Palard Date: Sat, 2 Sep 2023 15:18:30 +0200 Subject: [PATCH 154/982] mcl_oxidation: typo in README. --- mods/CORE/mcl_oxidation/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mods/CORE/mcl_oxidation/README.md b/mods/CORE/mcl_oxidation/README.md index 3f3291b19..06ad09489 100644 --- a/mods/CORE/mcl_oxidation/README.md +++ b/mods/CORE/mcl_oxidation/README.md @@ -11,4 +11,4 @@ For example, Copper Blocks have the definition arguement of `_mcl_waxed_variant For waxed nodes, scraping is easy. Start by putting `waxed = 1` into the list of groups of the waxed node. Next put `_mcl_stripped_variant = item string of the unwaxed variant of the node` into the defintion table. -Wxaed Copper Blocks can be scrapped into normal Copper Blocks because of the definition `_mcl_stripped_variant = "mcl_copper:block"`. +Waxed Copper Blocks can be scrapped into normal Copper Blocks because of the definition `_mcl_stripped_variant = "mcl_copper:block"`. From 1749712318b0b71969cb77921e13de21780c882f Mon Sep 17 00:00:00 2001 From: ancientmarinerdev Date: Thu, 31 Aug 2023 23:12:30 +0100 Subject: [PATCH 155/982] Change creepers line of sight check to raycast and do it from eyes to targets feet and head --- mods/ENTITIES/mcl_mobs/combat.lua | 3 +- mods/ENTITIES/mcl_mobs/movement.lua | 76 +++++++++++++++++++++++++++++ mods/ENTITIES/mobs_mc/creeper.lua | 1 + 3 files changed, 79 insertions(+), 1 deletion(-) diff --git a/mods/ENTITIES/mcl_mobs/combat.lua b/mods/ENTITIES/mcl_mobs/combat.lua index 836f53753..4b3393e36 100644 --- a/mods/ENTITIES/mcl_mobs/combat.lua +++ b/mods/ENTITIES/mcl_mobs/combat.lua @@ -853,7 +853,8 @@ function mob_class:do_states_attack (dtime) return end - local target_line_of_sight = self:line_of_sight(s, p, 2) + local target_line_of_sight = self:target_visible(s) + if not target_line_of_sight then if self.target_time_lost then local time_since_seen = os.time() - self.target_time_lost diff --git a/mods/ENTITIES/mcl_mobs/movement.lua b/mods/ENTITIES/mcl_mobs/movement.lua index 317ac9f28..46c470a15 100644 --- a/mods/ENTITIES/mcl_mobs/movement.lua +++ b/mods/ENTITIES/mcl_mobs/movement.lua @@ -76,6 +76,82 @@ function mob_class:is_node_waterhazard(nodename) return false end + +local function raycast_line_of_sight (origin, target) + local raycast = minetest.raycast(origin, target, false, true) + + local los_blocked = false + + for hitpoint in raycast do + if hitpoint.type == "node" then + --TODO type object could block vision, for example chests + --minetest.log(dump(hitpoint.type)) + + local node = minetest.get_node(minetest.get_pointed_thing_position(hitpoint)) + + --minetest.log("ray node:" .. node.name) + + if node.name ~= "air" then + local nodef = minetest.registered_nodes[node.name] + if nodef and nodef.walkable then + --minetest.log("walkable:" .. tostring(nodef.walkable)) + los_blocked = true + break + end + end + end + end + --minetest.log("los_blocked: " .. tostring(los_blocked)) + --minetest.log("visible: " .. tostring(not los_blocked)) + + return not los_blocked +end + +function mob_class:target_visible(origin) + if not origin then return end + + if not self.attack then return end + local target_pos = self.attack:get_pos() + + if not target_pos then return end + + local origin_eye_pos = vector.offset(origin, 0, self.head_eye_height, 0) + + --minetest.log("origin: " .. dump(origin)) + --minetest.log("origin_eye_pos: " .. dump(origin_eye_pos)) + + local targ_head_height, targ_feet_height + if self.attack:is_player() then + local cbox = self.object:get_properties().collisionbox + targ_head_height = vector.offset(target_pos, 0, cbox[5], 0) + targ_feet_height = target_pos -- Cbox would put feet under ground which interferes with ray + else + targ_head_height = vector.offset(target_pos, 0, self.collisionbox[5], 0) + targ_feet_height = vector.offset(target_pos, 0, self.collisionbox[2], 0) + end + + --local target_line_of_sight = self:line_of_sight(origin_eye_pos, targ_head_height, 2) + --local target_line_of_sight_feet = self:line_of_sight(origin_eye_pos, targ_feet_height, 2) + + --minetest.log("target_line_of_sight: " .. tostring(target_line_of_sight)) + --minetest.log("target_line_of_sight_feet: " .. tostring(target_line_of_sight_feet)) + + --minetest.log("start targ_head_height: " .. dump(targ_head_height)) + if raycast_line_of_sight (origin_eye_pos, targ_head_height) then + return true + end + + --minetest.log("Start targ_feet_height: " .. dump(targ_feet_height)) + if raycast_line_of_sight (origin_eye_pos, targ_feet_height) then + return true + end + + -- TODO mid way between feet and head + + --minetest.log("target is not visible so return false") + return false +end + -- check line of sight (BrunoMine) function mob_class:line_of_sight(pos1, pos2, stepsize) diff --git a/mods/ENTITIES/mobs_mc/creeper.lua b/mods/ENTITIES/mobs_mc/creeper.lua index f751b1240..72661971e 100644 --- a/mods/ENTITIES/mobs_mc/creeper.lua +++ b/mods/ENTITIES/mobs_mc/creeper.lua @@ -24,6 +24,7 @@ mcl_mobs.register_mob("mobs_mc:creeper", { mesh = "mobs_mc_creeper.b3d", head_swivel = "Head_Control", bone_eye_height = 2.35, + head_eye_height = 1.8; curiosity = 2, textures = { {"mobs_mc_creeper.png", From 969a08b7befe801e0d3d8658b5307f3917bc4a9a Mon Sep 17 00:00:00 2001 From: ancientmarinerdev Date: Thu, 31 Aug 2023 23:15:36 +0100 Subject: [PATCH 156/982] Clean up --- mods/ENTITIES/mcl_mobs/movement.lua | 15 --------------- 1 file changed, 15 deletions(-) diff --git a/mods/ENTITIES/mcl_mobs/movement.lua b/mods/ENTITIES/mcl_mobs/movement.lua index 46c470a15..ff9a38f56 100644 --- a/mods/ENTITIES/mcl_mobs/movement.lua +++ b/mods/ENTITIES/mcl_mobs/movement.lua @@ -85,25 +85,17 @@ local function raycast_line_of_sight (origin, target) for hitpoint in raycast do if hitpoint.type == "node" then --TODO type object could block vision, for example chests - --minetest.log(dump(hitpoint.type)) - local node = minetest.get_node(minetest.get_pointed_thing_position(hitpoint)) - --minetest.log("ray node:" .. node.name) - if node.name ~= "air" then local nodef = minetest.registered_nodes[node.name] if nodef and nodef.walkable then - --minetest.log("walkable:" .. tostring(nodef.walkable)) los_blocked = true break end end end end - --minetest.log("los_blocked: " .. tostring(los_blocked)) - --minetest.log("visible: " .. tostring(not los_blocked)) - return not los_blocked end @@ -130,12 +122,6 @@ function mob_class:target_visible(origin) targ_feet_height = vector.offset(target_pos, 0, self.collisionbox[2], 0) end - --local target_line_of_sight = self:line_of_sight(origin_eye_pos, targ_head_height, 2) - --local target_line_of_sight_feet = self:line_of_sight(origin_eye_pos, targ_feet_height, 2) - - --minetest.log("target_line_of_sight: " .. tostring(target_line_of_sight)) - --minetest.log("target_line_of_sight_feet: " .. tostring(target_line_of_sight_feet)) - --minetest.log("start targ_head_height: " .. dump(targ_head_height)) if raycast_line_of_sight (origin_eye_pos, targ_head_height) then return true @@ -148,7 +134,6 @@ function mob_class:target_visible(origin) -- TODO mid way between feet and head - --minetest.log("target is not visible so return false") return false end From 8b0097df71404c877123d9231fd3919436d61ea9 Mon Sep 17 00:00:00 2001 From: PrairieWind Date: Tue, 30 May 2023 12:44:15 -0600 Subject: [PATCH 157/982] Make campfires cook items --- mods/ITEMS/mcl_campfires/api.lua | 75 +++++++++++++++++++++++++++++++ mods/ITEMS/mcl_campfires/mod.conf | 4 +- mods/ITEMS/mcl_fishing/init.lua | 4 +- mods/ITEMS/mcl_mobitems/init.lua | 10 ++--- 4 files changed, 84 insertions(+), 9 deletions(-) diff --git a/mods/ITEMS/mcl_campfires/api.lua b/mods/ITEMS/mcl_campfires/api.lua index 8b0aff85e..6ed77b4a1 100644 --- a/mods/ITEMS/mcl_campfires/api.lua +++ b/mods/ITEMS/mcl_campfires/api.lua @@ -1,6 +1,72 @@ local S = minetest.get_translator(minetest.get_current_modname()) mcl_campfires = {} +local drop_items = mcl_util.drop_items_from_meta_container("main") + +local function on_blast(pos) + local node = minetest.get_node(pos) + drop_items(pos, node) + minetest.remove_node(pos) +end + +-- on_rightclick function to take items that are cookable in a campfire, and put them in the campfire inventory +function mcl_campfires.take_item(pos, node, player, itemstack) + local is_creative = minetest.is_creative_enabled(player:get_player_name()) + local inv = player:get_inventory() + local campfire_meta = minetest.get_meta(pos) + local campfire_inv = campfire_meta:get_inventory() + local timer = minetest.get_node_timer(pos) + local stack = itemstack:peek_item(1) + if minetest.get_item_group(itemstack:get_name(), "campfire_cookable") ~= 0 then + local cookable = minetest.get_craft_result({method = "cooking", width = 1, items = {itemstack}}) + if cookable then + for space = 1, 4 do -- Cycle through spots + local spot = campfire_inv:get_stack("main", space) + if not spot or spot == (ItemStack("") or ItemStack("nil")) then -- Check if the spot is empty or not + if not is_creative then itemstack:take_item(1) end -- Take the item if in creative + campfire_inv:set_stack("main", space, stack) -- Set the inventory itemstack at the empty spot + campfire_meta:set_int("cooktime_"..tostring(space), 30) -- Set the cook time meta + break + end + end + end + timer:start(1) -- Start cook timer + end +end + +-- on_timer function to run the cook timer and cook items. +function mcl_campfires.cook_item(pos, elapsed) + local meta = minetest.get_meta(pos) + local inv = meta:get_inventory() + local continue = 0 + -- Cycle through slots to cook them. + for i = 1, 4 do + local time_r = meta:get_int("cooktime_"..tostring(i)) + local item = inv:get_stack("main", i) + if item ~= (ItemStack("") or ItemStack("nil")) then + -- Item hasn't been cooked completely, continue cook timer countdown. + if time_r and time_r ~= 0 and time_r > 0 then + meta:set_int("cooktime_"..tostring(i), time_r - 1) + -- Item cook timer is up, finish cooking process and drop cooked item. + elseif time_r <= 0 then + local cooked = minetest.get_craft_result({method = "cooking", width = 1, items = {item}}) + if cooked then + minetest.add_item(pos, cooked.item) -- Drop Cooked Item + inv:set_stack("main", i, "") -- Clear Inventory + continue = continue + 1 -- Indicate that the slot is clear. + end + end + end + end + -- Not all slots are empty, continue timer. + if continue ~= 4 then + return true + -- Slots are empty, stop node timer. + else + return false + end +end + function mcl_campfires.register_campfire(name, def) -- Define Campfire minetest.register_node(name, { @@ -66,13 +132,20 @@ function mcl_campfires.register_campfire(name, def) groups = { handy=1, axey=1, material_wood=1, campfire=1, lit_campfire=1 }, paramtype = "light", paramtype2 = "facedir", + on_construct = function(pos) + local meta = minetest.get_meta(pos) + local inv = meta:get_inventory() + inv:set_size("main", 4) + end, on_rightclick = function (pos, node, player, itemstack, pointed_thing) if player:get_wielded_item():get_name():find("shovel") then node.name = name minetest.set_node(pos, node) minetest.sound_play("fire_extinguish_flame", {pos = pos, gain = 0.25, max_hear_distance = 16}, true) end + mcl_campfires.take_item(pos, node, player, itemstack) end, + on_timer = mcl_campfires.cook_item, drop = def.drops, _mcl_silk_touch_drop = {name.."_lit"}, light_source = def.lightlevel, @@ -88,6 +161,8 @@ function mcl_campfires.register_campfire(name, def) _mcl_blast_resistance = 2, _mcl_hardness = 2, damage_per_second = def.damage, + on_blast = on_blast, + after_dig_node = drop_items, }) end diff --git a/mods/ITEMS/mcl_campfires/mod.conf b/mods/ITEMS/mcl_campfires/mod.conf index 5c4b77dda..df31bb72c 100644 --- a/mods/ITEMS/mcl_campfires/mod.conf +++ b/mods/ITEMS/mcl_campfires/mod.conf @@ -1,3 +1,3 @@ name = mcl_campfires -depends = mcl_sounds -author = PrairieWind, Gerold55 \ No newline at end of file +depends = mcl_sounds, mcl_util +author = PrairieWind, Gerold55 diff --git a/mods/ITEMS/mcl_fishing/init.lua b/mods/ITEMS/mcl_fishing/init.lua index 893a376f5..4638325bd 100644 --- a/mods/ITEMS/mcl_fishing/init.lua +++ b/mods/ITEMS/mcl_fishing/init.lua @@ -435,7 +435,7 @@ minetest.register_craftitem("mcl_fishing:fish_raw", { on_place = minetest.item_eat(2), on_secondary_use = minetest.item_eat(2), stack_max = 64, - groups = { food=2, eatable = 2, smoker_cookable = 1 }, + groups = { food=2, eatable = 2, smoker_cookable = 1, campfire_cookable = 1 }, _mcl_saturation = 0.4, }) @@ -465,7 +465,7 @@ minetest.register_craftitem("mcl_fishing:salmon_raw", { on_place = minetest.item_eat(2), on_secondary_use = minetest.item_eat(2), stack_max = 64, - groups = { food=2, eatable = 2, smoker_cookable = 1 }, + groups = { food=2, eatable = 2, smoker_cookable = 1, campfire_cookable = 1 }, _mcl_saturation = 0.4, }) diff --git a/mods/ITEMS/mcl_mobitems/init.lua b/mods/ITEMS/mcl_mobitems/init.lua index 2dcfc6372..a47e11bfa 100644 --- a/mods/ITEMS/mcl_mobitems/init.lua +++ b/mods/ITEMS/mcl_mobitems/init.lua @@ -20,7 +20,7 @@ minetest.register_craftitem("mcl_mobitems:mutton", { wield_image = "mcl_mobitems_mutton_raw.png", on_place = minetest.item_eat(2), on_secondary_use = minetest.item_eat(2), - groups = { food = 2, eatable = 2, smoker_cookable = 1 }, + groups = { food = 2, eatable = 2, smoker_cookable = 1, campfire_cookable = 1 }, _mcl_saturation = 1.2, stack_max = 64, }) @@ -44,7 +44,7 @@ minetest.register_craftitem("mcl_mobitems:beef", { wield_image = "mcl_mobitems_beef_raw.png", on_place = minetest.item_eat(3), on_secondary_use = minetest.item_eat(3), - groups = { food = 2, eatable = 3, smoker_cookable = 1 }, + groups = { food = 2, eatable = 3, smoker_cookable = 1, campfire_cookable = 1 }, _mcl_saturation = 1.8, stack_max = 64, }) @@ -69,7 +69,7 @@ minetest.register_craftitem("mcl_mobitems:chicken", { wield_image = "mcl_mobitems_chicken_raw.png", on_place = minetest.item_eat(2), on_secondary_use = minetest.item_eat(2), - groups = { food = 2, eatable = 2, smoker_cookable = 1 }, + groups = { food = 2, eatable = 2, smoker_cookable = 1, campfire_cookable = 1 }, _mcl_saturation = 1.2, stack_max = 64, }) @@ -93,7 +93,7 @@ minetest.register_craftitem("mcl_mobitems:porkchop", { wield_image = "mcl_mobitems_porkchop_raw.png", on_place = minetest.item_eat(3), on_secondary_use = minetest.item_eat(3), - groups = { food = 2, eatable = 3, smoker_cookable = 1 }, + groups = { food = 2, eatable = 3, smoker_cookable = 1, campfire_cookable = 1 }, _mcl_saturation = 1.8, stack_max = 64, }) @@ -117,7 +117,7 @@ minetest.register_craftitem("mcl_mobitems:rabbit", { wield_image = "mcl_mobitems_rabbit_raw.png", on_place = minetest.item_eat(3), on_secondary_use = minetest.item_eat(3), - groups = { food = 2, eatable = 3, smoker_cookable = 1 }, + groups = { food = 2, eatable = 3, smoker_cookable = 1, campfire_cookable = 1 }, _mcl_saturation = 1.8, stack_max = 64, }) From d489c954f5759dc466bb719b86855175c79062f2 Mon Sep 17 00:00:00 2001 From: PrairieWind Date: Tue, 30 May 2023 15:13:37 -0600 Subject: [PATCH 158/982] Campfires make big smoke Smells like carcenogens, yum --- mods/ITEMS/mcl_campfires/api.lua | 35 ++++++++++++++++++++++++++++++++ 1 file changed, 35 insertions(+) diff --git a/mods/ITEMS/mcl_campfires/api.lua b/mods/ITEMS/mcl_campfires/api.lua index 6ed77b4a1..91db99fe5 100644 --- a/mods/ITEMS/mcl_campfires/api.lua +++ b/mods/ITEMS/mcl_campfires/api.lua @@ -190,3 +190,38 @@ minetest.register_globalstep(function(dtime) end end end) + +function mcl_campfires.generate_smoke(pos, haybale) + local smoke_timer + + if haybale then + smoke_timer = 8 + else + smoke_timer = 4.75 + end + + minetest.add_particle({ + pos = pos, + velocity = vector.new(0, 1, 0), + texture = "mcl_particles_smoke.png", + size = 10, + acceleration = vector.new(0, 0.5, 0), + collisiondetection = true, + expirationtime = smoke_timer, + }) +end + +minetest.register_abm({ + label = "Campfire Smoke", + nodenames = {"group:lit_campfire"}, + interval = 2, + chance = 2, + action = function(pos, node) + local node_below = vector.offset(pos, 0, -1, 0) + local haybale = false + if minetest.get_node(node_below).name == "mcl_farming:hay_block" then + haybale = true + end + mcl_campfires.generate_smoke(pos, haybale) + end, +}) From a7fcd629998f4d0bdcda87b380117405c461569a Mon Sep 17 00:00:00 2001 From: DinoNuggies4665 Date: Tue, 30 May 2023 16:06:57 -0500 Subject: [PATCH 159/982] Added visible items cooking on the fire --- mods/ITEMS/mcl_campfires/api.lua | 31 ++++----- mods/ITEMS/mcl_campfires/mod.conf | 4 +- mods/ITEMS/mcl_mobitems/init.lua | 112 +++++++++++++++++++++++++++++- 3 files changed, 128 insertions(+), 19 deletions(-) diff --git a/mods/ITEMS/mcl_campfires/api.lua b/mods/ITEMS/mcl_campfires/api.lua index 91db99fe5..90c0ae4c8 100644 --- a/mods/ITEMS/mcl_campfires/api.lua +++ b/mods/ITEMS/mcl_campfires/api.lua @@ -1,16 +1,16 @@ local S = minetest.get_translator(minetest.get_current_modname()) mcl_campfires = {} -local drop_items = mcl_util.drop_items_from_meta_container("main") - -local function on_blast(pos) - local node = minetest.get_node(pos) - drop_items(pos, node) - minetest.remove_node(pos) -end +local function say(msg) minetest.chat_send_all(msg) end -- on_rightclick function to take items that are cookable in a campfire, and put them in the campfire inventory function mcl_campfires.take_item(pos, node, player, itemstack) + local campfire_spots = { + {x = -0.25, y = -0.04, z = -0.25}, + {x = 0.25, y = -0.04, z = -0.25}, + {x = 0.25, y = -0.04, z = 0.25}, + {x = -0.25, y = -0.04, z = 0.25}, + } local is_creative = minetest.is_creative_enabled(player:get_player_name()) local inv = player:get_inventory() local campfire_meta = minetest.get_meta(pos) @@ -20,12 +20,13 @@ function mcl_campfires.take_item(pos, node, player, itemstack) if minetest.get_item_group(itemstack:get_name(), "campfire_cookable") ~= 0 then local cookable = minetest.get_craft_result({method = "cooking", width = 1, items = {itemstack}}) if cookable then - for space = 1, 4 do -- Cycle through spots + for space = 1, 4 do local spot = campfire_inv:get_stack("main", space) if not spot or spot == (ItemStack("") or ItemStack("nil")) then -- Check if the spot is empty or not - if not is_creative then itemstack:take_item(1) end -- Take the item if in creative - campfire_inv:set_stack("main", space, stack) -- Set the inventory itemstack at the empty spot - campfire_meta:set_int("cooktime_"..tostring(space), 30) -- Set the cook time meta + if not is_creative then itemstack:take_item(1) end + campfire_inv:set_stack("main", space, stack) + campfire_meta:set_int("cooktime_"..tostring(space), 30) + minetest.add_entity(pos + campfire_spots[space], player:get_wielded_item():get_name().."_entity") break end end @@ -51,9 +52,9 @@ function mcl_campfires.cook_item(pos, elapsed) elseif time_r <= 0 then local cooked = minetest.get_craft_result({method = "cooking", width = 1, items = {item}}) if cooked then - minetest.add_item(pos, cooked.item) -- Drop Cooked Item - inv:set_stack("main", i, "") -- Clear Inventory - continue = continue + 1 -- Indicate that the slot is clear. + minetest.add_item(pos, cooked.item) + inv:set_stack("main", i, "") + continue = continue + 1 end end end @@ -161,8 +162,6 @@ function mcl_campfires.register_campfire(name, def) _mcl_blast_resistance = 2, _mcl_hardness = 2, damage_per_second = def.damage, - on_blast = on_blast, - after_dig_node = drop_items, }) end diff --git a/mods/ITEMS/mcl_campfires/mod.conf b/mods/ITEMS/mcl_campfires/mod.conf index df31bb72c..5c4b77dda 100644 --- a/mods/ITEMS/mcl_campfires/mod.conf +++ b/mods/ITEMS/mcl_campfires/mod.conf @@ -1,3 +1,3 @@ name = mcl_campfires -depends = mcl_sounds, mcl_util -author = PrairieWind, Gerold55 +depends = mcl_sounds +author = PrairieWind, Gerold55 \ No newline at end of file diff --git a/mods/ITEMS/mcl_mobitems/init.lua b/mods/ITEMS/mcl_mobitems/init.lua index a47e11bfa..b27501756 100644 --- a/mods/ITEMS/mcl_mobitems/init.lua +++ b/mods/ITEMS/mcl_mobitems/init.lua @@ -25,6 +25,28 @@ minetest.register_craftitem("mcl_mobitems:mutton", { stack_max = 64, }) +minetest.register_entity("mcl_mobitems:mutton_entity", { + initial_properties = { + physical = false, + visual = "wielditem", + wield_item = "mcl_mobitems:mutton", + wield_image = "mcl_mobitems_mutton_raw.png", + visual_size = {x=0.25, y=0.25}, + collisionbox = {0,0,0,0,0,0}, + pointable = false, + }, + on_activate = function(self, staticdata) + self.timer = 0 + self.object:set_rotation({x = math.pi / 2, y = 0, z = 0}) + end, + on_step = function(self, dtime) + self.timer = self.timer + dtime + if self.timer > 31 then + self.object:remove() + end + end, +}) + minetest.register_craftitem("mcl_mobitems:cooked_mutton", { description = S("Cooked Mutton"), _doc_items_longdesc = S("Cooked mutton is the cooked flesh from a sheep and is used as food."), @@ -49,6 +71,28 @@ minetest.register_craftitem("mcl_mobitems:beef", { stack_max = 64, }) +minetest.register_entity("mcl_mobitems:beef_entity", { + initial_properties = { + physical = false, + visual = "wielditem", + wield_item = "mcl_mobitems:beef", + wield_image = "mcl_mobitems_beef_raw.png", + visual_size = {x=0.25, y=0.25}, + collisionbox = {0,0,0,0,0,0}, + pointable = false, + }, + on_activate = function(self, staticdata) + self.timer = 0 + self.object:set_rotation({x = math.pi / 2, y = 0, z = 0}) + end, + on_step = function(self, dtime) + self.timer = self.timer + dtime + if self.timer > 31 then + self.object:remove() + end + end, +}) + minetest.register_craftitem("mcl_mobitems:cooked_beef", { description = S("Steak"), _doc_items_longdesc = S("Steak is cooked beef from cows and can be eaten."), @@ -74,6 +118,28 @@ minetest.register_craftitem("mcl_mobitems:chicken", { stack_max = 64, }) +minetest.register_entity("mcl_mobitems:chicken_entity", { + initial_properties = { + physical = false, + visual = "wielditem", + wield_item = "mcl_mobitems:chicken", + wield_image = "mcl_mobitems_chicken_raw.png", + visual_size = {x=0.25, y=0.25}, + collisionbox = {0,0,0,0,0,0}, + pointable = false, + }, + on_activate = function(self, staticdata) + self.timer = 0 + self.object:set_rotation({x = math.pi / 2, y = 0, z = 0}) + end, + on_step = function(self, dtime) + self.timer = self.timer + dtime + if self.timer > 31 then + self.object:remove() + end + end, +}) + minetest.register_craftitem("mcl_mobitems:cooked_chicken", { description = S("Cooked Chicken"), _doc_items_longdesc = S("A cooked chicken is a healthy food item which can be eaten."), @@ -98,6 +164,28 @@ minetest.register_craftitem("mcl_mobitems:porkchop", { stack_max = 64, }) +minetest.register_entity("mcl_mobitems:porkchop_entity", { + initial_properties = { + physical = false, + visual = "wielditem", + wield_item = "mcl_mobitems:porkchop", + wield_image = "mcl_mobitems_porkchop_raw.png", + visual_size = {x=0.25, y=0.25}, + collisionbox = {0,0,0,0,0,0}, + pointable = false, + }, + on_activate = function(self, staticdata) + self.timer = 0 + self.object:set_rotation({x = math.pi / 2, y = 0, z = 0}) + end, + on_step = function(self, dtime) + self.timer = self.timer + dtime + if self.timer > 31 then + self.object:remove() + end + end, +}) + minetest.register_craftitem("mcl_mobitems:cooked_porkchop", { description = S("Cooked Porkchop"), _doc_items_longdesc = S("Cooked porkchop is the cooked flesh of a pig and is used as food."), @@ -122,6 +210,28 @@ minetest.register_craftitem("mcl_mobitems:rabbit", { stack_max = 64, }) +minetest.register_entity("mcl_mobitems:rabbit_entity", { + initial_properties = { + physical = false, + visual = "wielditem", + wield_item = "mcl_mobitems:rabbit", + wield_image = "mcl_mobitems_rabbit_raw.png", + visual_size = {x=0.25, y=0.25}, + collisionbox = {0,0,0,0,0,0}, + pointable = false, + }, + on_activate = function(self, staticdata) + self.timer = 0 + self.object:set_rotation({x = math.pi / 2, y = 0, z = 0}) + end, + on_step = function(self, dtime) + self.timer = self.timer + dtime + if self.timer > 31 then + self.object:remove() + end + end, +}) + minetest.register_craftitem("mcl_mobitems:cooked_rabbit", { description = S("Cooked Rabbit"), _doc_items_longdesc = S("This is a food item which can be eaten."), @@ -339,7 +449,7 @@ minetest.register_tool("mcl_mobitems:warped_fungus_on_a_stick", { description = S("Warped fungus on a Stick"), _tt_help = S("Lets you ride a strider"), _doc_items_longdesc = S("A warped fungus on a stick can be used on saddled striders to ride them."), - _doc_items_usagehelp = S("Place it on a saddled strider to mount it. You can now ride the strider like a horse. Striders will also walk towards you when you just wield the fungus on a stick."), + _doc_items_usagehelp = S("Place it on a saddled strider to mount it. You can now ride the strider like a horse. Striders will also walk towards you when you just wield the carrot on a stick."), wield_image = "mcl_mobitems_warped_fungus_on_a_stick.png^[transformFY^[transformR90", inventory_image = "mcl_mobitems_warped_fungus_on_a_stick.png", groups = { transport = 1 }, From aca82fcafcb122414e6ed495dee143b382cef4da Mon Sep 17 00:00:00 2001 From: DinoNuggies4665 Date: Tue, 30 May 2023 16:19:48 -0500 Subject: [PATCH 160/982] modified: mods/ITEMS/mcl_campfires/api.lua modified: mods/ITEMS/mcl_mobitems/init.lua --- mods/ITEMS/mcl_campfires/api.lua | 31 ++++----- mods/ITEMS/mcl_mobitems/init.lua | 112 +------------------------------ 2 files changed, 17 insertions(+), 126 deletions(-) diff --git a/mods/ITEMS/mcl_campfires/api.lua b/mods/ITEMS/mcl_campfires/api.lua index 90c0ae4c8..91db99fe5 100644 --- a/mods/ITEMS/mcl_campfires/api.lua +++ b/mods/ITEMS/mcl_campfires/api.lua @@ -1,16 +1,16 @@ local S = minetest.get_translator(minetest.get_current_modname()) mcl_campfires = {} -local function say(msg) minetest.chat_send_all(msg) end +local drop_items = mcl_util.drop_items_from_meta_container("main") + +local function on_blast(pos) + local node = minetest.get_node(pos) + drop_items(pos, node) + minetest.remove_node(pos) +end -- on_rightclick function to take items that are cookable in a campfire, and put them in the campfire inventory function mcl_campfires.take_item(pos, node, player, itemstack) - local campfire_spots = { - {x = -0.25, y = -0.04, z = -0.25}, - {x = 0.25, y = -0.04, z = -0.25}, - {x = 0.25, y = -0.04, z = 0.25}, - {x = -0.25, y = -0.04, z = 0.25}, - } local is_creative = minetest.is_creative_enabled(player:get_player_name()) local inv = player:get_inventory() local campfire_meta = minetest.get_meta(pos) @@ -20,13 +20,12 @@ function mcl_campfires.take_item(pos, node, player, itemstack) if minetest.get_item_group(itemstack:get_name(), "campfire_cookable") ~= 0 then local cookable = minetest.get_craft_result({method = "cooking", width = 1, items = {itemstack}}) if cookable then - for space = 1, 4 do + for space = 1, 4 do -- Cycle through spots local spot = campfire_inv:get_stack("main", space) if not spot or spot == (ItemStack("") or ItemStack("nil")) then -- Check if the spot is empty or not - if not is_creative then itemstack:take_item(1) end - campfire_inv:set_stack("main", space, stack) - campfire_meta:set_int("cooktime_"..tostring(space), 30) - minetest.add_entity(pos + campfire_spots[space], player:get_wielded_item():get_name().."_entity") + if not is_creative then itemstack:take_item(1) end -- Take the item if in creative + campfire_inv:set_stack("main", space, stack) -- Set the inventory itemstack at the empty spot + campfire_meta:set_int("cooktime_"..tostring(space), 30) -- Set the cook time meta break end end @@ -52,9 +51,9 @@ function mcl_campfires.cook_item(pos, elapsed) elseif time_r <= 0 then local cooked = minetest.get_craft_result({method = "cooking", width = 1, items = {item}}) if cooked then - minetest.add_item(pos, cooked.item) - inv:set_stack("main", i, "") - continue = continue + 1 + minetest.add_item(pos, cooked.item) -- Drop Cooked Item + inv:set_stack("main", i, "") -- Clear Inventory + continue = continue + 1 -- Indicate that the slot is clear. end end end @@ -162,6 +161,8 @@ function mcl_campfires.register_campfire(name, def) _mcl_blast_resistance = 2, _mcl_hardness = 2, damage_per_second = def.damage, + on_blast = on_blast, + after_dig_node = drop_items, }) end diff --git a/mods/ITEMS/mcl_mobitems/init.lua b/mods/ITEMS/mcl_mobitems/init.lua index b27501756..a47e11bfa 100644 --- a/mods/ITEMS/mcl_mobitems/init.lua +++ b/mods/ITEMS/mcl_mobitems/init.lua @@ -25,28 +25,6 @@ minetest.register_craftitem("mcl_mobitems:mutton", { stack_max = 64, }) -minetest.register_entity("mcl_mobitems:mutton_entity", { - initial_properties = { - physical = false, - visual = "wielditem", - wield_item = "mcl_mobitems:mutton", - wield_image = "mcl_mobitems_mutton_raw.png", - visual_size = {x=0.25, y=0.25}, - collisionbox = {0,0,0,0,0,0}, - pointable = false, - }, - on_activate = function(self, staticdata) - self.timer = 0 - self.object:set_rotation({x = math.pi / 2, y = 0, z = 0}) - end, - on_step = function(self, dtime) - self.timer = self.timer + dtime - if self.timer > 31 then - self.object:remove() - end - end, -}) - minetest.register_craftitem("mcl_mobitems:cooked_mutton", { description = S("Cooked Mutton"), _doc_items_longdesc = S("Cooked mutton is the cooked flesh from a sheep and is used as food."), @@ -71,28 +49,6 @@ minetest.register_craftitem("mcl_mobitems:beef", { stack_max = 64, }) -minetest.register_entity("mcl_mobitems:beef_entity", { - initial_properties = { - physical = false, - visual = "wielditem", - wield_item = "mcl_mobitems:beef", - wield_image = "mcl_mobitems_beef_raw.png", - visual_size = {x=0.25, y=0.25}, - collisionbox = {0,0,0,0,0,0}, - pointable = false, - }, - on_activate = function(self, staticdata) - self.timer = 0 - self.object:set_rotation({x = math.pi / 2, y = 0, z = 0}) - end, - on_step = function(self, dtime) - self.timer = self.timer + dtime - if self.timer > 31 then - self.object:remove() - end - end, -}) - minetest.register_craftitem("mcl_mobitems:cooked_beef", { description = S("Steak"), _doc_items_longdesc = S("Steak is cooked beef from cows and can be eaten."), @@ -118,28 +74,6 @@ minetest.register_craftitem("mcl_mobitems:chicken", { stack_max = 64, }) -minetest.register_entity("mcl_mobitems:chicken_entity", { - initial_properties = { - physical = false, - visual = "wielditem", - wield_item = "mcl_mobitems:chicken", - wield_image = "mcl_mobitems_chicken_raw.png", - visual_size = {x=0.25, y=0.25}, - collisionbox = {0,0,0,0,0,0}, - pointable = false, - }, - on_activate = function(self, staticdata) - self.timer = 0 - self.object:set_rotation({x = math.pi / 2, y = 0, z = 0}) - end, - on_step = function(self, dtime) - self.timer = self.timer + dtime - if self.timer > 31 then - self.object:remove() - end - end, -}) - minetest.register_craftitem("mcl_mobitems:cooked_chicken", { description = S("Cooked Chicken"), _doc_items_longdesc = S("A cooked chicken is a healthy food item which can be eaten."), @@ -164,28 +98,6 @@ minetest.register_craftitem("mcl_mobitems:porkchop", { stack_max = 64, }) -minetest.register_entity("mcl_mobitems:porkchop_entity", { - initial_properties = { - physical = false, - visual = "wielditem", - wield_item = "mcl_mobitems:porkchop", - wield_image = "mcl_mobitems_porkchop_raw.png", - visual_size = {x=0.25, y=0.25}, - collisionbox = {0,0,0,0,0,0}, - pointable = false, - }, - on_activate = function(self, staticdata) - self.timer = 0 - self.object:set_rotation({x = math.pi / 2, y = 0, z = 0}) - end, - on_step = function(self, dtime) - self.timer = self.timer + dtime - if self.timer > 31 then - self.object:remove() - end - end, -}) - minetest.register_craftitem("mcl_mobitems:cooked_porkchop", { description = S("Cooked Porkchop"), _doc_items_longdesc = S("Cooked porkchop is the cooked flesh of a pig and is used as food."), @@ -210,28 +122,6 @@ minetest.register_craftitem("mcl_mobitems:rabbit", { stack_max = 64, }) -minetest.register_entity("mcl_mobitems:rabbit_entity", { - initial_properties = { - physical = false, - visual = "wielditem", - wield_item = "mcl_mobitems:rabbit", - wield_image = "mcl_mobitems_rabbit_raw.png", - visual_size = {x=0.25, y=0.25}, - collisionbox = {0,0,0,0,0,0}, - pointable = false, - }, - on_activate = function(self, staticdata) - self.timer = 0 - self.object:set_rotation({x = math.pi / 2, y = 0, z = 0}) - end, - on_step = function(self, dtime) - self.timer = self.timer + dtime - if self.timer > 31 then - self.object:remove() - end - end, -}) - minetest.register_craftitem("mcl_mobitems:cooked_rabbit", { description = S("Cooked Rabbit"), _doc_items_longdesc = S("This is a food item which can be eaten."), @@ -449,7 +339,7 @@ minetest.register_tool("mcl_mobitems:warped_fungus_on_a_stick", { description = S("Warped fungus on a Stick"), _tt_help = S("Lets you ride a strider"), _doc_items_longdesc = S("A warped fungus on a stick can be used on saddled striders to ride them."), - _doc_items_usagehelp = S("Place it on a saddled strider to mount it. You can now ride the strider like a horse. Striders will also walk towards you when you just wield the carrot on a stick."), + _doc_items_usagehelp = S("Place it on a saddled strider to mount it. You can now ride the strider like a horse. Striders will also walk towards you when you just wield the fungus on a stick."), wield_image = "mcl_mobitems_warped_fungus_on_a_stick.png^[transformFY^[transformR90", inventory_image = "mcl_mobitems_warped_fungus_on_a_stick.png", groups = { transport = 1 }, From cef6c72a715e59e24fcd3e7cca4b511146b30c9a Mon Sep 17 00:00:00 2001 From: DinoNuggies4665 Date: Tue, 30 May 2023 16:21:01 -0500 Subject: [PATCH 161/982] modified: mods/ITEMS/mcl_campfires/mod.conf --- mods/ITEMS/mcl_campfires/mod.conf | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mods/ITEMS/mcl_campfires/mod.conf b/mods/ITEMS/mcl_campfires/mod.conf index 5c4b77dda..0f8bc6cbf 100644 --- a/mods/ITEMS/mcl_campfires/mod.conf +++ b/mods/ITEMS/mcl_campfires/mod.conf @@ -1,3 +1,3 @@ name = mcl_campfires -depends = mcl_sounds +depends = mcl_sounds, mcl_util author = PrairieWind, Gerold55 \ No newline at end of file From 0b7cec419af20336f5c68a41c954118c458fb05a Mon Sep 17 00:00:00 2001 From: DinoNuggies4665 Date: Tue, 30 May 2023 16:31:58 -0500 Subject: [PATCH 162/982] Added visible items cooking on the fire --- mods/ITEMS/mcl_campfires/api.lua | 7 ++ mods/ITEMS/mcl_fishing/init.lua | 44 +++++++++++++ mods/ITEMS/mcl_mobitems/init.lua | 110 +++++++++++++++++++++++++++++++ 3 files changed, 161 insertions(+) diff --git a/mods/ITEMS/mcl_campfires/api.lua b/mods/ITEMS/mcl_campfires/api.lua index 91db99fe5..6f0251976 100644 --- a/mods/ITEMS/mcl_campfires/api.lua +++ b/mods/ITEMS/mcl_campfires/api.lua @@ -11,6 +11,12 @@ end -- on_rightclick function to take items that are cookable in a campfire, and put them in the campfire inventory function mcl_campfires.take_item(pos, node, player, itemstack) + local campfire_spots = { + {x = -0.25, y = -0.04, z = -0.25}, + {x = 0.25, y = -0.04, z = -0.25}, + {x = 0.25, y = -0.04, z = 0.25}, + {x = -0.25, y = -0.04, z = 0.25}, + } local is_creative = minetest.is_creative_enabled(player:get_player_name()) local inv = player:get_inventory() local campfire_meta = minetest.get_meta(pos) @@ -26,6 +32,7 @@ function mcl_campfires.take_item(pos, node, player, itemstack) if not is_creative then itemstack:take_item(1) end -- Take the item if in creative campfire_inv:set_stack("main", space, stack) -- Set the inventory itemstack at the empty spot campfire_meta:set_int("cooktime_"..tostring(space), 30) -- Set the cook time meta + minetest.add_entity(pos + campfire_spots[space], player:get_wielded_item():get_name().."_entity") -- Spawn food item on the campfire break end end diff --git a/mods/ITEMS/mcl_fishing/init.lua b/mods/ITEMS/mcl_fishing/init.lua index 4638325bd..20e90aaa5 100644 --- a/mods/ITEMS/mcl_fishing/init.lua +++ b/mods/ITEMS/mcl_fishing/init.lua @@ -457,6 +457,28 @@ minetest.register_craft({ cooktime = 10, }) +minetest.register_entity("mcl_fishing:fish_entity", { + initial_properties = { + physical = false, + visual = "wielditem", + wield_item = "mcl_fishing:fish_raw", + wield_image = "mcl_fishing_fish_raw.png", + visual_size = {x=0.25, y=0.25}, + collisionbox = {0,0,0,0,0,0}, + pointable = false, + }, + on_activate = function(self, staticdata) + self.timer = 0 + self.object:set_rotation({x = math.pi / 2, y = 0, z = 0}) + end, + on_step = function(self, dtime) + self.timer = self.timer + dtime + if self.timer > 31 then + self.object:remove() + end + end, +}) + -- Salmon minetest.register_craftitem("mcl_fishing:salmon_raw", { description = S("Raw Salmon"), @@ -487,6 +509,28 @@ minetest.register_craft({ cooktime = 10, }) +minetest.register_entity("mcl_fishing:salmon_entity", { + initial_properties = { + physical = false, + visual = "wielditem", + wield_item = "mcl_fishing:salmon_raw", + wield_image = "mcl_fishing_salmon_raw.png", + visual_size = {x=0.25, y=0.25}, + collisionbox = {0,0,0,0,0,0}, + pointable = false, + }, + on_activate = function(self, staticdata) + self.timer = 0 + self.object:set_rotation({x = math.pi / 2, y = 0, z = 0}) + end, + on_step = function(self, dtime) + self.timer = self.timer + dtime + if self.timer > 31 then + self.object:remove() + end + end, +}) + -- Clownfish minetest.register_craftitem("mcl_fishing:clownfish_raw", { description = S("Clownfish"), diff --git a/mods/ITEMS/mcl_mobitems/init.lua b/mods/ITEMS/mcl_mobitems/init.lua index a47e11bfa..a84e3ece8 100644 --- a/mods/ITEMS/mcl_mobitems/init.lua +++ b/mods/ITEMS/mcl_mobitems/init.lua @@ -37,6 +37,28 @@ minetest.register_craftitem("mcl_mobitems:cooked_mutton", { stack_max = 64, }) +minetest.register_entity("mcl_mobitems:mutton_entity", { + initial_properties = { + physical = false, + visual = "wielditem", + wield_item = "mcl_mobitems:mutton", + wield_image = "mcl_mobitems_mutton_raw.png", + visual_size = {x=0.25, y=0.25}, + collisionbox = {0,0,0,0,0,0}, + pointable = false, + }, + on_activate = function(self, staticdata) + self.timer = 0 + self.object:set_rotation({x = math.pi / 2, y = 0, z = 0}) + end, + on_step = function(self, dtime) + self.timer = self.timer + dtime + if self.timer > 31 then + self.object:remove() + end + end, +}) + minetest.register_craftitem("mcl_mobitems:beef", { description = S("Raw Beef"), _doc_items_longdesc = S("Raw beef is the flesh from cows and can be eaten safely. Cooking it will greatly increase its nutritional value."), @@ -61,6 +83,28 @@ minetest.register_craftitem("mcl_mobitems:cooked_beef", { stack_max = 64, }) +minetest.register_entity("mcl_mobitems:beef_entity", { + initial_properties = { + physical = false, + visual = "wielditem", + wield_item = "mcl_mobitems:beef", + wield_image = "mcl_mobitems_beef_raw.png", + visual_size = {x=0.25, y=0.25}, + collisionbox = {0,0,0,0,0,0}, + pointable = false, + }, + on_activate = function(self, staticdata) + self.timer = 0 + self.object:set_rotation({x = math.pi / 2, y = 0, z = 0}) + end, + on_step = function(self, dtime) + self.timer = self.timer + dtime + if self.timer > 31 then + self.object:remove() + end + end, +}) + minetest.register_craftitem("mcl_mobitems:chicken", { description = S("Raw Chicken"), _tt_help = minetest.colorize(mcl_colors.YELLOW, S("30% chance of food poisoning")), @@ -86,6 +130,28 @@ minetest.register_craftitem("mcl_mobitems:cooked_chicken", { stack_max = 64, }) +minetest.register_entity("mcl_mobitems:chicken_entity", { + initial_properties = { + physical = false, + visual = "wielditem", + wield_item = "mcl_mobitems:chicken", + wield_image = "mcl_mobitems_chicken_raw.png", + visual_size = {x=0.25, y=0.25}, + collisionbox = {0,0,0,0,0,0}, + pointable = false, + }, + on_activate = function(self, staticdata) + self.timer = 0 + self.object:set_rotation({x = math.pi / 2, y = 0, z = 0}) + end, + on_step = function(self, dtime) + self.timer = self.timer + dtime + if self.timer > 31 then + self.object:remove() + end + end, +}) + minetest.register_craftitem("mcl_mobitems:porkchop", { description = S("Raw Porkchop"), _doc_items_longdesc = S("A raw porkchop is the flesh from a pig and can be eaten safely. Cooking it will greatly increase its nutritional value."), @@ -110,6 +176,28 @@ minetest.register_craftitem("mcl_mobitems:cooked_porkchop", { stack_max = 64, }) +minetest.register_entity("mcl_mobitems:porkchop_entity", { + initial_properties = { + physical = false, + visual = "wielditem", + wield_item = "mcl_mobitems:porkchop", + wield_image = "mcl_mobitems_porkchop_raw.png", + visual_size = {x=0.25, y=0.25}, + collisionbox = {0,0,0,0,0,0}, + pointable = false, + }, + on_activate = function(self, staticdata) + self.timer = 0 + self.object:set_rotation({x = math.pi / 2, y = 0, z = 0}) + end, + on_step = function(self, dtime) + self.timer = self.timer + dtime + if self.timer > 31 then + self.object:remove() + end + end, +}) + minetest.register_craftitem("mcl_mobitems:rabbit", { description = S("Raw Rabbit"), _doc_items_longdesc = S("Raw rabbit is a food item from a dead rabbit. It can be eaten safely. Cooking it will increase its nutritional value."), @@ -134,6 +222,28 @@ minetest.register_craftitem("mcl_mobitems:cooked_rabbit", { stack_max = 64, }) +minetest.register_entity("mcl_mobitems:rabbit_entity", { + initial_properties = { + physical = false, + visual = "wielditem", + wield_item = "mcl_mobitems:rabbit", + wield_image = "mcl_mobitems_rabbit_raw.png", + visual_size = {x=0.25, y=0.25}, + collisionbox = {0,0,0,0,0,0}, + pointable = false, + }, + on_activate = function(self, staticdata) + self.timer = 0 + self.object:set_rotation({x = math.pi / 2, y = 0, z = 0}) + end, + on_step = function(self, dtime) + self.timer = self.timer + dtime + if self.timer > 31 then + self.object:remove() + end + end, +}) + -- Reset food poisoning and status effects local function drink_milk(itemstack, player, pointed_thing) local bucket = minetest.do_item_eat(0, "mcl_buckets:bucket_empty", itemstack, player, pointed_thing) From 13d4841097331c69b6be16eb42564beb94ec5e0a Mon Sep 17 00:00:00 2001 From: DinoNuggies4665 Date: Tue, 30 May 2023 18:19:08 -0500 Subject: [PATCH 163/982] A couple of fixes --- mods/ITEMS/mcl_campfires/api.lua | 2 +- mods/ITEMS/mcl_fishing/init.lua | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/mods/ITEMS/mcl_campfires/api.lua b/mods/ITEMS/mcl_campfires/api.lua index 6f0251976..af496b202 100644 --- a/mods/ITEMS/mcl_campfires/api.lua +++ b/mods/ITEMS/mcl_campfires/api.lua @@ -32,7 +32,7 @@ function mcl_campfires.take_item(pos, node, player, itemstack) if not is_creative then itemstack:take_item(1) end -- Take the item if in creative campfire_inv:set_stack("main", space, stack) -- Set the inventory itemstack at the empty spot campfire_meta:set_int("cooktime_"..tostring(space), 30) -- Set the cook time meta - minetest.add_entity(pos + campfire_spots[space], player:get_wielded_item():get_name().."_entity") -- Spawn food item on the campfire + minetest.add_entity(pos + campfire_spots[space], stack:get_name().."_entity") -- Spawn food item on the campfire break end end diff --git a/mods/ITEMS/mcl_fishing/init.lua b/mods/ITEMS/mcl_fishing/init.lua index 20e90aaa5..442662deb 100644 --- a/mods/ITEMS/mcl_fishing/init.lua +++ b/mods/ITEMS/mcl_fishing/init.lua @@ -457,7 +457,7 @@ minetest.register_craft({ cooktime = 10, }) -minetest.register_entity("mcl_fishing:fish_entity", { +minetest.register_entity("mcl_fishing:fish_raw_entity", { initial_properties = { physical = false, visual = "wielditem", @@ -509,7 +509,7 @@ minetest.register_craft({ cooktime = 10, }) -minetest.register_entity("mcl_fishing:salmon_entity", { +minetest.register_entity("mcl_fishing:salmon_raw_entity", { initial_properties = { physical = false, visual = "wielditem", From 177196a8d2d2131b8dfbcb0cf28c501353924b83 Mon Sep 17 00:00:00 2001 From: DinoNuggies4665 Date: Tue, 30 May 2023 19:40:12 -0500 Subject: [PATCH 164/982] modified: mods/ITEMS/mcl_campfires/api.lua modified: mods/ITEMS/mcl_fishing/init.lua modified: mods/ITEMS/mcl_mobitems/init.lua --- mods/ITEMS/mcl_campfires/api.lua | 11 ++++++++-- mods/ITEMS/mcl_fishing/init.lua | 14 ------------- mods/ITEMS/mcl_mobitems/init.lua | 35 -------------------------------- 3 files changed, 9 insertions(+), 51 deletions(-) diff --git a/mods/ITEMS/mcl_campfires/api.lua b/mods/ITEMS/mcl_campfires/api.lua index af496b202..c6c90faa5 100644 --- a/mods/ITEMS/mcl_campfires/api.lua +++ b/mods/ITEMS/mcl_campfires/api.lua @@ -2,11 +2,17 @@ local S = minetest.get_translator(minetest.get_current_modname()) mcl_campfires = {} local drop_items = mcl_util.drop_items_from_meta_container("main") +local food_entity = {nil, nil, nil, nil} local function on_blast(pos) local node = minetest.get_node(pos) drop_items(pos, node) minetest.remove_node(pos) + for i = 1, 4 do + if food_entity[i] then + food_entity[i]:remove() + end + end end -- on_rightclick function to take items that are cookable in a campfire, and put them in the campfire inventory @@ -32,7 +38,7 @@ function mcl_campfires.take_item(pos, node, player, itemstack) if not is_creative then itemstack:take_item(1) end -- Take the item if in creative campfire_inv:set_stack("main", space, stack) -- Set the inventory itemstack at the empty spot campfire_meta:set_int("cooktime_"..tostring(space), 30) -- Set the cook time meta - minetest.add_entity(pos + campfire_spots[space], stack:get_name().."_entity") -- Spawn food item on the campfire + food_entity[space] = minetest.add_entity(pos + campfire_spots[space], stack:get_name().."_entity") -- Spawn food item on the campfire break end end @@ -58,6 +64,7 @@ function mcl_campfires.cook_item(pos, elapsed) elseif time_r <= 0 then local cooked = minetest.get_craft_result({method = "cooking", width = 1, items = {item}}) if cooked then + food_entity[i]:remove() -- Remove visual food entity minetest.add_item(pos, cooked.item) -- Drop Cooked Item inv:set_stack("main", i, "") -- Clear Inventory continue = continue + 1 -- Indicate that the slot is clear. @@ -169,7 +176,7 @@ function mcl_campfires.register_campfire(name, def) _mcl_hardness = 2, damage_per_second = def.damage, on_blast = on_blast, - after_dig_node = drop_items, + after_dig_node = on_blast, }) end diff --git a/mods/ITEMS/mcl_fishing/init.lua b/mods/ITEMS/mcl_fishing/init.lua index 442662deb..35d309519 100644 --- a/mods/ITEMS/mcl_fishing/init.lua +++ b/mods/ITEMS/mcl_fishing/init.lua @@ -468,15 +468,8 @@ minetest.register_entity("mcl_fishing:fish_raw_entity", { pointable = false, }, on_activate = function(self, staticdata) - self.timer = 0 self.object:set_rotation({x = math.pi / 2, y = 0, z = 0}) end, - on_step = function(self, dtime) - self.timer = self.timer + dtime - if self.timer > 31 then - self.object:remove() - end - end, }) -- Salmon @@ -520,15 +513,8 @@ minetest.register_entity("mcl_fishing:salmon_raw_entity", { pointable = false, }, on_activate = function(self, staticdata) - self.timer = 0 self.object:set_rotation({x = math.pi / 2, y = 0, z = 0}) end, - on_step = function(self, dtime) - self.timer = self.timer + dtime - if self.timer > 31 then - self.object:remove() - end - end, }) -- Clownfish diff --git a/mods/ITEMS/mcl_mobitems/init.lua b/mods/ITEMS/mcl_mobitems/init.lua index a84e3ece8..3783fe1fb 100644 --- a/mods/ITEMS/mcl_mobitems/init.lua +++ b/mods/ITEMS/mcl_mobitems/init.lua @@ -48,15 +48,8 @@ minetest.register_entity("mcl_mobitems:mutton_entity", { pointable = false, }, on_activate = function(self, staticdata) - self.timer = 0 self.object:set_rotation({x = math.pi / 2, y = 0, z = 0}) end, - on_step = function(self, dtime) - self.timer = self.timer + dtime - if self.timer > 31 then - self.object:remove() - end - end, }) minetest.register_craftitem("mcl_mobitems:beef", { @@ -94,15 +87,8 @@ minetest.register_entity("mcl_mobitems:beef_entity", { pointable = false, }, on_activate = function(self, staticdata) - self.timer = 0 self.object:set_rotation({x = math.pi / 2, y = 0, z = 0}) end, - on_step = function(self, dtime) - self.timer = self.timer + dtime - if self.timer > 31 then - self.object:remove() - end - end, }) minetest.register_craftitem("mcl_mobitems:chicken", { @@ -141,15 +127,8 @@ minetest.register_entity("mcl_mobitems:chicken_entity", { pointable = false, }, on_activate = function(self, staticdata) - self.timer = 0 self.object:set_rotation({x = math.pi / 2, y = 0, z = 0}) end, - on_step = function(self, dtime) - self.timer = self.timer + dtime - if self.timer > 31 then - self.object:remove() - end - end, }) minetest.register_craftitem("mcl_mobitems:porkchop", { @@ -187,15 +166,8 @@ minetest.register_entity("mcl_mobitems:porkchop_entity", { pointable = false, }, on_activate = function(self, staticdata) - self.timer = 0 self.object:set_rotation({x = math.pi / 2, y = 0, z = 0}) end, - on_step = function(self, dtime) - self.timer = self.timer + dtime - if self.timer > 31 then - self.object:remove() - end - end, }) minetest.register_craftitem("mcl_mobitems:rabbit", { @@ -233,15 +205,8 @@ minetest.register_entity("mcl_mobitems:rabbit_entity", { pointable = false, }, on_activate = function(self, staticdata) - self.timer = 0 self.object:set_rotation({x = math.pi / 2, y = 0, z = 0}) end, - on_step = function(self, dtime) - self.timer = self.timer + dtime - if self.timer > 31 then - self.object:remove() - end - end, }) -- Reset food poisoning and status effects From d3095fea572905fe9bb8e902a77aab4a172f97db Mon Sep 17 00:00:00 2001 From: PrairieWind Date: Mon, 5 Jun 2023 16:43:07 -0600 Subject: [PATCH 165/982] Update ignition, smothering, and campfire inventory drops Bonus fix for grass path creation sound traveling across the entire server --- mods/ITEMS/mcl_bows/arrow.lua | 6 +++ mods/ITEMS/mcl_campfires/api.lua | 56 +++++++++++++++++-------- mods/ITEMS/mcl_fire/flint_and_steel.lua | 6 +++ mods/ITEMS/mcl_tools/init.lua | 2 +- 4 files changed, 51 insertions(+), 19 deletions(-) diff --git a/mods/ITEMS/mcl_bows/arrow.lua b/mods/ITEMS/mcl_bows/arrow.lua index 2181d7b98..37e41fa6d 100644 --- a/mods/ITEMS/mcl_bows/arrow.lua +++ b/mods/ITEMS/mcl_bows/arrow.lua @@ -1,6 +1,7 @@ local S = minetest.get_translator(minetest.get_current_modname()) local mod_target = minetest.get_modpath("mcl_target") +local mod_campfire = minetest.get_modpath("mcl_campfires") local enable_pvp = minetest.settings:get_bool("enable_pvp") local math = math @@ -395,6 +396,11 @@ function ARROW_ENTITY.on_step(self, dtime) tnt.ignite(self._stuckin) end + -- Ignite Campfires + if mod_campfire and mcl_burning.is_burning(self.object) and minetest.get_item_group(snode.name, "campfire") ~= 0 then + mcl_campfires.light_campfire(self._stuckin) + end + -- Activate target if mod_target and snode.name == "mcl_target:target_off" then mcl_target.hit(self._stuckin, 1) --10 redstone ticks diff --git a/mods/ITEMS/mcl_campfires/api.lua b/mods/ITEMS/mcl_campfires/api.lua index c6c90faa5..2c6f3a46f 100644 --- a/mods/ITEMS/mcl_campfires/api.lua +++ b/mods/ITEMS/mcl_campfires/api.lua @@ -1,13 +1,12 @@ local S = minetest.get_translator(minetest.get_current_modname()) mcl_campfires = {} -local drop_items = mcl_util.drop_items_from_meta_container("main") local food_entity = {nil, nil, nil, nil} -local function on_blast(pos) - local node = minetest.get_node(pos) - drop_items(pos, node) - minetest.remove_node(pos) +local drop_inventory = mcl_util.drop_items_from_meta_container("main") + +local function drop_items(pos, node, oldmeta) + drop_inventory(pos, node, oldmeta) for i = 1, 4 do if food_entity[i] then food_entity[i]:remove() @@ -15,6 +14,18 @@ local function on_blast(pos) end end +local function on_blast(pos) + local node = minetest.get_node(pos) + drop_items(pos, node) + minetest.remove_node(pos) +end + +function mcl_campfires.light_campfire(pos) + local campfire = minetest.get_node(pos) + local name = campfire.name .. "_lit" + minetest.set_node(pos, {name = name, param2 = campfire.param2}) +end + -- on_rightclick function to take items that are cookable in a campfire, and put them in the campfire inventory function mcl_campfires.take_item(pos, node, player, itemstack) local campfire_spots = { @@ -96,15 +107,13 @@ function mcl_campfires.register_campfire(name, def) groups = { handy=1, axey=1, material_wood=1, not_in_creative_inventory=1, campfire=1, }, paramtype = "light", paramtype2 = "facedir", - on_rightclick = function (pos, node, player, itemstack, pointed_thing) - if player:get_wielded_item():get_name() == "mcl_fire:flint_and_steel" then - node.name = name.."_lit" - minetest.set_node(pos, node) - end + _on_ignite = function(player, node) + mcl_campfires.light_campfire(node.under) + return true end, drop = def.drops, _mcl_silk_touch_drop = {name}, - mcl_sounds.node_sound_wood_defaults(), + sounds = mcl_sounds.node_sound_wood_defaults(), selection_box = { type = 'fixed', fixed = {-.5, -.5, -.5, .5, -.05, .5}, --left, bottom, front, right, top @@ -143,7 +152,7 @@ function mcl_campfires.register_campfire(name, def) }} }, use_texture_alpha = "clip", - groups = { handy=1, axey=1, material_wood=1, campfire=1, lit_campfire=1 }, + groups = { handy=1, axey=1, material_wood=1, lit_campfire=1 }, paramtype = "light", paramtype2 = "facedir", on_construct = function(pos) @@ -152,10 +161,21 @@ function mcl_campfires.register_campfire(name, def) inv:set_size("main", 4) end, on_rightclick = function (pos, node, player, itemstack, pointed_thing) - if player:get_wielded_item():get_name():find("shovel") then - node.name = name - minetest.set_node(pos, node) - minetest.sound_play("fire_extinguish_flame", {pos = pos, gain = 0.25, max_hear_distance = 16}, true) + if minetest.get_item_group(itemstack:get_name(), "shovel") ~= 0 then + local protected = mcl_util.check_position_protection(pos, player) + if not protected then + if not minetest.is_creative_enabled(player:get_player_name()) then + -- Add wear (as if digging a shovely node) + local toolname = itemstack:get_name() + local wear = mcl_autogroup.get_wear(toolname, "shovely") + if wear then + itemstack:add_wear(wear) + end + end + node.name = name + minetest.set_node(pos, node) + minetest.sound_play("fire_extinguish_flame", {pos = pos, gain = 0.25, max_hear_distance = 16}, true) + end end mcl_campfires.take_item(pos, node, player, itemstack) end, @@ -163,7 +183,7 @@ function mcl_campfires.register_campfire(name, def) drop = def.drops, _mcl_silk_touch_drop = {name.."_lit"}, light_source = def.lightlevel, - mcl_sounds.node_sound_wood_defaults(), + sounds = mcl_sounds.node_sound_wood_defaults(), selection_box = { type = "fixed", fixed = {-.5, -.5, -.5, .5, -.05, .5}, --left, bottom, front, right, top @@ -176,7 +196,7 @@ function mcl_campfires.register_campfire(name, def) _mcl_hardness = 2, damage_per_second = def.damage, on_blast = on_blast, - after_dig_node = on_blast, + after_dig_node = drop_items, }) end diff --git a/mods/ITEMS/mcl_fire/flint_and_steel.lua b/mods/ITEMS/mcl_fire/flint_and_steel.lua index 39a4ce882..e88e34df2 100644 --- a/mods/ITEMS/mcl_fire/flint_and_steel.lua +++ b/mods/ITEMS/mcl_fire/flint_and_steel.lua @@ -66,6 +66,12 @@ minetest.register_tool("mcl_fire:flint_and_steel", { if not minetest.is_creative_enabled("") then stack:add_wear(65535/65) -- 65 uses end + -- Ignite Campfire + elseif minetest.get_item_group(dropnode.name, "campfire") ~= 0 then + add_node(droppos, {name=dropnode.name.."_lit"}) + if not minetest.is_creative_enabled("") then + stack:add_wear(65535/65) -- 65 uses + end end return stack end, diff --git a/mods/ITEMS/mcl_tools/init.lua b/mods/ITEMS/mcl_tools/init.lua index 49863268e..e60fd11b2 100644 --- a/mods/ITEMS/mcl_tools/init.lua +++ b/mods/ITEMS/mcl_tools/init.lua @@ -187,7 +187,7 @@ local make_grass_path = function(itemstack, placer, pointed_thing) itemstack:add_wear(wear) end end - minetest.sound_play({name="default_grass_footstep", gain=1}, {pos = above}, true) + minetest.sound_play({name="default_grass_footstep", gain=1}, {pos = above, max_hear_distance = 16}, true) minetest.swap_node(pointed_thing.under, {name="mcl_core:grass_path"}) end end From 5b212dd3fe70c8c7d67f8570a11773758dd8be41 Mon Sep 17 00:00:00 2001 From: DinoNuggies4665 Date: Mon, 5 Jun 2023 16:51:30 -0600 Subject: [PATCH 166/982] Made food entities local to evcery campfire, and made one food entity that works for all foods --- mods/ITEMS/mcl_campfires/api.lua | 69 +++++++++++++++++++++--- mods/ITEMS/mcl_campfires/register.lua | 16 ++++++ mods/ITEMS/mcl_fishing/init.lua | 30 ----------- mods/ITEMS/mcl_mobitems/init.lua | 75 --------------------------- 4 files changed, 77 insertions(+), 113 deletions(-) diff --git a/mods/ITEMS/mcl_campfires/api.lua b/mods/ITEMS/mcl_campfires/api.lua index 2c6f3a46f..4136b4df7 100644 --- a/mods/ITEMS/mcl_campfires/api.lua +++ b/mods/ITEMS/mcl_campfires/api.lua @@ -6,10 +6,32 @@ local food_entity = {nil, nil, nil, nil} local drop_inventory = mcl_util.drop_items_from_meta_container("main") local function drop_items(pos, node, oldmeta) + local meta = minetest.get_meta(pos) drop_inventory(pos, node, oldmeta) for i = 1, 4 do - if food_entity[i] then - food_entity[i]:remove() + local food_entity = nil + local food_x = tonumber(meta:get_string("food_x_"..tostring(i))) + local food_y = tonumber(meta:get_string("food_y_"..tostring(i))) + local food_z = tonumber(meta:get_string("food_z_"..tostring(i))) + if food_x and food_y and food_z then + local entites = minetest.get_objects_inside_radius({x = food_x, y = food_y, z = food_z}, 1) + minetest.chat_send_all("found entity") + if entites then + for _, food_entity in ipairs(entites) do + if food_entity then + if food_entity:get_luaentity().name == "mcl_campfires:food_entity" then + food_entity = entity + end + end + end + end + end + if food_entity then + minetest.chat_send_all("removed entity") + food_entity:remove() + meta:set_string("food_x_"..tostring(i), nil) + meta:set_string("food_y_"..tostring(i), nil) + meta:set_string("food_z_"..tostring(i), nil) end end end @@ -29,11 +51,13 @@ end -- on_rightclick function to take items that are cookable in a campfire, and put them in the campfire inventory function mcl_campfires.take_item(pos, node, player, itemstack) local campfire_spots = { - {x = -0.25, y = -0.04, z = -0.25}, - {x = 0.25, y = -0.04, z = -0.25}, - {x = 0.25, y = -0.04, z = 0.25}, - {x = -0.25, y = -0.04, z = 0.25}, + vector.new(-0.25, -0.04, -0.25), + vector.new( 0.25, -0.04, -0.25), + vector.new( 0.25, -0.04, 0.25), + vector.new(-0.25, -0.04, 0.25), } + minetest.chat_send_all("food added: pos = "..tostring(pos)) + local food_entity = {nil,nil,nil,nil} local is_creative = minetest.is_creative_enabled(player:get_player_name()) local inv = player:get_inventory() local campfire_meta = minetest.get_meta(pos) @@ -49,7 +73,14 @@ function mcl_campfires.take_item(pos, node, player, itemstack) if not is_creative then itemstack:take_item(1) end -- Take the item if in creative campfire_inv:set_stack("main", space, stack) -- Set the inventory itemstack at the empty spot campfire_meta:set_int("cooktime_"..tostring(space), 30) -- Set the cook time meta - food_entity[space] = minetest.add_entity(pos + campfire_spots[space], stack:get_name().."_entity") -- Spawn food item on the campfire + food_entity[space] = minetest.add_entity(pos + campfire_spots[space], "mcl_campfires:food_entity") -- Spawn food item on the campfire + local food_luaentity = food_entity[space]:get_luaentity() + food_luaentity.wield_item = campfire_inv:get_stack("main", space):get_name() -- Set the wielditem of the food item to the food on the campfire + food_luaentity.wield_image = "mcl_mobitems_"..string.sub(campfire_inv:get_stack("main", space):get_name(), 14).."_raw.png" -- Set the wield_image to the food item on the campfire + food_entity[space]:set_properties(food_luaentity) -- Apply changes to the food entity + campfire_meta:set_string("food_x_"..tostring(space), tostring(food_entity[space]:getpos().x)) + campfire_meta:set_string("food_y_"..tostring(space), tostring(food_entity[space]:getpos().y)) + campfire_meta:set_string("food_z_"..tostring(space), tostring(food_entity[space]:getpos().z)) break end end @@ -67,6 +98,23 @@ function mcl_campfires.cook_item(pos, elapsed) for i = 1, 4 do local time_r = meta:get_int("cooktime_"..tostring(i)) local item = inv:get_stack("main", i) + local food_entity = nil + local food_x = tonumber(meta:get_string("food_x_"..tostring(i))) + local food_y = tonumber(meta:get_string("food_y_"..tostring(i))) + local food_z = tonumber(meta:get_string("food_z_"..tostring(i))) + if food_x and food_y and food_z then + minetest.chat_send_all("X: "..food_x.." Y: "..food_y.." Z: "..food_z) + local entites = minetest.get_objects_inside_radius({x = food_x, y = food_y, z = food_z}, 1) + if entites then + for _, entity in ipairs(entites) do + if entity then + if entity:get_luaentity().name == "mcl_campfires:food_entity" then + food_entity = entity + end + end + end + end + end if item ~= (ItemStack("") or ItemStack("nil")) then -- Item hasn't been cooked completely, continue cook timer countdown. if time_r and time_r ~= 0 and time_r > 0 then @@ -75,7 +123,12 @@ function mcl_campfires.cook_item(pos, elapsed) elseif time_r <= 0 then local cooked = minetest.get_craft_result({method = "cooking", width = 1, items = {item}}) if cooked then - food_entity[i]:remove() -- Remove visual food entity + if food_entity then + food_entity:remove() -- Remove visual food entity + meta:set_string("food_x_"..tostring(i), nil) + meta:set_string("food_y_"..tostring(i), nil) + meta:set_string("food_z_"..tostring(i), nil) + end minetest.add_item(pos, cooked.item) -- Drop Cooked Item inv:set_stack("main", i, "") -- Clear Inventory continue = continue + 1 -- Indicate that the slot is clear. diff --git a/mods/ITEMS/mcl_campfires/register.lua b/mods/ITEMS/mcl_campfires/register.lua index 87e9f415a..791f5ed5f 100644 --- a/mods/ITEMS/mcl_campfires/register.lua +++ b/mods/ITEMS/mcl_campfires/register.lua @@ -40,3 +40,19 @@ minetest.register_craft({ { "group:tree", "group:tree", "group:tree" }, } }) + +-- Register Visual Food Entity +minetest.register_entity("mcl_campfires:food_entity", { + initial_properties = { + physical = false, + visual = "wielditem", + wield_item = "mcl_mobitems:mutton", + wield_image = "mcl_mobitems_mutton_raw.png", + visual_size = {x=0.25, y=0.25}, + collisionbox = {0,0,0,0,0,0}, + pointable = false, + }, + on_activate = function(self, staticdata) + self.object:set_rotation({x = math.pi / 2, y = 0, z = 0}) + end, +}) diff --git a/mods/ITEMS/mcl_fishing/init.lua b/mods/ITEMS/mcl_fishing/init.lua index 35d309519..4638325bd 100644 --- a/mods/ITEMS/mcl_fishing/init.lua +++ b/mods/ITEMS/mcl_fishing/init.lua @@ -457,21 +457,6 @@ minetest.register_craft({ cooktime = 10, }) -minetest.register_entity("mcl_fishing:fish_raw_entity", { - initial_properties = { - physical = false, - visual = "wielditem", - wield_item = "mcl_fishing:fish_raw", - wield_image = "mcl_fishing_fish_raw.png", - visual_size = {x=0.25, y=0.25}, - collisionbox = {0,0,0,0,0,0}, - pointable = false, - }, - on_activate = function(self, staticdata) - self.object:set_rotation({x = math.pi / 2, y = 0, z = 0}) - end, -}) - -- Salmon minetest.register_craftitem("mcl_fishing:salmon_raw", { description = S("Raw Salmon"), @@ -502,21 +487,6 @@ minetest.register_craft({ cooktime = 10, }) -minetest.register_entity("mcl_fishing:salmon_raw_entity", { - initial_properties = { - physical = false, - visual = "wielditem", - wield_item = "mcl_fishing:salmon_raw", - wield_image = "mcl_fishing_salmon_raw.png", - visual_size = {x=0.25, y=0.25}, - collisionbox = {0,0,0,0,0,0}, - pointable = false, - }, - on_activate = function(self, staticdata) - self.object:set_rotation({x = math.pi / 2, y = 0, z = 0}) - end, -}) - -- Clownfish minetest.register_craftitem("mcl_fishing:clownfish_raw", { description = S("Clownfish"), diff --git a/mods/ITEMS/mcl_mobitems/init.lua b/mods/ITEMS/mcl_mobitems/init.lua index 3783fe1fb..a47e11bfa 100644 --- a/mods/ITEMS/mcl_mobitems/init.lua +++ b/mods/ITEMS/mcl_mobitems/init.lua @@ -37,21 +37,6 @@ minetest.register_craftitem("mcl_mobitems:cooked_mutton", { stack_max = 64, }) -minetest.register_entity("mcl_mobitems:mutton_entity", { - initial_properties = { - physical = false, - visual = "wielditem", - wield_item = "mcl_mobitems:mutton", - wield_image = "mcl_mobitems_mutton_raw.png", - visual_size = {x=0.25, y=0.25}, - collisionbox = {0,0,0,0,0,0}, - pointable = false, - }, - on_activate = function(self, staticdata) - self.object:set_rotation({x = math.pi / 2, y = 0, z = 0}) - end, -}) - minetest.register_craftitem("mcl_mobitems:beef", { description = S("Raw Beef"), _doc_items_longdesc = S("Raw beef is the flesh from cows and can be eaten safely. Cooking it will greatly increase its nutritional value."), @@ -76,21 +61,6 @@ minetest.register_craftitem("mcl_mobitems:cooked_beef", { stack_max = 64, }) -minetest.register_entity("mcl_mobitems:beef_entity", { - initial_properties = { - physical = false, - visual = "wielditem", - wield_item = "mcl_mobitems:beef", - wield_image = "mcl_mobitems_beef_raw.png", - visual_size = {x=0.25, y=0.25}, - collisionbox = {0,0,0,0,0,0}, - pointable = false, - }, - on_activate = function(self, staticdata) - self.object:set_rotation({x = math.pi / 2, y = 0, z = 0}) - end, -}) - minetest.register_craftitem("mcl_mobitems:chicken", { description = S("Raw Chicken"), _tt_help = minetest.colorize(mcl_colors.YELLOW, S("30% chance of food poisoning")), @@ -116,21 +86,6 @@ minetest.register_craftitem("mcl_mobitems:cooked_chicken", { stack_max = 64, }) -minetest.register_entity("mcl_mobitems:chicken_entity", { - initial_properties = { - physical = false, - visual = "wielditem", - wield_item = "mcl_mobitems:chicken", - wield_image = "mcl_mobitems_chicken_raw.png", - visual_size = {x=0.25, y=0.25}, - collisionbox = {0,0,0,0,0,0}, - pointable = false, - }, - on_activate = function(self, staticdata) - self.object:set_rotation({x = math.pi / 2, y = 0, z = 0}) - end, -}) - minetest.register_craftitem("mcl_mobitems:porkchop", { description = S("Raw Porkchop"), _doc_items_longdesc = S("A raw porkchop is the flesh from a pig and can be eaten safely. Cooking it will greatly increase its nutritional value."), @@ -155,21 +110,6 @@ minetest.register_craftitem("mcl_mobitems:cooked_porkchop", { stack_max = 64, }) -minetest.register_entity("mcl_mobitems:porkchop_entity", { - initial_properties = { - physical = false, - visual = "wielditem", - wield_item = "mcl_mobitems:porkchop", - wield_image = "mcl_mobitems_porkchop_raw.png", - visual_size = {x=0.25, y=0.25}, - collisionbox = {0,0,0,0,0,0}, - pointable = false, - }, - on_activate = function(self, staticdata) - self.object:set_rotation({x = math.pi / 2, y = 0, z = 0}) - end, -}) - minetest.register_craftitem("mcl_mobitems:rabbit", { description = S("Raw Rabbit"), _doc_items_longdesc = S("Raw rabbit is a food item from a dead rabbit. It can be eaten safely. Cooking it will increase its nutritional value."), @@ -194,21 +134,6 @@ minetest.register_craftitem("mcl_mobitems:cooked_rabbit", { stack_max = 64, }) -minetest.register_entity("mcl_mobitems:rabbit_entity", { - initial_properties = { - physical = false, - visual = "wielditem", - wield_item = "mcl_mobitems:rabbit", - wield_image = "mcl_mobitems_rabbit_raw.png", - visual_size = {x=0.25, y=0.25}, - collisionbox = {0,0,0,0,0,0}, - pointable = false, - }, - on_activate = function(self, staticdata) - self.object:set_rotation({x = math.pi / 2, y = 0, z = 0}) - end, -}) - -- Reset food poisoning and status effects local function drink_milk(itemstack, player, pointed_thing) local bucket = minetest.do_item_eat(0, "mcl_buckets:bucket_empty", itemstack, player, pointed_thing) From d92296712c86e7508291c0fe3462ab7cc7060631 Mon Sep 17 00:00:00 2001 From: DinoNuggies4665 Date: Mon, 5 Jun 2023 16:54:03 -0600 Subject: [PATCH 167/982] Fixed crash when standing on campfire whilst food is cooking --- mods/ITEMS/mcl_campfires/api.lua | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/mods/ITEMS/mcl_campfires/api.lua b/mods/ITEMS/mcl_campfires/api.lua index 4136b4df7..5b1669b33 100644 --- a/mods/ITEMS/mcl_campfires/api.lua +++ b/mods/ITEMS/mcl_campfires/api.lua @@ -108,8 +108,12 @@ function mcl_campfires.cook_item(pos, elapsed) if entites then for _, entity in ipairs(entites) do if entity then - if entity:get_luaentity().name == "mcl_campfires:food_entity" then - food_entity = entity + luaentity = entity:get_luaentity() + if luaentity then + name = luaentity.name + if name == "mcl_campfires:food_entity" then + food_entity = entity + end end end end From 4616b6c3ece015694c128b598bbaa7372e38540a Mon Sep 17 00:00:00 2001 From: DinoNuggies4665 Date: Mon, 5 Jun 2023 17:12:57 -0600 Subject: [PATCH 168/982] The food is now oriented the right direction when on the cooking on the campfire, and food entities are removed when the campfire is destroyed, still doesn't drop items though --- mods/ITEMS/mcl_campfires/api.lua | 34 ++++++++++----------------- mods/ITEMS/mcl_campfires/register.lua | 2 +- 2 files changed, 13 insertions(+), 23 deletions(-) diff --git a/mods/ITEMS/mcl_campfires/api.lua b/mods/ITEMS/mcl_campfires/api.lua index 5b1669b33..c7c563efc 100644 --- a/mods/ITEMS/mcl_campfires/api.lua +++ b/mods/ITEMS/mcl_campfires/api.lua @@ -8,31 +8,22 @@ local drop_inventory = mcl_util.drop_items_from_meta_container("main") local function drop_items(pos, node, oldmeta) local meta = minetest.get_meta(pos) drop_inventory(pos, node, oldmeta) - for i = 1, 4 do - local food_entity = nil - local food_x = tonumber(meta:get_string("food_x_"..tostring(i))) - local food_y = tonumber(meta:get_string("food_y_"..tostring(i))) - local food_z = tonumber(meta:get_string("food_z_"..tostring(i))) - if food_x and food_y and food_z then - local entites = minetest.get_objects_inside_radius({x = food_x, y = food_y, z = food_z}, 1) - minetest.chat_send_all("found entity") - if entites then - for _, food_entity in ipairs(entites) do - if food_entity then - if food_entity:get_luaentity().name == "mcl_campfires:food_entity" then - food_entity = entity - end + local entites = minetest.get_objects_inside_radius(pos, 0.5) + minetest.chat_send_all("found entity") + if entites then + for _, food_entity in ipairs(entites) do + if food_entity then + if food_entity:get_luaentity().name == "mcl_campfires:food_entity" then + minetest.chat_send_all("removed entity") + food_entity:remove() + for i = 1, 4 do + meta:set_string("food_x_"..tostring(i), nil) + meta:set_string("food_y_"..tostring(i), nil) + meta:set_string("food_z_"..tostring(i), nil) end end end end - if food_entity then - minetest.chat_send_all("removed entity") - food_entity:remove() - meta:set_string("food_x_"..tostring(i), nil) - meta:set_string("food_y_"..tostring(i), nil) - meta:set_string("food_z_"..tostring(i), nil) - end end end @@ -56,7 +47,6 @@ function mcl_campfires.take_item(pos, node, player, itemstack) vector.new( 0.25, -0.04, 0.25), vector.new(-0.25, -0.04, 0.25), } - minetest.chat_send_all("food added: pos = "..tostring(pos)) local food_entity = {nil,nil,nil,nil} local is_creative = minetest.is_creative_enabled(player:get_player_name()) local inv = player:get_inventory() diff --git a/mods/ITEMS/mcl_campfires/register.lua b/mods/ITEMS/mcl_campfires/register.lua index 791f5ed5f..1dcaccea8 100644 --- a/mods/ITEMS/mcl_campfires/register.lua +++ b/mods/ITEMS/mcl_campfires/register.lua @@ -53,6 +53,6 @@ minetest.register_entity("mcl_campfires:food_entity", { pointable = false, }, on_activate = function(self, staticdata) - self.object:set_rotation({x = math.pi / 2, y = 0, z = 0}) + self.object:set_rotation({x = math.pi / -2, y = 0, z = 0}) end, }) From 61f489e71fc4530dc527d099cb16ddbe1238a089 Mon Sep 17 00:00:00 2001 From: DinoNuggies4665 Date: Mon, 5 Jun 2023 17:15:25 -0600 Subject: [PATCH 169/982] Food entities don't turn back to mutton when leaving a re-joining now --- mods/ITEMS/mcl_campfires/api.lua | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/mods/ITEMS/mcl_campfires/api.lua b/mods/ITEMS/mcl_campfires/api.lua index c7c563efc..02c4aae08 100644 --- a/mods/ITEMS/mcl_campfires/api.lua +++ b/mods/ITEMS/mcl_campfires/api.lua @@ -9,12 +9,10 @@ local function drop_items(pos, node, oldmeta) local meta = minetest.get_meta(pos) drop_inventory(pos, node, oldmeta) local entites = minetest.get_objects_inside_radius(pos, 0.5) - minetest.chat_send_all("found entity") if entites then for _, food_entity in ipairs(entites) do if food_entity then if food_entity:get_luaentity().name == "mcl_campfires:food_entity" then - minetest.chat_send_all("removed entity") food_entity:remove() for i = 1, 4 do meta:set_string("food_x_"..tostring(i), nil) @@ -93,8 +91,7 @@ function mcl_campfires.cook_item(pos, elapsed) local food_y = tonumber(meta:get_string("food_y_"..tostring(i))) local food_z = tonumber(meta:get_string("food_z_"..tostring(i))) if food_x and food_y and food_z then - minetest.chat_send_all("X: "..food_x.." Y: "..food_y.." Z: "..food_z) - local entites = minetest.get_objects_inside_radius({x = food_x, y = food_y, z = food_z}, 1) + local entites = minetest.get_objects_inside_radius({x = food_x, y = food_y, z = food_z}, 0) if entites then for _, entity in ipairs(entites) do if entity then @@ -103,6 +100,9 @@ function mcl_campfires.cook_item(pos, elapsed) name = luaentity.name if name == "mcl_campfires:food_entity" then food_entity = entity + luaentity.wield_item = inv:get_stack("main", i):get_name() + luaentity.wield_image = "mcl_mobitems_"..string.sub(inv:get_stack("main", i):get_name(), 14).."_raw.png" + food_entity:set_properties(luaentity) end end end From 23d6c3d17b0bdbe676c43e2fa433a1a5d178a11d Mon Sep 17 00:00:00 2001 From: PrairieWind Date: Wed, 7 Jun 2023 17:13:19 -0600 Subject: [PATCH 170/982] Update campfire rightclick and smothering --- mods/ITEMS/mcl_campfires/API.md | 11 ++++++----- mods/ITEMS/mcl_campfires/api.lua | 6 +++++- mods/ITEMS/mcl_campfires/init.lua | 1 - mods/ITEMS/mcl_potions/functions.lua | 17 ++++++++++++++--- 4 files changed, 25 insertions(+), 10 deletions(-) diff --git a/mods/ITEMS/mcl_campfires/API.md b/mods/ITEMS/mcl_campfires/API.md index abf61c6f1..727a26daf 100644 --- a/mods/ITEMS/mcl_campfires/API.md +++ b/mods/ITEMS/mcl_campfires/API.md @@ -1,7 +1,5 @@ -MineClone 2 Campfire API -======================== -`mcl_campfires.register_campfire` ---------------------------------- +# MineClone 2 Campfire API +## `mcl_campfires.register_campfire` Used to register campfires. **Example Usage** @@ -23,4 +21,7 @@ mcl_campfires.register_campfire("mcl_campfires:campfire", { * lit_logs_texture - texture for the logs of the lit campfire. if not changed, specify mcl_campfires_log.png. * drops - what items drop when the campfire is mined. * lightlevel - the level of light the campfire emits. -* damage - amount of damage the campfire deals when the player stands on it. \ No newline at end of file +* damage - amount of damage the campfire deals when the player stands on it. + +## Cooking Items +To allow an item to be cooked on the campfire, it must first have a registered cooked variant. To allow placing the item on the campfire to be cooked, add `campfire_cookable = 1` into the item groups list. diff --git a/mods/ITEMS/mcl_campfires/api.lua b/mods/ITEMS/mcl_campfires/api.lua index 02c4aae08..a1987235f 100644 --- a/mods/ITEMS/mcl_campfires/api.lua +++ b/mods/ITEMS/mcl_campfires/api.lua @@ -223,8 +223,11 @@ function mcl_campfires.register_campfire(name, def) minetest.set_node(pos, node) minetest.sound_play("fire_extinguish_flame", {pos = pos, gain = 0.25, max_hear_distance = 16}, true) end + elseif minetest.get_item_group(itemstack:get_name(), "campfire_cookable") ~= 0 then + mcl_campfires.take_item(pos, node, player, itemstack) + else + minetest.item_place_node(itemstack, player, pointed_thing) end - mcl_campfires.take_item(pos, node, player, itemstack) end, on_timer = mcl_campfires.cook_item, drop = def.drops, @@ -244,6 +247,7 @@ function mcl_campfires.register_campfire(name, def) damage_per_second = def.damage, on_blast = on_blast, after_dig_node = drop_items, + _mcl_campfires_smothered_form = name, }) end diff --git a/mods/ITEMS/mcl_campfires/init.lua b/mods/ITEMS/mcl_campfires/init.lua index 058ba50ed..cee898d0e 100644 --- a/mods/ITEMS/mcl_campfires/init.lua +++ b/mods/ITEMS/mcl_campfires/init.lua @@ -1,7 +1,6 @@ -- TO-DO: -- * Add Smoke Particles -- * Add Spark Particles --- * Add Cooking Meat -- * Add Working Sounds local modname = minetest.get_modpath(minetest.get_current_modname()) diff --git a/mods/ITEMS/mcl_potions/functions.lua b/mods/ITEMS/mcl_potions/functions.lua index de3f6df10..20608a7df 100644 --- a/mods/ITEMS/mcl_potions/functions.lua +++ b/mods/ITEMS/mcl_potions/functions.lua @@ -969,7 +969,7 @@ end function mcl_potions._extinguish_nearby_fire(pos, radius) local epos = {x=pos.x, y=pos.y+0.5, z=pos.z} local dnode = minetest.get_node({x=pos.x,y=pos.y-0.5,z=pos.z}) - if minetest.get_item_group(dnode.name, "fire") ~= 0 then + if minetest.get_item_group(dnode.name, "fire") ~= 0 or minetest.get_item_group(dnode.name, "lit_campfire") ~= 0 then epos.y = pos.y - 0.5 end local exting = false @@ -989,6 +989,11 @@ function mcl_potions._extinguish_nearby_fire(pos, radius) minetest.sound_play("fire_extinguish_flame", {pos = tpos, gain = 0.25, max_hear_distance = 16}, true) minetest.remove_node(tpos) exting = true + elseif minetest.get_item_group(node.name, "lit_campfire") ~= 0 then + minetest.sound_play("fire_extinguish_flame", {pos = tpos, gain = 0.25, max_hear_distance = 16}, true) + local def = minetest.registered_nodes[node.name] + minetest.set_node(tpos, {name = def._mcl_campfires_smothered_form, param2 = node.param2}) + exting = true end end -- Has radius: lingering, extinguish all nodes in area @@ -996,10 +1001,16 @@ function mcl_potions._extinguish_nearby_fire(pos, radius) local nodes = minetest.find_nodes_in_area( {x=epos.x-radius,y=epos.y,z=epos.z-radius}, {x=epos.x+radius,y=epos.y,z=epos.z+radius}, - {"group:fire"}) + {"group:fire", "group:lit_campfire"}) for n=1, #nodes do + local node = minetest.get_node(nodes[n]) minetest.sound_play("fire_extinguish_flame", {pos = nodes[n], gain = 0.25, max_hear_distance = 16}, true) - minetest.remove_node(nodes[n]) + if minetest.get_item_group(node.name, "fire") ~= 0 then + minetest.remove_node(nodes[n]) + elseif minetest.get_item_group(node.name, "lit_campfire") ~= 0 then + local def = minetest.registered_nodes[node.name] + minetest.set_node(nodes[n], {name = def._mcl_campfires_smothered_form, param2 = node.param2}) + end exting = true end end From 4c59b189dd7b5c98a7e65655939ffd7dd63bf5cc Mon Sep 17 00:00:00 2001 From: DinoNuggies4665 Date: Wed, 21 Jun 2023 11:50:11 -0600 Subject: [PATCH 171/982] changed line 82 to vector.new(), and refactored setting food wield item (wield_image doesn't matter) --- mods/ITEMS/mcl_campfires/api.lua | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/mods/ITEMS/mcl_campfires/api.lua b/mods/ITEMS/mcl_campfires/api.lua index a1987235f..3500942ee 100644 --- a/mods/ITEMS/mcl_campfires/api.lua +++ b/mods/ITEMS/mcl_campfires/api.lua @@ -91,7 +91,7 @@ function mcl_campfires.cook_item(pos, elapsed) local food_y = tonumber(meta:get_string("food_y_"..tostring(i))) local food_z = tonumber(meta:get_string("food_z_"..tostring(i))) if food_x and food_y and food_z then - local entites = minetest.get_objects_inside_radius({x = food_x, y = food_y, z = food_z}, 0) + local entites = minetest.get_objects_inside_radius(vector.new(food_x, food_y, food_z), 0) if entites then for _, entity in ipairs(entites) do if entity then @@ -100,9 +100,7 @@ function mcl_campfires.cook_item(pos, elapsed) name = luaentity.name if name == "mcl_campfires:food_entity" then food_entity = entity - luaentity.wield_item = inv:get_stack("main", i):get_name() - luaentity.wield_image = "mcl_mobitems_"..string.sub(inv:get_stack("main", i):get_name(), 14).."_raw.png" - food_entity:set_properties(luaentity) + food_entity:set_properties({wield_item = inv:get_stack("main", i):get_name()}) end end end From 4c3e5217797eefaa4e733539f867595f0a506cbe Mon Sep 17 00:00:00 2001 From: PrairieWind Date: Wed, 21 Jun 2023 12:37:41 -0600 Subject: [PATCH 172/982] Fix campfire drops to work correctly with creative and silk touch --- mods/ITEMS/mcl_campfires/api.lua | 44 +++++++++++++++++++++++--------- 1 file changed, 32 insertions(+), 12 deletions(-) diff --git a/mods/ITEMS/mcl_campfires/api.lua b/mods/ITEMS/mcl_campfires/api.lua index 3500942ee..17007ca2a 100644 --- a/mods/ITEMS/mcl_campfires/api.lua +++ b/mods/ITEMS/mcl_campfires/api.lua @@ -5,6 +5,22 @@ local food_entity = {nil, nil, nil, nil} local drop_inventory = mcl_util.drop_items_from_meta_container("main") +local function campfire_drops(pos, digger, drops, nodename) + local wield_item = digger:get_wielded_item() + local silk_touch = mcl_enchanting.has_enchantment(wield_item, "silk_touch") + local is_creative = minetest.is_creative_enabled(digger:get_player_name()) + local inv = digger:get_inventory() + if not is_creative then + if silk_touch then + minetest.add_item(pos, nodename) + else + minetest.add_item(pos, drops) + end + elseif is_creative and inv:room_for_item("main", nodename) and not inv:contains_item("main", nodename) then + inv:add_item("main", nodename) + end +end + local function drop_items(pos, node, oldmeta) local meta = minetest.get_meta(pos) drop_inventory(pos, node, oldmeta) @@ -66,9 +82,9 @@ function mcl_campfires.take_item(pos, node, player, itemstack) food_luaentity.wield_item = campfire_inv:get_stack("main", space):get_name() -- Set the wielditem of the food item to the food on the campfire food_luaentity.wield_image = "mcl_mobitems_"..string.sub(campfire_inv:get_stack("main", space):get_name(), 14).."_raw.png" -- Set the wield_image to the food item on the campfire food_entity[space]:set_properties(food_luaentity) -- Apply changes to the food entity - campfire_meta:set_string("food_x_"..tostring(space), tostring(food_entity[space]:getpos().x)) - campfire_meta:set_string("food_y_"..tostring(space), tostring(food_entity[space]:getpos().y)) - campfire_meta:set_string("food_z_"..tostring(space), tostring(food_entity[space]:getpos().z)) + campfire_meta:set_string("food_x_"..tostring(space), tostring(food_entity[space]:get_pos().x)) + campfire_meta:set_string("food_y_"..tostring(space), tostring(food_entity[space]:get_pos().y)) + campfire_meta:set_string("food_z_"..tostring(space), tostring(food_entity[space]:get_pos().z)) break end end @@ -95,9 +111,9 @@ function mcl_campfires.cook_item(pos, elapsed) if entites then for _, entity in ipairs(entites) do if entity then - luaentity = entity:get_luaentity() + local luaentity = entity:get_luaentity() if luaentity then - name = luaentity.name + local name = luaentity.name if name == "mcl_campfires:food_entity" then food_entity = entity food_entity:set_properties({wield_item = inv:get_stack("main", i):get_name()}) @@ -151,13 +167,12 @@ function mcl_campfires.register_campfire(name, def) use_texture_alpha = "clip", groups = { handy=1, axey=1, material_wood=1, not_in_creative_inventory=1, campfire=1, }, paramtype = "light", - paramtype2 = "facedir", + paramtype2 = "4dir", _on_ignite = function(player, node) mcl_campfires.light_campfire(node.under) return true end, - drop = def.drops, - _mcl_silk_touch_drop = {name}, + drop = "", sounds = mcl_sounds.node_sound_wood_defaults(), selection_box = { type = 'fixed', @@ -169,6 +184,9 @@ function mcl_campfires.register_campfire(name, def) }, _mcl_blast_resistance = 2, _mcl_hardness = 2, + after_dig_node = function(pos, node, oldmeta, digger) + campfire_drops(pos, digger, def.drops, name.."_lit") + end, }) --Define Lit Campfire @@ -199,7 +217,7 @@ function mcl_campfires.register_campfire(name, def) use_texture_alpha = "clip", groups = { handy=1, axey=1, material_wood=1, lit_campfire=1 }, paramtype = "light", - paramtype2 = "facedir", + paramtype2 = "4dir", on_construct = function(pos) local meta = minetest.get_meta(pos) local inv = meta:get_inventory() @@ -228,8 +246,7 @@ function mcl_campfires.register_campfire(name, def) end end, on_timer = mcl_campfires.cook_item, - drop = def.drops, - _mcl_silk_touch_drop = {name.."_lit"}, + drop = "", light_source = def.lightlevel, sounds = mcl_sounds.node_sound_wood_defaults(), selection_box = { @@ -244,7 +261,10 @@ function mcl_campfires.register_campfire(name, def) _mcl_hardness = 2, damage_per_second = def.damage, on_blast = on_blast, - after_dig_node = drop_items, + after_dig_node = function(pos, node, oldmeta, digger) + drop_items(pos, node, oldmeta) + campfire_drops(pos, digger, def.drops, name.."_lit") + end, _mcl_campfires_smothered_form = name, }) end From 15bb4fa4bf0d4af7538ab3f7aeba2ba6b676ad90 Mon Sep 17 00:00:00 2001 From: PrairieWind Date: Wed, 21 Jun 2023 13:12:38 -0600 Subject: [PATCH 173/982] Players don't take burn damage when they have fire resistance potion in use, or frost walker boots Entities seem to not burn anymore, and I am not sure why. --- mods/ITEMS/mcl_campfires/api.lua | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/mods/ITEMS/mcl_campfires/api.lua b/mods/ITEMS/mcl_campfires/api.lua index 17007ca2a..7dc5b65f4 100644 --- a/mods/ITEMS/mcl_campfires/api.lua +++ b/mods/ITEMS/mcl_campfires/api.lua @@ -259,7 +259,7 @@ function mcl_campfires.register_campfire(name, def) }, _mcl_blast_resistance = 2, _mcl_hardness = 2, - damage_per_second = def.damage, + damage_per_second = def.damage, -- FIXME: Once entity burning is fixed, this needs to be removed. on_blast = on_blast, after_dig_node = function(pos, node, oldmeta, digger) drop_items(pos, node, oldmeta) @@ -285,11 +285,15 @@ minetest.register_globalstep(function(dtime) if etime < 0.5 then return end etime = 0 for _,pl in pairs(minetest.get_connected_players()) do + local armor_feet = pl:get_inventory():get_stack("armor", 5) + if pl and pl:get_player_control().sneak or (minetest.global_exists("mcl_enchanting") and mcl_enchanting.has_enchantment(armor_feet, "frost_walker")) or (minetest.global_exists("mcl_potions") and mcl_potions.player_has_effect(pl, "fire_proof")) then + return + end burn_in_campfire(pl) end for _,ent in pairs(minetest.luaentities) do if ent.is_mob then - burn_in_campfire(ent.object) + burn_in_campfire(ent.object) -- FIXME: Mobs don't seem to burn properly anymore. end end end) From 04b59b2190227cba4c4a6c82b2de32b1bfd817f4 Mon Sep 17 00:00:00 2001 From: PrairieWind Date: Tue, 27 Jun 2023 16:59:40 -0600 Subject: [PATCH 174/982] Campfires are unaffected by pistons --- mods/ITEMS/REDSTONE/mesecons_mvps/init.lua | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/mods/ITEMS/REDSTONE/mesecons_mvps/init.lua b/mods/ITEMS/REDSTONE/mesecons_mvps/init.lua index 663d0f727..58e5afd92 100644 --- a/mods/ITEMS/REDSTONE/mesecons_mvps/init.lua +++ b/mods/ITEMS/REDSTONE/mesecons_mvps/init.lua @@ -411,6 +411,10 @@ mesecon.register_mvps_stopper("mesecons_solarpanel:solar_panel_inverted_on") mesecon.register_mvps_stopper("mesecons_solarpanel:solar_panel_inverted_off") mesecon.register_mvps_stopper("mcl_banners:hanging_banner") mesecon.register_mvps_stopper("mcl_banners:standing_banner") +mesecon.register_mvps_stopper("mcl_campfires:campfire") +mesecon.register_mvps_stopper("mcl_campfires:campfire_lit") +mesecon.register_mvps_stopper("mcl_campfires:soul_campfire") +mesecon.register_mvps_stopper("mcl_campfires:soul_campfire_lit") -- Unmovable by technical restrictions. -- Open formspec would screw up if node is destroyed (minor problem) @@ -935,6 +939,11 @@ mesecon.register_mvps_unsticky("mcl_farming:wheat_4") mesecon.register_mvps_unsticky("mcl_farming:wheat_5") mesecon.register_mvps_unsticky("mcl_farming:wheat_6") mesecon.register_mvps_unsticky("mcl_farming:wheat_7") +-- Campfires +mesecon.register_mvps_unsticky("mcl_campfires:campfire") +mesecon.register_mvps_unsticky("mcl_campfires:campfire_lit") +mesecon.register_mvps_unsticky("mcl_campfires:soul_campfire") +mesecon.register_mvps_unsticky("mcl_campfires:soul_campfire_lit") -- Includes node heat when moving them mesecon.register_on_mvps_move(mesecon.move_hot_nodes) From 21f0c7750bf222772e389450d210f509d3095aaf Mon Sep 17 00:00:00 2001 From: PrairieWind Date: Tue, 27 Jun 2023 17:00:42 -0600 Subject: [PATCH 175/982] Throw experience points after food is cooked --- mods/ITEMS/mcl_campfires/api.lua | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/mods/ITEMS/mcl_campfires/api.lua b/mods/ITEMS/mcl_campfires/api.lua index 7dc5b65f4..82b92da35 100644 --- a/mods/ITEMS/mcl_campfires/api.lua +++ b/mods/ITEMS/mcl_campfires/api.lua @@ -138,6 +138,10 @@ function mcl_campfires.cook_item(pos, elapsed) meta:set_string("food_z_"..tostring(i), nil) end minetest.add_item(pos, cooked.item) -- Drop Cooked Item + -- Throw some Experience Points because why not? + -- Food is cooked, xp is deserved for using this unique cooking method. Take that Minecraft ;) + local dir = vector.divide(minetest.facedir_to_dir(minetest.get_node(pos).param2),-1.95) + mcl_experience.throw_xp(vector.add(pos, dir), 1) inv:set_stack("main", i, "") -- Clear Inventory continue = continue + 1 -- Indicate that the slot is clear. end From f9afc74077a99b006000f73d7d982f57df3aa9a2 Mon Sep 17 00:00:00 2001 From: PrairieWind Date: Thu, 29 Jun 2023 20:53:28 -0600 Subject: [PATCH 176/982] Add changes to campfires from feedback --- mods/ITEMS/mcl_campfires/api.lua | 38 +++++++++++++++++++------------- 1 file changed, 23 insertions(+), 15 deletions(-) diff --git a/mods/ITEMS/mcl_campfires/api.lua b/mods/ITEMS/mcl_campfires/api.lua index 82b92da35..9dd5540d2 100644 --- a/mods/ITEMS/mcl_campfires/api.lua +++ b/mods/ITEMS/mcl_campfires/api.lua @@ -1,7 +1,15 @@ local S = minetest.get_translator(minetest.get_current_modname()) mcl_campfires = {} +local COOK_TIME = 30 -- Time it takes to cook food on a campfire. + local food_entity = {nil, nil, nil, nil} +local campfire_spots = { + vector.new(-0.25, -0.04, -0.25), + vector.new( 0.25, -0.04, -0.25), + vector.new( 0.25, -0.04, 0.25), + vector.new(-0.25, -0.04, 0.25), +} local drop_inventory = mcl_util.drop_items_from_meta_container("main") @@ -55,12 +63,6 @@ end -- on_rightclick function to take items that are cookable in a campfire, and put them in the campfire inventory function mcl_campfires.take_item(pos, node, player, itemstack) - local campfire_spots = { - vector.new(-0.25, -0.04, -0.25), - vector.new( 0.25, -0.04, -0.25), - vector.new( 0.25, -0.04, 0.25), - vector.new(-0.25, -0.04, 0.25), - } local food_entity = {nil,nil,nil,nil} local is_creative = minetest.is_creative_enabled(player:get_player_name()) local inv = player:get_inventory() @@ -76,7 +78,7 @@ function mcl_campfires.take_item(pos, node, player, itemstack) if not spot or spot == (ItemStack("") or ItemStack("nil")) then -- Check if the spot is empty or not if not is_creative then itemstack:take_item(1) end -- Take the item if in creative campfire_inv:set_stack("main", space, stack) -- Set the inventory itemstack at the empty spot - campfire_meta:set_int("cooktime_"..tostring(space), 30) -- Set the cook time meta + campfire_meta:set_int("cooktime_"..tostring(space), COOK_TIME) -- Set the cook time meta food_entity[space] = minetest.add_entity(pos + campfire_spots[space], "mcl_campfires:food_entity") -- Spawn food item on the campfire local food_luaentity = food_entity[space]:get_luaentity() food_luaentity.wield_item = campfire_inv:get_stack("main", space):get_name() -- Set the wielditem of the food item to the food on the campfire @@ -125,7 +127,7 @@ function mcl_campfires.cook_item(pos, elapsed) end if item ~= (ItemStack("") or ItemStack("nil")) then -- Item hasn't been cooked completely, continue cook timer countdown. - if time_r and time_r ~= 0 and time_r > 0 then + if time_r > 0 then meta:set_int("cooktime_"..tostring(i), time_r - 1) -- Item cook timer is up, finish cooking process and drop cooked item. elseif time_r <= 0 then @@ -136,16 +138,18 @@ function mcl_campfires.cook_item(pos, elapsed) meta:set_string("food_x_"..tostring(i), nil) meta:set_string("food_y_"..tostring(i), nil) meta:set_string("food_z_"..tostring(i), nil) + minetest.add_item(pos, cooked.item) -- Drop Cooked Item + -- Throw some Experience Points because why not? + -- Food is cooked, xp is deserved for using this unique cooking method. Take that Minecraft ;) + local dir = vector.divide(minetest.facedir_to_dir(minetest.get_node(pos).param2),-1.95) + mcl_experience.throw_xp(vector.add(pos, dir), 1) + inv:set_stack("main", i, "") -- Clear Inventory + continue = continue + 1 -- Indicate that the slot is clear. end - minetest.add_item(pos, cooked.item) -- Drop Cooked Item - -- Throw some Experience Points because why not? - -- Food is cooked, xp is deserved for using this unique cooking method. Take that Minecraft ;) - local dir = vector.divide(minetest.facedir_to_dir(minetest.get_node(pos).param2),-1.95) - mcl_experience.throw_xp(vector.add(pos, dir), 1) - inv:set_stack("main", i, "") -- Clear Inventory - continue = continue + 1 -- Indicate that the slot is clear. end end + else + continue = continue + 1 end end -- Not all slots are empty, continue timer. @@ -228,6 +232,10 @@ function mcl_campfires.register_campfire(name, def) inv:set_size("main", 4) end, on_rightclick = function (pos, node, player, itemstack, pointed_thing) + local meta = minetest.get_meta(pos) + local inv = meta:get_inventory() + if not inv then inv:set_size("main", 4) end + if minetest.get_item_group(itemstack:get_name(), "shovel") ~= 0 then local protected = mcl_util.check_position_protection(pos, player) if not protected then From 107420c80fe0e04eaa05b92516973f7d305b6ca8 Mon Sep 17 00:00:00 2001 From: PrairieWind Date: Mon, 3 Jul 2023 12:41:53 -0600 Subject: [PATCH 177/982] Offset smoke a bit --- mods/ITEMS/mcl_campfires/api.lua | 2 +- mods/ITEMS/mcl_campfires/init.lua | 3 ++- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/mods/ITEMS/mcl_campfires/api.lua b/mods/ITEMS/mcl_campfires/api.lua index 9dd5540d2..f60aca327 100644 --- a/mods/ITEMS/mcl_campfires/api.lua +++ b/mods/ITEMS/mcl_campfires/api.lua @@ -320,7 +320,7 @@ function mcl_campfires.generate_smoke(pos, haybale) end minetest.add_particle({ - pos = pos, + pos = vector.offset(pos, math.random(-0.5, 0.5), 0, math.random(-0.5, 0.5)), velocity = vector.new(0, 1, 0), texture = "mcl_particles_smoke.png", size = 10, diff --git a/mods/ITEMS/mcl_campfires/init.lua b/mods/ITEMS/mcl_campfires/init.lua index cee898d0e..701fd6095 100644 --- a/mods/ITEMS/mcl_campfires/init.lua +++ b/mods/ITEMS/mcl_campfires/init.lua @@ -1,7 +1,8 @@ -- TO-DO: --- * Add Smoke Particles -- * Add Spark Particles -- * Add Working Sounds +-- * Waterlogging (needs engine change) +-- * Fix the mob damage when mobs go back to burning again local modname = minetest.get_modpath(minetest.get_current_modname()) dofile(modname.."/api.lua") -- Load API File From 969fa98f18e8d8402b5cb182c01d837c8220dffd Mon Sep 17 00:00:00 2001 From: thunder1035 Date: Mon, 3 Jul 2023 12:55:37 -0600 Subject: [PATCH 178/982] Update campfire model and textures --- mods/ITEMS/mcl_campfires/api.lua | 24 +- .../models/mcl_campfires_campfire.obj | 5378 ++++++++++++++++- .../models/mcl_campfires_campfire1.mtl | 35 - .../models/mcl_campfires_campfire1.obj | 248 - .../models/mcl_campfires_campfire_lit.obj | 225 - textures/mcl_campfires_campfire_fire.png | Bin 474 -> 670 bytes textures/mcl_campfires_campfire_log_lit.png | Bin 412 -> 602 bytes textures/mcl_campfires_fire1.png | Bin 644 -> 0 bytes textures/mcl_campfires_log.png | Bin 263 -> 317 bytes textures/mcl_campfires_soul_campfire_fire.png | Bin 454 -> 689 bytes .../mcl_campfires_soul_campfire_log_lit.png | Bin 412 -> 623 bytes 11 files changed, 5169 insertions(+), 741 deletions(-) delete mode 100644 mods/ITEMS/mcl_campfires/models/mcl_campfires_campfire1.mtl delete mode 100644 mods/ITEMS/mcl_campfires/models/mcl_campfires_campfire1.obj delete mode 100644 mods/ITEMS/mcl_campfires/models/mcl_campfires_campfire_lit.obj delete mode 100644 textures/mcl_campfires_fire1.png diff --git a/mods/ITEMS/mcl_campfires/api.lua b/mods/ITEMS/mcl_campfires/api.lua index f60aca327..4d8def36b 100644 --- a/mods/ITEMS/mcl_campfires/api.lua +++ b/mods/ITEMS/mcl_campfires/api.lua @@ -205,23 +205,25 @@ function mcl_campfires.register_campfire(name, def) inventory_image = def.inv_texture, wield_image = def.inv_texture, drawtype = "mesh", - mesh = "mcl_campfires_campfire_lit.obj", - tiles = {{ - name=def.fire_texture, + mesh = "mcl_campfires_campfire.obj", + tiles = { + {name=def.fire_texture, animation={ type="vertical_frames", - aspect_w=16, - aspect_h=16, - length=2.0 - }}, - {name=def.lit_logs_texture, - animation={ - type="vertical_frames", - aspect_w=16, + aspect_w=32, aspect_h=16, length=2.0 }} }, + overlay_tiles = {{ + name=def.lit_logs_texture, + animation = { + type = "vertical_frames", + aspect_w = 32, + aspect_h = 16, + length = 2.0, + }}, + }, use_texture_alpha = "clip", groups = { handy=1, axey=1, material_wood=1, lit_campfire=1 }, paramtype = "light", diff --git a/mods/ITEMS/mcl_campfires/models/mcl_campfires_campfire.obj b/mods/ITEMS/mcl_campfires/models/mcl_campfires_campfire.obj index a559fdd4f..30ead4079 100644 --- a/mods/ITEMS/mcl_campfires/models/mcl_campfires_campfire.obj +++ b/mods/ITEMS/mcl_campfires/models/mcl_campfires_campfire.obj @@ -1,224 +1,5158 @@ -# Blender v2.78 (sub 0) OBJ File: '' +# Blender 3.5.1 # www.blender.org -mtllib campfire.mtl -o nodebox4 -v 0.500000 -0.312500 0.250000 -v 0.500000 -0.312500 0.500000 -v 0.500000 -0.062500 0.500000 -v 0.500000 -0.062500 0.250000 -v -0.500000 -0.312500 0.250000 -v -0.500000 -0.312500 0.500000 -v -0.500000 -0.062500 0.500000 -v -0.500000 -0.062500 0.250000 -v 0.500000 -0.312500 0.500000 -v 0.500000 -0.062500 0.500000 -v -0.500000 -0.062500 0.500000 -v -0.500000 -0.312500 0.500000 -vt 0.0000 0.7500 -vt 0.0000 0.5000 -vt 0.2500 0.5000 -vt 0.2500 0.7500 -vt 0.0000 0.7500 -vt 0.0000 0.5000 -vt 0.2500 0.5000 -vt 0.2500 0.7500 -vt 1.0000 0.7500 -vt 1.0000 1.0000 -vt 0.0000 1.0000 -vt 1.0000 1.0000 -vt 0.0000 1.0000 -vt 1.0000 0.7500 -vt 1.0000 1.0000 -vt 0.0000 1.0000 -vt 0.0000 0.7500 -vt 1.0000 0.7500 -vt 1.0000 1.0000 -vt 0.0000 1.0000 -vt 0.0000 0.7500 -vn -1.0000 0.0000 0.0000 -vn 0.0000 -0.0000 1.0000 -vn 0.0000 -1.0000 -0.0000 -usemtl none -s 1 -f 1/1/1 2/2/1 3/3/1 4/4/1 -f 5/5/1 6/6/1 7/7/1 8/8/1 -f 1/9/2 4/10/2 8/11/2 5/5/2 -f 1/9/3 2/12/3 6/13/3 5/5/3 -f 4/14/3 3/15/3 7/16/3 8/17/3 -f 9/18/2 10/19/2 11/20/2 12/21/2 -o nodebox4.001 -v 0.500000 -0.312500 -0.498288 -v 0.500000 -0.312500 -0.248288 -v 0.500000 -0.062500 -0.248288 -v 0.500000 -0.062500 -0.498288 -v -0.500000 -0.312500 -0.498288 -v -0.500000 -0.312500 -0.248288 -v -0.500000 -0.062500 -0.248288 -v -0.500000 -0.062500 -0.498288 -v 0.500000 -0.312500 -0.248288 -v 0.500000 -0.062500 -0.248288 -v -0.500000 -0.062500 -0.248288 -v -0.500000 -0.312500 -0.248288 -vt 0.0000 0.7500 -vt 0.0000 0.5000 -vt 0.2500 0.5000 -vt 0.2500 0.7500 -vt 0.0000 0.7500 -vt 0.0000 0.5000 -vt 0.2500 0.5000 -vt 0.2500 0.7500 -vt 1.0000 0.7500 -vt 1.0000 1.0000 -vt 0.0000 1.0000 -vt 1.0000 1.0000 -vt 0.0000 1.0000 -vt 1.0000 0.7500 -vt 1.0000 1.0000 -vt 0.0000 1.0000 -vt 0.0000 0.7500 -vt 1.0000 0.7500 -vt 1.0000 1.0000 -vt 0.0000 1.0000 -vt 0.0000 0.7500 -vn -1.0000 0.0000 0.0000 -vn 0.0000 -0.0000 1.0000 -vn 0.0000 -1.0000 -0.0000 -usemtl none -s 1 -f 13/22/4 14/23/4 15/24/4 16/25/4 -f 17/26/4 18/27/4 19/28/4 20/29/4 -f 13/30/5 16/31/5 20/32/5 17/26/5 -f 13/30/6 14/33/6 18/34/6 17/26/6 -f 16/35/6 15/36/6 19/37/6 20/38/6 -f 21/39/5 22/40/5 23/41/5 24/42/5 -o nodebox3 -v 0.250000 -0.500000 -0.500000 -v 0.250000 -0.437500 -0.500000 -v -0.250000 -0.437500 -0.500000 -v -0.250000 -0.500000 -0.500000 -v 0.250000 -0.500000 0.500000 -v 0.250000 -0.437500 0.500000 -v -0.250000 -0.437500 0.500000 -v -0.250000 -0.500000 0.500000 -vt 0.0000 0.0000 -vt 0.0000 0.0000 -vt 0.0000 0.0000 -vt 0.0000 0.0000 -vt 0.0000 0.0000 -vt 0.0000 0.0000 -vt 0.0000 0.0000 -vt 0.0000 0.0000 -vt 1.0000 0.0000 -vt 1.0000 0.1250 -vt 0.0000 0.1250 -vt 1.0000 0.0000 -vt 1.0000 0.1250 -vt 0.0000 0.1250 -vt 1.0000 0.5000 -vt 0.0000 0.5000 -vt 0.0001 0.0001 -vt 1.0000 0.0000 -vt 1.0000 0.5000 -vt 0.0000 0.5000 -vn -1.0000 0.0000 0.0000 -vn 0.0000 0.0000 1.0000 -vn 0.0000 -1.0000 -0.0000 -usemtl none_NONE -s 1 -f 25/43/7 29/44/7 30/45/7 26/46/7 -f 28/47/7 32/48/7 31/49/7 27/50/7 -usemtl none -f 25/51/8 26/52/8 27/53/8 28/47/8 -f 29/54/8 30/55/8 31/56/8 32/48/8 -f 25/51/9 29/57/9 32/58/9 28/59/9 -f 26/46/9 30/60/9 31/61/9 27/62/9 -o nodebox4.003 -v -0.248335 -0.500045 0.508619 -v -0.498333 -0.500045 0.509533 -v -0.498334 -0.250045 0.509533 -v -0.248335 -0.250045 0.508619 -v -0.251992 -0.500045 -0.491375 -v -0.501991 -0.500045 -0.490460 -v -0.501991 -0.250045 -0.490460 -v -0.251992 -0.250045 -0.491375 -v -0.498333 -0.500045 0.509533 -v -0.498334 -0.250045 0.509533 -v -0.501991 -0.250045 -0.490460 -v -0.501991 -0.500045 -0.490460 -vt 0.0000 0.7500 -vt 0.0000 0.5000 -vt 0.2500 0.5000 -vt 0.2500 0.7500 -vt 0.0000 0.7500 -vt 0.0000 0.5000 -vt 0.2500 0.5000 -vt 0.2500 0.7500 -vt 1.0000 0.7500 -vt 1.0000 1.0000 -vt 0.0000 1.0000 -vt 1.0000 1.0000 -vt 0.0000 1.0000 -vt 1.0000 0.7500 -vt 1.0000 1.0000 -vt 0.0000 1.0000 -vt 0.0000 0.7500 -vt 1.0000 0.7500 -vt 1.0000 1.0000 -vt 0.0000 1.0000 -vt 0.0000 0.7500 -vn -0.0037 -0.0000 -1.0000 -vn -1.0000 0.0000 0.0037 +mtllib campfire_4.mtl +o campfire_(lit) +v 0.519165 -0.498991 0.454269 +v -0.519165 -0.498991 0.454270 +v 0.519165 -0.498991 0.389374 +v 0.519165 -0.498991 0.324478 +v 0.519165 -0.498991 0.259582 +v 0.519165 -0.498991 0.194687 +v -0.519165 -0.498991 0.194687 +v -0.519165 -0.498991 0.259583 +v -0.519165 -0.498991 0.324478 +v -0.519165 -0.498991 0.389374 +v -0.454270 -0.498991 0.454270 +v -0.389374 -0.498991 0.454270 +v -0.324478 -0.498991 0.454270 +v -0.259583 -0.498991 0.454270 +v -0.194687 -0.498991 0.454270 +v -0.129791 -0.498991 0.454270 +v -0.064896 -0.498991 0.454270 +v 0.000000 -0.498991 0.454270 +v 0.064896 -0.498991 0.454270 +v 0.129791 -0.498991 0.454270 +v 0.194687 -0.498991 0.454269 +v 0.259583 -0.498991 0.454269 +v 0.324478 -0.498991 0.454269 +v 0.389374 -0.498991 0.454269 +v 0.454270 -0.498991 0.454269 +v 0.454270 -0.498991 0.194687 +v 0.454270 -0.498991 0.259582 +v 0.454270 -0.498991 0.324478 +v 0.454270 -0.498991 0.389374 +v 0.389374 -0.498991 0.194687 +v 0.389374 -0.498991 0.259582 +v 0.389374 -0.498991 0.324478 +v 0.389374 -0.498991 0.389374 +v 0.324478 -0.498991 0.194687 +v 0.324478 -0.498991 0.259582 +v 0.324478 -0.498991 0.324478 +v 0.324478 -0.498991 0.389374 +v 0.259583 -0.498991 0.194687 +v 0.259583 -0.498991 0.259582 +v 0.259583 -0.498991 0.324478 +v 0.259583 -0.498991 0.389374 +v 0.194687 -0.498991 0.194687 +v 0.194687 -0.498991 0.259583 +v 0.194687 -0.498991 0.324478 +v 0.194687 -0.498991 0.389374 +v 0.129791 -0.498991 0.194687 +v 0.129791 -0.498991 0.259583 +v 0.129791 -0.498991 0.324478 +v 0.129791 -0.498991 0.389374 +v 0.064896 -0.498991 0.194687 +v 0.064896 -0.498991 0.259583 +v 0.064896 -0.498991 0.324478 +v 0.064896 -0.498991 0.389374 +v -0.000000 -0.498991 0.194687 +v -0.000000 -0.498991 0.259583 +v -0.000000 -0.498991 0.324478 +v 0.000000 -0.498991 0.389374 +v -0.064896 -0.498991 0.194687 +v -0.064896 -0.498991 0.259583 +v -0.064896 -0.498991 0.324478 +v -0.064896 -0.498991 0.389374 +v -0.129791 -0.498991 0.194687 +v -0.129791 -0.498991 0.259583 +v -0.129791 -0.498991 0.324478 +v -0.129791 -0.498991 0.389374 +v -0.194687 -0.498991 0.194687 +v -0.194687 -0.498991 0.259583 +v -0.194687 -0.498991 0.324478 +v -0.194687 -0.498991 0.389374 +v -0.259583 -0.498991 0.194687 +v -0.259583 -0.498991 0.259583 +v -0.259583 -0.498991 0.324478 +v -0.259583 -0.498991 0.389374 +v -0.324478 -0.498991 0.194687 +v -0.324478 -0.498991 0.259583 +v -0.324478 -0.498991 0.324478 +v -0.324478 -0.498991 0.389374 +v -0.389374 -0.498991 0.194687 +v -0.389374 -0.498991 0.259583 +v -0.389374 -0.498991 0.324478 +v -0.389374 -0.498991 0.389374 +v -0.454270 -0.498991 0.194687 +v -0.454270 -0.498991 0.259583 +v -0.454270 -0.498991 0.324478 +v -0.454270 -0.498991 0.389374 +v -0.519165 -0.434095 0.389374 +v -0.519165 -0.434095 0.454270 +v 0.454270 -0.434095 0.454269 +v 0.519165 -0.434095 0.454269 +v 0.519165 -0.434095 0.389374 +v 0.519165 -0.434095 0.324478 +v 0.519165 -0.434095 0.259582 +v 0.519165 -0.434095 0.194687 +v -0.519165 -0.434095 0.194687 +v -0.519165 -0.434095 0.259583 +v -0.519165 -0.434095 0.324478 +v -0.454270 -0.434095 0.454270 +v -0.389374 -0.434095 0.454270 +v -0.324478 -0.434095 0.454270 +v -0.259583 -0.434095 0.454270 +v -0.194687 -0.434095 0.454270 +v -0.129791 -0.434095 0.454270 +v -0.064896 -0.434095 0.454270 +v 0.000000 -0.434095 0.454270 +v 0.064896 -0.434095 0.454270 +v 0.129791 -0.434095 0.454270 +v 0.194687 -0.434095 0.454269 +v 0.259583 -0.434095 0.454269 +v 0.324478 -0.434095 0.454269 +v 0.389374 -0.434095 0.454269 +v 0.454270 -0.434095 0.194687 +v 0.194687 -0.304304 0.194687 +v 0.389374 -0.434095 0.194687 +v 0.259583 -0.304304 0.194687 +v 0.324478 -0.434095 0.194687 +v 0.259583 -0.434095 0.194687 +v 0.324478 -0.304304 0.194687 +v 0.194687 -0.434095 0.194687 +v 0.389374 -0.304304 0.194687 +v 0.129791 -0.434095 0.194687 +v 0.454270 -0.304304 0.194687 +v 0.064896 -0.434095 0.194687 +v 0.389374 -0.304304 0.454269 +v 0.324478 -0.304304 0.454269 +v -0.000000 -0.434095 0.194687 +v 0.259583 -0.304304 0.454269 +v 0.194687 -0.304304 0.454269 +v 0.129791 -0.304304 0.454270 +v -0.064896 -0.434095 0.194687 +v 0.064896 -0.304304 0.454270 +v 0.000000 -0.304304 0.454270 +v -0.064896 -0.304304 0.454270 +v -0.129791 -0.434095 0.194687 +v -0.129791 -0.304304 0.454270 +v -0.194687 -0.304304 0.454270 +v -0.259583 -0.304304 0.454270 +v -0.194687 -0.434095 0.194687 +v -0.324478 -0.304304 0.454270 +v -0.389374 -0.304304 0.454270 +v -0.454270 -0.304304 0.454270 +v -0.259583 -0.434095 0.194687 +v -0.519165 -0.304304 0.324478 +v -0.519165 -0.304304 0.259583 +v -0.519165 -0.304304 0.194687 +v -0.324478 -0.434095 0.194687 +v 0.519165 -0.304304 0.194687 +v 0.519165 -0.304304 0.259582 +v 0.519165 -0.304304 0.324478 +v -0.389374 -0.434095 0.194687 +v 0.519165 -0.304304 0.389374 +v 0.519165 -0.304304 0.454269 +v 0.454270 -0.304304 0.454269 +v -0.454270 -0.434095 0.194687 +v -0.519165 -0.304304 0.454270 +v -0.519165 -0.304304 0.389374 +v -0.519165 -0.369199 0.389374 +v -0.519165 -0.369199 0.454270 +v 0.454270 -0.369199 0.454269 +v 0.519165 -0.369199 0.454269 +v 0.519165 -0.369199 0.389374 +v 0.519165 -0.369199 0.324478 +v 0.519165 -0.369199 0.259582 +v 0.519165 -0.369199 0.194687 +v -0.519165 -0.369199 0.194687 +v -0.519165 -0.369199 0.259583 +v -0.519165 -0.369199 0.324478 +v -0.454270 -0.369199 0.454270 +v -0.389374 -0.369199 0.454270 +v -0.324478 -0.369199 0.454270 +v -0.259583 -0.369199 0.454270 +v -0.194687 -0.369199 0.454270 +v -0.129791 -0.369199 0.454270 +v -0.064896 -0.369199 0.454270 +v 0.000000 -0.369199 0.454270 +v 0.064896 -0.369199 0.454270 +v 0.129791 -0.369199 0.454270 +v 0.194687 -0.369199 0.454269 +v 0.259583 -0.369199 0.454269 +v 0.324478 -0.369199 0.454269 +v 0.389374 -0.369199 0.454269 +v 0.324478 -0.239408 0.454269 +v 0.454270 -0.369199 0.194687 +v 0.324478 -0.239408 0.194687 +v 0.324478 -0.239408 0.259582 +v 0.324478 -0.239408 0.389374 +v 0.389374 -0.369199 0.194687 +v 0.324478 -0.239408 0.324478 +v 0.259583 -0.239408 0.454269 +v 0.259583 -0.239408 0.194687 +v 0.324478 -0.369199 0.194687 +v 0.259583 -0.239408 0.259582 +v 0.259583 -0.239408 0.389374 +v 0.259583 -0.239408 0.324478 +v 0.259583 -0.369199 0.194687 +v 0.194687 -0.239408 0.454269 +v 0.194687 -0.239408 0.194687 +v 0.194687 -0.239408 0.259583 +v 0.194687 -0.369199 0.194687 +v 0.194687 -0.239408 0.389374 +v 0.194687 -0.239408 0.324478 +v 0.129791 -0.239408 0.454270 +v 0.129791 -0.369199 0.194687 +v 0.129791 -0.239408 0.194687 +v 0.129791 -0.239408 0.259583 +v 0.129791 -0.239408 0.389374 +v 0.064896 -0.369199 0.194687 +v 0.129791 -0.239408 0.324478 +v 0.064896 -0.239408 0.454270 +v 0.064896 -0.239408 0.194687 +v -0.000000 -0.369199 0.194687 +v 0.064896 -0.239408 0.259583 +v 0.064896 -0.239408 0.389374 +v 0.064896 -0.239408 0.324478 +v -0.064896 -0.369199 0.194687 +v 0.000000 -0.239408 0.454270 +v -0.000000 -0.239408 0.194687 +v -0.000000 -0.239408 0.259583 +v -0.129791 -0.369199 0.194687 +v 0.000000 -0.239408 0.389374 +v -0.000000 -0.239408 0.324478 +v -0.064896 -0.239408 0.454270 +v -0.194687 -0.369199 0.194687 +v -0.064896 -0.239408 0.194687 +v -0.064896 -0.239408 0.259583 +v -0.064896 -0.239408 0.389374 +v -0.259583 -0.369199 0.194687 +v -0.064896 -0.239408 0.324478 +v -0.129791 -0.239408 0.454270 +v -0.129791 -0.239408 0.194687 +v -0.324478 -0.369199 0.194687 +v -0.129791 -0.239408 0.259583 +v -0.129791 -0.239408 0.389374 +v -0.129791 -0.239408 0.324478 +v -0.389374 -0.369199 0.194687 +v -0.194687 -0.239408 0.454270 +v -0.194687 -0.239408 0.194687 +v -0.194687 -0.239408 0.259583 +v -0.454270 -0.369199 0.194687 +v -0.194687 -0.239408 0.389374 +v -0.194687 -0.239408 0.324478 +v 0.129791 -0.304304 0.194687 +v 0.064896 -0.304304 0.194687 +v -0.000000 -0.304304 0.194687 +v -0.064896 -0.304304 0.194687 +v -0.129791 -0.304304 0.194687 +v -0.194687 -0.304304 0.194687 +v -0.259583 -0.304304 0.194687 +v -0.324478 -0.304304 0.194687 +v -0.389374 -0.304304 0.194687 +v -0.454270 -0.304304 0.194687 +v 0.389374 -0.239408 0.324478 +v 0.389374 -0.239408 0.389374 +v 0.389374 -0.239408 0.259582 +v 0.389374 -0.239408 0.194687 +v 0.389374 -0.239408 0.454269 +v 0.454270 -0.239408 0.324478 +v 0.454270 -0.239408 0.389374 +v 0.454270 -0.239408 0.259582 +v 0.454270 -0.239408 0.194687 +v 0.454270 -0.239408 0.454269 +v -0.259583 -0.239408 0.454270 +v -0.324478 -0.239408 0.454270 +v -0.389374 -0.239408 0.454270 +v -0.454270 -0.239408 0.454270 +v -0.519165 -0.239408 0.454270 +v -0.519165 -0.239408 0.324478 +v -0.519165 -0.239408 0.389374 +v -0.519165 -0.239408 0.259583 +v -0.519165 -0.239408 0.194687 +v 0.519165 -0.239408 0.259582 +v 0.519165 -0.239408 0.194687 +v 0.519165 -0.239408 0.324478 +v 0.519165 -0.239408 0.389374 +v 0.519165 -0.239408 0.454269 +v -0.259583 -0.239408 0.389374 +v -0.259583 -0.239408 0.194687 +v -0.259583 -0.239408 0.259583 +v -0.259583 -0.239408 0.324478 +v -0.324478 -0.239408 0.389374 +v -0.324478 -0.239408 0.194687 +v -0.324478 -0.239408 0.259583 +v -0.324478 -0.239408 0.324478 +v -0.389374 -0.239408 0.389374 +v -0.389374 -0.239408 0.194687 +v -0.389374 -0.239408 0.259583 +v -0.389374 -0.239408 0.324478 +v -0.454270 -0.239408 0.389374 +v -0.454270 -0.239408 0.194687 +v -0.454270 -0.239408 0.259583 +v -0.454270 -0.239408 0.324478 +v 0.324478 -0.434095 0.000000 +v 0.324478 -0.434095 0.064896 +v 0.324478 -0.434095 0.129791 +v 0.324478 -0.434095 0.194687 +v 0.259583 -0.434095 -0.194687 +v 0.259583 -0.434095 -0.129791 +v 0.259583 -0.434095 -0.064896 +v -0.519165 -0.498991 -0.194687 +v -0.519165 -0.498991 -0.129791 +v -0.519165 -0.498991 -0.064896 +v -0.519165 -0.498991 0.000000 +v -0.519165 -0.498991 0.064896 +v -0.519165 -0.498991 0.129791 +v -0.519165 -0.498991 0.194687 +v 0.259583 -0.434095 0.000000 +v 0.259583 -0.434095 0.064896 +v 0.259583 -0.434095 0.129791 +v 0.259583 -0.434095 0.194687 +v 0.194687 -0.434095 -0.194687 +v 0.194687 -0.434095 -0.129791 +v 0.194687 -0.434095 -0.064896 +v 0.194687 -0.434095 0.000000 +v 0.194687 -0.434095 0.064896 +v 0.194687 -0.434095 0.129791 +v 0.194687 -0.434095 0.194687 +v 0.129791 -0.434095 -0.194687 +v 0.129791 -0.434095 -0.129791 +v 0.129791 -0.434095 -0.064896 +v 0.129791 -0.434095 0.000000 +v 0.519165 -0.498991 0.194687 +v 0.519165 -0.498991 0.129791 +v 0.519165 -0.498991 0.064896 +v 0.519165 -0.498991 0.000000 +v 0.519165 -0.498991 -0.064896 +v 0.519165 -0.498991 -0.129791 +v 0.519165 -0.498991 -0.194687 +v 0.129791 -0.434095 0.064896 +v 0.129791 -0.434095 0.129791 +v 0.129791 -0.434095 0.194687 +v 0.064896 -0.434095 -0.194687 +v 0.064896 -0.434095 -0.129791 +v -0.454270 -0.498991 0.194687 +v -0.454270 -0.498991 0.129791 +v -0.454270 -0.498991 0.064896 +v -0.454270 -0.498991 0.000000 +v -0.454270 -0.498991 -0.064896 +v -0.454270 -0.498991 -0.129791 +v -0.454270 -0.498991 -0.194687 +v 0.064896 -0.434095 -0.064896 +v 0.064896 -0.434095 0.000000 +v 0.064896 -0.434095 0.064896 +v 0.064896 -0.434095 0.129791 +v 0.064896 -0.434095 0.194687 +v -0.389374 -0.498991 0.194687 +v -0.389374 -0.498991 0.129791 +v -0.389374 -0.498991 0.064896 +v -0.389374 -0.498991 0.000000 +v -0.389374 -0.498991 -0.064896 +v -0.389374 -0.498991 -0.129791 +v -0.389374 -0.498991 -0.194687 +v -0.000000 -0.434095 -0.194687 +v -0.000000 -0.434095 -0.129791 +v -0.000000 -0.434095 -0.064896 +v -0.000000 -0.434095 0.000000 +v -0.000000 -0.434095 0.064896 +v -0.324478 -0.498991 0.194687 +v -0.324478 -0.498991 0.129791 +v -0.324478 -0.498991 0.064896 +v -0.324478 -0.498991 0.000000 +v -0.324478 -0.498991 -0.064896 +v -0.324478 -0.498991 -0.129791 +v -0.324478 -0.498991 -0.194687 +v -0.000000 -0.434095 0.129791 +v -0.000000 -0.434095 0.194687 +v -0.064896 -0.434095 -0.194687 +v -0.064896 -0.434095 -0.129791 +v -0.064896 -0.434095 -0.064896 +v -0.259583 -0.498991 0.194687 +v -0.259583 -0.498991 0.129791 +v -0.259583 -0.498991 0.064896 +v -0.259583 -0.498991 0.000000 +v -0.259583 -0.498991 -0.064896 +v -0.259583 -0.498991 -0.129791 +v -0.259583 -0.498991 -0.194687 +v -0.064896 -0.434095 0.000000 +v -0.064896 -0.434095 0.064896 +v -0.064896 -0.434095 0.129791 +v -0.064896 -0.434095 0.194687 +v -0.129791 -0.434095 -0.194687 +v -0.194687 -0.498991 0.194687 +v -0.194687 -0.498991 0.129791 +v -0.194687 -0.498991 0.064896 +v -0.194687 -0.498991 0.000000 +v -0.194687 -0.498991 -0.064896 +v -0.194687 -0.498991 -0.129791 +v -0.194687 -0.498991 -0.194687 +v -0.129791 -0.434095 -0.129791 +v -0.129791 -0.434095 -0.064896 +v -0.129791 -0.434095 0.000000 +v -0.129791 -0.434095 0.064896 +v -0.129791 -0.434095 0.129791 +v -0.129791 -0.498991 0.194687 +v -0.129791 -0.498991 0.129791 +v -0.129791 -0.498991 0.064896 +v -0.129791 -0.498991 0.000000 +v -0.129791 -0.498991 -0.064896 +v -0.129791 -0.498991 -0.129791 +v -0.129791 -0.498991 -0.194687 +v -0.129791 -0.434095 0.194687 +v -0.194687 -0.434095 -0.194687 +v -0.194687 -0.434095 -0.129791 +v -0.194687 -0.434095 -0.064896 +v -0.194687 -0.434095 0.000000 +v -0.064896 -0.498991 0.194687 +v -0.064896 -0.498991 0.129791 +v -0.064896 -0.498991 0.064896 +v -0.064896 -0.498991 0.000000 +v -0.064896 -0.498991 -0.064896 +v -0.064896 -0.498991 -0.129791 +v -0.064896 -0.498991 -0.194687 +v -0.194687 -0.434095 0.064896 +v -0.194687 -0.434095 0.129791 +v -0.194687 -0.434095 0.194687 +v -0.259583 -0.434095 -0.194687 +v -0.259583 -0.434095 -0.129791 +v -0.000000 -0.498991 0.194687 +v -0.000000 -0.498991 0.129791 +v -0.000000 -0.498991 0.064896 +v -0.000000 -0.498991 0.000000 +v -0.000000 -0.498991 -0.064896 +v -0.000000 -0.498991 -0.129791 +v -0.000000 -0.498991 -0.194687 +v -0.259583 -0.434095 -0.064896 +v -0.259583 -0.434095 0.000000 +v -0.259583 -0.434095 0.064896 +v -0.259583 -0.434095 0.129791 +v -0.259583 -0.434095 0.194687 +v 0.064896 -0.498991 0.194687 +v 0.064896 -0.498991 0.129791 +v 0.064896 -0.498991 0.064896 +v 0.064896 -0.498991 0.000000 +v 0.064896 -0.498991 -0.064896 +v 0.064896 -0.498991 -0.129791 +v 0.064896 -0.498991 -0.194687 +v -0.324478 -0.434095 -0.194687 +v -0.324478 -0.434095 -0.129791 +v -0.324478 -0.434095 -0.064896 +v -0.324478 -0.434095 0.000000 +v -0.324478 -0.434095 0.064896 +v 0.129791 -0.498991 0.194687 +v 0.129791 -0.498991 0.129791 +v 0.129791 -0.498991 0.064896 +v 0.129791 -0.498991 0.000000 +v 0.129791 -0.498991 -0.064896 +v 0.129791 -0.498991 -0.129791 +v 0.129791 -0.498991 -0.194687 +v -0.324478 -0.434095 0.129791 +v -0.324478 -0.434095 0.194687 +v -0.389374 -0.434095 -0.194687 +v -0.389374 -0.434095 -0.129791 +v -0.389374 -0.434095 -0.064896 +v 0.194687 -0.498991 0.194687 +v 0.194687 -0.498991 0.129791 +v 0.194687 -0.498991 0.064896 +v 0.194687 -0.498991 0.000000 +v 0.194687 -0.498991 -0.064896 +v 0.194687 -0.498991 -0.129791 +v 0.194687 -0.498991 -0.194687 +v -0.389374 -0.434095 0.000000 +v -0.389374 -0.434095 0.064896 +v -0.389374 -0.434095 0.129791 +v -0.389374 -0.434095 0.194687 +v -0.454270 -0.434095 -0.194687 +v 0.259583 -0.498991 0.194687 +v 0.259583 -0.498991 0.129791 +v 0.259583 -0.498991 0.064896 +v 0.259583 -0.498991 0.000000 +v 0.259583 -0.498991 -0.064896 +v 0.259583 -0.498991 -0.129791 +v 0.259583 -0.498991 -0.194687 +v -0.454270 -0.434095 -0.129791 +v -0.454270 -0.434095 -0.064896 +v -0.454270 -0.434095 0.000000 +v -0.454270 -0.434095 0.064896 +v -0.454270 -0.434095 0.129791 +v 0.324478 -0.498991 0.194687 +v 0.324478 -0.498991 0.129791 +v 0.324478 -0.498991 0.064896 +v 0.324478 -0.498991 0.000000 +v 0.324478 -0.498991 -0.064896 +v 0.324478 -0.498991 -0.129791 +v 0.324478 -0.498991 -0.194687 +v -0.454270 -0.434095 0.194687 +v 0.519165 -0.434095 -0.194687 +v 0.519165 -0.434095 -0.129791 +v 0.519165 -0.434095 -0.064896 +v 0.519165 -0.434095 0.000000 +v 0.389374 -0.498991 0.194687 +v 0.389374 -0.498991 0.129791 +v 0.389374 -0.498991 0.064896 +v 0.389374 -0.498991 0.000000 +v 0.389374 -0.498991 -0.064896 +v 0.389374 -0.498991 -0.129791 +v 0.389374 -0.498991 -0.194687 +v 0.519165 -0.434095 0.064896 +v 0.519165 -0.434095 0.129791 +v 0.519165 -0.434095 0.194687 +v -0.519165 -0.434095 0.194687 +v -0.519165 -0.434095 0.129791 +v 0.454270 -0.498991 0.194687 +v 0.454270 -0.498991 0.129791 +v 0.454270 -0.498991 0.064896 +v 0.454270 -0.498991 0.000000 +v 0.454270 -0.498991 -0.064896 +v 0.454270 -0.498991 -0.129791 +v 0.454270 -0.498991 -0.194687 +v -0.519165 -0.434095 0.064896 +v -0.519165 -0.434095 0.000000 +v -0.519165 -0.434095 -0.064896 +v -0.519165 -0.434095 -0.129791 +v -0.519165 -0.434095 -0.194687 +v 0.324478 -0.434095 -0.064896 +v 0.324478 -0.434095 -0.129791 +v 0.324478 -0.434095 -0.194687 +v 0.389374 -0.434095 0.194687 +v 0.389374 -0.434095 0.129791 +v 0.389374 -0.434095 0.064896 +v 0.389374 -0.434095 0.000000 +v 0.389374 -0.434095 -0.064896 +v 0.389374 -0.434095 -0.129791 +v 0.389374 -0.434095 -0.194687 +v 0.454270 -0.434095 0.194687 +v 0.454270 -0.434095 0.129791 +v 0.454270 -0.434095 0.064896 +v 0.454270 -0.434095 0.000000 +v 0.454270 -0.434095 -0.064896 +v 0.454270 -0.434095 -0.129791 +v 0.454270 -0.434095 -0.194687 +v 0.454269 -0.304304 -0.519165 +v 0.454270 -0.304304 0.519165 +v 0.389374 -0.304304 -0.519165 +v 0.324478 -0.304304 -0.519165 +v 0.259582 -0.304304 -0.519165 +v 0.194687 -0.304304 -0.519165 +v 0.194687 -0.304304 0.519165 +v 0.259583 -0.304304 0.519165 +v 0.324478 -0.304304 0.519165 +v 0.389374 -0.304304 0.519165 +v 0.454270 -0.304304 0.454270 +v 0.454270 -0.304304 0.389374 +v 0.454270 -0.304304 0.324478 +v 0.454270 -0.304304 0.259583 +v 0.454270 -0.304304 0.194687 +v 0.454270 -0.304304 0.129791 +v 0.454270 -0.304304 0.064896 +v 0.454270 -0.304304 -0.000000 +v 0.454270 -0.304304 -0.064896 +v 0.454269 -0.304304 -0.129791 +v 0.454269 -0.304304 -0.194687 +v 0.454269 -0.304304 -0.259583 +v 0.454269 -0.304304 -0.324478 +v 0.454269 -0.304304 -0.389374 +v 0.454269 -0.304304 -0.454270 +v 0.194687 -0.304304 -0.454270 +v 0.259582 -0.304304 -0.454270 +v 0.324478 -0.304304 -0.454270 +v 0.389374 -0.304304 -0.454270 +v 0.194687 -0.304304 -0.389374 +v 0.259582 -0.304304 -0.389374 +v 0.324478 -0.304304 -0.389374 +v 0.389374 -0.304304 -0.389374 +v 0.194687 -0.304304 -0.324478 +v 0.259582 -0.304304 -0.324478 +v 0.324478 -0.304304 -0.324478 +v 0.389374 -0.304304 -0.324478 +v 0.194687 -0.304304 -0.259583 +v 0.259582 -0.304304 -0.259583 +v 0.324478 -0.304304 -0.259583 +v 0.389374 -0.304304 -0.259583 +v 0.194687 -0.304304 -0.194687 +v 0.259583 -0.304304 -0.194687 +v 0.324478 -0.304304 -0.194687 +v 0.389374 -0.304304 -0.194687 +v 0.194687 -0.304304 -0.129791 +v 0.259583 -0.304304 -0.129791 +v 0.324478 -0.304304 -0.129791 +v 0.389374 -0.304304 -0.129791 +v 0.194687 -0.304304 -0.064896 +v 0.259583 -0.304304 -0.064896 +v 0.324478 -0.304304 -0.064896 +v 0.389374 -0.304304 -0.064896 +v 0.194687 -0.304304 0.000000 +v 0.259583 -0.304304 0.000000 +v 0.324478 -0.304304 0.000000 +v 0.389374 -0.304304 -0.000000 +v 0.194687 -0.304304 0.064896 +v 0.259583 -0.304304 0.064896 +v 0.324478 -0.304304 0.064896 +v 0.389374 -0.304304 0.064896 +v 0.194687 -0.304304 0.129791 +v 0.259583 -0.304304 0.129791 +v 0.324478 -0.304304 0.129791 +v 0.389374 -0.304304 0.129791 +v 0.194687 -0.304304 0.194687 +v 0.259583 -0.304304 0.194687 +v 0.324478 -0.304304 0.194687 +v 0.389374 -0.304304 0.194687 +v 0.194687 -0.304304 0.259583 +v 0.259583 -0.304304 0.259583 +v 0.324478 -0.304304 0.259583 +v 0.389374 -0.304304 0.259583 +v 0.194687 -0.304304 0.324478 +v 0.259583 -0.304304 0.324478 +v 0.324478 -0.304304 0.324478 +v 0.389374 -0.304304 0.324478 +v 0.194687 -0.304304 0.389374 +v 0.259583 -0.304304 0.389374 +v 0.324478 -0.304304 0.389374 +v 0.389374 -0.304304 0.389374 +v 0.194687 -0.304304 0.454270 +v 0.259583 -0.304304 0.454270 +v 0.324478 -0.304304 0.454270 +v 0.389374 -0.304304 0.454270 +v 0.389374 -0.239408 0.519165 +v 0.454270 -0.239408 0.519165 +v 0.454269 -0.239408 -0.454270 +v 0.454269 -0.239408 -0.519165 +v 0.389374 -0.239408 -0.519165 +v 0.324478 -0.239408 -0.519165 +v 0.259582 -0.239408 -0.519165 +v 0.194687 -0.239408 -0.519165 +v 0.194687 -0.239408 0.519165 +v 0.259583 -0.239408 0.519165 +v 0.324478 -0.239408 0.519165 +v 0.454270 -0.239408 0.454270 +v 0.454270 -0.239408 0.389374 +v 0.454270 -0.239408 0.324478 +v 0.454270 -0.239408 0.259583 +v 0.454270 -0.239408 0.194687 +v 0.454270 -0.239408 0.129791 +v 0.454270 -0.239408 0.064896 +v 0.454270 -0.239408 -0.000000 +v 0.454270 -0.239408 -0.064896 +v 0.454269 -0.239408 -0.129791 +v 0.454269 -0.239408 -0.194687 +v 0.454269 -0.239408 -0.259583 +v 0.454269 -0.239408 -0.324478 +v 0.454269 -0.239408 -0.389374 +v 0.194687 -0.239408 -0.454270 +v 0.194687 -0.109617 -0.194687 +v 0.194687 -0.239408 -0.389374 +v 0.194687 -0.109617 -0.259583 +v 0.194687 -0.239408 -0.324478 +v 0.194687 -0.239408 -0.259583 +v 0.194687 -0.109617 -0.324478 +v 0.194687 -0.239408 -0.194687 +v 0.194687 -0.109617 -0.389374 +v 0.194687 -0.239408 -0.129791 +v 0.194687 -0.109617 -0.454270 +v 0.194687 -0.239408 -0.064896 +v 0.454269 -0.109617 -0.389374 +v 0.454269 -0.109617 -0.324478 +v 0.194687 -0.239408 0.000000 +v 0.454269 -0.109617 -0.259583 +v 0.454269 -0.109617 -0.194687 +v 0.454269 -0.109617 -0.129791 +v 0.194687 -0.239408 0.064896 +v 0.454270 -0.109617 -0.064896 +v 0.454270 -0.109617 -0.000000 +v 0.454270 -0.109617 0.064896 +v 0.194687 -0.239408 0.129791 +v 0.454270 -0.109617 0.129791 +v 0.454270 -0.109617 0.194687 +v 0.454270 -0.109617 0.259583 +v 0.194687 -0.239408 0.194687 +v 0.454270 -0.109617 0.324478 +v 0.454270 -0.109617 0.389374 +v 0.454270 -0.109617 0.454270 +v 0.194687 -0.239408 0.259583 +v 0.324478 -0.109617 0.519165 +v 0.259583 -0.109617 0.519165 +v 0.194687 -0.109617 0.519165 +v 0.194687 -0.239408 0.324478 +v 0.194687 -0.109617 -0.519165 +v 0.259582 -0.109617 -0.519165 +v 0.324478 -0.109617 -0.519165 +v 0.194687 -0.239408 0.389374 +v 0.389374 -0.109617 -0.519165 +v 0.454269 -0.109617 -0.519165 +v 0.454269 -0.109617 -0.454270 +v 0.194687 -0.239408 0.454270 +v 0.454270 -0.109617 0.519165 +v 0.389374 -0.109617 0.519165 +v 0.389374 -0.174512 0.519165 +v 0.454270 -0.174512 0.519165 +v 0.454269 -0.174512 -0.454270 +v 0.454269 -0.174512 -0.519165 +v 0.389374 -0.174512 -0.519165 +v 0.324478 -0.174512 -0.519165 +v 0.259582 -0.174512 -0.519165 +v 0.194687 -0.174512 -0.519165 +v 0.194687 -0.174512 0.519165 +v 0.259583 -0.174512 0.519165 +v 0.324478 -0.174512 0.519165 +v 0.454270 -0.174512 0.454270 +v 0.454270 -0.174512 0.389374 +v 0.454270 -0.174512 0.324478 +v 0.454270 -0.174512 0.259583 +v 0.454270 -0.174512 0.194687 +v 0.454270 -0.174512 0.129791 +v 0.454270 -0.174512 0.064896 +v 0.454270 -0.174512 -0.000000 +v 0.454270 -0.174512 -0.064896 +v 0.454269 -0.174512 -0.129791 +v 0.454269 -0.174512 -0.194687 +v 0.454269 -0.174512 -0.259583 +v 0.454269 -0.174512 -0.324478 +v 0.454269 -0.174512 -0.389374 +v 0.454269 -0.044721 -0.324478 +v 0.194687 -0.174512 -0.454270 +v 0.194687 -0.044721 -0.324478 +v 0.259582 -0.044721 -0.324478 +v 0.389374 -0.044721 -0.324478 +v 0.194687 -0.174512 -0.389374 +v 0.324478 -0.044721 -0.324478 +v 0.454269 -0.044721 -0.259583 +v 0.194687 -0.044721 -0.259583 +v 0.194687 -0.174512 -0.324478 +v 0.259582 -0.044721 -0.259583 +v 0.389374 -0.044721 -0.259583 +v 0.324478 -0.044721 -0.259583 +v 0.194687 -0.174512 -0.259583 +v 0.454269 -0.044721 -0.194687 +v 0.194687 -0.044721 -0.194687 +v 0.259583 -0.044721 -0.194687 +v 0.194687 -0.174512 -0.194687 +v 0.389374 -0.044721 -0.194687 +v 0.324478 -0.044721 -0.194687 +v 0.454269 -0.044721 -0.129791 +v 0.194687 -0.174512 -0.129791 +v 0.194687 -0.044721 -0.129791 +v 0.259583 -0.044721 -0.129791 +v 0.389374 -0.044721 -0.129791 +v 0.194687 -0.174512 -0.064896 +v 0.324478 -0.044721 -0.129791 +v 0.454270 -0.044721 -0.064896 +v 0.194687 -0.044721 -0.064896 +v 0.194687 -0.174512 0.000000 +v 0.259583 -0.044721 -0.064896 +v 0.389374 -0.044721 -0.064896 +v 0.324478 -0.044721 -0.064896 +v 0.194687 -0.174512 0.064896 +v 0.454270 -0.044721 -0.000000 +v 0.194687 -0.044721 0.000000 +v 0.259583 -0.044721 0.000000 +v 0.194687 -0.174512 0.129791 +v 0.389374 -0.044721 -0.000000 +v 0.324478 -0.044721 0.000000 +v 0.454270 -0.044721 0.064896 +v 0.194687 -0.174512 0.194687 +v 0.194687 -0.044721 0.064896 +v 0.259583 -0.044721 0.064896 +v 0.389374 -0.044721 0.064896 +v 0.194687 -0.174512 0.259583 +v 0.324478 -0.044721 0.064896 +v 0.454270 -0.044721 0.129791 +v 0.194687 -0.044721 0.129791 +v 0.194687 -0.174512 0.324478 +v 0.259583 -0.044721 0.129791 +v 0.389374 -0.044721 0.129791 +v 0.324478 -0.044721 0.129791 +v 0.194687 -0.174512 0.389374 +v 0.454270 -0.044721 0.194687 +v 0.194687 -0.044721 0.194687 +v 0.259583 -0.044721 0.194687 +v 0.194687 -0.174512 0.454270 +v 0.389374 -0.044721 0.194687 +v 0.324478 -0.044721 0.194687 +v 0.194687 -0.109617 -0.129791 +v 0.194687 -0.109617 -0.064896 +v 0.194687 -0.109617 0.000000 +v 0.194687 -0.109617 0.064896 +v 0.194687 -0.109617 0.129791 +v 0.194687 -0.109617 0.194687 +v 0.194687 -0.109617 0.259583 +v 0.194687 -0.109617 0.324478 +v 0.194687 -0.109617 0.389374 +v 0.194687 -0.109617 0.454270 +v 0.324478 -0.044721 -0.389374 +v 0.389374 -0.044721 -0.389374 +v 0.259582 -0.044721 -0.389374 +v 0.194687 -0.044721 -0.389374 +v 0.454269 -0.044721 -0.389374 +v 0.324478 -0.044721 -0.454270 +v 0.389374 -0.044721 -0.454270 +v 0.259582 -0.044721 -0.454270 +v 0.194687 -0.044721 -0.454270 +v 0.454269 -0.044721 -0.454270 +v 0.454270 -0.044721 0.259583 +v 0.454270 -0.044721 0.324478 +v 0.454270 -0.044721 0.389374 +v 0.454270 -0.044721 0.454270 +v 0.454270 -0.044721 0.519165 +v 0.324478 -0.044721 0.519165 +v 0.389374 -0.044721 0.519165 +v 0.259583 -0.044721 0.519165 +v 0.194687 -0.044721 0.519165 +v 0.259582 -0.044721 -0.519165 +v 0.194687 -0.044721 -0.519165 +v 0.324478 -0.044721 -0.519165 +v 0.389374 -0.044721 -0.519165 +v 0.454269 -0.044721 -0.519165 +v 0.389374 -0.044721 0.259583 +v 0.194687 -0.044721 0.259583 +v 0.259583 -0.044721 0.259583 +v 0.324478 -0.044721 0.259583 +v 0.389374 -0.044721 0.324478 +v 0.194687 -0.044721 0.324478 +v 0.259583 -0.044721 0.324478 +v 0.324478 -0.044721 0.324478 +v 0.389374 -0.044721 0.389374 +v 0.194687 -0.044721 0.389374 +v 0.259583 -0.044721 0.389374 +v 0.324478 -0.044721 0.389374 +v 0.389374 -0.044721 0.454270 +v 0.194687 -0.044721 0.454270 +v 0.259583 -0.044721 0.454270 +v 0.324478 -0.044721 0.454270 +v 0.519165 -0.498991 -0.194687 +v -0.519165 -0.498991 -0.194687 +v 0.519165 -0.498991 -0.259583 +v 0.519165 -0.498991 -0.324478 +v 0.519165 -0.498991 -0.389374 +v 0.519165 -0.498991 -0.454270 +v -0.519165 -0.498991 -0.454269 +v -0.519165 -0.498991 -0.389374 +v -0.519165 -0.498991 -0.324478 +v -0.519165 -0.498991 -0.259582 +v -0.454270 -0.498991 -0.194687 +v -0.389374 -0.498991 -0.194687 +v -0.324478 -0.498991 -0.194687 +v -0.259583 -0.498991 -0.194687 +v -0.194687 -0.498991 -0.194687 +v -0.129791 -0.498991 -0.194687 +v -0.064896 -0.498991 -0.194687 +v 0.000000 -0.498991 -0.194687 +v 0.064896 -0.498991 -0.194687 +v 0.129791 -0.498991 -0.194687 +v 0.194687 -0.498991 -0.194687 +v 0.259583 -0.498991 -0.194687 +v 0.324478 -0.498991 -0.194687 +v 0.389374 -0.498991 -0.194687 +v 0.454270 -0.498991 -0.194687 +v 0.454270 -0.498991 -0.454270 +v 0.454270 -0.498991 -0.389374 +v 0.454270 -0.498991 -0.324478 +v 0.454270 -0.498991 -0.259583 +v 0.389374 -0.498991 -0.454270 +v 0.389374 -0.498991 -0.389374 +v 0.389374 -0.498991 -0.324478 +v 0.389374 -0.498991 -0.259583 +v 0.324478 -0.498991 -0.454270 +v 0.324478 -0.498991 -0.389374 +v 0.324478 -0.498991 -0.324478 +v 0.324478 -0.498991 -0.259583 +v 0.259583 -0.498991 -0.454270 +v 0.259583 -0.498991 -0.389374 +v 0.259583 -0.498991 -0.324478 +v 0.259583 -0.498991 -0.259583 +v 0.194687 -0.498991 -0.454270 +v 0.194687 -0.498991 -0.389374 +v 0.194687 -0.498991 -0.324478 +v 0.194687 -0.498991 -0.259583 +v 0.129791 -0.498991 -0.454270 +v 0.129791 -0.498991 -0.389374 +v 0.129791 -0.498991 -0.324478 +v 0.129791 -0.498991 -0.259583 +v 0.064896 -0.498991 -0.454270 +v 0.064896 -0.498991 -0.389374 +v 0.064896 -0.498991 -0.324478 +v 0.064896 -0.498991 -0.259583 +v -0.000000 -0.498991 -0.454270 +v -0.000000 -0.498991 -0.389374 +v -0.000000 -0.498991 -0.324478 +v 0.000000 -0.498991 -0.259583 +v -0.064896 -0.498991 -0.454270 +v -0.064896 -0.498991 -0.389374 +v -0.064896 -0.498991 -0.324478 +v -0.064896 -0.498991 -0.259583 +v -0.129791 -0.498991 -0.454269 +v -0.129791 -0.498991 -0.389374 +v -0.129791 -0.498991 -0.324478 +v -0.129791 -0.498991 -0.259583 +v -0.194687 -0.498991 -0.454269 +v -0.194687 -0.498991 -0.389374 +v -0.194687 -0.498991 -0.324478 +v -0.194687 -0.498991 -0.259583 +v -0.259583 -0.498991 -0.454269 +v -0.259583 -0.498991 -0.389374 +v -0.259583 -0.498991 -0.324478 +v -0.259583 -0.498991 -0.259583 +v -0.324478 -0.498991 -0.454269 +v -0.324478 -0.498991 -0.389374 +v -0.324478 -0.498991 -0.324478 +v -0.324478 -0.498991 -0.259582 +v -0.389374 -0.498991 -0.454269 +v -0.389374 -0.498991 -0.389374 +v -0.389374 -0.498991 -0.324478 +v -0.389374 -0.498991 -0.259582 +v -0.454270 -0.498991 -0.454269 +v -0.454270 -0.498991 -0.389374 +v -0.454270 -0.498991 -0.324478 +v -0.454270 -0.498991 -0.259582 +v -0.519165 -0.434095 -0.259582 +v -0.519165 -0.434095 -0.194687 +v 0.454270 -0.434095 -0.194687 +v 0.519165 -0.434095 -0.194687 +v 0.519165 -0.434095 -0.259583 +v 0.519165 -0.434095 -0.324478 +v 0.519165 -0.434095 -0.389374 +v 0.519165 -0.434095 -0.454270 +v -0.519165 -0.434095 -0.454269 +v -0.519165 -0.434095 -0.389374 +v -0.519165 -0.434095 -0.324478 +v -0.454270 -0.434095 -0.194687 +v -0.389374 -0.434095 -0.194687 +v -0.324478 -0.434095 -0.194687 +v -0.259583 -0.434095 -0.194687 +v -0.194687 -0.434095 -0.194687 +v -0.129791 -0.434095 -0.194687 +v -0.064896 -0.434095 -0.194687 +v 0.000000 -0.434095 -0.194687 +v 0.064896 -0.434095 -0.194687 +v 0.129791 -0.434095 -0.194687 +v 0.194687 -0.434095 -0.194687 +v 0.259583 -0.434095 -0.194687 +v 0.324478 -0.434095 -0.194687 +v 0.389374 -0.434095 -0.194687 +v 0.454270 -0.434095 -0.454270 +v 0.194687 -0.304304 -0.454270 +v 0.389374 -0.434095 -0.454270 +v 0.259583 -0.304304 -0.454270 +v 0.324478 -0.434095 -0.454270 +v 0.259583 -0.434095 -0.454270 +v 0.324478 -0.304304 -0.454270 +v 0.194687 -0.434095 -0.454270 +v 0.389374 -0.304304 -0.454270 +v 0.129791 -0.434095 -0.454270 +v 0.454270 -0.304304 -0.454270 +v 0.064896 -0.434095 -0.454270 +v 0.389374 -0.304304 -0.194687 +v 0.324478 -0.304304 -0.194687 +v -0.000000 -0.434095 -0.454270 +v 0.259583 -0.304304 -0.194687 +v 0.194687 -0.304304 -0.194687 +v 0.129791 -0.304304 -0.194687 +v -0.064896 -0.434095 -0.454270 +v 0.064896 -0.304304 -0.194687 +v 0.000000 -0.304304 -0.194687 +v -0.064896 -0.304304 -0.194687 +v -0.129791 -0.434095 -0.454269 +v -0.129791 -0.304304 -0.194687 +v -0.194687 -0.304304 -0.194687 +v -0.259583 -0.304304 -0.194687 +v -0.194687 -0.434095 -0.454269 +v -0.324478 -0.304304 -0.194687 +v -0.389374 -0.304304 -0.194687 +v -0.454270 -0.304304 -0.194687 +v -0.259583 -0.434095 -0.454269 +v -0.519165 -0.304304 -0.324478 +v -0.519165 -0.304304 -0.389374 +v -0.519165 -0.304304 -0.454269 +v -0.324478 -0.434095 -0.454269 +v 0.519165 -0.304304 -0.454270 +v 0.519165 -0.304304 -0.389374 +v 0.519165 -0.304304 -0.324478 +v -0.389374 -0.434095 -0.454269 +v 0.519165 -0.304304 -0.259583 +v 0.519165 -0.304304 -0.194687 +v 0.454270 -0.304304 -0.194687 +v -0.454270 -0.434095 -0.454269 +v -0.519165 -0.304304 -0.194687 +v -0.519165 -0.304304 -0.259582 +v -0.519165 -0.369199 -0.259582 +v -0.519165 -0.369199 -0.194687 +v 0.454270 -0.369199 -0.194687 +v 0.519165 -0.369199 -0.194687 +v 0.519165 -0.369199 -0.259583 +v 0.519165 -0.369199 -0.324478 +v 0.519165 -0.369199 -0.389374 +v 0.519165 -0.369199 -0.454270 +v -0.519165 -0.369199 -0.454269 +v -0.519165 -0.369199 -0.389374 +v -0.519165 -0.369199 -0.324478 +v -0.454270 -0.369199 -0.194687 +v -0.389374 -0.369199 -0.194687 +v -0.324478 -0.369199 -0.194687 +v -0.259583 -0.369199 -0.194687 +v -0.194687 -0.369199 -0.194687 +v -0.129791 -0.369199 -0.194687 +v -0.064896 -0.369199 -0.194687 +v 0.000000 -0.369199 -0.194687 +v 0.064896 -0.369199 -0.194687 +v 0.129791 -0.369199 -0.194687 +v 0.194687 -0.369199 -0.194687 +v 0.259583 -0.369199 -0.194687 +v 0.324478 -0.369199 -0.194687 +v 0.389374 -0.369199 -0.194687 +v 0.324478 -0.239408 -0.194687 +v 0.454270 -0.369199 -0.454270 +v 0.324478 -0.239408 -0.454270 +v 0.324478 -0.239408 -0.389374 +v 0.324478 -0.239408 -0.259583 +v 0.389374 -0.369199 -0.454270 +v 0.324478 -0.239408 -0.324478 +v 0.259583 -0.239408 -0.194687 +v 0.259583 -0.239408 -0.454270 +v 0.324478 -0.369199 -0.454270 +v 0.259583 -0.239408 -0.389374 +v 0.259583 -0.239408 -0.259583 +v 0.259583 -0.239408 -0.324478 +v 0.259583 -0.369199 -0.454270 +v 0.194687 -0.239408 -0.194687 +v 0.194687 -0.239408 -0.454270 +v 0.194687 -0.239408 -0.389374 +v 0.194687 -0.369199 -0.454270 +v 0.194687 -0.239408 -0.259583 +v 0.194687 -0.239408 -0.324478 +v 0.129791 -0.239408 -0.194687 +v 0.129791 -0.369199 -0.454270 +v 0.129791 -0.239408 -0.454270 +v 0.129791 -0.239408 -0.389374 +v 0.129791 -0.239408 -0.259583 +v 0.064896 -0.369199 -0.454270 +v 0.129791 -0.239408 -0.324478 +v 0.064896 -0.239408 -0.194687 +v 0.064896 -0.239408 -0.454270 +v -0.000000 -0.369199 -0.454270 +v 0.064896 -0.239408 -0.389374 +v 0.064896 -0.239408 -0.259583 +v 0.064896 -0.239408 -0.324478 +v -0.064896 -0.369199 -0.454270 +v 0.000000 -0.239408 -0.194687 +v -0.000000 -0.239408 -0.454270 +v -0.000000 -0.239408 -0.389374 +v -0.129791 -0.369199 -0.454269 +v 0.000000 -0.239408 -0.259583 +v -0.000000 -0.239408 -0.324478 +v -0.064896 -0.239408 -0.194687 +v -0.194687 -0.369199 -0.454269 +v -0.064896 -0.239408 -0.454270 +v -0.064896 -0.239408 -0.389374 +v -0.064896 -0.239408 -0.259583 +v -0.259583 -0.369199 -0.454269 +v -0.064896 -0.239408 -0.324478 +v -0.129791 -0.239408 -0.194687 +v -0.129791 -0.239408 -0.454269 +v -0.324478 -0.369199 -0.454269 +v -0.129791 -0.239408 -0.389374 +v -0.129791 -0.239408 -0.259583 +v -0.129791 -0.239408 -0.324478 +v -0.389374 -0.369199 -0.454269 +v -0.194687 -0.239408 -0.194687 +v -0.194687 -0.239408 -0.454269 +v -0.194687 -0.239408 -0.389374 +v -0.454270 -0.369199 -0.454269 +v -0.194687 -0.239408 -0.259583 +v -0.194687 -0.239408 -0.324478 +v 0.129791 -0.304304 -0.454270 +v 0.064896 -0.304304 -0.454270 +v -0.000000 -0.304304 -0.454270 +v -0.064896 -0.304304 -0.454270 +v -0.129791 -0.304304 -0.454269 +v -0.194687 -0.304304 -0.454269 +v -0.259583 -0.304304 -0.454269 +v -0.324478 -0.304304 -0.454269 +v -0.389374 -0.304304 -0.454269 +v -0.454270 -0.304304 -0.454269 +v 0.389374 -0.239408 -0.324478 +v 0.389374 -0.239408 -0.259583 +v 0.389374 -0.239408 -0.389374 +v 0.389374 -0.239408 -0.454270 +v 0.389374 -0.239408 -0.194687 +v 0.454270 -0.239408 -0.324478 +v 0.454270 -0.239408 -0.259583 +v 0.454270 -0.239408 -0.389374 +v 0.454270 -0.239408 -0.454270 +v 0.454270 -0.239408 -0.194687 +v -0.259583 -0.239408 -0.194687 +v -0.324478 -0.239408 -0.194687 +v -0.389374 -0.239408 -0.194687 +v -0.454270 -0.239408 -0.194687 +v -0.519165 -0.239408 -0.194687 +v -0.519165 -0.239408 -0.324478 +v -0.519165 -0.239408 -0.259582 +v -0.519165 -0.239408 -0.389374 +v -0.519165 -0.239408 -0.454269 +v 0.519165 -0.239408 -0.389374 +v 0.519165 -0.239408 -0.454270 +v 0.519165 -0.239408 -0.324478 +v 0.519165 -0.239408 -0.259583 +v 0.519165 -0.239408 -0.194687 +v -0.259583 -0.239408 -0.259583 +v -0.259583 -0.239408 -0.454269 +v -0.259583 -0.239408 -0.389374 +v -0.259583 -0.239408 -0.324478 +v -0.324478 -0.239408 -0.259582 +v -0.324478 -0.239408 -0.454269 +v -0.324478 -0.239408 -0.389374 +v -0.324478 -0.239408 -0.324478 +v -0.389374 -0.239408 -0.259582 +v -0.389374 -0.239408 -0.454269 +v -0.389374 -0.239408 -0.389374 +v -0.389374 -0.239408 -0.324478 +v -0.454270 -0.239408 -0.259582 +v -0.454270 -0.239408 -0.454269 +v -0.454270 -0.239408 -0.389374 +v -0.454270 -0.239408 -0.324478 +v -0.194687 -0.304304 -0.519165 +v -0.194687 -0.304304 0.519165 +v -0.259583 -0.304304 -0.519165 +v -0.324478 -0.304304 -0.519165 +v -0.389374 -0.304304 -0.519165 +v -0.454270 -0.304304 -0.519165 +v -0.454269 -0.304304 0.519165 +v -0.389374 -0.304304 0.519165 +v -0.324478 -0.304304 0.519165 +v -0.259582 -0.304304 0.519165 +v -0.194687 -0.304304 0.454270 +v -0.194687 -0.304304 0.389374 +v -0.194687 -0.304304 0.324478 +v -0.194687 -0.304304 0.259583 +v -0.194687 -0.304304 0.194687 +v -0.194687 -0.304304 0.129791 +v -0.194687 -0.304304 0.064896 +v -0.194687 -0.304304 -0.000000 +v -0.194687 -0.304304 -0.064896 +v -0.194687 -0.304304 -0.129791 +v -0.194687 -0.304304 -0.194687 +v -0.194687 -0.304304 -0.259583 +v -0.194687 -0.304304 -0.324478 +v -0.194687 -0.304304 -0.389374 +v -0.194687 -0.304304 -0.454270 +v -0.454270 -0.304304 -0.454270 +v -0.389374 -0.304304 -0.454270 +v -0.324478 -0.304304 -0.454270 +v -0.259583 -0.304304 -0.454270 +v -0.454270 -0.304304 -0.389374 +v -0.389374 -0.304304 -0.389374 +v -0.324478 -0.304304 -0.389374 +v -0.259583 -0.304304 -0.389374 +v -0.454270 -0.304304 -0.324478 +v -0.389374 -0.304304 -0.324478 +v -0.324478 -0.304304 -0.324478 +v -0.259583 -0.304304 -0.324478 +v -0.454270 -0.304304 -0.259583 +v -0.389374 -0.304304 -0.259583 +v -0.324478 -0.304304 -0.259583 +v -0.259583 -0.304304 -0.259583 +v -0.454270 -0.304304 -0.194687 +v -0.389374 -0.304304 -0.194687 +v -0.324478 -0.304304 -0.194687 +v -0.259583 -0.304304 -0.194687 +v -0.454270 -0.304304 -0.129791 +v -0.389374 -0.304304 -0.129791 +v -0.324478 -0.304304 -0.129791 +v -0.259583 -0.304304 -0.129791 +v -0.454270 -0.304304 -0.064896 +v -0.389374 -0.304304 -0.064896 +v -0.324478 -0.304304 -0.064896 +v -0.259583 -0.304304 -0.064896 +v -0.454270 -0.304304 0.000000 +v -0.389374 -0.304304 0.000000 +v -0.324478 -0.304304 0.000000 +v -0.259583 -0.304304 -0.000000 +v -0.454270 -0.304304 0.064896 +v -0.389374 -0.304304 0.064896 +v -0.324478 -0.304304 0.064896 +v -0.259583 -0.304304 0.064896 +v -0.454269 -0.304304 0.129791 +v -0.389374 -0.304304 0.129791 +v -0.324478 -0.304304 0.129791 +v -0.259583 -0.304304 0.129791 +v -0.454269 -0.304304 0.194687 +v -0.389374 -0.304304 0.194687 +v -0.324478 -0.304304 0.194687 +v -0.259583 -0.304304 0.194687 +v -0.454269 -0.304304 0.259583 +v -0.389374 -0.304304 0.259583 +v -0.324478 -0.304304 0.259583 +v -0.259582 -0.304304 0.259583 +v -0.454269 -0.304304 0.324478 +v -0.389374 -0.304304 0.324478 +v -0.324478 -0.304304 0.324478 +v -0.259582 -0.304304 0.324478 +v -0.454269 -0.304304 0.389374 +v -0.389374 -0.304304 0.389374 +v -0.324478 -0.304304 0.389374 +v -0.259582 -0.304304 0.389374 +v -0.454269 -0.304304 0.454270 +v -0.389374 -0.304304 0.454270 +v -0.324478 -0.304304 0.454270 +v -0.259582 -0.304304 0.454270 +v -0.259582 -0.239408 0.519165 +v -0.194687 -0.239408 0.519165 +v -0.194687 -0.239408 -0.454270 +v -0.194687 -0.239408 -0.519165 +v -0.259583 -0.239408 -0.519165 +v -0.324478 -0.239408 -0.519165 +v -0.389374 -0.239408 -0.519165 +v -0.454270 -0.239408 -0.519165 +v -0.454269 -0.239408 0.519165 +v -0.389374 -0.239408 0.519165 +v -0.324478 -0.239408 0.519165 +v -0.194687 -0.239408 0.454270 +v -0.194687 -0.239408 0.389374 +v -0.194687 -0.239408 0.324478 +v -0.194687 -0.239408 0.259583 +v -0.194687 -0.239408 0.194687 +v -0.194687 -0.239408 0.129791 +v -0.194687 -0.239408 0.064896 +v -0.194687 -0.239408 -0.000000 +v -0.194687 -0.239408 -0.064896 +v -0.194687 -0.239408 -0.129791 +v -0.194687 -0.239408 -0.194687 +v -0.194687 -0.239408 -0.259583 +v -0.194687 -0.239408 -0.324478 +v -0.194687 -0.239408 -0.389374 +v -0.454270 -0.239408 -0.454270 +v -0.454270 -0.109617 -0.194687 +v -0.454270 -0.239408 -0.389374 +v -0.454270 -0.109617 -0.259583 +v -0.454270 -0.239408 -0.324478 +v -0.454270 -0.239408 -0.259583 +v -0.454270 -0.109617 -0.324478 +v -0.454270 -0.239408 -0.194687 +v -0.454270 -0.109617 -0.389374 +v -0.454270 -0.239408 -0.129791 +v -0.454270 -0.109617 -0.454270 +v -0.454270 -0.239408 -0.064896 +v -0.194687 -0.109617 -0.389374 +v -0.194687 -0.109617 -0.324478 +v -0.454270 -0.239408 0.000000 +v -0.194687 -0.109617 -0.259583 +v -0.194687 -0.109617 -0.194687 +v -0.194687 -0.109617 -0.129791 +v -0.454270 -0.239408 0.064896 +v -0.194687 -0.109617 -0.064896 +v -0.194687 -0.109617 -0.000000 +v -0.194687 -0.109617 0.064896 +v -0.454269 -0.239408 0.129791 +v -0.194687 -0.109617 0.129791 +v -0.194687 -0.109617 0.194687 +v -0.194687 -0.109617 0.259583 +v -0.454269 -0.239408 0.194687 +v -0.194687 -0.109617 0.324478 +v -0.194687 -0.109617 0.389374 +v -0.194687 -0.109617 0.454270 +v -0.454269 -0.239408 0.259583 +v -0.324478 -0.109617 0.519165 +v -0.389374 -0.109617 0.519165 +v -0.454269 -0.109617 0.519165 +v -0.454269 -0.239408 0.324478 +v -0.454270 -0.109617 -0.519165 +v -0.389374 -0.109617 -0.519165 +v -0.324478 -0.109617 -0.519165 +v -0.454269 -0.239408 0.389374 +v -0.259583 -0.109617 -0.519165 +v -0.194687 -0.109617 -0.519165 +v -0.194687 -0.109617 -0.454270 +v -0.454269 -0.239408 0.454270 +v -0.194687 -0.109617 0.519165 +v -0.259582 -0.109617 0.519165 +v -0.259582 -0.174512 0.519165 +v -0.194687 -0.174512 0.519165 +v -0.194687 -0.174512 -0.454270 +v -0.194687 -0.174512 -0.519165 +v -0.259583 -0.174512 -0.519165 +v -0.324478 -0.174512 -0.519165 +v -0.389374 -0.174512 -0.519165 +v -0.454270 -0.174512 -0.519165 +v -0.454269 -0.174512 0.519165 +v -0.389374 -0.174512 0.519165 +v -0.324478 -0.174512 0.519165 +v -0.194687 -0.174512 0.454270 +v -0.194687 -0.174512 0.389374 +v -0.194687 -0.174512 0.324478 +v -0.194687 -0.174512 0.259583 +v -0.194687 -0.174512 0.194687 +v -0.194687 -0.174512 0.129791 +v -0.194687 -0.174512 0.064896 +v -0.194687 -0.174512 -0.000000 +v -0.194687 -0.174512 -0.064896 +v -0.194687 -0.174512 -0.129791 +v -0.194687 -0.174512 -0.194687 +v -0.194687 -0.174512 -0.259583 +v -0.194687 -0.174512 -0.324478 +v -0.194687 -0.174512 -0.389374 +v -0.194687 -0.044721 -0.324478 +v -0.454270 -0.174512 -0.454270 +v -0.454270 -0.044721 -0.324478 +v -0.389374 -0.044721 -0.324478 +v -0.259583 -0.044721 -0.324478 +v -0.454270 -0.174512 -0.389374 +v -0.324478 -0.044721 -0.324478 +v -0.194687 -0.044721 -0.259583 +v -0.454270 -0.044721 -0.259583 +v -0.454270 -0.174512 -0.324478 +v -0.389374 -0.044721 -0.259583 +v -0.259583 -0.044721 -0.259583 +v -0.324478 -0.044721 -0.259583 +v -0.454270 -0.174512 -0.259583 +v -0.194687 -0.044721 -0.194687 +v -0.454270 -0.044721 -0.194687 +v -0.389374 -0.044721 -0.194687 +v -0.454270 -0.174512 -0.194687 +v -0.259583 -0.044721 -0.194687 +v -0.324478 -0.044721 -0.194687 +v -0.194687 -0.044721 -0.129791 +v -0.454270 -0.174512 -0.129791 +v -0.454270 -0.044721 -0.129791 +v -0.389374 -0.044721 -0.129791 +v -0.259583 -0.044721 -0.129791 +v -0.454270 -0.174512 -0.064896 +v -0.324478 -0.044721 -0.129791 +v -0.194687 -0.044721 -0.064896 +v -0.454270 -0.044721 -0.064896 +v -0.454270 -0.174512 0.000000 +v -0.389374 -0.044721 -0.064896 +v -0.259583 -0.044721 -0.064896 +v -0.324478 -0.044721 -0.064896 +v -0.454270 -0.174512 0.064896 +v -0.194687 -0.044721 -0.000000 +v -0.454270 -0.044721 0.000000 +v -0.389374 -0.044721 0.000000 +v -0.454269 -0.174512 0.129791 +v -0.259583 -0.044721 -0.000000 +v -0.324478 -0.044721 0.000000 +v -0.194687 -0.044721 0.064896 +v -0.454269 -0.174512 0.194687 +v -0.454270 -0.044721 0.064896 +v -0.389374 -0.044721 0.064896 +v -0.259583 -0.044721 0.064896 +v -0.454269 -0.174512 0.259583 +v -0.324478 -0.044721 0.064896 +v -0.194687 -0.044721 0.129791 +v -0.454269 -0.044721 0.129791 +v -0.454269 -0.174512 0.324478 +v -0.389374 -0.044721 0.129791 +v -0.259583 -0.044721 0.129791 +v -0.324478 -0.044721 0.129791 +v -0.454269 -0.174512 0.389374 +v -0.194687 -0.044721 0.194687 +v -0.454269 -0.044721 0.194687 +v -0.389374 -0.044721 0.194687 +v -0.454269 -0.174512 0.454270 +v -0.259583 -0.044721 0.194687 +v -0.324478 -0.044721 0.194687 +v -0.454270 -0.109617 -0.129791 +v -0.454270 -0.109617 -0.064896 +v -0.454270 -0.109617 0.000000 +v -0.454270 -0.109617 0.064896 +v -0.454269 -0.109617 0.129791 +v -0.454269 -0.109617 0.194687 +v -0.454269 -0.109617 0.259583 +v -0.454269 -0.109617 0.324478 +v -0.454269 -0.109617 0.389374 +v -0.454269 -0.109617 0.454270 +v -0.324478 -0.044721 -0.389374 +v -0.259583 -0.044721 -0.389374 +v -0.389374 -0.044721 -0.389374 +v -0.454270 -0.044721 -0.389374 +v -0.194687 -0.044721 -0.389374 +v -0.324478 -0.044721 -0.454270 +v -0.259583 -0.044721 -0.454270 +v -0.389374 -0.044721 -0.454270 +v -0.454270 -0.044721 -0.454270 +v -0.194687 -0.044721 -0.454270 +v -0.194687 -0.044721 0.259583 +v -0.194687 -0.044721 0.324478 +v -0.194687 -0.044721 0.389374 +v -0.194687 -0.044721 0.454270 +v -0.194687 -0.044721 0.519165 +v -0.324478 -0.044721 0.519165 +v -0.259582 -0.044721 0.519165 +v -0.389374 -0.044721 0.519165 +v -0.454269 -0.044721 0.519165 +v -0.389374 -0.044721 -0.519165 +v -0.454270 -0.044721 -0.519165 +v -0.324478 -0.044721 -0.519165 +v -0.259583 -0.044721 -0.519165 +v -0.194687 -0.044721 -0.519165 +v -0.259582 -0.044721 0.259583 +v -0.454269 -0.044721 0.259583 +v -0.389374 -0.044721 0.259583 +v -0.324478 -0.044721 0.259583 +v -0.259582 -0.044721 0.324478 +v -0.454269 -0.044721 0.324478 +v -0.389374 -0.044721 0.324478 +v -0.324478 -0.044721 0.324478 +v -0.259582 -0.044721 0.389374 +v -0.454269 -0.044721 0.389374 +v -0.389374 -0.044721 0.389374 +v -0.324478 -0.044721 0.389374 +v -0.259582 -0.044721 0.454270 +v -0.454269 -0.044721 0.454270 +v -0.389374 -0.044721 0.454270 +v -0.324478 -0.044721 0.454270 vn -0.0000 -1.0000 -0.0000 -usemtl none -s 1 -f 33/63/10 34/64/10 35/65/10 36/66/10 -f 37/67/10 38/68/10 39/69/10 40/70/10 -f 33/71/11 36/72/11 40/73/11 37/67/11 -f 33/71/12 34/74/12 38/75/12 37/67/12 -f 36/76/12 35/77/12 39/78/12 40/79/12 -f 41/80/11 42/81/11 43/82/11 44/83/11 -o nodebox4.002 -v 0.499948 -0.500045 0.505882 -v 0.249950 -0.500045 0.506796 -v 0.249950 -0.250045 0.506796 -v 0.499948 -0.250045 0.505882 -v 0.496291 -0.500045 -0.494111 -v 0.246293 -0.500045 -0.493197 -v 0.246293 -0.250045 -0.493197 -v 0.496291 -0.250045 -0.494111 -v 0.249950 -0.500045 0.506796 -v 0.249950 -0.250045 0.506796 -v 0.246293 -0.250045 -0.493197 -v 0.246293 -0.500045 -0.493197 -vt 0.0000 0.7500 -vt 0.0000 0.5000 -vt 0.2500 0.5000 -vt 0.2500 0.7500 -vt 0.0000 0.7500 -vt 0.0000 0.5000 -vt 0.2500 0.5000 -vt 0.2500 0.7500 -vt 1.0000 0.7500 -vt 1.0000 1.0000 -vt 0.0000 1.0000 -vt 1.0000 1.0000 -vt 0.0000 1.0000 -vt 1.0000 0.7500 -vt 1.0000 1.0000 -vt 0.0000 1.0000 -vt 0.0000 0.7500 -vt 1.0000 0.7500 -vt 1.0000 1.0000 -vt 0.0000 1.0000 -vt 0.0000 0.7500 -vn -0.0037 0.0000 -1.0000 -vn -1.0000 -0.0000 0.0037 -vn -0.0000 -1.0000 -0.0000 -usemtl none -s 1 -f 45/84/13 46/85/13 47/86/13 48/87/13 -f 49/88/13 50/89/13 51/90/13 52/91/13 -f 45/92/14 48/93/14 52/94/14 49/88/14 -f 45/92/15 46/95/15 50/96/15 49/88/15 -f 48/97/15 47/98/15 51/99/15 52/100/15 -f 53/101/14 54/102/14 55/103/14 56/104/14 +vn -1.0000 -0.0000 -0.0000 +vn -0.0000 -0.0000 1.0000 +vn -0.0000 -0.0000 -1.0000 +vn 1.0000 -0.0000 -0.0000 +vn -0.0000 1.0000 -0.0000 +vt 0.000050 0.999900 +vt 0.000025 0.812526 +vt 0.000000 0.500000 +vt 0.499950 0.999900 +vt 0.499975 0.812525 +vt 0.125000 0.500000 +vt 0.000050 0.937413 +vt 0.031250 0.500000 +vt 0.000050 0.874925 +vt 0.062500 0.500000 +vt 0.000050 0.812438 +vt 0.093750 0.500000 +vt 0.000050 0.749950 +vt 0.499978 1.000027 +vt 0.125000 0.500000 +vt 0.499950 0.749950 +vt 0.000022 1.000027 +vt 0.000000 0.500000 +vt 0.499950 0.812438 +vt 0.031250 0.500000 +vt 0.499950 0.874925 +vt 0.062500 0.500000 +vt 0.499950 0.937413 +vt 0.093750 0.500000 +vt 0.468706 0.999900 +vt 0.468728 0.812525 +vt 0.437463 0.999900 +vt 0.437481 0.812525 +vt 0.406219 0.999900 +vt 0.406234 0.812525 +vt 0.374975 0.999900 +vt 0.374988 0.812525 +vt 0.343731 0.999900 +vt 0.343741 0.812525 +vt 0.312488 0.999900 +vt 0.312494 0.812525 +vt 0.281244 0.999900 +vt 0.281247 0.812525 +vt 0.250000 0.999900 +vt 0.250000 0.812525 +vt 0.218756 0.999900 +vt 0.218753 0.812525 +vt 0.187513 0.999900 +vt 0.187506 0.812526 +vt 0.156269 0.999900 +vt 0.156259 0.812526 +vt 0.125025 0.999900 +vt 0.125013 0.812526 +vt 0.093781 0.999900 +vt 0.093766 0.812526 +vt 0.062537 0.999900 +vt 0.062519 0.812526 +vt 0.031294 0.999900 +vt 0.031272 0.812526 +vt 0.031294 0.749950 +vt 0.468731 1.000027 +vt 0.031294 0.812438 +vt 0.031294 0.874925 +vt 0.031294 0.937413 +vt 0.062538 0.749950 +vt 0.062500 0.921875 +vt 0.437484 1.000027 +vt 0.062538 0.812438 +vt 0.062537 0.874925 +vt 0.062537 0.937413 +vt 0.093781 0.749950 +vt 0.093750 0.921875 +vt 0.093781 0.812438 +vt 0.093781 0.874925 +vt 0.093781 0.937413 +vt 0.125025 0.749950 +vt 0.125000 0.921875 +vt 0.125025 0.812438 +vt 0.125025 0.874925 +vt 0.125025 0.937413 +vt 0.156269 0.749950 +vt 0.156250 0.921875 +vt 0.156269 0.812438 +vt 0.156269 0.874925 +vt 0.156269 0.937413 +vt 0.187513 0.749950 +vt 0.187500 0.921875 +vt 0.187513 0.812438 +vt 0.187513 0.874925 +vt 0.187513 0.937413 +vt 0.218756 0.749950 +vt 0.218750 0.921875 +vt 0.218756 0.812438 +vt 0.218756 0.874925 +vt 0.218756 0.937413 +vt 0.250000 0.749950 +vt 0.250000 0.921875 +vt 0.250000 0.812438 +vt 0.250000 0.874925 +vt 0.250000 0.937413 +vt 0.281244 0.749950 +vt 0.281250 0.921875 +vt 0.281244 0.812438 +vt 0.281244 0.874925 +vt 0.281244 0.937413 +vt 0.312488 0.749950 +vt 0.312500 0.921875 +vt 0.312488 0.812438 +vt 0.312488 0.874925 +vt 0.312488 0.937413 +vt 0.343731 0.749950 +vt 0.343750 0.921875 +vt 0.343731 0.812438 +vt 0.343731 0.874925 +vt 0.343731 0.937413 +vt 0.374975 0.749950 +vt 0.375000 0.921875 +vt 0.374975 0.812438 +vt 0.374975 0.874925 +vt 0.374975 0.937413 +vt 0.406219 0.749950 +vt 0.406250 0.921875 +vt 0.406219 0.812438 +vt 0.406219 0.874925 +vt 0.406219 0.937413 +vt 0.437463 0.749950 +vt 0.437500 0.921875 +vt 0.062516 1.000027 +vt 0.437463 0.812438 +vt 0.437463 0.874925 +vt 0.437463 0.937413 +vt 0.468706 0.749950 +vt 0.031269 1.000027 +vt 0.468706 0.812438 +vt 0.468706 0.874925 +vt 0.468706 0.937413 +vt 0.093750 0.562500 +vt 0.499975 0.875031 +vt 0.499975 0.750031 +vt 0.125000 0.562500 +vt 0.031272 0.875032 +vt 0.031272 0.750032 +vt 0.000025 0.875032 +vt 0.000025 0.750032 +vt 0.000000 0.562500 +vt 0.031250 0.562500 +vt 0.062500 0.562500 +vt 0.093750 0.562500 +vt 0.499978 0.937533 +vt 0.125000 0.562500 +vt 0.000022 0.937533 +vt 0.000000 0.562500 +vt 0.031250 0.562500 +vt 0.062500 0.562500 +vt 0.468728 0.875031 +vt 0.468728 0.750031 +vt 0.437481 0.875031 +vt 0.437481 0.750031 +vt 0.406234 0.875031 +vt 0.406234 0.750031 +vt 0.374988 0.875031 +vt 0.374988 0.750031 +vt 0.343741 0.875031 +vt 0.343741 0.750031 +vt 0.312494 0.875031 +vt 0.312494 0.750031 +vt 0.281247 0.875031 +vt 0.281247 0.750031 +vt 0.250000 0.875032 +vt 0.250000 0.750032 +vt 0.218753 0.875032 +vt 0.218753 0.750032 +vt 0.187506 0.875032 +vt 0.187506 0.750032 +vt 0.156259 0.875032 +vt 0.156259 0.750032 +vt 0.125013 0.875032 +vt 0.125013 0.750032 +vt 0.093766 0.875032 +vt 0.093766 0.750032 +vt 0.062519 0.875032 +vt 0.062519 0.750032 +vt 0.468731 0.937533 +vt 0.156250 0.968750 +vt 0.156250 0.937500 +vt 0.062500 0.937500 +vt 0.437484 0.937533 +vt 0.125000 0.968750 +vt 0.374989 0.812543 +vt 0.125000 0.937500 +vt 0.406236 0.937533 +vt 0.093750 0.937500 +vt 0.374989 0.937533 +vt 0.125000 0.937500 +vt 0.406236 0.812543 +vt 0.093750 0.937500 +vt 0.156250 0.937500 +vt 0.437484 0.812543 +vt 0.062500 0.937500 +vt 0.187500 0.937500 +vt 0.468731 0.812543 +vt 0.031250 0.937500 +vt 0.218750 0.937500 +vt 0.062519 0.875044 +vt 0.062519 1.000044 +vt 0.093766 0.875044 +vt 0.093766 1.000044 +vt 0.250000 0.937500 +vt 0.125012 0.875044 +vt 0.125012 1.000044 +vt 0.156259 0.875044 +vt 0.156259 1.000044 +vt 0.187506 0.875044 +vt 0.187506 1.000044 +vt 0.281250 0.937500 +vt 0.218753 0.875044 +vt 0.218753 1.000044 +vt 0.250000 0.875044 +vt 0.250000 1.000044 +vt 0.281247 0.875044 +vt 0.281247 1.000044 +vt 0.312500 0.937500 +vt 0.312494 0.875044 +vt 0.312494 1.000044 +vt 0.343741 0.875044 +vt 0.343741 1.000044 +vt 0.374987 0.875044 +vt 0.374987 1.000044 +vt 0.343750 0.937500 +vt 0.406234 0.875044 +vt 0.406234 1.000044 +vt 0.437481 0.875044 +vt 0.437481 1.000044 +vt 0.468728 0.875044 +vt 0.468728 1.000044 +vt 0.375000 0.937500 +vt 0.062500 0.687500 +vt 0.031250 0.687500 +vt 0.000022 0.812544 +vt 0.000000 0.687500 +vt 0.500000 0.937500 +vt 0.093764 0.937533 +vt 0.406250 0.937500 +vt 0.499978 0.812543 +vt 0.125000 0.687500 +vt 0.000000 0.937500 +vt 0.093750 0.687500 +vt 0.062500 0.687500 +vt 0.437500 0.937500 +vt 0.062516 0.937533 +vt 0.031250 0.687500 +vt 0.000025 0.875044 +vt 0.000025 1.000044 +vt 0.000000 0.687500 +vt 0.031272 0.875044 +vt 0.031272 1.000044 +vt 0.031269 0.937533 +vt 0.499975 0.875044 +vt 0.499975 1.000044 +vt 0.125000 0.687500 +vt 0.093750 0.687500 +vt 0.093750 0.625000 +vt 0.499975 0.812538 +vt 0.125000 0.625000 +vt 0.499975 0.937538 +vt 0.031272 0.812538 +vt 0.031272 0.937538 +vt 0.000025 0.812538 +vt 0.000000 0.625000 +vt 0.000025 0.937538 +vt 0.031250 0.625000 +vt 0.062500 0.625000 +vt 0.093750 0.625000 +vt 0.125000 0.625000 +vt 0.499978 0.875038 +vt 0.000000 0.625000 +vt 0.000022 0.875038 +vt 0.031250 0.625000 +vt 0.062500 0.625000 +vt 0.468728 0.812538 +vt 0.468728 0.937538 +vt 0.437481 0.812538 +vt 0.437481 0.937538 +vt 0.406234 0.812538 +vt 0.406234 0.937538 +vt 0.374988 0.812538 +vt 0.374988 0.937538 +vt 0.343741 0.812538 +vt 0.343741 0.937538 +vt 0.312494 0.812538 +vt 0.312494 0.937538 +vt 0.281247 0.812538 +vt 0.281247 0.937538 +vt 0.250000 0.812538 +vt 0.250000 0.937538 +vt 0.218753 0.812538 +vt 0.218753 0.937538 +vt 0.187506 0.812538 +vt 0.187506 0.937538 +vt 0.156259 0.812538 +vt 0.156259 0.937538 +vt 0.125013 0.812538 +vt 0.125013 0.937538 +vt 0.093766 0.812538 +vt 0.093766 0.937538 +vt 0.062519 0.812538 +vt 0.062519 0.937538 +vt 0.093781 0.999900 +vt 0.093766 0.937550 +vt 0.468731 0.875038 +vt 0.093750 1.000000 +vt 0.093781 0.749950 +vt 0.093781 0.812438 +vt 0.093781 0.937413 +vt 0.437484 0.875038 +vt 0.093781 0.874925 +vt 0.125025 0.999900 +vt 0.125012 0.937550 +vt 0.125000 1.000000 +vt 0.125025 0.749950 +vt 0.406236 0.875038 +vt 0.125025 0.812438 +vt 0.125025 0.937413 +vt 0.125025 0.874925 +vt 0.125000 0.953125 +vt 0.374989 0.875038 +vt 0.156269 0.999900 +vt 0.156259 0.937550 +vt 0.156250 1.000000 +vt 0.156269 0.749950 +vt 0.156269 0.812438 +vt 0.156250 0.953125 +vt 0.156269 0.937413 +vt 0.156269 0.874925 +vt 0.187513 0.999900 +vt 0.187506 0.937550 +vt 0.312495 0.875038 +vt 0.187500 0.953125 +vt 0.187500 1.000000 +vt 0.187513 0.749950 +vt 0.187513 0.812438 +vt 0.187513 0.937413 +vt 0.218750 0.953125 +vt 0.281247 0.875038 +vt 0.187513 0.874925 +vt 0.218756 0.999900 +vt 0.218753 0.937550 +vt 0.218750 1.000000 +vt 0.218756 0.749950 +vt 0.250000 0.875038 +vt 0.250000 0.953125 +vt 0.218756 0.812438 +vt 0.218756 0.937413 +vt 0.218756 0.874925 +vt 0.281250 0.953125 +vt 0.250000 0.999900 +vt 0.250000 0.937550 +vt 0.250000 1.000000 +vt 0.250000 0.749950 +vt 0.250000 0.812438 +vt 0.312500 0.953125 +vt 0.250000 0.937413 +vt 0.250000 0.874925 +vt 0.281244 0.999900 +vt 0.281247 0.937550 +vt 0.343750 0.953125 +vt 0.156258 0.875038 +vt 0.281250 1.000000 +vt 0.281244 0.749950 +vt 0.281244 0.812438 +vt 0.281244 0.937413 +vt 0.375000 0.953125 +vt 0.125011 0.875038 +vt 0.281244 0.874925 +vt 0.312488 0.999900 +vt 0.312494 0.937550 +vt 0.312500 1.000000 +vt 0.312488 0.749950 +vt 0.406250 0.953125 +vt 0.093764 0.875038 +vt 0.312488 0.812438 +vt 0.312488 0.937413 +vt 0.312488 0.874925 +vt 0.062516 0.875038 +vt 0.343731 0.999900 +vt 0.343741 0.937550 +vt 0.343750 1.000000 +vt 0.343731 0.749950 +vt 0.343731 0.812438 +vt 0.031269 0.875038 +vt 0.343731 0.937413 +vt 0.343731 0.874925 +vt 0.312495 0.812543 +vt 0.187500 0.968750 +vt 0.187500 0.937500 +vt 0.281247 0.812543 +vt 0.218750 0.937500 +vt 0.250000 0.812543 +vt 0.250000 0.968750 +vt 0.250000 0.937500 +vt 0.281250 0.968750 +vt 0.281250 0.937500 +vt 0.312500 0.968750 +vt 0.312500 0.937500 +vt 0.343750 0.968750 +vt 0.156258 0.812543 +vt 0.343750 0.937500 +vt 0.125011 0.812543 +vt 0.375000 0.937500 +vt 0.093764 0.812544 +vt 0.406250 0.937500 +vt 0.062516 0.812544 +vt 0.437500 0.937500 +vt 0.031269 0.812544 +vt 0.468750 0.937500 +vt 0.062537 0.874925 +vt 0.062537 0.937413 +vt 0.062538 0.812438 +vt 0.062538 0.749950 +vt 0.062500 1.000000 +vt 0.062537 0.999900 +vt 0.062519 0.937551 +vt 0.031294 0.874925 +vt 0.031294 0.937413 +vt 0.031294 0.812438 +vt 0.031294 0.749950 +vt 0.031250 1.000000 +vt 0.031294 0.999900 +vt 0.031272 0.937551 +vt 0.374975 0.999900 +vt 0.374987 0.937550 +vt 0.406219 0.999900 +vt 0.406234 0.937550 +vt 0.437463 0.999900 +vt 0.437481 0.937550 +vt 0.468706 0.999900 +vt 0.468728 0.937550 +vt 0.499950 0.999900 +vt 0.499975 0.937550 +vt 0.125000 0.750000 +vt 0.062500 0.750000 +vt 0.499950 0.874925 +vt 0.093750 0.750000 +vt 0.499950 0.937413 +vt 0.031250 0.750000 +vt 0.499950 0.812438 +vt 0.000000 0.750000 +vt 0.500000 1.000000 +vt 0.499950 0.749950 +vt 0.000050 0.812438 +vt 0.093750 0.750000 +vt 0.000050 0.749950 +vt 0.125000 0.750000 +vt 0.000000 1.000000 +vt 0.000050 0.874925 +vt 0.062500 0.750000 +vt 0.000050 0.937413 +vt 0.031250 0.750000 +vt 0.000050 0.999900 +vt 0.000025 0.937551 +vt 0.000000 0.750000 +vt 0.374975 0.937413 +vt 0.375000 1.000000 +vt 0.374975 0.749950 +vt 0.374975 0.812438 +vt 0.374975 0.874925 +vt 0.406219 0.937413 +vt 0.406250 1.000000 +vt 0.406219 0.749950 +vt 0.406219 0.812438 +vt 0.406219 0.874925 +vt 0.437463 0.937413 +vt 0.437500 1.000000 +vt 0.437463 0.749950 +vt 0.437463 0.812438 +vt 0.437463 0.874925 +vt 0.468706 0.937413 +vt 0.468750 1.000000 +vt 0.468706 0.749950 +vt 0.468706 0.812438 +vt 0.468706 0.874925 +vt 0.406250 0.828125 +vt 0.406250 0.312500 +vt 0.406250 0.250000 +vt 0.406250 0.812500 +vt 0.406250 0.796875 +vt 0.406250 0.781250 +vt 0.406219 0.031584 +vt 0.375000 0.875000 +vt 0.374975 0.465416 +vt 0.375000 0.859375 +vt 0.375000 0.437500 +vt 0.375000 0.375000 +vt 0.375000 0.843750 +vt 0.000050 0.465416 +vt 0.000050 0.437513 +vt 0.000050 0.375025 +vt 0.000050 0.312538 +vt 0.000050 0.250050 +vt 0.000050 0.187562 +vt 0.000050 0.125075 +vt 0.000050 0.062587 +vt 0.000050 0.031584 +vt 0.375000 0.312500 +vt 0.375000 0.828125 +vt 0.375000 0.250000 +vt 0.375000 0.812500 +vt 0.375000 0.796875 +vt 0.375000 0.187500 +vt 0.375000 0.781250 +vt 0.375000 0.125000 +vt 0.374975 0.031584 +vt 0.343750 0.875000 +vt 0.343731 0.465416 +vt 0.343750 0.859375 +vt 0.343750 0.437500 +vt 0.343750 0.375000 +vt 0.343750 0.843750 +vt 0.343750 0.828125 +vt 0.343750 0.812500 +vt 0.343750 0.187500 +vt 0.343750 0.796875 +vt 0.343750 0.125000 +vt 0.343750 0.781250 +vt 0.343731 0.031584 +vt 0.312500 0.875000 +vt 0.312488 0.465416 +vt 0.312500 0.437500 +vt 0.312500 0.859375 +vt 0.312500 0.375000 +vt 0.312500 0.843750 +vt 0.312500 0.828125 +vt 0.499950 0.031584 +vt 0.499950 0.062587 +vt 0.499950 0.125075 +vt 0.499950 0.187562 +vt 0.499950 0.250050 +vt 0.499950 0.312538 +vt 0.499950 0.375025 +vt 0.499950 0.465416 +vt 0.499950 0.437513 +vt 0.312500 0.812500 +vt 0.312500 0.796875 +vt 0.312500 0.781250 +vt 0.312488 0.031584 +vt 0.281250 0.875000 +vt 0.281244 0.465416 +vt 0.281250 0.859375 +vt 0.031294 0.062587 +vt 0.031294 0.031584 +vt 0.031294 0.125075 +vt 0.031294 0.187562 +vt 0.031294 0.250050 +vt 0.031294 0.312537 +vt 0.031294 0.375025 +vt 0.031294 0.437512 +vt 0.031294 0.465416 +vt 0.281250 0.843750 +vt 0.281250 0.828125 +vt 0.281250 0.812500 +vt 0.281250 0.796875 +vt 0.281250 0.781250 +vt 0.281244 0.031584 +vt 0.062538 0.062587 +vt 0.062538 0.031584 +vt 0.062538 0.125075 +vt 0.062538 0.187562 +vt 0.062538 0.250050 +vt 0.062538 0.312537 +vt 0.062538 0.375025 +vt 0.062538 0.437512 +vt 0.062538 0.465416 +vt 0.250000 0.875000 +vt 0.250000 0.465416 +vt 0.250000 0.859375 +vt 0.250000 0.843750 +vt 0.250000 0.828125 +vt 0.250000 0.812500 +vt 0.093781 0.062587 +vt 0.093781 0.031584 +vt 0.093781 0.125075 +vt 0.093781 0.187562 +vt 0.093781 0.250050 +vt 0.093781 0.312538 +vt 0.093781 0.375025 +vt 0.093781 0.437513 +vt 0.093781 0.465416 +vt 0.250000 0.796875 +vt 0.250000 0.781250 +vt 0.250000 0.031584 +vt 0.218750 0.875000 +vt 0.218750 0.500000 +vt 0.218756 0.465416 +vt 0.218750 0.437500 +vt 0.218750 0.859375 +vt 0.218750 0.843750 +vt 0.125025 0.062587 +vt 0.125025 0.031584 +vt 0.125025 0.125075 +vt 0.125025 0.187562 +vt 0.125025 0.250050 +vt 0.125025 0.312538 +vt 0.125025 0.375025 +vt 0.125025 0.437513 +vt 0.125025 0.465416 +vt 0.218750 0.828125 +vt 0.218750 0.812500 +vt 0.218750 0.250000 +vt 0.218750 0.187500 +vt 0.218750 0.796875 +vt 0.218750 0.781250 +vt 0.218756 0.031584 +vt 0.187500 0.500000 +vt 0.187513 0.465416 +vt 0.156269 0.062587 +vt 0.156269 0.031584 +vt 0.156269 0.125075 +vt 0.156269 0.187562 +vt 0.156269 0.250050 +vt 0.156269 0.312538 +vt 0.156269 0.375025 +vt 0.156269 0.437513 +vt 0.156269 0.465416 +vt 0.187500 0.437500 +vt 0.187500 0.859375 +vt 0.187500 0.843750 +vt 0.187500 0.828125 +vt 0.187500 0.812500 +vt 0.187500 0.250000 +vt 0.187500 0.187500 +vt 0.187500 0.796875 +vt 0.187513 0.062587 +vt 0.187513 0.031584 +vt 0.187513 0.125075 +vt 0.187513 0.187562 +vt 0.187513 0.250050 +vt 0.187513 0.312538 +vt 0.187513 0.375025 +vt 0.187513 0.437513 +vt 0.187513 0.465416 +vt 0.187500 0.781250 +vt 0.187513 0.031584 +vt 0.156250 0.500000 +vt 0.156250 0.875000 +vt 0.156269 0.465416 +vt 0.156250 0.437500 +vt 0.156250 0.859375 +vt 0.156250 0.843750 +vt 0.156250 0.375000 +vt 0.156250 0.312500 +vt 0.156250 0.828125 +vt 0.218756 0.062587 +vt 0.218756 0.031584 +vt 0.218756 0.125075 +vt 0.218756 0.187562 +vt 0.218756 0.250050 +vt 0.218756 0.312538 +vt 0.218756 0.375025 +vt 0.218756 0.437513 +vt 0.218756 0.465416 +vt 0.156250 0.250000 +vt 0.156250 0.812500 +vt 0.156250 0.796875 +vt 0.156250 0.187500 +vt 0.156250 0.781250 +vt 0.156250 0.125000 +vt 0.156269 0.031584 +vt 0.125000 0.875000 +vt 0.125025 0.465416 +vt 0.125000 0.859375 +vt 0.250000 0.062587 +vt 0.250000 0.031584 +vt 0.250000 0.125075 +vt 0.250000 0.187562 +vt 0.250000 0.250050 +vt 0.250000 0.312538 +vt 0.250000 0.375025 +vt 0.250000 0.437513 +vt 0.250000 0.465416 +vt 0.125000 0.843750 +vt 0.125000 0.375000 +vt 0.125000 0.312500 +vt 0.125000 0.828125 +vt 0.125000 0.812500 +vt 0.125000 0.187500 +vt 0.125000 0.796875 +vt 0.125000 0.125000 +vt 0.125000 0.781250 +vt 0.125025 0.031584 +vt 0.281244 0.062587 +vt 0.281244 0.031584 +vt 0.281244 0.125075 +vt 0.281244 0.187562 +vt 0.281244 0.250050 +vt 0.281244 0.312538 +vt 0.281244 0.375025 +vt 0.281244 0.437513 +vt 0.281244 0.465416 +vt 0.093750 0.875000 +vt 0.093750 0.500000 +vt 0.093781 0.465416 +vt 0.093750 0.437500 +vt 0.093750 0.859375 +vt 0.093750 0.375000 +vt 0.093750 0.843750 +vt 0.093750 0.312500 +vt 0.093750 0.828125 +vt 0.093750 0.812500 +vt 0.312488 0.062587 +vt 0.312488 0.031584 +vt 0.312488 0.125075 +vt 0.312488 0.187562 +vt 0.312488 0.250050 +vt 0.312488 0.312538 +vt 0.312488 0.375025 +vt 0.312488 0.437513 +vt 0.312488 0.465416 +vt 0.093750 0.796875 +vt 0.093750 0.187500 +vt 0.093750 0.781250 +vt 0.093750 0.125000 +vt 0.093781 0.031584 +vt 0.062500 0.500000 +vt 0.062538 0.465416 +vt 0.062500 0.859375 +vt 0.062500 0.437500 +vt 0.062500 0.843750 +vt 0.062500 0.375000 +vt 0.343731 0.062587 +vt 0.343731 0.031584 +vt 0.343731 0.125075 +vt 0.343731 0.187562 +vt 0.343731 0.250050 +vt 0.343731 0.312538 +vt 0.343731 0.375025 +vt 0.343731 0.437513 +vt 0.343731 0.465416 +vt 0.062500 0.828125 +vt 0.062500 0.312500 +vt 0.062500 0.812500 +vt 0.062500 0.250000 +vt 0.062500 0.796875 +vt 0.062500 0.187500 +vt 0.062500 0.125000 +vt 0.062538 0.031584 +vt 0.031250 0.500000 +vt 0.031294 0.465416 +vt 0.374975 0.062587 +vt 0.374975 0.031584 +vt 0.374975 0.125075 +vt 0.374975 0.187562 +vt 0.374975 0.250050 +vt 0.374975 0.312538 +vt 0.374975 0.375025 +vt 0.374975 0.437513 +vt 0.374975 0.465416 +vt 0.031250 0.437500 +vt 0.031250 0.375000 +vt 0.031250 0.312500 +vt 0.031250 0.250000 +vt 0.031250 0.187500 +vt 0.406219 0.062587 +vt 0.406219 0.031584 +vt 0.406219 0.125075 +vt 0.406219 0.187562 +vt 0.406219 0.250050 +vt 0.406219 0.312538 +vt 0.406219 0.375025 +vt 0.406219 0.437513 +vt 0.406219 0.465416 +vt 0.031250 0.125000 +vt 0.031294 0.031584 +vt 0.500000 0.500000 +vt 0.499950 0.465416 +vt 0.499950 0.437513 +vt 0.500000 0.437500 +vt 0.499950 0.375025 +vt 0.500000 0.375000 +vt 0.499950 0.312538 +vt 0.500000 0.312500 +vt 0.499950 0.250050 +vt 0.437463 0.062587 +vt 0.437463 0.031584 +vt 0.437463 0.125075 +vt 0.437462 0.187562 +vt 0.437462 0.250050 +vt 0.437463 0.312538 +vt 0.437463 0.375025 +vt 0.437463 0.437513 +vt 0.437463 0.465416 +vt 0.500000 0.250000 +vt 0.499950 0.187562 +vt 0.500000 0.187500 +vt 0.499950 0.125075 +vt 0.500000 0.125000 +vt 0.499950 0.031584 +vt 0.499950 0.062587 +vt 0.000000 0.125000 +vt 0.000050 0.062587 +vt 0.000050 0.031584 +vt 0.000000 0.187500 +vt 0.000050 0.125075 +vt 0.468706 0.062587 +vt 0.468706 0.031584 +vt 0.468706 0.125075 +vt 0.468706 0.187562 +vt 0.468706 0.250050 +vt 0.468706 0.312538 +vt 0.468706 0.375025 +vt 0.468706 0.437513 +vt 0.468706 0.465416 +vt 0.000000 0.250000 +vt 0.000050 0.187562 +vt 0.000000 0.312500 +vt 0.000050 0.250050 +vt 0.000000 0.375000 +vt 0.000050 0.312538 +vt 0.000000 0.437500 +vt 0.000050 0.375025 +vt 0.000000 0.500000 +vt 0.000050 0.465416 +vt 0.000050 0.437513 +vt 0.406250 0.843750 +vt 0.406250 0.437500 +vt 0.406250 0.859375 +vt 0.406250 0.500000 +vt 0.406250 0.875000 +vt 0.406219 0.465416 +vt 0.437500 0.125000 +vt 0.437500 0.781250 +vt 0.437463 0.031584 +vt 0.437500 0.187500 +vt 0.437500 0.796875 +vt 0.437500 0.250000 +vt 0.437500 0.812500 +vt 0.437500 0.828125 +vt 0.437500 0.312500 +vt 0.437500 0.375000 +vt 0.437500 0.843750 +vt 0.437500 0.437500 +vt 0.437500 0.859375 +vt 0.437500 0.500000 +vt 0.437463 0.465416 +vt 0.468750 0.125000 +vt 0.468706 0.031584 +vt 0.468750 0.796875 +vt 0.468750 0.187500 +vt 0.468750 0.250000 +vt 0.468750 0.812500 +vt 0.468750 0.312500 +vt 0.468750 0.828125 +vt 0.468750 0.375000 +vt 0.468750 0.843750 +vt 0.468750 0.437500 +vt 0.468750 0.500000 +vt 0.468706 0.465416 +vt 0.000050 0.812438 +vt 0.499975 0.750031 +vt 0.000000 0.500000 +vt 0.500000 0.890625 +vt 0.000025 0.750032 +vt 0.125000 0.500000 +vt 0.000050 0.749950 +vt 0.000050 0.874925 +vt 0.031250 0.500000 +vt 0.000050 0.937413 +vt 0.000050 0.812438 +vt 0.062500 0.500000 +vt 0.000050 0.999900 +vt 0.000050 0.874925 +vt 0.093750 0.500000 +vt 0.000050 0.937413 +vt 0.500000 0.812500 +vt 0.125000 0.500000 +vt 0.500000 0.937500 +vt 0.000000 0.812500 +vt 0.000000 0.500000 +vt 0.500000 1.000000 +vt 0.468750 0.937500 +vt 0.031250 0.500000 +vt 0.468750 0.875000 +vt 0.500000 0.812500 +vt 0.062500 0.500000 +vt 0.500000 0.875000 +vt 0.093750 0.500000 +vt 0.468750 0.890625 +vt 0.031272 0.750032 +vt 0.437500 0.890625 +vt 0.062519 0.750032 +vt 0.406250 0.890625 +vt 0.093766 0.750032 +vt 0.375000 0.890625 +vt 0.125012 0.750032 +vt 0.125000 0.937500 +vt 0.343750 0.890625 +vt 0.156250 0.937500 +vt 0.312500 0.890625 +vt 0.187500 0.937500 +vt 0.281250 0.890625 +vt 0.218750 0.937500 +vt 0.250000 0.890625 +vt 0.250000 0.937500 +vt 0.218750 0.890625 +vt 0.281250 0.937500 +vt 0.187500 0.890625 +vt 0.312500 0.937500 +vt 0.156250 0.890625 +vt 0.343750 0.937500 +vt 0.125000 0.890625 +vt 0.375000 0.937500 +vt 0.093750 0.890625 +vt 0.406234 0.750031 +vt 0.406250 0.937500 +vt 0.062500 0.890625 +vt 0.437481 0.750031 +vt 0.031294 0.812437 +vt 0.031250 0.890625 +vt 0.468728 0.750031 +vt 0.031294 0.937413 +vt 0.468750 0.812500 +vt 0.031294 0.874925 +vt 0.031294 0.999900 +vt 0.031250 0.906250 +vt 0.031294 0.937412 +vt 0.031294 0.812437 +vt 0.031250 0.921875 +vt 0.031250 0.890625 +vt 0.031294 0.749950 +vt 0.031294 0.874925 +vt 0.031250 0.906250 +vt 0.062537 0.937413 +vt 0.062500 0.921875 +vt 0.437500 0.812500 +vt 0.062537 0.999900 +vt 0.062500 0.937500 +vt 0.062500 0.906250 +vt 0.062500 0.921875 +vt 0.062500 0.890625 +vt 0.062500 0.875000 +vt 0.062500 0.906250 +vt 0.093750 0.921875 +vt 0.406250 0.812500 +vt 0.406250 0.953125 +vt 0.093750 0.937500 +vt 0.093750 0.906250 +vt 0.093750 0.921875 +vt 0.093750 0.890625 +vt 0.093750 0.875000 +vt 0.093750 0.906250 +vt 0.125000 0.921875 +vt 0.375000 0.953125 +vt 0.125000 0.937500 +vt 0.125000 0.906250 +vt 0.125000 0.921875 +vt 0.125000 0.890625 +vt 0.125000 0.875000 +vt 0.125000 0.906250 +vt 0.156250 0.921875 +vt 0.343750 0.953125 +vt 0.156250 0.937500 +vt 0.156250 0.906250 +vt 0.156250 0.921875 +vt 0.156250 0.890625 +vt 0.156250 0.875000 +vt 0.156250 0.906250 +vt 0.187500 0.921875 +vt 0.312500 0.953125 +vt 0.187500 0.937500 +vt 0.187500 0.906250 +vt 0.187500 0.921875 +vt 0.187500 0.890625 +vt 0.187500 0.875000 +vt 0.187500 0.906250 +vt 0.218750 0.921875 +vt 0.281250 0.953125 +vt 0.218750 0.937500 +vt 0.218750 0.906250 +vt 0.218750 0.921875 +vt 0.218750 0.890625 +vt 0.218750 0.875000 +vt 0.218750 0.906250 +vt 0.250000 0.921875 +vt 0.250000 0.953125 +vt 0.250000 0.937500 +vt 0.250000 0.906250 +vt 0.250000 0.921875 +vt 0.250000 0.890625 +vt 0.250000 0.875000 +vt 0.250000 0.906250 +vt 0.281250 0.921875 +vt 0.218750 0.953125 +vt 0.281250 0.937500 +vt 0.281250 0.906250 +vt 0.281250 0.921875 +vt 0.281250 0.890625 +vt 0.281250 0.875000 +vt 0.281250 0.906250 +vt 0.312500 0.921875 +vt 0.187500 0.953125 +vt 0.312500 0.937500 +vt 0.312500 0.906250 +vt 0.312500 0.921875 +vt 0.312500 0.890625 +vt 0.312500 0.875000 +vt 0.312500 0.906250 +vt 0.343750 0.921875 +vt 0.156250 0.953125 +vt 0.343750 0.937500 +vt 0.343750 0.906250 +vt 0.343750 0.921875 +vt 0.343750 0.890625 +vt 0.343750 0.875000 +vt 0.343750 0.906250 +vt 0.375000 0.921875 +vt 0.125000 0.812500 +vt 0.125000 0.953125 +vt 0.375000 0.937500 +vt 0.375000 0.906250 +vt 0.375000 0.921875 +vt 0.375000 0.890625 +vt 0.375000 0.875000 +vt 0.375000 0.906250 +vt 0.406250 0.921875 +vt 0.093750 0.812500 +vt 0.406250 0.937500 +vt 0.406250 0.906250 +vt 0.406250 0.921875 +vt 0.406250 0.890625 +vt 0.406250 0.875000 +vt 0.406250 0.906250 +vt 0.437500 0.921875 +vt 0.437500 0.937500 +vt 0.062500 0.812500 +vt 0.437500 0.937500 +vt 0.437500 1.000000 +vt 0.437500 0.906250 +vt 0.437500 0.921875 +vt 0.437500 0.890625 +vt 0.437500 0.875000 +vt 0.437500 0.906250 +vt 0.468750 0.937500 +vt 0.031250 0.812500 +vt 0.468750 0.906250 +vt 0.468750 1.000000 +vt 0.500000 0.937500 +vt 0.468750 0.921875 +vt 0.468750 0.890625 +vt 0.500000 0.875000 +vt 0.468750 0.812500 +vt 0.468750 0.906250 +vt 0.468750 0.875000 +vt 0.093750 0.562500 +vt 0.000025 0.812526 +vt 0.125000 0.562500 +vt 0.468728 0.812525 +vt 0.499975 0.812525 +vt 0.000000 0.562500 +vt 0.031250 0.562500 +vt 0.062500 0.562500 +vt 0.093750 0.562500 +vt 0.500000 0.875000 +vt 0.500000 0.750000 +vt 0.125000 0.562500 +vt 0.000000 0.875000 +vt 0.000000 0.750000 +vt 0.000000 0.562500 +vt 0.031250 0.562500 +vt 0.062500 0.562500 +vt 0.031272 0.812526 +vt 0.062519 0.812526 +vt 0.093766 0.812526 +vt 0.125012 0.812526 +vt 0.125000 0.953125 +vt 0.156250 0.953125 +vt 0.187506 0.812538 +vt 0.187500 0.953125 +vt 0.218753 0.812538 +vt 0.218750 0.953125 +vt 0.250000 0.812538 +vt 0.250000 0.953125 +vt 0.281250 0.953125 +vt 0.312494 0.812538 +vt 0.312500 0.953125 +vt 0.343741 0.812538 +vt 0.343750 0.953125 +vt 0.374987 0.812538 +vt 0.375000 0.953125 +vt 0.406234 0.812525 +vt 0.406250 0.953125 +vt 0.437481 0.812525 +vt 0.468750 0.875000 +vt 0.468750 0.750000 +vt 0.343750 0.875000 +vt 0.343750 1.000000 +vt 0.437500 0.875000 +vt 0.437500 0.750000 +vt 0.375000 0.875000 +vt 0.375000 1.000000 +vt 0.406250 0.875000 +vt 0.406250 0.750000 +vt 0.406250 0.937500 +vt 0.375000 0.875000 +vt 0.375000 0.937500 +vt 0.406250 0.875000 +vt 0.406250 1.000000 +vt 0.343750 0.875000 +vt 0.343750 0.968750 +vt 0.343750 0.937500 +vt 0.437500 0.875000 +vt 0.437500 1.000000 +vt 0.312500 0.968750 +vt 0.312500 0.937500 +vt 0.468750 0.875000 +vt 0.468750 1.000000 +vt 0.281250 0.968750 +vt 0.281250 0.937500 +vt 0.437481 0.937550 +vt 0.406234 0.937550 +vt 0.250000 0.968750 +vt 0.250000 0.875000 +vt 0.250000 0.937500 +vt 0.374987 0.937550 +vt 0.343741 0.937550 +vt 0.312494 0.937551 +vt 0.218750 0.875000 +vt 0.218750 0.937500 +vt 0.281247 0.937551 +vt 0.250000 0.937551 +vt 0.218753 0.937551 +vt 0.187500 0.968750 +vt 0.187500 0.875000 +vt 0.187500 0.937500 +vt 0.187506 0.937551 +vt 0.156259 0.937551 +vt 0.125012 0.937551 +vt 0.156250 0.968750 +vt 0.156250 0.937500 +vt 0.093766 0.937551 +vt 0.062519 0.937551 +vt 0.031272 0.937551 +vt 0.125000 0.875000 +vt 0.125000 0.968750 +vt 0.125000 0.750000 +vt 0.125000 0.937500 +vt 0.062500 0.687500 +vt 0.031250 0.687500 +vt 0.000000 0.875000 +vt 0.000000 0.687500 +vt 0.000000 1.000000 +vt 0.093750 0.875000 +vt 0.093750 0.750000 +vt 0.500000 0.875000 +vt 0.125000 0.687500 +vt 0.500000 1.000000 +vt 0.093750 0.687500 +vt 0.062500 0.687500 +vt 0.062500 0.875000 +vt 0.062500 0.750000 +vt 0.031250 0.687500 +vt 0.499975 0.937550 +vt 0.000000 0.687500 +vt 0.468728 0.937550 +vt 0.031250 0.875000 +vt 0.031250 0.750000 +vt 0.000025 0.937551 +vt 0.125000 0.687500 +vt 0.093750 0.687500 +vt 0.093750 0.625000 +vt 0.125000 0.625000 +vt 0.000025 0.875044 +vt 0.468728 0.875044 +vt 0.000000 0.625000 +vt 0.499975 0.875044 +vt 0.031250 0.625000 +vt 0.062500 0.625000 +vt 0.093750 0.625000 +vt 0.500000 0.812500 +vt 0.125000 0.625000 +vt 0.500000 0.937500 +vt 0.000000 0.812500 +vt 0.000000 0.625000 +vt 0.000000 0.937500 +vt 0.031250 0.625000 +vt 0.062500 0.625000 +vt 0.031272 0.875044 +vt 0.062519 0.875044 +vt 0.093766 0.875044 +vt 0.125000 0.968750 +vt 0.125012 0.875044 +vt 0.156250 0.968750 +vt 0.156259 0.875044 +vt 0.187500 0.968750 +vt 0.187506 0.875044 +vt 0.218753 0.875044 +vt 0.250000 0.968750 +vt 0.250000 0.875044 +vt 0.281250 0.968750 +vt 0.281247 0.875044 +vt 0.312500 0.968750 +vt 0.312494 0.875044 +vt 0.343741 0.875044 +vt 0.374987 0.875044 +vt 0.406234 0.875044 +vt 0.437481 0.875044 +vt 0.093781 0.999900 +vt 0.406234 1.000044 +vt 0.468750 0.812500 +vt 0.468750 0.937500 +vt 0.406250 0.937500 +vt 0.093781 0.749950 +vt 0.093781 0.812438 +vt 0.093781 0.937413 +vt 0.437500 0.812500 +vt 0.437500 0.937500 +vt 0.093781 0.874925 +vt 0.125025 0.999900 +vt 0.374988 1.000044 +vt 0.375000 0.937500 +vt 0.125025 0.749950 +vt 0.406250 0.812500 +vt 0.406250 0.937500 +vt 0.125025 0.812438 +vt 0.125025 0.937413 +vt 0.125025 0.874925 +vt 0.375000 0.812500 +vt 0.375000 0.937500 +vt 0.156269 0.999900 +vt 0.343741 1.000044 +vt 0.343750 0.937500 +vt 0.156269 0.749950 +vt 0.156269 0.812438 +vt 0.343750 0.812500 +vt 0.343750 0.953125 +vt 0.343750 0.937500 +vt 0.156269 0.937413 +vt 0.156269 0.874925 +vt 0.187513 0.999900 +vt 0.312494 1.000044 +vt 0.312500 0.953125 +vt 0.312500 0.937500 +vt 0.312500 0.937500 +vt 0.187513 0.749950 +vt 0.187513 0.812438 +vt 0.187513 0.937413 +vt 0.281250 0.953125 +vt 0.281250 0.937500 +vt 0.187513 0.874925 +vt 0.218756 0.999900 +vt 0.281247 1.000044 +vt 0.281250 0.937500 +vt 0.218756 0.749950 +vt 0.250000 0.953125 +vt 0.250000 0.812500 +vt 0.250000 0.937500 +vt 0.218756 0.812438 +vt 0.218756 0.937413 +vt 0.218756 0.874925 +vt 0.218750 0.812500 +vt 0.218750 0.937500 +vt 0.250000 0.999900 +vt 0.250000 1.000044 +vt 0.250000 0.937500 +vt 0.250000 0.749950 +vt 0.250000 0.812438 +vt 0.187500 0.953125 +vt 0.187500 0.812500 +vt 0.187500 0.937500 +vt 0.250000 0.937413 +vt 0.250000 0.874925 +vt 0.281244 0.999900 +vt 0.218753 1.000044 +vt 0.156250 0.953125 +vt 0.156250 0.937500 +vt 0.218750 0.937500 +vt 0.281244 0.749950 +vt 0.281244 0.812438 +vt 0.281244 0.937413 +vt 0.125000 0.812500 +vt 0.125000 0.953125 +vt 0.125000 0.937500 +vt 0.281244 0.874925 +vt 0.312488 0.999900 +vt 0.187506 1.000044 +vt 0.187500 0.937500 +vt 0.312488 0.749950 +vt 0.093750 0.812500 +vt 0.093750 0.937500 +vt 0.312488 0.812438 +vt 0.312488 0.937413 +vt 0.312488 0.874925 +vt 0.062500 0.812500 +vt 0.062500 0.937500 +vt 0.343731 0.999900 +vt 0.156259 1.000044 +vt 0.156250 0.937500 +vt 0.343731 0.749950 +vt 0.343731 0.812438 +vt 0.031250 0.812500 +vt 0.031250 0.937500 +vt 0.343731 0.937413 +vt 0.343731 0.874925 +vt 0.312500 0.875000 +vt 0.312500 1.000000 +vt 0.281250 0.875000 +vt 0.281250 1.000000 +vt 0.250000 0.875000 +vt 0.250000 1.000000 +vt 0.218750 0.875000 +vt 0.218750 1.000000 +vt 0.187500 0.875000 +vt 0.187500 1.000000 +vt 0.156250 0.875000 +vt 0.156250 1.000000 +vt 0.125000 0.875000 +vt 0.125000 1.000000 +vt 0.093750 0.875000 +vt 0.093750 1.000000 +vt 0.062500 0.875000 +vt 0.062500 1.000000 +vt 0.031250 0.875000 +vt 0.031250 1.000000 +vt 0.062537 0.874925 +vt 0.062537 0.937413 +vt 0.062538 0.812438 +vt 0.062538 0.749950 +vt 0.437500 0.937500 +vt 0.062537 0.999900 +vt 0.437481 1.000044 +vt 0.031294 0.874925 +vt 0.031294 0.937413 +vt 0.031294 0.812438 +vt 0.031294 0.749950 +vt 0.468750 0.937500 +vt 0.031294 0.999900 +vt 0.468728 1.000044 +vt 0.374975 0.999900 +vt 0.125012 1.000045 +vt 0.406219 0.999900 +vt 0.093766 1.000045 +vt 0.437463 0.999900 +vt 0.062519 1.000045 +vt 0.468706 0.999900 +vt 0.031272 1.000044 +vt 0.499950 0.999900 +vt 0.000025 1.000044 +vt 0.125000 0.750000 +vt 0.062500 0.750000 +vt 0.499950 0.874925 +vt 0.093750 0.750000 +vt 0.499950 0.937413 +vt 0.031250 0.750000 +vt 0.499950 0.812438 +vt 0.000000 0.750000 +vt 0.000000 0.937500 +vt 0.499950 0.749950 +vt 0.000050 0.812438 +vt 0.093750 0.750000 +vt 0.000050 0.749950 +vt 0.125000 0.750000 +vt 0.500000 0.937500 +vt 0.000050 0.874925 +vt 0.062500 0.750000 +vt 0.000050 0.937413 +vt 0.031250 0.750000 +vt 0.000050 0.999900 +vt 0.499975 1.000044 +vt 0.000000 0.750000 +vt 0.374975 0.937413 +vt 0.125000 0.937500 +vt 0.374975 0.749950 +vt 0.374975 0.812438 +vt 0.374975 0.874925 +vt 0.406219 0.937413 +vt 0.093750 0.937500 +vt 0.406219 0.749950 +vt 0.406219 0.812438 +vt 0.406219 0.874925 +vt 0.437463 0.937413 +vt 0.062500 0.937500 +vt 0.437463 0.749950 +vt 0.437463 0.812438 +vt 0.437463 0.874925 +vt 0.468706 0.937413 +vt 0.031250 0.937500 +vt 0.468706 0.749950 +vt 0.468706 0.812438 +vt 0.468706 0.874925 +vt 0.000050 0.999900 +vt 0.000025 0.812526 +vt 0.000000 0.500000 +vt 0.499950 0.999900 +vt 0.499975 0.812525 +vt 0.125000 0.500000 +vt 0.000050 0.937413 +vt 0.031250 0.500000 +vt 0.000050 0.874925 +vt 0.062500 0.500000 +vt 0.000050 0.812438 +vt 0.093750 0.500000 +vt 0.000000 0.750000 +vt 0.125000 0.500000 +vt 0.500000 0.750000 +vt 0.000000 0.500000 +vt 0.499950 0.812438 +vt 0.031250 0.500000 +vt 0.499950 0.874925 +vt 0.062500 0.500000 +vt 0.499950 0.937413 +vt 0.093750 0.500000 +vt 0.468706 0.999900 +vt 0.468728 0.812525 +vt 0.437463 0.999900 +vt 0.437481 0.812525 +vt 0.062500 0.921875 +vt 0.406219 0.999900 +vt 0.093750 0.921875 +vt 0.374975 0.999900 +vt 0.125000 0.921875 +vt 0.343731 0.999900 +vt 0.156250 0.921875 +vt 0.312488 0.999900 +vt 0.187500 0.921875 +vt 0.281244 0.999900 +vt 0.218750 0.921875 +vt 0.250000 0.999900 +vt 0.250000 0.921875 +vt 0.218756 0.999900 +vt 0.281250 0.921875 +vt 0.187513 0.999900 +vt 0.312500 0.921875 +vt 0.156269 0.999900 +vt 0.343750 0.921875 +vt 0.125025 0.999900 +vt 0.375000 0.921875 +vt 0.093781 0.999900 +vt 0.406250 0.921875 +vt 0.062537 0.999900 +vt 0.437500 0.921875 +vt 0.062519 0.812526 +vt 0.031294 0.999900 +vt 0.031272 0.812526 +vt 0.031250 0.750000 +vt 0.031294 0.812438 +vt 0.031294 0.874925 +vt 0.031294 0.937413 +vt 0.062500 0.750000 +vt 0.062538 0.812438 +vt 0.062537 0.874925 +vt 0.062537 0.937413 +vt 0.093750 0.750000 +vt 0.093781 0.812438 +vt 0.093781 0.874925 +vt 0.093781 0.937413 +vt 0.125000 0.750000 +vt 0.125025 0.812438 +vt 0.125025 0.874925 +vt 0.125025 0.937413 +vt 0.156250 0.750000 +vt 0.156269 0.812438 +vt 0.156269 0.874925 +vt 0.156269 0.937413 +vt 0.187500 0.750000 +vt 0.187513 0.812438 +vt 0.187513 0.874925 +vt 0.187513 0.937413 +vt 0.218750 0.750000 +vt 0.218756 0.812438 +vt 0.218756 0.874925 +vt 0.218756 0.937413 +vt 0.250000 0.750000 +vt 0.250000 0.812438 +vt 0.250000 0.874925 +vt 0.250000 0.937413 +vt 0.281250 0.750000 +vt 0.281244 0.812438 +vt 0.281244 0.874925 +vt 0.281244 0.937413 +vt 0.312500 0.750000 +vt 0.312488 0.812438 +vt 0.312488 0.874925 +vt 0.312488 0.937413 +vt 0.343750 0.750000 +vt 0.343731 0.812438 +vt 0.343731 0.874925 +vt 0.343731 0.937413 +vt 0.375000 0.750000 +vt 0.374975 0.812438 +vt 0.374975 0.874925 +vt 0.374975 0.937413 +vt 0.406250 0.750000 +vt 0.406219 0.812438 +vt 0.406219 0.874925 +vt 0.406219 0.937413 +vt 0.437500 0.750000 +vt 0.437463 0.812438 +vt 0.437463 0.874925 +vt 0.437463 0.937413 +vt 0.468750 0.750000 +vt 0.468706 0.812438 +vt 0.468706 0.874925 +vt 0.468706 0.937413 +vt 0.093750 0.562500 +vt 0.499975 0.875031 +vt 0.499975 0.750031 +vt 0.125000 0.562500 +vt 0.031272 0.875032 +vt 0.031272 0.750032 +vt 0.000025 0.875032 +vt 0.000025 0.750032 +vt 0.000000 0.562500 +vt 0.031250 0.562500 +vt 0.062500 0.562500 +vt 0.093750 0.562500 +vt 0.000000 0.812500 +vt 0.125000 0.562500 +vt 0.500000 0.812500 +vt 0.000000 0.562500 +vt 0.031250 0.562500 +vt 0.062500 0.562500 +vt 0.468728 0.875031 +vt 0.468728 0.750031 +vt 0.437481 0.875031 +vt 0.437481 0.750031 +vt 0.062500 0.937500 +vt 0.406234 0.875031 +vt 0.093750 0.937500 +vt 0.374988 0.875031 +vt 0.125000 0.937500 +vt 0.156250 0.937500 +vt 0.187500 0.937500 +vt 0.218750 0.937500 +vt 0.250000 0.937500 +vt 0.281250 0.937500 +vt 0.312500 0.937500 +vt 0.343750 0.937500 +vt 0.375000 0.937500 +vt 0.093766 0.875032 +vt 0.406250 0.937500 +vt 0.062519 0.875032 +vt 0.437500 0.937500 +vt 0.062519 0.750032 +vt 0.031250 0.812500 +vt 0.156250 0.937500 +vt 0.062500 0.812500 +vt 0.125000 0.937500 +vt 0.093750 0.812500 +vt 0.125000 0.812500 +vt 0.093750 0.937500 +vt 0.156250 0.812500 +vt 0.062500 0.937500 +vt 0.187500 0.812500 +vt 0.031250 0.937500 +vt 0.218750 0.812500 +vt 0.062519 0.875044 +vt 0.062519 1.000044 +vt 0.093766 0.875044 +vt 0.093766 1.000044 +vt 0.250000 0.812500 +vt 0.125012 0.875044 +vt 0.125012 1.000044 +vt 0.156259 0.875044 +vt 0.343750 0.968750 +vt 0.156259 1.000044 +vt 0.312500 0.968750 +vt 0.187506 1.000044 +vt 0.281250 0.812500 +vt 0.281250 0.968750 +vt 0.218753 1.000044 +vt 0.250000 0.968750 +vt 0.250000 0.875044 +vt 0.250000 1.000044 +vt 0.281247 0.875044 +vt 0.281247 1.000044 +vt 0.312500 0.812500 +vt 0.312494 0.875044 +vt 0.187500 0.968750 +vt 0.312494 1.000044 +vt 0.156250 0.968750 +vt 0.343741 1.000044 +vt 0.125000 0.968750 +vt 0.374987 0.875044 +vt 0.374987 1.000044 +vt 0.343750 0.812500 +vt 0.406234 0.875044 +vt 0.406234 1.000044 +vt 0.437481 0.875044 +vt 0.437481 1.000044 +vt 0.468728 0.875044 +vt 0.468728 1.000044 +vt 0.375000 0.812500 +vt 0.062500 0.687500 +vt 0.031250 0.687500 +vt 0.000000 0.687500 +vt 0.500000 0.937500 +vt 0.406250 0.812500 +vt 0.125000 0.687500 +vt 0.000000 0.937500 +vt 0.093750 0.687500 +vt 0.062500 0.687500 +vt 0.437500 0.812500 +vt 0.031250 0.687500 +vt 0.000025 0.875045 +vt 0.000025 1.000044 +vt 0.000000 0.687500 +vt 0.031272 0.875045 +vt 0.031272 1.000044 +vt 0.468750 0.812500 +vt 0.499975 0.875044 +vt 0.499975 1.000044 +vt 0.125000 0.687500 +vt 0.093750 0.687500 +vt 0.093750 0.625000 +vt 0.499975 0.812537 +vt 0.125000 0.625000 +vt 0.499975 0.937537 +vt 0.031272 0.812538 +vt 0.031272 0.937538 +vt 0.000025 0.812538 +vt 0.000000 0.625000 +vt 0.000025 0.937538 +vt 0.031250 0.625000 +vt 0.062500 0.625000 +vt 0.093750 0.625000 +vt 0.125000 0.625000 +vt 0.000000 0.875000 +vt 0.000000 0.625000 +vt 0.500000 0.875000 +vt 0.031250 0.625000 +vt 0.062500 0.625000 +vt 0.468728 0.812537 +vt 0.468728 0.937537 +vt 0.437481 0.812538 +vt 0.437481 0.937538 +vt 0.406234 0.812538 +vt 0.406234 0.937538 +vt 0.374988 0.812538 +vt 0.125000 0.953125 +vt 0.374988 0.937538 +vt 0.156250 0.953125 +vt 0.312494 0.937538 +vt 0.187500 0.953125 +vt 0.218750 0.953125 +vt 0.281247 0.937538 +vt 0.250000 0.953125 +vt 0.250000 0.937538 +vt 0.281250 0.953125 +vt 0.312500 0.953125 +vt 0.156259 0.937538 +vt 0.343750 0.953125 +vt 0.375000 0.953125 +vt 0.125013 0.937538 +vt 0.093766 0.812538 +vt 0.406250 0.953125 +vt 0.093766 0.937538 +vt 0.062519 0.812538 +vt 0.062519 0.937538 +vt 0.093781 0.999900 +vt 0.093766 0.937550 +vt 0.031250 0.875000 +vt 0.093750 1.000000 +vt 0.093781 0.749950 +vt 0.093781 0.812438 +vt 0.093781 0.937413 +vt 0.062500 0.875000 +vt 0.093781 0.874925 +vt 0.125025 0.999900 +vt 0.125012 0.937550 +vt 0.125000 1.000000 +vt 0.125025 0.749950 +vt 0.093750 0.875000 +vt 0.125025 0.812438 +vt 0.125025 0.937413 +vt 0.125025 0.874925 +vt 0.125000 0.875000 +vt 0.156269 0.999900 +vt 0.156259 0.937550 +vt 0.156250 1.000000 +vt 0.156269 0.749950 +vt 0.156269 0.812438 +vt 0.156250 0.875000 +vt 0.156269 0.937413 +vt 0.156269 0.874925 +vt 0.187513 0.999900 +vt 0.187506 0.937550 +vt 0.187500 0.875000 +vt 0.187500 1.000000 +vt 0.187513 0.749950 +vt 0.187513 0.812438 +vt 0.187513 0.937413 +vt 0.218750 0.875000 +vt 0.187513 0.874925 +vt 0.218756 0.999900 +vt 0.218753 0.937550 +vt 0.218750 1.000000 +vt 0.218756 0.749950 +vt 0.250000 0.875000 +vt 0.218756 0.812438 +vt 0.218756 0.937413 +vt 0.218756 0.874925 +vt 0.281250 0.875000 +vt 0.250000 0.999900 +vt 0.250000 0.937550 +vt 0.250000 1.000000 +vt 0.250000 0.749950 +vt 0.250000 0.812438 +vt 0.312500 0.875000 +vt 0.250000 0.937413 +vt 0.250000 0.874925 +vt 0.281244 0.999900 +vt 0.281247 0.937550 +vt 0.343750 0.875000 +vt 0.281250 1.000000 +vt 0.281244 0.749950 +vt 0.281244 0.812438 +vt 0.281244 0.937413 +vt 0.375000 0.875000 +vt 0.281244 0.874925 +vt 0.312488 0.999900 +vt 0.312494 0.937550 +vt 0.312500 1.000000 +vt 0.312488 0.749950 +vt 0.406250 0.875000 +vt 0.312488 0.812438 +vt 0.312488 0.937413 +vt 0.312488 0.874925 +vt 0.437500 0.875000 +vt 0.343731 0.999900 +vt 0.343741 0.937550 +vt 0.343750 1.000000 +vt 0.343731 0.749950 +vt 0.343731 0.812438 +vt 0.468750 0.875000 +vt 0.343731 0.937413 +vt 0.343731 0.874925 +vt 0.187500 0.937500 +vt 0.218750 0.937500 +vt 0.250000 0.937500 +vt 0.281250 0.937500 +vt 0.312500 0.937500 +vt 0.343750 0.937500 +vt 0.375000 0.937500 +vt 0.406250 0.937500 +vt 0.437500 0.937500 +vt 0.468750 0.937500 +vt 0.062537 0.874925 +vt 0.062537 0.937413 +vt 0.062538 0.812438 +vt 0.062538 0.749950 +vt 0.062500 1.000000 +vt 0.062537 0.999900 +vt 0.062519 0.937551 +vt 0.031294 0.874925 +vt 0.031294 0.937413 +vt 0.031294 0.812438 +vt 0.031294 0.749950 +vt 0.031250 1.000000 +vt 0.031294 0.999900 +vt 0.031272 0.937551 +vt 0.374975 0.999900 +vt 0.374987 0.937550 +vt 0.406219 0.999900 +vt 0.406234 0.937550 +vt 0.437463 0.999900 +vt 0.437481 0.937550 +vt 0.468706 0.999900 +vt 0.468728 0.937550 +vt 0.499950 0.999900 +vt 0.499975 0.937550 +vt 0.125000 0.750000 +vt 0.062500 0.750000 +vt 0.499950 0.874925 +vt 0.093750 0.750000 +vt 0.499950 0.937413 +vt 0.031250 0.750000 +vt 0.499950 0.812438 +vt 0.000000 0.750000 +vt 0.500000 1.000000 +vt 0.499950 0.749950 +vt 0.000050 0.812438 +vt 0.093750 0.750000 +vt 0.000050 0.749950 +vt 0.125000 0.750000 +vt 0.000000 1.000000 +vt 0.000050 0.874925 +vt 0.062500 0.750000 +vt 0.000050 0.937413 +vt 0.031250 0.750000 +vt 0.000050 0.999900 +vt 0.000025 0.937551 +vt 0.000000 0.750000 +vt 0.374975 0.937413 +vt 0.375000 1.000000 +vt 0.374975 0.749950 +vt 0.374975 0.812438 +vt 0.374975 0.874925 +vt 0.406219 0.937413 +vt 0.406250 1.000000 +vt 0.406219 0.749950 +vt 0.406219 0.812438 +vt 0.406219 0.874925 +vt 0.437463 0.937413 +vt 0.437500 1.000000 +vt 0.437463 0.749950 +vt 0.437463 0.812438 +vt 0.437463 0.874925 +vt 0.468706 0.937413 +vt 0.468750 1.000000 +vt 0.468706 0.749950 +vt 0.468706 0.812438 +vt 0.468706 0.874925 +vt 0.000050 0.812400 +vt 0.000025 0.812526 +vt 0.000000 0.500000 +vt 0.500000 0.890625 +vt 0.499975 0.812525 +vt 0.125000 0.500000 +vt 0.000050 0.749913 +vt 0.000050 0.874913 +vt 0.031250 0.500000 +vt 0.000050 0.937425 +vt 0.000050 0.812425 +vt 0.062500 0.500000 +vt 0.000050 0.999938 +vt 0.000050 0.874938 +vt 0.093750 0.500000 +vt 0.000050 0.937450 +vt 0.000000 0.750000 +vt 0.125000 0.500000 +vt 0.500000 0.984375 +vt 0.500000 0.750000 +vt 0.000000 0.500000 +vt 0.500000 1.000000 +vt 0.499950 0.874938 +vt 0.031250 0.500000 +vt 0.499950 0.937425 +vt 0.499950 0.812425 +vt 0.062500 0.500000 +vt 0.499950 0.874913 +vt 0.093750 0.500000 +vt 0.468750 0.890625 +vt 0.468728 0.812525 +vt 0.437500 0.890625 +vt 0.437481 0.812525 +vt 0.406250 0.890625 +vt 0.406234 0.812525 +vt 0.406250 0.953125 +vt 0.375000 0.890625 +vt 0.375000 0.953125 +vt 0.343750 0.890625 +vt 0.343750 0.953125 +vt 0.312500 0.890625 +vt 0.312500 0.953125 +vt 0.281250 0.890625 +vt 0.281250 0.953125 +vt 0.250000 0.890625 +vt 0.250000 0.953125 +vt 0.218750 0.890625 +vt 0.218750 0.953125 +vt 0.187500 0.890625 +vt 0.187500 0.953125 +vt 0.156250 0.890625 +vt 0.156250 0.953125 +vt 0.125000 0.890625 +vt 0.125000 0.953125 +vt 0.125013 0.812526 +vt 0.093750 0.890625 +vt 0.093766 0.812526 +vt 0.062500 0.890625 +vt 0.062519 0.812526 +vt 0.031294 0.812400 +vt 0.031250 0.890625 +vt 0.031272 0.812526 +vt 0.031294 0.937450 +vt 0.031250 0.750000 +vt 0.031294 0.874938 +vt 0.031294 0.999938 +vt 0.031250 0.906250 +vt 0.031294 0.937425 +vt 0.031294 0.812425 +vt 0.031250 0.921875 +vt 0.031250 0.890625 +vt 0.031294 0.749913 +vt 0.031294 0.874913 +vt 0.031250 0.906250 +vt 0.062538 0.937450 +vt 0.062500 0.921875 +vt 0.062500 0.750000 +vt 0.062538 0.999938 +vt 0.062500 0.937500 +vt 0.062500 0.906250 +vt 0.062500 0.921875 +vt 0.062500 0.890625 +vt 0.062500 0.875000 +vt 0.062500 0.906250 +vt 0.093750 0.921875 +vt 0.093750 0.750000 +vt 0.093750 0.937500 +vt 0.093750 0.906250 +vt 0.093750 0.921875 +vt 0.093750 0.890625 +vt 0.093750 0.875000 +vt 0.093750 0.906250 +vt 0.125000 0.921875 +vt 0.125000 0.750000 +vt 0.125000 0.937500 +vt 0.125000 0.937500 +vt 0.125000 0.906250 +vt 0.125000 0.921875 +vt 0.125000 0.890625 +vt 0.125000 0.875000 +vt 0.125000 0.906250 +vt 0.156250 0.921875 +vt 0.156250 0.937500 +vt 0.156250 0.937500 +vt 0.156250 0.906250 +vt 0.156250 0.921875 +vt 0.156250 0.890625 +vt 0.156250 0.875000 +vt 0.156250 0.906250 +vt 0.187500 0.921875 +vt 0.187500 0.937500 +vt 0.187500 0.937500 +vt 0.187500 0.906250 +vt 0.187500 0.921875 +vt 0.187500 0.890625 +vt 0.187500 0.875000 +vt 0.187500 0.906250 +vt 0.218750 0.921875 +vt 0.218750 0.937500 +vt 0.218750 0.937500 +vt 0.218750 0.906250 +vt 0.218750 0.921875 +vt 0.218750 0.890625 +vt 0.218750 0.875000 +vt 0.218750 0.906250 +vt 0.250000 0.921875 +vt 0.250000 0.937500 +vt 0.250000 0.937500 +vt 0.250000 0.906250 +vt 0.250000 0.921875 +vt 0.250000 0.890625 +vt 0.250000 0.875000 +vt 0.250000 0.906250 +vt 0.281250 0.921875 +vt 0.281250 0.937500 +vt 0.281250 0.937500 +vt 0.281250 0.906250 +vt 0.281250 0.921875 +vt 0.281250 0.890625 +vt 0.281250 0.875000 +vt 0.281250 0.906250 +vt 0.312500 0.921875 +vt 0.312500 0.937500 +vt 0.312500 0.937500 +vt 0.312500 0.906250 +vt 0.312500 0.921875 +vt 0.312500 0.890625 +vt 0.312500 0.875000 +vt 0.312500 0.906250 +vt 0.343750 0.921875 +vt 0.343750 0.937500 +vt 0.343750 0.937500 +vt 0.343750 0.906250 +vt 0.343750 0.921875 +vt 0.343750 0.890625 +vt 0.343750 0.875000 +vt 0.343750 0.906250 +vt 0.375000 0.921875 +vt 0.375000 0.937500 +vt 0.375000 0.937500 +vt 0.375000 0.906250 +vt 0.375000 0.921875 +vt 0.375000 0.890625 +vt 0.375000 0.875000 +vt 0.375000 0.906250 +vt 0.406250 0.921875 +vt 0.406250 0.937500 +vt 0.406250 0.750000 +vt 0.406250 0.937500 +vt 0.406250 0.906250 +vt 0.406250 0.921875 +vt 0.406250 0.890625 +vt 0.406250 0.875000 +vt 0.406250 0.906250 +vt 0.437500 0.921875 +vt 0.437463 0.937450 +vt 0.437500 0.750000 +vt 0.437500 0.937500 +vt 0.437463 0.999938 +vt 0.437500 0.906250 +vt 0.437500 0.921875 +vt 0.437500 0.890625 +vt 0.437500 0.875000 +vt 0.437500 0.906250 +vt 0.468706 0.937450 +vt 0.468750 0.984375 +vt 0.468750 0.750000 +vt 0.468750 0.906250 +vt 0.468750 1.000000 +vt 0.468706 0.874938 +vt 0.468750 0.921875 +vt 0.468750 0.890625 +vt 0.468706 0.937425 +vt 0.468706 0.812425 +vt 0.468750 0.906250 +vt 0.468706 0.874913 +vt 0.093750 0.562500 +vt 0.499975 0.875031 +vt 0.499975 0.750031 +vt 0.125000 0.562500 +vt 0.031272 0.875032 +vt 0.031272 0.750032 +vt 0.000025 0.875032 +vt 0.000025 0.750032 +vt 0.000000 0.562500 +vt 0.031250 0.562500 +vt 0.062500 0.562500 +vt 0.093750 0.562500 +vt 0.000000 0.812500 +vt 0.125000 0.562500 +vt 0.500000 0.812500 +vt 0.000000 0.562500 +vt 0.031250 0.562500 +vt 0.062500 0.562500 +vt 0.468728 0.875031 +vt 0.468728 0.750031 +vt 0.437481 0.875031 +vt 0.437481 0.750031 +vt 0.406234 0.875031 +vt 0.406234 0.750031 +vt 0.406250 0.937500 +vt 0.374988 0.875031 +vt 0.375000 0.937500 +vt 0.343750 0.968750 +vt 0.343741 0.875031 +vt 0.343750 0.937500 +vt 0.312500 0.968750 +vt 0.312500 0.937500 +vt 0.281250 0.968750 +vt 0.281250 0.937500 +vt 0.250000 0.875032 +vt 0.250000 0.968750 +vt 0.250000 0.937500 +vt 0.218753 0.875032 +vt 0.218750 0.937500 +vt 0.187500 0.968750 +vt 0.187506 0.875032 +vt 0.187500 0.937500 +vt 0.156250 0.968750 +vt 0.156250 0.937500 +vt 0.125000 0.968750 +vt 0.125013 0.875032 +vt 0.125000 0.937500 +vt 0.125013 0.750032 +vt 0.093766 0.875032 +vt 0.093766 0.750032 +vt 0.062519 0.875032 +vt 0.062519 0.750032 +vt 0.031250 0.812500 +vt 0.156250 0.937500 +vt 0.062500 0.812500 +vt 0.125000 0.937500 +vt 0.093750 0.812500 +vt 0.125000 0.812500 +vt 0.125000 0.953125 +vt 0.093750 0.937500 +vt 0.156250 0.953125 +vt 0.062500 0.937500 +vt 0.187500 0.812500 +vt 0.187500 0.953125 +vt 0.031250 0.937500 +vt 0.218750 0.812500 +vt 0.218750 0.953125 +vt 0.062519 0.875044 +vt 0.062519 1.000044 +vt 0.093766 0.875044 +vt 0.093766 1.000044 +vt 0.250000 0.812500 +vt 0.250000 0.953125 +vt 0.125012 0.875044 +vt 0.125012 1.000044 +vt 0.156259 0.875044 +vt 0.156259 1.000044 +vt 0.187506 0.875044 +vt 0.187506 1.000044 +vt 0.281250 0.953125 +vt 0.218753 0.875044 +vt 0.218753 1.000044 +vt 0.250000 0.875044 +vt 0.250000 1.000044 +vt 0.281247 0.875044 +vt 0.281247 1.000044 +vt 0.312500 0.953125 +vt 0.312494 0.875044 +vt 0.312494 1.000044 +vt 0.343741 0.875044 +vt 0.343741 1.000044 +vt 0.374987 0.875044 +vt 0.374987 1.000044 +vt 0.343750 0.812500 +vt 0.343750 0.953125 +vt 0.406234 0.875044 +vt 0.406234 1.000044 +vt 0.437481 0.875044 +vt 0.437481 1.000044 +vt 0.468728 0.875044 +vt 0.468728 1.000044 +vt 0.375000 0.812500 +vt 0.375000 0.953125 +vt 0.062500 0.687500 +vt 0.031250 0.687500 +vt 0.000000 0.687500 +vt 0.500000 0.937500 +vt 0.406250 0.953125 +vt 0.406250 0.812500 +vt 0.125000 0.687500 +vt 0.000000 0.937500 +vt 0.093750 0.687500 +vt 0.062500 0.687500 +vt 0.437500 0.812500 +vt 0.031250 0.687500 +vt 0.000025 0.875044 +vt 0.000025 1.000044 +vt 0.000000 0.687500 +vt 0.031272 0.875044 +vt 0.031272 1.000044 +vt 0.468750 0.812500 +vt 0.499975 0.875044 +vt 0.499975 1.000044 +vt 0.125000 0.687500 +vt 0.093750 0.687500 +vt 0.093750 0.625000 +vt 0.499975 0.812538 +vt 0.125000 0.625000 +vt 0.499975 0.937538 +vt 0.031272 0.812538 +vt 0.031272 0.937538 +vt 0.000025 0.812538 +vt 0.000000 0.625000 +vt 0.000025 0.937538 +vt 0.031250 0.625000 +vt 0.062500 0.625000 +vt 0.093750 0.625000 +vt 0.125000 0.625000 +vt 0.000000 0.875000 +vt 0.000000 0.625000 +vt 0.500000 0.875000 +vt 0.031250 0.625000 +vt 0.062500 0.625000 +vt 0.468728 0.812538 +vt 0.468728 0.937538 +vt 0.437481 0.812538 +vt 0.437481 0.937538 +vt 0.406234 0.812538 +vt 0.406234 0.937538 +vt 0.374988 0.812538 +vt 0.374988 0.937538 +vt 0.343750 0.953125 +vt 0.343741 0.812538 +vt 0.343741 0.937538 +vt 0.312500 0.953125 +vt 0.312494 0.937538 +vt 0.281250 0.953125 +vt 0.281247 0.937538 +vt 0.250000 0.812538 +vt 0.250000 0.953125 +vt 0.250000 0.937538 +vt 0.218753 0.812538 +vt 0.218753 0.937538 +vt 0.187500 0.953125 +vt 0.187506 0.812538 +vt 0.187506 0.937538 +vt 0.156250 0.953125 +vt 0.156259 0.937538 +vt 0.125000 0.953125 +vt 0.125013 0.812538 +vt 0.125013 0.937538 +vt 0.093766 0.812538 +vt 0.093766 0.937538 +vt 0.062519 0.812538 +vt 0.062519 0.937538 +vt 0.093781 0.999900 +vt 0.093766 0.937550 +vt 0.031250 0.875000 +vt 0.093750 1.000000 +vt 0.093781 0.749950 +vt 0.093781 0.812438 +vt 0.093781 0.937413 +vt 0.062500 0.875000 +vt 0.093781 0.874925 +vt 0.125025 0.999900 +vt 0.125012 0.937550 +vt 0.125000 1.000000 +vt 0.125025 0.749950 +vt 0.093750 0.875000 +vt 0.125025 0.812438 +vt 0.125025 0.937413 +vt 0.125025 0.874925 +vt 0.125000 0.968750 +vt 0.125000 0.875000 +vt 0.156269 0.999900 +vt 0.156259 0.937550 +vt 0.156250 1.000000 +vt 0.156269 0.749950 +vt 0.156269 0.812438 +vt 0.156250 0.968750 +vt 0.156250 0.875000 +vt 0.156269 0.937413 +vt 0.156269 0.874925 +vt 0.187513 0.999900 +vt 0.187506 0.937550 +vt 0.187500 0.968750 +vt 0.187500 0.875000 +vt 0.187500 1.000000 +vt 0.187513 0.749950 +vt 0.187513 0.812438 +vt 0.187513 0.937413 +vt 0.218750 0.875000 +vt 0.187513 0.874925 +vt 0.218756 0.999900 +vt 0.218753 0.937550 +vt 0.218750 1.000000 +vt 0.218756 0.749950 +vt 0.250000 0.968750 +vt 0.250000 0.875000 +vt 0.218756 0.812438 +vt 0.218756 0.937413 +vt 0.218756 0.874925 +vt 0.281250 0.968750 +vt 0.281250 0.875000 +vt 0.250000 0.999900 +vt 0.250000 0.937550 +vt 0.250000 1.000000 +vt 0.250000 0.749950 +vt 0.250000 0.812438 +vt 0.312500 0.968750 +vt 0.312500 0.875000 +vt 0.250000 0.937413 +vt 0.250000 0.874925 +vt 0.281244 0.999900 +vt 0.281247 0.937550 +vt 0.343750 0.968750 +vt 0.343750 0.875000 +vt 0.281250 1.000000 +vt 0.281244 0.749950 +vt 0.281244 0.812438 +vt 0.281244 0.937413 +vt 0.375000 0.875000 +vt 0.281244 0.874925 +vt 0.312488 0.999900 +vt 0.312494 0.937550 +vt 0.312500 1.000000 +vt 0.312488 0.749950 +vt 0.406250 0.875000 +vt 0.312488 0.812438 +vt 0.312488 0.937413 +vt 0.312488 0.874925 +vt 0.437500 0.875000 +vt 0.343731 0.999900 +vt 0.343741 0.937550 +vt 0.343750 1.000000 +vt 0.343731 0.749950 +vt 0.343731 0.812438 +vt 0.468750 0.875000 +vt 0.343731 0.937413 +vt 0.343731 0.874925 +vt 0.187500 0.937500 +vt 0.218750 0.937500 +vt 0.250000 0.937500 +vt 0.281250 0.937500 +vt 0.312500 0.937500 +vt 0.343750 0.937500 +vt 0.375000 0.937500 +vt 0.406250 0.937500 +vt 0.437500 0.937500 +vt 0.468750 0.937500 +vt 0.062537 0.874925 +vt 0.062537 0.937413 +vt 0.062538 0.812438 +vt 0.062538 0.749950 +vt 0.062500 1.000000 +vt 0.062537 0.999900 +vt 0.062519 0.937551 +vt 0.031294 0.874925 +vt 0.031294 0.937413 +vt 0.031294 0.812438 +vt 0.031294 0.749950 +vt 0.031250 1.000000 +vt 0.031294 0.999900 +vt 0.031272 0.937551 +vt 0.374975 0.999900 +vt 0.374987 0.937550 +vt 0.406219 0.999900 +vt 0.406234 0.937550 +vt 0.437463 0.999900 +vt 0.437481 0.937550 +vt 0.468706 0.999900 +vt 0.468728 0.937550 +vt 0.499950 0.999900 +vt 0.499975 0.937550 +vt 0.125000 0.750000 +vt 0.062500 0.750000 +vt 0.499950 0.874925 +vt 0.093750 0.750000 +vt 0.499950 0.937413 +vt 0.031250 0.750000 +vt 0.499950 0.812438 +vt 0.000000 0.750000 +vt 0.500000 1.000000 +vt 0.499950 0.749950 +vt 0.000050 0.812438 +vt 0.093750 0.750000 +vt 0.000050 0.749950 +vt 0.125000 0.750000 +vt 0.000000 1.000000 +vt 0.000050 0.874925 +vt 0.062500 0.750000 +vt 0.000050 0.937413 +vt 0.031250 0.750000 +vt 0.000050 0.999900 +vt 0.000025 0.937551 +vt 0.000000 0.750000 +vt 0.374975 0.937413 +vt 0.375000 1.000000 +vt 0.374975 0.749950 +vt 0.374975 0.812438 +vt 0.374975 0.874925 +vt 0.406219 0.937413 +vt 0.406250 1.000000 +vt 0.406219 0.749950 +vt 0.406219 0.812438 +vt 0.406219 0.874925 +vt 0.437463 0.937413 +vt 0.437500 1.000000 +vt 0.437463 0.749950 +vt 0.437463 0.812438 +vt 0.437463 0.874925 +vt 0.468706 0.937413 +vt 0.468750 1.000000 +vt 0.468706 0.749950 +vt 0.468706 0.812438 +vt 0.468706 0.874925 +s 0 +usemtl campfire_log +f 85/131/1 11/25/1 2/4/1 10/23/1 +f 3/7/1 1/1/1 25/53/1 29/59/1 +f 29/59/1 25/53/1 24/51/1 33/65/1 +f 33/65/1 24/51/1 23/49/1 37/70/1 +f 37/70/1 23/49/1 22/47/1 41/75/1 +f 41/75/1 22/47/1 21/45/1 45/80/1 +f 45/80/1 21/45/1 20/43/1 49/85/1 +f 49/85/1 20/43/1 19/41/1 53/90/1 +f 53/90/1 19/41/1 18/39/1 57/95/1 +f 57/95/1 18/39/1 17/37/1 61/100/1 +f 61/100/1 17/37/1 16/35/1 65/105/1 +f 65/105/1 16/35/1 15/33/1 69/110/1 +f 69/110/1 15/33/1 14/31/1 73/115/1 +f 73/115/1 14/31/1 13/29/1 77/120/1 +f 77/120/1 13/29/1 12/27/1 81/126/1 +f 81/126/1 12/27/1 11/25/1 85/131/1 +f 6/13/1 5/11/1 27/57/1 26/55/1 +f 5/11/1 4/9/1 28/58/1 27/57/1 +f 4/9/1 3/7/1 29/59/1 28/58/1 +f 26/55/1 27/57/1 31/63/1 30/60/1 +f 27/57/1 28/58/1 32/64/1 31/63/1 +f 28/58/1 29/59/1 33/65/1 32/64/1 +f 30/60/1 31/63/1 35/68/1 34/66/1 +f 31/63/1 32/64/1 36/69/1 35/68/1 +f 32/64/1 33/65/1 37/70/1 36/69/1 +f 34/66/1 35/68/1 39/73/1 38/71/1 +f 35/68/1 36/69/1 40/74/1 39/73/1 +f 36/69/1 37/70/1 41/75/1 40/74/1 +f 38/71/1 39/73/1 43/78/1 42/76/1 +f 39/73/1 40/74/1 44/79/1 43/78/1 +f 40/74/1 41/75/1 45/80/1 44/79/1 +f 42/76/1 43/78/1 47/83/1 46/81/1 +f 43/78/1 44/79/1 48/84/1 47/83/1 +f 44/79/1 45/80/1 49/85/1 48/84/1 +f 46/81/1 47/83/1 51/88/1 50/86/1 +f 47/83/1 48/84/1 52/89/1 51/88/1 +f 48/84/1 49/85/1 53/90/1 52/89/1 +f 50/86/1 51/88/1 55/93/1 54/91/1 +f 51/88/1 52/89/1 56/94/1 55/93/1 +f 52/89/1 53/90/1 57/95/1 56/94/1 +f 54/91/1 55/93/1 59/98/1 58/96/1 +f 55/93/1 56/94/1 60/99/1 59/98/1 +f 56/94/1 57/95/1 61/100/1 60/99/1 +f 58/96/1 59/98/1 63/103/1 62/101/1 +f 59/98/1 60/99/1 64/104/1 63/103/1 +f 60/99/1 61/100/1 65/105/1 64/104/1 +f 62/101/1 63/103/1 67/108/1 66/106/1 +f 63/103/1 64/104/1 68/109/1 67/108/1 +f 64/104/1 65/105/1 69/110/1 68/109/1 +f 66/106/1 67/108/1 71/113/1 70/111/1 +f 67/108/1 68/109/1 72/114/1 71/113/1 +f 68/109/1 69/110/1 73/115/1 72/114/1 +f 70/111/1 71/113/1 75/118/1 74/116/1 +f 71/113/1 72/114/1 76/119/1 75/118/1 +f 72/114/1 73/115/1 77/120/1 76/119/1 +f 74/116/1 75/118/1 79/124/1 78/121/1 +f 75/118/1 76/119/1 80/125/1 79/124/1 +f 76/119/1 77/120/1 81/126/1 80/125/1 +f 78/121/1 79/124/1 83/129/1 82/127/1 +f 79/124/1 80/125/1 84/130/1 83/129/1 +f 80/125/1 81/126/1 85/131/1 84/130/1 +f 82/127/1 83/129/1 8/19/1 7/16/1 +f 83/129/1 84/130/1 9/21/1 8/19/1 +f 84/130/1 85/131/1 10/23/1 9/21/1 +f 95/148/2 96/149/2 166/274/2 165/273/2 +f 107/170/3 108/172/3 178/297/3 177/295/3 +f 116/189/4 118/192/4 198/327/4 194/320/4 +f 94/147/2 95/148/2 165/273/2 164/271/2 +f 149/245/4 153/252/4 238/385/4 234/379/4 +f 106/168/3 107/170/3 177/295/3 176/293/3 +f 92/143/5 93/145/5 163/269/5 162/268/5 +f 122/198/4 125/203/4 210/346/4 206/338/4 +f 105/166/3 106/168/3 176/293/3 175/291/3 +f 91/142/5 92/143/5 162/268/5 161/267/5 +f 104/164/3 105/166/3 175/291/3 174/289/3 +f 93/144/4 111/178/4 182/305/4 163/270/4 +f 133/217/4 137/224/4 222/361/4 218/356/4 +f 90/141/5 91/142/5 161/267/5 160/266/5 +f 103/162/3 104/164/3 174/289/3 173/287/3 +f 115/186/4 116/188/4 194/321/4 190/316/4 +f 89/140/5 90/141/5 160/266/5 159/264/5 +f 145/237/4 149/245/4 234/379/4 230/375/4 +f 102/160/3 103/162/3 173/287/3 172/285/3 +f 88/136/3 89/138/3 159/263/3 158/261/3 +f 120/195/4 122/198/4 206/338/4 202/333/4 +f 101/158/3 102/160/3 172/285/3 171/283/3 +f 86/132/2 87/135/2 157/259/2 156/257/2 +f 100/156/3 101/158/3 171/283/3 170/281/3 +f 129/210/4 133/217/4 218/356/4 214/350/4 +f 99/154/3 100/156/3 170/281/3 169/279/3 +f 113/182/4 115/186/4 190/316/4 186/310/4 +f 141/231/4 145/238/4 230/374/4 226/367/4 +f 98/152/3 99/154/3 169/279/3 168/277/3 +f 118/192/4 120/195/4 202/333/4 198/327/4 +f 97/150/3 98/152/3 168/277/3 167/275/3 +f 153/252/4 94/146/4 164/272/4 238/385/4 +f 110/176/3 88/136/3 158/261/3 180/301/3 +f 87/133/3 97/150/3 167/275/3 157/258/3 +f 125/203/4 129/210/4 214/350/4 210/346/4 +f 109/174/3 110/176/3 180/301/3 179/299/3 +f 96/149/2 86/132/2 156/257/2 166/274/2 +f 108/172/3 109/174/3 179/299/3 178/297/3 +f 111/178/4 113/182/4 186/310/4 182/305/4 +f 137/224/4 141/231/4 226/367/4 222/361/4 +f 9/22/2 10/24/2 86/132/2 96/149/2 +f 23/50/3 24/52/3 110/177/3 109/175/3 +f 54/92/4 58/97/4 129/210/4 125/203/4 +f 2/5/3 11/26/3 97/151/3 87/134/3 +f 24/52/3 25/54/3 88/137/3 110/177/3 +f 82/128/4 7/17/4 94/146/4 153/252/4 +f 11/26/3 12/28/3 98/153/3 97/151/3 +f 42/77/4 46/82/4 120/195/4 118/192/4 +f 12/28/3 13/30/3 99/155/3 98/153/3 +f 70/112/4 74/117/4 145/238/4 141/231/4 +f 30/61/4 34/67/4 115/187/4 113/181/4 +f 13/30/3 14/32/3 100/157/3 99/155/3 +f 58/97/4 62/102/4 133/217/4 129/210/4 +f 14/32/3 15/34/3 101/159/3 100/157/3 +f 10/24/2 2/6/2 87/135/2 86/132/2 +f 15/34/3 16/36/3 102/161/3 101/159/3 +f 46/82/4 50/87/4 122/198/4 120/195/4 +f 25/54/3 1/2/3 89/139/3 88/137/3 +f 16/36/3 17/38/3 103/163/3 102/161/3 +f 74/117/4 78/122/4 149/244/4 145/238/4 +f 1/3/5 3/8/5 90/141/5 89/140/5 +f 34/67/4 38/72/4 116/189/4 115/187/4 +f 17/38/3 18/40/3 104/165/3 103/163/3 +f 3/8/5 4/10/5 91/142/5 90/141/5 +f 62/102/4 66/107/4 137/224/4 133/217/4 +f 6/14/4 26/56/4 111/178/4 93/144/4 +f 18/40/3 19/42/3 105/167/3 104/165/3 +f 4/10/5 5/12/5 92/143/5 91/142/5 +f 19/42/3 20/44/3 106/169/3 105/167/3 +f 50/87/4 54/92/4 125/203/4 122/198/4 +f 5/12/5 6/15/5 93/145/5 92/143/5 +f 20/44/3 21/46/3 107/171/3 106/169/3 +f 78/123/4 82/128/4 153/252/4 149/245/4 +f 7/18/2 8/20/2 95/148/2 94/147/2 +f 38/72/4 42/77/4 118/192/4 116/189/4 +f 21/46/3 22/48/3 108/173/3 107/171/3 +f 8/20/2 9/22/2 96/149/2 95/148/2 +f 66/107/4 70/112/4 141/231/4 137/224/4 +f 26/56/4 30/62/4 113/182/4 111/178/4 +f 22/48/3 23/50/3 109/175/3 108/173/3 +f 287/472/6 267/439/6 265/433/6 264/431/6 +f 273/452/6 257/419/6 260/423/6 274/454/6 +f 257/419/6 252/412/6 255/416/6 260/423/6 +f 252/412/6 185/309/6 181/303/6 255/416/6 +f 185/309/6 192/318/6 188/312/6 181/303/6 +f 192/318/6 199/328/6 195/322/6 188/312/6 +f 199/328/6 205/337/6 201/330/6 195/322/6 +f 205/337/6 212/348/6 208/341/6 201/330/6 +f 212/348/6 219/357/6 215/351/6 208/341/6 +f 219/357/6 225/366/6 221/359/6 215/351/6 +f 225/366/6 232/377/6 228/370/6 221/359/6 +f 232/377/6 239/386/6 235/380/6 228/370/6 +f 239/386/6 275/457/6 261/425/6 235/380/6 +f 275/457/6 279/462/6 262/427/6 261/425/6 +f 279/462/6 283/467/6 263/429/6 262/427/6 +f 283/467/6 287/472/6 264/431/6 263/429/6 +f 271/447/6 259/421/6 258/420/6 270/445/6 +f 270/445/6 258/420/6 256/418/6 272/450/6 +f 272/450/6 256/418/6 257/419/6 273/452/6 +f 259/421/6 254/414/6 253/413/6 258/420/6 +f 258/420/6 253/413/6 251/411/6 256/418/6 +f 256/418/6 251/411/6 252/412/6 257/419/6 +f 254/414/6 183/307/6 184/308/6 253/413/6 +f 253/413/6 184/308/6 187/311/6 251/411/6 +f 177/296/3 178/298/3 126/204/3 127/206/3 +f 194/320/4 198/327/4 112/179/4 114/183/4 +f 164/271/2 165/273/2 143/233/2 144/235/2 +f 234/379/4 238/385/4 250/409/4 249/407/4 +f 176/294/3 177/296/3 127/206/3 128/208/3 +f 162/268/5 163/269/5 146/240/5 147/242/5 +f 206/339/4 210/345/4 243/393/4 242/391/4 +f 175/292/3 176/294/3 128/208/3 130/211/3 +f 161/267/5 162/268/5 147/242/5 148/243/5 +f 174/290/3 175/292/3 130/211/3 131/213/3 +f 163/270/4 182/305/4 121/196/4 146/239/4 +f 218/356/4 222/361/4 246/400/4 245/398/4 +f 160/266/5 161/267/5 148/243/5 150/246/5 +f 173/288/3 174/290/3 131/213/3 132/215/3 +f 190/316/4 194/321/4 114/184/4 117/190/4 +f 159/264/5 160/266/5 150/246/5 151/249/5 +f 230/375/4 234/379/4 249/407/4 248/405/4 +f 172/286/3 173/288/3 132/215/3 134/218/3 +f 158/262/3 159/265/3 151/247/3 152/250/3 +f 202/332/4 206/339/4 242/391/4 241/388/4 +f 171/284/3 172/286/3 134/218/3 135/220/3 +f 156/257/2 157/259/2 154/255/2 155/256/2 +f 170/282/3 171/284/3 135/220/3 136/222/3 +f 214/350/4 218/356/4 245/398/4 244/396/4 +f 169/280/3 170/282/3 136/222/3 138/225/3 +f 186/310/4 190/316/4 117/190/4 119/193/4 +f 226/368/4 230/375/4 248/405/4 247/403/4 +f 168/278/3 169/280/3 138/225/3 139/227/3 +f 198/327/4 202/333/4 241/389/4 112/179/4 +f 167/276/3 168/278/3 139/227/3 140/229/3 +f 238/385/4 164/272/4 144/234/4 250/409/4 +f 180/302/3 158/262/3 152/250/3 123/199/3 +f 157/260/3 167/276/3 140/229/3 154/253/3 +f 210/346/4 214/350/4 244/396/4 243/394/4 +f 179/300/3 180/302/3 123/199/3 124/201/3 +f 166/274/2 156/257/2 155/256/2 142/232/2 +f 182/305/4 186/310/4 119/193/4 121/196/4 +f 178/298/3 179/300/3 124/201/3 126/204/3 +f 222/362/4 226/368/4 247/403/4 246/401/4 +f 165/273/2 166/274/2 142/232/2 143/233/2 +f 131/214/3 130/212/3 208/342/3 215/352/3 +f 147/242/5 146/240/5 271/448/5 270/446/5 +f 114/185/4 112/180/4 196/324/4 189/314/4 +f 130/212/3 128/209/3 201/331/3 208/342/3 +f 249/408/4 250/410/4 288/473/4 284/468/4 +f 144/235/2 143/233/2 268/440/2 269/442/2 +f 128/209/3 127/207/3 195/323/3 201/331/3 +f 242/392/4 243/395/4 216/353/4 209/343/4 +f 143/233/2 142/232/2 266/436/2 268/440/2 +f 127/207/3 126/205/3 188/313/3 195/323/3 +f 146/241/4 121/197/4 259/422/4 271/449/4 +f 245/399/4 246/402/4 236/382/4 229/372/4 +f 126/205/3 124/202/3 181/304/3 188/313/3 +f 142/232/2 155/256/2 267/438/2 266/436/2 +f 117/191/4 114/185/4 189/314/4 183/306/4 +f 124/202/3 123/200/3 255/417/3 181/304/3 +f 248/406/4 249/408/4 284/468/4 280/463/4 +f 154/254/3 140/230/3 264/432/3 265/434/3 +f 123/200/3 152/251/3 260/424/3 255/417/3 +f 241/390/4 242/392/4 209/343/4 203/334/4 +f 140/230/3 139/228/3 263/430/3 264/432/3 +f 155/256/2 154/255/2 265/435/2 267/438/2 +f 139/228/3 138/226/3 262/428/3 263/430/3 +f 244/397/4 245/399/4 229/372/4 223/363/4 +f 152/251/3 151/248/3 274/455/3 260/424/3 +f 138/226/3 136/223/3 261/426/3 262/428/3 +f 119/194/4 117/191/4 183/306/4 254/415/4 +f 247/404/4 248/406/4 280/463/4 276/458/4 +f 136/223/3 135/221/3 235/381/3 261/426/3 +f 151/249/5 150/246/5 273/453/5 274/456/5 +f 112/180/4 241/390/4 203/334/4 196/324/4 +f 135/221/3 134/219/3 228/371/3 235/381/3 +f 250/410/4 144/236/4 269/443/4 288/473/4 +f 150/246/5 148/243/5 272/451/5 273/453/5 +f 134/219/3 132/216/3 221/360/3 228/371/3 +f 243/395/4 244/397/4 223/363/4 216/353/4 +f 148/243/5 147/242/5 270/446/5 272/451/5 +f 132/216/3 131/214/3 215/352/3 221/360/3 +f 121/197/4 119/194/4 254/415/4 259/422/4 +f 246/402/4 247/404/4 276/458/4 236/382/4 +f 251/411/6 187/311/6 185/309/6 252/412/6 +f 183/307/6 189/315/6 191/317/6 184/308/6 +f 184/308/6 191/317/6 193/319/6 187/311/6 +f 187/311/6 193/319/6 192/318/6 185/309/6 +f 189/315/6 196/325/6 197/326/6 191/317/6 +f 191/317/6 197/326/6 200/329/6 193/319/6 +f 193/319/6 200/329/6 199/328/6 192/318/6 +f 196/325/6 203/335/6 204/336/6 197/326/6 +f 197/326/6 204/336/6 207/340/6 200/329/6 +f 200/329/6 207/340/6 205/337/6 199/328/6 +f 203/335/6 209/344/6 211/347/6 204/336/6 +f 204/336/6 211/347/6 213/349/6 207/340/6 +f 207/340/6 213/349/6 212/348/6 205/337/6 +f 209/344/6 216/354/6 217/355/6 211/347/6 +f 211/347/6 217/355/6 220/358/6 213/349/6 +f 213/349/6 220/358/6 219/357/6 212/348/6 +f 216/354/6 223/364/6 224/365/6 217/355/6 +f 217/355/6 224/365/6 227/369/6 220/358/6 +f 220/358/6 227/369/6 225/366/6 219/357/6 +f 223/364/6 229/373/6 231/376/6 224/365/6 +f 224/365/6 231/376/6 233/378/6 227/369/6 +f 227/369/6 233/378/6 232/377/6 225/366/6 +f 229/373/6 236/383/6 237/384/6 231/376/6 +f 231/376/6 237/384/6 240/387/6 233/378/6 +f 233/378/6 240/387/6 239/386/6 232/377/6 +f 236/383/6 276/459/6 277/460/6 237/384/6 +f 237/384/6 277/460/6 278/461/6 240/387/6 +f 240/387/6 278/461/6 275/457/6 239/386/6 +f 276/459/6 280/464/6 281/465/6 277/460/6 +f 277/460/6 281/465/6 282/466/6 278/461/6 +f 278/461/6 282/466/6 279/462/6 275/457/6 +f 280/464/6 284/469/6 285/470/6 281/465/6 +f 281/465/6 285/470/6 286/471/6 282/466/6 +f 282/466/6 286/471/6 283/467/6 279/462/6 +f 284/469/6 288/474/6 289/475/6 285/470/6 +f 285/470/6 289/475/6 290/476/6 286/471/6 +f 286/471/6 290/476/6 287/472/6 283/467/6 +f 288/474/6 269/444/6 268/441/6 289/475/6 +f 289/475/6 268/441/6 266/437/6 290/476/6 +f 290/476/6 266/437/6 267/439/6 287/472/6 +f 527/849/6 485/771/6 484/768/6 528/850/6 +f 304/497/1 303/496/1 333/546/1 332/544/1 +f 303/496/1 302/495/1 334/547/1 333/546/1 +f 302/495/1 301/494/1 335/548/1 334/547/1 +f 301/494/1 300/493/1 336/549/1 335/548/1 +f 300/493/1 299/492/1 337/550/1 336/549/1 +f 299/492/1 298/491/1 338/551/1 337/550/1 +f 526/847/6 486/773/6 485/771/6 527/849/6 +f 525/845/6 487/775/6 486/773/6 526/847/6 +f 524/843/6 495/786/6 487/775/6 525/845/6 +f 523/842/6 496/788/6 495/786/6 524/843/6 +f 522/839/6 497/790/6 496/788/6 523/842/6 +f 520/835/6 527/849/6 528/850/6 521/837/6 +f 332/544/1 333/546/1 345/561/1 344/559/1 +f 333/546/1 334/547/1 346/562/1 345/561/1 +f 334/547/1 335/548/1 347/563/1 346/562/1 +f 335/548/1 336/549/1 348/564/1 347/563/1 +f 336/549/1 337/550/1 349/565/1 348/564/1 +f 337/550/1 338/551/1 350/566/1 349/565/1 +f 519/833/6 526/847/6 527/849/6 520/835/6 +f 518/831/6 525/846/6 526/848/6 519/834/6 +f 517/830/6 524/844/6 525/846/6 518/831/6 +f 516/828/6 523/841/6 524/844/6 517/830/6 +f 515/824/6 522/839/6 523/842/6 516/827/6 +f 513/819/6 520/835/6 521/837/6 514/821/6 +f 344/559/1 345/561/1 357/576/1 356/574/1 +f 345/561/1 346/562/1 358/577/1 357/576/1 +f 346/562/1 347/563/1 359/578/1 358/577/1 +f 347/563/1 348/564/1 360/579/1 359/578/1 +f 348/564/1 349/565/1 361/580/1 360/579/1 +f 349/565/1 350/566/1 362/581/1 361/580/1 +f 512/818/6 519/834/6 520/836/6 513/820/6 +f 291/477/6 518/831/6 519/834/6 512/818/6 +f 292/479/6 517/829/6 518/832/6 291/478/6 +f 293/481/6 516/828/6 517/830/6 292/480/6 +f 294/482/6 515/825/6 516/828/6 293/481/6 +f 296/486/6 513/820/6 514/822/6 295/484/6 +f 356/574/1 357/576/1 369/594/1 368/592/1 +f 357/576/1 358/577/1 370/595/1 369/594/1 +f 358/577/1 359/578/1 371/596/1 370/595/1 +f 359/578/1 360/579/1 372/597/1 371/596/1 +f 360/579/1 361/580/1 373/598/1 372/597/1 +f 361/580/1 362/581/1 374/599/1 373/598/1 +f 297/489/6 512/818/6 513/820/6 296/486/6 +f 305/500/6 291/477/6 512/818/6 297/489/6 +f 306/501/6 292/479/6 291/478/6 305/499/6 +f 307/503/6 293/481/6 292/480/6 306/502/6 +f 308/505/6 294/482/6 293/481/6 307/503/6 +f 310/510/6 296/486/6 295/484/6 309/508/6 +f 368/592/1 369/594/1 381/612/1 380/610/1 +f 369/594/1 370/595/1 382/613/1 381/612/1 +f 370/595/1 371/596/1 383/614/1 382/613/1 +f 371/596/1 372/597/1 384/615/1 383/614/1 +f 372/597/1 373/598/1 385/616/1 384/615/1 +f 373/598/1 374/599/1 386/617/1 385/616/1 +f 311/512/6 297/488/6 296/487/6 310/511/6 +f 312/514/6 305/500/6 297/489/6 311/513/6 +f 313/515/6 306/502/6 305/500/6 312/514/6 +f 314/517/6 307/503/6 306/502/6 313/515/6 +f 315/518/6 308/506/6 307/504/6 314/516/6 +f 317/524/6 310/510/6 309/508/6 316/521/6 +f 380/610/1 381/612/1 393/629/1 392/627/1 +f 381/612/1 382/613/1 394/630/1 393/629/1 +f 382/613/1 383/614/1 395/631/1 394/630/1 +f 383/614/1 384/615/1 396/632/1 395/631/1 +f 384/615/1 385/616/1 397/633/1 396/632/1 +f 385/616/1 386/617/1 398/634/1 397/633/1 +f 318/525/6 311/512/6 310/511/6 317/523/6 +f 319/527/6 312/514/6 311/513/6 318/526/6 +f 327/537/6 313/515/6 312/514/6 319/527/6 +f 328/538/6 314/517/6 313/515/6 327/537/6 +f 329/539/6 315/519/6 314/517/6 328/538/6 +f 331/543/6 317/524/6 316/521/6 330/541/6 +f 392/627/1 393/629/1 405/649/1 404/647/1 +f 393/629/1 394/630/1 406/650/1 405/649/1 +f 394/630/1 395/631/1 407/651/1 406/650/1 +f 395/631/1 396/632/1 408/652/1 407/651/1 +f 396/632/1 397/633/1 409/653/1 408/652/1 +f 397/633/1 398/634/1 410/654/1 409/653/1 +f 339/553/6 318/526/6 317/524/6 331/543/6 +f 340/554/6 319/527/6 318/526/6 339/553/6 +f 341/555/6 327/537/6 319/527/6 340/554/6 +f 342/556/6 328/538/6 327/537/6 341/555/6 +f 343/557/6 329/539/6 328/538/6 342/556/6 +f 352/570/6 331/543/6 330/541/6 351/568/6 +f 404/647/1 405/649/1 417/668/1 416/666/1 +f 405/649/1 406/650/1 418/669/1 417/668/1 +f 406/650/1 407/651/1 419/670/1 418/669/1 +f 407/651/1 408/652/1 420/671/1 419/670/1 +f 408/652/1 409/653/1 421/672/1 420/671/1 +f 409/653/1 410/654/1 422/673/1 421/672/1 +f 353/571/6 339/553/6 331/543/6 352/570/6 +f 354/572/6 340/554/6 339/553/6 353/571/6 +f 355/573/6 341/555/6 340/554/6 354/572/6 +f 363/583/6 342/556/6 341/555/6 355/573/6 +f 364/584/6 343/557/6 342/556/6 363/583/6 +f 366/590/6 352/570/6 351/568/6 365/586/6 +f 416/666/1 417/668/1 429/687/1 428/685/1 +f 417/668/1 418/669/1 430/688/1 429/687/1 +f 418/669/1 419/670/1 431/689/1 430/688/1 +f 419/670/1 420/671/1 432/690/1 431/689/1 +f 420/671/1 421/672/1 433/691/1 432/690/1 +f 421/672/1 422/673/1 434/692/1 433/691/1 +f 367/591/6 353/571/6 352/570/6 366/590/6 +f 375/601/6 354/572/6 353/571/6 367/591/6 +f 376/602/6 355/573/6 354/572/6 375/601/6 +f 377/605/6 363/583/6 355/573/6 376/602/6 +f 378/606/6 364/584/6 363/583/6 377/605/6 +f 387/619/6 366/589/6 365/587/6 379/608/6 +f 428/685/1 429/687/1 441/706/1 440/704/1 +f 429/687/1 430/688/1 442/707/1 441/706/1 +f 430/688/1 431/689/1 443/708/1 442/707/1 +f 431/689/1 432/690/1 444/709/1 443/708/1 +f 432/690/1 433/691/1 445/710/1 444/709/1 +f 433/691/1 434/692/1 446/711/1 445/710/1 +f 388/621/6 367/591/6 366/590/6 387/620/6 +f 389/622/6 375/601/6 367/591/6 388/621/6 +f 390/623/6 376/602/6 375/601/6 389/622/6 +f 391/625/6 377/604/6 376/603/6 390/624/6 +f 399/636/6 378/606/6 377/605/6 391/626/6 +f 401/641/6 387/619/6 379/608/6 400/638/6 +f 440/704/1 441/706/1 453/726/1 452/724/1 +f 441/706/1 442/707/1 454/727/1 453/726/1 +f 442/707/1 443/708/1 455/728/1 454/727/1 +f 443/708/1 444/709/1 456/729/1 455/728/1 +f 444/709/1 445/710/1 457/730/1 456/729/1 +f 445/710/1 446/711/1 458/731/1 457/730/1 +f 402/643/6 388/621/6 387/620/6 401/642/6 +f 403/646/6 389/622/6 388/621/6 402/643/6 +f 411/657/6 390/623/6 389/622/6 403/646/6 +f 412/659/6 391/625/6 390/624/6 411/656/6 +f 413/660/6 399/636/6 391/626/6 412/658/6 +f 415/665/6 401/642/6 400/639/6 414/663/6 +f 452/724/1 453/726/1 465/745/1 464/743/1 +f 453/726/1 454/727/1 466/746/1 465/745/1 +f 454/727/1 455/728/1 467/747/1 466/746/1 +f 455/728/1 456/729/1 468/748/1 467/747/1 +f 456/729/1 457/730/1 469/749/1 468/748/1 +f 457/730/1 458/731/1 470/750/1 469/749/1 +f 423/675/6 402/643/6 401/642/6 415/665/6 +f 424/677/6 403/645/6 402/644/6 423/676/6 +f 425/679/6 411/657/6 403/646/6 424/678/6 +f 426/681/6 412/658/6 411/657/6 425/679/6 +f 427/682/6 413/661/6 412/659/6 426/680/6 +f 436/698/6 415/665/6 414/663/6 435/694/6 +f 464/743/1 465/745/1 477/759/1 476/757/1 +f 465/745/1 466/746/1 478/760/1 477/759/1 +f 466/746/1 467/747/1 479/761/1 478/760/1 +f 467/747/1 468/748/1 480/762/1 479/761/1 +f 468/748/1 469/749/1 481/763/1 480/762/1 +f 469/749/1 470/750/1 482/764/1 481/763/1 +f 437/700/6 423/675/6 415/665/6 436/698/6 +f 438/701/6 424/677/6 423/676/6 437/699/6 +f 439/703/6 425/679/6 424/678/6 438/702/6 +f 447/713/6 426/681/6 425/679/6 439/703/6 +f 448/715/6 427/683/6 426/681/6 447/713/6 +f 450/721/6 436/697/6 435/695/6 449/718/6 +f 476/757/1 477/759/1 489/779/1 488/777/1 +f 477/759/1 478/760/1 490/780/1 489/779/1 +f 478/760/1 479/761/1 491/781/1 490/780/1 +f 479/761/1 480/762/1 492/782/1 491/781/1 +f 480/762/1 481/763/1 493/783/1 492/782/1 +f 481/763/1 482/764/1 494/784/1 493/783/1 +f 451/722/6 437/700/6 436/698/6 450/720/6 +f 459/733/6 438/702/6 437/700/6 451/722/6 +f 460/735/6 439/703/6 438/702/6 459/733/6 +f 461/737/6 447/713/6 439/703/6 460/735/6 +f 462/739/6 448/716/6 447/714/6 461/738/6 +f 471/752/6 450/721/6 449/718/6 463/741/6 +f 488/777/1 489/779/1 501/800/1 500/798/1 +f 489/779/1 490/780/1 502/801/1 501/800/1 +f 490/780/1 491/781/1 503/802/1 502/801/1 +f 491/781/1 492/782/1 504/803/1 503/802/1 +f 492/782/1 493/783/1 505/804/1 504/803/1 +f 493/783/1 494/784/1 506/805/1 505/804/1 +f 472/753/6 451/723/6 450/721/6 471/752/6 +f 473/754/6 459/734/6 451/723/6 472/753/6 +f 474/755/6 460/736/6 459/734/6 473/754/6 +f 475/756/6 461/738/6 460/736/6 474/755/6 +f 483/766/6 462/739/6 461/738/6 475/756/6 +f 510/813/6 471/752/6 463/741/6 511/815/6 +f 500/798/1 501/800/1 321/530/1 320/529/1 +f 501/800/1 502/801/1 322/531/1 321/530/1 +f 502/801/1 503/802/1 323/532/1 322/531/1 +f 503/802/1 504/803/1 324/533/1 323/532/1 +f 504/803/1 505/804/1 325/534/1 324/533/1 +f 505/804/1 506/805/1 326/536/1 325/534/1 +f 509/811/6 472/753/6 471/752/6 510/813/6 +f 508/809/6 473/754/6 472/753/6 509/811/6 +f 507/807/6 474/755/6 473/754/6 508/809/6 +f 499/796/6 475/756/6 474/755/6 507/807/6 +f 498/793/6 483/766/6 475/756/6 499/796/6 +f 299/492/2 300/493/2 509/812/2 510/814/2 +f 482/765/4 470/751/4 295/485/4 514/823/4 +f 362/582/4 350/567/4 449/719/4 435/696/4 +f 300/493/2 301/494/2 508/810/2 509/812/2 +f 404/648/3 416/667/3 364/585/3 378/607/3 +f 470/751/4 458/732/4 309/509/4 295/485/4 +f 301/494/2 302/495/2 507/808/2 508/810/2 +f 350/567/4 338/552/4 463/742/4 449/719/4 +f 392/628/3 404/648/3 378/607/3 399/637/3 +f 458/732/4 446/712/4 316/522/4 309/509/4 +f 302/495/2 303/496/2 499/797/2 507/808/2 +f 500/799/3 320/528/3 497/791/3 522/840/3 +f 338/552/4 298/490/4 511/816/4 463/742/4 +f 380/611/3 392/628/3 399/637/3 413/662/3 +f 303/496/2 304/497/2 498/794/2 499/797/2 +f 446/712/4 434/693/4 330/542/4 316/522/4 +f 488/778/3 500/799/3 522/840/3 515/826/3 +f 368/593/3 380/611/3 413/662/3 427/684/3 +f 434/693/4 422/674/4 351/569/4 330/542/4 +f 476/758/3 488/778/3 515/826/3 294/483/3 +f 356/575/3 368/593/3 427/684/3 448/717/3 +f 422/674/4 410/655/4 365/588/4 351/569/4 +f 464/744/3 476/758/3 294/483/3 308/507/3 +f 320/529/5 321/530/5 496/789/5 497/792/5 +f 344/560/3 356/575/3 448/717/3 462/740/3 +f 321/530/5 322/531/5 495/787/5 496/789/5 +f 410/655/4 398/635/4 379/609/4 365/588/4 +f 452/725/3 464/744/3 308/507/3 315/520/3 +f 326/535/4 506/806/4 528/851/4 484/769/4 +f 322/531/5 323/532/5 487/776/5 495/787/5 +f 332/545/3 344/560/3 462/740/3 483/767/3 +f 398/635/4 386/618/4 400/640/4 379/609/4 +f 440/705/3 452/725/3 315/520/3 329/540/3 +f 323/532/5 324/533/5 486/774/5 487/776/5 +f 506/806/4 494/785/4 521/838/4 528/851/4 +f 304/498/3 332/545/3 483/767/3 498/795/3 +f 386/618/4 374/600/4 414/664/4 400/640/4 +f 324/533/5 325/534/5 485/772/5 486/774/5 +f 428/686/3 440/705/3 329/540/3 343/558/3 +f 494/785/4 482/765/4 514/823/4 521/838/4 +f 298/491/2 299/492/2 510/814/2 511/817/2 +f 325/534/5 326/536/5 484/770/5 485/772/5 +f 374/600/4 362/582/4 435/696/4 414/664/4 +f 416/667/3 428/686/3 343/558/3 364/585/3 +f 613/1046/1 539/881/1 530/855/1 538/879/1 +f 531/858/1 529/852/1 553/911/1 557/923/1 +f 557/924/1 553/912/1 552/909/1 561/934/1 +f 561/934/1 552/909/1 551/906/1 565/943/1 +f 565/943/1 551/906/1 550/904/1 569/951/1 +f 569/951/1 550/904/1 549/902/1 573/959/1 +f 573/959/1 549/902/1 548/900/1 577/967/1 +f 577/967/1 548/900/1 547/898/1 581/975/1 +f 581/975/1 547/898/1 546/896/1 585/983/1 +f 585/983/1 546/896/1 545/894/1 589/991/1 +f 589/991/1 545/894/1 544/892/1 593/999/1 +f 593/999/1 544/892/1 543/890/1 597/1007/1 +f 597/1007/1 543/890/1 542/887/1 601/1016/1 +f 601/1016/1 542/887/1 541/885/1 605/1024/1 +f 605/1024/1 541/885/1 540/883/1 609/1034/1 +f 609/1034/1 540/883/1 539/881/1 613/1046/1 +f 534/867/1 533/864/1 555/917/1 554/914/1 +f 533/865/1 532/861/1 556/919/1 555/916/1 +f 532/862/1 531/859/1 557/924/1 556/920/1 +f 554/914/1 555/917/1 559/929/1 558/926/1 +f 555/918/1 556/921/1 560/932/1 559/931/1 +f 556/922/1 557/925/1 561/935/1 560/933/1 +f 558/927/1 559/930/1 563/939/1 562/936/1 +f 559/931/1 560/932/1 564/941/1 563/940/1 +f 560/933/1 561/935/1 565/944/1 564/942/1 +f 562/936/1 563/939/1 567/947/1 566/945/1 +f 563/940/1 564/941/1 568/949/1 567/948/1 +f 564/942/1 565/944/1 569/952/1 568/950/1 +f 566/945/1 567/947/1 571/955/1 570/953/1 +f 567/948/1 568/949/1 572/957/1 571/956/1 +f 568/950/1 569/952/1 573/960/1 572/958/1 +f 570/953/1 571/955/1 575/963/1 574/961/1 +f 571/956/1 572/957/1 576/965/1 575/964/1 +f 572/958/1 573/960/1 577/968/1 576/966/1 +f 574/961/1 575/963/1 579/971/1 578/969/1 +f 575/964/1 576/965/1 580/973/1 579/972/1 +f 576/966/1 577/968/1 581/976/1 580/974/1 +f 578/969/1 579/971/1 583/979/1 582/977/1 +f 579/972/1 580/973/1 584/981/1 583/980/1 +f 580/974/1 581/976/1 585/984/1 584/982/1 +f 582/977/1 583/979/1 587/987/1 586/985/1 +f 583/980/1 584/981/1 588/989/1 587/988/1 +f 584/982/1 585/984/1 589/992/1 588/990/1 +f 586/985/1 587/987/1 591/995/1 590/993/1 +f 587/988/1 588/989/1 592/997/1 591/996/1 +f 588/990/1 589/992/1 593/1000/1 592/998/1 +f 590/993/1 591/995/1 595/1003/1 594/1001/1 +f 591/996/1 592/997/1 596/1005/1 595/1004/1 +f 592/998/1 593/1000/1 597/1008/1 596/1006/1 +f 594/1001/1 595/1003/1 599/1012/1 598/1009/1 +f 595/1004/1 596/1005/1 600/1014/1 599/1013/1 +f 596/1006/1 597/1008/1 601/1017/1 600/1015/1 +f 598/1009/1 599/1012/1 603/1020/1 602/1018/1 +f 599/1013/1 600/1014/1 604/1022/1 603/1021/1 +f 600/1015/1 601/1017/1 605/1025/1 604/1023/1 +f 602/1018/1 603/1020/1 607/1029/1 606/1026/1 +f 603/1021/1 604/1022/1 608/1032/1 607/1031/1 +f 604/1023/1 605/1025/1 609/1035/1 608/1033/1 +f 606/1027/1 607/1030/1 611/1039/1 610/1036/1 +f 607/1031/1 608/1032/1 612/1041/1 611/1038/1 +f 608/1033/1 609/1035/1 613/1045/1 612/1042/1 +f 610/1036/1 611/1039/1 536/873/1 535/870/1 +f 611/1040/1 612/1043/1 537/876/1 536/874/1 +f 612/1044/1 613/1046/1 538/879/1 537/877/1 +f 623/1062/3 624/1063/3 694/1179/3 693/1178/3 +f 635/1079/5 636/1081/5 706/1197/5 705/1196/5 +f 644/1097/2 646/1101/2 726/1227/2 722/1220/2 +f 622/1061/3 623/1062/3 693/1178/3 692/1176/3 +f 677/1152/2 681/1158/2 766/1293/2 762/1286/2 +f 634/1077/5 635/1079/5 705/1196/5 704/1195/5 +f 620/1055/4 621/1058/4 691/1173/4 690/1171/4 +f 650/1110/2 653/1114/2 738/1247/2 734/1240/2 +f 633/1076/5 634/1078/5 704/1194/5 703/1192/5 +f 619/1054/4 620/1055/4 690/1171/4 689/1170/4 +f 632/1075/5 633/1076/5 703/1192/5 702/1190/5 +f 621/1056/2 639/1086/2 710/1202/2 691/1172/2 +f 661/1125/2 665/1131/2 750/1267/2 746/1260/2 +f 618/1053/4 619/1054/4 689/1170/4 688/1169/4 +f 631/1072/5 632/1074/5 702/1191/5 701/1189/5 +f 643/1094/2 644/1097/2 722/1220/2 718/1215/2 +f 617/1052/4 618/1053/4 688/1169/4 687/1167/4 +f 673/1145/2 677/1152/2 762/1286/2 758/1281/2 +f 630/1070/5 631/1072/5 701/1189/5 700/1188/5 +f 616/1050/5 617/1051/5 687/1168/5 686/1166/5 +f 648/1106/2 650/1110/2 734/1240/2 730/1234/2 +f 629/1069/5 630/1071/5 700/1187/5 699/1185/5 +f 614/1047/3 615/1049/3 685/1164/3 684/1163/3 +f 628/1068/5 629/1069/5 699/1185/5 698/1183/5 +f 657/1120/2 661/1126/2 746/1261/2 742/1253/2 +f 627/1066/5 628/1067/5 698/1184/5 697/1182/5 +f 641/1090/2 643/1094/2 718/1215/2 714/1208/2 +f 669/1136/2 673/1145/2 758/1281/2 754/1273/2 +f 626/1065/5 627/1066/5 697/1182/5 696/1181/5 +f 646/1102/2 648/1106/2 730/1234/2 726/1228/2 +f 625/1064/5 626/1065/5 696/1181/5 695/1180/5 +f 681/1158/2 622/1059/2 692/1175/2 766/1293/2 +f 638/1085/5 616/1050/5 686/1166/5 708/1199/5 +f 615/1048/5 625/1064/5 695/1180/5 685/1165/5 +f 653/1115/2 657/1120/2 742/1253/2 738/1248/2 +f 637/1083/5 638/1085/5 708/1199/5 707/1198/5 +f 624/1063/3 614/1047/3 684/1163/3 694/1179/3 +f 636/1081/5 637/1083/5 707/1198/5 706/1197/5 +f 639/1086/2 641/1090/2 714/1208/2 710/1202/2 +f 665/1131/2 669/1137/2 754/1274/2 750/1267/2 +f 537/878/3 538/880/3 614/1047/3 624/1063/3 +f 551/907/5 552/910/5 638/1085/5 637/1083/5 +f 582/978/2 586/986/2 657/1121/2 653/1116/2 +f 530/856/5 539/882/5 625/1064/5 615/1048/5 +f 552/910/5 553/913/5 616/1050/5 638/1085/5 +f 610/1037/2 535/871/2 622/1060/2 681/1159/2 +f 539/882/5 540/884/5 626/1065/5 625/1064/5 +f 570/954/2 574/962/2 648/1107/2 646/1103/2 +f 540/884/5 541/886/5 627/1066/5 626/1065/5 +f 598/1010/2 602/1019/2 673/1146/2 669/1138/2 +f 558/928/2 562/937/2 643/1095/2 641/1091/2 +f 541/886/5 542/888/5 628/1067/5 627/1066/5 +f 586/986/2 590/994/2 661/1127/2 657/1121/2 +f 542/889/5 543/891/5 629/1069/5 628/1068/5 +f 538/880/3 530/857/3 615/1049/3 614/1047/3 +f 543/891/5 544/893/5 630/1071/5 629/1069/5 +f 574/962/2 578/970/2 650/1111/2 648/1107/2 +f 553/913/5 529/853/5 617/1051/5 616/1050/5 +f 544/893/5 545/895/5 631/1073/5 630/1071/5 +f 602/1019/2 606/1028/2 677/1153/2 673/1146/2 +f 529/854/4 531/860/4 618/1053/4 617/1052/4 +f 562/938/2 566/946/2 644/1098/2 643/1096/2 +f 545/895/5 546/897/5 632/1075/5 631/1073/5 +f 531/860/4 532/863/4 619/1054/4 618/1053/4 +f 590/994/2 594/1002/2 665/1132/2 661/1127/2 +f 534/868/2 554/915/2 639/1087/2 621/1057/2 +f 546/897/5 547/899/5 633/1076/5 632/1075/5 +f 532/863/4 533/866/4 620/1055/4 619/1054/4 +f 547/899/5 548/901/5 634/1078/5 633/1076/5 +f 578/970/2 582/978/2 653/1116/2 650/1111/2 +f 533/866/4 534/869/4 621/1058/4 620/1055/4 +f 548/901/5 549/903/5 635/1080/5 634/1078/5 +f 606/1028/2 610/1037/2 681/1159/2 677/1153/2 +f 535/872/3 536/875/3 623/1062/3 622/1061/3 +f 566/946/2 570/954/2 646/1103/2 644/1098/2 +f 549/903/5 550/905/5 636/1082/5 635/1080/5 +f 536/875/3 537/878/3 624/1063/3 623/1062/3 +f 594/1002/2 598/1011/2 669/1139/2 665/1132/2 +f 554/915/2 558/928/2 641/1091/2 639/1087/2 +f 550/905/5 551/908/5 637/1084/5 636/1082/5 +f 815/1378/6 795/1345/6 793/1339/6 792/1337/6 +f 801/1358/6 785/1325/6 788/1329/6 802/1360/6 +f 785/1325/6 780/1318/6 783/1322/6 788/1329/6 +f 780/1318/6 713/1207/6 709/1200/6 783/1322/6 +f 713/1207/6 720/1218/6 716/1211/6 709/1200/6 +f 720/1218/6 727/1230/6 723/1222/6 716/1211/6 +f 727/1230/6 733/1239/6 729/1232/6 723/1222/6 +f 733/1239/6 740/1251/6 736/1243/6 729/1232/6 +f 740/1251/6 747/1263/6 743/1255/6 736/1243/6 +f 747/1263/6 753/1272/6 749/1265/6 743/1255/6 +f 753/1272/6 760/1284/6 756/1277/6 749/1265/6 +f 760/1284/6 767/1295/6 763/1288/6 756/1277/6 +f 767/1295/6 803/1363/6 789/1331/6 763/1288/6 +f 803/1363/6 807/1368/6 790/1333/6 789/1331/6 +f 807/1368/6 811/1373/6 791/1335/6 790/1333/6 +f 811/1373/6 815/1378/6 792/1337/6 791/1335/6 +f 799/1353/6 787/1327/6 786/1326/6 798/1351/6 +f 798/1351/6 786/1326/6 784/1324/6 800/1356/6 +f 800/1356/6 784/1324/6 785/1325/6 801/1358/6 +f 787/1327/6 782/1320/6 781/1319/6 786/1326/6 +f 786/1326/6 781/1319/6 779/1317/6 784/1324/6 +f 784/1324/6 779/1317/6 780/1318/6 785/1325/6 +f 782/1320/6 711/1205/6 712/1206/6 781/1319/6 +f 781/1319/6 712/1206/6 715/1210/6 779/1317/6 +f 705/1196/5 706/1197/5 654/1117/5 655/1118/5 +f 722/1221/2 726/1229/2 640/1088/2 642/1092/2 +f 692/1176/3 693/1178/3 671/1141/3 672/1143/3 +f 762/1287/2 766/1294/2 778/1315/2 777/1313/2 +f 704/1195/5 705/1196/5 655/1118/5 656/1119/5 +f 690/1171/4 691/1173/4 674/1148/4 675/1150/4 +f 734/1241/2 738/1249/2 771/1301/2 770/1299/2 +f 703/1193/5 704/1195/5 656/1119/5 658/1122/5 +f 689/1170/4 690/1171/4 675/1150/4 676/1151/4 +f 702/1191/5 703/1193/5 658/1122/5 659/1123/5 +f 691/1174/2 710/1203/2 649/1108/2 674/1147/2 +f 746/1262/2 750/1268/2 774/1307/2 773/1305/2 +f 688/1169/4 689/1170/4 676/1151/4 678/1154/4 +f 701/1189/5 702/1191/5 659/1123/5 660/1124/5 +f 718/1216/2 722/1221/2 642/1092/2 645/1099/2 +f 687/1167/4 688/1169/4 678/1154/4 679/1156/4 +f 758/1282/2 762/1287/2 777/1313/2 776/1311/2 +f 700/1188/5 701/1189/5 660/1124/5 662/1128/5 +f 686/1166/5 687/1168/5 679/1155/5 680/1157/5 +f 730/1235/2 734/1241/2 770/1299/2 769/1297/2 +f 699/1186/5 700/1188/5 662/1128/5 663/1129/5 +f 684/1163/3 685/1164/3 682/1161/3 683/1162/3 +f 698/1184/5 699/1186/5 663/1129/5 664/1130/5 +f 742/1254/2 746/1262/2 773/1305/2 772/1303/2 +f 697/1182/5 698/1184/5 664/1130/5 666/1133/5 +f 714/1209/2 718/1216/2 645/1099/2 647/1104/2 +f 754/1275/2 758/1282/2 776/1311/2 775/1309/2 +f 696/1181/5 697/1182/5 666/1133/5 667/1134/5 +f 726/1229/2 730/1235/2 769/1297/2 640/1088/2 +f 695/1180/5 696/1181/5 667/1134/5 668/1135/5 +f 766/1294/2 692/1177/2 672/1142/2 778/1315/2 +f 708/1199/5 686/1166/5 680/1157/5 651/1112/5 +f 685/1165/5 695/1180/5 668/1135/5 682/1160/5 +f 738/1249/2 742/1254/2 772/1303/2 771/1301/2 +f 707/1198/5 708/1199/5 651/1112/5 652/1113/5 +f 694/1179/3 684/1163/3 683/1162/3 670/1140/3 +f 710/1203/2 714/1209/2 647/1104/2 649/1108/2 +f 706/1197/5 707/1198/5 652/1113/5 654/1117/5 +f 750/1268/2 754/1275/2 775/1309/2 774/1307/2 +f 693/1178/3 694/1179/3 670/1140/3 671/1141/3 +f 659/1123/5 658/1122/5 736/1244/5 743/1256/5 +f 675/1150/4 674/1148/4 799/1354/4 798/1352/4 +f 642/1093/2 640/1089/2 724/1224/2 717/1213/2 +f 658/1122/5 656/1119/5 729/1233/5 736/1244/5 +f 777/1314/2 778/1316/2 816/1379/2 812/1374/2 +f 672/1143/3 671/1141/3 796/1346/3 797/1348/3 +f 656/1119/5 655/1118/5 723/1223/5 729/1233/5 +f 770/1300/2 771/1302/2 744/1257/2 737/1245/2 +f 671/1141/3 670/1140/3 794/1342/3 796/1346/3 +f 655/1118/5 654/1117/5 716/1212/5 723/1223/5 +f 674/1149/2 649/1109/2 787/1328/2 799/1355/2 +f 773/1306/2 774/1308/2 764/1290/2 757/1279/2 +f 654/1117/5 652/1113/5 709/1201/5 716/1212/5 +f 670/1140/3 683/1162/3 795/1344/3 794/1342/3 +f 645/1100/2 642/1093/2 717/1213/2 711/1204/2 +f 652/1113/5 651/1112/5 783/1323/5 709/1201/5 +f 776/1312/2 777/1314/2 812/1374/2 808/1369/2 +f 682/1160/5 668/1135/5 792/1338/5 793/1340/5 +f 651/1112/5 680/1157/5 788/1330/5 783/1323/5 +f 769/1298/2 770/1300/2 737/1245/2 731/1236/2 +f 668/1135/5 667/1134/5 791/1336/5 792/1338/5 +f 683/1162/3 682/1161/3 793/1341/3 795/1344/3 +f 667/1134/5 666/1133/5 790/1334/5 791/1336/5 +f 772/1304/2 773/1306/2 757/1279/2 751/1269/2 +f 680/1157/5 679/1155/5 802/1361/5 788/1330/5 +f 666/1133/5 664/1130/5 789/1332/5 790/1334/5 +f 647/1105/2 645/1100/2 711/1204/2 782/1321/2 +f 775/1310/2 776/1312/2 808/1369/2 804/1364/2 +f 664/1130/5 663/1129/5 763/1289/5 789/1332/5 +f 679/1156/4 678/1154/4 801/1359/4 802/1362/4 +f 640/1089/2 769/1298/2 731/1236/2 724/1224/2 +f 663/1129/5 662/1128/5 756/1278/5 763/1289/5 +f 778/1316/2 672/1144/2 797/1349/2 816/1379/2 +f 678/1154/4 676/1151/4 800/1357/4 801/1359/4 +f 662/1128/5 660/1124/5 749/1266/5 756/1278/5 +f 771/1302/2 772/1304/2 751/1269/2 744/1257/2 +f 676/1151/4 675/1150/4 798/1352/4 800/1357/4 +f 660/1124/5 659/1123/5 743/1256/5 749/1266/5 +f 649/1109/2 647/1105/2 782/1321/2 787/1328/2 +f 774/1308/2 775/1310/2 804/1364/2 764/1290/2 +f 779/1317/6 715/1210/6 713/1207/6 780/1318/6 +f 711/1205/6 717/1214/6 719/1217/6 712/1206/6 +f 712/1206/6 719/1217/6 721/1219/6 715/1210/6 +f 715/1210/6 721/1219/6 720/1218/6 713/1207/6 +f 717/1214/6 724/1225/6 725/1226/6 719/1217/6 +f 719/1217/6 725/1226/6 728/1231/6 721/1219/6 +f 721/1219/6 728/1231/6 727/1230/6 720/1218/6 +f 724/1225/6 731/1237/6 732/1238/6 725/1226/6 +f 725/1226/6 732/1238/6 735/1242/6 728/1231/6 +f 728/1231/6 735/1242/6 733/1239/6 727/1230/6 +f 731/1237/6 737/1246/6 739/1250/6 732/1238/6 +f 732/1238/6 739/1250/6 741/1252/6 735/1242/6 +f 735/1242/6 741/1252/6 740/1251/6 733/1239/6 +f 737/1246/6 744/1258/6 745/1259/6 739/1250/6 +f 739/1250/6 745/1259/6 748/1264/6 741/1252/6 +f 741/1252/6 748/1264/6 747/1263/6 740/1251/6 +f 744/1258/6 751/1270/6 752/1271/6 745/1259/6 +f 745/1259/6 752/1271/6 755/1276/6 748/1264/6 +f 748/1264/6 755/1276/6 753/1272/6 747/1263/6 +f 751/1270/6 757/1280/6 759/1283/6 752/1271/6 +f 752/1271/6 759/1283/6 761/1285/6 755/1276/6 +f 755/1276/6 761/1285/6 760/1284/6 753/1272/6 +f 757/1280/6 764/1291/6 765/1292/6 759/1283/6 +f 759/1283/6 765/1292/6 768/1296/6 761/1285/6 +f 761/1285/6 768/1296/6 767/1295/6 760/1284/6 +f 764/1291/6 804/1365/6 805/1366/6 765/1292/6 +f 765/1292/6 805/1366/6 806/1367/6 768/1296/6 +f 768/1296/6 806/1367/6 803/1363/6 767/1295/6 +f 804/1365/6 808/1370/6 809/1371/6 805/1366/6 +f 805/1366/6 809/1371/6 810/1372/6 806/1367/6 +f 806/1367/6 810/1372/6 807/1368/6 803/1363/6 +f 808/1370/6 812/1375/6 813/1376/6 809/1371/6 +f 809/1371/6 813/1376/6 814/1377/6 810/1372/6 +f 810/1372/6 814/1377/6 811/1373/6 807/1368/6 +f 812/1375/6 816/1380/6 817/1381/6 813/1376/6 +f 813/1376/6 817/1381/6 818/1382/6 814/1377/6 +f 814/1377/6 818/1382/6 815/1378/6 811/1373/6 +f 816/1380/6 797/1350/6 796/1347/6 817/1381/6 +f 817/1381/6 796/1347/6 794/1343/6 818/1382/6 +f 818/1382/6 794/1343/6 795/1345/6 815/1378/6 +f 903/1496/1 829/1405/1 820/1386/1 828/1403/1 +f 821/1389/1 819/1383/1 843/1435/1 847/1440/1 +f 847/1440/1 843/1435/1 842/1432/1 851/1444/1 +f 851/1444/1 842/1432/1 841/1430/1 855/1448/1 +f 855/1448/1 841/1430/1 840/1428/1 859/1452/1 +f 859/1452/1 840/1428/1 839/1426/1 863/1456/1 +f 863/1456/1 839/1426/1 838/1424/1 867/1460/1 +f 867/1460/1 838/1424/1 837/1422/1 871/1464/1 +f 871/1464/1 837/1422/1 836/1420/1 875/1468/1 +f 875/1468/1 836/1420/1 835/1418/1 879/1472/1 +f 879/1472/1 835/1418/1 834/1416/1 883/1476/1 +f 883/1476/1 834/1416/1 833/1414/1 887/1480/1 +f 887/1480/1 833/1414/1 832/1412/1 891/1484/1 +f 891/1484/1 832/1412/1 831/1410/1 895/1488/1 +f 895/1488/1 831/1410/1 830/1407/1 899/1492/1 +f 899/1492/1 830/1407/1 829/1405/1 903/1496/1 +f 824/1395/1 823/1393/1 845/1438/1 844/1437/1 +f 823/1393/1 822/1391/1 846/1439/1 845/1438/1 +f 822/1391/1 821/1389/1 847/1440/1 846/1439/1 +f 844/1437/1 845/1438/1 849/1442/1 848/1441/1 +f 845/1438/1 846/1439/1 850/1443/1 849/1442/1 +f 846/1439/1 847/1440/1 851/1444/1 850/1443/1 +f 848/1441/1 849/1442/1 853/1446/1 852/1445/1 +f 849/1442/1 850/1443/1 854/1447/1 853/1446/1 +f 850/1443/1 851/1444/1 855/1448/1 854/1447/1 +f 852/1445/1 853/1446/1 857/1450/1 856/1449/1 +f 853/1446/1 854/1447/1 858/1451/1 857/1450/1 +f 854/1447/1 855/1448/1 859/1452/1 858/1451/1 +f 856/1449/1 857/1450/1 861/1454/1 860/1453/1 +f 857/1450/1 858/1451/1 862/1455/1 861/1454/1 +f 858/1451/1 859/1452/1 863/1456/1 862/1455/1 +f 860/1453/1 861/1454/1 865/1458/1 864/1457/1 +f 861/1454/1 862/1455/1 866/1459/1 865/1458/1 +f 862/1455/1 863/1456/1 867/1460/1 866/1459/1 +f 864/1457/1 865/1458/1 869/1462/1 868/1461/1 +f 865/1458/1 866/1459/1 870/1463/1 869/1462/1 +f 866/1459/1 867/1460/1 871/1464/1 870/1463/1 +f 868/1461/1 869/1462/1 873/1466/1 872/1465/1 +f 869/1462/1 870/1463/1 874/1467/1 873/1466/1 +f 870/1463/1 871/1464/1 875/1468/1 874/1467/1 +f 872/1465/1 873/1466/1 877/1470/1 876/1469/1 +f 873/1466/1 874/1467/1 878/1471/1 877/1470/1 +f 874/1467/1 875/1468/1 879/1472/1 878/1471/1 +f 876/1469/1 877/1470/1 881/1474/1 880/1473/1 +f 877/1470/1 878/1471/1 882/1475/1 881/1474/1 +f 878/1471/1 879/1472/1 883/1476/1 882/1475/1 +f 880/1473/1 881/1474/1 885/1478/1 884/1477/1 +f 881/1474/1 882/1475/1 886/1479/1 885/1478/1 +f 882/1475/1 883/1476/1 887/1480/1 886/1479/1 +f 884/1477/1 885/1478/1 889/1482/1 888/1481/1 +f 885/1478/1 886/1479/1 890/1483/1 889/1482/1 +f 886/1479/1 887/1480/1 891/1484/1 890/1483/1 +f 888/1481/1 889/1482/1 893/1486/1 892/1485/1 +f 889/1482/1 890/1483/1 894/1487/1 893/1486/1 +f 890/1483/1 891/1484/1 895/1488/1 894/1487/1 +f 892/1485/1 893/1486/1 897/1490/1 896/1489/1 +f 893/1486/1 894/1487/1 898/1491/1 897/1490/1 +f 894/1487/1 895/1488/1 899/1492/1 898/1491/1 +f 896/1489/1 897/1490/1 901/1494/1 900/1493/1 +f 897/1490/1 898/1491/1 902/1495/1 901/1494/1 +f 898/1491/1 899/1492/1 903/1496/1 902/1495/1 +f 900/1493/1 901/1494/1 826/1399/1 825/1397/1 +f 901/1494/1 902/1495/1 827/1401/1 826/1399/1 +f 902/1495/1 903/1496/1 828/1403/1 827/1401/1 +f 913/1513/2 914/1514/2 984/1624/2 983/1623/2 +f 925/1530/3 926/1531/3 996/1645/3 995/1644/3 +f 934/1542/4 936/1544/4 1016/1675/4 1012/1669/4 +f 912/1512/2 913/1513/2 983/1623/2 982/1621/2 +f 967/1595/4 971/1602/4 1056/1727/4 1052/1721/4 +f 924/1529/3 925/1530/3 995/1644/3 994/1642/3 +f 910/1508/5 911/1510/5 981/1619/5 980/1618/5 +f 940/1548/4 943/1553/4 1028/1691/4 1024/1685/4 +f 923/1528/3 924/1529/3 994/1642/3 993/1641/3 +f 909/1507/5 910/1508/5 980/1618/5 979/1617/5 +f 922/1527/3 923/1528/3 993/1641/3 992/1639/3 +f 911/1509/4 929/1537/4 1000/1654/4 981/1620/4 +f 951/1569/4 955/1578/4 1040/1706/4 1036/1701/4 +f 908/1506/5 909/1507/5 979/1617/5 978/1616/5 +f 921/1526/3 922/1527/3 992/1639/3 991/1637/3 +f 933/1541/4 934/1542/4 1012/1669/4 1008/1665/4 +f 907/1505/5 908/1506/5 978/1616/5 977/1614/5 +f 963/1590/4 967/1595/4 1052/1721/4 1048/1717/4 +f 920/1525/3 921/1526/3 991/1637/3 990/1636/3 +f 906/1501/3 907/1503/3 977/1613/3 976/1611/3 +f 938/1546/4 940/1548/4 1024/1685/4 1020/1680/4 +f 919/1524/3 920/1525/3 990/1636/3 989/1634/3 +f 904/1497/2 905/1500/2 975/1609/2 974/1607/2 +f 918/1523/3 919/1524/3 989/1634/3 988/1632/3 +f 947/1561/4 951/1569/4 1036/1701/4 1032/1695/4 +f 917/1520/3 918/1522/3 988/1631/3 987/1629/3 +f 931/1539/4 933/1541/4 1008/1665/4 1004/1659/4 +f 959/1585/4 963/1590/4 1048/1717/4 1044/1711/4 +f 916/1517/3 917/1520/3 987/1629/3 986/1627/3 +f 936/1544/4 938/1546/4 1020/1680/4 1016/1675/4 +f 915/1515/3 916/1517/3 986/1627/3 985/1625/3 +f 971/1602/4 912/1511/4 982/1622/4 1056/1727/4 +f 928/1534/3 906/1501/3 976/1611/3 998/1650/3 +f 905/1498/3 915/1515/3 985/1625/3 975/1608/3 +f 943/1553/4 947/1561/4 1032/1695/4 1028/1691/4 +f 927/1532/3 928/1534/3 998/1650/3 997/1647/3 +f 914/1514/2 904/1497/2 974/1607/2 984/1624/2 +f 926/1531/3 927/1533/3 997/1648/3 996/1645/3 +f 929/1537/4 931/1539/4 1004/1659/4 1000/1654/4 +f 955/1578/4 959/1585/4 1044/1711/4 1040/1706/4 +f 827/1402/2 828/1404/2 904/1497/2 914/1514/2 +f 841/1431/3 842/1433/3 928/1535/3 927/1533/3 +f 872/1465/4 876/1469/4 947/1561/4 943/1553/4 +f 820/1387/3 829/1406/3 915/1516/3 905/1499/3 +f 842/1434/3 843/1436/3 906/1502/3 928/1536/3 +f 900/1493/4 825/1397/4 912/1511/4 971/1602/4 +f 829/1406/3 830/1408/3 916/1518/3 915/1516/3 +f 860/1453/4 864/1457/4 938/1546/4 936/1544/4 +f 830/1409/3 831/1411/3 917/1521/3 916/1519/3 +f 888/1481/4 892/1485/4 963/1590/4 959/1585/4 +f 848/1441/4 852/1445/4 933/1541/4 931/1539/4 +f 831/1411/3 832/1413/3 918/1523/3 917/1521/3 +f 876/1469/4 880/1473/4 951/1569/4 947/1561/4 +f 832/1413/3 833/1415/3 919/1524/3 918/1523/3 +f 828/1404/2 820/1388/2 905/1500/2 904/1497/2 +f 833/1415/3 834/1417/3 920/1525/3 919/1524/3 +f 864/1457/4 868/1461/4 940/1548/4 938/1546/4 +f 843/1436/3 819/1384/3 907/1504/3 906/1502/3 +f 834/1417/3 835/1419/3 921/1526/3 920/1525/3 +f 892/1485/4 896/1489/4 967/1595/4 963/1590/4 +f 819/1385/5 821/1390/5 908/1506/5 907/1505/5 +f 852/1445/4 856/1449/4 934/1542/4 933/1541/4 +f 835/1419/3 836/1421/3 922/1527/3 921/1526/3 +f 821/1390/5 822/1392/5 909/1507/5 908/1506/5 +f 880/1473/4 884/1477/4 955/1578/4 951/1569/4 +f 824/1395/4 844/1437/4 929/1537/4 911/1509/4 +f 836/1421/3 837/1423/3 923/1528/3 922/1527/3 +f 822/1392/5 823/1394/5 910/1508/5 909/1507/5 +f 837/1423/3 838/1425/3 924/1529/3 923/1528/3 +f 868/1461/4 872/1465/4 943/1553/4 940/1548/4 +f 823/1394/5 824/1396/5 911/1510/5 910/1508/5 +f 838/1425/3 839/1427/3 925/1530/3 924/1529/3 +f 896/1489/4 900/1493/4 971/1602/4 967/1595/4 +f 825/1398/2 826/1400/2 913/1513/2 912/1512/2 +f 856/1449/4 860/1453/4 936/1544/4 934/1542/4 +f 839/1427/3 840/1429/3 926/1531/3 925/1530/3 +f 826/1400/2 827/1402/2 914/1514/2 913/1513/2 +f 884/1477/4 888/1481/4 959/1585/4 955/1578/4 +f 844/1437/4 848/1441/4 931/1539/4 929/1537/4 +f 840/1429/3 841/1431/3 927/1533/3 926/1531/3 +f 1105/1801/6 1085/1768/6 1083/1762/6 1082/1760/6 +f 1091/1781/6 1075/1748/6 1078/1752/6 1092/1783/6 +f 1075/1748/6 1070/1741/6 1073/1745/6 1078/1752/6 +f 1070/1741/6 1003/1658/6 999/1652/6 1073/1745/6 +f 1003/1658/6 1010/1667/6 1006/1661/6 999/1652/6 +f 1010/1667/6 1017/1676/6 1013/1670/6 1006/1661/6 +f 1017/1676/6 1023/1684/6 1019/1678/6 1013/1670/6 +f 1023/1684/6 1030/1693/6 1026/1687/6 1019/1678/6 +f 1030/1693/6 1037/1702/6 1033/1696/6 1026/1687/6 +f 1037/1702/6 1043/1710/6 1039/1704/6 1033/1696/6 +f 1043/1710/6 1050/1719/6 1046/1713/6 1039/1704/6 +f 1050/1719/6 1057/1728/6 1053/1722/6 1046/1713/6 +f 1057/1728/6 1093/1786/6 1079/1754/6 1053/1722/6 +f 1093/1786/6 1097/1791/6 1080/1756/6 1079/1754/6 +f 1097/1791/6 1101/1796/6 1081/1758/6 1080/1756/6 +f 1101/1796/6 1105/1801/6 1082/1760/6 1081/1758/6 +f 1089/1776/6 1077/1750/6 1076/1749/6 1088/1774/6 +f 1088/1774/6 1076/1749/6 1074/1747/6 1090/1779/6 +f 1090/1779/6 1074/1747/6 1075/1748/6 1091/1781/6 +f 1077/1750/6 1072/1743/6 1071/1742/6 1076/1749/6 +f 1076/1749/6 1071/1742/6 1069/1740/6 1074/1747/6 +f 1074/1747/6 1069/1740/6 1070/1741/6 1075/1748/6 +f 1072/1743/6 1001/1656/6 1002/1657/6 1071/1742/6 +f 1071/1742/6 1002/1657/6 1005/1660/6 1069/1740/6 +f 995/1643/3 996/1646/3 944/1554/3 945/1556/3 +f 1012/1669/4 1016/1675/4 930/1538/4 932/1540/4 +f 982/1621/2 983/1623/2 961/1587/2 962/1588/2 +f 1052/1721/4 1056/1727/4 1068/1739/4 1067/1738/4 +f 994/1642/3 995/1644/3 945/1557/3 946/1559/3 +f 980/1618/5 981/1619/5 964/1591/5 965/1593/5 +f 1024/1685/4 1028/1691/4 1061/1732/4 1060/1731/4 +f 993/1641/3 994/1642/3 946/1559/3 948/1562/3 +f 979/1617/5 980/1618/5 965/1593/5 966/1594/5 +f 992/1639/3 993/1641/3 948/1562/3 949/1564/3 +f 981/1620/4 1000/1654/4 939/1547/4 964/1592/4 +f 1036/1701/4 1040/1706/4 1064/1735/4 1063/1734/4 +f 978/1616/5 979/1617/5 966/1594/5 968/1596/5 +f 991/1638/3 992/1640/3 949/1565/3 950/1567/3 +f 1008/1665/4 1012/1669/4 932/1540/4 935/1543/4 +f 977/1614/5 978/1616/5 968/1596/5 969/1599/5 +f 1048/1717/4 1052/1721/4 1067/1738/4 1066/1737/4 +f 990/1635/3 991/1638/3 950/1567/3 952/1570/3 +f 976/1612/3 977/1615/3 969/1597/3 970/1600/3 +f 1020/1680/4 1024/1685/4 1060/1731/4 1059/1730/4 +f 989/1634/3 990/1636/3 952/1571/3 953/1573/3 +f 974/1607/2 975/1609/2 972/1605/2 973/1606/2 +f 988/1632/3 989/1634/3 953/1573/3 954/1575/3 +f 1032/1695/4 1036/1701/4 1063/1734/4 1062/1733/4 +f 987/1630/3 988/1633/3 954/1576/3 956/1579/3 +f 1004/1659/4 1008/1665/4 935/1543/4 937/1545/4 +f 1044/1711/4 1048/1717/4 1066/1737/4 1065/1736/4 +f 986/1628/3 987/1630/3 956/1579/3 957/1581/3 +f 1016/1675/4 1020/1680/4 1059/1730/4 930/1538/4 +f 985/1626/3 986/1628/3 957/1581/3 958/1583/3 +f 1056/1727/4 982/1622/4 962/1589/4 1068/1739/4 +f 998/1651/3 976/1612/3 970/1600/3 941/1549/3 +f 975/1610/3 985/1626/3 958/1583/3 972/1603/3 +f 1028/1691/4 1032/1695/4 1062/1733/4 1061/1732/4 +f 997/1649/3 998/1651/3 941/1549/3 942/1551/3 +f 984/1624/2 974/1607/2 973/1606/2 960/1586/2 +f 1000/1654/4 1004/1659/4 937/1545/4 939/1547/4 +f 996/1646/3 997/1649/3 942/1551/3 944/1554/3 +f 1040/1706/4 1044/1711/4 1065/1736/4 1064/1735/4 +f 983/1623/2 984/1624/2 960/1586/2 961/1587/2 +f 949/1566/3 948/1563/3 1026/1688/3 1033/1697/3 +f 965/1593/5 964/1591/5 1089/1777/5 1088/1775/5 +f 932/1540/4 930/1538/4 1014/1672/4 1007/1663/4 +f 948/1563/3 946/1560/3 1019/1679/3 1026/1688/3 +f 1067/1738/4 1068/1739/4 1106/1802/4 1102/1797/4 +f 962/1588/2 961/1587/2 1086/1769/2 1087/1771/2 +f 946/1560/3 945/1558/3 1013/1671/3 1019/1679/3 +f 1060/1731/4 1061/1732/4 1034/1698/4 1027/1689/4 +f 961/1587/2 960/1586/2 1084/1765/2 1086/1769/2 +f 945/1558/3 944/1555/3 1006/1662/3 1013/1671/3 +f 964/1592/4 939/1547/4 1077/1751/4 1089/1778/4 +f 1063/1734/4 1064/1735/4 1054/1724/4 1047/1715/4 +f 944/1555/3 942/1552/3 999/1653/3 1006/1662/3 +f 960/1586/2 973/1606/2 1085/1767/2 1084/1765/2 +f 935/1543/4 932/1540/4 1007/1663/4 1001/1655/4 +f 942/1552/3 941/1550/3 1073/1746/3 999/1653/3 +f 1066/1737/4 1067/1738/4 1102/1797/4 1098/1792/4 +f 972/1604/3 958/1584/3 1082/1761/3 1083/1763/3 +f 941/1550/3 970/1601/3 1078/1753/3 1073/1746/3 +f 1059/1730/4 1060/1731/4 1027/1689/4 1021/1681/4 +f 958/1584/3 957/1582/3 1081/1759/3 1082/1761/3 +f 973/1606/2 972/1605/2 1083/1764/2 1085/1767/2 +f 957/1582/3 956/1580/3 1080/1757/3 1081/1759/3 +f 1062/1733/4 1063/1734/4 1047/1715/4 1041/1707/4 +f 970/1601/3 969/1598/3 1092/1784/3 1078/1753/3 +f 956/1580/3 954/1577/3 1079/1755/3 1080/1757/3 +f 937/1545/4 935/1543/4 1001/1655/4 1072/1744/4 +f 1065/1736/4 1066/1737/4 1098/1792/4 1094/1787/4 +f 954/1577/3 953/1574/3 1053/1723/3 1079/1755/3 +f 969/1599/5 968/1596/5 1091/1782/5 1092/1785/5 +f 930/1538/4 1059/1730/4 1021/1681/4 1014/1672/4 +f 953/1574/3 952/1572/3 1046/1714/3 1053/1723/3 +f 1068/1739/4 962/1589/4 1087/1772/4 1106/1802/4 +f 968/1596/5 966/1594/5 1090/1780/5 1091/1782/5 +f 952/1572/3 950/1568/3 1039/1705/3 1046/1714/3 +f 1061/1732/4 1062/1733/4 1041/1707/4 1034/1698/4 +f 966/1594/5 965/1593/5 1088/1775/5 1090/1780/5 +f 950/1568/3 949/1566/3 1033/1697/3 1039/1705/3 +f 939/1547/4 937/1545/4 1072/1744/4 1077/1751/4 +f 1064/1735/4 1065/1736/4 1094/1787/4 1054/1724/4 +f 1069/1740/6 1005/1660/6 1003/1658/6 1070/1741/6 +f 1001/1656/6 1007/1664/6 1009/1666/6 1002/1657/6 +f 1002/1657/6 1009/1666/6 1011/1668/6 1005/1660/6 +f 1005/1660/6 1011/1668/6 1010/1667/6 1003/1658/6 +f 1007/1664/6 1014/1673/6 1015/1674/6 1009/1666/6 +f 1009/1666/6 1015/1674/6 1018/1677/6 1011/1668/6 +f 1011/1668/6 1018/1677/6 1017/1676/6 1010/1667/6 +f 1014/1673/6 1021/1682/6 1022/1683/6 1015/1674/6 +f 1015/1674/6 1022/1683/6 1025/1686/6 1018/1677/6 +f 1018/1677/6 1025/1686/6 1023/1684/6 1017/1676/6 +f 1021/1682/6 1027/1690/6 1029/1692/6 1022/1683/6 +f 1022/1683/6 1029/1692/6 1031/1694/6 1025/1686/6 +f 1025/1686/6 1031/1694/6 1030/1693/6 1023/1684/6 +f 1027/1690/6 1034/1699/6 1035/1700/6 1029/1692/6 +f 1029/1692/6 1035/1700/6 1038/1703/6 1031/1694/6 +f 1031/1694/6 1038/1703/6 1037/1702/6 1030/1693/6 +f 1034/1699/6 1041/1708/6 1042/1709/6 1035/1700/6 +f 1035/1700/6 1042/1709/6 1045/1712/6 1038/1703/6 +f 1038/1703/6 1045/1712/6 1043/1710/6 1037/1702/6 +f 1041/1708/6 1047/1716/6 1049/1718/6 1042/1709/6 +f 1042/1709/6 1049/1718/6 1051/1720/6 1045/1712/6 +f 1045/1712/6 1051/1720/6 1050/1719/6 1043/1710/6 +f 1047/1716/6 1054/1725/6 1055/1726/6 1049/1718/6 +f 1049/1718/6 1055/1726/6 1058/1729/6 1051/1720/6 +f 1051/1720/6 1058/1729/6 1057/1728/6 1050/1719/6 +f 1054/1725/6 1094/1788/6 1095/1789/6 1055/1726/6 +f 1055/1726/6 1095/1789/6 1096/1790/6 1058/1729/6 +f 1058/1729/6 1096/1790/6 1093/1786/6 1057/1728/6 +f 1094/1788/6 1098/1793/6 1099/1794/6 1095/1789/6 +f 1095/1789/6 1099/1794/6 1100/1795/6 1096/1790/6 +f 1096/1790/6 1100/1795/6 1097/1791/6 1093/1786/6 +f 1098/1793/6 1102/1798/6 1103/1799/6 1099/1794/6 +f 1099/1794/6 1103/1799/6 1104/1800/6 1100/1795/6 +f 1100/1795/6 1104/1800/6 1101/1796/6 1097/1791/6 +f 1102/1798/6 1106/1803/6 1107/1804/6 1103/1799/6 +f 1103/1799/6 1107/1804/6 1108/1805/6 1104/1800/6 +f 1104/1800/6 1108/1805/6 1105/1801/6 1101/1796/6 +f 1106/1803/6 1087/1773/6 1086/1770/6 1107/1804/6 +f 1107/1804/6 1086/1770/6 1084/1766/6 1108/1805/6 +f 1108/1805/6 1084/1766/6 1085/1768/6 1105/1801/6 +f 1193/2001/1 1119/1835/1 1110/1809/1 1118/1833/1 +f 1111/1812/1 1109/1806/1 1133/1865/1 1137/1877/1 +f 1137/1878/1 1133/1866/1 1132/1863/1 1141/1888/1 +f 1141/1888/1 1132/1863/1 1131/1861/1 1145/1896/1 +f 1145/1896/1 1131/1861/1 1130/1858/1 1149/1905/1 +f 1149/1905/1 1130/1858/1 1129/1856/1 1153/1913/1 +f 1153/1913/1 1129/1856/1 1128/1854/1 1157/1921/1 +f 1157/1921/1 1128/1854/1 1127/1852/1 1161/1929/1 +f 1161/1929/1 1127/1852/1 1126/1850/1 1165/1937/1 +f 1165/1937/1 1126/1850/1 1125/1848/1 1169/1945/1 +f 1169/1945/1 1125/1848/1 1124/1846/1 1173/1953/1 +f 1173/1953/1 1124/1846/1 1123/1844/1 1177/1961/1 +f 1177/1961/1 1123/1844/1 1122/1842/1 1181/1969/1 +f 1181/1969/1 1122/1842/1 1121/1839/1 1185/1978/1 +f 1185/1978/1 1121/1839/1 1120/1837/1 1189/1988/1 +f 1189/1988/1 1120/1837/1 1119/1835/1 1193/2001/1 +f 1114/1821/1 1113/1818/1 1135/1871/1 1134/1868/1 +f 1113/1819/1 1112/1815/1 1136/1873/1 1135/1870/1 +f 1112/1816/1 1111/1813/1 1137/1878/1 1136/1874/1 +f 1134/1868/1 1135/1871/1 1139/1883/1 1138/1880/1 +f 1135/1872/1 1136/1875/1 1140/1886/1 1139/1885/1 +f 1136/1876/1 1137/1879/1 1141/1889/1 1140/1887/1 +f 1138/1881/1 1139/1884/1 1143/1892/1 1142/1890/1 +f 1139/1885/1 1140/1886/1 1144/1894/1 1143/1893/1 +f 1140/1887/1 1141/1889/1 1145/1897/1 1144/1895/1 +f 1142/1890/1 1143/1892/1 1147/1901/1 1146/1898/1 +f 1143/1893/1 1144/1894/1 1148/1903/1 1147/1902/1 +f 1144/1895/1 1145/1897/1 1149/1906/1 1148/1904/1 +f 1146/1898/1 1147/1901/1 1151/1909/1 1150/1907/1 +f 1147/1902/1 1148/1903/1 1152/1911/1 1151/1910/1 +f 1148/1904/1 1149/1906/1 1153/1914/1 1152/1912/1 +f 1150/1907/1 1151/1909/1 1155/1917/1 1154/1915/1 +f 1151/1910/1 1152/1911/1 1156/1919/1 1155/1918/1 +f 1152/1912/1 1153/1914/1 1157/1922/1 1156/1920/1 +f 1154/1915/1 1155/1917/1 1159/1925/1 1158/1923/1 +f 1155/1918/1 1156/1919/1 1160/1927/1 1159/1926/1 +f 1156/1920/1 1157/1922/1 1161/1930/1 1160/1928/1 +f 1158/1923/1 1159/1925/1 1163/1933/1 1162/1931/1 +f 1159/1926/1 1160/1927/1 1164/1935/1 1163/1934/1 +f 1160/1928/1 1161/1930/1 1165/1938/1 1164/1936/1 +f 1162/1931/1 1163/1933/1 1167/1941/1 1166/1939/1 +f 1163/1934/1 1164/1935/1 1168/1943/1 1167/1942/1 +f 1164/1936/1 1165/1938/1 1169/1946/1 1168/1944/1 +f 1166/1939/1 1167/1941/1 1171/1949/1 1170/1947/1 +f 1167/1942/1 1168/1943/1 1172/1951/1 1171/1950/1 +f 1168/1944/1 1169/1946/1 1173/1954/1 1172/1952/1 +f 1170/1947/1 1171/1949/1 1175/1957/1 1174/1955/1 +f 1171/1950/1 1172/1951/1 1176/1959/1 1175/1958/1 +f 1172/1952/1 1173/1954/1 1177/1962/1 1176/1960/1 +f 1174/1955/1 1175/1957/1 1179/1965/1 1178/1963/1 +f 1175/1958/1 1176/1959/1 1180/1967/1 1179/1966/1 +f 1176/1960/1 1177/1962/1 1181/1970/1 1180/1968/1 +f 1178/1963/1 1179/1965/1 1183/1974/1 1182/1971/1 +f 1179/1966/1 1180/1967/1 1184/1976/1 1183/1975/1 +f 1180/1968/1 1181/1970/1 1185/1979/1 1184/1977/1 +f 1182/1971/1 1183/1974/1 1187/1983/1 1186/1980/1 +f 1183/1975/1 1184/1976/1 1188/1986/1 1187/1985/1 +f 1184/1977/1 1185/1979/1 1189/1989/1 1188/1987/1 +f 1186/1981/1 1187/1984/1 1191/1994/1 1190/1990/1 +f 1187/1985/1 1188/1986/1 1192/1996/1 1191/1993/1 +f 1188/1987/1 1189/1989/1 1193/2000/1 1192/1997/1 +f 1190/1991/1 1191/1994/1 1116/1827/1 1115/1824/1 +f 1191/1995/1 1192/1998/1 1117/1830/1 1116/1828/1 +f 1192/1999/1 1193/2001/1 1118/1833/1 1117/1831/1 +f 1203/2018/3 1204/2019/3 1274/2144/3 1273/2143/3 +f 1215/2044/5 1216/2046/5 1286/2170/5 1285/2168/5 +f 1224/2060/2 1226/2062/2 1306/2201/2 1302/2194/2 +f 1202/2017/3 1203/2018/3 1273/2143/3 1272/2141/3 +f 1257/2115/2 1261/2122/2 1346/2259/2 1342/2253/2 +f 1214/2041/5 1215/2044/5 1285/2168/5 1284/2165/5 +f 1200/2013/4 1201/2015/4 1271/2139/4 1270/2138/4 +f 1230/2067/2 1233/2073/2 1318/2220/2 1314/2213/2 +f 1213/2039/5 1214/2042/5 1284/2166/5 1283/2163/5 +f 1199/2012/4 1200/2013/4 1270/2138/4 1269/2137/4 +f 1212/2036/5 1213/2039/5 1283/2163/5 1282/2160/5 +f 1201/2014/2 1219/2054/2 1290/2179/2 1271/2140/2 +f 1241/2088/2 1245/2096/2 1330/2237/2 1326/2231/2 +f 1198/2011/4 1199/2012/4 1269/2137/4 1268/2136/4 +f 1211/2034/5 1212/2037/5 1282/2161/5 1281/2158/5 +f 1223/2058/2 1224/2059/2 1302/2195/2 1298/2190/2 +f 1197/2010/4 1198/2011/4 1268/2136/4 1267/2134/4 +f 1253/2110/2 1257/2115/2 1342/2253/2 1338/2249/2 +f 1210/2032/5 1211/2034/5 1281/2158/5 1280/2156/5 +f 1196/2006/5 1197/2008/5 1267/2133/5 1266/2131/5 +f 1228/2064/2 1230/2067/2 1314/2213/2 1310/2208/2 +f 1209/2029/5 1210/2032/5 1280/2156/5 1279/2153/5 +f 1194/2002/3 1195/2005/3 1265/2129/3 1264/2127/3 +f 1208/2027/5 1209/2030/5 1279/2154/5 1278/2151/5 +f 1237/2081/2 1241/2088/2 1326/2231/2 1322/2224/2 +f 1207/2024/5 1208/2027/5 1278/2151/5 1277/2149/5 +f 1221/2056/2 1223/2058/2 1298/2190/2 1294/2184/2 +f 1249/2103/2 1253/2110/2 1338/2249/2 1334/2243/2 +f 1206/2022/5 1207/2024/5 1277/2149/5 1276/2147/5 +f 1226/2062/2 1228/2065/2 1310/2207/2 1306/2201/2 +f 1205/2020/5 1206/2022/5 1276/2147/5 1275/2145/5 +f 1261/2122/2 1202/2016/2 1272/2142/2 1346/2259/2 +f 1218/2052/5 1196/2006/5 1266/2131/5 1288/2175/5 +f 1195/2003/5 1205/2020/5 1275/2145/5 1265/2128/5 +f 1233/2074/2 1237/2081/2 1322/2224/2 1318/2219/2 +f 1217/2050/5 1218/2052/5 1288/2175/5 1287/2173/5 +f 1204/2019/3 1194/2002/3 1264/2127/3 1274/2144/3 +f 1216/2047/5 1217/2050/5 1287/2173/5 1286/2171/5 +f 1219/2054/2 1221/2056/2 1294/2184/2 1290/2179/2 +f 1245/2095/2 1249/2103/2 1334/2243/2 1330/2238/2 +f 1117/1832/3 1118/1834/3 1194/2002/3 1204/2019/3 +f 1131/1862/5 1132/1864/5 1218/2053/5 1217/2051/5 +f 1162/1932/2 1166/1940/2 1237/2081/2 1233/2074/2 +f 1110/1810/5 1119/1836/5 1205/2021/5 1195/2004/5 +f 1132/1864/5 1133/1867/5 1196/2007/5 1218/2053/5 +f 1190/1992/2 1115/1825/2 1202/2016/2 1261/2122/2 +f 1119/1836/5 1120/1838/5 1206/2023/5 1205/2021/5 +f 1150/1908/2 1154/1916/2 1228/2065/2 1226/2062/2 +f 1120/1838/5 1121/1840/5 1207/2025/5 1206/2023/5 +f 1178/1964/2 1182/1972/2 1253/2109/2 1249/2104/2 +f 1138/1882/2 1142/1891/2 1223/2058/2 1221/2056/2 +f 1121/1841/5 1122/1843/5 1208/2028/5 1207/2026/5 +f 1166/1940/2 1170/1948/2 1241/2088/2 1237/2081/2 +f 1122/1843/5 1123/1845/5 1209/2031/5 1208/2028/5 +f 1118/1834/3 1110/1811/3 1195/2005/3 1194/2002/3 +f 1123/1845/5 1124/1847/5 1210/2033/5 1209/2031/5 +f 1154/1916/2 1158/1924/2 1230/2068/2 1228/2065/2 +f 1133/1867/5 1109/1807/5 1197/2009/5 1196/2007/5 +f 1124/1847/5 1125/1849/5 1211/2035/5 1210/2033/5 +f 1182/1973/2 1186/1982/2 1257/2115/2 1253/2110/2 +f 1109/1808/4 1111/1814/4 1198/2011/4 1197/2010/4 +f 1142/1891/2 1146/1899/2 1224/2059/2 1223/2058/2 +f 1125/1849/5 1126/1851/5 1212/2038/5 1211/2035/5 +f 1111/1814/4 1112/1817/4 1199/2012/4 1198/2011/4 +f 1170/1948/2 1174/1956/2 1245/2096/2 1241/2088/2 +f 1114/1822/2 1134/1869/2 1219/2054/2 1201/2014/2 +f 1126/1851/5 1127/1853/5 1213/2040/5 1212/2038/5 +f 1112/1817/4 1113/1820/4 1200/2013/4 1199/2012/4 +f 1127/1853/5 1128/1855/5 1214/2043/5 1213/2040/5 +f 1158/1924/2 1162/1932/2 1233/2074/2 1230/2068/2 +f 1113/1820/4 1114/1823/4 1201/2015/4 1200/2013/4 +f 1128/1855/5 1129/1857/5 1215/2045/5 1214/2043/5 +f 1186/1982/2 1190/1992/2 1261/2122/2 1257/2115/2 +f 1115/1826/3 1116/1829/3 1203/2018/3 1202/2017/3 +f 1146/1900/2 1150/1908/2 1226/2062/2 1224/2060/2 +f 1129/1857/5 1130/1859/5 1216/2048/5 1215/2045/5 +f 1116/1829/3 1117/1832/3 1204/2019/3 1203/2018/3 +f 1174/1956/2 1178/1964/2 1249/2104/2 1245/2096/2 +f 1134/1869/2 1138/1882/2 1221/2056/2 1219/2054/2 +f 1130/1860/5 1131/1862/5 1217/2051/5 1216/2049/5 +f 1395/2333/6 1375/2300/6 1373/2294/6 1372/2292/6 +f 1381/2313/6 1365/2280/6 1368/2284/6 1382/2315/6 +f 1365/2280/6 1360/2273/6 1363/2277/6 1368/2284/6 +f 1360/2273/6 1293/2183/6 1289/2177/6 1363/2277/6 +f 1293/2183/6 1300/2192/6 1296/2186/6 1289/2177/6 +f 1300/2192/6 1307/2203/6 1303/2196/6 1296/2186/6 +f 1307/2203/6 1313/2212/6 1309/2205/6 1303/2196/6 +f 1313/2212/6 1320/2222/6 1316/2215/6 1309/2205/6 +f 1320/2222/6 1327/2233/6 1323/2226/6 1316/2215/6 +f 1327/2233/6 1333/2242/6 1329/2235/6 1323/2226/6 +f 1333/2242/6 1340/2251/6 1336/2245/6 1329/2235/6 +f 1340/2251/6 1347/2260/6 1343/2254/6 1336/2245/6 +f 1347/2260/6 1383/2318/6 1369/2286/6 1343/2254/6 +f 1383/2318/6 1387/2323/6 1370/2288/6 1369/2286/6 +f 1387/2323/6 1391/2328/6 1371/2290/6 1370/2288/6 +f 1391/2328/6 1395/2333/6 1372/2292/6 1371/2290/6 +f 1379/2308/6 1367/2282/6 1366/2281/6 1378/2306/6 +f 1378/2306/6 1366/2281/6 1364/2279/6 1380/2311/6 +f 1380/2311/6 1364/2279/6 1365/2280/6 1381/2313/6 +f 1367/2282/6 1362/2275/6 1361/2274/6 1366/2281/6 +f 1366/2281/6 1361/2274/6 1359/2272/6 1364/2279/6 +f 1364/2279/6 1359/2272/6 1360/2273/6 1365/2280/6 +f 1362/2275/6 1291/2181/6 1292/2182/6 1361/2274/6 +f 1361/2274/6 1292/2182/6 1295/2185/6 1359/2272/6 +f 1285/2169/5 1286/2172/5 1234/2075/5 1235/2077/5 +f 1302/2195/2 1306/2202/2 1220/2055/2 1222/2057/2 +f 1272/2141/3 1273/2143/3 1251/2106/3 1252/2107/3 +f 1342/2253/2 1346/2259/2 1358/2271/2 1357/2270/2 +f 1284/2167/5 1285/2169/5 1235/2077/5 1236/2079/5 +f 1270/2138/4 1271/2139/4 1254/2111/4 1255/2113/4 +f 1314/2213/2 1318/2220/2 1351/2264/2 1350/2263/2 +f 1283/2164/5 1284/2167/5 1236/2079/5 1238/2082/5 +f 1269/2137/4 1270/2138/4 1255/2113/4 1256/2114/4 +f 1282/2162/5 1283/2164/5 1238/2082/5 1239/2084/5 +f 1271/2140/2 1290/2179/2 1229/2066/2 1254/2112/2 +f 1326/2232/2 1330/2238/2 1354/2267/2 1353/2266/2 +f 1268/2136/4 1269/2137/4 1256/2114/4 1258/2116/4 +f 1281/2159/5 1282/2162/5 1239/2084/5 1240/2086/5 +f 1298/2190/2 1302/2195/2 1222/2057/2 1225/2061/2 +f 1267/2134/4 1268/2136/4 1258/2116/4 1259/2119/4 +f 1338/2249/2 1342/2253/2 1357/2270/2 1356/2269/2 +f 1280/2157/5 1281/2159/5 1240/2086/5 1242/2089/5 +f 1266/2132/5 1267/2135/5 1259/2117/5 1260/2120/5 +f 1310/2208/2 1314/2213/2 1350/2263/2 1349/2262/2 +f 1279/2155/5 1280/2157/5 1242/2089/5 1243/2091/5 +f 1264/2127/3 1265/2129/3 1262/2125/3 1263/2126/3 +f 1278/2152/5 1279/2155/5 1243/2091/5 1244/2093/5 +f 1322/2225/2 1326/2232/2 1353/2266/2 1352/2265/2 +f 1277/2150/5 1278/2152/5 1244/2093/5 1246/2097/5 +f 1294/2184/2 1298/2190/2 1225/2061/2 1227/2063/2 +f 1334/2243/2 1338/2249/2 1356/2269/2 1355/2268/2 +f 1276/2148/5 1277/2150/5 1246/2097/5 1247/2099/5 +f 1306/2202/2 1310/2208/2 1349/2262/2 1220/2055/2 +f 1275/2146/5 1276/2148/5 1247/2099/5 1248/2101/5 +f 1346/2259/2 1272/2142/2 1252/2108/2 1358/2271/2 +f 1288/2176/5 1266/2132/5 1260/2120/5 1231/2069/5 +f 1265/2130/5 1275/2146/5 1248/2101/5 1262/2123/5 +f 1318/2220/2 1322/2225/2 1352/2265/2 1351/2264/2 +f 1287/2174/5 1288/2176/5 1231/2069/5 1232/2071/5 +f 1274/2144/3 1264/2127/3 1263/2126/3 1250/2105/3 +f 1290/2179/2 1294/2184/2 1227/2063/2 1229/2066/2 +f 1286/2172/5 1287/2174/5 1232/2071/5 1234/2075/5 +f 1330/2238/2 1334/2243/2 1355/2268/2 1354/2267/2 +f 1273/2143/3 1274/2144/3 1250/2105/3 1251/2106/3 +f 1239/2085/5 1238/2083/5 1316/2216/5 1323/2227/5 +f 1255/2113/4 1254/2111/4 1379/2309/4 1378/2307/4 +f 1222/2057/2 1220/2055/2 1304/2198/2 1297/2188/2 +f 1238/2083/5 1236/2080/5 1309/2206/5 1316/2216/5 +f 1357/2270/2 1358/2271/2 1396/2334/2 1392/2329/2 +f 1252/2107/3 1251/2106/3 1376/2301/3 1377/2303/3 +f 1236/2080/5 1235/2078/5 1303/2197/5 1309/2206/5 +f 1350/2263/2 1351/2264/2 1324/2228/2 1317/2217/2 +f 1251/2106/3 1250/2105/3 1374/2297/3 1376/2301/3 +f 1235/2078/5 1234/2076/5 1296/2187/5 1303/2197/5 +f 1254/2112/2 1229/2066/2 1367/2283/2 1379/2310/2 +f 1353/2266/2 1354/2267/2 1344/2256/2 1337/2247/2 +f 1234/2076/5 1232/2072/5 1289/2178/5 1296/2187/5 +f 1250/2105/3 1263/2126/3 1375/2299/3 1374/2297/3 +f 1225/2061/2 1222/2057/2 1297/2188/2 1291/2180/2 +f 1232/2072/5 1231/2070/5 1363/2278/5 1289/2178/5 +f 1356/2269/2 1357/2270/2 1392/2329/2 1388/2324/2 +f 1262/2124/5 1248/2102/5 1372/2293/5 1373/2295/5 +f 1231/2070/5 1260/2121/5 1368/2285/5 1363/2278/5 +f 1349/2262/2 1350/2263/2 1317/2217/2 1311/2209/2 +f 1248/2102/5 1247/2100/5 1371/2291/5 1372/2293/5 +f 1263/2126/3 1262/2125/3 1373/2296/3 1375/2299/3 +f 1247/2100/5 1246/2098/5 1370/2289/5 1371/2291/5 +f 1352/2265/2 1353/2266/2 1337/2247/2 1331/2239/2 +f 1260/2121/5 1259/2118/5 1382/2316/5 1368/2285/5 +f 1246/2098/5 1244/2094/5 1369/2287/5 1370/2289/5 +f 1227/2063/2 1225/2061/2 1291/2180/2 1362/2276/2 +f 1355/2268/2 1356/2269/2 1388/2324/2 1384/2319/2 +f 1244/2094/5 1243/2092/5 1343/2255/5 1369/2287/5 +f 1259/2119/4 1258/2116/4 1381/2314/4 1382/2317/4 +f 1220/2055/2 1349/2262/2 1311/2209/2 1304/2198/2 +f 1243/2092/5 1242/2090/5 1336/2246/5 1343/2255/5 +f 1358/2271/2 1252/2108/2 1377/2304/2 1396/2334/2 +f 1258/2116/4 1256/2114/4 1380/2312/4 1381/2314/4 +f 1242/2090/5 1240/2087/5 1329/2236/5 1336/2246/5 +f 1351/2264/2 1352/2265/2 1331/2239/2 1324/2228/2 +f 1256/2114/4 1255/2113/4 1378/2307/4 1380/2312/4 +f 1240/2087/5 1239/2085/5 1323/2227/5 1329/2236/5 +f 1229/2066/2 1227/2063/2 1362/2276/2 1367/2283/2 +f 1354/2267/2 1355/2268/2 1384/2319/2 1344/2256/2 +f 1359/2272/6 1295/2185/6 1293/2183/6 1360/2273/6 +f 1291/2181/6 1297/2189/6 1299/2191/6 1292/2182/6 +f 1292/2182/6 1299/2191/6 1301/2193/6 1295/2185/6 +f 1295/2185/6 1301/2193/6 1300/2192/6 1293/2183/6 +f 1297/2189/6 1304/2199/6 1305/2200/6 1299/2191/6 +f 1299/2191/6 1305/2200/6 1308/2204/6 1301/2193/6 +f 1301/2193/6 1308/2204/6 1307/2203/6 1300/2192/6 +f 1304/2199/6 1311/2210/6 1312/2211/6 1305/2200/6 +f 1305/2200/6 1312/2211/6 1315/2214/6 1308/2204/6 +f 1308/2204/6 1315/2214/6 1313/2212/6 1307/2203/6 +f 1311/2210/6 1317/2218/6 1319/2221/6 1312/2211/6 +f 1312/2211/6 1319/2221/6 1321/2223/6 1315/2214/6 +f 1315/2214/6 1321/2223/6 1320/2222/6 1313/2212/6 +f 1317/2218/6 1324/2229/6 1325/2230/6 1319/2221/6 +f 1319/2221/6 1325/2230/6 1328/2234/6 1321/2223/6 +f 1321/2223/6 1328/2234/6 1327/2233/6 1320/2222/6 +f 1324/2229/6 1331/2240/6 1332/2241/6 1325/2230/6 +f 1325/2230/6 1332/2241/6 1335/2244/6 1328/2234/6 +f 1328/2234/6 1335/2244/6 1333/2242/6 1327/2233/6 +f 1331/2240/6 1337/2248/6 1339/2250/6 1332/2241/6 +f 1332/2241/6 1339/2250/6 1341/2252/6 1335/2244/6 +f 1335/2244/6 1341/2252/6 1340/2251/6 1333/2242/6 +f 1337/2248/6 1344/2257/6 1345/2258/6 1339/2250/6 +f 1339/2250/6 1345/2258/6 1348/2261/6 1341/2252/6 +f 1341/2252/6 1348/2261/6 1347/2260/6 1340/2251/6 +f 1344/2257/6 1384/2320/6 1385/2321/6 1345/2258/6 +f 1345/2258/6 1385/2321/6 1386/2322/6 1348/2261/6 +f 1348/2261/6 1386/2322/6 1383/2318/6 1347/2260/6 +f 1384/2320/6 1388/2325/6 1389/2326/6 1385/2321/6 +f 1385/2321/6 1389/2326/6 1390/2327/6 1386/2322/6 +f 1386/2322/6 1390/2327/6 1387/2323/6 1383/2318/6 +f 1388/2325/6 1392/2330/6 1393/2331/6 1389/2326/6 +f 1389/2326/6 1393/2331/6 1394/2332/6 1390/2327/6 +f 1390/2327/6 1394/2332/6 1391/2328/6 1387/2323/6 +f 1392/2330/6 1396/2335/6 1397/2336/6 1393/2331/6 +f 1393/2331/6 1397/2336/6 1398/2337/6 1394/2332/6 +f 1394/2332/6 1398/2337/6 1395/2333/6 1391/2328/6 +f 1396/2335/6 1377/2305/6 1376/2302/6 1397/2336/6 +f 1397/2336/6 1376/2302/6 1374/2298/6 1398/2337/6 +f 1398/2337/6 1374/2298/6 1375/2300/6 1395/2333/6 +o campfire_flame +v -0.424006 -0.425572 0.424006 +v -0.424006 0.773699 0.424006 +v 0.424006 -0.425572 -0.424006 +v 0.424006 0.773699 -0.424006 +v 0.424006 -0.425572 0.424006 +v 0.424006 0.773699 0.424006 +v -0.424006 -0.425572 -0.424006 +v -0.424006 0.773699 -0.424006 +vn -0.7071 -0.0000 -0.7071 +vn -0.7071 -0.0000 0.7071 +vt 0.500100 0.000200 +vt 0.500100 1.000000 +vt 0.999900 0.000200 +vt 0.999900 1.000000 +vt 0.500100 0.000200 +vt 0.500100 1.000000 +vt 0.999900 0.000200 +vt 0.999900 1.000000 +s 0 +usemtl camp_fire_UV_animated_emit +f 1399/2338/7 1400/2339/7 1402/2341/7 1401/2340/7 +f 1403/2342/8 1404/2343/8 1406/2345/8 1405/2344/8 diff --git a/mods/ITEMS/mcl_campfires/models/mcl_campfires_campfire1.mtl b/mods/ITEMS/mcl_campfires/models/mcl_campfires_campfire1.mtl deleted file mode 100644 index 7355efe9f..000000000 --- a/mods/ITEMS/mcl_campfires/models/mcl_campfires_campfire1.mtl +++ /dev/null @@ -1,35 +0,0 @@ -# Blender MTL File: 'campfire.blend' -# Material Count: 3 - -newmtl Material.001 -Ns 96.078431 -Ka 1.000000 1.000000 1.000000 -Kd 0.640000 0.640000 0.640000 -Ks 0.500000 0.500000 0.500000 -Ke 0.000000 0.000000 0.000000 -Ni 1.000000 -d 1.000000 -illum 2 -map_Kd G:\minetest-0.4.16-win641\textures\Pixel Perfection v4.0\mcl_campfire_fire.png - -newmtl none -Ns 96.078431 -Ka 1.000000 1.000000 1.000000 -Kd 0.640000 0.640000 0.640000 -Ks 0.500000 0.500000 0.500000 -Ke 0.000000 0.000000 0.000000 -Ni 1.000000 -d 1.000000 -illum 2 -map_Kd \home\nathan\Downloads\mcl_campfire_log.png - -newmtl none_NONE -Ns 96.078431 -Ka 1.000000 1.000000 1.000000 -Kd 0.640000 0.640000 0.640000 -Ks 0.500000 0.500000 0.500000 -Ke 0.000000 0.000000 0.000000 -Ni 1.000000 -d 1.000000 -illum 2 -map_Kd \\home\\nathan\\Downloads\\mcl_campfire_log.png diff --git a/mods/ITEMS/mcl_campfires/models/mcl_campfires_campfire1.obj b/mods/ITEMS/mcl_campfires/models/mcl_campfires_campfire1.obj deleted file mode 100644 index 92a377303..000000000 --- a/mods/ITEMS/mcl_campfires/models/mcl_campfires_campfire1.obj +++ /dev/null @@ -1,248 +0,0 @@ -# Blender v2.78 (sub 0) OBJ File: 'campfire.blend' -# www.blender.org -mtllib campfire1.mtl -o nodebox4.005_nodebox4.006 -v 0.243779 -0.499707 -0.497529 -v 0.493779 -0.499707 -0.497421 -v 0.493779 -0.249707 -0.497421 -v 0.243779 -0.249707 -0.497529 -v 0.243349 -0.499707 0.502471 -v 0.493349 -0.499707 0.502578 -v 0.493349 -0.249707 0.502578 -v 0.243349 -0.249707 0.502471 -v 0.493779 -0.499707 -0.497421 -v 0.493779 -0.249707 -0.497421 -v 0.493349 -0.499707 0.502578 -v 0.493349 -0.249707 0.502578 -vt -0.0000 0.7500 -vt -0.0000 0.5000 -vt 0.2500 0.5000 -vt 0.2500 0.7500 -vt -0.0000 0.7500 -vt -0.0000 0.5000 -vt 0.2500 0.5000 -vt 0.2500 0.7500 -vt 1.0000 0.7500 -vt 1.0000 1.0000 -vt 0.0000 1.0000 -vt 1.0000 1.0000 -vt 0.0000 1.0000 -vt 1.0000 0.7500 -vt 1.0000 1.0000 -vt 0.0000 1.0000 -vt -0.0000 0.7500 -vt 1.0000 0.7500 -vt 1.0000 1.0000 -vt 0.0000 1.0000 -vt -0.0000 0.7500 -vn -0.0004 0.0000 1.0000 -vn 1.0000 -0.0000 0.0004 -vn -0.0000 -1.0000 0.0000 -usemtl none -s off -f 1/1/1 2/2/1 3/3/1 4/4/1 -f 5/5/1 6/6/1 7/7/1 8/8/1 -f 1/9/2 4/10/2 8/11/2 5/5/2 -f 1/9/3 2/12/3 6/13/3 5/5/3 -f 4/14/3 3/15/3 7/16/3 8/17/3 -f 9/18/2 10/19/2 12/20/2 11/21/2 -o nodebox4.004_nodebox4.005 -v -0.500021 -0.499707 -0.497848 -v -0.250021 -0.499707 -0.497741 -v -0.250021 -0.249707 -0.497741 -v -0.500021 -0.249707 -0.497848 -v -0.500451 -0.499707 0.502152 -v -0.250451 -0.499707 0.502259 -v -0.250451 -0.249707 0.502259 -v -0.500451 -0.249707 0.502152 -v -0.250021 -0.499707 -0.497741 -v -0.250021 -0.249707 -0.497741 -v -0.250451 -0.499707 0.502259 -v -0.250451 -0.249707 0.502259 -vt -0.0000 0.7500 -vt -0.0000 0.5000 -vt 0.2500 0.5000 -vt 0.2500 0.7500 -vt -0.0000 0.7500 -vt -0.0000 0.5000 -vt 0.2500 0.5000 -vt 0.2500 0.7500 -vt 1.0000 0.7500 -vt 1.0000 1.0000 -vt 0.0000 1.0000 -vt 1.0000 1.0000 -vt 0.0000 1.0000 -vt 1.0000 0.7500 -vt 1.0000 1.0000 -vt 0.0000 1.0000 -vt -0.0000 0.7500 -vt 1.0000 0.7500 -vt 1.0000 1.0000 -vt 0.0000 1.0000 -vt -0.0000 0.7500 -vn -0.0004 0.0000 1.0000 -vn 1.0000 -0.0000 0.0004 -vn -0.0000 -1.0000 0.0000 -usemtl none -s off -f 13/22/4 14/23/4 15/24/4 16/25/4 -f 17/26/4 18/27/4 19/28/4 20/29/4 -f 13/30/5 16/31/5 20/32/5 17/26/5 -f 13/30/6 14/33/6 18/34/6 17/26/6 -f 16/35/6 15/36/6 19/37/6 20/38/6 -f 21/39/5 22/40/5 24/41/5 23/42/5 -o nodebox4.001_nodebox4.004 -v 0.500000 -0.312500 -0.493800 -v 0.500000 -0.312500 -0.243800 -v 0.500000 -0.062500 -0.243800 -v 0.500000 -0.062500 -0.493800 -v -0.500000 -0.312500 -0.493800 -v -0.500000 -0.312500 -0.243800 -v -0.500000 -0.062500 -0.243800 -v -0.500000 -0.062500 -0.493800 -v 0.500000 -0.312500 -0.243800 -v 0.500000 -0.062500 -0.243800 -v -0.500000 -0.312500 -0.243800 -v -0.500000 -0.062500 -0.243800 -vt 0.0000 0.7500 -vt 0.0000 0.5000 -vt 0.2500 0.5000 -vt 0.2500 0.7500 -vt 0.0000 0.7500 -vt 0.0000 0.5000 -vt 0.2500 0.5000 -vt 0.2500 0.7500 -vt 1.0000 0.7500 -vt 1.0000 1.0000 -vt 0.0000 1.0000 -vt 1.0000 1.0000 -vt 0.0000 1.0000 -vt 1.0000 0.7500 -vt 1.0000 1.0000 -vt 0.0000 1.0000 -vt 0.0000 0.7500 -vt 1.0000 0.7500 -vt 1.0000 1.0000 -vt 0.0000 1.0000 -vt 0.0000 0.7500 -vn -1.0000 0.0000 0.0000 -vn 0.0000 -0.0000 1.0000 -vn 0.0000 -1.0000 -0.0000 -usemtl none -s off -f 25/43/7 26/44/7 27/45/7 28/46/7 -f 29/47/7 30/48/7 31/49/7 32/50/7 -f 25/51/8 28/52/8 32/53/8 29/47/8 -f 25/51/9 26/54/9 30/55/9 29/47/9 -f 28/56/9 27/57/9 31/58/9 32/59/9 -f 33/60/8 34/61/8 36/62/8 35/63/8 -o Plane -v -0.311754 -0.438770 -0.196249 -v 0.276360 -0.438621 0.247948 -v -0.311276 0.135801 -0.196634 -v 0.276838 0.135950 0.247562 -v -0.274993 -0.438696 0.270317 -v 0.240407 -0.438696 -0.218656 -v -0.275322 0.135875 0.269969 -v 0.240077 0.135875 -0.219003 -vt 0.0000 0.0000 -vt 1.0000 0.0000 -vt 1.0000 1.0000 -vt 0.0000 1.0000 -vt 0.0000 0.0000 -vt 1.0000 0.0000 -vt 1.0000 1.0000 -vt -0.0000 1.0000 -vn -0.6027 0.0010 0.7980 -vn 0.6883 0.0008 0.7255 -usemtl Material.001 -s off -f 37/64/10 38/65/10 40/66/10 39/67/10 -f 41/68/11 42/69/11 44/70/11 43/71/11 -o nodebox3 -v 0.250000 -0.500000 -0.500000 -v 0.250000 -0.500000 0.500000 -v 0.250000 -0.437500 0.500000 -v 0.250000 -0.437500 -0.500000 -v -0.250000 -0.500000 -0.500000 -v -0.250000 -0.500000 0.500000 -v -0.250000 -0.437500 0.500000 -v -0.250000 -0.437500 -0.500000 -vt 1.0000 0.0000 -vt 1.0000 0.0625 -vt 0.0000 0.0625 -vt 0.0000 0.0000 -vt 1.0000 0.0000 -vt 1.0000 0.0625 -vt 0.0000 0.0625 -vt 0.0000 0.0000 -vt 1.0000 0.4375 -vt 0.0000 0.4375 -vt 0.0001 0.0001 -vt 0.9999 0.0001 -vt 1.0000 0.5000 -vt 0.0000 0.5000 -vt 0.0001 0.0001 -vt 0.0000 0.0000 -vt 0.0000 0.0000 -vt 0.0000 0.0000 -vt 0.0000 0.0000 -vt 0.0000 0.0000 -vt 0.0000 0.0000 -vn 0.0000 0.0000 1.0000 -vn 0.0000 -1.0000 -0.0000 -vn -1.0000 0.0000 0.0000 -usemtl none -s off -f 45/72/12 48/73/12 52/74/12 49/75/12 -f 46/76/12 47/77/12 51/78/12 50/79/12 -f 45/72/13 46/80/13 50/81/13 49/82/13 -f 48/83/13 47/84/13 51/85/13 52/86/13 -usemtl none_NONE -f 45/87/14 46/88/14 47/89/14 48/90/14 -f 49/75/14 50/79/14 51/91/14 52/92/14 -o nodebox4 -v 0.500000 -0.312500 0.250000 -v 0.500000 -0.312500 0.500000 -v 0.500000 -0.062500 0.500000 -v 0.500000 -0.062500 0.250000 -v -0.500000 -0.312500 0.250000 -v -0.500000 -0.312500 0.500000 -v -0.500000 -0.062500 0.500000 -v -0.500000 -0.062500 0.250000 -v 0.500000 -0.312500 0.500000 -v 0.500000 -0.062500 0.500000 -v -0.500000 -0.312500 0.500000 -v -0.500000 -0.062500 0.500000 -vt -0.0000 0.7500 -vt 0.0000 0.5000 -vt 0.2500 0.5000 -vt 0.2500 0.7500 -vt -0.0000 0.7500 -vt -0.0000 0.5000 -vt 0.2500 0.5000 -vt 0.2500 0.7500 -vt 1.0000 0.7500 -vt 1.0000 1.0000 -vt 0.0000 1.0000 -vt 1.0000 1.0000 -vt 0.0000 1.0000 -vt 1.0000 0.7500 -vt 1.0000 1.0000 -vt 0.0000 1.0000 -vt -0.0000 0.7500 -vt 1.0000 0.7500 -vt 1.0000 1.0000 -vt 0.0000 1.0000 -vt -0.0000 0.7500 -vn -1.0000 0.0000 0.0000 -vn 0.0000 -0.0000 1.0000 -vn 0.0000 -1.0000 -0.0000 -usemtl none -s off -f 53/93/15 54/94/15 55/95/15 56/96/15 -f 57/97/15 58/98/15 59/99/15 60/100/15 -f 53/101/16 56/102/16 60/103/16 57/97/16 -f 53/101/17 54/104/17 58/105/17 57/97/17 -f 56/106/17 55/107/17 59/108/17 60/109/17 -f 61/110/16 62/111/16 64/112/16 63/113/16 diff --git a/mods/ITEMS/mcl_campfires/models/mcl_campfires_campfire_lit.obj b/mods/ITEMS/mcl_campfires/models/mcl_campfires_campfire_lit.obj deleted file mode 100644 index a17acc05f..000000000 --- a/mods/ITEMS/mcl_campfires/models/mcl_campfires_campfire_lit.obj +++ /dev/null @@ -1,225 +0,0 @@ -# Blender v2.79 (sub 7) OBJ File: 'campfire.blend' -# www.blender.org -o Plane -v -0.240246 -0.438696 -0.141059 -v 0.205043 -0.438696 0.192756 -v -0.239959 0.135875 -0.141442 -v 0.205331 0.135875 0.192373 -v -0.216088 -0.438696 0.214432 -v 0.181502 -0.438696 -0.162771 -v -0.216417 0.135875 0.214085 -v 0.181172 0.135875 -0.163119 -vt 0.000000 0.000000 -vt 1.000000 0.000000 -vt 1.000000 1.000000 -vt 0.000000 1.000000 -vt 0.000000 0.000000 -vt 1.000000 0.000000 -vt 1.000000 1.000000 -vt -0.000000 1.000000 -vn -0.5998 0.0008 0.8001 -vn 0.6883 0.0008 0.7255 -g Plane_Plane_Material.001 -s off -f 1/1/1 2/2/1 4/3/1 3/4/1 -f 5/5/2 6/6/2 8/7/2 7/8/2 -o nodebox3 -v 0.250000 -0.500000 -0.500000 -v 0.250000 -0.500000 0.500000 -v 0.250000 -0.437500 0.500000 -v 0.250000 -0.437500 -0.500000 -v -0.250000 -0.500000 -0.500000 -v -0.250000 -0.500000 0.500000 -v -0.250000 -0.437500 0.500000 -v -0.250000 -0.437500 -0.500000 -v 0.243779 -0.499707 -0.497529 -v 0.493779 -0.499707 -0.497421 -v 0.493779 -0.249707 -0.497421 -v 0.243779 -0.249707 -0.497529 -v 0.243349 -0.499707 0.502471 -v 0.493349 -0.499707 0.502579 -v 0.493349 -0.249707 0.502578 -v 0.243349 -0.249707 0.502471 -v 0.493779 -0.499707 -0.497421 -v 0.493779 -0.249707 -0.497421 -v 0.493349 -0.499707 0.502579 -v 0.493349 -0.249707 0.502578 -v -0.500021 -0.499707 -0.497848 -v -0.250021 -0.499707 -0.497741 -v -0.250021 -0.249707 -0.497741 -v -0.500021 -0.249707 -0.497848 -v -0.500451 -0.499707 0.502152 -v -0.250451 -0.499707 0.502259 -v -0.250451 -0.249707 0.502259 -v -0.500451 -0.249707 0.502152 -v -0.250021 -0.499707 -0.497741 -v -0.250021 -0.249707 -0.497741 -v -0.250451 -0.499707 0.502259 -v -0.250451 -0.249707 0.502259 -v 0.500000 -0.312500 -0.493800 -v 0.500000 -0.312500 -0.243800 -v 0.500000 -0.062500 -0.243800 -v 0.500000 -0.062500 -0.493800 -v -0.500000 -0.312500 -0.493800 -v -0.500000 -0.312500 -0.243800 -v -0.500000 -0.062500 -0.243800 -v -0.500000 -0.062500 -0.493800 -v 0.500000 -0.312500 -0.243800 -v 0.500000 -0.062500 -0.243800 -v -0.500000 -0.312500 -0.243800 -v -0.500000 -0.062500 -0.243800 -v 0.500000 -0.312500 0.250000 -v 0.500000 -0.312500 0.500000 -v 0.500000 -0.062500 0.500000 -v 0.500000 -0.062500 0.250000 -v -0.500000 -0.312500 0.250000 -v -0.500000 -0.312500 0.500000 -v -0.500000 -0.062500 0.500000 -v -0.500000 -0.062500 0.250000 -v 0.500000 -0.312500 0.500000 -v 0.500000 -0.062500 0.500000 -v -0.500000 -0.312500 0.500000 -v -0.500000 -0.062500 0.500000 -vt 0.999982 0.000018 -vt 1.000000 0.062500 -vt 0.000000 0.062500 -vt 0.000018 0.000018 -vt 0.999982 0.000018 -vt 1.000000 0.062500 -vt 0.000000 0.062500 -vt 0.000018 0.000018 -vt 1.000000 0.437500 -vt 0.000000 0.437500 -vt 0.000071 0.000071 -vt 0.999929 0.000071 -vt 1.000000 0.500000 -vt 0.000000 0.500000 -vt 0.000071 0.000071 -vt -0.000000 0.750000 -vt -0.000000 0.500000 -vt 0.250000 0.500000 -vt 0.250000 0.750000 -vt -0.000000 0.750000 -vt -0.000000 0.500000 -vt 0.250000 0.500000 -vt 0.250000 0.750000 -vt 1.000000 0.750000 -vt 1.000000 1.000000 -vt 0.000000 1.000000 -vt 1.000000 1.000000 -vt 0.000000 1.000000 -vt 1.000000 0.750000 -vt 1.000000 1.000000 -vt 0.000000 1.000000 -vt -0.000000 0.750000 -vt 1.000000 0.750000 -vt 1.000000 1.000000 -vt 0.000000 1.000000 -vt -0.000000 0.750000 -vt -0.000000 0.750000 -vt -0.000000 0.500000 -vt 0.250000 0.500000 -vt 0.250000 0.750000 -vt -0.000000 0.750000 -vt -0.000000 0.500000 -vt 0.250000 0.500000 -vt 0.250000 0.750000 -vt 1.000000 0.750000 -vt 1.000000 1.000000 -vt 0.000000 1.000000 -vt 1.000000 1.000000 -vt 0.000000 1.000000 -vt 1.000000 0.750000 -vt 1.000000 1.000000 -vt 0.000000 1.000000 -vt -0.000000 0.750000 -vt 1.000000 0.750000 -vt 1.000000 1.000000 -vt 0.000000 1.000000 -vt -0.000000 0.750000 -vt 0.000000 0.750000 -vt 0.000000 0.500000 -vt 0.250000 0.500000 -vt 0.250000 0.750000 -vt 0.000000 0.750000 -vt 0.000000 0.500000 -vt 0.250000 0.500000 -vt 0.250000 0.750000 -vt 1.000000 0.750000 -vt 1.000000 1.000000 -vt 0.000000 1.000000 -vt 1.000000 1.000000 -vt 0.000000 1.000000 -vt 1.000000 0.750000 -vt 1.000000 1.000000 -vt 0.000000 1.000000 -vt 0.000000 0.750000 -vt 1.000000 0.750000 -vt 1.000000 1.000000 -vt 0.000000 1.000000 -vt 0.000000 0.750000 -vt -0.000000 0.750000 -vt 0.000000 0.500000 -vt 0.250000 0.500000 -vt 0.250000 0.750000 -vt -0.000000 0.750000 -vt -0.000000 0.500000 -vt 0.250000 0.500000 -vt 0.250000 0.750000 -vt 1.000000 0.750000 -vt 1.000000 1.000000 -vt 0.000000 1.000000 -vt 1.000000 1.000000 -vt 0.000000 1.000000 -vt 1.000000 0.750000 -vt 1.000000 1.000000 -vt 0.000000 1.000000 -vt -0.000000 0.750000 -vt 1.000000 0.750000 -vt 1.000000 1.000000 -vt 0.000000 1.000000 -vt -0.000000 0.750000 -vt 0.000000 0.000000 -vt 0.000000 0.000000 -vt 0.000000 0.000000 -vt 0.000000 0.000000 -vt 0.000000 0.000000 -vt 0.000000 0.000000 -vn 0.0000 0.0000 1.0000 -vn 0.0000 -1.0000 -0.0000 -vn -0.0004 0.0000 1.0000 -vn 1.0000 -0.0000 0.0004 -vn -1.0000 0.0000 0.0000 -g nodebox3_nodebox3_none -s off -f 9/9/3 12/10/3 16/11/3 13/12/3 -f 10/13/3 11/14/3 15/15/3 14/16/3 -f 9/9/4 10/17/4 14/18/4 13/19/4 -f 12/20/4 11/21/4 15/22/4 16/23/4 -f 17/24/5 18/25/5 19/26/5 20/27/5 -f 21/28/5 22/29/5 23/30/5 24/31/5 -f 17/32/6 20/33/6 24/34/6 21/28/6 -f 17/32/4 18/35/4 22/36/4 21/28/4 -f 20/37/4 19/38/4 23/39/4 24/40/4 -f 25/41/6 26/42/6 28/43/6 27/44/6 -f 29/45/5 30/46/5 31/47/5 32/48/5 -f 33/49/5 34/50/5 35/51/5 36/52/5 -f 29/53/6 32/54/6 36/55/6 33/49/6 -f 29/53/4 30/56/4 34/57/4 33/49/4 -f 32/58/4 31/59/4 35/60/4 36/61/4 -f 37/62/6 38/63/6 40/64/6 39/65/6 -f 41/66/7 42/67/7 43/68/7 44/69/7 -f 45/70/7 46/71/7 47/72/7 48/73/7 -f 41/74/3 44/75/3 48/76/3 45/70/3 -f 41/74/4 42/77/4 46/78/4 45/70/4 -f 44/79/4 43/80/4 47/81/4 48/82/4 -f 49/83/3 50/84/3 52/85/3 51/86/3 -f 53/87/7 54/88/7 55/89/7 56/90/7 -f 57/91/7 58/92/7 59/93/7 60/94/7 -f 53/95/3 56/96/3 60/97/3 57/91/3 -f 53/95/4 54/98/4 58/99/4 57/91/4 -f 56/100/4 55/101/4 59/102/4 60/103/4 -f 61/104/3 62/105/3 64/106/3 63/107/3 -g nodebox3_nodebox3_none_NONE -f 9/108/7 10/109/7 11/110/7 12/111/7 -f 13/12/7 14/16/7 15/112/7 16/113/7 diff --git a/textures/mcl_campfires_campfire_fire.png b/textures/mcl_campfires_campfire_fire.png index 3894744c6c690a3fe308a02570aa4946daf3becf..f0cab90e56cf3f3f694480941533a3624eaed274 100644 GIT binary patch literal 670 zcmV;P0%84$P)&c7E(gUJC9V7qS8RxNEvA%4WtGK1qOy;{nU)HwP3jOacI2S)r_R|wl$5P z_m_Q3j<45;y{_%nquda6MH&D7e7+HY)uOYy0RUjIzGD`wYoQE&JU#wjWqAL7^8hG= z08md~-|I7Gpgk_|Q)B8G006eG`ZB`4uj%I*xi$byHv`antsr0&#_H+o0x`7%fDr}2 zZm}`sQ1NJis20Eiw2{z}B4!@20zfcAD83f}XaH41)(D6#r~oV=n0VL)xM%Y}(=h;8 z;zASv^dQqQ09o|F3IGHNG(o#8n{lctNjyCtH=F{%X;hKbxM~7KLz{61z{#mikbo1E z4cmDDPkh9N*9QRKvmDd(+@c3o0Pve#4@{k4sQBIhRxD`S6-hnTHjDz`(u}rk?DYW#!$peG1Cyqo zCQG&olGqIJ*@4LRivwUiU}Hm$idw3-=>e8x>;`N5e#M5i_C06A%7zv_5Cfoej5WY# z3fuJn8yY=u8aA9Ua?GxXl#nV8M1+XG++eE_oC1KI2UZEHzT9AG-ygkSU@6gPwOmis z*~|5D02~LR{en3|Fm-|G3`AyuU;B%^Ul0et2@03&ZG{T%8L%R1XGHFnC@u5(@^=68 zX?o3$+qdRXxt?d^x&YYk^%+`#0kp0G)dK*aCu#UUf0O>6<`%QiJ^%m!07*qoM6N<$ Ef&%R)FaQ7m literal 474 zcmV<00VV#4P)1RyS zjD@?wZGrjtBp(x>b@KTmprc_1nV&N}hney&tm%=;!4qhmf?6S{30E_-0OeCn^;teg z!}TKNdVz)=6pt>&@)#?MMZ1!!qo<^yXOhmqtcoe0I-b_+LoPB8)tJg;H^A&|#{UKDZiVX4{*hExfLXe{E_TChe<6zM0+!J3|5R3hnQMlc5i@-sc4u{geq48E zZS+lIfv1aUc)2->^7e3CeZb#70BcsNH?DvzAaMD&6$S23_o9#GU-`Rn1qiC)?j&q% zjzX`u6oqtDsc({%)vYM>Q9YRgKDgW=i;#Anic%6q^9Igi5-+%-vI3ep3J6%i zr8Z0qI033YWK0ql5Y=RXW=I>rF2$6rtiYe+1Nga&56JwD@BvcLBcJGRj1MRkoe!W) z<^#3y0r|HzKH%$n<^!$q0RgG*Yk+Ufz7^NX2b_qMy*I)KeAa#_;k3ki?R>z=hzBL# zGar~wK0rp~`+5-09{}h(KHzsmbHfKd0dRHT#4RU)o&W#<07*qoM6N<$f;l%3jQ{`u literal 412 zcmV;N0b~A&P)}v_PEP6E>GbcdJbPSoN0lhEL0Hr9G3mQZ-pt4zI zfyfr@R#~(Nd$b$_qGTZ=HCi8oOGgU1aP(}wXGZVH%p4=Lz4eHj2k#!H2>8LH0u(>? z@QVlddk?0mvIP#J36NZp>%qeo%Vga>Xd%GAdjS9cc=X`SBkmqF`Rt(p^|6Qe>Y-0O z@Zv$LWZgU%P|2c90NFycWV%dHKOQb2A~{+gL%4b1t;aXrQyt}`6jV$A0000>AgAc%~tvAtN#A`lQY~;00001bW%=J06^y0W&i*J8c9S!R5;6Bl1p}@ zFc3wNoCU~`cx(&Y3$ao@8f+AGM^6tE zCE`rXz4Pupz6NJM#jFY!7t`y;!iR_xF9Mxp@AO)JEf zMBaN#X?cg#T@=7Vh8VhfLg$B=ehy$Jp1{05@WMT^|6jsT8&576L%cO?Spgk)2jpyV z4kl2v2AGaa29{o$gB>-+fJO2L(GXANX1qmVoMTr4&;3hfzrJm9QYRkWBwKiYqVp>8 zc)qFt2cDp@S1SDk=95P`VnTIni}(|=Xn%S?Uum^qd0@1z8pFIkf6@q#`b{7gEFE46tXdw1whq?yyZ&X5OxvP& zEcT^ViKpHtaoSOx0(DNJ=^MV16*C7HrWE{U7(;_43^6zy*zfsHJQ9|b_D9(DVbxEJ zQnQfdYci})H~G2dEfZxU_@zZc)qU!o9VS|Jp$>+Jatjlrrd?PlGQqgCb(Oo0000rLU}^`*vW`KcacSLNZfV+Z zVxDJEv(wHL;%UDZZVlzLRr<7LQbXOaZhEgoICokVWXfszwny$5;@6SwLhhTlCfzin{wq>Kdt+y=5tAO#bl!> zk8)E{!|1+_rCwGx!3(ul`R1Flsr?mY+21=QPio!)dzW0p3yRW)jz9-7c)I$ztaD0e F0sx!vSXux8 diff --git a/textures/mcl_campfires_soul_campfire_fire.png b/textures/mcl_campfires_soul_campfire_fire.png index 0f5580e5c00ceeda63d708d48aaf9c696eda575e..1f87329c0573d88362fcea84ee4365607b26d287 100644 GIT binary patch literal 689 zcmV;i0#5yjP)B-tXnJUAmQNkWNME{ORlaLI7rqjyeqnz&bp3LLCL_S~xmEg;nbwg71)bf$=r2dDrn7+EO3768)#UJX$rplv}9fC2)E2dBWE z(dHlN*Z@%Cf)qg0gFwd(5JeA605m~jnjl)1Wn0T7QK#oQ4NCx6Mip^8cbdSWA+2)+ zfXOLOkW^0aY#8qk)Hgn5!^a0;a}RQCNY5#HUlLJ_&$E#}I_LO33KA0>c>@NF!iGk@L%o1a$HVynhBlM}Kx<|w z+pzrs1k;%msRuGmUnNWCCa9_rz_SCA?I#D&=>ZlSVpQ~2JxvdwB)I3_TzN;OW@bKzF7vTn|7;sRx!}!)z(X_| zH&Dv=r}qmO7R}(6`xA9^yIu|eeIjMOAkPq_FCZNO%}F}A_9wYtpa%d63R?CwqXKIN zsEEQD5vwJ`kv=$I9#6?|n%-x};al_6u7}ZhTmW6YVE=Af00D%q0j~#|7;z_Q@PGaQ X3$!9wwp0Ux00000NkvXXu0mjfAKx9% literal 454 zcmeAS@N?(olHy`uVBq!ia0vp^0zllr!VDxo?EWGMq=W)|LR^6~V`nep?1hZ`jws%L zTJh`Og!RX}K%yl!o*;duJVM=9R7PMABSQoq3mcQb$AA2Zp0Y>W*S2aT^Cs@iQp)vV5-6P^x#()R zi+^r|EYLaP99$Fp*`2ngC*zkQt>=oJI7rQwb7!ue)Ze#qx$QU6Jzt7fZVUPKt7bXwWZgT`~<#xF8=CVlD zE>H+2r)EEvhfox^iU#Mu- z^5+)^BgeL{og1vwC(er&-1~oRE{DT~VkV%HgvJF5FPIhAaX7qKepcYj=8jdbZogYJ ne{~jz`D>sDo}Co2EAju&*v=7q>Z{&*8IX~lu6{1-oD!Mu(Gt#AF=X3to)9clg)`|#!--D zW@OF4C7Dbn_nn;F&h6>QT0rC-&LfS}~xL;ijYc!LC_c zTy=}1#TXc(k8gPAKcHvtFc0aRC@q+dCt( zw%#|r-hv~hBU*d|EiG?2;vDpo380I+bh8!-=_siPAt@;Sixxn090Dj)2*LD2%XzQ{ z<|J_$eb2?o(2>voFy<{m=E+=u1z}b)QHBgq_PI%cV2Nk}pap|Ww_DdrEHEe;FLXt; z0MMKQfH8s#V>B_DhXA#6m@!FQz^G;xKtqm^u~IoDqXqbLcz}Mc!UHgWGkCzKphkX( z{-*E%Qc>{$g~@oJK0ILk+ZrCw{XOG>_V9pZ6aKK&0Zm5j>z; z>!pOZCBD~>2Lz00Q1W}m1G9+-m=U=?kn01vK9KQ1t`Fq;K&}t`Up&A-tHJ|(uOAOE z@;xSK2M<_gU+M!H57dPR=-YPjfZuR39w77f@POP0!WCVQ;^cV1*ZvB4paKzbW1_%m z@j&_97lw+80vZXEMoTO#Ff%haH8wpvJVZf4NlZXDSw}u*PDFB6M|D?5d|gS0WKD@> zO_Oa>pm$Z@nk}6G0004WQchCybAP+&u)s)`Le&gZS7( zFCND4Jx~IhL}S1~n^Ys!9y}zX321i@h)(109`^q~9zAgL$h!vwJbN$=e(XWKdhinu zzjy#_6mK3#vrz;E+Z9QO6x0NRKOSmyW?@7hgT8tAt;aWG)) Date: Wed, 5 Jul 2023 08:44:02 -0600 Subject: [PATCH 179/982] Add better smoke particles --- mods/ITEMS/mcl_campfires/api.lua | 2 +- textures/mcl_campfires_particle_1.png | Bin 0 -> 105 bytes textures/mcl_campfires_particle_10.png | Bin 0 -> 239 bytes textures/mcl_campfires_particle_11.png | Bin 0 -> 286 bytes textures/mcl_campfires_particle_12.png | Bin 0 -> 336 bytes textures/mcl_campfires_particle_2.png | Bin 0 -> 186 bytes textures/mcl_campfires_particle_3.png | Bin 0 -> 276 bytes textures/mcl_campfires_particle_4.png | Bin 0 -> 299 bytes textures/mcl_campfires_particle_5.png | Bin 0 -> 275 bytes textures/mcl_campfires_particle_6.png | Bin 0 -> 301 bytes textures/mcl_campfires_particle_7.png | Bin 0 -> 386 bytes textures/mcl_campfires_particle_8.png | Bin 0 -> 382 bytes textures/mcl_campfires_particle_9.png | Bin 0 -> 399 bytes 13 files changed, 1 insertion(+), 1 deletion(-) create mode 100644 textures/mcl_campfires_particle_1.png create mode 100644 textures/mcl_campfires_particle_10.png create mode 100644 textures/mcl_campfires_particle_11.png create mode 100644 textures/mcl_campfires_particle_12.png create mode 100644 textures/mcl_campfires_particle_2.png create mode 100644 textures/mcl_campfires_particle_3.png create mode 100644 textures/mcl_campfires_particle_4.png create mode 100644 textures/mcl_campfires_particle_5.png create mode 100644 textures/mcl_campfires_particle_6.png create mode 100644 textures/mcl_campfires_particle_7.png create mode 100644 textures/mcl_campfires_particle_8.png create mode 100644 textures/mcl_campfires_particle_9.png diff --git a/mods/ITEMS/mcl_campfires/api.lua b/mods/ITEMS/mcl_campfires/api.lua index 4d8def36b..9d7766822 100644 --- a/mods/ITEMS/mcl_campfires/api.lua +++ b/mods/ITEMS/mcl_campfires/api.lua @@ -324,7 +324,7 @@ function mcl_campfires.generate_smoke(pos, haybale) minetest.add_particle({ pos = vector.offset(pos, math.random(-0.5, 0.5), 0, math.random(-0.5, 0.5)), velocity = vector.new(0, 1, 0), - texture = "mcl_particles_smoke.png", + texture = "mcl_campfires_particle_" .. math.random(1, 12) .. ".png", size = 10, acceleration = vector.new(0, 0.5, 0), collisiondetection = true, diff --git a/textures/mcl_campfires_particle_1.png b/textures/mcl_campfires_particle_1.png new file mode 100644 index 0000000000000000000000000000000000000000..c7f77ea7e9bafcccbe59d34e373a38b45836b97d GIT binary patch literal 105 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`2A(dCAr`&K2@i3j5a$97 pFa~0FqBSEK!U4phK+K3w9RO+fSGdo{y}SQ) literal 0 HcmV?d00001 diff --git a/textures/mcl_campfires_particle_11.png b/textures/mcl_campfires_particle_11.png new file mode 100644 index 0000000000000000000000000000000000000000..ab2f3070ec584ba5b936ededceb93fa971c6ca76 GIT binary patch literal 286 zcmV+(0pb3MP)uc(HD$HR4m9gU_A^J^l2?wAjC)iC~cZHHnSU3ioAc)O(c=kQpCT}<- zl&tZsBr7P3)3Av~rb(t@&;UA|Uzwti(AV`d3hJ_gEbJZ2BCFdagY%2lY*G*oprH1# zfU9awXKW)*?r9p~{Vj|_F+oE5AFwIcYBaWR1pg(>*cp?#((q%7IJ9Agf-0oM^+6Hx k;yObM9wligKst1 z8w)e60G|O3KztsEUq*+A|Bna>0c!-|_~>Y`L2*%0M}agaE(6vB@pF)qLjwc<`+Ix; zkBNu?YXlnj3n+FEDE1R*U@TBf3`KK*x3>*Y!49B?b76sjFGKwO!3G5S`u-30_x}r| z{{rcUL4JM)8R+BlAISd?)bKkbAmBI10HBvZ-s8a;20&Yl zf_!~H0yTp){0FkZt^nHn1!&0K$k0$VywM1>kp+mS0}bd83kv!Vbjd%U3tj@*?Qzl3 i>O?0bpiPW)OSJ%r#hYm>YGzvi0000sw8;C8i8WI&2 zCLieIbHUrq?H>?-17Z`P;)@{fB*eu0j}8lic`X31cYqoNfS3ow4i66A6A=;uwmm#3 z=zmyX;3XiNhv=~J^Yr`z@=k!a_kWKrgKTX#`=QL05n@3&{x#s7ZwC asTKhEad>P3fb3cT0000G{-Qbo&m$SM8;C`4Y32apTS$tL z@nxth{zDCvz-E8}4$c3OTy-1D?#E_;2oQhAW57Qob}EJe-fnI@L4JN;g8lumY5t4G z{|&?z=myvT@qZ8w4G8!b6A|%0Iz0S;Vr(o(!%q;M5EJu1IxGw(7J$taQtu x4#ad&?Tq*+Kxoj?r(`OLo7}wCrH#OXzKYfc8D{7 ztW%iBcI0AAYnqG7)ih zcJVmz|3U*p%FdfNcsLjz{a26?l;J6U_1{5${(pl)0XC^m;u`7ArV5Q*UI|>awzh#L zhc@)@{;jzulW|3cv{|pmj>ZX$Ob&ZQJKi&W^jE0kKJvZchoyi&dy?Fu$!4BiCm9*y X*50@H;`b~b=t~AqS3j3^P6*LHefnF#fh=8*u-Wa8xR8$1cm`z0Wup0 zo{bU?KJM;^yxrXX1L^;Mo}T~Xqoc8E1c?Lv{};%%K`{WR`76i(7zX+gs{t_)5g0YuW>C*bo{-00000NkvXXu0mjf@TGQ# literal 0 HcmV?d00001 diff --git a/textures/mcl_campfires_particle_7.png b/textures/mcl_campfires_particle_7.png new file mode 100644 index 0000000000000000000000000000000000000000..c9b14d56c3bd5453c56b72e031dfafe9c70a21ba GIT binary patch literal 386 zcmV-|0e$|7P) zJ5Iwu5Qbgk5EK-tC=mrkPLLNEzv8#OkThI@f`T(p08+{v0SSbJK%%9{5jX@5BFM}C zj~ukIfHYKC`n2oWnNKrgS^w{wDAfit@CYuz1GoYA;2LbK6TATZ3vkjn z66Tg^dS?nQ8O-BYl04hiKH!~&BiEHP^gI@d0G(c$f`UQpKqL_o0~GL{1i@DqW4v<& z8B3|@${zN6y(hLO5}fQHFxsYoJ7ElO6-GQ>5$tulZ_aQig5@|Av1qw{woeiFgZu?( zn}T`+hG}{MXT&}n!WOJ7 zi#Oq=WMH^Q`~=s;4={!ioR`HFIDmtF!At@r$swM}ZWAz9LXys!e~STQX=Uw- z5pKTx0faU1;n^6K4YhhqWi^7uPP6HJdk+w-!4*8h6vpsY#3Ps$=h}~#N=Ga9BRDNa c-B`~10LjJd`EhtCxc~qF07*qoM6N<$f|cE-I{*Lx literal 0 HcmV?d00001 diff --git a/textures/mcl_campfires_particle_9.png b/textures/mcl_campfires_particle_9.png new file mode 100644 index 0000000000000000000000000000000000000000..07eb465e35bad65e97d15638e2d2f81fea2ba2c5 GIT binary patch literal 399 zcmV;A0dW3_P) Date: Sat, 2 Sep 2023 01:39:11 +0100 Subject: [PATCH 180/982] Convert campfire particle spawning from ABM to particle spawner --- mods/ITEMS/mcl_campfires/api.lua | 139 +++++++++++++++++++++---------- 1 file changed, 95 insertions(+), 44 deletions(-) diff --git a/mods/ITEMS/mcl_campfires/api.lua b/mods/ITEMS/mcl_campfires/api.lua index 9d7766822..137fc9a0c 100644 --- a/mods/ITEMS/mcl_campfires/api.lua +++ b/mods/ITEMS/mcl_campfires/api.lua @@ -161,6 +161,75 @@ function mcl_campfires.cook_item(pos, elapsed) end end +local function destroy_particle_spawner (pos) + local meta = minetest.get_meta(pos) + local part_spawn_id = meta:get_int("particle_spawner_id") + if part_spawn_id and part_spawn_id > 0 then + minetest.delete_particlespawner(part_spawn_id) + end +end + + +local function create_smoke_partspawner (pos, constructor) + if not constructor then + destroy_particle_spawner (pos) + end + + local haybale = false + + local node_below = vector.offset(pos, 0, -1, 0) + if minetest.get_node(node_below).name == "mcl_farming:hay_block" then + haybale = true + end + + local smoke_timer + + if haybale then + smoke_timer = 8 + else + smoke_timer = 4.75 + end + + local spawner_id = minetest.add_particlespawner({ + amount = 3, + time = 0, + minpos = vector.add(pos, vector.new(-0.25, 0, -0.25)), + maxpos = vector.add(pos, vector.new( 0.25, 0, 0.25)), + minvel = vector.new(-0.2, 0.5, -0.2), + maxvel = vector.new(0.2, 1, 0.2), + minacc = vector.new(0, 0.5, 0), + maxacc = vector.new(0, 0.5, 0), + minexptime = smoke_timer, + maxexptime = smoke_timer * 2, + minsize = 6, + maxsize = 8, + collisiondetection = true, + vertical = false, + texture = "mcl_campfires_particle_1.png", + texpool = { + "mcl_campfires_particle_1.png"; + { name = "mcl_campfires_particle_1.png", fade = "out" }, + { name = "mcl_campfires_particle_2.png" }, + { name = "mcl_campfires_particle_3.png" }, + { name = "mcl_campfires_particle_4.png" }, + { name = "mcl_campfires_particle_5.png" }, + { name = "mcl_campfires_particle_6.png" }, + { name = "mcl_campfires_particle_7.png" }, + { name = "mcl_campfires_particle_8.png" }, + { name = "mcl_campfires_particle_9.png" }, + { name = "mcl_campfires_particle_10.png" }, + { name = "mcl_campfires_particle_11.png" }, + { name = "mcl_campfires_particle_11.png" }, + { name = "mcl_campfires_particle_12.png" }, + } + }) + + local meta = minetest.get_meta(pos) + meta:set_int("particle_spawner_id", spawner_id) +end + + + function mcl_campfires.register_campfire(name, def) -- Define Campfire minetest.register_node(name, { @@ -207,22 +276,25 @@ function mcl_campfires.register_campfire(name, def) drawtype = "mesh", mesh = "mcl_campfires_campfire.obj", tiles = { - {name=def.fire_texture, - animation={ - type="vertical_frames", - aspect_w=32, - aspect_h=16, - length=2.0 - }} + { + name=def.fire_texture, + animation={ + type="vertical_frames", + aspect_w=32, + aspect_h=16, + length=2.0 + }} }, - overlay_tiles = {{ - name=def.lit_logs_texture, - animation = { - type = "vertical_frames", - aspect_w = 32, - aspect_h = 16, - length = 2.0, - }}, + overlay_tiles = { + { + name=def.lit_logs_texture, + animation = { + type = "vertical_frames", + aspect_w = 32, + aspect_h = 16, + length = 2.0, + } + }, }, use_texture_alpha = "clip", groups = { handy=1, axey=1, material_wood=1, lit_campfire=1 }, @@ -232,6 +304,10 @@ function mcl_campfires.register_campfire(name, def) local meta = minetest.get_meta(pos) local inv = meta:get_inventory() inv:set_size("main", 4) + create_smoke_partspawner (pos, true) + end, + on_destruct = function(pos) + destroy_particle_spawner (pos) end, on_rightclick = function (pos, node, player, itemstack, pointed_thing) local meta = minetest.get_meta(pos) @@ -312,37 +388,12 @@ minetest.register_globalstep(function(dtime) end end) -function mcl_campfires.generate_smoke(pos, haybale) - local smoke_timer - - if haybale then - smoke_timer = 8 - else - smoke_timer = 4.75 - end - - minetest.add_particle({ - pos = vector.offset(pos, math.random(-0.5, 0.5), 0, math.random(-0.5, 0.5)), - velocity = vector.new(0, 1, 0), - texture = "mcl_campfires_particle_" .. math.random(1, 12) .. ".png", - size = 10, - acceleration = vector.new(0, 0.5, 0), - collisiondetection = true, - expirationtime = smoke_timer, - }) -end - -minetest.register_abm({ +minetest.register_lbm({ label = "Campfire Smoke", + name = "mcl_campfires:campfire_smoke", nodenames = {"group:lit_campfire"}, - interval = 2, - chance = 2, + run_at_every_load = true, action = function(pos, node) - local node_below = vector.offset(pos, 0, -1, 0) - local haybale = false - if minetest.get_node(node_below).name == "mcl_farming:hay_block" then - haybale = true - end - mcl_campfires.generate_smoke(pos, haybale) + create_smoke_partspawner (pos) end, }) From 49e7449d7fefb17ab49e52802a1b0d60e3b69f8f Mon Sep 17 00:00:00 2001 From: ancientmarinerdev Date: Sat, 2 Sep 2023 12:55:32 +0100 Subject: [PATCH 181/982] Implement feedback and add credit --- mods/ITEMS/mcl_campfires/README.md | 1 + mods/ITEMS/mcl_campfires/api.lua | 26 +++++++++++++------------- 2 files changed, 14 insertions(+), 13 deletions(-) diff --git a/mods/ITEMS/mcl_campfires/README.md b/mods/ITEMS/mcl_campfires/README.md index 8747aa7e3..afcf2f15b 100644 --- a/mods/ITEMS/mcl_campfires/README.md +++ b/mods/ITEMS/mcl_campfires/README.md @@ -9,6 +9,7 @@ Authors: Gerold55 - Code Start + Models? PrairieWind - Improved and Cleaned Up Code, and added the soul campfire and crafting recipes. cora - Added burning damage. +AncientMariner - Changed smoke to particle spawner and tweaked particle configuration. License of media ---------------- diff --git a/mods/ITEMS/mcl_campfires/api.lua b/mods/ITEMS/mcl_campfires/api.lua index 137fc9a0c..8b14255ce 100644 --- a/mods/ITEMS/mcl_campfires/api.lua +++ b/mods/ITEMS/mcl_campfires/api.lua @@ -187,7 +187,7 @@ local function create_smoke_partspawner (pos, constructor) if haybale then smoke_timer = 8 else - smoke_timer = 4.75 + smoke_timer = 3 end local spawner_id = minetest.add_particlespawner({ @@ -209,18 +209,18 @@ local function create_smoke_partspawner (pos, constructor) texpool = { "mcl_campfires_particle_1.png"; { name = "mcl_campfires_particle_1.png", fade = "out" }, - { name = "mcl_campfires_particle_2.png" }, - { name = "mcl_campfires_particle_3.png" }, - { name = "mcl_campfires_particle_4.png" }, - { name = "mcl_campfires_particle_5.png" }, - { name = "mcl_campfires_particle_6.png" }, - { name = "mcl_campfires_particle_7.png" }, - { name = "mcl_campfires_particle_8.png" }, - { name = "mcl_campfires_particle_9.png" }, - { name = "mcl_campfires_particle_10.png" }, - { name = "mcl_campfires_particle_11.png" }, - { name = "mcl_campfires_particle_11.png" }, - { name = "mcl_campfires_particle_12.png" }, + { name = "mcl_campfires_particle_2.png", fade = "out" }, + { name = "mcl_campfires_particle_3.png", fade = "out" }, + { name = "mcl_campfires_particle_4.png", fade = "out" }, + { name = "mcl_campfires_particle_5.png", fade = "out" }, + { name = "mcl_campfires_particle_6.png", fade = "out" }, + { name = "mcl_campfires_particle_7.png", fade = "out" }, + { name = "mcl_campfires_particle_8.png", fade = "out" }, + { name = "mcl_campfires_particle_9.png", fade = "out" }, + { name = "mcl_campfires_particle_10.png", fade = "out" }, + { name = "mcl_campfires_particle_11.png", fade = "out" }, + { name = "mcl_campfires_particle_11.png", fade = "out" }, + { name = "mcl_campfires_particle_12.png", fade = "out" }, } }) From 6b36abfe91218b9f919410ca4646e91bc4ec7dbc Mon Sep 17 00:00:00 2001 From: ancientmarinerdev Date: Sat, 2 Sep 2023 12:58:38 +0100 Subject: [PATCH 182/982] Fix credits --- mods/ITEMS/mcl_campfires/README.md | 1 + mods/ITEMS/mcl_campfires/mod.conf | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/mods/ITEMS/mcl_campfires/README.md b/mods/ITEMS/mcl_campfires/README.md index afcf2f15b..126994cef 100644 --- a/mods/ITEMS/mcl_campfires/README.md +++ b/mods/ITEMS/mcl_campfires/README.md @@ -9,6 +9,7 @@ Authors: Gerold55 - Code Start + Models? PrairieWind - Improved and Cleaned Up Code, and added the soul campfire and crafting recipes. cora - Added burning damage. +DinoNuggies4665 - Cooking logic implemented AncientMariner - Changed smoke to particle spawner and tweaked particle configuration. License of media diff --git a/mods/ITEMS/mcl_campfires/mod.conf b/mods/ITEMS/mcl_campfires/mod.conf index 0f8bc6cbf..cb87a0c93 100644 --- a/mods/ITEMS/mcl_campfires/mod.conf +++ b/mods/ITEMS/mcl_campfires/mod.conf @@ -1,3 +1,3 @@ name = mcl_campfires depends = mcl_sounds, mcl_util -author = PrairieWind, Gerold55 \ No newline at end of file +author = PrairieWind, Gerold55, DinoNuggies4665 \ No newline at end of file From 9e53efbc3efdc40db306ba6f0ffd4fb7cacdcc25 Mon Sep 17 00:00:00 2001 From: ancientmarinerdev Date: Sun, 3 Sep 2023 00:07:54 +0100 Subject: [PATCH 183/982] Fix campfire smoke timing --- mods/ITEMS/mcl_campfires/api.lua | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/mods/ITEMS/mcl_campfires/api.lua b/mods/ITEMS/mcl_campfires/api.lua index 8b14255ce..212beefbe 100644 --- a/mods/ITEMS/mcl_campfires/api.lua +++ b/mods/ITEMS/mcl_campfires/api.lua @@ -185,9 +185,9 @@ local function create_smoke_partspawner (pos, constructor) local smoke_timer if haybale then - smoke_timer = 8 + smoke_timer = 4 else - smoke_timer = 3 + smoke_timer = 2.4 end local spawner_id = minetest.add_particlespawner({ From bd46428d6573e476f3c4390b49960792379fcbfc Mon Sep 17 00:00:00 2001 From: ancientmarinerdev Date: Mon, 4 Sep 2023 23:00:31 +0100 Subject: [PATCH 184/982] Updated credits --- mods/ITEMS/mcl_campfires/README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/mods/ITEMS/mcl_campfires/README.md b/mods/ITEMS/mcl_campfires/README.md index 126994cef..188134233 100644 --- a/mods/ITEMS/mcl_campfires/README.md +++ b/mods/ITEMS/mcl_campfires/README.md @@ -10,6 +10,7 @@ Gerold55 - Code Start + Models? PrairieWind - Improved and Cleaned Up Code, and added the soul campfire and crafting recipes. cora - Added burning damage. DinoNuggies4665 - Cooking logic implemented +thunder1035 - Redesigned model and texture tweaks AncientMariner - Changed smoke to particle spawner and tweaked particle configuration. License of media From eb658a49962a699ebd7dd10f9b34ede39bb88a66 Mon Sep 17 00:00:00 2001 From: Eliy21 Date: Mon, 11 Sep 2023 19:38:33 +0000 Subject: [PATCH 185/982] Update mods/PLAYER/mcl_spawn/init.lua Add if then condition for no bed/anchor respawn settings --- mods/PLAYER/mcl_spawn/init.lua | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/mods/PLAYER/mcl_spawn/init.lua b/mods/PLAYER/mcl_spawn/init.lua index eb0208dcb..89ededeed 100644 --- a/mods/PLAYER/mcl_spawn/init.lua +++ b/mods/PLAYER/mcl_spawn/init.lua @@ -76,6 +76,7 @@ local node_search_list = local success = storage:get_int("mcl_spawn_success")==1 local searched = (storage:get_int("mcl_spawn_searched")==1) or mg_name == "v6" or mg_name == "singlenode" or minetest.settings:get("static_spawnpoint") +local return_spawn = minetest.settings:get_bool("mcl_return_spawn", true) local wsp = minetest.string_to_pos(storage:get_string("mcl_spawn_world_spawn_point")) or {} -- world spawn position local check = storage:get_int("mcl_spawn_check") or 0 local cp = minetest.string_to_pos(storage:get_string("mcl_spawn_cp")) or {x=start_pos.x, y=start_pos.y, z=start_pos.z} @@ -498,7 +499,7 @@ function mcl_spawn.get_player_spawn_pos(player) if(string.match(checknode.name, "mcl_beds:respawn_anchor_charged_")) then local charge_level = tonumber(string.sub(checknode.name, -1)) - if not charge_level then + if not charge_level and return_spawn then minetest.log("warning","could not get level of players respawn anchor, sending him back to spawn!") player:get_meta():set_string("mcl_beds:spawn", "") minetest.chat_send_player(player:get_player_name(), S("Couldn't get level of your respawn anchor!")) @@ -510,10 +511,12 @@ function mcl_spawn.get_player_spawn_pos(player) minetest.set_node(checkpos, {name="mcl_beds:respawn_anchor"}) return checkpos, false end - else + elseif return_spawn then player:get_meta():set_string("mcl_beds:spawn", "") minetest.chat_send_player(player:get_player_name(), S("Your spawn bed was missing or blocked, and you had no charged respawn anchor!")) return mcl_spawn.get_world_spawn_pos(), false + else + return checkpos, false end end end From 2d9bffaa43fb2f805edf7039767a3156b9abdd4e Mon Sep 17 00:00:00 2001 From: Eliy21 Date: Mon, 11 Sep 2023 19:42:04 +0000 Subject: [PATCH 186/982] Update settingtypes.txt Add the no bed respawn in settings --- settingtypes.txt | 3 +++ 1 file changed, 3 insertions(+) diff --git a/settingtypes.txt b/settingtypes.txt index c5d5d32c1..8123ca9d9 100644 --- a/settingtypes.txt +++ b/settingtypes.txt @@ -51,6 +51,9 @@ mcl_disabled_events (Disabled events) string # This setting is only read at startup. enable_bed_respawn (Respawn at bed) bool true +#If enabled, players respawn at world spawn if bed is destroyed or respawn anchor has no charge. +mcl_return_spawn (Return to spawn if no bed) bool true + # How many players have to sleep to skip the night, in percent. # Setting to 0 will mean 1 player is always enough to skip the night. Setting above 100 will prevent skipping the night. # 100 by default. From a960bf2e8e3da2dd4086a511f85aec97694d23c7 Mon Sep 17 00:00:00 2001 From: Dehydrate6684 Date: Sat, 16 Sep 2023 13:16:49 +0800 Subject: [PATCH 187/982] Update trapdoor climbable behavior --- mods/ITEMS/mcl_core/nodes_climb.lua | 48 ++++++++++++++++++++++++- mods/ITEMS/mcl_doors/api_trapdoors.lua | 50 +++++++++++++++++++++++--- 2 files changed, 93 insertions(+), 5 deletions(-) diff --git a/mods/ITEMS/mcl_core/nodes_climb.lua b/mods/ITEMS/mcl_core/nodes_climb.lua index 33a34f899..1e94a37dc 100644 --- a/mods/ITEMS/mcl_core/nodes_climb.lua +++ b/mods/ITEMS/mcl_core/nodes_climb.lua @@ -33,7 +33,14 @@ minetest.register_node("mcl_core:ladder", { wall_side = { -0.5, -0.5, -0.5, -7/16, 0.5, 0.5 }, }, stack_max = 64, - groups = {handy=1,axey=1, attached_node=1, deco_block=1, dig_by_piston=1}, + groups = { + handy = 1, + axey = 1, + attached_node = 1, + deco_block = 1, + dig_by_piston = 1, + ladder = 1 + }, sounds = mcl_sounds.node_sound_wood_defaults(), node_placement_prediction = "", -- Restrict placement of ladders @@ -80,7 +87,46 @@ minetest.register_node("mcl_core:ladder", { end return itemstack end, + after_destruct = function(pos, oldnode) + local pos_above = vector.add(pos, {x = 0, y = 1, z = 0 }) + local node_above = minetest.get_node_or_nil(pos_above) + if node_above then + local is_trapdoor = minetest.get_item_group(node_above.name, "trapdoor") + + -- If node above is an opened trapdoor + if is_trapdoor == 2 then + local above_def = minetest.registered_nodes[node_above.name] + if above_def._other then + minetest.swap_node(pos_above, { + name = above_def._other, + param1 = node_above.param1, + param2 = node_above.param2, + }) + end + end + end + end, + after_place_node = function(pos, oldnode) + local pos_above = vector.add(pos, {x = 0, y = 1, z = 0 }) + local node_above = minetest.get_node_or_nil(pos_above) + + if node_above then + local is_trapdoor = minetest.get_item_group(node_above.name, "trapdoor") + + -- If node above is an opened trapdoor + if is_trapdoor == 2 then + local above_def = minetest.registered_nodes[node_above.name] + if above_def._other then + minetest.swap_node(pos_above, { + name = above_def._other, + param1 = node_above.param1, + param2 = node_above.param2, + }) + end + end + end + end, _mcl_blast_resistance = 0.4, _mcl_hardness = 0.4, on_rotate = rotate_climbable, diff --git a/mods/ITEMS/mcl_doors/api_trapdoors.lua b/mods/ITEMS/mcl_doors/api_trapdoors.lua index 5b7a0e5d0..c42ffd7c3 100644 --- a/mods/ITEMS/mcl_doors/api_trapdoors.lua +++ b/mods/ITEMS/mcl_doors/api_trapdoors.lua @@ -72,7 +72,21 @@ function mcl_doors:register_trapdoor(name, def) -- Open else minetest.sound_play(def.sound_open, {pos = pos, gain = 0.3, max_hear_distance = 16}, true) - tmp_node = {name=name.."_open", param1=me.param1, param2=me.param2} + + local bottom_node = minetest.get_node_or_nil(vector.subtract(pos, { x = 0, y = 1, z = 0 })) + local name_end = "_open" + + -- Checking if there is something underneath the trapdoor + if bottom_node then + local bottom_def = minetest.registered_nodes[bottom_node.name] + local trapdoor = minetest.get_item_group(bottom_node.name, "trapdoor") + + -- Changing trapdoor into a ladder if bottom node is climbable and not a trapdoor + if trapdoor ~= 2 and bottom_def.climbable then + name_end = "_ladder" + end + end + tmp_node = {name=name..name_end, param1=me.param1, param2=me.param2} end minetest.set_node(pos, tmp_node) end @@ -193,6 +207,7 @@ function mcl_doors:register_trapdoor(name, def) groups_open.trapdoor = 2 groups_open.not_in_creative_inventory = 1 + -- Non-climbable opened minetest.register_node(name.."_open", { drawtype = "nodebox", tiles = tiles_open, @@ -200,9 +215,35 @@ function mcl_doors:register_trapdoor(name, def) is_ground_content = false, paramtype = "light", paramtype2 = "facedir", - -- TODO: Implement Minecraft behaviour: Climbable if directly above - -- ladder w/ matching orientation. - -- Current behavour: Always climbable + sunlight_propagates = true, + pointable = true, + groups = groups_open, + _mcl_hardness = def._mcl_hardness, + _mcl_blast_resistance = def._mcl_blast_resistance, + sounds = def.sounds, + drop = name, + node_box = { + type = "fixed", + fixed = {-0.5, -0.5, 5/16, 0.5, 0.5, 0.5} + }, + on_rightclick = on_rightclick, + mesecons = {effector = { + action_off = (function(pos, node) + punch(pos) + end), + }}, + on_rotate = on_rotate, + _other = name .. "_ladder" + }) + + -- Climbable opened + minetest.register_node(name.."_ladder", { + drawtype = "nodebox", + tiles = tiles_open, + use_texture_alpha = minetest.features.use_texture_alpha_string_modes and "clip" or true, + is_ground_content = false, + paramtype = "light", + paramtype2 = "facedir", climbable = true, sunlight_propagates = true, pointable = true, @@ -222,6 +263,7 @@ function mcl_doors:register_trapdoor(name, def) end), }}, on_rotate = on_rotate, + _other = name .. "_open" }) if minetest.get_modpath("doc") then From e6653b78eed3af654039234fe8d974be63360e2d Mon Sep 17 00:00:00 2001 From: Dehydrate6684 Date: Sun, 17 Sep 2023 17:03:04 +0800 Subject: [PATCH 188/982] Added directional checks --- mods/ITEMS/mcl_core/nodes_climb.lua | 96 ++++++++++++++++---------- mods/ITEMS/mcl_doors/api_trapdoors.lua | 41 ++++++++--- 2 files changed, 89 insertions(+), 48 deletions(-) diff --git a/mods/ITEMS/mcl_core/nodes_climb.lua b/mods/ITEMS/mcl_core/nodes_climb.lua index 1e94a37dc..ca45a39f5 100644 --- a/mods/ITEMS/mcl_core/nodes_climb.lua +++ b/mods/ITEMS/mcl_core/nodes_climb.lua @@ -11,6 +11,59 @@ local function rotate_climbable(pos, node, user, mode) return false end +---Checks the direction (param2) of a ladder and a trapdoor and determine if they are +---facing the same direction. +--- +---@param ladder integer The param2 value of the ladder. +---@param trapdoor integer The param2 value of the trapdoor. +---@return boolean If the ladder and trapdoor are in the same direction. +local function check_direction(ladder, trapdoor) + local convert_table = {}; + convert_table[2] = { 1, 23 } + convert_table[3] = { 3, 21 } + convert_table[4] = { 0, 20 } + convert_table[5] = { 2, 22 } + + local conversion = convert_table[ladder]; + if conversion == nil then + return false + elseif conversion[1] == trapdoor or conversion[2] == trapdoor then + return true + end + + return false +end + +---Updates the trapdoor above (if any). +--- +---@param pos mt.Vector The position of the ladder. +---@param ladder integer The param2 value of the ladder. +---@param event "place" | "destruct" The place or destruct event. +local function update_trapdoor(pos, ladder, event) + local top_pos = vector.add(pos, { x = 0, y = 1, z = 0 }) + local top_node = minetest.get_node_or_nil(top_pos) + if top_node then + local new_name = top_node.name + if event == "place" then + new_name = string.gsub(new_name, "open$", "ladder") + elseif event == "destruct" then + new_name = string.gsub(new_name, "ladder$", "open") + end + + local is_trapdoor = minetest.get_item_group(top_node.name, "trapdoor") + + -- If node above is an opened trapdoor + if is_trapdoor == 2 and check_direction(ladder, top_node.param2) then + minetest.swap_node(top_pos, { + name = new_name, + param1 = top_node.param1, + param2 = top_node.param2, + }) + end + end +end + +-- TODO: Move ladders into their own API. minetest.register_node("mcl_core:ladder", { description = S("Ladder"), _doc_items_longdesc = S("A piece of ladder which allows you to climb vertically. Ladders can only be placed on the side of solid blocks and not on glass, leaves, ice, slabs, glowstone, nor sea lanterns."), @@ -87,45 +140,12 @@ minetest.register_node("mcl_core:ladder", { end return itemstack end, - after_destruct = function(pos, oldnode) - local pos_above = vector.add(pos, {x = 0, y = 1, z = 0 }) - local node_above = minetest.get_node_or_nil(pos_above) - - if node_above then - local is_trapdoor = minetest.get_item_group(node_above.name, "trapdoor") - - -- If node above is an opened trapdoor - if is_trapdoor == 2 then - local above_def = minetest.registered_nodes[node_above.name] - if above_def._other then - minetest.swap_node(pos_above, { - name = above_def._other, - param1 = node_above.param1, - param2 = node_above.param2, - }) - end - end - end + after_destruct = function(pos, old) + update_trapdoor(pos, old.param2, "destruct") end, - after_place_node = function(pos, oldnode) - local pos_above = vector.add(pos, {x = 0, y = 1, z = 0 }) - local node_above = minetest.get_node_or_nil(pos_above) - - if node_above then - local is_trapdoor = minetest.get_item_group(node_above.name, "trapdoor") - - -- If node above is an opened trapdoor - if is_trapdoor == 2 then - local above_def = minetest.registered_nodes[node_above.name] - if above_def._other then - minetest.swap_node(pos_above, { - name = above_def._other, - param1 = node_above.param1, - param2 = node_above.param2, - }) - end - end - end + after_place_node = function(pos) + local me = minetest.get_node(pos) + update_trapdoor(pos, me.param2, "place") end, _mcl_blast_resistance = 0.4, _mcl_hardness = 0.4, diff --git a/mods/ITEMS/mcl_doors/api_trapdoors.lua b/mods/ITEMS/mcl_doors/api_trapdoors.lua index c42ffd7c3..455534878 100644 --- a/mods/ITEMS/mcl_doors/api_trapdoors.lua +++ b/mods/ITEMS/mcl_doors/api_trapdoors.lua @@ -48,6 +48,29 @@ if minetest.get_modpath("screwdriver") then end end +---Checks the direction (param2) of a ladder and a trapdoor and determine if they are +---facing the same direction. +--- +---@param ladder integer The param2 value of the ladder. +---@param trapdoor integer The param2 value of the trapdoor. +---@return boolean If the ladder and trapdoor are in the same direction. +function check_direction(ladder, trapdoor) + local convert_table = {}; + convert_table[2] = { 1, 23 } + convert_table[3] = { 3, 21 } + convert_table[4] = { 0, 20 } + convert_table[5] = { 2, 22 } + + local conversion = convert_table[ladder]; + if conversion == nil then + return false + elseif conversion[1] == trapdoor or conversion[2] == trapdoor then + return true + end + + return false +end + function mcl_doors:register_trapdoor(name, def) local groups = table.copy(def.groups) if groups == nil then @@ -67,26 +90,24 @@ function mcl_doors:register_trapdoor(name, def) local tmp_node -- Close if minetest.get_item_group(me.name, "trapdoor") == 2 then - minetest.sound_play(def.sound_close, {pos = pos, gain = 0.3, max_hear_distance = 16}, true) - tmp_node = {name=name, param1=me.param1, param2=me.param2} - -- Open + minetest.sound_play(def.sound_close, { pos = pos, gain = 0.3, max_hear_distance = 16 }, true) + tmp_node = { name = name, param1 = me.param1, param2 = me.param2 } + -- Open else - minetest.sound_play(def.sound_open, {pos = pos, gain = 0.3, max_hear_distance = 16}, true) + minetest.sound_play(def.sound_open, { pos = pos, gain = 0.3, max_hear_distance = 16 }, true) local bottom_node = minetest.get_node_or_nil(vector.subtract(pos, { x = 0, y = 1, z = 0 })) local name_end = "_open" -- Checking if there is something underneath the trapdoor if bottom_node then - local bottom_def = minetest.registered_nodes[bottom_node.name] - local trapdoor = minetest.get_item_group(bottom_node.name, "trapdoor") - - -- Changing trapdoor into a ladder if bottom node is climbable and not a trapdoor - if trapdoor ~= 2 and bottom_def.climbable then + local is_ladder = minetest.get_item_group(bottom_node.name, "ladder") + local same_direction = check_direction(bottom_node.param2, me.param2) + if is_ladder > 0 and same_direction then name_end = "_ladder" end end - tmp_node = {name=name..name_end, param1=me.param1, param2=me.param2} + tmp_node = { name = name .. name_end, param1 = me.param1, param2 = me.param2 } end minetest.set_node(pos, tmp_node) end From cc217d008985e4a65a91305c68ace348c558f6ca Mon Sep 17 00:00:00 2001 From: Dehydrate6684 Date: Sun, 17 Sep 2023 17:13:50 +0800 Subject: [PATCH 189/982] Removed unnessary node definitions --- mods/ITEMS/mcl_doors/api_trapdoors.lua | 2 -- 1 file changed, 2 deletions(-) diff --git a/mods/ITEMS/mcl_doors/api_trapdoors.lua b/mods/ITEMS/mcl_doors/api_trapdoors.lua index 455534878..1ea45abbf 100644 --- a/mods/ITEMS/mcl_doors/api_trapdoors.lua +++ b/mods/ITEMS/mcl_doors/api_trapdoors.lua @@ -254,7 +254,6 @@ function mcl_doors:register_trapdoor(name, def) end), }}, on_rotate = on_rotate, - _other = name .. "_ladder" }) -- Climbable opened @@ -284,7 +283,6 @@ function mcl_doors:register_trapdoor(name, def) end), }}, on_rotate = on_rotate, - _other = name .. "_open" }) if minetest.get_modpath("doc") then From 3029147ed7366d2684993f1e965964e76f62f6c7 Mon Sep 17 00:00:00 2001 From: Nils Dagsson Moskopp Date: Mon, 18 Sep 2023 15:20:21 +0200 Subject: [PATCH 190/982] Add example code for rendering a 3D shape using a Z-buffer --- donut.lua | 93 +++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 93 insertions(+) create mode 100644 donut.lua diff --git a/donut.lua b/donut.lua new file mode 100644 index 000000000..51402ef3d --- /dev/null +++ b/donut.lua @@ -0,0 +1,93 @@ +#!/usr/bin/env lua5.1 +-- -*- coding: utf-8 -*- + +-- 3D “donut” shape rendering using floating-point math +-- see + +-- cargo-culted by erle 2023-09-18 + +local theta_spacing = 0.1 -- 0.07 +local phi_spacing = 0.002 -- 0.02 + +local R1 = 1 +local R2 = 2 +local K2 = 5 + +local screen_height = 256 +local screen_width = 256 + +local K1 = screen_width * K2 * 3 / ( 8 * ( R1 + R2 ) ) + +local output = {} +local zbuffer = {} + +local grey = { 120, 120, 120 } +local gray = { 136, 136, 136 } + +for y = 1,screen_height,1 do + output[y] = {} + zbuffer[y] = {} + for x = 1,screen_width,1 do + local hori = math.floor( ( (y - 1) / 32 ) % 2 ) + local vert = math.floor( ( (x - 1) / 32 ) % 2 ) + output[y][x] = hori ~= vert and grey or gray + zbuffer[y][x] = 0 + end +end + +function render_frame(A, B) + -- precompute sines and cosines of A and B + local cosA = math.cos(A) + local sinA = math.sin(A) + local cosB = math.cos(B) + local sinB = math.sin(B) + + -- theta goas around the cross-sectional circle of a torus + for theta=0, 2*math.pi, theta_spacing do + -- precompute sines and cosines of theta + local costheta = math.cos(theta) + local sintheta = math.sin(theta) + + -- phi goes around the center of revolution of a torus + for phi=0, 2*math.pi, phi_spacing do + -- precompute sines and cosines of phi + local cosphi = math.cos(phi) + local sinphi = math.sin(phi) + + -- 2D (x, y) coordinates of the circle, before revolving + local circlex = R2 + R1*costheta + local circley = R1*sintheta + + -- 3D (x, y, z) coordinates after rotation + local x = circlex*(cosB*cosphi + sinA*sinB*sinphi) - circley*cosA*sinB + local y = circlex*(sinB*cosphi - sinA*cosB*sinphi) + circley*cosA*cosB + local z = K2 + cosA*circlex*sinphi + circley*sinA + + local ooz = 1/z + + -- x and y projection + local xp = math.floor(screen_width/2 + K1*ooz*x) + local yp = math.floor(screen_height/2 + K1*ooz*y) + + -- calculate luminance + local L = cosphi*costheta*sinB - cosA*costheta*sinphi - sinA*sintheta + cosB*( cosA*sintheta - costheta*sinA*sinphi ) + -- if (L > 0) then + if (true) then + if (ooz > zbuffer[yp][xp]) then + zbuffer[yp][xp] = ooz + local luminance = math.max( math.ceil( L * 180 ), 0 ) + -- luminance is now in the range 0 to 255 + r = math.ceil( (luminance + xp) / 2 ) + g = math.ceil( (luminance + yp) / 2 ) + b = math.ceil( (luminance + xp + yp) / 3 ) + output[yp][xp] = { r, g, b } + end + end + end + end +end + +dofile('init.lua') + +render_frame(-0.7, 0.7) +tga_encoder.image(output):save("donut.tga") From 4dd3833f3bf3dfc40e31e80e4068adac695a2dd8 Mon Sep 17 00:00:00 2001 From: Nils Dagsson Moskopp Date: Mon, 18 Sep 2023 16:45:31 +0200 Subject: [PATCH 191/982] Move encoding format heuristics from image:save() to image:encode() --- examples.lua | 16 ++++++++++++++++ init.lua | 18 +++++++++--------- 2 files changed, 25 insertions(+), 9 deletions(-) diff --git a/examples.lua b/examples.lua index 7642281aa..0dd61090c 100644 --- a/examples.lua +++ b/examples.lua @@ -14,6 +14,22 @@ local pixels = { } tga_encoder.image(pixels):save("bitmap_small.tga") +-- test that image can be encoded +local bitmap_small_0 = tga_encoder.image(pixels) +bitmap_small_0:encode() +assert(191 == #bitmap_small_0.data) + +-- test that imbage can be encoded with parameters +local bitmap_small_1 = tga_encoder.image(pixels) +bitmap_small_1:encode( + { + colormap = {}, + color_format = "B8G8R8", + compression = "RAW", + } +) +assert(191 == #bitmap_small_1.data) + -- change a single pixel, then rescale the bitmap local pixels_orig = pixels pixels_orig[4][4] = { 255, 255, 255 } diff --git a/init.lua b/init.lua index ed387eec0..ec7b3b8d3 100644 --- a/init.lua +++ b/init.lua @@ -549,15 +549,6 @@ function image:encode_footer() end function image:encode(properties) - self.data = "" - self:encode_header(properties) -- header - -- no color map and image id data - self:encode_data(properties) -- encode data - -- no extension or developer area - self:encode_footer() -- footer -end - -function image:save(filename, properties) local properties = properties or {} properties.colormap = properties.colormap or {} properties.compression = properties.compression or "RAW" @@ -584,6 +575,15 @@ function image:save(filename, properties) end assert( nil ~= properties.color_format ) + self.data = "" + self:encode_header(properties) -- header + -- no color map and image id data + self:encode_data(properties) -- encode data + -- no extension or developer area + self:encode_footer() -- footer +end + +function image:save(filename, properties) self:encode(properties) local f = assert(io.open(filename, "wb")) From 11e36749267fc53d40c681a1e86d09878017b231 Mon Sep 17 00:00:00 2001 From: codiac Date: Tue, 19 Sep 2023 11:18:40 +1000 Subject: [PATCH 192/982] Use MC 1.18 light levels to control mob spawning --- mods/ENTITIES/mcl_mobs/spawning.lua | 40 +++++++++++++++++++---------- settingtypes.txt | 12 +++++++++ 2 files changed, 39 insertions(+), 13 deletions(-) diff --git a/mods/ENTITIES/mcl_mobs/spawning.lua b/mods/ENTITIES/mcl_mobs/spawning.lua index c677aeacf..5a07dd55b 100644 --- a/mods/ENTITIES/mcl_mobs/spawning.lua +++ b/mods/ENTITIES/mcl_mobs/spawning.lua @@ -2,6 +2,12 @@ local math, vector, minetest, mcl_mobs = math, vector, minetest, mcl_mobs local mob_class = mcl_mobs.mob_class +local modern_lighting = minetest.settings:get_bool("mcl_mobs_modern_lighting", true) +local nether_threshold = tonumber(minetest.settings:get("mcl_mobs_nether_threshold")) or 11 +local end_threshold = tonumber(minetest.settings:get("mcl_mobs_end_threshold")) or 0 +local overworld_threshold = tonumber(minetest.settings:get("mcl_mobs_overworld_threshold")) or 0 +local overworld_sky_threshold = tonumber(minetest.settings:get("mcl_mobs_overworld_sky_threshold")) or 7 + local get_node = minetest.get_node local get_item_group = minetest.get_item_group local get_node_light = minetest.get_node_light @@ -709,9 +715,6 @@ local function spawn_check(pos, spawn_def) and spawn_def.dimension == dimension and biome_check(spawn_def.biomes, gotten_biome) then - --mcl_log("Level 1 spawn check passed") - --minetest.log("Mob: " .. mob_def.name) - if (is_ground or spawn_def.type_of_spawning ~= "ground") and (spawn_def.type_of_spawning ~= "ground" or not is_leaf) and (not is_farm_animal(spawn_def.name) or is_grass) @@ -721,20 +724,31 @@ local function spawn_check(pos, spawn_def) and (spawn_def.check_position and spawn_def.check_position(pos) or spawn_def.check_position == nil) and ( not spawn_protected or not minetest.is_protected(pos, "") ) then - --mcl_log("Level 2 spawn check passed") + if modern_lighting then + local my_node = get_node(pos) + local sky_light = minetest.get_natural_light(pos) + local art_light = minetest.get_artificial_light(my_node.param1) - local gotten_light = get_node_light(pos) - if gotten_light >= spawn_def.min_light and gotten_light <= spawn_def.max_light then - --mcl_log("Level 3 spawn check passed") - return true + if dimension == "nether" then + if art_light <= nether_threshold then + return true + end + elseif dimension == "end" then + if art_light <= end_threshold then + return true + end + elseif dimension == "overworld" then + if art_light <= overworld_threshold and sky_light <= overworld_sky_threshold then + return true + end + end else - --mcl_log("Spawn check level 3 failed") + local gotten_light = get_node_light(pos) + if gotten_light >= spawn_def.min_light and gotten_light <= spawn_def.max_light then + return true + end end - else - --mcl_log("Spawn check level 2 failed") end - else - --mcl_log("Spawn check level 1 failed") end return false end diff --git a/settingtypes.txt b/settingtypes.txt index c5d5d32c1..827059145 100644 --- a/settingtypes.txt +++ b/settingtypes.txt @@ -173,6 +173,18 @@ mcl_mob_active_range (Active mob range) int 48 0 256 # Zombie siege raid (default:false) mcl_raids_zombie_siege (Zombie siege raid) bool false +# Use MC 1.18 light levels to control monster spawning. +# Disable to use older mob specific light levels. +mcl_mobs_modern_lighting (Use MC 1.18 light rules for spawning) bool true + +# These only take effect if mcl_mobs_modern_lighting is enabled +# Light levels greater than these block monsters spawning +# See https://minecraft.fandom.com/wiki/Light#Internal_light_level +mcl_mobs_nether_threshold (Artificial light threshold to stop spawns in the Nether) int 11 0 14 +mcl_mobs_end_threshold (Artificial light threshold to stop spawns in the End) int 0 0 14 +mcl_mobs_overworld_threshold (Artificial light threshold to stop spawns in the Overworld) int 0 0 14 +mcl_mobs_overworld_sky_threshold (Skylight threshold to stop spawns in the Overworld) int 7 0 14 + [Audio] # Enable flame sound. flame_sound (Flame sound) bool true From bf4c7e1913f632d4fc7637c40fec17e3fb454290 Mon Sep 17 00:00:00 2001 From: codiac Date: Wed, 20 Sep 2023 09:24:51 +1000 Subject: [PATCH 193/982] Allow non monsters spawns too --- mods/ENTITIES/mcl_mobs/spawning.lua | 14 +++++++++++--- settingtypes.txt | 7 ++++--- 2 files changed, 15 insertions(+), 6 deletions(-) diff --git a/mods/ENTITIES/mcl_mobs/spawning.lua b/mods/ENTITIES/mcl_mobs/spawning.lua index 5a07dd55b..82870dcd3 100644 --- a/mods/ENTITIES/mcl_mobs/spawning.lua +++ b/mods/ENTITIES/mcl_mobs/spawning.lua @@ -7,6 +7,7 @@ local nether_threshold = tonumber(minetest.settings:get("mcl_mobs_nether_thresho local end_threshold = tonumber(minetest.settings:get("mcl_mobs_end_threshold")) or 0 local overworld_threshold = tonumber(minetest.settings:get("mcl_mobs_overworld_threshold")) or 0 local overworld_sky_threshold = tonumber(minetest.settings:get("mcl_mobs_overworld_sky_threshold")) or 7 +local overworld_passive_threshold = tonumber(minetest.settings:get("mcl_mobs_overworld_passive_threshold")) or 7 local get_node = minetest.get_node local get_item_group = minetest.get_item_group @@ -724,6 +725,8 @@ local function spawn_check(pos, spawn_def) and (spawn_def.check_position and spawn_def.check_position(pos) or spawn_def.check_position == nil) and ( not spawn_protected or not minetest.is_protected(pos, "") ) then + local gotten_light = get_node_light(pos) + if modern_lighting then local my_node = get_node(pos) local sky_light = minetest.get_natural_light(pos) @@ -738,12 +741,17 @@ local function spawn_check(pos, spawn_def) return true end elseif dimension == "overworld" then - if art_light <= overworld_threshold and sky_light <= overworld_sky_threshold then - return true + if mob_type == "monster" then + if art_light <= overworld_threshold and sky_light <= overworld_sky_threshold then + return true + end + else + if gotten_light > overworld_passive_threshold then + return true + end end end else - local gotten_light = get_node_light(pos) if gotten_light >= spawn_def.min_light and gotten_light <= spawn_def.max_light then return true end diff --git a/settingtypes.txt b/settingtypes.txt index 827059145..7bac3c0e8 100644 --- a/settingtypes.txt +++ b/settingtypes.txt @@ -178,12 +178,13 @@ mcl_raids_zombie_siege (Zombie siege raid) bool false mcl_mobs_modern_lighting (Use MC 1.18 light rules for spawning) bool true # These only take effect if mcl_mobs_modern_lighting is enabled -# Light levels greater than these block monsters spawning +# Light levels greater than these block mobs spawning # See https://minecraft.fandom.com/wiki/Light#Internal_light_level mcl_mobs_nether_threshold (Artificial light threshold to stop spawns in the Nether) int 11 0 14 mcl_mobs_end_threshold (Artificial light threshold to stop spawns in the End) int 0 0 14 -mcl_mobs_overworld_threshold (Artificial light threshold to stop spawns in the Overworld) int 0 0 14 -mcl_mobs_overworld_sky_threshold (Skylight threshold to stop spawns in the Overworld) int 7 0 14 +mcl_mobs_overworld_threshold (Artificial light threshold to stop monster spawns in the Overworld) int 0 0 14 +mcl_mobs_overworld_sky_threshold (Skylight threshold to stop monster spawns in the Overworld) int 7 0 14 +mcl_mobs_overworld_passive_threshold (Combined light threshold to stop animal and npc spawns in the Overworld) int 7 0 14 [Audio] # Enable flame sound. From 7577d37b3866ba990cf011c51d8cb1e9d47160d1 Mon Sep 17 00:00:00 2001 From: codiac Date: Wed, 20 Sep 2023 15:56:27 +1000 Subject: [PATCH 194/982] Clarify MC version for lighting --- settingtypes.txt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/settingtypes.txt b/settingtypes.txt index 7bac3c0e8..282c0bb64 100644 --- a/settingtypes.txt +++ b/settingtypes.txt @@ -173,9 +173,9 @@ mcl_mob_active_range (Active mob range) int 48 0 256 # Zombie siege raid (default:false) mcl_raids_zombie_siege (Zombie siege raid) bool false -# Use MC 1.18 light levels to control monster spawning. +# Use MC 1.18+ light levels to control monster spawning. # Disable to use older mob specific light levels. -mcl_mobs_modern_lighting (Use MC 1.18 light rules for spawning) bool true +mcl_mobs_modern_lighting (Use MC 1.18+ light rules for spawning) bool true # These only take effect if mcl_mobs_modern_lighting is enabled # Light levels greater than these block mobs spawning From f57220f78496f65c58f0e3d2816417d3350cbe50 Mon Sep 17 00:00:00 2001 From: Michieal Date: Wed, 20 Sep 2023 05:57:49 +0000 Subject: [PATCH 195/982] Fix Server crash (Issue ##3939) Fixes the error of pointed_thing being nil (null) by first checking to see if it exists, and if not, exit the on_place call back. --- mods/ITEMS/mcl_bamboo/bamboo_base.lua | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/mods/ITEMS/mcl_bamboo/bamboo_base.lua b/mods/ITEMS/mcl_bamboo/bamboo_base.lua index 4ccb9bb1b..2cc8b23c8 100644 --- a/mods/ITEMS/mcl_bamboo/bamboo_base.lua +++ b/mods/ITEMS/mcl_bamboo/bamboo_base.lua @@ -86,7 +86,7 @@ local bamboo_def = { on_rotate = on_rotate, on_place = function(itemstack, placer, pointed_thing) - if pointed_thing.type ~= "node" then + if pointed_thing and pointed_thing.type ~= "node" then -- make sure that pointed_thing is not null and is pointing at a node. return itemstack end local node = minetest.get_node(pointed_thing.under) @@ -277,6 +277,10 @@ local bamboo_block_def = { _mcl_stripped_variant = "mcl_bamboo:bamboo_block_stripped", -- this allows us to use the built in Axe's strip block. on_place = function(itemstack, placer, pointed_thing) + if not pointed_thing then -- make sure that pointed_thing is not null + return itemstack + end + local pos = pointed_thing.under if mcl_bamboo.is_protected(pos, placer) then From b2ebcf5d4fbc10635cde690a6a82be0fe0d8c6b6 Mon Sep 17 00:00:00 2001 From: Michieal Date: Wed, 20 Sep 2023 06:07:13 +0000 Subject: [PATCH 196/982] Readme Change Putting my name back into the credits in the mod. --- mods/ITEMS/mcl_bamboo/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mods/ITEMS/mcl_bamboo/README.md b/mods/ITEMS/mcl_bamboo/README.md index b1f91e641..469914294 100644 --- a/mods/ITEMS/mcl_bamboo/README.md +++ b/mods/ITEMS/mcl_bamboo/README.md @@ -3,7 +3,7 @@ mcl_bamboo This mod adds working, familiar bamboo nodes to your Mineclone 2 world. -Code: MineClone2 dev team. Original (basic) bamboo code by: Small Joker. +Code: Michieal. Original (basic, used as inspiration) bamboo code by: Small Joker. Updates to the code: Mineclone Dev Team, Michieal. License for code: GPLv3. License for images / textures: CC-BY-SA except where noted. From d2d7887e0f04d884da5d13080f6fa3e8634523dd Mon Sep 17 00:00:00 2001 From: codiac Date: Thu, 21 Sep 2023 14:53:32 +1000 Subject: [PATCH 197/982] Handle bat and slime light checks --- mods/ENTITIES/mcl_mobs/init.lua | 1 + mods/ENTITIES/mcl_mobs/spawning.lua | 8 ++++++-- mods/ENTITIES/mobs_mc/bat.lua | 13 +++++++++++++ mods/ENTITIES/mobs_mc/slime+magma_cube.lua | 11 +++++++++++ 4 files changed, 31 insertions(+), 2 deletions(-) diff --git a/mods/ENTITIES/mcl_mobs/init.lua b/mods/ENTITIES/mcl_mobs/init.lua index 62100c627..a16f1c23d 100644 --- a/mods/ENTITIES/mcl_mobs/init.lua +++ b/mods/ENTITIES/mcl_mobs/init.lua @@ -287,6 +287,7 @@ function mcl_mobs.register_mob(name, def) spawn_in_group_min = def.spawn_in_group_min, noyaw = def.noyaw or false, particlespawners = def.particlespawners, + spawn_check = def.spawn_check, -- End of MCL2 extensions on_spawn = def.on_spawn, on_blast = def.on_blast or function(self,damage) diff --git a/mods/ENTITIES/mcl_mobs/spawning.lua b/mods/ENTITIES/mcl_mobs/spawning.lua index 82870dcd3..9c51c0f86 100644 --- a/mods/ENTITIES/mcl_mobs/spawning.lua +++ b/mods/ENTITIES/mcl_mobs/spawning.lua @@ -742,11 +742,15 @@ local function spawn_check(pos, spawn_def) end elseif dimension == "overworld" then if mob_type == "monster" then - if art_light <= overworld_threshold and sky_light <= overworld_sky_threshold then + if mob_def.spawn_check then + return mob_def.spawn_check(pos, gotten_light, art_light, sky_light) + elseif art_light <= overworld_threshold and sky_light <= overworld_sky_threshold then return true end else - if gotten_light > overworld_passive_threshold then + if mob_def.spawn_check then + return mob_def.spawn_check(pos, gotten_light, art_light, sky_light) + elseif gotten_light > overworld_passive_threshold then return true end end diff --git a/mods/ENTITIES/mobs_mc/bat.lua b/mods/ENTITIES/mobs_mc/bat.lua index b5532e2ee..b8b650877 100644 --- a/mods/ENTITIES/mobs_mc/bat.lua +++ b/mods/ENTITIES/mobs_mc/bat.lua @@ -2,6 +2,18 @@ local S = minetest.get_translator("mobs_mc") +local function spawn_check(pos, environmental_light, artificial_light, sky_light) + local date = os.date("*t") + local maxlight + if (date.month == 10 and date.day >= 20) or (date.month == 11 and date.day <= 3) then + maxlight = 6 + else + maxlight = 3 + end + + return artificial_light <= maxlight +end + mcl_mobs.register_mob("mobs_mc:bat", { description = S("Bat"), type = "animal", @@ -50,6 +62,7 @@ mcl_mobs.register_mob("mobs_mc:bat", { jump = false, fly = true, makes_footstep_sound = false, + spawn_check = spawn_check, }) diff --git a/mods/ENTITIES/mobs_mc/slime+magma_cube.lua b/mods/ENTITIES/mobs_mc/slime+magma_cube.lua index c07afb6b1..9cc5191bc 100644 --- a/mods/ENTITIES/mobs_mc/slime+magma_cube.lua +++ b/mods/ENTITIES/mobs_mc/slime+magma_cube.lua @@ -161,6 +161,16 @@ local spawn_children_on_die = function(child_mob, spawn_distance, eject_speed) end end +local function slime_spawn_check(pos, environmental_light, artificial_light, sky_light) + local maxlight = swamp_light_max + + if is_slime_chunk(pos) then + maxlight = minetest.LIGHT_MAX + 1 + end + + return artificial_light <= maxlight +end + -- Slime local slime_big = { description = S("Slime"), @@ -213,6 +223,7 @@ local slime_big = { spawn_small_alternative = "mobs_mc:slime_small", on_die = spawn_children_on_die("mobs_mc:slime_small", 1.0, 1.5), use_texture_alpha = true, + spawn_check = slime_spawn_check, } mcl_mobs.register_mob("mobs_mc:slime_big", slime_big) From 95db11836180d3bd22865c75856a6a2039973bc8 Mon Sep 17 00:00:00 2001 From: codiac Date: Fri, 22 Sep 2023 09:09:35 +1000 Subject: [PATCH 198/982] Add rules for blaze, wither skeleton, silverfish --- mods/ENTITIES/mobs_mc/blaze.lua | 4 ++++ mods/ENTITIES/mobs_mc/piglin.lua | 5 +++++ mods/ENTITIES/mobs_mc/silverfish.lua | 5 +++++ 3 files changed, 14 insertions(+) diff --git a/mods/ENTITIES/mobs_mc/blaze.lua b/mods/ENTITIES/mobs_mc/blaze.lua index 6d92de210..98cf4728a 100644 --- a/mods/ENTITIES/mobs_mc/blaze.lua +++ b/mods/ENTITIES/mobs_mc/blaze.lua @@ -11,6 +11,9 @@ local mod_target = minetest.get_modpath("mcl_target") --################### BLAZE --################### +local function spawn_check(pos, environmental_light, artificial_light, sky_light) + return artificial_light <= 11 +end mcl_mobs.register_mob("mobs_mc:blaze", { description = S("Blaze"), @@ -137,6 +140,7 @@ mcl_mobs.register_mob("mobs_mc:blaze", { }, }) end, + spawn_check = spawn_check, }) mcl_mobs:spawn_specific( diff --git a/mods/ENTITIES/mobs_mc/piglin.lua b/mods/ENTITIES/mobs_mc/piglin.lua index 4f701b3e9..27f5a72f4 100644 --- a/mods/ENTITIES/mobs_mc/piglin.lua +++ b/mods/ENTITIES/mobs_mc/piglin.lua @@ -219,6 +219,10 @@ mcl_mobs.register_mob("mobs_mc:sword_piglin", sword_piglin) -- Zombified Piglin -- +local function spawn_check(pos, environmental_light, artificial_light, sky_light) + return artificial_light <= 11 +end + local zombified_piglin = { description = S("Zombie Piglin"), -- type="animal", passive=false: This combination is needed for a neutral mob which becomes hostile, if attacked @@ -256,6 +260,7 @@ local zombified_piglin = { }, jump = true, makes_footstep_sound = true, + spawn_check = spawn_check, walk_velocity = .8, run_velocity = 2.6, pathfinding = 1, diff --git a/mods/ENTITIES/mobs_mc/silverfish.lua b/mods/ENTITIES/mobs_mc/silverfish.lua index ab659a2a0..ec8ee19bb 100644 --- a/mods/ENTITIES/mobs_mc/silverfish.lua +++ b/mods/ENTITIES/mobs_mc/silverfish.lua @@ -4,6 +4,10 @@ local S = minetest.get_translator("mobs_mc") +local function spawn_check(pos, environmental_light, artificial_light, sky_light) + return artificial_light <= 11 +end + mcl_mobs.register_mob("mobs_mc:silverfish", { description = S("Silverfish"), type = "monster", @@ -53,6 +57,7 @@ mcl_mobs.register_mob("mobs_mc:silverfish", { view_range = 16, attack_type = "dogfight", damage = 1, + spawn_check = spawn_check, }) mcl_mobs.register_egg("mobs_mc:silverfish", S("Silverfish"), "#6d6d6d", "#313131", 0) From bb68ceb38d5509e69f7d348f74afc0eca77f062c Mon Sep 17 00:00:00 2001 From: Nils Dagsson Moskopp Date: Fri, 22 Sep 2023 20:05:27 +0200 Subject: [PATCH 199/982] Do not encode images with illegal colormap indexes --- examples.lua | 15 +++++++++++++++ init.lua | 12 ++++++++++++ 2 files changed, 27 insertions(+) diff --git a/examples.lua b/examples.lua index 0dd61090c..f304998db 100644 --- a/examples.lua +++ b/examples.lua @@ -164,3 +164,18 @@ local pixels = { { _, _, _, K, _, _, _ }, } tga_encoder.image(pixels):save("colormapped_B8G8R8A8.tga", {colormap=colormap}) + +-- encoding a colormapped image with illegal colormap indexes should error out +local colormap = { + { 0, 0, 0, 0 }, + { 0, 0, 0, 255 }, +} +local status, message = pcall( + function () + tga_encoder.image(pixels):encode({colormap=colormap}) + end +) +assert( + false == status and + "init.lua:36: colormap index 2 not in colormap of size 2" == message +) diff --git a/init.lua b/init.lua index ec7b3b8d3..7a3169ca5 100644 --- a/init.lua +++ b/init.lua @@ -28,6 +28,18 @@ function image:encode_colormap_spec(properties) colormap_pixel_depth = pixel_depth_by_color_format[ properties.color_format ] + -- ensure that each pixel references a legal colormap entry + for _, row in ipairs(self.pixels) do + for _, pixel in ipairs(row) do + local colormap_index = pixel[1] + if colormap_index >= #colormap then + error( + "colormap index " .. colormap_index .. + " not in colormap of size " .. #colormap + ) + end + end + end end local colormap_spec = string.char(0, 0) .. -- first entry index From 882c3ef33929d96ac9c5afcb5d84af58d572fc3a Mon Sep 17 00:00:00 2001 From: Blockhead Date: Mon, 25 Sep 2023 19:54:18 +1000 Subject: [PATCH 200/982] Point mcl_custom_skins link to a working URL --- mods/PLAYER/mcl_skins/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mods/PLAYER/mcl_skins/README.md b/mods/PLAYER/mcl_skins/README.md index 303dcf424..9b18ce4ca 100644 --- a/mods/PLAYER/mcl_skins/README.md +++ b/mods/PLAYER/mcl_skins/README.md @@ -3,7 +3,7 @@ This mod allows advanced skin customization. Use the /skin command to open the skin configuration screen. -To include custom skins in MineClone2, please download [mcl_custom_skins](https://git.minetest.land/mineclone2/mcl_custom_skins) +To include custom skins in MineClone2, please download [mcl_custom_skins](https://git.minetest.land/MrRar/mcl_custom_skins) ## License Code under MIT license From 4046a68fbf6b3f63bdb822a090c6c078caf26093 Mon Sep 17 00:00:00 2001 From: chmodsayshello Date: Tue, 26 Sep 2023 20:24:54 +0200 Subject: [PATCH 201/982] Add trim snippet --- mods/ITEMS/mcl_armor/api.lua | 22 +++++++++++++++++----- 1 file changed, 17 insertions(+), 5 deletions(-) diff --git a/mods/ITEMS/mcl_armor/api.lua b/mods/ITEMS/mcl_armor/api.lua index 8551201b3..558607785 100644 --- a/mods/ITEMS/mcl_armor/api.lua +++ b/mods/ITEMS/mcl_armor/api.lua @@ -96,14 +96,14 @@ local function get_armor_texture(textures, name, modname, itemname, itemstring) local core_armor_texture = mcl_armor.trims.core_textures[stack_name] if mcl_enchanting.is_enchanted(itemstack:get_name()) then -- working with the original stack to know wether to apply enchanting overlay or not - --[[Far, Far in the future we may no longer _enchanted itemstrings... - To fix this code, simply put the unmodified itemstring in stack_name's place - DO NOT REMOVE THIS if UNLESS YOU KNOW WHAT YOU'RE TRYING TO ACHIEVE!--]] + -- Far, Far in the future we may no longer _enchanted itemstrings... + -- To fix this code, simply put the unmodified itemstring in stack_name's place + -- DO NOT REMOVE THIS if UNLESS YOU KNOW WHAT YOU'RE TRYING TO ACHIEVE! core_armor_texture = core_armor_texture .. mcl_enchanting.overlay end if overlay == "" then return core_armor_texture end -- key not present; armor not trimmed - + return core_armor_texture .. overlay end @@ -321,4 +321,16 @@ function mcl_armor.reload_trim_inv_image(itemstack) local def = itemstack:get_definition() if inv_overlay == "" then return end meta:set_string("inventory_image", def.inventory_image .. inv_overlay) -end \ No newline at end of file +end + +tt.register_snippet(function(itemstring, toolcaps, stack) + if not stack then return nil end + local meta = stack:get_meta() + if meta:get_string("mcl_armor:trim_overlay") == "" then return nil end -- remember, get_string returns "" if the key doesn't exist + -- we need to get the part of the overlay image between the overlay begin ( and the trim name end _ + -- we COULD easily store this info in meta, but that would bloat the meta storage, as the same few values would be stored over and over again on every trimmed item + -- this is fine here as this code gets only executed when you put armor and a trim in a smithing table + local full_overlay = meta:get_string("mcl_armor:trim_overlay") + local trim_name = full_overlay:match("%((.-)%_") + return "Upgrade:\n " .. trim_name:gsub("^%l", string.upper) .. " Armor Trim" +end) \ No newline at end of file From eafe6627d825a20b9f3e38602d45f2240cd3bb49 Mon Sep 17 00:00:00 2001 From: Michieal Date: Tue, 26 Sep 2023 18:35:12 +0000 Subject: [PATCH 202/982] Extra checks placed in. --- mods/ITEMS/mcl_bamboo/bamboo_base.lua | 14 +++++++++++--- 1 file changed, 11 insertions(+), 3 deletions(-) diff --git a/mods/ITEMS/mcl_bamboo/bamboo_base.lua b/mods/ITEMS/mcl_bamboo/bamboo_base.lua index 2cc8b23c8..1c7e99a61 100644 --- a/mods/ITEMS/mcl_bamboo/bamboo_base.lua +++ b/mods/ITEMS/mcl_bamboo/bamboo_base.lua @@ -86,7 +86,12 @@ local bamboo_def = { on_rotate = on_rotate, on_place = function(itemstack, placer, pointed_thing) - if pointed_thing and pointed_thing.type ~= "node" then -- make sure that pointed_thing is not null and is pointing at a node. + + if not pointed_thing then + return itemstack + end + + if pointed_thing.type ~= "node" then return itemstack end local node = minetest.get_node(pointed_thing.under) @@ -201,7 +206,7 @@ local bamboo_def = { local node_above_name = minetest.get_node(pointed_thing.above).name mcl_bamboo.mcl_log("\n\n\nnode_above name: " .. node_above_name) if node_above_name ~= "mcl_core:water_source" and node_above_name ~= "mcl_core:lava_source" - and node_above_name ~= "mcl_nether:nether_lava_source" then + and node_above_name ~= "mcl_nether:nether_lava_source" then local _, position = minetest.item_place(place_item, placer, pointed_thing, fdir) if position then if not minetest.is_creative_enabled(placer:get_player_name()) then @@ -276,8 +281,11 @@ local bamboo_block_def = { _mcl_hardness = 2, _mcl_stripped_variant = "mcl_bamboo:bamboo_block_stripped", -- this allows us to use the built in Axe's strip block. on_place = function(itemstack, placer, pointed_thing) + if not pointed_thing then + return itemstack + end - if not pointed_thing then -- make sure that pointed_thing is not null + if pointed_thing.type ~= "node" then -- make sure that pointed_thing is not null and is pointing at a node. return itemstack end From e9d994b74d43715b4bda8339714e70a09c85b6c2 Mon Sep 17 00:00:00 2001 From: Michieal Date: Tue, 26 Sep 2023 18:57:17 +0000 Subject: [PATCH 203/982] Fix Campifires API to not crash the server. Fixed the error in Campfires' On_RightClick() to not error out when called with a non-existent pointed_thing. --- mods/ITEMS/mcl_campfires/api.lua | 3 +++ 1 file changed, 3 insertions(+) diff --git a/mods/ITEMS/mcl_campfires/api.lua b/mods/ITEMS/mcl_campfires/api.lua index 212beefbe..cd23a964b 100644 --- a/mods/ITEMS/mcl_campfires/api.lua +++ b/mods/ITEMS/mcl_campfires/api.lua @@ -332,6 +332,9 @@ function mcl_campfires.register_campfire(name, def) elseif minetest.get_item_group(itemstack:get_name(), "campfire_cookable") ~= 0 then mcl_campfires.take_item(pos, node, player, itemstack) else + if not pointed_thing then + return itemstack + end minetest.item_place_node(itemstack, player, pointed_thing) end end, From e8c658658df675fcad71bc2f7231e910276bde96 Mon Sep 17 00:00:00 2001 From: Michieal Date: Tue, 26 Sep 2023 18:59:51 +0000 Subject: [PATCH 204/982] Update Credits. --- mods/ITEMS/mcl_campfires/README.md | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/mods/ITEMS/mcl_campfires/README.md b/mods/ITEMS/mcl_campfires/README.md index 188134233..5390e982f 100644 --- a/mods/ITEMS/mcl_campfires/README.md +++ b/mods/ITEMS/mcl_campfires/README.md @@ -9,9 +9,10 @@ Authors: Gerold55 - Code Start + Models? PrairieWind - Improved and Cleaned Up Code, and added the soul campfire and crafting recipes. cora - Added burning damage. -DinoNuggies4665 - Cooking logic implemented -thunder1035 - Redesigned model and texture tweaks -AncientMariner - Changed smoke to particle spawner and tweaked particle configuration. +DinoNuggies4665 - Cooking logic implemented. +thunder1035 - Redesigned model and texture tweaks. +AncientMariner - Changed smoke to particle spawner and tweaked particle configuration. +Michieal - Fixed misc. errors. License of media ---------------- From 2bd6678b08355a0cd8dc36d1b94d2ae1efe0c254 Mon Sep 17 00:00:00 2001 From: Johannes Fritz Date: Thu, 28 Sep 2023 13:09:45 -0500 Subject: [PATCH 205/982] mcl_skins: link to official mcl_custom_skins --- mods/PLAYER/mcl_skins/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mods/PLAYER/mcl_skins/README.md b/mods/PLAYER/mcl_skins/README.md index 9b18ce4ca..4a5d150db 100644 --- a/mods/PLAYER/mcl_skins/README.md +++ b/mods/PLAYER/mcl_skins/README.md @@ -3,7 +3,7 @@ This mod allows advanced skin customization. Use the /skin command to open the skin configuration screen. -To include custom skins in MineClone2, please download [mcl_custom_skins](https://git.minetest.land/MrRar/mcl_custom_skins) +To include custom skins in MineClone2, please download the [mcl_custom_skins](https://codeberg.org/MineClone2/mcl_custom_skins) mod. ## License Code under MIT license From 8936313fb39afc89f7b851bb4d365718d65b4f8a Mon Sep 17 00:00:00 2001 From: chmodsayshello Date: Fri, 29 Sep 2023 16:59:45 +0200 Subject: [PATCH 206/982] proper itemslot background redo of https://codeberg.org/mineclonia/mineclonia/commit/904cd78d3f6c64f8457932093ab03e0239b5ef11 ; caused some issues after cherry pick, same texture --- mods/ITEMS/mcl_smithing_table/init.lua | 3 ++- textures/mcl_smithing_table_inventory_trim_bg.png | Bin 0 -> 244 bytes 2 files changed, 2 insertions(+), 1 deletion(-) create mode 100644 textures/mcl_smithing_table_inventory_trim_bg.png diff --git a/mods/ITEMS/mcl_smithing_table/init.lua b/mods/ITEMS/mcl_smithing_table/init.lua index f6bfe91fb..4690a1ed6 100644 --- a/mods/ITEMS/mcl_smithing_table/init.lua +++ b/mods/ITEMS/mcl_smithing_table/init.lua @@ -48,7 +48,8 @@ local formspec = table.concat({ mcl_formspec.get_itemslot_bg_v4(4.75, 2.6, 1, 1), "list[context;mineral;4.75,2.6;1,1;]", - mcl_formspec.get_itemslot_bg_v4(6,2.6,1,1), + mcl_formspec.get_itemslot_bg_v4(6, 2.6, 1, 1), + mcl_formspec.get_itemslot_bg_v4(6, 2.6, 1, 1, 0, "mcl_smithing_table_inventory_trim_bg.png"), "list[context;template;6,2.6;1,1;]", "image[7,2.6;2,1;mcl_anvils_inventory_arrow.png]", diff --git a/textures/mcl_smithing_table_inventory_trim_bg.png b/textures/mcl_smithing_table_inventory_trim_bg.png new file mode 100644 index 0000000000000000000000000000000000000000..1b01c9a09f4618a8e4fc6f1adbca3ebb66601ea6 GIT binary patch literal 244 zcmV@_5(QwML>+P`e=KR z4M3Wv3b=@%=zxe$$G8EQYV|_et$E5p@4abCWk6gOT)VCqBRh9UiE=7V1Vr@tg=QdT us4AEluMp}s0pK}~1^|!y-E#T=PrU(?CQN4?;c0sS0000 Date: Mon, 19 Jun 2023 03:03:11 +0000 Subject: [PATCH 207/982] Reduced the creeper explosion timer reset radius from 6 to 3 This gives the player just enough time to get out of the creeper's range, to reset their explosion timer and avoid unnecessary destruction. --- mods/ENTITIES/mobs_mc/creeper.lua | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/mods/ENTITIES/mobs_mc/creeper.lua b/mods/ENTITIES/mobs_mc/creeper.lua index 72661971e..a36550a93 100644 --- a/mods/ENTITIES/mobs_mc/creeper.lua +++ b/mods/ENTITIES/mobs_mc/creeper.lua @@ -50,7 +50,7 @@ mcl_mobs.register_mob("mobs_mc:creeper", { explosion_strength = 3, explosion_radius = 3.5, explosion_damage_radius = 3.5, - explosiontimer_reset_radius = 6, + explosiontimer_reset_radius = 3, reach = 3, explosion_timer = 1.5, allow_fuse_reset = true, @@ -172,7 +172,7 @@ mcl_mobs.register_mob("mobs_mc:creeper_charged", { explosion_strength = 6, explosion_radius = 8, explosion_damage_radius = 8, - explosiontimer_reset_radius = 6, + explosiontimer_reset_radius = 3, reach = 3, explosion_timer = 1.5, allow_fuse_reset = true, From a620d24ec848d6a7e20a43f462bcbf09ccca683c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=F0=9D=95=B5=F0=9D=96=94=F0=9D=96=8D=F0=9D=96=86?= =?UTF-8?q?=F0=9D=96=93=F0=9D=96=93=F0=9D=96=8A=F0=9D=96=98=20=F0=9D=95=B1?= =?UTF-8?q?=F0=9D=96=97=F0=9D=96=8E=F0=9D=96=99=F0=9D=96=9F?= Date: Fri, 29 Sep 2023 18:47:07 +0000 Subject: [PATCH 208/982] Fix a number of crashes involving unknown nodes, also fix fishbuckets on_place (#3914) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Fixes: #3913 #3915 ~~You can reproduce the crash by placing a fish bucket on top snow above an unknown node. I also noticed that the code always uses pointed_thing.above so I fixed that and also added a function to mcl_utils to figure out where a node should be placed (either above or below). Looks like the rest of the code could also use improvement but at least it does not crash now.~~ Cora fixed a bunch of related crashes in Mineclona so I am replacing my commit and cherry picking all her commits here. https://codeberg.org/mineclonia/mineclonia/pulls/549 Here is the list of fixes from that PR: - Crash when placing snow layer on unknown nodes - Crash when snow layers on unknown nodes are flooded - Crash when placing fishbucket on snow on top of unknown nodes - Crash when placing chorus flower and stem on unknown - Crash when placing mob spawners on unknown - The fishbucket on place to actually replace buildable_to Co-authored-by: cora Reviewed-on: https://git.minetest.land/MineClone2/MineClone2/pulls/3914 Reviewed-by: ancientmarinerdev Co-authored-by: 𝕵𝖔𝖍𝖆𝖓𝖓𝖊𝖘 𝕱𝖗𝖎𝖙𝖟 Co-committed-by: 𝕵𝖔𝖍𝖆𝖓𝖓𝖊𝖘 𝕱𝖗𝖎𝖙𝖟 --- mods/ITEMS/mcl_buckets/fishbuckets.lua | 23 ++++++++++++++++------- mods/ITEMS/mcl_core/functions.lua | 6 +++--- mods/ITEMS/mcl_core/nodes_base.lua | 2 +- mods/ITEMS/mcl_end/chorus_plant.lua | 6 ++++-- mods/ITEMS/mcl_mobspawners/init.lua | 3 ++- 5 files changed, 26 insertions(+), 14 deletions(-) diff --git a/mods/ITEMS/mcl_buckets/fishbuckets.lua b/mods/ITEMS/mcl_buckets/fishbuckets.lua index 185f72486..bc93654da 100644 --- a/mods/ITEMS/mcl_buckets/fishbuckets.lua +++ b/mods/ITEMS/mcl_buckets/fishbuckets.lua @@ -18,13 +18,21 @@ local function on_place_fish(itemstack, placer, pointed_thing) return new_stack end - local pos = pointed_thing.above or pointed_thing.under - if not pos then return end - local n = minetest.get_node_or_nil(pos) - if n.name and minetest.registered_nodes[n.name].buildable_to or n.name == "mcl_portals:portal" then - local fish = itemstack:get_name():gsub(fishbucket_prefix,"") - if fish_names[fish] then - local o = minetest.add_entity(pos, "mobs_mc:" .. fish) + if pointed_thing.type ~= "node" then return end + + local pos = pointed_thing.above + local n = minetest.get_node(pointed_thing.above) + local def = minetest.registered_nodes[minetest.get_node(pointed_thing.under).name] + + if ( def and def.buildable_to ) or n.name == "mcl_portals:portal" then + pos = pointed_thing.under + n = minetest.get_node(pointed_thing.under) + end + + local fish = itemstack:get_definition()._mcl_buckets_fish + if fish_names[fish] then + local o = minetest.add_entity(pos, "mobs_mc:" .. fish) + if o and o:get_pos() then local props = itemstack:get_meta():get_string("properties") if props ~= "" then o:set_properties(minetest.deserialize(props)) @@ -60,6 +68,7 @@ for techname, fishname in pairs(fish_names) do stack_max = 1, groups = {bucket = 1, fish_bucket = 1}, liquids_pointable = false, + _mcl_buckets_fish = techname, on_place = on_place_fish, on_secondary_use = on_place_fish, _on_dispense = function(stack, pos, droppos, dropnode, dropdir) diff --git a/mods/ITEMS/mcl_core/functions.lua b/mods/ITEMS/mcl_core/functions.lua index b7623bf11..ad2346dd9 100644 --- a/mods/ITEMS/mcl_core/functions.lua +++ b/mods/ITEMS/mcl_core/functions.lua @@ -1581,7 +1581,7 @@ end -- MUST NOT be called if there is a snow cover node above pos. function mcl_core.clear_snow_dirt(pos, node) local def = minetest.registered_nodes[node.name] - if def._mcl_snowless then + if def and def._mcl_snowless then minetest.swap_node(pos, {name = def._mcl_snowless, param2=node.param2}) end end @@ -1602,7 +1602,7 @@ function mcl_core.on_snowable_construct(pos) -- Make snowed if needed if minetest.get_item_group(anode.name, "snow_cover") == 1 then local def = minetest.registered_nodes[node.name] - if def._mcl_snowed then + if def and def._mcl_snowed then minetest.swap_node(pos, {name = def._mcl_snowed, param2=node.param2}) end end @@ -1623,7 +1623,7 @@ function mcl_core.on_snow_construct(pos) local npos = {x=pos.x, y=pos.y-1, z=pos.z} local node = minetest.get_node(npos) local def = minetest.registered_nodes[node.name] - if def._mcl_snowed then + if def and def._mcl_snowed then minetest.swap_node(npos, {name = def._mcl_snowed, param2=node.param2}) end end diff --git a/mods/ITEMS/mcl_core/nodes_base.lua b/mods/ITEMS/mcl_core/nodes_base.lua index 79cd37d8e..01de997d5 100644 --- a/mods/ITEMS/mcl_core/nodes_base.lua +++ b/mods/ITEMS/mcl_core/nodes_base.lua @@ -1038,7 +1038,7 @@ for i=1,8 do -- Get position where snow would be placed local target - if minetest.registered_nodes[unode.name].buildable_to then + if def and def.buildable_to then target = under else target = above diff --git a/mods/ITEMS/mcl_end/chorus_plant.lua b/mods/ITEMS/mcl_end/chorus_plant.lua index 4dc54db18..7f2064a3e 100644 --- a/mods/ITEMS/mcl_end/chorus_plant.lua +++ b/mods/ITEMS/mcl_end/chorus_plant.lua @@ -155,7 +155,8 @@ minetest.register_node("mcl_end:chorus_flower", { 1) On top of end stone or chorus plant 2) On top of air and horizontally adjacent to exactly 1 chorus plant ]] local pos - if minetest.registered_nodes[node_under.name].buildable_to then + local def = minetest.registered_nodes[node_under.name] + if def and def.buildable_to then pos = pointed_thing.under else pos = pointed_thing.above @@ -283,7 +284,8 @@ minetest.register_node("mcl_end:chorus_plant", { condition is met: - placed on end stone or any chorus node ]] local pos_place, node_check - if minetest.registered_nodes[node_under.name].buildable_to then + local def = minetest.registered_nodes[node_under.name] + if def and def.buildable_to then pos_place = pointed_thing.under node_check = node_above else diff --git a/mods/ITEMS/mcl_mobspawners/init.lua b/mods/ITEMS/mcl_mobspawners/init.lua index c5c2212b6..290980e78 100644 --- a/mods/ITEMS/mcl_mobspawners/init.lua +++ b/mods/ITEMS/mcl_mobspawners/init.lua @@ -301,7 +301,8 @@ minetest.register_node("mcl_mobspawners:spawner", { local new_itemstack, success = minetest.item_place(itemstack, placer, pointed_thing) if success then local placepos - if minetest.registered_nodes[node_under.name].buildable_to then + local def = minetest.registered_nodes[node_under.name] + if def and def.buildable_to then placepos = pointed_thing.under else placepos = pointed_thing.above From 0c48a46f7cf9a24745e56873f6081db52afec9e6 Mon Sep 17 00:00:00 2001 From: Dehydrate6684 Date: Mon, 9 Oct 2023 13:55:08 +0800 Subject: [PATCH 209/982] Updated code based on reviews --- mods/ITEMS/mcl_core/nodes_climb.lua | 72 +++++++++++-------- mods/ITEMS/mcl_doors/api_trapdoors.lua | 98 +++++++++++--------------- 2 files changed, 83 insertions(+), 87 deletions(-) diff --git a/mods/ITEMS/mcl_core/nodes_climb.lua b/mods/ITEMS/mcl_core/nodes_climb.lua index ca45a39f5..7bad7b318 100644 --- a/mods/ITEMS/mcl_core/nodes_climb.lua +++ b/mods/ITEMS/mcl_core/nodes_climb.lua @@ -17,15 +17,17 @@ end ---@param ladder integer The param2 value of the ladder. ---@param trapdoor integer The param2 value of the trapdoor. ---@return boolean If the ladder and trapdoor are in the same direction. -local function check_direction(ladder, trapdoor) - local convert_table = {}; - convert_table[2] = { 1, 23 } - convert_table[3] = { 3, 21 } - convert_table[4] = { 0, 20 } - convert_table[5] = { 2, 22 } +function mcl_core.check_direction(ladder, trapdoor) + local convert_table = { + nil, + { 1, 23 }, + { 3, 21 }, + { 0, 20 }, + { 2, 22 }, + } local conversion = convert_table[ladder]; - if conversion == nil then + if not conversion then return false elseif conversion[1] == trapdoor or conversion[2] == trapdoor then return true @@ -42,7 +44,10 @@ end local function update_trapdoor(pos, ladder, event) local top_pos = vector.add(pos, { x = 0, y = 1, z = 0 }) local top_node = minetest.get_node_or_nil(top_pos) - if top_node then + + + if top_node and minetest.get_item_group(top_node.name, "trapdoor") == 2 + and mcl_core.check_direction(ladder, top_node.param2) then local new_name = top_node.name if event == "place" then new_name = string.gsub(new_name, "open$", "ladder") @@ -50,26 +55,23 @@ local function update_trapdoor(pos, ladder, event) new_name = string.gsub(new_name, "ladder$", "open") end - local is_trapdoor = minetest.get_item_group(top_node.name, "trapdoor") - -- If node above is an opened trapdoor - if is_trapdoor == 2 and check_direction(ladder, top_node.param2) then - minetest.swap_node(top_pos, { - name = new_name, - param1 = top_node.param1, - param2 = top_node.param2, - }) - end + minetest.swap_node(top_pos, { + name = new_name, + param1 = top_node.param1, + param2 = top_node.param2, + }) end end -- TODO: Move ladders into their own API. minetest.register_node("mcl_core:ladder", { description = S("Ladder"), - _doc_items_longdesc = S("A piece of ladder which allows you to climb vertically. Ladders can only be placed on the side of solid blocks and not on glass, leaves, ice, slabs, glowstone, nor sea lanterns."), + _doc_items_longdesc = S( + "A piece of ladder which allows you to climb vertically. Ladders can only be placed on the side of solid blocks and not on glass, leaves, ice, slabs, glowstone, nor sea lanterns."), drawtype = "signlike", is_ground_content = false, - tiles = {"default_ladder.png"}, + tiles = { "default_ladder.png" }, inventory_image = "default_ladder.png", wield_image = "default_ladder.png", paramtype = "light", @@ -79,11 +81,11 @@ minetest.register_node("mcl_core:ladder", { climbable = true, node_box = { type = "wallmounted", - wall_side = { -0.5, -0.5, -0.5, -7/16, 0.5, 0.5 }, + wall_side = { -0.5, -0.5, -0.5, -7 / 16, 0.5, 0.5 }, }, selection_box = { type = "wallmounted", - wall_side = { -0.5, -0.5, -0.5, -7/16, 0.5, 0.5 }, + wall_side = { -0.5, -0.5, -0.5, -7 / 16, 0.5, 0.5 }, }, stack_max = 64, groups = { @@ -113,7 +115,7 @@ minetest.register_node("mcl_core:ladder", { -- Don't allow to place the ladder at particular nodes if (groups and (groups.glass or groups.leaves or groups.slab)) or - node.name == "mcl_core:ladder" or node.name == "mcl_core:ice" or node.name == "mcl_nether:glowstone" or node.name == "mcl_ocean:sea_lantern" then + node.name == "mcl_core:ladder" or node.name == "mcl_core:ice" or node.name == "mcl_nether:glowstone" or node.name == "mcl_ocean:sea_lantern" then return itemstack end @@ -135,7 +137,7 @@ minetest.register_node("mcl_core:ladder", { if success then if idef.sounds and idef.sounds.place then - minetest.sound_play(idef.sounds.place, {pos=above, gain=1}, true) + minetest.sound_play(idef.sounds.place, { pos = above, gain = 1 }, true) end end return itemstack @@ -155,9 +157,10 @@ minetest.register_node("mcl_core:ladder", { minetest.register_node("mcl_core:vine", { description = S("Vines"), - _doc_items_longdesc = S("Vines are climbable blocks which can be placed on the sides of solid full-cube blocks. Vines slowly grow and spread."), + _doc_items_longdesc = S( + "Vines are climbable blocks which can be placed on the sides of solid full-cube blocks. Vines slowly grow and spread."), drawtype = "signlike", - tiles = {"mcl_core_vine.png"}, + tiles = { "mcl_core_vine.png" }, color = "#48B518", inventory_image = "mcl_core_vine.png", wield_image = "mcl_core_vine.png", @@ -173,9 +176,18 @@ minetest.register_node("mcl_core:vine", { }, stack_max = 64, groups = { - handy = 1, axey = 1, shearsy = 1, swordy = 1, deco_block = 1, - dig_by_piston = 1, destroy_by_lava_flow = 1, compostability = 50, - flammable = 2, fire_encouragement = 15, fire_flammability = 100, foliage_palette_wallmounted = 1 + handy = 1, + axey = 1, + shearsy = 1, + swordy = 1, + deco_block = 1, + dig_by_piston = 1, + destroy_by_lava_flow = 1, + compostability = 50, + flammable = 2, + fire_encouragement = 15, + fire_flammability = 100, + foliage_palette_wallmounted = 1 }, sounds = mcl_sounds.node_sound_leaves_defaults(), drop = "", @@ -217,7 +229,7 @@ minetest.register_node("mcl_core:vine", { if success then if idef.sounds and idef.sounds.place then - minetest.sound_play(idef.sounds.place, {pos=above, gain=1}, true) + minetest.sound_play(idef.sounds.place, { pos = above, gain = 1 }, true) end end return itemstack @@ -240,7 +252,7 @@ minetest.register_node("mcl_core:vine", { -- If dug, also dig a “dependant” vine below it. -- A vine is dependant if it hangs from this node and has no supporting block. on_dig = function(pos, node, digger) - local below = vector.offset(pos,0,-1,0) + local below = vector.offset(pos, 0, -1, 0) local belownode = minetest.get_node(below) minetest.node_dig(pos, node, digger) if belownode.name == node.name and (not mcl_core.check_vines_supported(below, belownode)) then diff --git a/mods/ITEMS/mcl_doors/api_trapdoors.lua b/mods/ITEMS/mcl_doors/api_trapdoors.lua index 1ea45abbf..61530ab98 100644 --- a/mods/ITEMS/mcl_doors/api_trapdoors.lua +++ b/mods/ITEMS/mcl_doors/api_trapdoors.lua @@ -48,29 +48,6 @@ if minetest.get_modpath("screwdriver") then end end ----Checks the direction (param2) of a ladder and a trapdoor and determine if they are ----facing the same direction. ---- ----@param ladder integer The param2 value of the ladder. ----@param trapdoor integer The param2 value of the trapdoor. ----@return boolean If the ladder and trapdoor are in the same direction. -function check_direction(ladder, trapdoor) - local convert_table = {}; - convert_table[2] = { 1, 23 } - convert_table[3] = { 3, 21 } - convert_table[4] = { 0, 20 } - convert_table[5] = { 2, 22 } - - local conversion = convert_table[ladder]; - if conversion == nil then - return false - elseif conversion[1] == trapdoor or conversion[2] == trapdoor then - return true - end - - return false -end - function mcl_doors:register_trapdoor(name, def) local groups = table.copy(def.groups) if groups == nil then @@ -102,7 +79,7 @@ function mcl_doors:register_trapdoor(name, def) -- Checking if there is something underneath the trapdoor if bottom_node then local is_ladder = minetest.get_item_group(bottom_node.name, "ladder") - local same_direction = check_direction(bottom_node.param2, me.param2) + local same_direction = mcl_core.check_direction(bottom_node.param2, me.param2) if is_ladder > 0 and same_direction then name_end = "_ladder" end @@ -124,20 +101,22 @@ function mcl_doors:register_trapdoor(name, def) longdesc = def._doc_items_longdesc if not longdesc then if def.only_redstone_can_open then - longdesc = S("Trapdoors are horizontal barriers which can be opened or closed and climbed like a ladder when open. They occupy the upper or lower part of a block, depending on how they have been placed. This trapdoor can only be opened or closed by redstone power.") + longdesc = S( + "Trapdoors are horizontal barriers which can be opened or closed and climbed like a ladder when open. They occupy the upper or lower part of a block, depending on how they have been placed. This trapdoor can only be opened or closed by redstone power.") else - longdesc = S("Trapdoors are horizontal barriers which can be opened or closed and climbed like a ladder when open. They occupy the upper or lower part of a block, depending on how they have been placed. This trapdoor can be opened or closed by hand or redstone power.") + longdesc = S( + "Trapdoors are horizontal barriers which can be opened or closed and climbed like a ladder when open. They occupy the upper or lower part of a block, depending on how they have been placed. This trapdoor can be opened or closed by hand or redstone power.") end end usagehelp = def._doc_items_usagehelp if not usagehelp and not def.only_redstone_can_open then usagehelp = S("To open or close this trapdoor, rightclick it or send a redstone signal to it.") end - if def.only_redstone_can_open then - tt_help = S("Openable by redstone power") - else - tt_help = S("Openable by players and redstone power") - end + if def.only_redstone_can_open then + tt_help = S("Openable by redstone power") + else + tt_help = S("Openable by players and redstone power") + end -- Closed trapdoor @@ -163,7 +142,7 @@ function mcl_doors:register_trapdoor(name, def) _doc_items_usagehelp = usagehelp, drawtype = "nodebox", tiles = tiles_closed, - use_texture_alpha = minetest.features.use_texture_alpha_string_modes and "clip" or true, + use_texture_alpha = "clip", inventory_image = def.inventory_image, wield_image = def.wield_image, is_ground_content = false, @@ -178,13 +157,15 @@ function mcl_doors:register_trapdoor(name, def) node_box = { type = "fixed", fixed = { - {-8/16, -8/16, -8/16, 8/16, -5/16, 8/16},}, + { -8 / 16, -8 / 16, -8 / 16, 8 / 16, -5 / 16, 8 / 16 }, }, + }, + mesecons = { + effector = { + action_on = (function(pos, node) + punch(pos) + end), + } }, - mesecons = {effector = { - action_on = (function(pos, node) - punch(pos) - end), - }}, on_place = function(itemstack, placer, pointed_thing) local p0 = pointed_thing.under local p1 = pointed_thing.above @@ -199,7 +180,7 @@ function mcl_doors:register_trapdoor(name, def) --local origname = itemstack:get_name() if p0.y - 1 == p1.y or (fpos > 0 and fpos < 0.5) - or (fpos < -0.5 and fpos > -0.999999999) then + or (fpos < -0.5 and fpos > -0.999999999) then param2 = param2 + 20 if param2 == 21 then param2 = 23 @@ -229,10 +210,10 @@ function mcl_doors:register_trapdoor(name, def) groups_open.trapdoor = 2 groups_open.not_in_creative_inventory = 1 -- Non-climbable opened - minetest.register_node(name.."_open", { + minetest.register_node(name .. "_open", { drawtype = "nodebox", tiles = tiles_open, - use_texture_alpha = minetest.features.use_texture_alpha_string_modes and "clip" or true, + use_texture_alpha = "clip", is_ground_content = false, paramtype = "light", paramtype2 = "facedir", @@ -245,22 +226,24 @@ function mcl_doors:register_trapdoor(name, def) drop = name, node_box = { type = "fixed", - fixed = {-0.5, -0.5, 5/16, 0.5, 0.5, 0.5} + fixed = { -0.5, -0.5, 5 / 16, 0.5, 0.5, 0.5 } }, on_rightclick = on_rightclick, - mesecons = {effector = { - action_off = (function(pos, node) - punch(pos) - end), - }}, + mesecons = { + effector = { + action_off = (function(pos, node) + punch(pos) + end), + } + }, on_rotate = on_rotate, }) -- Climbable opened - minetest.register_node(name.."_ladder", { + minetest.register_node(name .. "_ladder", { drawtype = "nodebox", tiles = tiles_open, - use_texture_alpha = minetest.features.use_texture_alpha_string_modes and "clip" or true, + use_texture_alpha = "clip", is_ground_content = false, paramtype = "light", paramtype2 = "facedir", @@ -274,19 +257,20 @@ function mcl_doors:register_trapdoor(name, def) drop = name, node_box = { type = "fixed", - fixed = {-0.5, -0.5, 5/16, 0.5, 0.5, 0.5} + fixed = { -0.5, -0.5, 5 / 16, 0.5, 0.5, 0.5 } }, on_rightclick = on_rightclick, - mesecons = {effector = { - action_off = (function(pos, node) - punch(pos) - end), - }}, + mesecons = { + effector = { + action_off = (function(pos, node) + punch(pos) + end), + } + }, on_rotate = on_rotate, }) if minetest.get_modpath("doc") then - doc.add_entry_alias("nodes", name, "nodes", name.."_open") + doc.add_entry_alias("nodes", name, "nodes", name .. "_open") end - end From 23468cc2ddeb85dcdf496debae3380441b9ba6db Mon Sep 17 00:00:00 2001 From: Dehydrate6684 Date: Tue, 10 Oct 2023 09:39:16 +0800 Subject: [PATCH 210/982] Used vector.offset instead of add/subtract --- mods/ITEMS/mcl_core/nodes_climb.lua | 2 +- mods/ITEMS/mcl_doors/api_trapdoors.lua | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/mods/ITEMS/mcl_core/nodes_climb.lua b/mods/ITEMS/mcl_core/nodes_climb.lua index 7bad7b318..81022bbb3 100644 --- a/mods/ITEMS/mcl_core/nodes_climb.lua +++ b/mods/ITEMS/mcl_core/nodes_climb.lua @@ -42,7 +42,7 @@ end ---@param ladder integer The param2 value of the ladder. ---@param event "place" | "destruct" The place or destruct event. local function update_trapdoor(pos, ladder, event) - local top_pos = vector.add(pos, { x = 0, y = 1, z = 0 }) + local top_pos = vector.offset(pos, 0, 1, 0) local top_node = minetest.get_node_or_nil(top_pos) diff --git a/mods/ITEMS/mcl_doors/api_trapdoors.lua b/mods/ITEMS/mcl_doors/api_trapdoors.lua index 61530ab98..17765f27e 100644 --- a/mods/ITEMS/mcl_doors/api_trapdoors.lua +++ b/mods/ITEMS/mcl_doors/api_trapdoors.lua @@ -73,7 +73,7 @@ function mcl_doors:register_trapdoor(name, def) else minetest.sound_play(def.sound_open, { pos = pos, gain = 0.3, max_hear_distance = 16 }, true) - local bottom_node = minetest.get_node_or_nil(vector.subtract(pos, { x = 0, y = 1, z = 0 })) + local bottom_node = minetest.get_node_or_nil(vector.offset(pos, 0, -1, 0)) local name_end = "_open" -- Checking if there is something underneath the trapdoor From d7fa24ebf8a1b112acef49f62fe3bf4859658796 Mon Sep 17 00:00:00 2001 From: ThePython10110 Date: Tue, 10 Oct 2023 23:50:46 +0000 Subject: [PATCH 211/982] Keep axolotls from attacking sheep --- mods/ENTITIES/mobs_mc/axolotl.lua | 1 - 1 file changed, 1 deletion(-) diff --git a/mods/ENTITIES/mobs_mc/axolotl.lua b/mods/ENTITIES/mobs_mc/axolotl.lua index 087f201c7..187e899cf 100644 --- a/mods/ENTITIES/mobs_mc/axolotl.lua +++ b/mods/ENTITIES/mobs_mc/axolotl.lua @@ -78,7 +78,6 @@ local axolotl = { attack_animals = true, specific_attack = { "extra_mobs_cod", - "mobs_mc:sheep", "extra_mobs_glow_squid", "extra_mobs_salmon", "extra_mobs_tropical_fish", From a1b6819756d567a9e9f7da7801f7ee10d2ad3e6b Mon Sep 17 00:00:00 2001 From: Nauta Turbidus <88062389+nauta-turbidus@users.noreply.github.com> Date: Tue, 8 Aug 2023 02:53:01 +0200 Subject: [PATCH 212/982] Withering effect and effect immunities Added withering effect and immunities to effects. Signed-off-by: Nauta Turbidus <88062389+nauta-turbidus@users.noreply.github.com> --- mods/ENTITIES/mcl_mobs/combat.lua | 7 ++ mods/ENTITIES/mcl_mobs/init.lua | 2 + mods/ENTITIES/mcl_wither_spawning/init.lua | 7 +- mods/ENTITIES/mobs_mc/ender_dragon.lua | 3 +- mods/ENTITIES/mobs_mc/skeleton_wither.lua | 5 + mods/ENTITIES/mobs_mc/spider.lua | 5 + mods/ENTITIES/mobs_mc/wither.lua | 82 ++++++++++++++- mods/ITEMS/mcl_potions/commands.lua | 1 + mods/ITEMS/mcl_potions/functions.lua | 99 +++++++++++++++++- mods/ITEMS/mcl_potions/init.lua | 19 +++- mods/ITEMS/mcl_potions/mod.conf | 2 +- mods/ITEMS/mcl_potions/potions.lua | 24 ++++- textures/mcl_potions_effect_withering.png | Bin 0 -> 181 bytes textures/mcl_potions_icon_regen_wither.png | Bin 0 -> 674 bytes textures/mcl_potions_icon_wither.png | Bin 0 -> 660 bytes textures/mobs_mc_wither_projectile.png | Bin 0 -> 309 bytes textures/mobs_mc_wither_projectile_strong.png | Bin 0 -> 279 bytes 17 files changed, 239 insertions(+), 17 deletions(-) create mode 100644 textures/mcl_potions_effect_withering.png create mode 100644 textures/mcl_potions_icon_regen_wither.png create mode 100644 textures/mcl_potions_icon_wither.png create mode 100644 textures/mobs_mc_wither_projectile.png create mode 100644 textures/mobs_mc_wither_projectile_strong.png diff --git a/mods/ENTITIES/mcl_mobs/combat.lua b/mods/ENTITIES/mcl_mobs/combat.lua index 4b3393e36..0ddc62d29 100644 --- a/mods/ENTITIES/mcl_mobs/combat.lua +++ b/mods/ENTITIES/mcl_mobs/combat.lua @@ -21,6 +21,8 @@ local function atan(x) end end +mcl_mobs.effect_functions = {} + -- check if daytime and also if mob is docile during daylight hours function mob_class:day_docile() @@ -1103,6 +1105,11 @@ function mob_class:do_states_attack (dtime) full_punch_interval = 1.0, damage_groups = {fleshy = self.damage} }, nil) + if self.dealt_effect then + mcl_mobs.effect_functions[self.dealt_effect.name]( + self.attack, self.dealt_effect.factor, self.dealt_effect.dur + ) + end end else self.custom_attack(self, p) diff --git a/mods/ENTITIES/mcl_mobs/init.lua b/mods/ENTITIES/mcl_mobs/init.lua index 62100c627..f7699affa 100644 --- a/mods/ENTITIES/mcl_mobs/init.lua +++ b/mods/ENTITIES/mcl_mobs/init.lua @@ -312,6 +312,8 @@ function mcl_mobs.register_mob(name, def) return self:mob_activate(staticdata, def, dtime) end, harmed_by_heal = def.harmed_by_heal, + is_boss = def.is_boss, + dealt_effect = def.dealt_effect, on_lightning_strike = def.on_lightning_strike } minetest.register_entity(name, setmetatable(final_def,mcl_mobs.mob_class_meta)) diff --git a/mods/ENTITIES/mcl_wither_spawning/init.lua b/mods/ENTITIES/mcl_wither_spawning/init.lua index 74cd1e6e2..8d4ec524b 100644 --- a/mods/ENTITIES/mcl_wither_spawning/init.lua +++ b/mods/ENTITIES/mcl_wither_spawning/init.lua @@ -16,8 +16,13 @@ for _, d in pairs(dim) do end local function check_schem(pos, schem) + local cn_name for _, n in pairs(schem) do - if minetest.get_node(vector.add(pos, n)).name ~= n.name then + cn_name = minetest.get_node(vector.add(pos, n)).name + if string.find(cn_name, "mcl_heads:wither_skeleton") then + cn_name = "mcl_heads:wither_skeleton" + end + if cn_name ~= n.name then return false end end diff --git a/mods/ENTITIES/mobs_mc/ender_dragon.lua b/mods/ENTITIES/mobs_mc/ender_dragon.lua index fb92f51c4..d916596dd 100644 --- a/mods/ENTITIES/mobs_mc/ender_dragon.lua +++ b/mods/ENTITIES/mobs_mc/ender_dragon.lua @@ -127,7 +127,7 @@ mcl_mobs.register_mob("mobs_mc:enderdragon", { minetest.set_node(vector.add(self._portal_pos, vector.new(0, 5, 0)), {name = "mcl_end:dragon_egg"}) end end - + -- Free The End Advancement for _,players in pairs(minetest.get_objects_inside_radius(pos,64)) do if players:is_player() then @@ -136,6 +136,7 @@ mcl_mobs.register_mob("mobs_mc:enderdragon", { end end, fire_resistant = true, + is_boss = true, }) diff --git a/mods/ENTITIES/mobs_mc/skeleton_wither.lua b/mods/ENTITIES/mobs_mc/skeleton_wither.lua index 314260581..865fa13f0 100644 --- a/mods/ENTITIES/mobs_mc/skeleton_wither.lua +++ b/mods/ENTITIES/mobs_mc/skeleton_wither.lua @@ -96,6 +96,11 @@ mcl_mobs.register_mob("mobs_mc:witherskeleton", { fear_height = 4, harmed_by_heal = true, fire_resistant = true, + dealt_effect = { + name = "withering", + factor = 1, + dur = 10, + }, }) --spawn diff --git a/mods/ENTITIES/mobs_mc/spider.lua b/mods/ENTITIES/mobs_mc/spider.lua index 65d3a2d21..90ea384f1 100644 --- a/mods/ENTITIES/mobs_mc/spider.lua +++ b/mods/ENTITIES/mobs_mc/spider.lua @@ -138,6 +138,11 @@ cave_spider.walk_velocity = 1.3 cave_spider.run_velocity = 3.2 cave_spider.sounds = table.copy(spider.sounds) cave_spider.sounds.base_pitch = 1.25 +cave_spider.dealt_effect = { + name = "poison", + factor = 2.5, + dur = 7, +} mcl_mobs.register_mob("mobs_mc:cave_spider", cave_spider) diff --git a/mods/ENTITIES/mobs_mc/wither.lua b/mods/ENTITIES/mobs_mc/wither.lua index 6b47d601a..6ccd2a44a 100644 --- a/mods/ENTITIES/mobs_mc/wither.lua +++ b/mods/ENTITIES/mobs_mc/wither.lua @@ -67,12 +67,14 @@ mcl_mobs.register_mob("mobs_mc:wither", { run_start = 0, run_end = 20, }, harmed_by_heal = true, + is_boss = true, do_custom = function(self) if self.health < (self.hp_max / 2) then self.base_texture = "mobs_mc_wither_half_health.png" self.fly = false self.object:set_properties({textures={self.base_texture}}) self.armor = {undead = 80, fleshy = 80} + self.arrow = "mobs_mc:wither_skull_strong" end mcl_bossbars.update_boss(self.object, "Wither", "dark_purple") end, @@ -86,11 +88,18 @@ local mobs_griefing = minetest.settings:get_bool("mobs_griefing") ~= false local wither_rose_soil = { "group:grass_block", "mcl_core:dirt", "mcl_core:coarse_dirt", "mcl_nether:netherrack", "group:soul_block", "mcl_mud:mud", "mcl_moss:moss" } mcl_mobs.register_arrow("mobs_mc:wither_skull", { - visual = "sprite", + visual = "cube", visual_size = {x = 0.75, y = 0.75}, - -- TODO: 3D projectile, replace tetxture - textures = {"mobs_mc_TEMP_wither_projectile.png"}, + textures = { + "mobs_mc_wither_projectile.png^[verticalframe:6:0", -- top + "mobs_mc_wither_projectile.png^[verticalframe:6:1", -- bottom + "mobs_mc_wither_projectile.png^[verticalframe:6:2", -- left + "mobs_mc_wither_projectile.png^[verticalframe:6:3", -- right + "mobs_mc_wither_projectile.png^[verticalframe:6:4", -- back + "mobs_mc_wither_projectile.png^[verticalframe:6:5", -- front + }, velocity = 6, + rotate = 90, -- direct hit hit_player = function(self, player) @@ -98,6 +107,7 @@ mcl_mobs.register_arrow("mobs_mc:wither_skull", { full_punch_interval = 0.5, damage_groups = {fleshy = 8}, }, nil) + mcl_mobs.effect_functions["withering"](player, 0.5, 10) mcl_mobs.mob_class.boom(self,self.object:get_pos(), 1) end, @@ -106,6 +116,7 @@ mcl_mobs.register_arrow("mobs_mc:wither_skull", { full_punch_interval = 0.5, damage_groups = {fleshy = 8}, }, nil) + mcl_mobs.effect_functions["withering"](mob, 0.5, 10) mcl_mobs.mob_class.boom(self,self.object:get_pos(), 1) local l = mob:get_luaentity() if l and l.health - 8 <= 0 then @@ -126,7 +137,70 @@ mcl_mobs.register_arrow("mobs_mc:wither_skull", { mcl_mobs.mob_class.boom(self,pos, 1) end }) --- TODO: Add blue wither skull +mcl_mobs.register_arrow("mobs_mc:wither_skull_strong", { + visual = "cube", + visual_size = {x = 0.75, y = 0.75}, + textures = { + "mobs_mc_wither_projectile_strong.png^[verticalframe:6:0", -- top + "mobs_mc_wither_projectile_strong.png^[verticalframe:6:1", -- bottom + "mobs_mc_wither_projectile_strong.png^[verticalframe:6:2", -- left + "mobs_mc_wither_projectile_strong.png^[verticalframe:6:3", -- right + "mobs_mc_wither_projectile_strong.png^[verticalframe:6:4", -- back + "mobs_mc_wither_projectile_strong.png^[verticalframe:6:5", -- front + }, + velocity = 3, + rotate = 90, + + -- direct hit + hit_player = function(self, player) + player:punch(self.object, 1.0, { + full_punch_interval = 0.5, + damage_groups = {fleshy = 12}, + }, nil) + mcl_mobs.effect_functions["withering"](player, 0.5, 10) + local pos = self.object:get_pos() + if mobs_griefing and not minetest.is_protected(pos, "") then + mcl_explosions.explode(pos, 1, { drop_chance = 1.0, max_blast_resistance = 0, }, self.object) + else + mcl_mobs.mob_class.safe_boom(self, pos, 1) --need to call it this way bc self is the "arrow" object here + end + end, + + hit_mob = function(self, mob) + mob:punch(self.object, 1.0, { + full_punch_interval = 0.5, + damage_groups = {fleshy = 12}, + }, nil) + mcl_mobs.effect_functions["withering"](mob, 0.5, 10) + local pos = self.object:get_pos() + if mobs_griefing and not minetest.is_protected(pos, "") then + mcl_explosions.explode(pos, 1, { drop_chance = 1.0, max_blast_resistance = 0, }, self.object) + else + mcl_mobs.mob_class.safe_boom(self, pos, 1) --need to call it this way bc self is the "arrow" object here + end + local l = mob:get_luaentity() + if l and l.health - 8 <= 0 then + local n = minetest.find_node_near(mob:get_pos(),2,wither_rose_soil) + if n then + local p = vector.offset(n,0,1,0) + if minetest.get_node(p).name == "air" then + if not ( mobs_griefing and minetest.place_node(p,{name="mcl_flowers:wither_rose"}) ) then + minetest.add_item(p,"mcl_flowers:wither_rose") + end + end + end + end + end, + + -- node hit, explode + hit_node = function(self, pos, node) + if mobs_griefing and not minetest.is_protected(pos, "") then + mcl_explosions.explode(pos, 1, { drop_chance = 1.0, max_blast_resistance = 0, }, self.object) + else + mcl_mobs.mob_class.safe_boom(self, pos, 1) --need to call it this way bc self is the "arrow" object here + end + end +}) --Spawn egg mcl_mobs.register_egg("mobs_mc:wither", S("Wither"), "#4f4f4f", "#4f4f4f", 0, true) diff --git a/mods/ITEMS/mcl_potions/commands.lua b/mods/ITEMS/mcl_potions/commands.lua index 76ac71e72..10bf86311 100644 --- a/mods/ITEMS/mcl_potions/commands.lua +++ b/mods/ITEMS/mcl_potions/commands.lua @@ -20,6 +20,7 @@ get_chat_function["leaping"] = mcl_potions.leaping_func get_chat_function["swiftness"] = mcl_potions.swiftness_func get_chat_function["heal"] = mcl_potions.healing_func get_chat_function["bad_omen"] = mcl_potions.bad_omen_func +get_chat_function["withering"] = mcl_potions.withering_func minetest.register_chatcommand("effect",{ params = S(" []"), diff --git a/mods/ITEMS/mcl_potions/functions.lua b/mods/ITEMS/mcl_potions/functions.lua index 20608a7df..f1d80886f 100644 --- a/mods/ITEMS/mcl_potions/functions.lua +++ b/mods/ITEMS/mcl_potions/functions.lua @@ -10,6 +10,7 @@ EF.swift = {} -- for swiftness AND slowness EF.night_vision = {} EF.fire_proof = {} EF.bad_omen = {} +EF.withering = {} local EFFECT_TYPES = 0 for _,_ in pairs(EF) do @@ -19,8 +20,11 @@ end local icon_ids = {} local function potions_set_hudbar(player) - - if EF.poisoned[player] and EF.regenerating[player] then + if EF.withering[player] and EF.regenerating[player] then + hb.change_hudbar(player, "health", nil, nil, "mcl_potions_icon_regen_wither.png", nil, "hudbars_bar_health.png") + elseif EF.withering[player] then + hb.change_hudbar(player, "health", nil, nil, "mcl_potions_icon_wither.png", nil, "hudbars_bar_health.png") + elseif EF.poisoned[player] and EF.regenerating[player] then hb.change_hudbar(player, "health", nil, nil, "hbhunger_icon_regen_poison.png", nil, "hudbars_bar_health.png") elseif EF.poisoned[player] then hb.change_hudbar(player, "health", nil, nil, "hbhunger_icon_health_poison.png", nil, "hudbars_bar_health.png") @@ -123,6 +127,33 @@ minetest.register_globalstep(function(dtime) end + -- Check for withering players + for player, vals in pairs(EF.withering) do + + is_player = player:is_player() + entity = player:get_luaentity() + + EF.withering[player].timer = EF.withering[player].timer + dtime + EF.withering[player].hit_timer = (EF.withering[player].hit_timer or 0) + dtime + + if player:get_pos() then mcl_potions._add_spawner(player, "#000000") end + + if EF.withering[player].hit_timer >= EF.withering[player].step then + if is_player or entity then mcl_util.deal_damage(player, 1, {type = "magic"}) end + if EF.withering[player] then EF.withering[player].hit_timer = 0 end + end + + if EF.withering[player] and EF.withering[player].timer >= EF.withering[player].dur then + EF.withering[player] = nil + if is_player then + meta = player:get_meta() + meta:set_string("_is_withering", minetest.serialize(EF.withering[player])) + potions_set_hud(player) + end + end + + end + -- Check for poisoned players for player, vals in pairs(EF.poisoned) do @@ -152,7 +183,7 @@ minetest.register_globalstep(function(dtime) end - -- Check for regnerating players + -- Check for regenerating players for player, vals in pairs(EF.regenerating) do is_player = player:is_player() @@ -408,6 +439,7 @@ function mcl_potions._clear_cached_player_data(player) EF.night_vision[player] = nil EF.fire_proof[player] = nil EF.bad_omen[player] = nil + EF.withering[player] = nil meta = player:get_meta() meta:set_int("night_vision", 0) @@ -452,6 +484,7 @@ function mcl_potions._save_player_effects(player) meta:set_string("_is_cat", minetest.serialize(EF.night_vision[player])) meta:set_string("_is_fire_proof", minetest.serialize(EF.fire_proof[player])) meta:set_string("_has_bad_omen", minetest.serialize(EF.bad_omen[player])) + meta:set_string("_is_withering", minetest.serialize(EF.withering[player])) end @@ -507,6 +540,10 @@ function mcl_potions._load_player_effects(player) EF.bad_omen[player] = minetest.deserialize(meta:get_string("_has_bad_omen")) end + if minetest.deserialize(meta:get_string("_is_withering")) then + EF.withering[player] = minetest:deserialize(meta:get_string("_is_withering")) + end + end -- Returns true if player has given effect @@ -725,6 +762,9 @@ end function mcl_potions.swiftness_func(player, factor, duration) + local entity = player:get_luaentity() + if entity and entity.is_boss then return false end + if not player:get_meta() then return false end @@ -753,6 +793,9 @@ end function mcl_potions.leaping_func(player, factor, duration) + local entity = player:get_luaentity() + if entity and entity.is_boss then return false end + if not player:get_meta() then return false end @@ -781,6 +824,9 @@ end function mcl_potions.weakness_func(player, factor, duration) + local entity = player:get_luaentity() + if entity and entity.is_boss then return false end + if not EF.weak[player] then EF.weak[player] = {dur = duration, timer = 0, factor = factor} @@ -804,6 +850,9 @@ end function mcl_potions.strength_func(player, factor, duration) + local entity = player:get_luaentity() + if entity and entity.is_boss then return false end + if not EF.strong[player] then EF.strong[player] = {dur = duration, timer = 0, factor = factor} @@ -825,8 +874,37 @@ function mcl_potions.strength_func(player, factor, duration) end +function mcl_potions.withering_func(player, factor, duration) + + local entity = player:get_luaentity() + if entity and (entity.is_boss or string.find(entity.name, "wither")) then return false end + + if not EF.withering[player] then + + EF.withering[player] = {step = factor, dur = duration, timer = 0} + + else + + local victim = EF.withering[player] + + victim.step = math.min(victim.step, factor) + victim.dur = math.max(duration, victim.dur - victim.timer) + victim.timer = 0 + + end + + if player:is_player() then + potions_set_hud(player) + end + +end + + function mcl_potions.poison_func(player, factor, duration) + local entity = player:get_luaentity() + if entity and (entity.is_boss or entity.harmed_by_heal or string.find(entity.name, "spider")) then return false end + if not EF.poisoned[player] then EF.poisoned[player] = {step = factor, dur = duration, timer = 0} @@ -850,6 +928,9 @@ end function mcl_potions.regeneration_func(player, factor, duration) + local entity = player:get_luaentity() + if entity and (entity.is_boss or entity.harmed_by_heal) then return false end + if not EF.regenerating[player] then EF.regenerating[player] = {step = factor, dur = duration, timer = 0} @@ -873,6 +954,9 @@ end function mcl_potions.invisiblility_func(player, null, duration) + local entity = player:get_luaentity() + if entity and entity.is_boss then return false end + if not EF.invisible[player] then EF.invisible[player] = {dur = duration, timer = 0} @@ -895,6 +979,9 @@ end function mcl_potions.water_breathing_func(player, null, duration) + local entity = player:get_luaentity() + if entity and entity.is_boss then return false end + if not EF.water_breathing[player] then EF.water_breathing[player] = {dur = duration, timer = 0} @@ -917,6 +1004,9 @@ end function mcl_potions.fire_resistance_func(player, null, duration) + local entity = player:get_luaentity() + if entity and entity.is_boss then return false end + if not EF.fire_proof[player] then EF.fire_proof[player] = {dur = duration, timer = 0} @@ -938,6 +1028,9 @@ end function mcl_potions.night_vision_func(player, null, duration) + local entity = player:get_luaentity() + if entity and entity.is_boss then return false end + meta = player:get_meta() if not EF.night_vision[player] then diff --git a/mods/ITEMS/mcl_potions/init.lua b/mods/ITEMS/mcl_potions/init.lua index 2ea7e2879..910b16ddf 100644 --- a/mods/ITEMS/mcl_potions/init.lua +++ b/mods/ITEMS/mcl_potions/init.lua @@ -190,7 +190,7 @@ local function set_node_empty_bottle(itemstack, placer, pointed_thing, newitemst -- play sound minetest.sound_play("mcl_potions_bottle_pour", {pos=pointed_thing.under, gain=0.5, max_hear_range=16}, true) - -- + -- if minetest.is_creative_enabled(placer:get_player_name()) then return itemstack else @@ -356,6 +356,7 @@ local awkward_table = { ["mcl_fishing:pufferfish_raw"] = "mcl_potions:water_breathing", ["mcl_mobitems:ghast_tear"] = "mcl_potions:regeneration", ["mcl_mobitems:spider_eye"] = "mcl_potions:poison", + ["mcl_flowers:wither_rose"] = "mcl_potions:withering", ["mcl_mobitems:rabbit_foot"] = "mcl_potions:leaping", } @@ -373,7 +374,7 @@ local potions = {} for i, potion in ipairs({"healing","harming","swiftness","slowness", "leaping","poison","regeneration","invisibility","fire_resistance", -- "weakness","strength", - "water_breathing","night_vision"}) do + "water_breathing","night_vision", "withering"}) do table.insert(potions, potion) @@ -461,6 +462,18 @@ function mcl_potions.get_alchemy(ingr, pot) return false end +mcl_mobs.effect_functions["poison"] = mcl_potions.poison_func +mcl_mobs.effect_functions["regeneration"] = mcl_potions.regeneration_func +mcl_mobs.effect_functions["invisibility"] = mcl_potions.invisiblility_func +mcl_mobs.effect_functions["fire_resistance"] = mcl_potions.fire_resistance_func +mcl_mobs.effect_functions["night_vision"] = mcl_potions.night_vision_func +mcl_mobs.effect_functions["water_breathing"] = mcl_potions.water_breathing_func +mcl_mobs.effect_functions["leaping"] = mcl_potions.leaping_func +mcl_mobs.effect_functions["swiftness"] = mcl_potions.swiftness_func +mcl_mobs.effect_functions["heal"] = mcl_potions.healing_func +mcl_mobs.effect_functions["bad_omen"] = mcl_potions.bad_omen_func +mcl_mobs.effect_functions["withering"] = mcl_potions.withering_func + mcl_wip.register_wip_item("mcl_potions:night_vision") mcl_wip.register_wip_item("mcl_potions:night_vision_plus") mcl_wip.register_wip_item("mcl_potions:night_vision_splash") @@ -468,4 +481,4 @@ mcl_wip.register_wip_item("mcl_potions:night_vision_plus_splash") mcl_wip.register_wip_item("mcl_potions:night_vision_lingering") mcl_wip.register_wip_item("mcl_potions:night_vision_plus_lingering") mcl_wip.register_wip_item("mcl_potions:night_vision_arrow") -mcl_wip.register_wip_item("mcl_potions:night_vision_plus_arrow") \ No newline at end of file +mcl_wip.register_wip_item("mcl_potions:night_vision_plus_arrow") diff --git a/mods/ITEMS/mcl_potions/mod.conf b/mods/ITEMS/mcl_potions/mod.conf index bcb6d8ad3..91280a607 100644 --- a/mods/ITEMS/mcl_potions/mod.conf +++ b/mods/ITEMS/mcl_potions/mod.conf @@ -1,2 +1,2 @@ name = mcl_potions -depends = mcl_core, mcl_farming, mcl_mobitems, mcl_fishing, mcl_bows, mcl_end, mcl_weather, playerphysics, mcl_wip +depends = mcl_core, mcl_farming, mcl_flowers, mcl_mobitems, mcl_mobs, mcl_fishing, mcl_bows, mcl_end, mcl_weather, playerphysics, mcl_wip diff --git a/mods/ITEMS/mcl_potions/potions.lua b/mods/ITEMS/mcl_potions/potions.lua index 3d89d1d40..57c06c29d 100644 --- a/mods/ITEMS/mcl_potions/potions.lua +++ b/mods/ITEMS/mcl_potions/potions.lua @@ -79,7 +79,7 @@ local function register_potion(def) if def.is_inv then dur = dur * mcl_potions.INV_FACTOR end - if def.name == "poison" or def.name == "regeneration" then + if def.name == "poison" or def.name == "regeneration" or def.name == "withering" then dur = 45 end @@ -93,7 +93,7 @@ local function register_potion(def) local _tt if effect and def.is_dur then _tt = perc_string(effect).." | "..time_string(dur) - if def.name == "poison" or def.name == "regeneration" then + if def.name == "poison" or def.name == "regeneration" or def.name == "withering" then _tt = S("1 HP/@1s | @2", effect, time_string(dur)) end elseif def.name == "healing" or def.name == "harming" then @@ -235,6 +235,8 @@ local function register_potion(def) effect_II = def.effect*mcl_potions.II_FACTOR elseif def.name == "poison" or def.name == "regeneration" then effect_II = 1.2 + elseif def.name == "withering" then + effect_II = 2 else effect_II = def.effect^mcl_potions.II_FACTOR end @@ -327,7 +329,7 @@ local function register_potion(def) if def.is_plus then local dur_pl = dur * mcl_potions.PLUS_FACTOR - if def.name == "poison" or def.name == "regeneration" then + if def.name == "poison" or def.name == "regeneration" or def.name == "withering" then dur_pl = 90 end @@ -533,6 +535,20 @@ local leaping_def = { is_plus = true, } +local withering_def = { + name = "withering", + description = S("Withering"), + _tt = nil, + _longdesc = S("Applies the withering effect which deals damage at a regular interval and can kill."), + color = "#000000", + effect = 4, + is_dur = true, + on_use = mcl_potions.withering_func, + is_II = true, + is_plus = true, + is_inv = true, +} + local poison_def = { name = "poison", description = S("Poison"), @@ -597,7 +613,7 @@ local fire_resistance_def = { local defs = { awkward_def, mundane_def, thick_def, dragon_breath_def, healing_def, harming_def, night_vision_def, swiftness_def, - slowness_def, leaping_def, poison_def, regeneration_def, + slowness_def, leaping_def, withering_def, poison_def, regeneration_def, invisibility_def, water_breathing_def, fire_resistance_def} for _, def in ipairs(defs) do diff --git a/textures/mcl_potions_effect_withering.png b/textures/mcl_potions_effect_withering.png new file mode 100644 index 0000000000000000000000000000000000000000..df95ad0ea6c851fbf34b1ccb0693f677483e1f78 GIT binary patch literal 181 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`HJ&bxAr_~X25;m&pul4+7=N++ z#)Da9uQ$GJX<6YL@R4PP%eKWW%1ha$I~W4I|Ap4Xne)ucIQ3CaZ9>r1zsU=y z^+bKzvT)0SDJCa-x>sjvpV0hbmX>TbP3LsNla)-*w$7a@72LRyMEX>4Tx04R}tkv&MmKpe$iQ>8^J4ptCx$WWc^q9VF!6^c+H)C#RSm|Xe=O&XFE z7e~Rh;NZt%)xpJCR|i)?5c~jfb#YR3krMxx6k5c1aNLh~_a1le0HIM~n$AQI0q!?cMvh^IDf zgY!Odl$B(a_?&pmqze*1a$WKGjdRgufoDd|OnRO;N-P#TSm|I^GBx5!;+U%GlrLmG zRyl8R)+#mDx+i~OB(JY5bDicel32tNB#2N@Lm3s=h|{W*Vj)fY2_OHE>zBx-kgE(v zjs;YqL3aJ%fAG6ot1vO{B}EcI_lx6vi~ylspjmgE?_$N~TW0G~-jK~xyijgK)3!axv3-^i9W zTPBKn4-exJ1Pj3{SZr%+>fjM1Ww6Q(Bnh}%<_3<1ZVU?IRP$&4AKt(pB>-A=3P1s} zv7)P&1|+j$wCdEI4}D5qr|$mLWqCo_tBK3$Bn80T-hnhp02uvZ@gV?UD4?m^FT-#q zkz;+`0We?8XzCUp0{Ll)uoW2sN23pce0)SQEB&S3`0;w|A23-zj#r+d@Bjb+07*qo IM6N<$f|~dnp#T5? literal 0 HcmV?d00001 diff --git a/textures/mcl_potions_icon_wither.png b/textures/mcl_potions_icon_wither.png new file mode 100644 index 0000000000000000000000000000000000000000..599764ca9deb3d91789c4ad9e3ef14143bc47c85 GIT binary patch literal 660 zcmV;F0&D$=P)EX>4Tx04R}tkv&MmKpe$iQ>8^J4ptCx$WWc^q9VF!6^c+H)C#RSm|Xe=O&XFE z7e~Rh;NZt%)xpJCR|i)?5c~jfb#YR3krMxx6k5c1aNLh~_a1le0HIM~n$AQI0q!?cMvh^IDf zgY!Odl$B(a_?&pmqze*1a$WKGjdRgufoDd|OnRO;N-P#TSm|I^GBx5!;+U%GlrLmG zRyl8R)+#mDx+i~OB(JY5bDicel32tNB#2N@Lm3s=h|{W*Vj)fY2_OHE>zBx-kgE(v zjs;YqL3aJ%fAG6ot1vO{B}EcI_lx6vi~ylspjmgE?_>GY;xXGrPa##jg9b6jNLLdAh0<9Kf8PJ|;g3-OgLg@U$MdBI?@|am0Mopv zdhjk;Yf59X)?lq+9Nz$`l1tZWx>i#fbkhJ({pxbW2tW<6t>FtOwOm}H&zBS18aQGk ugq>+#loI;ZU(?<6`HcWMsRU&g0N?}9o;T-d6KvuD00007!W41_7()xF(?lfwwg z2Eh?!gLzbV7=Jjh1{#VcDUkoX;s~#+AvlmT*P`ZvekmIb3<_LVcm?Df0Rh1gM^=j_ zPg*~~_kI{)ZP`E+!`8SKKlX_Yu}JwYW(o;|6z@1vZ|7*S5fPOm{M(_;8@*@G2<9BPt0j%4?F`m`fSvMD!3uK zmpi~K@R>YLjEwa3jEtP<-tQZaDVsI%!2n!1FY*U2zyJi_6Qxt7HZ%ah00000NkvXX Hu0mjfGg5=j literal 0 HcmV?d00001 diff --git a/textures/mobs_mc_wither_projectile_strong.png b/textures/mobs_mc_wither_projectile_strong.png new file mode 100644 index 0000000000000000000000000000000000000000..b58d36b1838288917e81120f9a9984f601cdf1d0 GIT binary patch literal 279 zcmeAS@N?(olHy`uVBq!ia0vp^96)Tq!3-p&f1IuaQf2`@A+A80SwNFn!jxIUf?3Xy zS;>o8Gn837f>|e;Suc*+G@aQZm$@L8xh#&ks)e~{&VL4m|NsB*v)K{`)H%n~#W6(U za_xj(t|JOO&Dx8VUATVz)34rm?f1hz?oDZ1>(Y!rOyfAMm0tdGekI@HlsKc9?@L(^ z&#P44?>ASM*ITNrfu-b+F@J6Rs Date: Wed, 9 Aug 2023 11:43:00 +0200 Subject: [PATCH 213/982] Further wither adjustments --- mods/ENTITIES/mcl_wither_spawning/init.lua | 8 ++-- mods/ENTITIES/mobs_mc/wither.lua | 48 ++++++++++++++++++---- mods/ITEMS/mcl_potions/init.lua | 18 ++++++++ 3 files changed, 64 insertions(+), 10 deletions(-) diff --git a/mods/ENTITIES/mcl_wither_spawning/init.lua b/mods/ENTITIES/mcl_wither_spawning/init.lua index 8d4ec524b..6613436ec 100644 --- a/mods/ENTITIES/mcl_wither_spawning/init.lua +++ b/mods/ENTITIES/mcl_wither_spawning/init.lua @@ -35,14 +35,16 @@ local function remove_schem(pos, schem) end end -local function wither_spawn(pos) +local function wither_spawn(pos, player) for _, d in pairs(dim) do for i = 0, 2 do local p = vector.add(pos, {x = 0, y = -2, z = 0, [d] = -i}) local schem = wither_spawn_schems[d] if check_schem(p, schem) then remove_schem(p, schem) - minetest.add_entity(vector.add(p, {x = 0, y = 1, z = 0, [d] = 1}), "mobs_mc:wither") + local wither = minetest.add_entity(vector.add(p, {x = 0, y = 1, z = 0, [d] = 1}), "mobs_mc:wither") + local witherer = wither:get_luaentity() + witherer._spawner = player local objects = minetest.get_objects_inside_radius(pos, 20) for _, players in ipairs(objects) do if players:is_player() then @@ -59,7 +61,7 @@ local old_on_place = wither_head.on_place function wither_head.on_place(itemstack, placer, pointed) local n = minetest.get_node(vector.offset(pointed.above,0,-1,0)) if n and n.name == "mcl_nether:soul_sand" then - minetest.after(0, wither_spawn, pointed.above) + minetest.after(0, wither_spawn, pointed.above, placer) end return old_on_place(itemstack, placer, pointed) end diff --git a/mods/ENTITIES/mobs_mc/wither.lua b/mods/ENTITIES/mobs_mc/wither.lua index 6ccd2a44a..5859564e4 100644 --- a/mods/ENTITIES/mobs_mc/wither.lua +++ b/mods/ENTITIES/mobs_mc/wither.lua @@ -59,7 +59,7 @@ mcl_mobs.register_mob("mobs_mc:wither", { arrow = "mobs_mc:wither_skull", reach = 5, shoot_interval = 0.5, - shoot_offset = -1, + shoot_offset = -0.5, animation = { walk_speed = 12, run_speed = 12, stand_speed = 12, stand_start = 0, stand_end = 20, @@ -69,14 +69,40 @@ mcl_mobs.register_mob("mobs_mc:wither", { harmed_by_heal = true, is_boss = true, do_custom = function(self) + local rand_factor + if self._spawner then + local pos = self.object:get_pos() + local spw = self._spawner:get_pos() + local dist = vector.distance(pos, spw) + if dist > 60 then -- teleport to the player who spawned the wither + local R = 10 + pos.x = spw.x + math.random(-r, r) + pos.y = spw.y + math.random(-r, r) + pos.z = spw.z + math.random(-r, r) + self.object:set_pos(pos) + end + else + -- TODO implement a death timer here? + end if self.health < (self.hp_max / 2) then self.base_texture = "mobs_mc_wither_half_health.png" self.fly = false - self.object:set_properties({textures={self.base_texture}}) - self.armor = {undead = 80, fleshy = 80} - self.arrow = "mobs_mc:wither_skull_strong" + self.armor = {undead = 80, fleshy = 80} -- TODO replace with changed arrow resistance + rand_factor = 3 + else + self.base_texture = "mobs_mc_wither.png" + self.fly = true + self.armor = {undead = 80, fleshy = 100} -- TODO replace with changed arrow resistance + rand_factor = 10 end + self.object:set_properties({textures={self.base_texture}}) mcl_bossbars.update_boss(self.object, "Wither", "dark_purple") + if math.random(1, rand_factor) < 2 then + self.arrow = "mobs_mc:wither_skull_strong" + else + self.arrow = "mobs_mc:wither_skull" + end + -- TODO implement regeneration at rate 1 HP per second end, on_spawn = function(self) minetest.sound_play("mobs_mc_wither_spawn", {object=self.object, gain=1.0, max_hear_distance=64}) @@ -89,7 +115,7 @@ local wither_rose_soil = { "group:grass_block", "mcl_core:dirt", "mcl_core:coars mcl_mobs.register_arrow("mobs_mc:wither_skull", { visual = "cube", - visual_size = {x = 0.75, y = 0.75}, + visual_size = {x = 0.3, y = 0.3}, textures = { "mobs_mc_wither_projectile.png^[verticalframe:6:0", -- top "mobs_mc_wither_projectile.png^[verticalframe:6:1", -- bottom @@ -109,6 +135,9 @@ mcl_mobs.register_arrow("mobs_mc:wither_skull", { }, nil) mcl_mobs.effect_functions["withering"](player, 0.5, 10) mcl_mobs.mob_class.boom(self,self.object:get_pos(), 1) + if player:get_hp() <= 0 then + self._shooter:get_luaentity().health = self._shooter:get_luaentity().health + 5 + end end, hit_mob = function(self, mob) @@ -120,6 +149,7 @@ mcl_mobs.register_arrow("mobs_mc:wither_skull", { mcl_mobs.mob_class.boom(self,self.object:get_pos(), 1) local l = mob:get_luaentity() if l and l.health - 8 <= 0 then + self._shooter:get_luaentity().health = self._shooter:get_luaentity().health + 5 local n = minetest.find_node_near(mob:get_pos(),2,wither_rose_soil) if n then local p = vector.offset(n,0,1,0) @@ -139,7 +169,7 @@ mcl_mobs.register_arrow("mobs_mc:wither_skull", { }) mcl_mobs.register_arrow("mobs_mc:wither_skull_strong", { visual = "cube", - visual_size = {x = 0.75, y = 0.75}, + visual_size = {x = 0.35, y = 0.35}, textures = { "mobs_mc_wither_projectile_strong.png^[verticalframe:6:0", -- top "mobs_mc_wither_projectile_strong.png^[verticalframe:6:1", -- bottom @@ -148,7 +178,7 @@ mcl_mobs.register_arrow("mobs_mc:wither_skull_strong", { "mobs_mc_wither_projectile_strong.png^[verticalframe:6:4", -- back "mobs_mc_wither_projectile_strong.png^[verticalframe:6:5", -- front }, - velocity = 3, + velocity = 4, rotate = 90, -- direct hit @@ -164,6 +194,9 @@ mcl_mobs.register_arrow("mobs_mc:wither_skull_strong", { else mcl_mobs.mob_class.safe_boom(self, pos, 1) --need to call it this way bc self is the "arrow" object here end + if player:get_hp() <= 0 then + self._shooter:get_luaentity().health = self._shooter:get_luaentity().health + 5 + end end, hit_mob = function(self, mob) @@ -180,6 +213,7 @@ mcl_mobs.register_arrow("mobs_mc:wither_skull_strong", { end local l = mob:get_luaentity() if l and l.health - 8 <= 0 then + self._shooter:get_luaentity().health = self._shooter:get_luaentity().health + 5 local n = minetest.find_node_near(mob:get_pos(),2,wither_rose_soil) if n then local p = vector.offset(n,0,1,0) diff --git a/mods/ITEMS/mcl_potions/init.lua b/mods/ITEMS/mcl_potions/init.lua index 910b16ddf..58572698c 100644 --- a/mods/ITEMS/mcl_potions/init.lua +++ b/mods/ITEMS/mcl_potions/init.lua @@ -474,6 +474,24 @@ mcl_mobs.effect_functions["heal"] = mcl_potions.healing_func mcl_mobs.effect_functions["bad_omen"] = mcl_potions.bad_omen_func mcl_mobs.effect_functions["withering"] = mcl_potions.withering_func +-- give withering when standing in wither rose +local etime = 0 +minetest.register_globalstep(function(dtime) + etime = dtime + etime + if etime < 0.5 then return end + etime = 0 + for _,pl in pairs(minetest.get_connected_players()) do + local n = minetest.find_node_near(pl:get_pos(),0.4,"mcl_flowers:wither_rose",true) + if n then mcl_potions.withering_func(pl, 1, 2) end + end + for _,ent in pairs(minetest.luaentities) do + if ent.object:get_pos() and ent.is_mob then + local n = minetest.find_node_near(ent.object:get_pos(),0.4,"mcl_flowers:wither_rose",true) + if n then mcl_potions.withering_func(ent.object, 1, 2) end + end + end +end) + mcl_wip.register_wip_item("mcl_potions:night_vision") mcl_wip.register_wip_item("mcl_potions:night_vision_plus") mcl_wip.register_wip_item("mcl_potions:night_vision_splash") From 729d8ec9e0ad391eeee1d2111fa3074e30de600d Mon Sep 17 00:00:00 2001 From: the-real-herowl Date: Fri, 11 Aug 2023 16:54:58 +0200 Subject: [PATCH 214/982] Another batch of wither adjustments --- mods/CORE/mcl_util/init.lua | 2 +- mods/ENTITIES/mcl_mobs/init.lua | 5 +- mods/ENTITIES/mcl_wither_spawning/init.lua | 39 +++++++++++- mods/ENTITIES/mobs_mc/mod.conf | 2 +- mods/ENTITIES/mobs_mc/spider.lua | 4 +- mods/ENTITIES/mobs_mc/witch.lua | 5 ++ mods/ENTITIES/mobs_mc/wither.lua | 56 ++++++++++++++---- settingtypes.txt | 9 +++ textures/mcl_potions_effect_withering.png | Bin 181 -> 150 bytes textures/mcl_potions_icon_regen_wither.png | Bin 674 -> 151 bytes textures/mcl_potions_icon_wither.png | Bin 660 -> 137 bytes textures/mobs_mc_wither_projectile.png | Bin 309 -> 250 bytes textures/mobs_mc_wither_projectile_strong.png | Bin 279 -> 277 bytes 13 files changed, 102 insertions(+), 20 deletions(-) diff --git a/mods/CORE/mcl_util/init.lua b/mods/CORE/mcl_util/init.lua index 5872ce742..d37bb8785 100644 --- a/mods/CORE/mcl_util/init.lua +++ b/mods/CORE/mcl_util/init.lua @@ -612,7 +612,7 @@ function mcl_util.deal_damage(target, damage, mcl_reason) end return end - end + elseif not target:is_player() then return end local is_immortal = target:get_armor_groups().immortal or 0 if is_immortal>0 then diff --git a/mods/ENTITIES/mcl_mobs/init.lua b/mods/ENTITIES/mcl_mobs/init.lua index f7699affa..58e418018 100644 --- a/mods/ENTITIES/mcl_mobs/init.lua +++ b/mods/ENTITIES/mcl_mobs/init.lua @@ -297,6 +297,7 @@ function mcl_mobs.register_mob(name, def) return false, true, {} end, do_punch = def.do_punch, + deal_damage = def.deal_damage, on_breed = def.on_breed, on_grown = def.on_grown, on_pick_up = def.on_pick_up, @@ -314,7 +315,9 @@ function mcl_mobs.register_mob(name, def) harmed_by_heal = def.harmed_by_heal, is_boss = def.is_boss, dealt_effect = def.dealt_effect, - on_lightning_strike = def.on_lightning_strike + on_lightning_strike = def.on_lightning_strike, + + _spawner = def._spawner, } minetest.register_entity(name, setmetatable(final_def,mcl_mobs.mob_class_meta)) diff --git a/mods/ENTITIES/mcl_wither_spawning/init.lua b/mods/ENTITIES/mcl_wither_spawning/init.lua index 6613436ec..fa23c7063 100644 --- a/mods/ENTITIES/mcl_wither_spawning/init.lua +++ b/mods/ENTITIES/mcl_wither_spawning/init.lua @@ -9,6 +9,14 @@ local function load_schem(filename) return data end +local wboss_overworld = 0 +local wboss_nether = 0 +local wboss_end = 0 + +local LIM_OVERWORLD = tonumber(minetest.settings:get("wither_cap_overworld")) or 3 +local LIM_NETHER = tonumber(minetest.settings:get("wither_cap_nether")) or 10 +local LIM_END = tonumber(minetest.settings:get("wither_cap_end")) or 5 + local wither_spawn_schems = {} for _, d in pairs(dim) do @@ -35,16 +43,33 @@ local function remove_schem(pos, schem) end end +local function check_limit(pos) + local dim = mcl_worlds.pos_to_dimension(pos) + if dim == "overworld" and wboss_overworld >= LIM_OVERWORLD then return false + elseif dim == "end" and wboss_end >= LIM_END then return false + elseif wboss_nether >= LIM_NETHER then return false + else return true end +end + local function wither_spawn(pos, player) for _, d in pairs(dim) do for i = 0, 2 do local p = vector.add(pos, {x = 0, y = -2, z = 0, [d] = -i}) local schem = wither_spawn_schems[d] - if check_schem(p, schem) then + if check_schem(p, schem) and check_limit(pos) then remove_schem(p, schem) local wither = minetest.add_entity(vector.add(p, {x = 0, y = 1, z = 0, [d] = 1}), "mobs_mc:wither") local witherer = wither:get_luaentity() - witherer._spawner = player + witherer._spawner = player:get_player_name() + witherer._custom_timer = 0.0 + witherer._death_timer = 0.0 + witherer._health_old = witherer.hp_max + local dim = mcl_worlds.pos_to_dimension(pos) + if dim == "overworld" then + wboss_overworld = wboss_overworld + 1 + elseif dim == "end" then + wboss_end = wboss_end + 1 + else wboss_nether = wboss_nether + 1 end local objects = minetest.get_objects_inside_radius(pos, 20) for _, players in ipairs(objects) do if players:is_player() then @@ -65,3 +90,13 @@ function wither_head.on_place(itemstack, placer, pointed) end return old_on_place(itemstack, placer, pointed) end + +-- pull wither counts per dimension +minetest.register_globalstep(function(dtime) + wboss_overworld = mobs_mc.wither_count_overworld + wboss_nether = mobs_mc.wither_count_nether + wboss_end = mobs_mc.wither_count_end + mobs_mc.wither_count_overworld = 0 + mobs_mc.wither_count_nether = 0 + mobs_mc.wither_count_end = 0 +end) diff --git a/mods/ENTITIES/mobs_mc/mod.conf b/mods/ENTITIES/mobs_mc/mod.conf index 5b94879b2..ec7446505 100644 --- a/mods/ENTITIES/mobs_mc/mod.conf +++ b/mods/ENTITIES/mobs_mc/mod.conf @@ -2,4 +2,4 @@ name = mobs_mc author = maikerumine description = Adds Minecraft-like monsters and animals. depends = mcl_init, mcl_particles, mcl_mobs, mcl_wip, mcl_core, mcl_util -optional_depends = default, mcl_tnt, mcl_bows, mcl_throwing, mcl_fishing, bones, mesecons_materials, doc_items +optional_depends = default, mcl_tnt, mcl_bows, mcl_throwing, mcl_fishing, bones, mesecons_materials, doc_items, mcl_worlds diff --git a/mods/ENTITIES/mobs_mc/spider.lua b/mods/ENTITIES/mobs_mc/spider.lua index 90ea384f1..38138a71c 100644 --- a/mods/ENTITIES/mobs_mc/spider.lua +++ b/mods/ENTITIES/mobs_mc/spider.lua @@ -114,9 +114,7 @@ mcl_mobs.register_mob("mobs_mc:spider", spider) local cave_spider = table.copy(spider) cave_spider.description = S("Cave Spider") cave_spider.textures = { {"mobs_mc_cave_spider.png^(mobs_mc_spider_eyes.png^[makealpha:0,0,0)"} } --- TODO: Poison damage --- TODO: Revert damage to 2 -cave_spider.damage = 3 -- damage increased to undo non-existing poison +cave_spider.damage = 2 cave_spider.hp_min = 1 cave_spider.hp_max = 12 cave_spider.collisionbox = {-0.35, -0.01, -0.35, 0.35, 0.46, 0.35} diff --git a/mods/ENTITIES/mobs_mc/witch.lua b/mods/ENTITIES/mobs_mc/witch.lua index b00a68116..c9cc3c8ee 100644 --- a/mods/ENTITIES/mobs_mc/witch.lua +++ b/mods/ENTITIES/mobs_mc/witch.lua @@ -70,6 +70,11 @@ mcl_mobs.register_mob("mobs_mc:witch", { }, view_range = 16, fear_height = 4, + deal_damage = function(self, damage, mcl_reason) + local factor = 1 + if mcl_reason.type == "magic" then factor = 0.15 end + self.health = self.health - factor*damage + end, }) -- potion projectile (EXPERIMENTAL) diff --git a/mods/ENTITIES/mobs_mc/wither.lua b/mods/ENTITIES/mobs_mc/wither.lua index 5859564e4..997378a3a 100644 --- a/mods/ENTITIES/mobs_mc/wither.lua +++ b/mods/ENTITIES/mobs_mc/wither.lua @@ -9,6 +9,10 @@ local S = minetest.get_translator("mobs_mc") --################### WITHER --################### +mobs_mc.wither_count_overworld = 0 +mobs_mc.wither_count_nether = 0 +mobs_mc.wither_count_end = 0 + mcl_mobs.register_mob("mobs_mc:wither", { description = S("Wither"), type = "monster", @@ -53,7 +57,7 @@ mcl_mobs.register_mob("mobs_mc:wither", { }, lava_damage = 0, fire_damage = 0, - attack_type = "dogshoot", + attack_type = "shoot", explosion_strength = 8, dogshoot_stop = true, arrow = "mobs_mc:wither_skull", @@ -68,31 +72,51 @@ mcl_mobs.register_mob("mobs_mc:wither", { }, harmed_by_heal = true, is_boss = true, - do_custom = function(self) - local rand_factor - if self._spawner then + do_custom = function(self, dtime) + self._custom_timer = self._custom_timer + dtime + if self._custom_timer > 1 then + self.health = math.min(self.health + 1, self.hp_max) + self._custom_timer = self._custom_timer - 1 + end + + local spawner = minetest.get_player_by_name(self._spawner) + if spawner then + self._death_timer = 0 local pos = self.object:get_pos() - local spw = self._spawner:get_pos() + local spw = spawner:get_pos() local dist = vector.distance(pos, spw) if dist > 60 then -- teleport to the player who spawned the wither local R = 10 - pos.x = spw.x + math.random(-r, r) - pos.y = spw.y + math.random(-r, r) - pos.z = spw.z + math.random(-r, r) + pos.x = spw.x + math.random(-R, R) + pos.y = spw.y + math.random(-R, R) + pos.z = spw.z + math.random(-R, R) self.object:set_pos(pos) end else - -- TODO implement a death timer here? + self._death_timer = self._death_timer + self.health - self._health_old + if self.health == self._health_old then self._death_timer = self._death_timer + dtime end + if self._death_timer > 100 then + self.object:remove() + return false + end + self._health_old = self.health end + + local dim = mcl_worlds.pos_to_dimension(self.object:get_pos()) + if dim == "overworld" then mobs_mc.wither_count_overworld = mobs_mc.wither_count_overworld + 1 + elseif dim == "nether" then mobs_mc.wither_count_nether = mobs_mc.wither_count_nether + 1 + elseif dim == "end" then mobs_mc.wither_count_end = mobs_mc.wither_count_end + 1 end + + local rand_factor if self.health < (self.hp_max / 2) then self.base_texture = "mobs_mc_wither_half_health.png" self.fly = false - self.armor = {undead = 80, fleshy = 80} -- TODO replace with changed arrow resistance + self._arrow_resistant = true rand_factor = 3 else self.base_texture = "mobs_mc_wither.png" self.fly = true - self.armor = {undead = 80, fleshy = 100} -- TODO replace with changed arrow resistance + self._arrow_resistant = false rand_factor = 10 end self.object:set_properties({textures={self.base_texture}}) @@ -102,7 +126,15 @@ mcl_mobs.register_mob("mobs_mc:wither", { else self.arrow = "mobs_mc:wither_skull" end - -- TODO implement regeneration at rate 1 HP per second + end, + do_punch = function(self, hitter, tflp, tool_capabilities, dir) + local ent = hitter:get_luaentity() + if ent and self._arrow_resistant and (string.find(ent.name, "arrow") or string.find(ent.name, "rocket")) then return false end + return true + end, + deal_damage = function(self, damage, mcl_reason) + if self._arrow_resistant and mcl_reason.type == "magic" then return end + self.health = self.health - damage end, on_spawn = function(self) minetest.sound_play("mobs_mc_wither_spawn", {object=self.object, gain=1.0, max_hear_distance=64}) diff --git a/settingtypes.txt b/settingtypes.txt index 8123ca9d9..4066b6de7 100644 --- a/settingtypes.txt +++ b/settingtypes.txt @@ -166,6 +166,15 @@ mcl_mob_cap_axolotl (Mob cap axolotl) int 5 0 1024 #Maximum amount of ambient mobs that will spawn near a player (default:15) mcl_mob_cap_ambient (Mob cap ambient mobs) int 15 0 1024 +#Maximum amount of wither bosses on the loaded mapchunks in the overworld that allows spawning withers in the overworld (default:3) +wither_cap_overworld (Wither cap overworld) int 3 0 2048 + +#Maximum amount of wither bosses on the loaded mapchunks in the nether that allows spawning withers in the nether (default:10) +wither_cap_nether (Wither cap nether) int 10 0 2048 + +#Maximum amount of wither bosses on the loaded mapchunks in the end that allows spawning withers in the end (default:5) +wither_cap_end (Wither cap end) int 5 0 2048 + #Display mob icons in inventory instead of mc-like spawn eggs mcl_old_spawn_icons (Old spawn icons instead of eggs) bool false diff --git a/textures/mcl_potions_effect_withering.png b/textures/mcl_potions_effect_withering.png index df95ad0ea6c851fbf34b1ccb0693f677483e1f78..eed626c6b56a2fcbb82d7ec893b61ae6d163b91d 100644 GIT binary patch delta 121 zcmV-<0EYjy0hR%fBywFzL_t(I%VV&yw*F5EW&jZ@moFd-Q{Mn&r(si!E{9?Oy5DeV zMwZ8F0J0{s3?RiDL>oYs3kZ1wZ!BO76I|iMKuU;XQ_Daoum}Yz&Xh<GIW53>at1|H_*iqF3yWab?NE?mEBaQW81Aw6LV^00000NkvXX Hu0mjf!dppR diff --git a/textures/mcl_potions_icon_regen_wither.png b/textures/mcl_potions_icon_regen_wither.png index 7f82002a9b244ba09e070061732bf1818015cefb..14c6acdad7c663d4c6f082dc6156c00f5973c9f4 100644 GIT binary patch delta 123 zcmV->0EGXd1(yMkBXj^>NklT|NcK1_r3oQ=EnosPz+bl+tUWeAcZh? zNU;C^{|sIK;fhu+UjW9)8uD^72rELE1T-F`16dMg3S1G`T~LKE#TW`;09hee0nBIU d0K@B0004kao_SkQ$K3z`002ovPDHLkV1k2lF+l(T delta 651 zcmV;60(AYC0ip$vBYy#eX+uL$Nkc;*aB^>EX>4Tx04R}tkv&MmKpe$iQ>8^J4ptCx z$WWc^q9VF!6^c+H)C#RSm|Xe=O&XFE7e~Rh;NZt%)xpJCR|i)?5c~jfb#YR3krMxx z6k5c1aNLh~_a1le0HIM~n$#0mH3=^%%lqvKXP61_>FVXWr1f# z%}jcpI7%!QJ6P#pRx&l>N#dBQ>69;IJytnyan>p|*19KuVI;4wEOVXaFp^lr5+sOF zP(v9N*of1rlYe3%P5TKS|B&mK$fc003`ULxRG~q3{osG_yIZR;G43Tr5xO5Felhrno&ve$jy9e?iZ?cX!4{(b<8$a1itihKS5 z000JJOGiWi{{a60|De66lK=n!32;bRa{vGf6951U69E94oEQKA00(qQO+^Ri2nQ7> z3QEt&0ssI2pGibPR2b8Zk1-0uKoCXW$d)!+CW?9w591L83&AT`Y-?-k;1MKcu*wZ2 z3AkJ427iu)ZVU?IRP$&4AKt(pB>-A=3P1s}v7)P&1|+j$wCdEI4}D5qr|$mLWqCo_ ztBK3$Bn80T-hnhp02uvZ@gV?UD4?m^FT-#qkz;+`0We?8XzCUp0{Ll)uoW2sN23pc le0)SQEB&S3`0;w|A23-zj#r+d@Bjb+07*qoLwZxdVAX77?}@K3|F*r z`2sLT){vKzL0A!rNgy4_k}y-?ieT;n3BnX(D1ZTw08AlP1uy{fHo5`;b%%YJ>EX>4Tx04R}tkv&MmKpe$iQ>8^J4ptCx z$WWc^q9VF!6^c+H)C#RSm|Xe=O&XFE7e~Rh;NZt%)xpJCR|i)?5c~jfb#YR3krMxx z6k5c1aNLh~_a1le0HIM~n$#0mH3=^%%lqvKXP61_>FVXWr1f# z%}jcpI7%!QJ6P#pRx&l>N#dBQ>69;IJytnyan>p|*19KuVI;4wEOVXaFp^lr5+sOF zP(v9N*of1rlYe3%P5TKS|B&mK$fc003`ULxRG~q3{osG_yIZR;G43Tr5xO5Felhrno&ve$jy9e?iZ?cX!4{(b<8$a1itihKS5 z000JJOGiWi{{a60|De66lK=n!32;bRa{vGf6951U69E94oEQKA00(qQO+^Ri2nQ7= z0J8xQT>t<8kx4{BR2b8ZjzJ28Fc3vw#7h{Z?H!6ubBZkDG22B?AyvGC1~JD-R}%t- z(pe3E-gW=;;g3-OgLg@U$MdBI?@|am0Mopvdhjk;Yf59X)?lq+9Nz$`l1tZWx>i#f zbkhJ({pxbW2tW<6t>FtOwOm}H&zBS18aQGkgq>+#loI;ZU(?<6`HcWMsRU&g0N?}9 Wo;T-d6KvuD0000W39kp0pR z=eQRa*9xKV;d9@U@S)>jY!S2k2-`YQd>m9KBS&eno`iGvGFJ&LAJvI12g+yo$N#wJ zII+}7HCvtVtoGs}#w&fqev1>Lp%JvSo`G;|V`IZ{Vr310M$YE6iP<3NbXd>O0q8j5 Y1%Jl1IML9jEdT%j07*qoM6N<$f=S|OSpWb4 delta 282 zcmV+#0pii0u9o!ONI{3d*tE$9({st2ATjg z;dG$kuP8j2<_t70l^VRR*NQ2T0g+|ei&eF*+3M-)_=GbKlX_Yu}JwYW(o;|6z@1vZ|7*S5fPOm{M(_ z;8@*@G2<9BPt0j%4?F`m`fSvMD!3uKmpi~K@R>YLjEwa3jEtP<-tQZaDVsI%!2n!1 gFY*U2zyJi_6BDIVr8YDGzyJUM07*qoM6N<$f(y@qyZ`_I diff --git a/textures/mobs_mc_wither_projectile_strong.png b/textures/mobs_mc_wither_projectile_strong.png index b58d36b1838288917e81120f9a9984f601cdf1d0..4e4c38f737fd1c110d8422897189551d721e896e 100644 GIT binary patch delta 183 zcmV;o07(Cr0+j-gW`CMVL_t&-SACE{iUctX0~LaWs9@;+|7Z7*^vtp|tWE`%Wnl%| zCc?ID_XWy^`~V}?3-Kf)Dt-U}002ovPDHLkV1mAwReAsb delta 185 zcmV;q07n0n0+#}iW`CSXL_t&-(|wSQ3dA4`gDayWL<;);FMF}p`{9lYvSzh@W;5`X z2+JyGcj=#b4x?mVGFI5KL4ItZu)GJL3Mtu;~) ni#a033~`n+*qC$V=cK^{Bi0M?c9QtS00000NkvXXu0mjfP=Hc} From df17688b7ddc09dd9b5c3e93610b6a71d11405a6 Mon Sep 17 00:00:00 2001 From: the-real-herowl Date: Sun, 20 Aug 2023 08:56:30 +0200 Subject: [PATCH 215/982] Great batch of improvements --- mods/ENTITIES/mcl_mobs/combat.lua | 3 + mods/ENTITIES/mcl_mobs/init.lua | 4 +- mods/ENTITIES/mcl_wither_spawning/init.lua | 7 +- mods/ENTITIES/mobs_mc/wither.lua | 254 ++++++++++++++++++--- 4 files changed, 232 insertions(+), 36 deletions(-) diff --git a/mods/ENTITIES/mcl_mobs/combat.lua b/mods/ENTITIES/mcl_mobs/combat.lua index 0ddc62d29..4acbdb14e 100644 --- a/mods/ENTITIES/mcl_mobs/combat.lua +++ b/mods/ENTITIES/mcl_mobs/combat.lua @@ -1216,6 +1216,9 @@ function mob_class:do_states_attack (dtime) end end end + + elseif self.attack_type == "custom" and self.attack_state then + self.attack_state(self, dtime) else end diff --git a/mods/ENTITIES/mcl_mobs/init.lua b/mods/ENTITIES/mcl_mobs/init.lua index 58e418018..25440129d 100644 --- a/mods/ENTITIES/mcl_mobs/init.lua +++ b/mods/ENTITIES/mcl_mobs/init.lua @@ -312,6 +312,7 @@ function mcl_mobs.register_mob(name, def) return self:mob_activate(staticdata, def, dtime) end, + attack_state = def.attack_state, harmed_by_heal = def.harmed_by_heal, is_boss = def.is_boss, dealt_effect = def.dealt_effect, @@ -348,6 +349,7 @@ function mcl_mobs.register_arrow(name, def) collisionbox = {0, 0, 0, 0, 0, 0}, -- remove box around arrows timer = 0, switch = 0, + _lifetime = def._lifetime or 150, owner_id = def.owner_id, rotate = def.rotate, on_punch = function(self) @@ -367,7 +369,7 @@ function mcl_mobs.register_arrow(name, def) local pos = self.object:get_pos() if self.switch == 0 - or self.timer > 150 + or self.timer > self._lifetime or not within_limits(pos, 0) then mcl_burning.extinguish(self.object) self.object:remove(); diff --git a/mods/ENTITIES/mcl_wither_spawning/init.lua b/mods/ENTITIES/mcl_wither_spawning/init.lua index fa23c7063..cee95a905 100644 --- a/mods/ENTITIES/mcl_wither_spawning/init.lua +++ b/mods/ENTITIES/mcl_wither_spawning/init.lua @@ -59,11 +59,8 @@ local function wither_spawn(pos, player) if check_schem(p, schem) and check_limit(pos) then remove_schem(p, schem) local wither = minetest.add_entity(vector.add(p, {x = 0, y = 1, z = 0, [d] = 1}), "mobs_mc:wither") - local witherer = wither:get_luaentity() - witherer._spawner = player:get_player_name() - witherer._custom_timer = 0.0 - witherer._death_timer = 0.0 - witherer._health_old = witherer.hp_max + local wither_ent = wither:get_luaentity() + wither_ent._spawner = player:get_player_name() local dim = mcl_worlds.pos_to_dimension(pos) if dim == "overworld" then wboss_overworld = wboss_overworld + 1 diff --git a/mods/ENTITIES/mobs_mc/wither.lua b/mods/ENTITIES/mobs_mc/wither.lua index 997378a3a..671183340 100644 --- a/mods/ENTITIES/mobs_mc/wither.lua +++ b/mods/ENTITIES/mobs_mc/wither.lua @@ -4,6 +4,15 @@ --License for code WTFPL and otherwise stated in readmes local S = minetest.get_translator("mobs_mc") +local mobs_griefing = minetest.settings:get_bool("mobs_griefing") ~= false + +local function atan(x) + if not x or x ~= x then + return 0 + else + return math.atan(x) + end +end --################### --################### WITHER @@ -31,10 +40,11 @@ mcl_mobs.register_mob("mobs_mc:wither", { }, visual_size = {x=4, y=4}, makes_footstep_sound = true, - view_range = 16, + view_range = 50, fear_height = 4, walk_velocity = 2, run_velocity = 4, + strafes = true, sounds = { shoot_attack = "mobs_mc_ender_dragon_shoot", attack = "mobs_mc_ender_dragon_attack", @@ -57,7 +67,7 @@ mcl_mobs.register_mob("mobs_mc:wither", { }, lava_damage = 0, fire_damage = 0, - attack_type = "shoot", + attack_type = "custom", explosion_strength = 8, dogshoot_stop = true, arrow = "mobs_mc:wither_skull", @@ -73,33 +83,71 @@ mcl_mobs.register_mob("mobs_mc:wither", { harmed_by_heal = true, is_boss = true, do_custom = function(self, dtime) + if self._spawning then + if not self._spw_max then self._spw_max = self._spawning end + self._spawning = self._spawning - dtime + local bardef = { + color = "dark_purple", + text = "Wither spawning", + percentage = math.floor((self._spw_max - self._spawning) / self._spw_max * 100), + } + + local pos = self.object:get_pos() + for _, player in pairs(minetest.get_connected_players()) do + local d = vector.distance(pos, player:get_pos()) + if d <= 80 then + mcl_bossbars.add_bar(player, bardef, true, d) + end + end + self.object:set_yaw(self._spawning*10) + + local factor = math.floor((math.sin(self._spawning*10)+1.5) * 85) + local str = minetest.colorspec_to_colorstring({r=factor, g=factor, b=factor}) + self.object:set_texture_mod("^[brighten^[multiply:"..str) + + if self._spawning <= 0 then + if mobs_griefing and not minetest.is_protected(pos, "") then + mcl_explosions.explode(pos, 10, { drop_chance = 1.0 }, self.object) + else + mcl_mobs.mob_class.safe_boom(self, pos, 10) + end + self.object:set_texture_mod("") + self._spawning = nil + self._spw_max = nil + else + return false + end + end + self._custom_timer = self._custom_timer + dtime if self._custom_timer > 1 then self.health = math.min(self.health + 1, self.hp_max) self._custom_timer = self._custom_timer - 1 end - local spawner = minetest.get_player_by_name(self._spawner) - if spawner then - self._death_timer = 0 - local pos = self.object:get_pos() - local spw = spawner:get_pos() - local dist = vector.distance(pos, spw) - if dist > 60 then -- teleport to the player who spawned the wither - local R = 10 - pos.x = spw.x + math.random(-R, R) - pos.y = spw.y + math.random(-R, R) - pos.z = spw.z + math.random(-R, R) - self.object:set_pos(pos) + if self._spawner then + local spawner = minetest.get_player_by_name(self._spawner) + if spawner then + self._death_timer = 0 + local pos = self.object:get_pos() + local spw = spawner:get_pos() + local dist = vector.distance(pos, spw) + if dist > 60 then -- teleport to the player who spawned the wither TODO add a setting to disable this + local R = 10 + pos.x = spw.x + math.random(-R, R) + pos.y = spw.y + math.random(-R, R) + pos.z = spw.z + math.random(-R, R) + self.object:set_pos(pos) + end + else + self._death_timer = self._death_timer + self.health - self._health_old + if self.health == self._health_old then self._death_timer = self._death_timer + dtime end + if self._death_timer > 100 then + self.object:remove() + return false + end + self._health_old = self.health end - else - self._death_timer = self._death_timer + self.health - self._health_old - if self.health == self._health_old then self._death_timer = self._death_timer + dtime end - if self._death_timer > 100 then - self.object:remove() - return false - end - self._health_old = self.health end local dim = mcl_worlds.pos_to_dimension(self.object:get_pos()) @@ -127,22 +175,162 @@ mcl_mobs.register_mob("mobs_mc:wither", { self.arrow = "mobs_mc:wither_skull" end end, + + attack_state = function(self, dtime) + local s = self.object:get_pos() + local p = self.attack:get_pos() or s + + p.y = p.y - .5 + s.y = s.y + .5 + + local dist = vector.distance(p, s) + local vec = { + x = p.x - s.x, + y = p.y - s.y, + z = p.z - s.z + } + + local yaw = (atan(vec.z / vec.x) +math.pi/ 2) - self.rotate + if p.x > s.x then yaw = yaw +math.pi end + yaw = self:set_yaw( yaw, 0, dtime) + + local stay_away_from_player = vector.zero() + + --strafe back and fourth + + --stay away from player so as to shoot them + if dist < self.avoid_distance and self.shooter_avoid_enemy then + self:set_animation( "shoot") + stay_away_from_player=vector.multiply(vector.direction(p, s), 0.33) + end + + if self.fly then + local vel = self.object:get_velocity() + local diff = s.y - p.y + local FLY_FACTOR = self.walk_velocity + if diff < 10 then + self.object:set_velocity({x=vel.x, y= FLY_FACTOR, z=vel.z}) + elseif diff > 15 then + self.object:set_velocity({x=vel.x, y=-FLY_FACTOR, z=vel.z}) + end + for i=1, 15 do + if minetest.get_node(vector.offset(s, 0, -i, 0)).name ~= "air" then + self.object:set_velocity({x=vel.x, y= FLY_FACTOR, z=vel.z}) + break + elseif minetest.get_node(vector.offset(s, 0, i, 0)).name ~= "air" then + self.object:set_velocity({x=vel.x, y=-FLY_FACTOR/i, z=vel.z}) + break + end + end + end + + if self.strafes then + if not self.strafe_direction then + self.strafe_direction = 1.57 + end + if math.random(40) == 1 then + self.strafe_direction = self.strafe_direction*-1 + end + + local dir = vector.rotate_around_axis(vector.direction(s, p), vector.new(0,1,0), self.strafe_direction) + local dir2 = vector.multiply(dir, 0.3 * self.walk_velocity) + + if dir2 and stay_away_from_player then + self.acc = vector.add(dir2, stay_away_from_player) + end + else + self:set_velocity( 0) + end + + if dist > 30 then self.acc = vector.add(self.acc, vector.direction(s, p)*0.01) end + + local side_cor = vector.new(0.7*math.cos(yaw), 0, 0.7*math.sin(yaw)) + local m = self.object:get_pos() -- position of the middle head + local sr = self.object:get_pos() + side_cor -- position of side right head + local sl = self.object:get_pos() - side_cor -- position of side left head + -- height corrections + m.y = m.y + self.collisionbox[5] + sr.y = sr.y + self.collisionbox[5] - 0.3 + sl.y = sl.y + self.collisionbox[5] - 0.3 + local rand_pos = math.random(1,3) + if rand_pos == 1 then m = sr + elseif rand_pos == 2 then m = sl end + -- TODO multiple targets at once? + -- TODO targeting most mobs when no players can be seen/in addition to players + + if self.shoot_interval + and self.timer > self.shoot_interval + and not minetest.raycast(vector.add(m, vector.new(0,self.shoot_offset,0)), vector.add(self.attack:get_pos(), vector.new(0,1.5,0)), false, false):next() + and math.random(1, 100) <= 60 then + + self.timer = 0 + self:set_animation( "shoot") + + -- play shoot attack sound + self:mob_sound("shoot_attack") + + -- Shoot arrow + if minetest.registered_entities[self.arrow] then + + local arrow, ent + local v = 1 + if not self.shoot_arrow then + self.firing = true + minetest.after(1, function() + self.firing = false + end) + arrow = minetest.add_entity(m, self.arrow) + ent = arrow:get_luaentity() + if ent.velocity then + v = ent.velocity + end + ent.switch = 1 + ent.owner_id = tostring(self.object) -- add unique owner id to arrow + + -- important for mcl_shields + ent._shooter = self.object + ent._saved_shooter_pos = self.object:get_pos() + end + + local amount = (vec.x * vec.x + vec.y * vec.y + vec.z * vec.z) ^ 0.5 + -- offset makes shoot aim accurate + vec.y = vec.y + self.shoot_offset + vec.x = vec.x * (v / amount) + vec.y = vec.y * (v / amount) + vec.z = vec.z * (v / amount) + if self.shoot_arrow then + vec = vector.normalize(vec) + self:shoot_arrow(m, vec) + else + arrow:set_velocity(vec) + end + end + end + end, + do_punch = function(self, hitter, tflp, tool_capabilities, dir) + if self._spawning then return false end local ent = hitter:get_luaentity() if ent and self._arrow_resistant and (string.find(ent.name, "arrow") or string.find(ent.name, "rocket")) then return false end return true end, deal_damage = function(self, damage, mcl_reason) + if self._spawning then return end if self._arrow_resistant and mcl_reason.type == "magic" then return end self.health = self.health - damage end, + on_spawn = function(self) minetest.sound_play("mobs_mc_wither_spawn", {object=self.object, gain=1.0, max_hear_distance=64}) + self._custom_timer = 0.0 + self._death_timer = 0.0 + self._health_old = self.hp_max + self._spawning = 10 + return true end, }) -local mobs_griefing = minetest.settings:get_bool("mobs_griefing") ~= false local wither_rose_soil = { "group:grass_block", "mcl_core:dirt", "mcl_core:coarse_dirt", "mcl_nether:netherrack", "group:soul_block", "mcl_mud:mud", "mcl_moss:moss" } mcl_mobs.register_arrow("mobs_mc:wither_skull", { @@ -156,8 +344,9 @@ mcl_mobs.register_arrow("mobs_mc:wither_skull", { "mobs_mc_wither_projectile.png^[verticalframe:6:4", -- back "mobs_mc_wither_projectile.png^[verticalframe:6:5", -- front }, - velocity = 6, + velocity = 7, rotate = 90, + _lifetime = 350, -- direct hit hit_player = function(self, player) @@ -167,8 +356,9 @@ mcl_mobs.register_arrow("mobs_mc:wither_skull", { }, nil) mcl_mobs.effect_functions["withering"](player, 0.5, 10) mcl_mobs.mob_class.boom(self,self.object:get_pos(), 1) - if player:get_hp() <= 0 then - self._shooter:get_luaentity().health = self._shooter:get_luaentity().health + 5 + local shooter = self._shooter:get_luaentity() + if player:get_hp() <= 0 and shooter then + shooter.health = shooter.health + 5 end end, @@ -181,7 +371,8 @@ mcl_mobs.register_arrow("mobs_mc:wither_skull", { mcl_mobs.mob_class.boom(self,self.object:get_pos(), 1) local l = mob:get_luaentity() if l and l.health - 8 <= 0 then - self._shooter:get_luaentity().health = self._shooter:get_luaentity().health + 5 + local shooter = self._shooter:get_luaentity() + if shooter then shooter.health = shooter.health + 5 end local n = minetest.find_node_near(mob:get_pos(),2,wither_rose_soil) if n then local p = vector.offset(n,0,1,0) @@ -212,6 +403,7 @@ mcl_mobs.register_arrow("mobs_mc:wither_skull_strong", { }, velocity = 4, rotate = 90, + _lifetime = 500, -- direct hit hit_player = function(self, player) @@ -226,8 +418,9 @@ mcl_mobs.register_arrow("mobs_mc:wither_skull_strong", { else mcl_mobs.mob_class.safe_boom(self, pos, 1) --need to call it this way bc self is the "arrow" object here end - if player:get_hp() <= 0 then - self._shooter:get_luaentity().health = self._shooter:get_luaentity().health + 5 + local shooter = self._shooter:get_luaentity() + if player:get_hp() <= 0 and shooter then + shooter.health = shooter.health + 5 end end, @@ -245,7 +438,8 @@ mcl_mobs.register_arrow("mobs_mc:wither_skull_strong", { end local l = mob:get_luaentity() if l and l.health - 8 <= 0 then - self._shooter:get_luaentity().health = self._shooter:get_luaentity().health + 5 + local shooter = self._shooter:get_luaentity() + if shooter then shooter.health = shooter.health + 5 end local n = minetest.find_node_near(mob:get_pos(),2,wither_rose_soil) if n then local p = vector.offset(n,0,1,0) From 17c8f220e69e96cebaccc52ac6fdc45e1dbaa4ef Mon Sep 17 00:00:00 2001 From: the-real-herowl Date: Wed, 23 Aug 2023 06:12:18 +0200 Subject: [PATCH 216/982] A few more wither fixes --- mods/ENTITIES/mcl_mobs/combat.lua | 3 +- mods/ENTITIES/mcl_mobs/init.lua | 4 +- mods/ENTITIES/mobs_mc/wither.lua | 111 +++++++++++++++++---------- mods/ITEMS/mcl_potions/functions.lua | 2 +- settingtypes.txt | 9 +++ 5 files changed, 85 insertions(+), 44 deletions(-) diff --git a/mods/ENTITIES/mcl_mobs/combat.lua b/mods/ENTITIES/mcl_mobs/combat.lua index 4acbdb14e..7775c1b8e 100644 --- a/mods/ENTITIES/mcl_mobs/combat.lua +++ b/mods/ENTITIES/mcl_mobs/combat.lua @@ -384,7 +384,8 @@ function mob_class:monster_attack() -- find specific mob to attack, failing that attack player/npc/animal if specific_attack(self.specific_attack, name) and (type == "player" or ( type == "npc" and self.attack_npcs ) - or (type == "animal" and self.attack_animals == true)) then + or (type == "animal" and self.attack_animals == true) + or (self.extra_hostile and not self.attack_exception(player))) then p = player:get_pos() sp = s diff --git a/mods/ENTITIES/mcl_mobs/init.lua b/mods/ENTITIES/mcl_mobs/init.lua index 25440129d..cb9bf040a 100644 --- a/mods/ENTITIES/mcl_mobs/init.lua +++ b/mods/ENTITIES/mcl_mobs/init.lua @@ -317,6 +317,8 @@ function mcl_mobs.register_mob(name, def) is_boss = def.is_boss, dealt_effect = def.dealt_effect, on_lightning_strike = def.on_lightning_strike, + extra_hostile = def.extra_hostile, + attack_exception = def.attack_exception or function(p) return false end, _spawner = def._spawner, } @@ -352,7 +354,7 @@ function mcl_mobs.register_arrow(name, def) _lifetime = def._lifetime or 150, owner_id = def.owner_id, rotate = def.rotate, - on_punch = function(self) + on_punch = def.on_punch or function(self) local vel = self.object:get_velocity() self.object:set_velocity({x=vel.x * -1, y=vel.y * -1, z=vel.z * -1}) end, diff --git a/mods/ENTITIES/mobs_mc/wither.lua b/mods/ENTITIES/mobs_mc/wither.lua index 671183340..ea8dbd0c5 100644 --- a/mods/ENTITIES/mobs_mc/wither.lua +++ b/mods/ENTITIES/mobs_mc/wither.lua @@ -5,6 +5,9 @@ local S = minetest.get_translator("mobs_mc") local mobs_griefing = minetest.settings:get_bool("mobs_griefing") ~= false +local follow_spawner = minetest.settings:get_bool("wither_follow_spawner") == true +local w_strafes = minetest.settings:get_bool("wither_strafes") ~= false +local anti_troll = minetest.settings:get_bool("wither_anti_troll_measures") ~= false local function atan(x) if not x or x ~= x then @@ -39,12 +42,11 @@ mcl_mobs.register_mob("mobs_mc:wither", { {"mobs_mc_wither.png"}, }, visual_size = {x=4, y=4}, - makes_footstep_sound = true, view_range = 50, fear_height = 4, walk_velocity = 2, run_velocity = 4, - strafes = true, + strafes = w_strafes, sounds = { shoot_attack = "mobs_mc_ender_dragon_shoot", attack = "mobs_mc_ender_dragon_attack", @@ -55,9 +57,8 @@ mcl_mobs.register_mob("mobs_mc:wither", { jump_height = 10, fly = true, makes_footstep_sound = false, - dogshoot_switch = 1, - dogshoot_count_max = 1, - attack_animals = true, + dogshoot_switch = 1, -- unused + dogshoot_count_max = 1, -- unused can_despawn = false, drops = { {name = "mcl_mobitems:nether_star", @@ -82,6 +83,14 @@ mcl_mobs.register_mob("mobs_mc:wither", { }, harmed_by_heal = true, is_boss = true, + extra_hostile = true, + attack_exception = function(p) + local ent = p:get_luaentity() + if not ent then return false end + if not ent.is_mob or ent.harmed_by_heal or string.find(ent.name, "ghast") then return true + else return false end + end, + do_custom = function(self, dtime) if self._spawning then if not self._spw_max then self._spw_max = self._spawning end @@ -123,16 +132,17 @@ mcl_mobs.register_mob("mobs_mc:wither", { if self._custom_timer > 1 then self.health = math.min(self.health + 1, self.hp_max) self._custom_timer = self._custom_timer - 1 + self._xplded_lately = false end - if self._spawner then + if anti_troll and self._spawner then local spawner = minetest.get_player_by_name(self._spawner) if spawner then self._death_timer = 0 local pos = self.object:get_pos() local spw = spawner:get_pos() local dist = vector.distance(pos, spw) - if dist > 60 then -- teleport to the player who spawned the wither TODO add a setting to disable this + if dist > 60 and follow_spawner then -- teleport to the player who spawned the wither local R = 10 pos.x = spw.x + math.random(-R, R) pos.y = spw.y + math.random(-R, R) @@ -155,6 +165,26 @@ mcl_mobs.register_mob("mobs_mc:wither", { elseif dim == "nether" then mobs_mc.wither_count_nether = mobs_mc.wither_count_nether + 1 elseif dim == "end" then mobs_mc.wither_count_end = mobs_mc.wither_count_end + 1 end + if anti_troll then + local INDESTRUCT_BLASTRES = 1000000 + local head_pos = vector.offset(self.object:get_pos(),0,self.collisionbox[5],0) + local subh_pos = vector.offset(head_pos,0,-1,0) + local head_node = minetest.get_node(head_pos).name + local subh_node = minetest.get_node(subh_pos).name + local hnodef = minetest.registered_nodes[head_node] + local subhnodef = minetest.registered_nodes[subh_node] + if hnodef and subhnodef and (hnodef.walkable or subhnodef.walkable) and not self._xplded_lately then + if mobs_griefing and not minetest.is_protected(head_pos, "") and hnodef._mcl_blast_resistance < INDESTRUCT_BLASTRES then + local hp = self.health + mcl_explosions.explode(head_pos, 5, { drop_chance = 1.0, max_blast_resistance = 0, }, self.object) + self._xplded_lately = true + self.health = hp + else + self.object:set_pos(vector.offset(head_pos,0,10,0)) + end + end + end + local rand_factor if self.health < (self.hp_max / 2) then self.base_texture = "mobs_mc_wither_half_health.png" @@ -255,8 +285,6 @@ mcl_mobs.register_mob("mobs_mc:wither", { local rand_pos = math.random(1,3) if rand_pos == 1 then m = sr elseif rand_pos == 2 then m = sl end - -- TODO multiple targets at once? - -- TODO targeting most mobs when no players can be seen/in addition to players if self.shoot_interval and self.timer > self.shoot_interval @@ -332,6 +360,17 @@ mcl_mobs.register_mob("mobs_mc:wither", { }) local wither_rose_soil = { "group:grass_block", "mcl_core:dirt", "mcl_core:coarse_dirt", "mcl_nether:netherrack", "group:soul_block", "mcl_mud:mud", "mcl_moss:moss" } +local function spawn_wither_rose(obj) + local n = minetest.find_node_near(obj:get_pos(),2,wither_rose_soil) + if n then + local p = vector.offset(n,0,1,0) + if minetest.get_node(p).name == "air" then + if not ( mobs_griefing and minetest.place_node(p,{name="mcl_flowers:wither_rose"}) ) then + minetest.add_item(p,"mcl_flowers:wither_rose") + end + end + end +end mcl_mobs.register_arrow("mobs_mc:wither_skull", { visual = "cube", @@ -347,41 +386,37 @@ mcl_mobs.register_arrow("mobs_mc:wither_skull", { velocity = 7, rotate = 90, _lifetime = 350, + on_punch = function(self) end, -- direct hit hit_player = function(self, player) + local pos = self.object:get_pos() + mcl_mobs.effect_functions["withering"](player, 0.5, 10) player:punch(self.object, 1.0, { full_punch_interval = 0.5, damage_groups = {fleshy = 8}, }, nil) - mcl_mobs.effect_functions["withering"](player, 0.5, 10) - mcl_mobs.mob_class.boom(self,self.object:get_pos(), 1) - local shooter = self._shooter:get_luaentity() - if player:get_hp() <= 0 and shooter then - shooter.health = shooter.health + 5 + mcl_mobs.mob_class.boom(self, pos, 1) + if player:get_hp() <= 0 then + local shooter = self._shooter:get_luaentity() + if shooter then shooter.health = shooter.health + 5 end + spawn_wither_rose(player) end end, hit_mob = function(self, mob) + local pos = self.object:get_pos() + mcl_mobs.effect_functions["withering"](mob, 0.5, 10) mob:punch(self.object, 1.0, { full_punch_interval = 0.5, damage_groups = {fleshy = 8}, }, nil) - mcl_mobs.effect_functions["withering"](mob, 0.5, 10) - mcl_mobs.mob_class.boom(self,self.object:get_pos(), 1) + mcl_mobs.mob_class.boom(self, pos, 1) local l = mob:get_luaentity() if l and l.health - 8 <= 0 then local shooter = self._shooter:get_luaentity() if shooter then shooter.health = shooter.health + 5 end - local n = minetest.find_node_near(mob:get_pos(),2,wither_rose_soil) - if n then - local p = vector.offset(n,0,1,0) - if minetest.get_node(p).name == "air" then - if not ( mobs_griefing and minetest.place_node(p,{name="mcl_flowers:wither_rose"}) ) then - minetest.add_item(p,"mcl_flowers:wither_rose") - end - end - end + spawn_wither_rose(mob) end end, @@ -404,33 +439,35 @@ mcl_mobs.register_arrow("mobs_mc:wither_skull_strong", { velocity = 4, rotate = 90, _lifetime = 500, + on_punch = function(self) end, -- direct hit hit_player = function(self, player) + local pos = self.object:get_pos() + mcl_mobs.effect_functions["withering"](player, 0.5, 10) player:punch(self.object, 1.0, { full_punch_interval = 0.5, damage_groups = {fleshy = 12}, }, nil) - mcl_mobs.effect_functions["withering"](player, 0.5, 10) - local pos = self.object:get_pos() if mobs_griefing and not minetest.is_protected(pos, "") then mcl_explosions.explode(pos, 1, { drop_chance = 1.0, max_blast_resistance = 0, }, self.object) else mcl_mobs.mob_class.safe_boom(self, pos, 1) --need to call it this way bc self is the "arrow" object here end - local shooter = self._shooter:get_luaentity() - if player:get_hp() <= 0 and shooter then - shooter.health = shooter.health + 5 + if player:get_hp() <= 0 then + local shooter = self._shooter:get_luaentity() + if shooter then shooter.health = shooter.health + 5 end + spawn_wither_rose(player) end end, hit_mob = function(self, mob) + local pos = self.object:get_pos() + mcl_mobs.effect_functions["withering"](mob, 0.5, 10) mob:punch(self.object, 1.0, { full_punch_interval = 0.5, damage_groups = {fleshy = 12}, }, nil) - mcl_mobs.effect_functions["withering"](mob, 0.5, 10) - local pos = self.object:get_pos() if mobs_griefing and not minetest.is_protected(pos, "") then mcl_explosions.explode(pos, 1, { drop_chance = 1.0, max_blast_resistance = 0, }, self.object) else @@ -440,15 +477,7 @@ mcl_mobs.register_arrow("mobs_mc:wither_skull_strong", { if l and l.health - 8 <= 0 then local shooter = self._shooter:get_luaentity() if shooter then shooter.health = shooter.health + 5 end - local n = minetest.find_node_near(mob:get_pos(),2,wither_rose_soil) - if n then - local p = vector.offset(n,0,1,0) - if minetest.get_node(p).name == "air" then - if not ( mobs_griefing and minetest.place_node(p,{name="mcl_flowers:wither_rose"}) ) then - minetest.add_item(p,"mcl_flowers:wither_rose") - end - end - end + spawn_wither_rose(mob) end end, diff --git a/mods/ITEMS/mcl_potions/functions.lua b/mods/ITEMS/mcl_potions/functions.lua index f1d80886f..cb0c60a5c 100644 --- a/mods/ITEMS/mcl_potions/functions.lua +++ b/mods/ITEMS/mcl_potions/functions.lua @@ -541,7 +541,7 @@ function mcl_potions._load_player_effects(player) end if minetest.deserialize(meta:get_string("_is_withering")) then - EF.withering[player] = minetest:deserialize(meta:get_string("_is_withering")) + EF.withering[player] = minetest.deserialize(meta:get_string("_is_withering")) end end diff --git a/settingtypes.txt b/settingtypes.txt index 4066b6de7..69bf108b9 100644 --- a/settingtypes.txt +++ b/settingtypes.txt @@ -175,6 +175,15 @@ wither_cap_nether (Wither cap nether) int 10 0 2048 #Maximum amount of wither bosses on the loaded mapchunks in the end that allows spawning withers in the end (default:5) wither_cap_end (Wither cap end) int 5 0 2048 +#Should wither follow the player who spawned him around +wither_follow_spawner (Wither following his spawner) bool false + +#Should wither strafe while in combat +wither_strafes (Wither strafes) bool true + +#Wither anti-troll measures (escaping when stuck in a block, despawning when spawner goes offline, teleporting after the spawner). When this is OFF, wither_follow_spawner has no effect. +wither_anti_troll_measures (Wither anti-troll measures) bool true + #Display mob icons in inventory instead of mc-like spawn eggs mcl_old_spawn_icons (Old spawn icons instead of eggs) bool false From e4102e612448b79a3512b01ca4e3dddf190d7ef6 Mon Sep 17 00:00:00 2001 From: the-real-herowl Date: Wed, 13 Sep 2023 09:27:40 +0200 Subject: [PATCH 217/982] Implemented wither defensive measures Added block breaking when hit, or a safe_boom when hit and mobs_griefing is disabled. Removed dubious anti-troll measures. --- mods/ENTITIES/mobs_mc/wither.lua | 66 ++++++++++++++++------------ mods/ITEMS/mcl_potions/functions.lua | 24 ++++++++++ mods/ITEMS/mcl_potions/splash.lua | 2 +- 3 files changed, 64 insertions(+), 28 deletions(-) diff --git a/mods/ENTITIES/mobs_mc/wither.lua b/mods/ENTITIES/mobs_mc/wither.lua index ea8dbd0c5..5f88c18ad 100644 --- a/mods/ENTITIES/mobs_mc/wither.lua +++ b/mods/ENTITIES/mobs_mc/wither.lua @@ -21,6 +21,35 @@ end --################### WITHER --################### +local function wither_unstuck(self) + local pos = self.object:get_pos() + if mobs_griefing then + local col = self.collisionbox + local pos1 = vector.offset(pos, col[1], col[2], col[3]) + local pos2 = vector.offset(pos, col[4], col[5], col[6]) + for z = pos1.z, pos2.z do for y = pos1.y, pos2.y do for x = pos1.x, pos2.x do + local npos = vector.new(x,y,z) + local name = minetest.get_node(npos).name + if name ~= "air" then + local ndef = minetest.registered_nodes[name] + if ndef and ndef._mcl_hardness and ndef._mcl_hardness >= 0 then + local drops = minetest.get_node_drops(name, "") + if minetest.dig_node(npos) then + for _, item in ipairs(drops) do + if type(item) ~= "string" then + item = item:get_name() .. item:get_count() + end + minetest.add_item(npos, item) + end + end + end + end + end end end + else + mcl_mobs.mob_class.safe_boom(self, pos, 2) + end +end + mobs_mc.wither_count_overworld = 0 mobs_mc.wither_count_nether = 0 mobs_mc.wither_count_end = 0 @@ -137,12 +166,12 @@ mcl_mobs.register_mob("mobs_mc:wither", { if anti_troll and self._spawner then local spawner = minetest.get_player_by_name(self._spawner) - if spawner then + if follow_spawner and spawner then self._death_timer = 0 local pos = self.object:get_pos() local spw = spawner:get_pos() local dist = vector.distance(pos, spw) - if dist > 60 and follow_spawner then -- teleport to the player who spawned the wither + if dist > 60 then -- teleport to the player who spawned the wither local R = 10 pos.x = spw.x + math.random(-R, R) pos.y = spw.y + math.random(-R, R) @@ -165,26 +194,6 @@ mcl_mobs.register_mob("mobs_mc:wither", { elseif dim == "nether" then mobs_mc.wither_count_nether = mobs_mc.wither_count_nether + 1 elseif dim == "end" then mobs_mc.wither_count_end = mobs_mc.wither_count_end + 1 end - if anti_troll then - local INDESTRUCT_BLASTRES = 1000000 - local head_pos = vector.offset(self.object:get_pos(),0,self.collisionbox[5],0) - local subh_pos = vector.offset(head_pos,0,-1,0) - local head_node = minetest.get_node(head_pos).name - local subh_node = minetest.get_node(subh_pos).name - local hnodef = minetest.registered_nodes[head_node] - local subhnodef = minetest.registered_nodes[subh_node] - if hnodef and subhnodef and (hnodef.walkable or subhnodef.walkable) and not self._xplded_lately then - if mobs_griefing and not minetest.is_protected(head_pos, "") and hnodef._mcl_blast_resistance < INDESTRUCT_BLASTRES then - local hp = self.health - mcl_explosions.explode(head_pos, 5, { drop_chance = 1.0, max_blast_resistance = 0, }, self.object) - self._xplded_lately = true - self.health = hp - else - self.object:set_pos(vector.offset(head_pos,0,10,0)) - end - end - end - local rand_factor if self.health < (self.hp_max / 2) then self.base_texture = "mobs_mc_wither_half_health.png" @@ -337,14 +346,16 @@ mcl_mobs.register_mob("mobs_mc:wither", { end, do_punch = function(self, hitter, tflp, tool_capabilities, dir) - if self._spawning then return false end + if self._spawning or hitter == self.object then return false end local ent = hitter:get_luaentity() if ent and self._arrow_resistant and (string.find(ent.name, "arrow") or string.find(ent.name, "rocket")) then return false end + wither_unstuck(self) return true end, deal_damage = function(self, damage, mcl_reason) if self._spawning then return end if self._arrow_resistant and mcl_reason.type == "magic" then return end + wither_unstuck(self) self.health = self.health - damage end, @@ -390,7 +401,7 @@ mcl_mobs.register_arrow("mobs_mc:wither_skull", { -- direct hit hit_player = function(self, player) - local pos = self.object:get_pos() + local pos = vector.new(self.object:get_pos()) mcl_mobs.effect_functions["withering"](player, 0.5, 10) player:punch(self.object, 1.0, { full_punch_interval = 0.5, @@ -405,7 +416,7 @@ mcl_mobs.register_arrow("mobs_mc:wither_skull", { end, hit_mob = function(self, mob) - local pos = self.object:get_pos() + local pos = vector.new(self.object:get_pos()) mcl_mobs.effect_functions["withering"](mob, 0.5, 10) mob:punch(self.object, 1.0, { full_punch_interval = 0.5, @@ -443,7 +454,7 @@ mcl_mobs.register_arrow("mobs_mc:wither_skull_strong", { -- direct hit hit_player = function(self, player) - local pos = self.object:get_pos() + local pos = vector.new(self.object:get_pos()) mcl_mobs.effect_functions["withering"](player, 0.5, 10) player:punch(self.object, 1.0, { full_punch_interval = 0.5, @@ -462,7 +473,7 @@ mcl_mobs.register_arrow("mobs_mc:wither_skull_strong", { end, hit_mob = function(self, mob) - local pos = self.object:get_pos() + local pos = vector.new(self.object:get_pos()) mcl_mobs.effect_functions["withering"](mob, 0.5, 10) mob:punch(self.object, 1.0, { full_punch_interval = 0.5, @@ -496,3 +507,4 @@ mcl_mobs.register_egg("mobs_mc:wither", S("Wither"), "#4f4f4f", "#4f4f4f", 0, tr mcl_wip.register_wip_item("mobs_mc:wither") mcl_mobs:non_spawn_specific("mobs_mc:wither","overworld",0,minetest.LIGHT_MAX+1) + diff --git a/mods/ITEMS/mcl_potions/functions.lua b/mods/ITEMS/mcl_potions/functions.lua index cb0c60a5c..b2bc3fc96 100644 --- a/mods/ITEMS/mcl_potions/functions.lua +++ b/mods/ITEMS/mcl_potions/functions.lua @@ -730,6 +730,8 @@ end function mcl_potions.healing_func(player, hp) + if player:get_hp() <= 0 then return false end + local obj = player:get_luaentity() if player:get_hp() == 0 then @@ -762,6 +764,8 @@ end function mcl_potions.swiftness_func(player, factor, duration) + if player:get_hp() <= 0 then return false end + local entity = player:get_luaentity() if entity and entity.is_boss then return false end @@ -793,6 +797,8 @@ end function mcl_potions.leaping_func(player, factor, duration) + if player:get_hp() <= 0 then return false end + local entity = player:get_luaentity() if entity and entity.is_boss then return false end @@ -824,6 +830,8 @@ end function mcl_potions.weakness_func(player, factor, duration) + if player:get_hp() <= 0 then return false end + local entity = player:get_luaentity() if entity and entity.is_boss then return false end @@ -850,6 +858,8 @@ end function mcl_potions.strength_func(player, factor, duration) + if player:get_hp() <= 0 then return false end + local entity = player:get_luaentity() if entity and entity.is_boss then return false end @@ -876,6 +886,8 @@ end function mcl_potions.withering_func(player, factor, duration) + if player:get_hp() <= 0 then return false end + local entity = player:get_luaentity() if entity and (entity.is_boss or string.find(entity.name, "wither")) then return false end @@ -902,6 +914,8 @@ end function mcl_potions.poison_func(player, factor, duration) + if player:get_hp() <= 0 then return false end + local entity = player:get_luaentity() if entity and (entity.is_boss or entity.harmed_by_heal or string.find(entity.name, "spider")) then return false end @@ -928,6 +942,8 @@ end function mcl_potions.regeneration_func(player, factor, duration) + if player:get_hp() <= 0 then return false end + local entity = player:get_luaentity() if entity and (entity.is_boss or entity.harmed_by_heal) then return false end @@ -954,6 +970,8 @@ end function mcl_potions.invisiblility_func(player, null, duration) + if player:get_hp() <= 0 then return false end + local entity = player:get_luaentity() if entity and entity.is_boss then return false end @@ -979,6 +997,8 @@ end function mcl_potions.water_breathing_func(player, null, duration) + if player:get_hp() <= 0 then return false end + local entity = player:get_luaentity() if entity and entity.is_boss then return false end @@ -1004,6 +1024,8 @@ end function mcl_potions.fire_resistance_func(player, null, duration) + if player:get_hp() <= 0 then return false end + local entity = player:get_luaentity() if entity and entity.is_boss then return false end @@ -1028,6 +1050,8 @@ end function mcl_potions.night_vision_func(player, null, duration) + if player:get_hp() <= 0 then return false end + local entity = player:get_luaentity() if entity and entity.is_boss then return false end diff --git a/mods/ITEMS/mcl_potions/splash.lua b/mods/ITEMS/mcl_potions/splash.lua index 730796952..6b6238dbf 100644 --- a/mods/ITEMS/mcl_potions/splash.lua +++ b/mods/ITEMS/mcl_potions/splash.lua @@ -110,7 +110,7 @@ function mcl_potions.register_splash(name, descr, color, def) for _,obj in pairs(minetest.get_objects_inside_radius(pos, 4)) do local entity = obj:get_luaentity() - if obj:is_player() or entity.is_mob then + if obj:is_player() or entity and entity.is_mob then local pos2 = obj:get_pos() local rad = math.floor(math.sqrt((pos2.x-pos.x)^2 + (pos2.y-pos.y)^2 + (pos2.z-pos.z)^2)) From 966712f4ff80c0f75fa9c8146496181aeac777fb Mon Sep 17 00:00:00 2001 From: the-real-herowl Date: Sat, 23 Sep 2023 20:33:34 +0200 Subject: [PATCH 218/982] Optimisation and cleanup -optimised and cleaned up wither rose withering effect code -removed unused code --- mods/ENTITIES/mcl_mobs/physics.lua | 3 +++ mods/ENTITIES/mobs_mc/wither.lua | 1 - mods/ITEMS/mcl_potions/functions.lua | 4 ---- mods/ITEMS/mcl_potions/init.lua | 13 ++++--------- 4 files changed, 7 insertions(+), 14 deletions(-) diff --git a/mods/ENTITIES/mcl_mobs/physics.lua b/mods/ENTITIES/mcl_mobs/physics.lua index 341e28984..7ffa62ffe 100644 --- a/mods/ENTITIES/mcl_mobs/physics.lua +++ b/mods/ENTITIES/mcl_mobs/physics.lua @@ -681,6 +681,9 @@ function mob_class:do_env_damage() -- don't fall when on ignore, just stand still if self.standing_in == "ignore" then self.object:set_velocity({x = 0, y = 0, z = 0}) + -- wither rose effect + elseif self.standing_in == "mcl_flowers:wither_rose" then + mcl_potions.withering_func(self.object, 1, 2) end local nodef = minetest.registered_nodes[self.standing_in] diff --git a/mods/ENTITIES/mobs_mc/wither.lua b/mods/ENTITIES/mobs_mc/wither.lua index 5f88c18ad..8a87c92ac 100644 --- a/mods/ENTITIES/mobs_mc/wither.lua +++ b/mods/ENTITIES/mobs_mc/wither.lua @@ -161,7 +161,6 @@ mcl_mobs.register_mob("mobs_mc:wither", { if self._custom_timer > 1 then self.health = math.min(self.health + 1, self.hp_max) self._custom_timer = self._custom_timer - 1 - self._xplded_lately = false end if anti_troll and self._spawner then diff --git a/mods/ITEMS/mcl_potions/functions.lua b/mods/ITEMS/mcl_potions/functions.lua index b2bc3fc96..6f2e275df 100644 --- a/mods/ITEMS/mcl_potions/functions.lua +++ b/mods/ITEMS/mcl_potions/functions.lua @@ -734,10 +734,6 @@ function mcl_potions.healing_func(player, hp) local obj = player:get_luaentity() - if player:get_hp() == 0 then - return - end - if obj and obj.harmed_by_heal then hp = -hp end if hp > 0 then diff --git a/mods/ITEMS/mcl_potions/init.lua b/mods/ITEMS/mcl_potions/init.lua index 58572698c..73fcdae16 100644 --- a/mods/ITEMS/mcl_potions/init.lua +++ b/mods/ITEMS/mcl_potions/init.lua @@ -474,21 +474,16 @@ mcl_mobs.effect_functions["heal"] = mcl_potions.healing_func mcl_mobs.effect_functions["bad_omen"] = mcl_potions.bad_omen_func mcl_mobs.effect_functions["withering"] = mcl_potions.withering_func --- give withering when standing in wither rose +-- give withering to players in a wither rose local etime = 0 minetest.register_globalstep(function(dtime) etime = dtime + etime if etime < 0.5 then return end etime = 0 for _,pl in pairs(minetest.get_connected_players()) do - local n = minetest.find_node_near(pl:get_pos(),0.4,"mcl_flowers:wither_rose",true) - if n then mcl_potions.withering_func(pl, 1, 2) end - end - for _,ent in pairs(minetest.luaentities) do - if ent.object:get_pos() and ent.is_mob then - local n = minetest.find_node_near(ent.object:get_pos(),0.4,"mcl_flowers:wither_rose",true) - if n then mcl_potions.withering_func(ent.object, 1, 2) end - end + local npos = vector.offset(pl:get_pos(), 0, 0.2, 0) + local n = minetest.get_node(npos) + if n.name == "mcl_flowers:wither_rose" then mcl_potions.withering_func(pl, 1, 2) end end end) From d7c76e33d8692a2ee32ed3ee6a2fc7dc3870e398 Mon Sep 17 00:00:00 2001 From: the-real-herowl Date: Tue, 26 Sep 2023 03:06:50 +0200 Subject: [PATCH 219/982] Tiny adjustments - wither initial explosion radius moved from a magic value into a local variable - wither initial explosion radius reduced - wither attack_exception improved to better handle unlikely edge cases --- mods/ENTITIES/mobs_mc/wither.lua | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/mods/ENTITIES/mobs_mc/wither.lua b/mods/ENTITIES/mobs_mc/wither.lua index 8a87c92ac..2c073452a 100644 --- a/mods/ENTITIES/mobs_mc/wither.lua +++ b/mods/ENTITIES/mobs_mc/wither.lua @@ -9,6 +9,8 @@ local follow_spawner = minetest.settings:get_bool("wither_follow_spawner") == tr local w_strafes = minetest.settings:get_bool("wither_strafes") ~= false local anti_troll = minetest.settings:get_bool("wither_anti_troll_measures") ~= false +local WITHER_INIT_BOOM = 7 + local function atan(x) if not x or x ~= x then return 0 @@ -115,8 +117,8 @@ mcl_mobs.register_mob("mobs_mc:wither", { extra_hostile = true, attack_exception = function(p) local ent = p:get_luaentity() - if not ent then return false end - if not ent.is_mob or ent.harmed_by_heal or string.find(ent.name, "ghast") then return true + if p:is_player() then return false end + if not ent or not ent.is_mob or ent.harmed_by_heal or string.find(ent.name, "ghast") then return true else return false end end, @@ -145,7 +147,7 @@ mcl_mobs.register_mob("mobs_mc:wither", { if self._spawning <= 0 then if mobs_griefing and not minetest.is_protected(pos, "") then - mcl_explosions.explode(pos, 10, { drop_chance = 1.0 }, self.object) + mcl_explosions.explode(pos, WITHER_INIT_BOOM, { drop_chance = 1.0 }, self.object) else mcl_mobs.mob_class.safe_boom(self, pos, 10) end From 20b0f0748d72d62f49f88c7bb375d4f99124ee15 Mon Sep 17 00:00:00 2001 From: the-real-herowl Date: Fri, 6 Oct 2023 22:07:31 +0200 Subject: [PATCH 220/982] Added some comments to the code --- mods/ENTITIES/mobs_mc/wither.lua | 16 ++++++++++++---- 1 file changed, 12 insertions(+), 4 deletions(-) diff --git a/mods/ENTITIES/mobs_mc/wither.lua b/mods/ENTITIES/mobs_mc/wither.lua index 2c073452a..c189e97d9 100644 --- a/mods/ENTITIES/mobs_mc/wither.lua +++ b/mods/ENTITIES/mobs_mc/wither.lua @@ -1,5 +1,6 @@ --MCmobs v0.4 --maikerumine +--updated by Herowl --made for MC like Survival game --License for code WTFPL and otherwise stated in readmes @@ -25,7 +26,7 @@ end local function wither_unstuck(self) local pos = self.object:get_pos() - if mobs_griefing then + if mobs_griefing then -- destroy blocks very nearby (basically, colliding with) local col = self.collisionbox local pos1 = vector.offset(pos, col[1], col[2], col[3]) local pos2 = vector.offset(pos, col[4], col[5], col[6]) @@ -47,7 +48,7 @@ local function wither_unstuck(self) end end end end end - else + else -- when mobs_griefing disabled, make a small nondestructive explosion mcl_mobs.mob_class.safe_boom(self, pos, 2) end end @@ -124,6 +125,7 @@ mcl_mobs.register_mob("mobs_mc:wither", { do_custom = function(self, dtime) if self._spawning then + -- "loading" bar while spawning if not self._spw_max then self._spw_max = self._spawning end self._spawning = self._spawning - dtime local bardef = { @@ -139,12 +141,14 @@ mcl_mobs.register_mob("mobs_mc:wither", { mcl_bossbars.add_bar(player, bardef, true, d) end end - self.object:set_yaw(self._spawning*10) + -- turn around and flash while spawning + self.object:set_yaw(self._spawning*10) local factor = math.floor((math.sin(self._spawning*10)+1.5) * 85) local str = minetest.colorspec_to_colorstring({r=factor, g=factor, b=factor}) self.object:set_texture_mod("^[brighten^[multiply:"..str) + -- when fully spawned, explode if self._spawning <= 0 then if mobs_griefing and not minetest.is_protected(pos, "") then mcl_explosions.explode(pos, WITHER_INIT_BOOM, { drop_chance = 1.0 }, self.object) @@ -159,6 +163,7 @@ mcl_mobs.register_mob("mobs_mc:wither", { end end + -- passive regeneration self._custom_timer = self._custom_timer + dtime if self._custom_timer > 1 then self.health = math.min(self.health + 1, self.hp_max) @@ -179,7 +184,8 @@ mcl_mobs.register_mob("mobs_mc:wither", { pos.z = spw.z + math.random(-R, R) self.object:set_pos(pos) end - else + else -- despawn automatically after set time + -- HP changes impact timer: taking damage sets it back self._death_timer = self._death_timer + self.health - self._health_old if self.health == self._health_old then self._death_timer = self._death_timer + dtime end if self._death_timer > 100 then @@ -190,11 +196,13 @@ mcl_mobs.register_mob("mobs_mc:wither", { end end + -- count withers per dimension local dim = mcl_worlds.pos_to_dimension(self.object:get_pos()) if dim == "overworld" then mobs_mc.wither_count_overworld = mobs_mc.wither_count_overworld + 1 elseif dim == "nether" then mobs_mc.wither_count_nether = mobs_mc.wither_count_nether + 1 elseif dim == "end" then mobs_mc.wither_count_end = mobs_mc.wither_count_end + 1 end + -- update things dependent on HP local rand_factor if self.health < (self.hp_max / 2) then self.base_texture = "mobs_mc_wither_half_health.png" From 924a6c1c47afe84fe71d862e349d9784f4c44505 Mon Sep 17 00:00:00 2001 From: the-real-herowl Date: Fri, 6 Oct 2023 22:42:30 +0200 Subject: [PATCH 221/982] Settings-related fixes -moved to the cleaner way of obtaining settings values -disabled the anti-troll measures by default -made the wither per-dimension limit dependent on the settings -(anti-troll measures enabled required for wither counting and limit) --- mods/ENTITIES/mcl_wither_spawning/init.lua | 24 ++++---- mods/ENTITIES/mobs_mc/wither.lua | 66 +++++++++++----------- settingtypes.txt | 2 +- 3 files changed, 49 insertions(+), 43 deletions(-) diff --git a/mods/ENTITIES/mcl_wither_spawning/init.lua b/mods/ENTITIES/mcl_wither_spawning/init.lua index cee95a905..7d0746c5f 100644 --- a/mods/ENTITIES/mcl_wither_spawning/init.lua +++ b/mods/ENTITIES/mcl_wither_spawning/init.lua @@ -2,6 +2,8 @@ local dim = {"x", "z"} local modpath = minetest.get_modpath(minetest.get_current_modname()) +local anti_troll = minetest.settings:get_bool("wither_anti_troll_measures", false) + local function load_schem(filename) local file = io.open(modpath .. "/schems/" .. filename, "r") local data = minetest.deserialize(file:read()) @@ -56,7 +58,7 @@ local function wither_spawn(pos, player) for i = 0, 2 do local p = vector.add(pos, {x = 0, y = -2, z = 0, [d] = -i}) local schem = wither_spawn_schems[d] - if check_schem(p, schem) and check_limit(pos) then + if check_schem(p, schem) and (not anti_troll or check_limit(pos)) then remove_schem(p, schem) local wither = minetest.add_entity(vector.add(p, {x = 0, y = 1, z = 0, [d] = 1}), "mobs_mc:wither") local wither_ent = wither:get_luaentity() @@ -88,12 +90,14 @@ function wither_head.on_place(itemstack, placer, pointed) return old_on_place(itemstack, placer, pointed) end --- pull wither counts per dimension -minetest.register_globalstep(function(dtime) - wboss_overworld = mobs_mc.wither_count_overworld - wboss_nether = mobs_mc.wither_count_nether - wboss_end = mobs_mc.wither_count_end - mobs_mc.wither_count_overworld = 0 - mobs_mc.wither_count_nether = 0 - mobs_mc.wither_count_end = 0 -end) +if anti_troll then + -- pull wither counts per dimension + minetest.register_globalstep(function(dtime) + wboss_overworld = mobs_mc.wither_count_overworld + wboss_nether = mobs_mc.wither_count_nether + wboss_end = mobs_mc.wither_count_end + mobs_mc.wither_count_overworld = 0 + mobs_mc.wither_count_nether = 0 + mobs_mc.wither_count_end = 0 + end) +end diff --git a/mods/ENTITIES/mobs_mc/wither.lua b/mods/ENTITIES/mobs_mc/wither.lua index c189e97d9..524a57245 100644 --- a/mods/ENTITIES/mobs_mc/wither.lua +++ b/mods/ENTITIES/mobs_mc/wither.lua @@ -5,10 +5,10 @@ --License for code WTFPL and otherwise stated in readmes local S = minetest.get_translator("mobs_mc") -local mobs_griefing = minetest.settings:get_bool("mobs_griefing") ~= false -local follow_spawner = minetest.settings:get_bool("wither_follow_spawner") == true -local w_strafes = minetest.settings:get_bool("wither_strafes") ~= false -local anti_troll = minetest.settings:get_bool("wither_anti_troll_measures") ~= false +local mobs_griefing = minetest.settings:get_bool("mobs_griefing", true) +local follow_spawner = minetest.settings:get_bool("wither_follow_spawner", false) +local w_strafes = minetest.settings:get_bool("wither_strafes", true) +local anti_troll = minetest.settings:get_bool("wither_anti_troll_measures", false) local WITHER_INIT_BOOM = 7 @@ -170,38 +170,40 @@ mcl_mobs.register_mob("mobs_mc:wither", { self._custom_timer = self._custom_timer - 1 end - if anti_troll and self._spawner then - local spawner = minetest.get_player_by_name(self._spawner) - if follow_spawner and spawner then - self._death_timer = 0 - local pos = self.object:get_pos() - local spw = spawner:get_pos() - local dist = vector.distance(pos, spw) - if dist > 60 then -- teleport to the player who spawned the wither - local R = 10 - pos.x = spw.x + math.random(-R, R) - pos.y = spw.y + math.random(-R, R) - pos.z = spw.z + math.random(-R, R) - self.object:set_pos(pos) + -- anti-troll measures + if anti_troll then + if self._spawner then + local spawner = minetest.get_player_by_name(self._spawner) + if follow_spawner and spawner then + self._death_timer = 0 + local pos = self.object:get_pos() + local spw = spawner:get_pos() + local dist = vector.distance(pos, spw) + if dist > 60 then -- teleport to the player who spawned the wither + local R = 10 + pos.x = spw.x + math.random(-R, R) + pos.y = spw.y + math.random(-R, R) + pos.z = spw.z + math.random(-R, R) + self.object:set_pos(pos) + end + else -- despawn automatically after set time + -- HP changes impact timer: taking damage sets it back + self._death_timer = self._death_timer + self.health - self._health_old + if self.health == self._health_old then self._death_timer = self._death_timer + dtime end + if self._death_timer > 100 then + self.object:remove() + return false + end + self._health_old = self.health end - else -- despawn automatically after set time - -- HP changes impact timer: taking damage sets it back - self._death_timer = self._death_timer + self.health - self._health_old - if self.health == self._health_old then self._death_timer = self._death_timer + dtime end - if self._death_timer > 100 then - self.object:remove() - return false - end - self._health_old = self.health end + -- count withers per dimension + local dim = mcl_worlds.pos_to_dimension(self.object:get_pos()) + if dim == "overworld" then mobs_mc.wither_count_overworld = mobs_mc.wither_count_overworld + 1 + elseif dim == "nether" then mobs_mc.wither_count_nether = mobs_mc.wither_count_nether + 1 + elseif dim == "end" then mobs_mc.wither_count_end = mobs_mc.wither_count_end + 1 end end - -- count withers per dimension - local dim = mcl_worlds.pos_to_dimension(self.object:get_pos()) - if dim == "overworld" then mobs_mc.wither_count_overworld = mobs_mc.wither_count_overworld + 1 - elseif dim == "nether" then mobs_mc.wither_count_nether = mobs_mc.wither_count_nether + 1 - elseif dim == "end" then mobs_mc.wither_count_end = mobs_mc.wither_count_end + 1 end - -- update things dependent on HP local rand_factor if self.health < (self.hp_max / 2) then diff --git a/settingtypes.txt b/settingtypes.txt index 69bf108b9..3013b47a1 100644 --- a/settingtypes.txt +++ b/settingtypes.txt @@ -182,7 +182,7 @@ wither_follow_spawner (Wither following his spawner) bool false wither_strafes (Wither strafes) bool true #Wither anti-troll measures (escaping when stuck in a block, despawning when spawner goes offline, teleporting after the spawner). When this is OFF, wither_follow_spawner has no effect. -wither_anti_troll_measures (Wither anti-troll measures) bool true +wither_anti_troll_measures (Wither anti-troll measures) bool false #Display mob icons in inventory instead of mc-like spawn eggs mcl_old_spawn_icons (Old spawn icons instead of eggs) bool false From 645072507f39f46910f8a35f8ce9736ec8a71a80 Mon Sep 17 00:00:00 2001 From: the-real-herowl Date: Sun, 8 Oct 2023 18:59:21 +0200 Subject: [PATCH 222/982] Wither melee attack and bug fixes --- mods/ENTITIES/mobs_mc/wither.lua | 42 ++++++++++++++++++++++++++-- mods/ITEMS/mcl_potions/functions.lua | 24 ++++++++-------- 2 files changed, 51 insertions(+), 15 deletions(-) diff --git a/mods/ENTITIES/mobs_mc/wither.lua b/mods/ENTITIES/mobs_mc/wither.lua index 524a57245..6ddf615f6 100644 --- a/mods/ENTITIES/mobs_mc/wither.lua +++ b/mods/ENTITIES/mobs_mc/wither.lua @@ -11,6 +11,7 @@ local w_strafes = minetest.settings:get_bool("wither_strafes", true) local anti_troll = minetest.settings:get_bool("wither_anti_troll_measures", false) local WITHER_INIT_BOOM = 7 +local WITHER_MELEE_COOLDOWN = 3 local function atan(x) if not x or x ~= x then @@ -48,9 +49,8 @@ local function wither_unstuck(self) end end end end end - else -- when mobs_griefing disabled, make a small nondestructive explosion - mcl_mobs.mob_class.safe_boom(self, pos, 2) end + mcl_mobs.mob_class.safe_boom(self, pos, 2) end mobs_mc.wither_count_overworld = 0 @@ -105,7 +105,7 @@ mcl_mobs.register_mob("mobs_mc:wither", { dogshoot_stop = true, arrow = "mobs_mc:wither_skull", reach = 5, - shoot_interval = 0.5, + shoot_interval = 1, shoot_offset = -0.5, animation = { walk_speed = 12, run_speed = 12, stand_speed = 12, @@ -306,6 +306,42 @@ mcl_mobs.register_mob("mobs_mc:wither", { if rand_pos == 1 then m = sr elseif rand_pos == 2 then m = sl end + -- melee attack + if not self._melee_timer then + self._melee_timer = 0 + end + if self._melee_timer < WITHER_MELEE_COOLDOWN then + self._melee_timer = self._melee_timer + dtime + else + self._melee_timer = 0 + local pos = table.copy(s) + pos.y = pos.y + 2 + local objs = minetest.get_objects_inside_radius(pos, self.reach) + local obj_pos, dist + local hit_some = false + for n = 1, #objs do + objs[n]:punch(objs[n], 1.0, { + full_punch_interval = 1.0, + damage_groups = {fleshy = 4}, + }, pos) + local ent = objs[n]:get_luaentity() + if objs[n]:is_player() or ent then + mcl_util.deal_damage(objs[n], 8, {type = "magic"}) + hit_some = true + end + mcl_mobs.effect_functions["withering"](objs[n], 0.5, 10) + end + if hit_some then + mcl_mobs.effect(pos, 32, "mcl_particles_soul_fire_flame.png", 5, 10, self.reach, 1, 0) + end + end + + if dist < self.reach then + self.shoot_interval = 3 + else + self.shoot_interval = 1 + end + if self.shoot_interval and self.timer > self.shoot_interval and not minetest.raycast(vector.add(m, vector.new(0,self.shoot_offset,0)), vector.add(self.attack:get_pos(), vector.new(0,1.5,0)), false, false):next() diff --git a/mods/ITEMS/mcl_potions/functions.lua b/mods/ITEMS/mcl_potions/functions.lua index 6f2e275df..24aa2e402 100644 --- a/mods/ITEMS/mcl_potions/functions.lua +++ b/mods/ITEMS/mcl_potions/functions.lua @@ -730,7 +730,7 @@ end function mcl_potions.healing_func(player, hp) - if player:get_hp() <= 0 then return false end + if not player or player:get_hp() <= 0 then return false end local obj = player:get_luaentity() @@ -760,7 +760,7 @@ end function mcl_potions.swiftness_func(player, factor, duration) - if player:get_hp() <= 0 then return false end + if not player or player:get_hp() <= 0 then return false end local entity = player:get_luaentity() if entity and entity.is_boss then return false end @@ -793,7 +793,7 @@ end function mcl_potions.leaping_func(player, factor, duration) - if player:get_hp() <= 0 then return false end + if not player or player:get_hp() <= 0 then return false end local entity = player:get_luaentity() if entity and entity.is_boss then return false end @@ -826,7 +826,7 @@ end function mcl_potions.weakness_func(player, factor, duration) - if player:get_hp() <= 0 then return false end + if not player or player:get_hp() <= 0 then return false end local entity = player:get_luaentity() if entity and entity.is_boss then return false end @@ -854,7 +854,7 @@ end function mcl_potions.strength_func(player, factor, duration) - if player:get_hp() <= 0 then return false end + if not player or player:get_hp() <= 0 then return false end local entity = player:get_luaentity() if entity and entity.is_boss then return false end @@ -882,7 +882,7 @@ end function mcl_potions.withering_func(player, factor, duration) - if player:get_hp() <= 0 then return false end + if not player or player:get_hp() <= 0 then return false end local entity = player:get_luaentity() if entity and (entity.is_boss or string.find(entity.name, "wither")) then return false end @@ -910,7 +910,7 @@ end function mcl_potions.poison_func(player, factor, duration) - if player:get_hp() <= 0 then return false end + if not player or player:get_hp() <= 0 then return false end local entity = player:get_luaentity() if entity and (entity.is_boss or entity.harmed_by_heal or string.find(entity.name, "spider")) then return false end @@ -938,7 +938,7 @@ end function mcl_potions.regeneration_func(player, factor, duration) - if player:get_hp() <= 0 then return false end + if not player or player:get_hp() <= 0 then return false end local entity = player:get_luaentity() if entity and (entity.is_boss or entity.harmed_by_heal) then return false end @@ -966,7 +966,7 @@ end function mcl_potions.invisiblility_func(player, null, duration) - if player:get_hp() <= 0 then return false end + if not player or player:get_hp() <= 0 then return false end local entity = player:get_luaentity() if entity and entity.is_boss then return false end @@ -993,7 +993,7 @@ end function mcl_potions.water_breathing_func(player, null, duration) - if player:get_hp() <= 0 then return false end + if not player or player:get_hp() <= 0 then return false end local entity = player:get_luaentity() if entity and entity.is_boss then return false end @@ -1020,7 +1020,7 @@ end function mcl_potions.fire_resistance_func(player, null, duration) - if player:get_hp() <= 0 then return false end + if not player or player:get_hp() <= 0 then return false end local entity = player:get_luaentity() if entity and entity.is_boss then return false end @@ -1046,7 +1046,7 @@ end function mcl_potions.night_vision_func(player, null, duration) - if player:get_hp() <= 0 then return false end + if not player or player:get_hp() <= 0 then return false end local entity = player:get_luaentity() if entity and entity.is_boss then return false end From 7ce82b9dcbfe63337c3ccde221b91a6d424d7738 Mon Sep 17 00:00:00 2001 From: the-real-herowl Date: Mon, 9 Oct 2023 00:57:13 +0200 Subject: [PATCH 223/982] Peaceful crash fixed --- mods/ENTITIES/mcl_wither_spawning/init.lua | 3 +++ 1 file changed, 3 insertions(+) diff --git a/mods/ENTITIES/mcl_wither_spawning/init.lua b/mods/ENTITIES/mcl_wither_spawning/init.lua index 7d0746c5f..2a7a9c595 100644 --- a/mods/ENTITIES/mcl_wither_spawning/init.lua +++ b/mods/ENTITIES/mcl_wither_spawning/init.lua @@ -3,6 +3,7 @@ local dim = {"x", "z"} local modpath = minetest.get_modpath(minetest.get_current_modname()) local anti_troll = minetest.settings:get_bool("wither_anti_troll_measures", false) +local peaceful = minetest.settings:get_bool("only_peaceful_mobs", false) local function load_schem(filename) local file = io.open(modpath .. "/schems/" .. filename, "r") @@ -54,6 +55,7 @@ local function check_limit(pos) end local function wither_spawn(pos, player) + if peaceful then return end for _, d in pairs(dim) do for i = 0, 2 do local p = vector.add(pos, {x = 0, y = -2, z = 0, [d] = -i}) @@ -61,6 +63,7 @@ local function wither_spawn(pos, player) if check_schem(p, schem) and (not anti_troll or check_limit(pos)) then remove_schem(p, schem) local wither = minetest.add_entity(vector.add(p, {x = 0, y = 1, z = 0, [d] = 1}), "mobs_mc:wither") + if not wither then return end local wither_ent = wither:get_luaentity() wither_ent._spawner = player:get_player_name() local dim = mcl_worlds.pos_to_dimension(pos) From c874e01cf985fab7f8c704fb4eb7bd4e5593d1c5 Mon Sep 17 00:00:00 2001 From: the-real-herowl Date: Mon, 9 Oct 2023 03:04:34 +0200 Subject: [PATCH 224/982] Wither falling when no target found and small fixes --- mods/ENTITIES/mobs_mc/wither.lua | 26 +++++++++++++++++++++++--- 1 file changed, 23 insertions(+), 3 deletions(-) diff --git a/mods/ENTITIES/mobs_mc/wither.lua b/mods/ENTITIES/mobs_mc/wither.lua index 6ddf615f6..cda3f0153 100644 --- a/mods/ENTITIES/mobs_mc/wither.lua +++ b/mods/ENTITIES/mobs_mc/wither.lua @@ -53,6 +53,16 @@ local function wither_unstuck(self) mcl_mobs.mob_class.safe_boom(self, pos, 2) end +local function get_dim_relative_y(pos) + if (pos.y >= mcl_vars.mg_realm_barrier_overworld_end_max) then + return pos.y + elseif (pos.y <= mcl_vars.mg_nether_max + 200) then + return (pos.y - mcl_vars.mg_nether_min - 20) + else + return (pos.y - mcl_vars.mg_end_min - 50) + end +end + mobs_mc.wither_count_overworld = 0 mobs_mc.wither_count_nether = 0 mobs_mc.wither_count_end = 0 @@ -153,7 +163,7 @@ mcl_mobs.register_mob("mobs_mc:wither", { if mobs_griefing and not minetest.is_protected(pos, "") then mcl_explosions.explode(pos, WITHER_INIT_BOOM, { drop_chance = 1.0 }, self.object) else - mcl_mobs.mob_class.safe_boom(self, pos, 10) + mcl_mobs.mob_class.safe_boom(self, pos, WITHER_INIT_BOOM) end self.object:set_texture_mod("") self._spawning = nil @@ -217,6 +227,16 @@ mcl_mobs.register_mob("mobs_mc:wither", { self._arrow_resistant = false rand_factor = 10 end + if not self.attack then + local y = get_dim_relative_y(self.object:get_pos()) + if y > 0 then + self.fly = false + else + self.fly = true + local vel = self.object:get_velocity() + self.object:set_velocity(vector.new(vel.x, self.walk_velocity, vel.z)) + end + end self.object:set_properties({textures={self.base_texture}}) mcl_bossbars.update_boss(self.object, "Wither", "dark_purple") if math.random(1, rand_factor) < 2 then @@ -289,7 +309,7 @@ mcl_mobs.register_mob("mobs_mc:wither", { self.acc = vector.add(dir2, stay_away_from_player) end else - self:set_velocity( 0) + self:set_velocity(0) end if dist > 30 then self.acc = vector.add(self.acc, vector.direction(s, p)*0.01) end @@ -325,7 +345,7 @@ mcl_mobs.register_mob("mobs_mc:wither", { damage_groups = {fleshy = 4}, }, pos) local ent = objs[n]:get_luaentity() - if objs[n]:is_player() or ent then + if objs[n]:is_player() or (ent and ent ~= self and (not ent._shooter or ent._shooter ~= self)) then mcl_util.deal_damage(objs[n], 8, {type = "magic"}) hit_some = true end From 8d440252a4c64bda75136c041dfae711e2d76b72 Mon Sep 17 00:00:00 2001 From: Freeman Date: Fri, 13 Oct 2023 21:07:00 +0200 Subject: [PATCH 225/982] fix crash when opening a chest that has an unknow node on it fix #3961 --- mods/ITEMS/mcl_chests/init.lua | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/mods/ITEMS/mcl_chests/init.lua b/mods/ITEMS/mcl_chests/init.lua index 59ed2ba09..6f3272149 100644 --- a/mods/ITEMS/mcl_chests/init.lua +++ b/mods/ITEMS/mcl_chests/init.lua @@ -532,9 +532,12 @@ local function register_chest(basename, desc, longdesc, usagehelp, tt_help, tile _mcl_hardness = 2.5, on_rightclick = function(pos, node, clicker) - if minetest.registered_nodes[minetest.get_node({ x = pos.x, y = pos.y + 1, z = pos.z }).name].groups.opaque == 1 then - -- won't open if there is no space from the top - return false + local topnode = minetest.get_node({ x = pos.x, y = pos.y + 1, z = pos.z }) + if topnode and topnode.name and minetest.registered_nodes[topnode.name] then + if minetest.registered_nodes[topnode.name].groups.opaque == 1 then + -- won't open if there is no space from the top + return false + end end local name = minetest.get_meta(pos):get_string("name") if name == "" then From e87a8fc332c7f33a3b6bd7fc24370284182c29a3 Mon Sep 17 00:00:00 2001 From: Nils Dagsson Moskopp Date: Sun, 15 Oct 2023 17:02:19 +0200 Subject: [PATCH 226/982] Add script to generate TGA test textures --- tools/generate_test_textures.lua | 64 ++++++++++++++++++++++++++++++++ 1 file changed, 64 insertions(+) create mode 100755 tools/generate_test_textures.lua diff --git a/tools/generate_test_textures.lua b/tools/generate_test_textures.lua new file mode 100755 index 000000000..a74396d2d --- /dev/null +++ b/tools/generate_test_textures.lua @@ -0,0 +1,64 @@ +dofile("../init.lua") + +local _ = { 0, 0, 0, 128 } +local R = { 255, 0, 0, 255 } +local G = { 0, 255, 0, 255 } +local B = { 0, 0, 255, 255 } + +local pixels_rgba = { + { _, _, _, _, _, B, _, B, }, + { _, _, _, _, _, B, B, B, }, + { _, _, G, G, G, B, _, B, }, + { _, _, G, _, G, B, B, B, }, + { _, R, G, _, _, _, _, _, }, + { _, R, G, G, G, _, _, _, }, + { _, R, _, _, _, _, _, _, }, + { R, R, R, _, _, _, _, _, }, +} + +image_rgba = tga_encoder.image(pixels_rgba) + +image_rgba:save( + "type2_32bpp_bt_raw.tga", + { color_format="B8G8R8A8", compression="RAW" } +) +image_rgba:save( + "type2_32bpp_bt_rle.tga", + { color_format="B8G8R8A8", compression="RLE" } +) + +local _ = { 0, 0, 0 } +local R = { 255, 0, 0 } +local G = { 0, 255, 0 } +local B = { 0, 0, 255 } + +local pixels_rgb = { + { _, _, _, _, _, B, _, B, }, + { _, _, _, _, _, B, B, B, }, + { _, _, G, G, G, B, _, B, }, + { _, _, G, _, G, B, B, B, }, + { _, R, G, _, _, _, _, _, }, + { _, R, G, G, G, _, _, _, }, + { _, R, _, _, _, _, _, _, }, + { R, R, R, _, _, _, _, _, }, +} + +image_rgb = tga_encoder.image(pixels_rgb) + +image_rgb:save( + "type2_24bpp_bt_raw.tga", + { color_format="B8G8R8", compression="RAW" } +) +image_rgb:save( + "type2_24bpp_bt_rle.tga", + { color_format="B8G8R8", compression="RLE" } +) + +image_rgb:save( + "type2_16bpp_bt_raw.tga", + { color_format="A1R5G5B5", compression="RAW" } +) +image_rgb:save( + "type2_16bpp_bt_rle.tga", + { color_format="A1R5G5B5", compression="RLE" } +) From 4064333b069a09cd7cf7a6252bc9a652acd62c7e Mon Sep 17 00:00:00 2001 From: Nils Dagsson Moskopp Date: Sun, 15 Oct 2023 20:11:28 +0200 Subject: [PATCH 227/982] Adjust TGA test texture file names --- tools/generate_test_textures.lua | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/tools/generate_test_textures.lua b/tools/generate_test_textures.lua index a74396d2d..aace83ec3 100755 --- a/tools/generate_test_textures.lua +++ b/tools/generate_test_textures.lua @@ -19,11 +19,11 @@ local pixels_rgba = { image_rgba = tga_encoder.image(pixels_rgba) image_rgba:save( - "type2_32bpp_bt_raw.tga", + "type2_32bpp_bt.tga", { color_format="B8G8R8A8", compression="RAW" } ) image_rgba:save( - "type2_32bpp_bt_rle.tga", + "type10_32bpp_bt.tga", { color_format="B8G8R8A8", compression="RLE" } ) @@ -46,19 +46,19 @@ local pixels_rgb = { image_rgb = tga_encoder.image(pixels_rgb) image_rgb:save( - "type2_24bpp_bt_raw.tga", + "type2_24bpp_bt.tga", { color_format="B8G8R8", compression="RAW" } ) image_rgb:save( - "type2_24bpp_bt_rle.tga", + "type10_24bpp_bt.tga", { color_format="B8G8R8", compression="RLE" } ) image_rgb:save( - "type2_16bpp_bt_raw.tga", + "type2_16bpp_bt.tga", { color_format="A1R5G5B5", compression="RAW" } ) image_rgb:save( - "type2_16bpp_bt_rle.tga", + "type10_16bpp_bt.tga", { color_format="A1R5G5B5", compression="RLE" } ) From 4d57ba62bf4e499ecadfbd50916e16484a26f86d Mon Sep 17 00:00:00 2001 From: Nils Dagsson Moskopp Date: Sun, 15 Oct 2023 20:49:11 +0200 Subject: [PATCH 228/982] Add code to generate TGA type 1 test textures --- tools/generate_test_textures.lua | 44 ++++++++++++++++++++++++++++++++ 1 file changed, 44 insertions(+) diff --git a/tools/generate_test_textures.lua b/tools/generate_test_textures.lua index aace83ec3..2478aac83 100755 --- a/tools/generate_test_textures.lua +++ b/tools/generate_test_textures.lua @@ -1,5 +1,49 @@ dofile("../init.lua") +local _ = { 0 } +local R = { 1 } +local G = { 2 } +local B = { 3 } + +local pixels_colormapped = { + { _, _, _, _, _, B, _, B, }, + { _, _, _, _, _, B, B, B, }, + { _, _, G, G, G, B, _, B, }, + { _, _, G, _, G, B, B, B, }, + { _, R, G, _, _, _, _, _, }, + { _, R, G, G, G, _, _, _, }, + { _, R, _, _, _, _, _, _, }, + { R, R, R, _, _, _, _, _, }, +} + +image_colormapped = tga_encoder.image(pixels_colormapped) + +colormap_32bpp = { + { 0, 0, 0, 128 }, + { 255, 0, 0, 255 }, + { 0, 255, 0, 255 }, + { 0, 0, 255, 255 }, +} +image_colormapped:save( + "type1_32bpp_bt.tga", + { colormap = colormap_32bpp, color_format = "B8G8R8A8" } +) +image_colormapped:save( + "type1_16bpp_bt.tga", + { colormap = colormap_32bpp, color_format = "A1R5G5B5" } +) + +colormap_24bpp = { + { 0, 0, 0 }, + { 255, 0, 0 }, + { 0, 255, 0 }, + { 0, 0, 255 }, +} +image_colormapped:save( + "type1_24bpp_bt.tga", + { colormap = colormap_32bpp, color_format = "B8G8R8" } +) + local _ = { 0, 0, 0, 128 } local R = { 255, 0, 0, 255 } local G = { 0, 255, 0, 255 } From 3564f6ebde5203fae583cecffd4a58e27a7a6087 Mon Sep 17 00:00:00 2001 From: ancientmarinerdev Date: Sun, 15 Oct 2023 22:03:48 +0100 Subject: [PATCH 229/982] Fixed a crash in minetest vector code that isn't propogated to lua. Create util for ease of use. --- mods/CORE/mcl_util/init.lua | 12 ++++++++++++ mods/ENTITIES/mcl_mobs/effects.lua | 12 ++---------- mods/ENTITIES/mcl_mobs/physics.lua | 3 ++- 3 files changed, 16 insertions(+), 11 deletions(-) diff --git a/mods/CORE/mcl_util/init.lua b/mods/CORE/mcl_util/init.lua index d37bb8785..e894eebd7 100644 --- a/mods/CORE/mcl_util/init.lua +++ b/mods/CORE/mcl_util/init.lua @@ -74,6 +74,18 @@ function mcl_util.check_dtime_timer(self, dtime, timer_name, threshold) return false end +-- While we should always favour the new minetest vector functions such as vector.new or vector.offset which validate on +-- creation. There may be cases where state gets corrupted and we may have to check the vector is valid if created the +-- old way. This allows us to do this as a tactical solution until old style vectors are completely removed. +function mcl_util.validate_vector (vect) + if vect then + if tonumber(vect.x) and tonumber(vect.y) and tonumber(vect.z) then + return true + end + end + return false +end + -- Minetest 5.3.0 or less can only measure the light level. This came in at 5.4 -- This function has been known to fail in multiple places so the error handling is added increase safety and improve -- debugging. See: diff --git a/mods/ENTITIES/mcl_mobs/effects.lua b/mods/ENTITIES/mcl_mobs/effects.lua index aa44a67f7..f889f8e99 100644 --- a/mods/ENTITIES/mcl_mobs/effects.lua +++ b/mods/ENTITIES/mcl_mobs/effects.lua @@ -1,5 +1,7 @@ local math, tonumber, vector, minetest, mcl_mobs = math, tonumber, vector, minetest, mcl_mobs local mob_class = mcl_mobs.mob_class +local validate_vector = mcl_util.validate_vector + local active_particlespawners = {} local disable_blood = minetest.settings:get_bool("mobs_disable_blood") local DEFAULT_FALL_SPEED = -9.81*1.5 @@ -9,16 +11,6 @@ local PATHFINDING = "gowp" local player_transfer_distance = tonumber(minetest.settings:get("player_transfer_distance")) or 128 if player_transfer_distance == 0 then player_transfer_distance = math.huge end - -local function validate_vector (vect) - if vect then - if tonumber(vect.x) and tonumber(vect.y) and tonumber(vect.z) then - return true - end - end - return false -end - -- custom particle effects function mcl_mobs.effect(pos, amount, texture, min_size, max_size, radius, gravity, glow, go_down) diff --git a/mods/ENTITIES/mcl_mobs/physics.lua b/mods/ENTITIES/mcl_mobs/physics.lua index 7ffa62ffe..64bcfa822 100644 --- a/mods/ENTITIES/mcl_mobs/physics.lua +++ b/mods/ENTITIES/mcl_mobs/physics.lua @@ -1,5 +1,6 @@ local math, vector, minetest, mcl_mobs = math, vector, minetest, mcl_mobs local mob_class = mcl_mobs.mob_class +local validate_vector = mcl_util.validate_vector local ENTITY_CRAMMING_MAX = 24 local CRAMMING_DAMAGE = 3 @@ -355,7 +356,7 @@ function mob_class:set_yaw(yaw, delay, dtime) if math.abs(target_shortest_path_nums) > 10 then self.object:set_yaw(self.object:get_yaw()+(target_shortest_path*(3.6*ddtime))) - if self.acc then + if validate_vector(self.acc) then self.acc=vector.rotate_around_axis(self.acc,vector.new(0,1,0), target_shortest_path*(3.6*ddtime)) end end From a66be39d9bf9bcc2798207c66c88bca2e28c5661 Mon Sep 17 00:00:00 2001 From: Dark Date: Mon, 16 Oct 2023 00:15:12 +0000 Subject: [PATCH 230/982] Raise player eye height to 1.6 blocks. This is the same as in Minecraft. The previous value of 1.5 can feel very strange for those coming from that game. --- mods/PLAYER/mcl_playerplus/init.lua | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/mods/PLAYER/mcl_playerplus/init.lua b/mods/PLAYER/mcl_playerplus/init.lua index 69cb00d07..99da0a01a 100644 --- a/mods/PLAYER/mcl_playerplus/init.lua +++ b/mods/PLAYER/mcl_playerplus/init.lua @@ -154,27 +154,27 @@ end local player_props_elytra = { collisionbox = { -0.35, 0, -0.35, 0.35, 0.8, 0.35 }, - eye_height = 0.5, + eye_height = 0.6, nametag_color = { r = 225, b = 225, a = 225, g = 225 } } local player_props_riding = { collisionbox = { -0.312, 0, -0.312, 0.312, 1.8, 0.312 }, - eye_height = 1.5, + eye_height = 1.6, nametag_color = { r = 225, b = 225, a = 225, g = 225 } } local player_props_sneaking = { collisionbox = { -0.312, 0, -0.312, 0.312, 1.8, 0.312 }, - eye_height = 1.35, + eye_height = 1.45, nametag_color = { r = 225, b = 225, a = 0, g = 225 } } local player_props_swimming = { collisionbox = { -0.312, 0, -0.312, 0.312, 0.8, 0.312 }, - eye_height = 0.5, + eye_height = 0.6, nametag_color = { r = 225, b = 225, a = 225, g = 225 } } local player_props_normal = { collisionbox = { -0.312, 0, -0.312, 0.312, 1.8, 0.312 }, - eye_height = 1.5, + eye_height = 1.6, nametag_color = { r = 225, b = 225, a = 225, g = 225 } } From ef65de54c025c28ee8a0ce14c8f845738857fff8 Mon Sep 17 00:00:00 2001 From: Nils Dagsson Moskopp Date: Mon, 16 Oct 2023 19:05:44 +0200 Subject: [PATCH 231/982] Make 3D rendered donut appear solid --- donut.lua | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/donut.lua b/donut.lua index 51402ef3d..a07792a3e 100644 --- a/donut.lua +++ b/donut.lua @@ -6,7 +6,7 @@ -- cargo-culted by erle 2023-09-18 -local theta_spacing = 0.1 -- 0.07 +local theta_spacing = 0.01 -- 0.07 local phi_spacing = 0.002 -- 0.02 local R1 = 1 From 0c6d9a4d85dccabaa7d3614562f9fd0c9f2d9fab Mon Sep 17 00:00:00 2001 From: Nils Dagsson Moskopp Date: Mon, 16 Oct 2023 19:08:14 +0200 Subject: [PATCH 232/982] Partially slice 3D rendered donut along its torodial direction --- donut.lua | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/donut.lua b/donut.lua index a07792a3e..96afe0b2c 100644 --- a/donut.lua +++ b/donut.lua @@ -43,7 +43,13 @@ function render_frame(A, B) local sinB = math.sin(B) -- theta goas around the cross-sectional circle of a torus - for theta=0, 2*math.pi, theta_spacing do + local theta = 0 + while theta <= 2*math.pi do + if ( theta < 2*math.pi * 1/8 ) or ( theta > 2*math.pi * 7/8 ) then + theta = theta + (theta_spacing * 16) + else + theta = theta + theta_spacing + end -- precompute sines and cosines of theta local costheta = math.cos(theta) local sintheta = math.sin(theta) From 5dcf714cd187f21c2e32e709cbe5507ea4fd10c4 Mon Sep 17 00:00:00 2001 From: Nils Dagsson Moskopp Date: Mon, 16 Oct 2023 19:20:30 +0200 Subject: [PATCH 233/982] Partially slice 3D rendered donut along its polodial direction --- donut.lua | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/donut.lua b/donut.lua index 96afe0b2c..8567f8aed 100644 --- a/donut.lua +++ b/donut.lua @@ -55,7 +55,13 @@ function render_frame(A, B) local sintheta = math.sin(theta) -- phi goes around the center of revolution of a torus - for phi=0, 2*math.pi, phi_spacing do + local phi = 0 + while phi <= 2*math.pi do + if ( phi > 2*math.pi * 3/8 ) and ( phi < 2*math.pi * 5/8 ) then + phi = phi + (phi_spacing * 128) + else + phi = phi + phi_spacing + end -- precompute sines and cosines of phi local cosphi = math.cos(phi) local sinphi = math.sin(phi) From 12a33e458f475c051be6698b351ffdc6b2d54f1e Mon Sep 17 00:00:00 2001 From: Nils Dagsson Moskopp Date: Mon, 16 Oct 2023 20:34:47 +0200 Subject: [PATCH 234/982] Add hashbang to script to generate TGA test textures --- tools/generate_test_textures.lua | 1 + 1 file changed, 1 insertion(+) diff --git a/tools/generate_test_textures.lua b/tools/generate_test_textures.lua index 2478aac83..aaf687adc 100755 --- a/tools/generate_test_textures.lua +++ b/tools/generate_test_textures.lua @@ -1,3 +1,4 @@ +#!/usr/bin/env lua5.1 dofile("../init.lua") local _ = { 0 } From 01bcbbf9272b39cd998f0daefc3b915ffa7d8300 Mon Sep 17 00:00:00 2001 From: Nils Dagsson Moskopp Date: Mon, 16 Oct 2023 20:43:31 +0200 Subject: [PATCH 235/982] Allow encoding with top-bottom scanline order --- init.lua | 36 +++++++++++++++++++++++++++++------- 1 file changed, 29 insertions(+), 7 deletions(-) diff --git a/init.lua b/init.lua index 7a3169ca5..1a0bd4738 100644 --- a/init.lua +++ b/init.lua @@ -56,6 +56,11 @@ function image:encode_image_spec(properties) "B8G8R8" == color_format or -- (B8G8R8 = 3 bytes = 24 bits) "B8G8R8A8" == color_format -- (B8G8R8A8 = 4 bytes = 32 bits) ) + local scanline_order = properties.scanline_order + assert ( + "bottom-top" == scanline_order or + "top-bottom" == scanline_order + ) local pixel_depth if 0 ~= #properties.colormap then pixel_depth = self.pixel_depth @@ -63,13 +68,29 @@ function image:encode_image_spec(properties) pixel_depth = pixel_depth_by_color_format[color_format] end assert( nil ~= pixel_depth) - self.data = self.data - .. string.char(0, 0) -- X-origin - .. string.char(0, 0) -- Y-origin - .. string.char(self.width % 256, math.floor(self.width / 256)) -- width - .. string.char(self.height % 256, math.floor(self.height / 256)) -- height - .. string.char(pixel_depth) - .. string.char(0) -- image descriptor + -- the origin is the bottom left corner of the image (always) + local x_origin_lo = 0 + local x_origin_hi = 0 + local y_origin_lo = 0 + local y_origin_hi = 0 + local image_descriptor = 0 -- equal to bottom-top scanline order + local width_lo = self.width % 256 + local width_hi = math.floor(self.width / 256) + local height_lo = self.height % 256 + local height_hi = math.floor(self.height / 256) + if "top-bottom" == scanline_order then + image_descriptor = 32 + y_origin_lo = height_lo + y_origin_hi = height_hi + end + self.data = self.data .. string.char ( + x_origin_lo, x_origin_hi, + y_origin_lo, y_origin_hi, + width_lo, width_hi, + height_lo, height_hi, + pixel_depth, + image_descriptor + ) end function image:encode_colormap(properties) @@ -564,6 +585,7 @@ function image:encode(properties) local properties = properties or {} properties.colormap = properties.colormap or {} properties.compression = properties.compression or "RAW" + properties.scanline_order = properties.scanline_order or "bottom-top" self.pixel_depth = #self.pixels[1][1] * 8 From 10022c93ef13c9d92af3b06482e06de08728d1f2 Mon Sep 17 00:00:00 2001 From: Nils Dagsson Moskopp Date: Mon, 16 Oct 2023 20:57:00 +0200 Subject: [PATCH 236/982] Explicitly state scanline order in test texture script --- tools/generate_test_textures.lua | 48 ++++++++++++++++---------------- 1 file changed, 24 insertions(+), 24 deletions(-) diff --git a/tools/generate_test_textures.lua b/tools/generate_test_textures.lua index aaf687adc..01349f3d6 100755 --- a/tools/generate_test_textures.lua +++ b/tools/generate_test_textures.lua @@ -6,7 +6,7 @@ local R = { 1 } local G = { 2 } local B = { 3 } -local pixels_colormapped = { +local pixels_colormapped_bt = { { _, _, _, _, _, B, _, B, }, { _, _, _, _, _, B, B, B, }, { _, _, G, G, G, B, _, B, }, @@ -17,7 +17,7 @@ local pixels_colormapped = { { R, R, R, _, _, _, _, _, }, } -image_colormapped = tga_encoder.image(pixels_colormapped) +image_colormapped_bt = tga_encoder.image(pixels_colormapped_bt) colormap_32bpp = { { 0, 0, 0, 128 }, @@ -25,13 +25,13 @@ colormap_32bpp = { { 0, 255, 0, 255 }, { 0, 0, 255, 255 }, } -image_colormapped:save( +image_colormapped_bt:save( "type1_32bpp_bt.tga", - { colormap = colormap_32bpp, color_format = "B8G8R8A8" } + { colormap = colormap_32bpp, color_format = "B8G8R8A8", scanline_order = "bottom-top" } ) -image_colormapped:save( +image_colormapped_bt:save( "type1_16bpp_bt.tga", - { colormap = colormap_32bpp, color_format = "A1R5G5B5" } + { colormap = colormap_32bpp, color_format = "A1R5G5B5", scanline_order = "bottom-top" } ) colormap_24bpp = { @@ -40,9 +40,9 @@ colormap_24bpp = { { 0, 255, 0 }, { 0, 0, 255 }, } -image_colormapped:save( +image_colormapped_bt:save( "type1_24bpp_bt.tga", - { colormap = colormap_32bpp, color_format = "B8G8R8" } + { colormap = colormap_32bpp, color_format = "B8G8R8", scanline_order = "bottom-top" } ) local _ = { 0, 0, 0, 128 } @@ -50,7 +50,7 @@ local R = { 255, 0, 0, 255 } local G = { 0, 255, 0, 255 } local B = { 0, 0, 255, 255 } -local pixels_rgba = { +local pixels_rgba_bt = { { _, _, _, _, _, B, _, B, }, { _, _, _, _, _, B, B, B, }, { _, _, G, G, G, B, _, B, }, @@ -61,15 +61,15 @@ local pixels_rgba = { { R, R, R, _, _, _, _, _, }, } -image_rgba = tga_encoder.image(pixels_rgba) +image_rgba_bt = tga_encoder.image(pixels_rgba_bt) -image_rgba:save( +image_rgba_bt:save( "type2_32bpp_bt.tga", - { color_format="B8G8R8A8", compression="RAW" } + { color_format="B8G8R8A8", compression="RAW", scanline_order = "bottom-top" } ) -image_rgba:save( +image_rgba_bt:save( "type10_32bpp_bt.tga", - { color_format="B8G8R8A8", compression="RLE" } + { color_format="B8G8R8A8", compression="RLE", scanline_order = "bottom-top" } ) local _ = { 0, 0, 0 } @@ -77,7 +77,7 @@ local R = { 255, 0, 0 } local G = { 0, 255, 0 } local B = { 0, 0, 255 } -local pixels_rgb = { +local pixels_rgb_bt = { { _, _, _, _, _, B, _, B, }, { _, _, _, _, _, B, B, B, }, { _, _, G, G, G, B, _, B, }, @@ -88,22 +88,22 @@ local pixels_rgb = { { R, R, R, _, _, _, _, _, }, } -image_rgb = tga_encoder.image(pixels_rgb) +image_rgb_bt = tga_encoder.image(pixels_rgb_bt) -image_rgb:save( +image_rgb_bt:save( "type2_24bpp_bt.tga", - { color_format="B8G8R8", compression="RAW" } + { color_format="B8G8R8", compression="RAW", scanline_order = "bottom-top" } ) -image_rgb:save( +image_rgb_bt:save( "type10_24bpp_bt.tga", - { color_format="B8G8R8", compression="RLE" } + { color_format="B8G8R8", compression="RLE", scanline_order = "bottom-top" } ) -image_rgb:save( +image_rgb_bt:save( "type2_16bpp_bt.tga", - { color_format="A1R5G5B5", compression="RAW" } + { color_format="A1R5G5B5", compression="RAW", scanline_order = "bottom-top" } ) -image_rgb:save( +image_rgb_bt:save( "type10_16bpp_bt.tga", - { color_format="A1R5G5B5", compression="RLE" } + { color_format="A1R5G5B5", compression="RLE", scanline_order = "bottom-top" } ) From aad231f5e406a7c1eaafe6595a64b9c55f230692 Mon Sep 17 00:00:00 2001 From: Nils Dagsson Moskopp Date: Mon, 16 Oct 2023 21:37:02 +0200 Subject: [PATCH 237/982] =?UTF-8?q?Generate=20test=20textures=20with=20sca?= =?UTF-8?q?nline=20order=20=E2=80=9Ctop-bottom=E2=80=9D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- tools/generate_test_textures.lua | 73 +++++++++++++++++++++++++++++++- 1 file changed, 72 insertions(+), 1 deletion(-) diff --git a/tools/generate_test_textures.lua b/tools/generate_test_textures.lua index 01349f3d6..24e4b3278 100755 --- a/tools/generate_test_textures.lua +++ b/tools/generate_test_textures.lua @@ -17,7 +17,19 @@ local pixels_colormapped_bt = { { R, R, R, _, _, _, _, _, }, } +local pixels_colormapped_tb = { + { R, R, R, _, _, _, _, _, }, + { _, R, _, _, _, _, _, _, }, + { _, R, G, G, G, _, _, _, }, + { _, R, G, _, _, _, _, _, }, + { _, _, G, _, G, B, B, B, }, + { _, _, G, G, G, B, _, B, }, + { _, _, _, _, _, B, B, B, }, + { _, _, _, _, _, B, _, B, }, +} + image_colormapped_bt = tga_encoder.image(pixels_colormapped_bt) +image_colormapped_tb = tga_encoder.image(pixels_colormapped_tb) colormap_32bpp = { { 0, 0, 0, 128 }, @@ -29,10 +41,18 @@ image_colormapped_bt:save( "type1_32bpp_bt.tga", { colormap = colormap_32bpp, color_format = "B8G8R8A8", scanline_order = "bottom-top" } ) +image_colormapped_tb:save( + "type1_32bpp_tb.tga", + { colormap = colormap_32bpp, color_format = "B8G8R8A8", scanline_order = "top-bottom" } +) image_colormapped_bt:save( "type1_16bpp_bt.tga", { colormap = colormap_32bpp, color_format = "A1R5G5B5", scanline_order = "bottom-top" } ) +image_colormapped_tb:save( + "type1_16bpp_tb.tga", + { colormap = colormap_32bpp, color_format = "A1R5G5B5", scanline_order = "top-bottom" } +) colormap_24bpp = { { 0, 0, 0 }, @@ -44,6 +64,10 @@ image_colormapped_bt:save( "type1_24bpp_bt.tga", { colormap = colormap_32bpp, color_format = "B8G8R8", scanline_order = "bottom-top" } ) +image_colormapped_tb:save( + "type1_24bpp_tb.tga", + { colormap = colormap_32bpp, color_format = "B8G8R8", scanline_order = "top-bottom" } +) local _ = { 0, 0, 0, 128 } local R = { 255, 0, 0, 255 } @@ -61,16 +85,36 @@ local pixels_rgba_bt = { { R, R, R, _, _, _, _, _, }, } +local pixels_rgba_tb = { + { R, R, R, _, _, _, _, _, }, + { _, R, _, _, _, _, _, _, }, + { _, R, G, G, G, _, _, _, }, + { _, R, G, _, _, _, _, _, }, + { _, _, G, _, G, B, B, B, }, + { _, _, G, G, G, B, _, B, }, + { _, _, _, _, _, B, B, B, }, + { _, _, _, _, _, B, _, B, }, +} + image_rgba_bt = tga_encoder.image(pixels_rgba_bt) +image_rgba_tb = tga_encoder.image(pixels_rgba_tb) image_rgba_bt:save( "type2_32bpp_bt.tga", { color_format="B8G8R8A8", compression="RAW", scanline_order = "bottom-top" } ) +image_rgba_tb:save( + "type2_32bpp_tb.tga", + { color_format="B8G8R8A8", compression="RAW", scanline_order = "top-bottom" } +) image_rgba_bt:save( "type10_32bpp_bt.tga", { color_format="B8G8R8A8", compression="RLE", scanline_order = "bottom-top" } ) +image_rgba_tb:save( + "type10_32bpp_tb.tga", + { color_format="B8G8R8A8", compression="RLE", scanline_order = "top-bottom" } +) local _ = { 0, 0, 0 } local R = { 255, 0, 0 } @@ -88,22 +132,49 @@ local pixels_rgb_bt = { { R, R, R, _, _, _, _, _, }, } +local pixels_rgb_tb = { + { R, R, R, _, _, _, _, _, }, + { _, R, _, _, _, _, _, _, }, + { _, R, G, G, G, _, _, _, }, + { _, R, G, _, _, _, _, _, }, + { _, _, G, _, G, B, B, B, }, + { _, _, G, G, G, B, _, B, }, + { _, _, _, _, _, B, B, B, }, + { _, _, _, _, _, B, _, B, }, +} + image_rgb_bt = tga_encoder.image(pixels_rgb_bt) +image_rgb_tb = tga_encoder.image(pixels_rgb_tb) image_rgb_bt:save( "type2_24bpp_bt.tga", { color_format="B8G8R8", compression="RAW", scanline_order = "bottom-top" } ) +image_rgb_tb:save( + "type2_24bpp_tb.tga", + { color_format="B8G8R8", compression="RAW", scanline_order = "top-bottom" } +) image_rgb_bt:save( "type10_24bpp_bt.tga", { color_format="B8G8R8", compression="RLE", scanline_order = "bottom-top" } ) - +image_rgb_tb:save( + "type10_24bpp_tb.tga", + { color_format="B8G8R8", compression="RLE", scanline_order = "top-bottom" } +) image_rgb_bt:save( "type2_16bpp_bt.tga", { color_format="A1R5G5B5", compression="RAW", scanline_order = "bottom-top" } ) +image_rgb_tb:save( + "type2_16bpp_tb.tga", + { color_format="A1R5G5B5", compression="RAW", scanline_order = "top-bottom" } +) image_rgb_bt:save( "type10_16bpp_bt.tga", { color_format="A1R5G5B5", compression="RLE", scanline_order = "bottom-top" } ) +image_rgb_tb:save( + "type10_16bpp_tb.tga", + { color_format="A1R5G5B5", compression="RLE", scanline_order = "top-bottom" } +) From b320d008cad45df0578c0047699c3a55e08f12a4 Mon Sep 17 00:00:00 2001 From: Dehydrate6684 Date: Wed, 18 Oct 2023 08:04:54 +0800 Subject: [PATCH 238/982] Unhardcoded nil --- mods/ITEMS/mcl_core/nodes_climb.lua | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/mods/ITEMS/mcl_core/nodes_climb.lua b/mods/ITEMS/mcl_core/nodes_climb.lua index 81022bbb3..c1514926f 100644 --- a/mods/ITEMS/mcl_core/nodes_climb.lua +++ b/mods/ITEMS/mcl_core/nodes_climb.lua @@ -19,14 +19,13 @@ end ---@return boolean If the ladder and trapdoor are in the same direction. function mcl_core.check_direction(ladder, trapdoor) local convert_table = { - nil, { 1, 23 }, { 3, 21 }, { 0, 20 }, { 2, 22 }, } - local conversion = convert_table[ladder]; + local conversion = convert_table[ladder - 1]; if not conversion then return false elseif conversion[1] == trapdoor or conversion[2] == trapdoor then From ec7e99019ed14903be0f1ce04818014659c1bdb6 Mon Sep 17 00:00:00 2001 From: chmodsayshello Date: Sat, 21 Oct 2023 22:25:30 +0200 Subject: [PATCH 239/982] add trim advancements --- mods/HUD/mcl_achievements/init.lua | 21 +++++++ .../locale/mcl_achievements.de.tr | 4 ++ mods/HUD/mcl_achievements/locale/template.txt | 4 ++ mods/ITEMS/mcl_armor/api.lua | 10 ++- mods/ITEMS/mcl_armor/init.lua | 2 +- mods/ITEMS/mcl_armor/trims.lua | 18 ++++++ mods/ITEMS/mcl_smithing_table/init.lua | 59 ++++++++++++++---- .../silence_armor_trim_smithing_template.png | Bin 0 -> 279 bytes textures/silence_boots.png | Bin 0 -> 302 bytes textures/silence_chestplate.png | Bin 0 -> 617 bytes textures/silence_helmet.png | Bin 0 -> 529 bytes textures/silence_leggings.png | Bin 0 -> 575 bytes ...wayfinder_armor_trim_smithing_template.png | Bin 0 -> 238 bytes textures/wayfinder_boots.png | Bin 0 -> 310 bytes textures/wayfinder_chestplate.png | Bin 0 -> 390 bytes textures/wayfinder_helmet.png | Bin 0 -> 321 bytes textures/wayfinder_leggings.png | Bin 0 -> 276 bytes 17 files changed, 103 insertions(+), 15 deletions(-) mode change 100644 => 100755 mods/HUD/mcl_achievements/init.lua mode change 100644 => 100755 mods/HUD/mcl_achievements/locale/mcl_achievements.de.tr mode change 100644 => 100755 mods/HUD/mcl_achievements/locale/template.txt mode change 100644 => 100755 mods/ITEMS/mcl_armor/api.lua mode change 100644 => 100755 mods/ITEMS/mcl_smithing_table/init.lua create mode 100644 textures/silence_armor_trim_smithing_template.png create mode 100644 textures/silence_boots.png create mode 100644 textures/silence_chestplate.png create mode 100644 textures/silence_helmet.png create mode 100644 textures/silence_leggings.png create mode 100644 textures/wayfinder_armor_trim_smithing_template.png create mode 100644 textures/wayfinder_boots.png create mode 100644 textures/wayfinder_chestplate.png create mode 100644 textures/wayfinder_helmet.png create mode 100644 textures/wayfinder_leggings.png diff --git a/mods/HUD/mcl_achievements/init.lua b/mods/HUD/mcl_achievements/init.lua old mode 100644 new mode 100755 index 4d272fe86..61ef9a9f2 --- a/mods/HUD/mcl_achievements/init.lua +++ b/mods/HUD/mcl_achievements/init.lua @@ -431,6 +431,27 @@ awards.register_achievement("mcl:wax_off", { group = "Husbandry", }) +-- Triggered in mcl_smithing_table +awards.register_achievement("mcl:trim", { + title = S("Crafting a New Look"), + description = S("Craft a trimmed armor at a Smithing Table"), + icon = "dune_armor_trim_smithing_template.png", + type = "Advancement", + group = "Adventure", +}) + +awards.register_achievement("mcl:lots_of_trimming", { + title = S("Smithing with Style"), + description = S("Apply these smithing templates at least once: Spire, Snout, Rib, Ward, Silence, Vex, Tide, Wayfinder"), + icon = "silence_armor_trim_smithing_template.png", + type = "Advancement", + group = "Adventure", + on_unlock = function(name, awdef) + -- delete json that is no longer needed + minetest.get_player_by_name(name):get_meta():set_string("mcl_smithing_table:achievement_trims", "") + end, +}) + -- NON-PC ACHIEVEMENTS (XBox, Pocket Edition, etc.) if non_pc_achievements then diff --git a/mods/HUD/mcl_achievements/locale/mcl_achievements.de.tr b/mods/HUD/mcl_achievements/locale/mcl_achievements.de.tr old mode 100644 new mode 100755 index 1c6f668e5..7b73d1887 --- a/mods/HUD/mcl_achievements/locale/mcl_achievements.de.tr +++ b/mods/HUD/mcl_achievements/locale/mcl_achievements.de.tr @@ -51,3 +51,7 @@ Bring Home the Beacon=Den Nachbarn heimleuchten Use a beacon.=Benutzen Sie ein Leuchtfeuer. Beaconator=Leuchtturmwärter Use a fully powered beacon.=Benutzen Sie ein vollständiges Leuchtfeuer. +Crafting a New Look=Ein neues Aussehen +Craft a trimmed armor at a Smithing Table=Versieh ein Rüstungsteil an einem Schmiedetisch mit einem Rüstungsbesatz +Smithing with Style=Schmieden mit Stil +Apply these smithing templates at least once: Spire, Snout, Rib, Ward, Silence, Vex, Tide, Wayfinder=Wende jede dieser Schmiedevorlagen mindestens einmal an: Turmspitze, Schnauze, Rippe, Warthof, Stille, Plagegeist, Gezeiten und Wegfinder \ No newline at end of file diff --git a/mods/HUD/mcl_achievements/locale/template.txt b/mods/HUD/mcl_achievements/locale/template.txt old mode 100644 new mode 100755 index d865b1668..89c422a08 --- a/mods/HUD/mcl_achievements/locale/template.txt +++ b/mods/HUD/mcl_achievements/locale/template.txt @@ -111,3 +111,7 @@ Voluntary Exile= Kill a raid captain. Maybe consider staying away from the local villages for the time being...= Tactical Fishing= Catch a fish... without a fishing rod!= +Crafting a New Look= +Craft a trimmed armor at a Smithing Table= +Smithing with Style= +Apply these smithing templates at least once: Spire, Snout, Rib, Ward, Silence, Vex, Tide, Wayfinder= \ No newline at end of file diff --git a/mods/ITEMS/mcl_armor/api.lua b/mods/ITEMS/mcl_armor/api.lua old mode 100644 new mode 100755 index 558607785..1e88643f1 --- a/mods/ITEMS/mcl_armor/api.lua +++ b/mods/ITEMS/mcl_armor/api.lua @@ -326,11 +326,17 @@ end tt.register_snippet(function(itemstring, toolcaps, stack) if not stack then return nil end local meta = stack:get_meta() - if meta:get_string("mcl_armor:trim_overlay") == "" then return nil end -- remember, get_string returns "" if the key doesn't exist + if not mcl_armor.is_trimmed(stack) then return nil end -- we need to get the part of the overlay image between the overlay begin ( and the trim name end _ -- we COULD easily store this info in meta, but that would bloat the meta storage, as the same few values would be stored over and over again on every trimmed item -- this is fine here as this code gets only executed when you put armor and a trim in a smithing table local full_overlay = meta:get_string("mcl_armor:trim_overlay") local trim_name = full_overlay:match("%((.-)%_") return "Upgrade:\n " .. trim_name:gsub("^%l", string.upper) .. " Armor Trim" -end) \ No newline at end of file +end) + +function mcl_armor.is_trimmed(itemstack) + -- this meta value will be there for every trimmed armor piece + -- remember, get_string returns "" if the key doesn't exist + return itemstack:get_meta():get_string("mcl_armor:trim_overlay") ~= "" +end \ No newline at end of file diff --git a/mods/ITEMS/mcl_armor/init.lua b/mods/ITEMS/mcl_armor/init.lua index e85158f6c..402d9eef3 100644 --- a/mods/ITEMS/mcl_armor/init.lua +++ b/mods/ITEMS/mcl_armor/init.lua @@ -60,7 +60,7 @@ mcl_armor = { trims = { core_textures = {}, blacklisted = {["mcl_armor:elytra"]=true, ["mcl_armor:elytra_enchanted"]=true}, - overlays = {"sentry","dune","coast","wild","tide","ward","vex","rib","snout","eye","spire"}, + overlays = {"sentry","dune","coast","wild","tide","ward","vex","rib","snout","eye","spire","silence","wayfinder"}, colors = {["amethyst"]="#8246a5",["gold"]="#ce9627",["emerald"]="#1b9958",["copper"]="#c36447",["diamond"]="#5faed8",["iron"]="#938e88",["lapis"]="#1c306b",["netherite"]="#302a26",["quartz"]="#c9bcb9",["redstone"]="#af2c23"}, }, } diff --git a/mods/ITEMS/mcl_armor/trims.lua b/mods/ITEMS/mcl_armor/trims.lua index 9e8e32625..76d37deb0 100644 --- a/mods/ITEMS/mcl_armor/trims.lua +++ b/mods/ITEMS/mcl_armor/trims.lua @@ -43,4 +43,22 @@ minetest.register_craft({ {"mcl_core:diamond","mcl_core:goldblock","mcl_core:diamond"}, {"mcl_core:diamond","mcl_core:diamond","mcl_core:diamond"}, } +}) + +minetest.register_craft({ + output = mod_registername .. "silence", + recipe = { + {"mcl_core:diamond","mcl_core:diamond","mcl_core:diamond"}, + {"mcl_core:diamond", mod_registername.."ward","mcl_core:diamond"}, + {"mcl_core:diamond","mcl_core:diamond","mcl_core:diamond"}, + } +}) + +minetest.register_craft({ + output = mod_registername .. "wayfinder", + recipe = { + {"mcl_core:diamond","mcl_core:diamond","mcl_core:diamond"}, + {"mcl_core:diamond", "mcl_maps:empty_map","mcl_core:diamond"}, + {"mcl_core:diamond","mcl_core:diamond","mcl_core:diamond"}, + } }) \ No newline at end of file diff --git a/mods/ITEMS/mcl_smithing_table/init.lua b/mods/ITEMS/mcl_smithing_table/init.lua old mode 100644 new mode 100755 index 4690a1ed6..1794f8791 --- a/mods/ITEMS/mcl_smithing_table/init.lua +++ b/mods/ITEMS/mcl_smithing_table/init.lua @@ -88,7 +88,18 @@ local smithing_materials = { ["mcl_copper:copper_ingot"] = "copper", ["mcl_core:emerald"] = "emerald", ["mcl_nether:quartz"] = "quartz" -} +} + +local achievement_trims = { + ["mcl_armor:spire"] = true, + ["mcl_armor:snout"] = true, + ["mcl_armor:rib"] = true, + ["mcl_armor:ward"] = true, + ["mcl_armor:silence"] = true, + ["mcl_armor:vex"] = true, + ["mcl_armor:tide"] = true, + ["mcl_armor:wayfinder"] = true +} function mcl_smithing_table.upgrade_trimmed(itemstack, color_mineral, template) --get information required @@ -181,27 +192,51 @@ minetest.register_node("mcl_smithing_table:table", { on_metadata_inventory_take = function(pos, listname, index, stack, player) local inv = minetest.get_meta(pos):get_inventory() - + local function take_item(listname) local itemstack = inv:get_stack(listname, 1) itemstack:take_item() inv:set_stack(listname, 1, itemstack) end - + if listname == "upgraded_item" then + -- ToDo: make epic sound + minetest.sound_play("mcl_smithing_table_upgrade", { pos = pos, max_hear_distance = 16 }) + + if stack:get_name() == "mcl_farming:hoe_netherite" then + awards.unlock(player:get_player_name(), "mcl:seriousDedication") + elseif mcl_armor.is_trimmed(stack) then + local template_name = inv:get_stack("template", 1):get_name() + local playername = player:get_player_name() + awards.unlock(playername, "mcl:trim") + + if not awards.players[playername].unlocked["mcl:lots_of_trimming"] and achievement_trims[template_name] then + local meta = player:get_meta() + local used_achievement_trims = minetest.deserialize(meta:get_string("mcl_smithing_table:achievement_trims")) or {} + if not used_achievement_trims[template_name] then + used_achievement_trims[template_name] = true + end + + local used_all = true + for name, _ in pairs(achievement_trims) do + if not used_achievement_trims[name] then + used_all = false + break + end + end + + if used_all then + awards.unlock(playername, "mcl:lots_of_trimming") + else + meta:set_string("mcl_smithing_table:achievement_trims", minetest.serialize(used_achievement_trims)) + end + end + end + take_item("upgrade_item") take_item("mineral") take_item("template") - - -- ToDo: make epic sound - minetest.sound_play("mcl_smithing_table_upgrade", { pos = pos, max_hear_distance = 16 }) end - if listname == "upgraded_item" then - if stack:get_name() == "mcl_farming:hoe_netherite" then - awards.unlock(player:get_player_name(), "mcl:seriousDedication") - end - end - reset_upgraded_item(pos) end, diff --git a/textures/silence_armor_trim_smithing_template.png b/textures/silence_armor_trim_smithing_template.png new file mode 100644 index 0000000000000000000000000000000000000000..77e72d074b3c83e8e38e6351e99087e8b496d4d7 GIT binary patch literal 279 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbL!cYsfbE0E^QDS0{9<6*1amIz61 zEh8>vEmnS!Kz~0^cekjBFb-)ID+`MikN%gR`|W6NAHVL#?RS5|W*lMR;x{oe($m#t z7nb&KT=6o^HD<5v&)gvvxc$c-hqPqPW7FcqJ^qya zm7001_e4&dgd)F#*lq@HzYFt)lnyYIW=F5y^4QKnyIp2)so&J#^Y{Lj@&0?gw}#=x XW!8lpqM0E;7ch9b`njxgN@xNA)x%_f literal 0 HcmV?d00001 diff --git a/textures/silence_boots.png b/textures/silence_boots.png new file mode 100644 index 0000000000000000000000000000000000000000..760203a4d212f39e865321bea1c68b7c39c5e21d GIT binary patch literal 302 zcmV+}0nz@6P)NklnXkN4%+G-&Ns=TbTW`^5;_Oz}73Tw9|vmVh8m6!ylPXI-Nobo_j%N8=DG$0@~GW>;)RlLuoa;Wwol< zQG3bU8*i8~<2v>NnHHg7;}?EoV^GI{4I>t6LIF{n>>Uc4@RK_y{1B9VBKaU&m1%O3e+Drr$4gdfE07*qoM6N<$f+5|8 A8vp+;4MJ`2bE~|yje&u7B|DS*6K~7FiPEJlvPEO8$ zrmt5)@~u$-ZAr`KZ8l0FDKP!6B0fG?TPNK)dmFAnGTOMHi(z8E61KF+SBgrQ(g6bm zO--USqXFB~BIv9r&#h*cU($G?fnEt6)1Z(tDGyl@?1tUukz16Dim5Ef7cCkNu&x1` zoQax8`+L1Z5)3M=yN!6nl^f`YZiK#648suLcDczjL&w8kQnEW*HJIVC)ihvUZO*KO5; zKf52pKo?)0Sd$5dy_X_>_d+0*g3Q>kf-|2TdjP;)?y-NgLD+H=;%8sM4=X7KH8;UN z-vv(5&#DAQ3<*PQMy2kdB@9M8#~ulQ6TJ#--Y^6=%$6;fCmsv3<%SQw7IS=NJWk@K zHZ@^9tNbw%2v1u~0Mceks!;-3(y}d^2hI literal 0 HcmV?d00001 diff --git a/textures/silence_helmet.png b/textures/silence_helmet.png new file mode 100644 index 0000000000000000000000000000000000000000..ad2de6ab0b9962270d5481b57a93525ad094a243 GIT binary patch literal 529 zcmV+s0`C2ZP)Iq%2#3trBBu;`+lGf#YhwUINvCiP6c@}nkFn)k9V8i9C&mWQ1J$nv@0$Z_ccq^Wpc{IES=+rE( z%sh<&Nu)+GT_F{e~c7lkC$0DuBQT0o#a+P5OLm7WaR_M?&8ovP$f{s05 z+ZLMzHP~Wb9`xGZp=t#!aE*#q2?q8|nU@Fi7EItLw5q=ANyp)kV@n@ za!mE=)!T>X9!NYL#F=pD1e3@c1 zNvN-lEZ5m4)5z8QfZdkiJHvg3ilyzp?|)7H8nSvN!$%H>W^K2_t=kzaOSp{;Hnl_^ zGrnNecK*ojb<5=n6864PXAbc`y(nq>j~V6XUdoAh+h4Y_+jVDxW9zbA>@!l|UoO5q zw_Lq1i}Tu3`O{ey_Z@k8W3jopZn5 zJFxh0lq2t_PQJx+LB`EYM8`vJKVyA%Jc@Lz3ynC0u22ire0f>MU3 LtDnm{r-UW|0bup7 literal 0 HcmV?d00001 diff --git a/textures/wayfinder_armor_trim_smithing_template.png b/textures/wayfinder_armor_trim_smithing_template.png new file mode 100644 index 0000000000000000000000000000000000000000..23fd30a87f69b05af81c2fe5bbe61ded61c09b27 GIT binary patch literal 238 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbL!aez;VE0BIU*W+QU-IfT+_87m3 zS&=hKlW)KKv*OYJ@^im?l0xIx-3Xg;#J_QEqPty&pQ~HZ{43Y>Eak7ak=+gAm3pH9_D~;w-gJ#Pyh9gesO4@w1JR6=b|a*tQUG7yByjR zCV%QYe-Dp_$L}=ua-otW?+cDxqG!x~c#`^bIMye>$>3)3NcQG@KJ|4>!0hcaS&vqK infd?z;y3>HuJRuF!#usjcGnxAjSQZyelF{r5}E+I@LYxf literal 0 HcmV?d00001 diff --git a/textures/wayfinder_boots.png b/textures/wayfinder_boots.png new file mode 100644 index 0000000000000000000000000000000000000000..5e8717ccb612bea99fc55d38ca4a7ddba3e942a5 GIT binary patch literal 310 zcmeAS@N?(olHy`uVBq!ia0vp^4nVBH!3-p)I`?e@QaJ%WA+A9B!Gi~9&z#z~Z{Om@ ziziK*bo$f@AY%y_baZqiCnwLDGw1Q+$4{R=-L-31LqkJOPR_)M6X(sFw{iX2<;#~< zRaLpUxuvD0g@uK6cXt;R6%`Z|BqStk+_0{ztINT`At)#aXh>mUVWwnmJRt<807*qoM6N<$f&`VT6951J literal 0 HcmV?d00001 diff --git a/textures/wayfinder_helmet.png b/textures/wayfinder_helmet.png new file mode 100644 index 0000000000000000000000000000000000000000..d2e7fe7654128b03ef4920c2cd576c1d4ecdead9 GIT binary patch literal 321 zcmV-H0lxl;P)@E=f<;i4?3(1km$1J;OqR=?MY+Qw zz624+#xM+Fimp7xAZsRXP~?2dfpa*V9~@9hssA7{kpMKLBLH^>;K2ZNq#*#;a%#TY z4bq=qFD?{5eBf>f?HGZ3&HKW0EkibckWAD<+a`8X^xJodlD#U_1x7qX(xT*32Uy)0 zN_MIz=EXOi80oE;{(sIR^FdDrI3&N1p1yPL&KZoD#661;2jW}C#vsROK- z{VqT#5PR5`7Ki?8*6Z~uYz_96az~TgS{QH@E|=1O;77_*mR~xplu}A5_2+y7$*E7F TZJi}e00000NkvXXu0mjfL5+%Z literal 0 HcmV?d00001 diff --git a/textures/wayfinder_leggings.png b/textures/wayfinder_leggings.png new file mode 100644 index 0000000000000000000000000000000000000000..64dbe2015ccbc1bcc7ad8473581edb28197608e0 GIT binary patch literal 276 zcmV+v0qg#WP) Date: Sat, 16 Sep 2023 22:57:15 +0200 Subject: [PATCH 240/982] All wood-type and nether-type fences now match material's blast resistance --- mods/ITEMS/mcl_bamboo/bamboo_items.lua | 21 +++++++++++++++++---- mods/ITEMS/mcl_cherry_blossom/nodes.lua | 13 ++++++++++--- mods/ITEMS/mcl_fences/init.lua | 21 +++++++++++++++++++-- 3 files changed, 46 insertions(+), 9 deletions(-) diff --git a/mods/ITEMS/mcl_bamboo/bamboo_items.lua b/mods/ITEMS/mcl_bamboo/bamboo_items.lua index 412ec92cb..95d4999fc 100644 --- a/mods/ITEMS/mcl_bamboo/bamboo_items.lua +++ b/mods/ITEMS/mcl_bamboo/bamboo_items.lua @@ -192,10 +192,23 @@ if minetest.get_modpath("mcl_fences") then local wood_groups = { handy = 1, axey = 1, flammable = 2, fence_wood = 1, fire_encouragement = 5, fire_flammability = 20 } local wood_connect = { "group:fence_wood" } - local fence_id = mcl_fences.register_fence(id, S("Bamboo Fence"), "mcl_bamboo_fence_bamboo.png", wood_groups, - 2, 15, wood_connect, node_sound) - local gate_id = mcl_fences.register_fence_gate(id, S("Bamboo Fence Gate"), "mcl_bamboo_fence_gate_bamboo.png", - wood_groups, 2, 15, node_sound) -- note: about missing params.. will use defaults. + local fence_id = mcl_fences.register_fence( + id, + S("Bamboo Fence"), + "mcl_bamboo_fence_bamboo.png", + wood_groups, + minetest.registered_nodes["mcl_core:wood"]._mcl_hardness, + minetest.registered_nodes["mcl_core:wood"]._mcl_blast_resistance, + wood_connect, node_sound) + + local gate_id = mcl_fences.register_fence_gate( + id, + S("Bamboo Fence Gate"), + "mcl_bamboo_fence_gate_bamboo.png", + wood_groups, + minetest.registered_nodes["mcl_core:wood"]._mcl_hardness, + minetest.registered_nodes["mcl_core:wood"]._mcl_blast_resistance, + node_sound) -- note: about missing params.. will use defaults. mcl_bamboo.mcl_log(dump(fence_id)) mcl_bamboo.mcl_log(dump(gate_id)) diff --git a/mods/ITEMS/mcl_cherry_blossom/nodes.lua b/mods/ITEMS/mcl_cherry_blossom/nodes.lua index 4b6803123..403982872 100644 --- a/mods/ITEMS/mcl_cherry_blossom/nodes.lua +++ b/mods/ITEMS/mcl_cherry_blossom/nodes.lua @@ -66,9 +66,16 @@ mcl_signs.register_sign_custom("mcl_cherry_blossom", "_cherrywood", "mcl_cherry_blossom_sign_inv.png", "mcl_cherry_blossom_sign_inv.png", S("Cherry Sign")) -- Fences & Gates -mcl_fences.register_fence_and_fence_gate("cherry_fence", S("Cherry Fence"), S("Cherry Gate"), - "mcl_cherry_blossom_planks.png", {handy=1, axey=1, flammable=2, fence_wood=1, fire_encouragement=5, fire_flammability=20}, 2, 15, - {"group:fence_wood"}, mcl_sounds.node_sound_wood_defaults()) +mcl_fences.register_fence_and_fence_gate( + "cherry_fence", + S("Cherry Fence"), + S("Cherry Gate"), + "mcl_cherry_blossom_planks.png", + {handy=1, axey=1, flammable=2, fence_wood=1, fire_encouragement=5, fire_flammability=20}, + minetest.registered_nodes["mcl_core:wood"]._mcl_hardness, + minetest.registered_nodes["mcl_core:wood"]._mcl_blast_resistance, + {"group:fence_wood"}, + mcl_sounds.node_sound_wood_defaults()) -- Redstone mesecon.register_pressure_plate( diff --git a/mods/ITEMS/mcl_fences/init.lua b/mods/ITEMS/mcl_fences/init.lua index b14d103d2..5555fbfc0 100644 --- a/mods/ITEMS/mcl_fences/init.lua +++ b/mods/ITEMS/mcl_fences/init.lua @@ -269,7 +269,16 @@ for w=1, #woods do id = wood[1].."_fence" id_gate = wood[1].."_fence_gate" end - mcl_fences.register_fence_and_fence_gate(id, wood[2], wood[3], wood[4], wood_groups, 2, 15, wood_connect, wood_sounds) + mcl_fences.register_fence_and_fence_gate( + id, + wood[2], + wood[3], + wood[4], + wood_groups, + minetest.registered_nodes["mcl_core:wood"]._mcl_hardness, + minetest.registered_nodes["mcl_core:wood"]._mcl_blast_resistance, + wood_connect, + wood_sounds) minetest.register_craft({ output = "mcl_fences:"..id.." 3", @@ -289,7 +298,15 @@ end -- Nether Brick Fence (without fence gate!) -mcl_fences.register_fence("nether_brick_fence", S("Nether Brick Fence"), "mcl_fences_fence_nether_brick.png", {pickaxey=1, deco_block=1, fence_nether_brick=1}, 2, 30, {"group:fence_nether_brick"}, mcl_sounds.node_sound_stone_defaults()) +mcl_fences.register_fence( + "nether_brick_fence", + S("Nether Brick Fence"), + "mcl_fences_fence_nether_brick.png", + {pickaxey=1, deco_block=1, fence_nether_brick=1}, + minetest.registered_nodes["mcl_nether:nether_brick"]._mcl_hardness, + minetest.registered_nodes["mcl_nether:nether_brick"]._mcl_blast_resistance, + {"group:fence_nether_brick"}, + mcl_sounds.node_sound_stone_defaults()) minetest.register_craft({ output = "mcl_fences:nether_brick_fence 6", From e43a8e267d52399638e7a82501ba78db01c420b2 Mon Sep 17 00:00:00 2001 From: seventeenthShulker Date: Sun, 17 Sep 2023 13:47:18 +0200 Subject: [PATCH 241/982] Un-hardcode blast resistance, hardness for walls, now only based on their material --- mods/ITEMS/mcl_blackstone/init.lua | 10 +++++++++- mods/ITEMS/mcl_deepslate/init.lua | 10 +++++++++- mods/ITEMS/mcl_ocean/prismarine.lua | 4 ++-- mods/ITEMS/mcl_walls/API.md | 4 +++- mods/ITEMS/mcl_walls/init.lua | 18 ++++++++--------- mods/ITEMS/mcl_walls/register.lua | 30 ++++++++++++++--------------- 6 files changed, 47 insertions(+), 29 deletions(-) diff --git a/mods/ITEMS/mcl_blackstone/init.lua b/mods/ITEMS/mcl_blackstone/init.lua index fd05465d3..6677ba0fe 100644 --- a/mods/ITEMS/mcl_blackstone/init.lua +++ b/mods/ITEMS/mcl_blackstone/init.lua @@ -199,7 +199,15 @@ mcl_stairs.register_stair_and_slab_simple("blackstone_chiseled_polished", "mcl_b mcl_stairs.register_stair_and_slab_simple("blackstone_brick_polished", "mcl_blackstone:blackstone_brick_polished", S("Polished Blackstone Brick Stair"), S("Polished Blackstone Brick Slab"), S("Double Polished Blackstone Brick Slab")) --Wall -mcl_walls.register_wall("mcl_blackstone:wall", S("Blackstone Wall"), "mcl_blackstone:blackstone") +mcl_walls.register_wall( + "mcl_blackstone:wall", + S("Blackstone Wall"), + "mcl_blackstone:blackstone", + nil, + nil, + nil, + minetest.registered_nodes["mcl_blackstone:blackstone"]._mcl_hardness, + minetest.registered_nodes["mcl_blackstone:blackstone"]._mcl_blast_resistance) --lavacooling diff --git a/mods/ITEMS/mcl_deepslate/init.lua b/mods/ITEMS/mcl_deepslate/init.lua index a1182246a..03f5843e2 100644 --- a/mods/ITEMS/mcl_deepslate/init.lua +++ b/mods/ITEMS/mcl_deepslate/init.lua @@ -218,7 +218,15 @@ local function register_deepslate_variant(item, desc, longdesc) end if item ~= "chiseled" then mcl_stairs.register_stair_and_slab_simple("deepslate_"..item, "mcl_deepslate:deepslate_"..item, S(desc.." Stairs"), S(desc.." Slab"), S("Double "..desc.." Slab")) - mcl_walls.register_wall("mcl_deepslate:deepslate"..item.."wall", S(desc.." Wall"), "mcl_deepslate:deepslate_"..item) + mcl_walls.register_wall( + "mcl_deepslate:deepslate"..item.."wall", + S(desc.." Wall"), + "mcl_deepslate:deepslate_"..item, + nil, + nil, + nil, + minetest.registered_nodes["mcl_deepslate:deepslate"]._mcl_hardness, + minetest.registered_nodes["mcl_deepslate:deepslate"]._mcl_blast_resistance) end end diff --git a/mods/ITEMS/mcl_ocean/prismarine.lua b/mods/ITEMS/mcl_ocean/prismarine.lua index 32d17538d..71ffb94ce 100644 --- a/mods/ITEMS/mcl_ocean/prismarine.lua +++ b/mods/ITEMS/mcl_ocean/prismarine.lua @@ -52,7 +52,7 @@ minetest.register_node("mcl_ocean:prismarine_brick", { tiles = {"mcl_ocean_prismarine_bricks.png"}, groups = {pickaxey=1, building_block=1, material_stone=1}, sounds = mcl_sounds.node_sound_stone_defaults(), - _mcl_blast_resistance = 1.5, + _mcl_blast_resistance = 1.5,--ffffixme _mcl_hardness = 1.5, }) @@ -64,7 +64,7 @@ minetest.register_node("mcl_ocean:prismarine_dark", { tiles = {"mcl_ocean_prismarine_dark.png"}, groups = {pickaxey=1, building_block=1, material_stone=1}, sounds = mcl_sounds.node_sound_stone_defaults(), - _mcl_blast_resistance = 1.5, + _mcl_blast_resistance = 1.5,--fixmetoo _mcl_hardness = 1.5, }) diff --git a/mods/ITEMS/mcl_walls/API.md b/mods/ITEMS/mcl_walls/API.md index e6956ac47..bacb343bb 100644 --- a/mods/ITEMS/mcl_walls/API.md +++ b/mods/ITEMS/mcl_walls/API.md @@ -2,7 +2,7 @@ This API allows you to add more walls (like the cobblestone wall) to MineClone 2. -## `mcl_walls.register_wall(nodename, description, craft_material, tiles, invtex, groups, sounds)` +## `mcl_walls.register_wall(nodename, description, craft_material, tiles, invtex, groups, hardness, blast_resistance, sounds)` Adds a new wall type. This is optimized for stone-based walls, but other materials are theoretically possible, too. @@ -24,6 +24,8 @@ If `craft_material` is not `nil` it also adds a crafting recipe of the following * `tiles`: Wall textures table, same syntax as for `minetest.register_node` (optional if `source` is set) * `inventory_image`: Inventory image (optional if `source` is set) * `groups`: Base group memberships (optional, default is `{pickaxey=1}`) +* `hardness`: Hardness of node (optional, default is 2) +* `blast_resistance`: Blast resistance of node (optional, default is 6 like most stone walls) * `sounds`: Sound table (optional, by default default uses stone sounds) The following groups will automatically be added to the nodes (where applicable), you do not need to add them diff --git a/mods/ITEMS/mcl_walls/init.lua b/mods/ITEMS/mcl_walls/init.lua index 14b512ffd..7b2933c4b 100644 --- a/mods/ITEMS/mcl_walls/init.lua +++ b/mods/ITEMS/mcl_walls/init.lua @@ -98,7 +98,7 @@ local full_blocks = { * groups: Base group memberships (optional, default is {pickaxey=1}) * sounds: Sound table (optional, default is stone) ]] -function mcl_walls.register_wall(nodename, description, source, tiles, inventory_image, groups, sounds) +function mcl_walls.register_wall(nodename, description, source, tiles, inventory_image, groups, hardness, blast_resistance, sounds) local base_groups = groups if not base_groups then @@ -169,8 +169,8 @@ function mcl_walls.register_wall(nodename, description, source, tiles, inventory fixed = take }, sounds = sounds, - _mcl_blast_resistance = 6, - _mcl_hardness = 2, + _mcl_blast_resistance = blast_resistance, + _mcl_hardness = hardness, }) -- Add entry alias for the Help @@ -197,8 +197,8 @@ function mcl_walls.register_wall(nodename, description, source, tiles, inventory fixed = {pillar, full_blocks[1]} }, sounds = sounds, - _mcl_blast_resistance = 6, - _mcl_hardness = 2, + _mcl_blast_resistance = blast_resistance, + _mcl_hardness = hardness, }) -- Add entry alias for the Help if minetest.get_modpath("doc") then @@ -223,8 +223,8 @@ function mcl_walls.register_wall(nodename, description, source, tiles, inventory fixed = {pillar, full_blocks[2]} }, sounds = sounds, - _mcl_blast_resistance = 6, - _mcl_hardness = 2, + _mcl_blast_resistance = blast_resistance, + _mcl_hardness = hardness, }) -- Add entry alias for the Help if minetest.get_modpath("doc") then @@ -255,8 +255,8 @@ function mcl_walls.register_wall(nodename, description, source, tiles, inventory collisionbox = {-0.2, 0, -0.2, 0.2, 1.4, 0.2}, on_construct = update_wall, sounds = sounds, - _mcl_blast_resistance = 6, - _mcl_hardness = 2, + _mcl_blast_resistance = blast_resistance, + _mcl_hardness = hardness, }) if source then minetest.register_craft({ diff --git a/mods/ITEMS/mcl_walls/register.lua b/mods/ITEMS/mcl_walls/register.lua index 96a1b9b9f..6f3b9f1d9 100644 --- a/mods/ITEMS/mcl_walls/register.lua +++ b/mods/ITEMS/mcl_walls/register.lua @@ -1,17 +1,17 @@ local S = minetest.get_translator(minetest.get_current_modname()) -mcl_walls.register_wall("mcl_walls:cobble", S("Cobblestone Wall"), "mcl_core:cobble", {"mcl_walls_cobble_wall_top.png", "default_cobble.png", "mcl_walls_cobble_wall_side.png"}) -mcl_walls.register_wall("mcl_walls:mossycobble", S("Mossy Cobblestone Wall"), "mcl_core:mossycobble", {"mcl_walls_cobble_mossy_wall_top.png", "default_mossycobble.png", "mcl_walls_cobble_mossy_wall_side.png"}) -mcl_walls.register_wall("mcl_walls:andesite", S("Andesite Wall"), "mcl_core:andesite") -mcl_walls.register_wall("mcl_walls:granite", S("Granite Wall"), "mcl_core:granite") -mcl_walls.register_wall("mcl_walls:diorite", S("Diorite Wall"), "mcl_core:diorite") -mcl_walls.register_wall("mcl_walls:brick", S("Brick Wall"), "mcl_core:brick_block") -mcl_walls.register_wall("mcl_walls:sandstone", S("Sandstone Wall"), "mcl_core:sandstone") -mcl_walls.register_wall("mcl_walls:redsandstone", S("Red Sandstone Wall"), "mcl_core:redsandstone") -mcl_walls.register_wall("mcl_walls:stonebrick", S("Stone Brick Wall"), "mcl_core:stonebrick") -mcl_walls.register_wall("mcl_walls:stonebrickmossy", S("Mossy Stone Brick Wall"), "mcl_core:stonebrickmossy") -mcl_walls.register_wall("mcl_walls:prismarine", S("Prismarine Wall"), "mcl_ocean:prismarine") -mcl_walls.register_wall("mcl_walls:endbricks", S("End Stone Brick Wall"), "mcl_end:end_bricks") -mcl_walls.register_wall("mcl_walls:netherbrick", S("Nether Brick Wall"), "mcl_nether:nether_brick") -mcl_walls.register_wall("mcl_walls:rednetherbrick", S("Red Nether Brick Wall"), "mcl_nether:red_nether_brick") -mcl_walls.register_wall("mcl_walls:mudbrick", S("Mud Brick Wall"), "mcl_mud:mud_bricks") \ No newline at end of file +mcl_walls.register_wall("mcl_walls:cobble", S("Cobblestone Wall"), "mcl_core:cobble", {"mcl_walls_cobble_wall_top.png", "default_cobble.png", "mcl_walls_cobble_wall_side.png"}, nil, nil, minetest.registered_nodes["mcl_core:cobble"]._mcl_hardness, minetest.registered_nodes["mcl_core:cobble"]._mcl_blast_resistance) +mcl_walls.register_wall("mcl_walls:mossycobble", S("Mossy Cobblestone Wall"), "mcl_core:mossycobble", {"mcl_walls_cobble_mossy_wall_top.png", "default_mossycobble.png", "mcl_walls_cobble_mossy_wall_side.png"}, nil, nil, minetest.registered_nodes["mcl_core:mossycobble"]._mcl_hardness, minetest.registered_nodes["mcl_core:mossycobble"]._mcl_blast_resistance) +mcl_walls.register_wall("mcl_walls:andesite", S("Andesite Wall"), "mcl_core:andesite", nil, nil, nil, minetest.registered_nodes["mcl_core:andesite"]._mcl_hardness, minetest.registered_nodes["mcl_core:andesite"]._mcl_blast_resistance) +mcl_walls.register_wall("mcl_walls:granite", S("Granite Wall"), "mcl_core:granite", nil, nil, nil, minetest.registered_nodes["mcl_core:granite"]._mcl_hardness, minetest.registered_nodes["mcl_core:granite"]._mcl_blast_resistance) +mcl_walls.register_wall("mcl_walls:diorite", S("Diorite Wall"), "mcl_core:diorite", nil, nil, nil, minetest.registered_nodes["mcl_core:diorite"]._mcl_hardness, minetest.registered_nodes["mcl_core:diorite"]._mcl_blast_resistance) +mcl_walls.register_wall("mcl_walls:brick", S("Brick Wall"), "mcl_core:brick_block", nil, nil, nil, minetest.registered_nodes["mcl_core:brick_block"]._mcl_hardness, minetest.registered_nodes["mcl_core:brick_block"]._mcl_blast_resistance) +mcl_walls.register_wall("mcl_walls:sandstone", S("Sandstone Wall"), "mcl_core:sandstone", nil, nil, nil, minetest.registered_nodes["mcl_core:sandstone"]._mcl_hardness, minetest.registered_nodes["mcl_core:sandstone"]._mcl_blast_resistance) +mcl_walls.register_wall("mcl_walls:redsandstone", S("Red Sandstone Wall"), "mcl_core:redsandstone", nil, nil, nil, minetest.registered_nodes["mcl_core:redsandstone"]._mcl_hardness, minetest.registered_nodes["mcl_core:redsandstone"]._mcl_blast_resistance) +mcl_walls.register_wall("mcl_walls:stonebrick", S("Stone Brick Wall"), "mcl_core:stonebrick", nil, nil, nil, minetest.registered_nodes["mcl_core:stonebrick"]._mcl_hardness, minetest.registered_nodes["mcl_core:stonebrick"]._mcl_blast_resistance) +mcl_walls.register_wall("mcl_walls:stonebrickmossy", S("Mossy Stone Brick Wall"), "mcl_core:stonebrickmossy", nil, nil, nil, minetest.registered_nodes["mcl_core:stonebrickmossy"]._mcl_hardness, minetest.registered_nodes["mcl_core:stonebrickmossy"]._mcl_blast_resistance) +mcl_walls.register_wall("mcl_walls:prismarine", S("Prismarine Wall"), "mcl_ocean:prismarine", nil, nil, nil, minetest.registered_nodes["mcl_ocean:prismarine"]._mcl_hardness, minetest.registered_nodes["mcl_ocean:prismarine"]._mcl_blast_resistance) +mcl_walls.register_wall("mcl_walls:endbricks", S("End Stone Brick Wall"), "mcl_end:end_bricks", nil, nil, nil, minetest.registered_nodes["mcl_end:end_bricks"]._mcl_hardness, minetest.registered_nodes["mcl_end:end_bricks"]._mcl_blast_resistance) +mcl_walls.register_wall("mcl_walls:netherbrick", S("Nether Brick Wall"), "mcl_nether:nether_brick", nil, nil, nil, minetest.registered_nodes["mcl_nether:nether_brick"]._mcl_hardness, minetest.registered_nodes["mcl_nether:nether_brick"]._mcl_blast_resistance) +mcl_walls.register_wall("mcl_walls:rednetherbrick", S("Red Nether Brick Wall"), "mcl_nether:red_nether_brick", nil, nil, nil, minetest.registered_nodes["mcl_nether:red_nether_brick"]._mcl_hardness, minetest.registered_nodes["mcl_nether:red_nether_brick"]._mcl_blast_resistance) +mcl_walls.register_wall("mcl_walls:mudbrick", S("Mud Brick Wall"), "mcl_mud:mud_bricks", nil, nil, nil, minetest.registered_nodes["mcl_mud:mud_bricks"]._mcl_hardness, minetest.registered_nodes["mcl_mud:mud_bricks"]._mcl_blast_resistance) \ No newline at end of file From e2ed1ab4a6623179b499fed6ca4347fbae02f565 Mon Sep 17 00:00:00 2001 From: seventeenthShulker Date: Sun, 17 Sep 2023 13:49:00 +0200 Subject: [PATCH 242/982] Fix prismarine bricks and dark variant blast res. Should be 6 like regular prismarine --- mods/ITEMS/mcl_ocean/prismarine.lua | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/mods/ITEMS/mcl_ocean/prismarine.lua b/mods/ITEMS/mcl_ocean/prismarine.lua index 71ffb94ce..fff07cb7e 100644 --- a/mods/ITEMS/mcl_ocean/prismarine.lua +++ b/mods/ITEMS/mcl_ocean/prismarine.lua @@ -52,7 +52,7 @@ minetest.register_node("mcl_ocean:prismarine_brick", { tiles = {"mcl_ocean_prismarine_bricks.png"}, groups = {pickaxey=1, building_block=1, material_stone=1}, sounds = mcl_sounds.node_sound_stone_defaults(), - _mcl_blast_resistance = 1.5,--ffffixme + _mcl_blast_resistance = 6, _mcl_hardness = 1.5, }) @@ -64,7 +64,7 @@ minetest.register_node("mcl_ocean:prismarine_dark", { tiles = {"mcl_ocean_prismarine_dark.png"}, groups = {pickaxey=1, building_block=1, material_stone=1}, sounds = mcl_sounds.node_sound_stone_defaults(), - _mcl_blast_resistance = 1.5,--fixmetoo + _mcl_blast_resistance = 6, _mcl_hardness = 1.5, }) From 8099a4bd17811bc2e47439732e1ff5cdaa02a63c Mon Sep 17 00:00:00 2001 From: seventeenthShulker Date: Sun, 17 Sep 2023 16:14:36 +0200 Subject: [PATCH 243/982] Walls use `source` parameter for default hardness and blast resistance If no `source` given, fallbacks are 2 and 6 respectively --- mods/ITEMS/mcl_deepslate/init.lua | 7 +----- mods/ITEMS/mcl_walls/API.md | 6 +++--- mods/ITEMS/mcl_walls/init.lua | 36 ++++++++++++++++++++++--------- mods/ITEMS/mcl_walls/register.lua | 30 +++++++++++++------------- 4 files changed, 45 insertions(+), 34 deletions(-) diff --git a/mods/ITEMS/mcl_deepslate/init.lua b/mods/ITEMS/mcl_deepslate/init.lua index 03f5843e2..b4549159f 100644 --- a/mods/ITEMS/mcl_deepslate/init.lua +++ b/mods/ITEMS/mcl_deepslate/init.lua @@ -221,12 +221,7 @@ local function register_deepslate_variant(item, desc, longdesc) mcl_walls.register_wall( "mcl_deepslate:deepslate"..item.."wall", S(desc.." Wall"), - "mcl_deepslate:deepslate_"..item, - nil, - nil, - nil, - minetest.registered_nodes["mcl_deepslate:deepslate"]._mcl_hardness, - minetest.registered_nodes["mcl_deepslate:deepslate"]._mcl_blast_resistance) + "mcl_deepslate:deepslate_"..item) end end diff --git a/mods/ITEMS/mcl_walls/API.md b/mods/ITEMS/mcl_walls/API.md index bacb343bb..5c21ce98d 100644 --- a/mods/ITEMS/mcl_walls/API.md +++ b/mods/ITEMS/mcl_walls/API.md @@ -2,7 +2,7 @@ This API allows you to add more walls (like the cobblestone wall) to MineClone 2. -## `mcl_walls.register_wall(nodename, description, craft_material, tiles, invtex, groups, hardness, blast_resistance, sounds)` +## `mcl_walls.register_wall(nodename, description, craft_material, tiles, invtex, groups, sounds, hardness, blast_resistance)` Adds a new wall type. This is optimized for stone-based walls, but other materials are theoretically possible, too. @@ -24,9 +24,9 @@ If `craft_material` is not `nil` it also adds a crafting recipe of the following * `tiles`: Wall textures table, same syntax as for `minetest.register_node` (optional if `source` is set) * `inventory_image`: Inventory image (optional if `source` is set) * `groups`: Base group memberships (optional, default is `{pickaxey=1}`) -* `hardness`: Hardness of node (optional, default is 2) -* `blast_resistance`: Blast resistance of node (optional, default is 6 like most stone walls) * `sounds`: Sound table (optional, by default default uses stone sounds) +* `hardness`: Hardness of node (optional, default matches `source` node or fallback value 2) +* `blast_resistance`: Blast resistance of node (optional, default matches `source` node or fallback value 6) The following groups will automatically be added to the nodes (where applicable), you do not need to add them to the `groups` table: diff --git a/mods/ITEMS/mcl_walls/init.lua b/mods/ITEMS/mcl_walls/init.lua index 7b2933c4b..caf8b34fe 100644 --- a/mods/ITEMS/mcl_walls/init.lua +++ b/mods/ITEMS/mcl_walls/init.lua @@ -97,8 +97,10 @@ local full_blocks = { * inventory_image: Inventory image (optional) * groups: Base group memberships (optional, default is {pickaxey=1}) * sounds: Sound table (optional, default is stone) +* hardness: Hardness of node (optional, default matches `source` node or fallback value 2) +* blast_resistance: Blast resistance of node (optional, default matches `source` node or fallback value 6) ]] -function mcl_walls.register_wall(nodename, description, source, tiles, inventory_image, groups, hardness, blast_resistance, sounds) +function mcl_walls.register_wall(nodename, description, source, tiles, inventory_image, groups, sounds, hardness, blast_resistance) local base_groups = groups if not base_groups then @@ -112,15 +114,29 @@ function mcl_walls.register_wall(nodename, description, source, tiles, inventory local main_node_groups = table.copy(base_groups) main_node_groups.deco_block = 1 - -- TODO: Stop hardcoding blast resistance - - if not sounds then - sounds = mcl_sounds.node_sound_stone_defaults() - end - - if (not tiles) and source then - if minetest.registered_nodes[source] then - tiles = minetest.registered_nodes[source].tiles + if source then + -- Default values from `source` node + if not hardness then + hardness = minetest.registered_nodes[source]._mcl_hardness + end + if not blast_resistance then + blast_resistance = minetest.registered_nodes[source]._mcl_blast_resistance + end + if not sounds then + sounds = minetest.registered_nodes[source].sounds + end + if not tiles then + if minetest.registered_nodes[source] then + tiles = minetest.registered_nodes[source].tiles + end + end + else + -- Fallback in case no `source` given + if not hardness then + hardness = 2 + end + if not blast_resistance then + blast_resistance = 6 end end diff --git a/mods/ITEMS/mcl_walls/register.lua b/mods/ITEMS/mcl_walls/register.lua index 6f3b9f1d9..96a1b9b9f 100644 --- a/mods/ITEMS/mcl_walls/register.lua +++ b/mods/ITEMS/mcl_walls/register.lua @@ -1,17 +1,17 @@ local S = minetest.get_translator(minetest.get_current_modname()) -mcl_walls.register_wall("mcl_walls:cobble", S("Cobblestone Wall"), "mcl_core:cobble", {"mcl_walls_cobble_wall_top.png", "default_cobble.png", "mcl_walls_cobble_wall_side.png"}, nil, nil, minetest.registered_nodes["mcl_core:cobble"]._mcl_hardness, minetest.registered_nodes["mcl_core:cobble"]._mcl_blast_resistance) -mcl_walls.register_wall("mcl_walls:mossycobble", S("Mossy Cobblestone Wall"), "mcl_core:mossycobble", {"mcl_walls_cobble_mossy_wall_top.png", "default_mossycobble.png", "mcl_walls_cobble_mossy_wall_side.png"}, nil, nil, minetest.registered_nodes["mcl_core:mossycobble"]._mcl_hardness, minetest.registered_nodes["mcl_core:mossycobble"]._mcl_blast_resistance) -mcl_walls.register_wall("mcl_walls:andesite", S("Andesite Wall"), "mcl_core:andesite", nil, nil, nil, minetest.registered_nodes["mcl_core:andesite"]._mcl_hardness, minetest.registered_nodes["mcl_core:andesite"]._mcl_blast_resistance) -mcl_walls.register_wall("mcl_walls:granite", S("Granite Wall"), "mcl_core:granite", nil, nil, nil, minetest.registered_nodes["mcl_core:granite"]._mcl_hardness, minetest.registered_nodes["mcl_core:granite"]._mcl_blast_resistance) -mcl_walls.register_wall("mcl_walls:diorite", S("Diorite Wall"), "mcl_core:diorite", nil, nil, nil, minetest.registered_nodes["mcl_core:diorite"]._mcl_hardness, minetest.registered_nodes["mcl_core:diorite"]._mcl_blast_resistance) -mcl_walls.register_wall("mcl_walls:brick", S("Brick Wall"), "mcl_core:brick_block", nil, nil, nil, minetest.registered_nodes["mcl_core:brick_block"]._mcl_hardness, minetest.registered_nodes["mcl_core:brick_block"]._mcl_blast_resistance) -mcl_walls.register_wall("mcl_walls:sandstone", S("Sandstone Wall"), "mcl_core:sandstone", nil, nil, nil, minetest.registered_nodes["mcl_core:sandstone"]._mcl_hardness, minetest.registered_nodes["mcl_core:sandstone"]._mcl_blast_resistance) -mcl_walls.register_wall("mcl_walls:redsandstone", S("Red Sandstone Wall"), "mcl_core:redsandstone", nil, nil, nil, minetest.registered_nodes["mcl_core:redsandstone"]._mcl_hardness, minetest.registered_nodes["mcl_core:redsandstone"]._mcl_blast_resistance) -mcl_walls.register_wall("mcl_walls:stonebrick", S("Stone Brick Wall"), "mcl_core:stonebrick", nil, nil, nil, minetest.registered_nodes["mcl_core:stonebrick"]._mcl_hardness, minetest.registered_nodes["mcl_core:stonebrick"]._mcl_blast_resistance) -mcl_walls.register_wall("mcl_walls:stonebrickmossy", S("Mossy Stone Brick Wall"), "mcl_core:stonebrickmossy", nil, nil, nil, minetest.registered_nodes["mcl_core:stonebrickmossy"]._mcl_hardness, minetest.registered_nodes["mcl_core:stonebrickmossy"]._mcl_blast_resistance) -mcl_walls.register_wall("mcl_walls:prismarine", S("Prismarine Wall"), "mcl_ocean:prismarine", nil, nil, nil, minetest.registered_nodes["mcl_ocean:prismarine"]._mcl_hardness, minetest.registered_nodes["mcl_ocean:prismarine"]._mcl_blast_resistance) -mcl_walls.register_wall("mcl_walls:endbricks", S("End Stone Brick Wall"), "mcl_end:end_bricks", nil, nil, nil, minetest.registered_nodes["mcl_end:end_bricks"]._mcl_hardness, minetest.registered_nodes["mcl_end:end_bricks"]._mcl_blast_resistance) -mcl_walls.register_wall("mcl_walls:netherbrick", S("Nether Brick Wall"), "mcl_nether:nether_brick", nil, nil, nil, minetest.registered_nodes["mcl_nether:nether_brick"]._mcl_hardness, minetest.registered_nodes["mcl_nether:nether_brick"]._mcl_blast_resistance) -mcl_walls.register_wall("mcl_walls:rednetherbrick", S("Red Nether Brick Wall"), "mcl_nether:red_nether_brick", nil, nil, nil, minetest.registered_nodes["mcl_nether:red_nether_brick"]._mcl_hardness, minetest.registered_nodes["mcl_nether:red_nether_brick"]._mcl_blast_resistance) -mcl_walls.register_wall("mcl_walls:mudbrick", S("Mud Brick Wall"), "mcl_mud:mud_bricks", nil, nil, nil, minetest.registered_nodes["mcl_mud:mud_bricks"]._mcl_hardness, minetest.registered_nodes["mcl_mud:mud_bricks"]._mcl_blast_resistance) \ No newline at end of file +mcl_walls.register_wall("mcl_walls:cobble", S("Cobblestone Wall"), "mcl_core:cobble", {"mcl_walls_cobble_wall_top.png", "default_cobble.png", "mcl_walls_cobble_wall_side.png"}) +mcl_walls.register_wall("mcl_walls:mossycobble", S("Mossy Cobblestone Wall"), "mcl_core:mossycobble", {"mcl_walls_cobble_mossy_wall_top.png", "default_mossycobble.png", "mcl_walls_cobble_mossy_wall_side.png"}) +mcl_walls.register_wall("mcl_walls:andesite", S("Andesite Wall"), "mcl_core:andesite") +mcl_walls.register_wall("mcl_walls:granite", S("Granite Wall"), "mcl_core:granite") +mcl_walls.register_wall("mcl_walls:diorite", S("Diorite Wall"), "mcl_core:diorite") +mcl_walls.register_wall("mcl_walls:brick", S("Brick Wall"), "mcl_core:brick_block") +mcl_walls.register_wall("mcl_walls:sandstone", S("Sandstone Wall"), "mcl_core:sandstone") +mcl_walls.register_wall("mcl_walls:redsandstone", S("Red Sandstone Wall"), "mcl_core:redsandstone") +mcl_walls.register_wall("mcl_walls:stonebrick", S("Stone Brick Wall"), "mcl_core:stonebrick") +mcl_walls.register_wall("mcl_walls:stonebrickmossy", S("Mossy Stone Brick Wall"), "mcl_core:stonebrickmossy") +mcl_walls.register_wall("mcl_walls:prismarine", S("Prismarine Wall"), "mcl_ocean:prismarine") +mcl_walls.register_wall("mcl_walls:endbricks", S("End Stone Brick Wall"), "mcl_end:end_bricks") +mcl_walls.register_wall("mcl_walls:netherbrick", S("Nether Brick Wall"), "mcl_nether:nether_brick") +mcl_walls.register_wall("mcl_walls:rednetherbrick", S("Red Nether Brick Wall"), "mcl_nether:red_nether_brick") +mcl_walls.register_wall("mcl_walls:mudbrick", S("Mud Brick Wall"), "mcl_mud:mud_bricks") \ No newline at end of file From bc3bde4cf82f9d215133f16cc60ac904107b7bad Mon Sep 17 00:00:00 2001 From: seventeenthShulker Date: Sun, 17 Sep 2023 17:11:35 +0200 Subject: [PATCH 244/982] Forgot about blackstone --- mods/ITEMS/mcl_blackstone/init.lua | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-) diff --git a/mods/ITEMS/mcl_blackstone/init.lua b/mods/ITEMS/mcl_blackstone/init.lua index 6677ba0fe..138e02191 100644 --- a/mods/ITEMS/mcl_blackstone/init.lua +++ b/mods/ITEMS/mcl_blackstone/init.lua @@ -202,12 +202,8 @@ mcl_stairs.register_stair_and_slab_simple("blackstone_brick_polished", "mcl_blac mcl_walls.register_wall( "mcl_blackstone:wall", S("Blackstone Wall"), - "mcl_blackstone:blackstone", - nil, - nil, - nil, - minetest.registered_nodes["mcl_blackstone:blackstone"]._mcl_hardness, - minetest.registered_nodes["mcl_blackstone:blackstone"]._mcl_blast_resistance) + "mcl_blackstone:blackstone" +) --lavacooling From 4fcd1ae541fa6f0a7a2c643ff0776e03d9468784 Mon Sep 17 00:00:00 2001 From: codiac Date: Mon, 23 Oct 2023 05:32:18 +0000 Subject: [PATCH 245/982] Fix slime spawn crash (#3977) Declare global variables before using them! Fixes #3975 Reviewed-on: https://git.minetest.land/MineClone2/MineClone2/pulls/3977 Reviewed-by: the-real-herowl Co-authored-by: codiac Co-committed-by: codiac --- mods/ENTITIES/mobs_mc/slime+magma_cube.lua | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/mods/ENTITIES/mobs_mc/slime+magma_cube.lua b/mods/ENTITIES/mobs_mc/slime+magma_cube.lua index 9cc5191bc..321a9c1ce 100644 --- a/mods/ENTITIES/mobs_mc/slime+magma_cube.lua +++ b/mods/ENTITIES/mobs_mc/slime+magma_cube.lua @@ -161,6 +161,8 @@ local spawn_children_on_die = function(child_mob, spawn_distance, eject_speed) end end +local swamp_light_max = 7 + local function slime_spawn_check(pos, environmental_light, artificial_light, sky_light) local maxlight = swamp_light_max @@ -308,7 +310,6 @@ local cave_min = mcl_vars.mg_overworld_min local cave_max = water_level - 23 local swampy_biomes = {"Swampland", "MangroveSwamp"} -local swamp_light_max = 7 local swamp_min = water_level local swamp_max = water_level + 27 From 5be506830f7fb0b0c435855ae6e7a7bb6aeb3e1a Mon Sep 17 00:00:00 2001 From: chmodsayshello Date: Wed, 25 Oct 2023 17:20:50 +0200 Subject: [PATCH 246/982] make diamond tools upgradeable again --- mods/ITEMS/mcl_smithing_table/init.lua | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/mods/ITEMS/mcl_smithing_table/init.lua b/mods/ITEMS/mcl_smithing_table/init.lua index 1794f8791..996dcf8a9 100755 --- a/mods/ITEMS/mcl_smithing_table/init.lua +++ b/mods/ITEMS/mcl_smithing_table/init.lua @@ -167,16 +167,19 @@ minetest.register_node("mcl_smithing_table:table", { end, allow_metadata_inventory_put = function(pos, listname, index, stack, player) + local stackname = stack:get_name() + local def = stack:get_definition() if listname == "upgrade_item" - and string.find(stack:get_name(),"mcl_armor:") -- allow any armor piece to go in (in case the player wants to trim them) - and not mcl_armor.trims.blacklisted[stack:get_name()] + and def._mcl_armor_element -- allow any armor piece to go in (in case the player wants to trim them) + and not mcl_armor.trims.blacklisted[stackname] + or def._mcl_upgradable -- for diamond tools or listname == "mineral" - and mcl_smithing_table.is_smithing_mineral(stack:get_name()) + and mcl_smithing_table.is_smithing_mineral(stackname) or listname == "template" - and string.find(stack:get_name(),"mcl_armor") + and string.find(stackname, "mcl_armor") then return stack:get_count() end From 35bb569ee131700435628ff6e8d776040d906c31 Mon Sep 17 00:00:00 2001 From: Araca Date: Tue, 31 Oct 2023 10:00:58 +0000 Subject: [PATCH 247/982] make craft guide search use local language (#3984) Fix #3909 It is now possible to search in the crafting guide using both item id ("name", usually related to the English name) and translated item description (containing the displayed in-game name). Co-authored-by: Araca <> Reviewed-on: https://git.minetest.land/MineClone2/MineClone2/pulls/3984 Reviewed-by: the-real-herowl Co-authored-by: Araca Co-committed-by: Araca --- mods/HELP/mcl_craftguide/init.lua | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/mods/HELP/mcl_craftguide/init.lua b/mods/HELP/mcl_craftguide/init.lua index 5e3686047..80df19b90 100644 --- a/mods/HELP/mcl_craftguide/init.lua +++ b/mods/HELP/mcl_craftguide/init.lua @@ -774,7 +774,7 @@ local function search(data) for i = 1, #data.items_raw do local item = data.items_raw[i] local def = reg_items[item] - local desc = lower(def.description) + local desc = string.lower(M.get_translated_string(data.lang_code, def.description)) local search_in = item .. desc local to_add @@ -838,6 +838,7 @@ local function init_data(name) iX = sfinv_only and 8 or DEFAULT_SIZE, items = init_items, items_raw = init_items, + lang_code = M.get_player_information(name).lang_code or 'en', } end From 5e194b33bd612cc1cc088c0aa42e4366ee79ac31 Mon Sep 17 00:00:00 2001 From: SmokeyDope Date: Mon, 11 Sep 2023 18:04:07 +0000 Subject: [PATCH 248/982] Adjust make_grass_path function to let shovels turn grass paths back to dirt with shift+rightclick --- mods/ITEMS/mcl_tools/init.lua | 26 +++++++++++++++++++++++++- 1 file changed, 25 insertions(+), 1 deletion(-) diff --git a/mods/ITEMS/mcl_tools/init.lua b/mods/ITEMS/mcl_tools/init.lua index e60fd11b2..01040477b 100644 --- a/mods/ITEMS/mcl_tools/init.lua +++ b/mods/ITEMS/mcl_tools/init.lua @@ -165,11 +165,35 @@ local make_grass_path = function(itemstack, placer, pointed_thing) end end - -- Only make grass path if tool used on side or top of target node + -- Only make or remove grass path if tool used on side or top of target node if pointed_thing.above.y < pointed_thing.under.y then return itemstack end +-- Remove grass paths + if (minetest.get_item_group(node.name, "path_remove_possible") == 1) and placer:get_player_control().sneak == true then + local above = table.copy(pointed_thing.under) + above.y = above.y + 1 + if minetest.get_node(above).name == "air" then + if minetest.is_protected(pointed_thing.under, placer:get_player_name()) then + minetest.record_protection_violation(pointed_thing.under, placer:get_player_name()) + return itemstack + end + + if not minetest.is_creative_enabled(placer:get_player_name()) then + -- Add wear (as if digging a shovely node) + local toolname = itemstack:get_name() + local wear = mcl_autogroup.get_wear(toolname, "shovely") + if wear then + itemstack:add_wear(wear) + end + end + minetest.sound_play({name="default_grass_footstep", gain=1}, {pos = above, max_hear_distance = 16}, true) + minetest.swap_node(pointed_thing.under, {name="mcl_core:dirt"}) + end + end + +-- Make grass paths if (minetest.get_item_group(node.name, "path_creation_possible") == 1) then local above = table.copy(pointed_thing.under) above.y = above.y + 1 From d2a4a6d042c1837b45bfc0bf91266a7a8b06e707 Mon Sep 17 00:00:00 2001 From: SmokeyDope Date: Mon, 11 Sep 2023 18:07:16 +0000 Subject: [PATCH 249/982] add group 'path_remove_possible' to grass paths --- mods/ITEMS/mcl_core/nodes_base.lua | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mods/ITEMS/mcl_core/nodes_base.lua b/mods/ITEMS/mcl_core/nodes_base.lua index 01de997d5..db2b78641 100644 --- a/mods/ITEMS/mcl_core/nodes_base.lua +++ b/mods/ITEMS/mcl_core/nodes_base.lua @@ -419,7 +419,7 @@ minetest.register_node("mcl_core:grass_path", { {-0.5, -0.5, -0.5, 0.5, 0.4375, 0.5}, } }, - groups = {handy=1,shovely=1, cultivatable=2, dirtifies_below_solid=1, dirtifier=1, deco_block=1 }, + groups = {handy=1,shovely=1, cultivatable=2, dirtifies_below_solid=1, dirtifier=1, deco_block=1, path_remove_possible=1 }, sounds = mcl_sounds.node_sound_dirt_defaults({ footstep = {name="default_grass_footstep", gain=0.1}, }), From fa1d8dfc4749e90a994b93cfadab400b3cc73d18 Mon Sep 17 00:00:00 2001 From: SmokeyDope Date: Mon, 11 Sep 2023 18:10:25 +0000 Subject: [PATCH 250/982] Adjust grass path long description to inform players of new way to turn paths back to dirt. --- mods/ITEMS/mcl_core/nodes_base.lua | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mods/ITEMS/mcl_core/nodes_base.lua b/mods/ITEMS/mcl_core/nodes_base.lua index db2b78641..f36d5cabd 100644 --- a/mods/ITEMS/mcl_core/nodes_base.lua +++ b/mods/ITEMS/mcl_core/nodes_base.lua @@ -406,7 +406,7 @@ mcl_core.register_snowed_node("mcl_core:dirt_with_grass_snow", "mcl_core:dirt_wi minetest.register_node("mcl_core:grass_path", { tiles = {"mcl_core_grass_path_top.png", "default_dirt.png", "mcl_core_grass_path_side.png"}, description = S("Grass Path"), - _doc_items_longdesc = S("Grass paths are a decorative variant of grass blocks. Their top has a different color and they are a bit lower than grass blocks, making them useful to build footpaths. Grass paths can be created with a shovel. A grass path turns into dirt when it is below a solid block."), + _doc_items_longdesc = S("Grass paths are a decorative variant of grass blocks. Their top has a different color and they are a bit lower than grass blocks, making them useful to build footpaths. Grass paths can be created by right clicking with a shovel. A grass path turns into dirt when it is below a solid block or when shift+right clicked with a shovel."), drop = "mcl_core:dirt", is_ground_content = true, use_texture_alpha = minetest.features.use_texture_alpha_string_modes and "opaque" or false, From 5b1deedaf0c7e315096d5ee5fc407550f01f0c78 Mon Sep 17 00:00:00 2001 From: the-real-herowl Date: Thu, 2 Nov 2023 19:59:51 +0100 Subject: [PATCH 251/982] Disabled grass path making when sneaking --- mods/ITEMS/mcl_tools/init.lua | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/mods/ITEMS/mcl_tools/init.lua b/mods/ITEMS/mcl_tools/init.lua index 01040477b..6282da5c3 100644 --- a/mods/ITEMS/mcl_tools/init.lua +++ b/mods/ITEMS/mcl_tools/init.lua @@ -171,7 +171,7 @@ local make_grass_path = function(itemstack, placer, pointed_thing) end -- Remove grass paths - if (minetest.get_item_group(node.name, "path_remove_possible") == 1) and placer:get_player_control().sneak == true then + if (minetest.get_item_group(node.name, "path_remove_possible") == 1) and placer:get_player_control().sneak then local above = table.copy(pointed_thing.under) above.y = above.y + 1 if minetest.get_node(above).name == "air" then @@ -194,7 +194,7 @@ local make_grass_path = function(itemstack, placer, pointed_thing) end -- Make grass paths - if (minetest.get_item_group(node.name, "path_creation_possible") == 1) then + if (minetest.get_item_group(node.name, "path_creation_possible") == 1) and not placer:get_player_control().sneak then local above = table.copy(pointed_thing.under) above.y = above.y + 1 if minetest.get_node(above).name == "air" then From da911bd4d4757670b0a2d9e394fb3e99cc15b05b Mon Sep 17 00:00:00 2001 From: Eliy21 Date: Thu, 2 Nov 2023 19:24:52 +0000 Subject: [PATCH 252/982] Turn non-player boat passenger sideways (#3986) Some low hanging simple boat fixes. Fixes #3259 Reviewed-on: https://git.minetest.land/MineClone2/MineClone2/pulls/3986 Reviewed-by: the-real-herowl Co-authored-by: Eliy21 Co-committed-by: Eliy21 --- mods/ENTITIES/mcl_boats/init.lua | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/mods/ENTITIES/mcl_boats/init.lua b/mods/ENTITIES/mcl_boats/init.lua index fabfae91c..ebe9d23f6 100644 --- a/mods/ENTITIES/mcl_boats/init.lua +++ b/mods/ENTITIES/mcl_boats/init.lua @@ -62,8 +62,13 @@ end local function set_double_attach(boat) boat._driver:set_attach(boat.object, "", {x = 0, y = 0.42, z = 0.8}, {x = 0, y = 0, z = 0}) - boat._passenger:set_attach(boat.object, "", - {x = 0, y = 0.42, z = -2.2}, {x = 0, y = 0, z = 0}) + if boat._passenger:is_player() then + boat._passenger:set_attach(boat.object, "", + {x = 0, y = 0.42, z = -6.2}, {x = 0, y = 0, z = 0}) + else + boat._passenger:set_attach(boat.object, "", + {x = 0, y = 0.42, z = -4.5}, {x = 0, y = 270, z = 0}) + end end local function set_choat_attach(boat) boat._driver:set_attach(boat.object, "", From ce403b92453491bcc4219606f8ee44e324670cd5 Mon Sep 17 00:00:00 2001 From: FossFanatic Date: Thu, 2 Nov 2023 23:47:26 +0000 Subject: [PATCH 253/982] Rename Liquid Textures (#3758) This pull request renames the textures of water and lava to more closely follow the MineClone 2 naming convention. The code has also been changed to now reflect these new names. Reviewed-on: https://git.minetest.land/MineClone2/MineClone2/pulls/3758 Reviewed-by: the-real-herowl Co-authored-by: FossFanatic Co-committed-by: FossFanatic --- mods/ENTITIES/mcl_dripping/README.md | 72 +++++++++--------- mods/ENTITIES/mcl_dripping/init.lua | 4 +- mods/ITEMS/mcl_cauldrons/init.lua | 6 +- mods/ITEMS/mcl_core/nodes_liquid.lua | 24 +++--- mods/ITEMS/mcl_mangrove/init.lua | 8 +- mods/ITEMS/mcl_maps/colors.json | 24 ++---- ...d.png => mcl_core_lava_flow_animation.png} | Bin ...png => mcl_core_lava_source_animation.png} | Bin ....png => mcl_core_water_flow_animation.png} | Bin ...ng => mcl_core_water_source_animation.png} | Bin tools/Conversion_Table.csv | 16 ++-- 11 files changed, 71 insertions(+), 83 deletions(-) rename textures/{default_lava_flowing_animated.png => mcl_core_lava_flow_animation.png} (100%) rename textures/{default_lava_source_animated.png => mcl_core_lava_source_animation.png} (100%) rename textures/{default_water_flowing_animated.png => mcl_core_water_flow_animation.png} (100%) rename textures/{default_water_source_animated.png => mcl_core_water_source_animation.png} (100%) diff --git a/mods/ENTITIES/mcl_dripping/README.md b/mods/ENTITIES/mcl_dripping/README.md index d6ff75ff1..5f4b2854f 100644 --- a/mods/ENTITIES/mcl_dripping/README.md +++ b/mods/ENTITIES/mcl_dripping/README.md @@ -1,36 +1,36 @@ -# mcl_dripping - -Dripping Mod by kddekadenz, modified for MineClone 2 by Wuzzy, NO11 and AFCM - -## Manual - -- drops are generated rarely under solid nodes -- they will stay some time at the generated block and than they fall down -- when they collide with the ground, a sound is played and they are destroyed - -Water and Lava have builtin drops registered. - -## License - -code & sounds: CC0 - -## API - -```lua -mcl_dripping.register_drop({ - -- The group the liquid's nodes belong to - liquid = "water", - -- The texture used (particles will take a random 2x2 area of it) - texture = "default_water_source_animated.png", - -- Define particle glow, ranges from `0` to `minetest.LIGHT_MAX` - light = 1, - -- The nodes (or node group) the particles will spawn under - nodes = { "group:opaque", "group:leaves" }, - -- The sound that will be played then the particle detaches from the roof, see SimpleSoundSpec in lua_api.txt - sound = "drippingwater_drip", - -- The interval for the ABM to run - interval = 60, - -- The chance of the ABM - chance = 10, -}) -``` +# mcl_dripping + +Dripping Mod by kddekadenz, modified for MineClone 2 by Wuzzy, NO11 and AFCM + +## Manual + +- drops are generated rarely under solid nodes +- they will stay some time at the generated block and than they fall down +- when they collide with the ground, a sound is played and they are destroyed + +Water and Lava have builtin drops registered. + +## License + +code & sounds: CC0 + +## API + +```lua +mcl_dripping.register_drop({ + -- The group the liquid's nodes belong to + liquid = "water", + -- The texture used (particles will take a random 2x2 area of it) + texture = "mcl_core_water_source_animation.png", + -- Define particle glow, ranges from `0` to `minetest.LIGHT_MAX` + light = 1, + -- The nodes (or node group) the particles will spawn under + nodes = { "group:opaque", "group:leaves" }, + -- The sound that will be played then the particle detaches from the roof, see SimpleSoundSpec in lua_api.txt + sound = "drippingwater_drip", + -- The interval for the ABM to run + interval = 60, + -- The chance of the ABM + chance = 10, +}) +``` diff --git a/mods/ENTITIES/mcl_dripping/init.lua b/mods/ENTITIES/mcl_dripping/init.lua index b5a5043b7..5a96e65c4 100644 --- a/mods/ENTITIES/mcl_dripping/init.lua +++ b/mods/ENTITIES/mcl_dripping/init.lua @@ -82,7 +82,7 @@ end mcl_dripping.register_drop({ liquid = "water", - texture = "default_water_source_animated.png", + texture = "mcl_core_water_source_animation.png", light = 1, nodes = { "group:opaque", "group:leaves" }, sound = "drippingwater_drip", @@ -92,7 +92,7 @@ mcl_dripping.register_drop({ mcl_dripping.register_drop({ liquid = "lava", - texture = "default_lava_source_animated.png", + texture = "mcl_core_lava_source_animation.png", light = math.max(7, minetest.registered_nodes["mcl_core:lava_source"].light_source - 3), nodes = { "group:opaque" }, sound = "drippingwater_lavadrip", diff --git a/mods/ITEMS/mcl_cauldrons/init.lua b/mods/ITEMS/mcl_cauldrons/init.lua index c84e3bb88..0ba678583 100644 --- a/mods/ITEMS/mcl_cauldrons/init.lua +++ b/mods/ITEMS/mcl_cauldrons/init.lua @@ -67,12 +67,12 @@ local function register_filled_cauldron(water_level, description, liquid) local water_tex if liquid == "river_water" then id = id .. "r" - water_tex = "default_water_source_animated.png^[verticalframe:16:0^[multiply:#0084FF" + water_tex = "mcl_core_water_source_animation.png^[verticalframe:16:0^[multiply:#0084FF" elseif liquid == "lava" then id = id .. "_lava" - water_tex = "default_lava_source_animated.png^[verticalframe:16:0" + water_tex = "mcl_core_lava_source_animation.png^[verticalframe:16:0" else - water_tex = "default_water_source_animated.png^[verticalframe:16:0^[multiply:#3F76E4" + water_tex = "mcl_core_water_source_animation.png^[verticalframe:16:0^[multiply:#3F76E4" end minetest.register_node(id, { description = description, diff --git a/mods/ITEMS/mcl_core/nodes_liquid.lua b/mods/ITEMS/mcl_core/nodes_liquid.lua index e55664432..9a7318af7 100644 --- a/mods/ITEMS/mcl_core/nodes_liquid.lua +++ b/mods/ITEMS/mcl_core/nodes_liquid.lua @@ -18,17 +18,17 @@ end minetest.register_node("mcl_core:water_flowing", { description = S("Flowing Water"), _doc_items_create_entry = false, - wield_image = "default_water_flowing_animated.png^[verticalframe:64:0", + wield_image = "mcl_core_water_flow_animation.png^[verticalframe:64:0", drawtype = "flowingliquid", - tiles = {"default_water_flowing_animated.png^[verticalframe:64:0"}, + tiles = {"mcl_core_water_flow_animation.png^[verticalframe:64:0"}, special_tiles = { { - image="default_water_flowing_animated.png", + image="mcl_core_water_flow_animation.png", backface_culling=false, animation={type="vertical_frames", aspect_w=16, aspect_h=16, length=1.5} }, { - image="default_water_flowing_animated.png", + image="mcl_core_water_flow_animation.png", backface_culling=false, animation={type="vertical_frames", aspect_w=16, aspect_h=16, length=1.5} }, @@ -71,12 +71,12 @@ S("• When water is directly below lava, the water turns into stone."), drawtype = "liquid", waving = 3, tiles = { - {name="default_water_source_animated.png", animation={type="vertical_frames", aspect_w=16, aspect_h=16, length=3.0}} + {name="mcl_core_water_source_animation.png", animation={type="vertical_frames", aspect_w=16, aspect_h=16, length=3.0}} }, special_tiles = { -- New-style water source material (mostly unused) { - name="default_water_source_animated.png", + name="mcl_core_water_source_animation.png", animation={type="vertical_frames", aspect_w=16, aspect_h=16, length=3.0}, backface_culling = false, } @@ -119,17 +119,17 @@ S("• When water is directly below lava, the water turns into stone."), minetest.register_node("mcl_core:lava_flowing", { description = S("Flowing Lava"), _doc_items_create_entry = false, - wield_image = "default_lava_flowing_animated.png^[verticalframe:64:0", + wield_image = "mcl_core_lava_flow_animation.png^[verticalframe:64:0", drawtype = "flowingliquid", - tiles = {"default_lava_flowing_animated.png^[verticalframe:64:0"}, + tiles = {"mcl_core_lava_flow_animation.png^[verticalframe:64:0"}, special_tiles = { { - image="default_lava_flowing_animated.png", + image="mcl_core_lava_flow_animation.png", backface_culling=false, animation={type="vertical_frames", aspect_w=16, aspect_h=16, length=6.6} }, { - image="default_lava_flowing_animated.png", + image="mcl_core_lava_flow_animation.png", backface_culling=false, animation={type="vertical_frames", aspect_w=16, aspect_h=16, length=6.6} }, @@ -182,12 +182,12 @@ S("• When flowing water touches flowing lava either from above or horizontally S("• When lava is directly above water, the water turns into stone."), drawtype = "liquid", tiles = { - {name="default_lava_source_animated.png", animation={type="vertical_frames", aspect_w=16, aspect_h=16, length=3.0}} + {name="mcl_core_lava_source_animation.png", animation={type="vertical_frames", aspect_w=16, aspect_h=16, length=3.0}} }, special_tiles = { -- New-style lava source material (mostly unused) { - name="default_lava_source_animated.png", + name="mcl_core_lava_source_animation.png", animation={type="vertical_frames", aspect_w=16, aspect_h=16, length=3.0}, backface_culling = false, } diff --git a/mods/ITEMS/mcl_mangrove/init.lua b/mods/ITEMS/mcl_mangrove/init.lua index 6e7767541..cf11f36ed 100644 --- a/mods/ITEMS/mcl_mangrove/init.lua +++ b/mods/ITEMS/mcl_mangrove/init.lua @@ -183,7 +183,7 @@ mcl_flowerpots.register_potted_flower("mcl_mangrove:propagule", { image = "mcl_mangrove_propagule.png", }) -local water_tex = "default_water_source_animated.png^[verticalframe:16:0^[multiply:#3F76E4" +local water_tex = "mcl_core_water_source_animation.png^[verticalframe:16:0^[multiply:#3F76E4" local wlroots = { description = S("water logged mangrove roots"), @@ -194,12 +194,12 @@ local wlroots = { S("These cannot be crafted yet only occure when get in contact of water."), _doc_items_hidden = false, tiles = { - {name="default_water_source_animated.png", animation={type="vertical_frames", aspect_w=16, aspect_h=16, length=5.0}} + {name="mcl_core_water_source_animation.png", animation={type="vertical_frames", aspect_w=16, aspect_h=16, length=5.0}} }, special_tiles = { -- New-style water source material (mostly unused) { - name="default_water_source_animated.png", + name="mcl_core_water_source_animation.png", animation={type="vertical_frames", aspect_w=16, aspect_h=16, length=5.0}, backface_culling = false, } @@ -245,7 +245,7 @@ local rwlroots = table.copy(wlroots) -- FIXME luacheck complains that this is a repeated definition of water_tex. -- Maybe the tiles definition below should be replaced with the animated tile -- definition as per above? -water_tex = "default_water_source_animated.png^[verticalframe:16:0^[multiply:#0084FF" +water_tex = "mcl_core_water_source_animation.png^[verticalframe:16:0^[multiply:#0084FF" rwlroots.tiles = { "("..water_tex..")^mcl_mangrove_roots_top.png", "("..water_tex..")^mcl_mangrove_roots_side.png", diff --git a/mods/ITEMS/mcl_maps/colors.json b/mods/ITEMS/mcl_maps/colors.json index 4929a2f66..ae09ab483 100644 --- a/mods/ITEMS/mcl_maps/colors.json +++ b/mods/ITEMS/mcl_maps/colors.json @@ -4664,7 +4664,7 @@ 126, 164 ], - "default_water_source_animated.png": [ + "mcl_core_water_source_animation.png": [ 37, 98, 129 @@ -4984,7 +4984,7 @@ 79, 64 ], - "default_water_flowing_animated.png": [ + "mcl_core_water_flow_animation.png": [ 38, 101, 129 @@ -5009,7 +5009,7 @@ 89, 86 ], - "default_lava_flowing_animated.png": [ + "mcl_core_lava_flow_animation.png": [ 177, 42, 16 @@ -5059,7 +5059,7 @@ 142, 123 ], - "default_lava_source_animated.png": [ + "mcl_core_lava_source_animation.png": [ 180, 45, 17 @@ -6604,16 +6604,6 @@ 56, 64 ], - "default_river_water_flowing_animated.png": [ - 38, - 123, - 130 - ], - "default_river_water_source_animated.png": [ - 37, - 120, - 130 - ], "mcl_armor_stand_item.png": [ 134, 114, @@ -9009,17 +8999,17 @@ 127, 113 ], - "bucket_river_water.png": [ + "mcl_buckets_river_water_bucket.png": [ 139, 152, 155 ], - "bucket_water.png": [ + "mcl_buckets_water_bucket.png": [ 139, 147, 155 ], - "bucket.png": [ + "mcl_buckets_bucket.png": [ 147, 143, 139 diff --git a/textures/default_lava_flowing_animated.png b/textures/mcl_core_lava_flow_animation.png similarity index 100% rename from textures/default_lava_flowing_animated.png rename to textures/mcl_core_lava_flow_animation.png diff --git a/textures/default_lava_source_animated.png b/textures/mcl_core_lava_source_animation.png similarity index 100% rename from textures/default_lava_source_animated.png rename to textures/mcl_core_lava_source_animation.png diff --git a/textures/default_water_flowing_animated.png b/textures/mcl_core_water_flow_animation.png similarity index 100% rename from textures/default_water_flowing_animated.png rename to textures/mcl_core_water_flow_animation.png diff --git a/textures/default_water_source_animated.png b/textures/mcl_core_water_source_animation.png similarity index 100% rename from textures/default_water_source_animated.png rename to textures/mcl_core_water_source_animation.png diff --git a/tools/Conversion_Table.csv b/tools/Conversion_Table.csv index 9dc50dc7a..72e8ac433 100644 --- a/tools/Conversion_Table.csv +++ b/tools/Conversion_Table.csv @@ -7,9 +7,9 @@ Source path,Source file,Target path,Target file,xs,ys,xl,yl,xt,yt,Blacklisted? /assets/minecraft/textures/gui,icons.png,/mods/HUD/hudbars/textures,hudbars_icon_breath.png,16,18,9,9,0,0,y /assets/minecraft/textures/gui,icons.png,/mods/HUD/mcl_base_textures/textures,heart.png,52,0,9,9,0,0,y /assets/minecraft/textures/gui,icons.png,/mods/HUD/mcl_base_textures/textures,bubble.png,16,18,9,9,0,0,y -/assets/minecraft/textures/items,bucket_empty.png,/mods/ITEMS/mcl_buckets/textures,bucket.png,,,,,,, -/assets/minecraft/textures/items,bucket_water.png,/mods/ITEMS/mcl_buckets/textures,bucket_water.png,,,,,,, -/assets/minecraft/textures/items,bucket_water.png,/mods/ITEMS/mcl_buckets/textures,bucket_river_water.png,,,,,,, +/assets/minecraft/textures/items,bucket_empty.png,/mods/ITEMS/mcl_buckets/textures,mcl_buckets_bucket.png,,,,,,, +/assets/minecraft/textures/items,bucket_water.png,/mods/ITEMS/mcl_buckets/textures,mcl_buckets_water_bucket.png,,,,,,, +/assets/minecraft/textures/items,bucket_water.png,/mods/ITEMS/mcl_buckets/textures,mcl_buckets_river_water_bucket.png,,,,,,, /assets/minecraft/textures/items,bucket_lava.png,/mods/ITEMS/mcl_buckets/textures,mcl_buckets_lava_bucket.png,,,,,,, /assets/minecraft/textures/items,item_frame.png,/mods/ITEMS/mcl_itemframes/textures,mcl_itemframes_item_frame.png,,,,,,, /assets/minecraft/textures/blocks,anvil_base.png,/mods/ITEMS/mcl_anvils/textures,mcl_anvils_anvil_base.png,,,,,,, @@ -171,8 +171,8 @@ Source path,Source file,Target path,Target file,xs,ys,xl,yl,xt,yt,Blacklisted? /assets/minecraft/textures/blocks,log_jungle_top.png,/mods/ITEMS/mcl_core/textures,default_jungletree_top.png,,,,,,, /assets/minecraft/textures/blocks,planks_jungle.png,/mods/ITEMS/mcl_core/textures,default_junglewood.png,,,,,,, /assets/minecraft/textures/blocks,ladder.png,/mods/ITEMS/mcl_core/textures,default_ladder.png,,,,,,, -/assets/minecraft/textures/blocks,lava_still.png,/mods/ITEMS/mcl_core/textures,default_lava_source_animated.png,,,,,,, -/assets/minecraft/textures/blocks,lava_flow.png,/mods/ITEMS/mcl_core/textures,default_lava_flowing_animated.png,,,,,,, +/assets/minecraft/textures/blocks,lava_still.png,/mods/ITEMS/mcl_core/textures,mcl_core_lava_source_animation.png,,,,,,, +/assets/minecraft/textures/blocks,lava_flow.png,/mods/ITEMS/mcl_core/textures,mcl_core_lava_flow_animation.png,,,,,,, /assets/minecraft/textures/blocks,cobblestone_mossy.png,/mods/ITEMS/mcl_core/textures,default_mossycobble.png,,,,,,, /assets/minecraft/textures/blocks,obsidian.png,/mods/ITEMS/mcl_core/textures,default_obsidian.png,,,,,,, /assets/minecraft/textures/items,paper.png,/mods/ITEMS/mcl_core/textures,default_paper.png,,,,,,, @@ -187,10 +187,8 @@ Source path,Source file,Target path,Target file,xs,ys,xl,yl,xt,yt,Blacklisted? /assets/minecraft/textures/blocks,stone.png,/mods/ITEMS/mcl_core/textures,default_stone.png,,,,,,, /assets/minecraft/textures/blocks,log_oak.png,/mods/ITEMS/mcl_core/textures,default_tree.png,,,,,,, /assets/minecraft/textures/blocks,log_oak_top.png,/mods/ITEMS/mcl_core/textures,default_tree_top.png,,,,,,, -/assets/minecraft/textures/blocks,water_still.png,/mods/ITEMS/mcl_core/textures,default_water_source_animated.png,,,,,,, -/assets/minecraft/textures/blocks,water_flow.png,/mods/ITEMS/mcl_core/textures,default_water_flowing_animated.png,,,,,,, -/assets/minecraft/textures/blocks,water_still.png,/mods/ITEMS/mcl_core/textures,default_river_water_source_animated.png,,,,,,, -/assets/minecraft/textures/blocks,water_flow.png,/mods/ITEMS/mcl_core/textures,default_river_water_flowing_animated.png,,,,,,, +/assets/minecraft/textures/blocks,water_still.png,/mods/ITEMS/mcl_core/textures,mcl_core_water_source_animation.png,,,,,,, +/assets/minecraft/textures/blocks,water_flow.png,/mods/ITEMS/mcl_core/textures,mcl_core_water_flow_animation.png,,,,,,, /assets/minecraft/textures/blocks,planks_oak.png,/mods/ITEMS/mcl_core/textures,default_wood.png,,,,,,, /assets/minecraft/textures/blocks,stone_andesite.png,/mods/ITEMS/mcl_core/textures,mcl_core_andesite.png,,,,,,, /assets/minecraft/textures/blocks,stone_andesite_smooth.png,/mods/ITEMS/mcl_core/textures,mcl_core_andesite_smooth.png,,,,,,, From 83d6e2a5d2d481647ecc3502167abdda8ede0420 Mon Sep 17 00:00:00 2001 From: Freeman Date: Fri, 3 Nov 2023 00:06:06 +0000 Subject: [PATCH 254/982] polar bear fix typo (#3846) horrizonatal -> horizontal Reviewed-on: https://git.minetest.land/MineClone2/MineClone2/pulls/3846 Reviewed-by: the-real-herowl Co-authored-by: Freeman Co-committed-by: Freeman --- mods/ENTITIES/mcl_mobs/effects.lua | 2 +- mods/ENTITIES/mcl_mobs/init.lua | 2 +- mods/ENTITIES/mobs_mc/axolotl.lua | 2 +- mods/ENTITIES/mobs_mc/chicken.lua | 2 +- mods/ENTITIES/mobs_mc/cow+mooshroom.lua | 2 +- mods/ENTITIES/mobs_mc/llama.lua | 2 +- mods/ENTITIES/mobs_mc/ocelot.lua | 2 +- mods/ENTITIES/mobs_mc/parrot.lua | 2 +- mods/ENTITIES/mobs_mc/pig.lua | 2 +- mods/ENTITIES/mobs_mc/polar_bear.lua | 2 +- mods/ENTITIES/mobs_mc/rabbit.lua | 2 +- mods/ENTITIES/mobs_mc/sheep.lua | 2 +- mods/ENTITIES/mobs_mc/wolf.lua | 2 +- 13 files changed, 13 insertions(+), 13 deletions(-) diff --git a/mods/ENTITIES/mcl_mobs/effects.lua b/mods/ENTITIES/mcl_mobs/effects.lua index f889f8e99..e746fef39 100644 --- a/mods/ENTITIES/mcl_mobs/effects.lua +++ b/mods/ENTITIES/mcl_mobs/effects.lua @@ -410,7 +410,7 @@ function mob_class:check_head_swivel(dtime) --final_rotation = vector.new(0,0,0) end - mcl_util.set_bone_position(self.object,self.head_swivel, vector.new(0,self.bone_eye_height,self.horrizonatal_head_height), final_rotation) + mcl_util.set_bone_position(self.object,self.head_swivel, vector.new(0,self.bone_eye_height,self.horizontal_head_height), final_rotation) end diff --git a/mods/ENTITIES/mcl_mobs/init.lua b/mods/ENTITIES/mcl_mobs/init.lua index 908bc6201..843315039 100644 --- a/mods/ENTITIES/mcl_mobs/init.lua +++ b/mods/ENTITIES/mcl_mobs/init.lua @@ -147,7 +147,7 @@ function mcl_mobs.register_mob(name, def) head_eye_height = def.head_eye_height or def.bone_eye_height or 0, -- how hight aproximatly the mobs head is fromm the ground to tell the mob how high to look up at the player curiosity = def.curiosity or 1, -- how often mob will look at player on idle head_yaw = def.head_yaw or "y", -- axis to rotate head on - horrizonatal_head_height = def.horrizonatal_head_height or 0, + horizontal_head_height = def.horizontal_head_height or 0, wears_armor = def.wears_armor, -- a number value used to index texture slot for armor stepheight = def.stepheight or 0.6, name = name, diff --git a/mods/ENTITIES/mobs_mc/axolotl.lua b/mods/ENTITIES/mobs_mc/axolotl.lua index 187e899cf..563db8bf7 100644 --- a/mods/ENTITIES/mobs_mc/axolotl.lua +++ b/mods/ENTITIES/mobs_mc/axolotl.lua @@ -13,7 +13,7 @@ local axolotl = { head_swivel = "head.control", bone_eye_height = -1, head_eye_height = -0.5, - horrizonatal_head_height = 0, + horizontal_head_height = 0, curiosity = 10, head_yaw="z", diff --git a/mods/ENTITIES/mobs_mc/chicken.lua b/mods/ENTITIES/mobs_mc/chicken.lua index ca942d355..5702db4c7 100644 --- a/mods/ENTITIES/mobs_mc/chicken.lua +++ b/mods/ENTITIES/mobs_mc/chicken.lua @@ -23,7 +23,7 @@ mcl_mobs.register_mob("mobs_mc:chicken", { head_swivel = "head.control", bone_eye_height = 4, head_eye_height = 1.5, - horrizonatal_head_height = -.3, + horizontal_head_height = -.3, curiosity = 10, head_yaw="z", visual_size = {x=1,y=1}, diff --git a/mods/ENTITIES/mobs_mc/cow+mooshroom.lua b/mods/ENTITIES/mobs_mc/cow+mooshroom.lua index 9d1aa1aaa..86b94eea3 100644 --- a/mods/ENTITIES/mobs_mc/cow+mooshroom.lua +++ b/mods/ENTITIES/mobs_mc/cow+mooshroom.lua @@ -24,7 +24,7 @@ local cow_def = { head_swivel = "head.control", bone_eye_height = 10, head_eye_height = 1.1, - horrizonatal_head_height=-1.8, + horizontal_head_height=-1.8, curiosity = 2, head_yaw="z", makes_footstep_sound = true, diff --git a/mods/ENTITIES/mobs_mc/llama.lua b/mods/ENTITIES/mobs_mc/llama.lua index 32bfc97ea..578e7c88a 100644 --- a/mods/ENTITIES/mobs_mc/llama.lua +++ b/mods/ENTITIES/mobs_mc/llama.lua @@ -62,7 +62,7 @@ mcl_mobs.register_mob("mobs_mc:llama", { head_swivel = "head.control", bone_eye_height = 11, head_eye_height = 3, - horrizonatal_head_height=0, + horizontal_head_height=0, curiosity = 60, head_yaw = "z", diff --git a/mods/ENTITIES/mobs_mc/ocelot.lua b/mods/ENTITIES/mobs_mc/ocelot.lua index 65181a581..7aadda492 100644 --- a/mods/ENTITIES/mobs_mc/ocelot.lua +++ b/mods/ENTITIES/mobs_mc/ocelot.lua @@ -39,7 +39,7 @@ local ocelot = { head_swivel = "head.control", bone_eye_height = 6.2, head_eye_height = 0.4, - horrizonatal_head_height=-0, + horizontal_head_height=-0, head_yaw="z", curiosity = 4, collisionbox = {-0.3, -0.01, -0.3, 0.3, 0.69, 0.3}, diff --git a/mods/ENTITIES/mobs_mc/parrot.lua b/mods/ENTITIES/mobs_mc/parrot.lua index ed2892aca..7d4c50f1c 100644 --- a/mods/ENTITIES/mobs_mc/parrot.lua +++ b/mods/ENTITIES/mobs_mc/parrot.lua @@ -137,7 +137,7 @@ mcl_mobs.register_mob("mobs_mc:parrot", { xp_max = 3, head_swivel = "head.control", bone_eye_height = 1.1, - horrizonatal_head_height=0, + horizontal_head_height=0, curiosity = 10, collisionbox = {-0.25, -0.01, -0.25, 0.25, 0.89, 0.25}, visual = "mesh", diff --git a/mods/ENTITIES/mobs_mc/pig.lua b/mods/ENTITIES/mobs_mc/pig.lua index 9084c5d4d..7b1f4e879 100644 --- a/mods/ENTITIES/mobs_mc/pig.lua +++ b/mods/ENTITIES/mobs_mc/pig.lua @@ -22,7 +22,7 @@ mcl_mobs.register_mob("mobs_mc:pig", { head_swivel = "head.control", bone_eye_height = 7.5, head_eye_height = 0.8, - horrizonatal_head_height=-1, + horizontal_head_height=-1, curiosity = 3, head_yaw="z", makes_footstep_sound = true, diff --git a/mods/ENTITIES/mobs_mc/polar_bear.lua b/mods/ENTITIES/mobs_mc/polar_bear.lua index d6667a256..18d6f3a13 100644 --- a/mods/ENTITIES/mobs_mc/polar_bear.lua +++ b/mods/ENTITIES/mobs_mc/polar_bear.lua @@ -27,7 +27,7 @@ mcl_mobs.register_mob("mobs_mc:polar_bear", { head_swivel = "head.control", bone_eye_height = 2.6, head_eye_height = 1, - horrizonatal_head_height = 0, + horizontal_head_height = 0, curiosity = 20, head_yaw="z", visual_size = {x=3.0, y=3.0}, diff --git a/mods/ENTITIES/mobs_mc/rabbit.lua b/mods/ENTITIES/mobs_mc/rabbit.lua index 6c4317519..38fae935f 100644 --- a/mods/ENTITIES/mobs_mc/rabbit.lua +++ b/mods/ENTITIES/mobs_mc/rabbit.lua @@ -18,7 +18,7 @@ local rabbit = { head_swivel = "head.control", bone_eye_height = 2, head_eye_height = 0.5, - horrizonatal_head_height = -.3, + horizontal_head_height = -.3, curiosity = 20, head_yaw="z", visual = "mesh", diff --git a/mods/ENTITIES/mobs_mc/sheep.lua b/mods/ENTITIES/mobs_mc/sheep.lua index af1222403..4a5e924d8 100644 --- a/mods/ENTITIES/mobs_mc/sheep.lua +++ b/mods/ENTITIES/mobs_mc/sheep.lua @@ -67,7 +67,7 @@ mcl_mobs.register_mob("mobs_mc:sheep", { head_swivel = "head.control", bone_eye_height = 3.3, head_eye_height = 1.1, - horrizonatal_head_height=-.7, + horizontal_head_height=-.7, curiosity = 6, head_yaw="z", visual = "mesh", diff --git a/mods/ENTITIES/mobs_mc/wolf.lua b/mods/ENTITIES/mobs_mc/wolf.lua index 7b142086d..c52b5b1a3 100644 --- a/mods/ENTITIES/mobs_mc/wolf.lua +++ b/mods/ENTITIES/mobs_mc/wolf.lua @@ -29,7 +29,7 @@ local wolf = { head_swivel = "head.control", bone_eye_height = 3.5, head_eye_height = 1.1, - horrizonatal_head_height=0, + horizontal_head_height=0, curiosity = 3, head_yaw="z", sounds = { From a425d359f5cd2a4d6f7666f746923d1030dc938e Mon Sep 17 00:00:00 2001 From: Michieal Date: Fri, 3 Nov 2023 21:46:00 +0000 Subject: [PATCH 255/982] WaterLoggedRootsKelpFix (#3994) Fixes #3990 A very simple fix to Kelp and the current water logged nodes. It adds the group "waterlogged" to water logged items and then puts a check for the group in kelp growth. Made it as a group, because eventually there will be other waterlogged nodes. Reviewed-on: https://git.minetest.land/MineClone2/MineClone2/pulls/3994 Reviewed-by: the-real-herowl Co-authored-by: Michieal Co-committed-by: Michieal --- mods/ITEMS/mcl_mangrove/init.lua | 2 +- mods/ITEMS/mcl_ocean/kelp.lua | 3 ++- mods/ITEMS/mcl_sponges/init.lua | 4 ++-- 3 files changed, 5 insertions(+), 4 deletions(-) diff --git a/mods/ITEMS/mcl_mangrove/init.lua b/mods/ITEMS/mcl_mangrove/init.lua index cf11f36ed..932e7851d 100644 --- a/mods/ITEMS/mcl_mangrove/init.lua +++ b/mods/ITEMS/mcl_mangrove/init.lua @@ -221,7 +221,7 @@ local wlroots = { liquids_pointable = true, drop = "mcl_mangrove:mangrove_roots", groups = { - handy = 1, hoey = 1, water=3, liquid=3, puts_out_fire=1, dig_by_piston = 1, deco_block = 1, not_in_creative_inventory=1 }, + handy = 1, hoey = 1, water=3, liquid=3, puts_out_fire=1, dig_by_piston = 1, deco_block = 1, waterlogged = 1, not_in_creative_inventory=1 }, _mcl_blast_resistance = 100, _mcl_hardness = -1, -- Hardness intentionally set to infinite instead of 100 (Minecraft value) to avoid problems in creative mode on_construct = function(pos) diff --git a/mods/ITEMS/mcl_ocean/kelp.lua b/mods/ITEMS/mcl_ocean/kelp.lua index 1084dfa77..530d96093 100644 --- a/mods/ITEMS/mcl_ocean/kelp.lua +++ b/mods/ITEMS/mcl_ocean/kelp.lua @@ -267,7 +267,8 @@ function kelp.next_height(pos, node, pos_tip, node_tip, submerged, downward_flow -- Flowing liquid: Grow 1 step, but also turn the tip node into a liquid source. if downward_flowing then local alt_liq = mt_registered_nodes[node_tip.name].liquid_alternative_source - if alt_liq then + local alt_liq_accessible = mt_get_item_group(node_tip.name,"waterlogged") -- returns 0 if it isn't waterlogged. + if alt_liq and not alt_liq_accessible then mt_set_node(pos_tip, {name=alt_liq}) end end diff --git a/mods/ITEMS/mcl_sponges/init.lua b/mods/ITEMS/mcl_sponges/init.lua index e9755479b..87f40e3ae 100644 --- a/mods/ITEMS/mcl_sponges/init.lua +++ b/mods/ITEMS/mcl_sponges/init.lua @@ -155,7 +155,7 @@ minetest.register_node("mcl_sponges:sponge_wet", { buildable_to = false, stack_max = 64, sounds = mcl_sounds.node_sound_dirt_defaults(), - groups = {handy=1, hoey=1, building_block=1}, + groups = {handy=1, hoey=1, waterlogged = 1, building_block=1}, on_place = place_wet_sponge, _mcl_blast_resistance = 0.6, _mcl_hardness = 0.6, @@ -175,7 +175,7 @@ if minetest.get_modpath("mclx_core") then buildable_to = false, stack_max = 64, sounds = mcl_sounds.node_sound_dirt_defaults(), - groups = {handy=1, building_block=1}, + groups = {handy=1, waterlogged = 1, building_block=1}, on_place = place_wet_sponge, _mcl_blast_resistance = 0.6, _mcl_hardness = 0.6, From 69dc013799cf2d72b7872fee4ac0d2287f90a612 Mon Sep 17 00:00:00 2001 From: Eliy21 Date: Fri, 3 Nov 2023 22:09:49 +0000 Subject: [PATCH 256/982] Prevent multiple chestboat drivers (#3992) Fixes #3872 Reviewed-on: https://git.minetest.land/MineClone2/MineClone2/pulls/3992 Reviewed-by: the-real-herowl Co-authored-by: Eliy21 Co-committed-by: Eliy21 --- mods/ENTITIES/mcl_boats/init.lua | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mods/ENTITIES/mcl_boats/init.lua b/mods/ENTITIES/mcl_boats/init.lua index ebe9d23f6..3ceef80ea 100644 --- a/mods/ENTITIES/mcl_boats/init.lua +++ b/mods/ENTITIES/mcl_boats/init.lua @@ -160,7 +160,7 @@ local boat = { minetest.register_on_respawnplayer(detach_object) function boat.on_rightclick(self, clicker) - if self._passenger or not clicker or clicker:get_attach() then + if self._passenger or not clicker or clicker:get_attach() or (self.name == "mcl_boats:chest_boat" and self._driver) then return end attach_object(self, clicker) From 262100be24d5a63f98fe3ad4f6d1fbf9629d191e Mon Sep 17 00:00:00 2001 From: the-real-herowl Date: Fri, 3 Nov 2023 22:39:21 +0000 Subject: [PATCH 257/982] Fixed stew/bowl duplication bug (#3995) Fixed #3991, copied some code over from mcl_potions Reviewed-on: https://git.minetest.land/MineClone2/MineClone2/pulls/3995 Co-authored-by: the-real-herowl Co-committed-by: the-real-herowl --- mods/ITEMS/mcl_sus_stew/init.lua | 22 ++++++++++++++++++---- 1 file changed, 18 insertions(+), 4 deletions(-) diff --git a/mods/ITEMS/mcl_sus_stew/init.lua b/mods/ITEMS/mcl_sus_stew/init.lua index d3e03ae48..01c8d2d55 100644 --- a/mods/ITEMS/mcl_sus_stew/init.lua +++ b/mods/ITEMS/mcl_sus_stew/init.lua @@ -1,7 +1,7 @@ local S = minetest.get_translator(minetest.get_current_modname()) -- ____________________________ ---_________________________________________/ Variables & Functions \_________ +--_________________________________________/ Variables & Functions \_________ local eat = minetest.item_eat(6, "mcl_core:bowl") --6 hunger points, player receives mcl_core:bowl after eating @@ -12,7 +12,7 @@ local flower_effect = { [ "mcl_flowers:dandelion" ] = "hunger", [ "mcl_flowers:cornflower" ] = "jump", [ "mcl_flowers:oxeye_daisy" ] = "regeneration", - [ "mcl_flowers:poppy" ] = "night_vision" + [ "mcl_flowers:poppy" ] = "night_vision" } local effects = { @@ -53,13 +53,27 @@ local function get_random_effect() return effects[keys[math.random(#keys)]] end -local function eat_stew(itemstack, placer, pointed_thing) +local function eat_stew(itemstack, user, pointed_thing) + if pointed_thing.type == "node" then + if user and not user:get_player_control().sneak then + -- Use pointed node's on_rightclick function first, if present + local node = minetest.get_node(pointed_thing.under) + if user and not user:get_player_control().sneak then + if minetest.registered_nodes[node.name] and minetest.registered_nodes[node.name].on_rightclick then + return minetest.registered_nodes[node.name].on_rightclick(pointed_thing.under, node, user, itemstack) or itemstack + end + end + end + elseif pointed_thing.type == "object" then + return itemstack + end + local e = itemstack:get_meta():get_string("effect") local f = effects[e] if not f then f = get_random_effect() end - if f(itemstack,placer,pointed_thing) then + if f(itemstack, user, pointed_thing) then return "mcl_core:bowl" end end From f2eca64e42364bc6f597d1fd552352e4818501cf Mon Sep 17 00:00:00 2001 From: seventeenthShulker Date: Sun, 18 Jun 2023 20:59:37 +0200 Subject: [PATCH 258/982] Blocks with dig_by_piston no longer fill up the push limit Fix for broken nodes (e.g. sugar cane) not updating and leaving floating bits Short-term fix for minetest.dig_node not always working (checking for group dig_immediate = 3) --- mods/ITEMS/REDSTONE/mesecons_mvps/init.lua | 61 +++++++++++++++------- 1 file changed, 42 insertions(+), 19 deletions(-) diff --git a/mods/ITEMS/REDSTONE/mesecons_mvps/init.lua b/mods/ITEMS/REDSTONE/mesecons_mvps/init.lua index 58e5afd92..d85943e45 100644 --- a/mods/ITEMS/REDSTONE/mesecons_mvps/init.lua +++ b/mods/ITEMS/REDSTONE/mesecons_mvps/init.lua @@ -117,7 +117,7 @@ local function is_available(pos) return false, n end if minetest.registered_nodes[name] then - return minetest.registered_nodes[name].buildable_to, n or false, n + return minetest.registered_nodes[name].buildable_to or minetest.get_item_group(name, "dig_by_piston") == 1, n or false, n end return false, n end @@ -126,6 +126,7 @@ end function mesecon.mvps_get_stack(pos, dir, maximum, piston_pos) -- determine the number of nodes to be pushed local nodes = {} + local dig_nodes = {} local frontiers = {pos} while #frontiers > 0 do @@ -141,8 +142,13 @@ function mesecon.mvps_get_stack(pos, dir, maximum, piston_pos) end if not node_replaceable(nn.name) then - if #nodes >= maximum then return nil, false end - table.insert(nodes, {node = nn, pos = {x=np.x, y=np.y, z=np.z}}) + if minetest.get_item_group(nn.name, "dig_by_piston") == 1 then + -- if we want the node to drop, e.g. sugar cane, do not count towards push limit + table.insert(dig_nodes, {node = nn, pos = {x=np.x, y=np.y, z=np.z}}) + else + table.insert(nodes, {node = nn, pos = {x=np.x, y=np.y, z=np.z}}) + if #nodes > maximum then return nil, nil, false, true end + end -- add connected nodes to frontiers, connected is a vector list -- the vectors must be absolute positions @@ -152,10 +158,9 @@ function mesecon.mvps_get_stack(pos, dir, maximum, piston_pos) and minetest.registered_nodes[nn.name].mvps_sticky then connected, has_loop = minetest.registered_nodes[nn.name].mvps_sticky(np, nn, piston_pos) if has_loop then - return {}, true + return {}, {}, true, false end end - table.insert(connected, vector.add(np, dir)) -- Make sure there are no duplicates in frontiers / nodes before @@ -172,7 +177,7 @@ function mesecon.mvps_get_stack(pos, dir, maximum, piston_pos) duplicate = true end end - if not duplicate and not mesecon.is_mvps_stopper(minetest.get_node(cp)) then + if not duplicate and not mesecon.is_mvps_stopper(minetest.get_node(cp)) and minetest.get_item_group(nn.name, "dig_by_piston") == 0 then table.insert(frontiers, cp) end end @@ -180,7 +185,7 @@ function mesecon.mvps_get_stack(pos, dir, maximum, piston_pos) table.remove(frontiers, 1) end - return nodes, false + return nodes, dig_nodes, false, false end function mesecon.mvps_set_owner(pos, placer) @@ -222,14 +227,14 @@ end -- movedir: direction of actual movement -- maximum: maximum nodes to be pushed function mesecon.mvps_push_or_pull(pos, stackdir, movedir, maximum, player_name, piston_pos) - local nodes, has_loop = mesecon.mvps_get_stack(pos, movedir, maximum, piston_pos) + local nodes, dig_nodes, has_loop, too_many = mesecon.mvps_get_stack(pos, movedir, maximum, piston_pos) - if has_loop then + if has_loop or too_many then return false end if not nodes then return end - + local newpos={} -- check node availability to push/pull into, and fill newpos[i] for i in ipairs(nodes) do @@ -253,18 +258,36 @@ function mesecon.mvps_push_or_pull(pos, stackdir, movedir, maximum, player_name, end end - if are_protected(nodes, player_name) then + local all_nodes = nodes + if dig_nodes and #dig_nodes > 0 then all_nodes = mesecon.mergetable(dig_nodes, nodes) end + if are_protected(all_nodes, player_name) then return end local first_dropper = nil -- remove all nodes - for id, n in ipairs(nodes) do + for id, n in ipairs(all_nodes) do n.meta = minetest.get_meta(n.pos):to_table() - local is_dropper = mesecon.is_mvps_dropper(n.node, movedir, nodes, id) + local is_dropper = mesecon.is_mvps_dropper(n.node, movedir, all_nodes, id) if is_dropper then - --local drops = minetest.get_node_drops(n.node.name, "") - minetest.dig_node(n.pos) + -- minetest.dig_node has been shown to be buggy (https://git.minetest.land/MineClone2/MineClone2/issues/3547) + if minetest.get_item_group(n.node.name, "dig_immediate") == 3 then + -- should dig as normal + minetest.dig_node(n.pos) + else + -- simulate dig_node because nothing drops otherwise + local drops = minetest.get_node_drops(n.node.name, "") + minetest.remove_node(n.pos) + for _, callback in pairs(minetest.registered_on_dignodes) do + callback(n.pos, n) + end + for _, item in ipairs(drops) do + if type(item) ~= "string" then + item = item:get_name() .. item:get_count() + end + minetest.add_item(n.pos, item) + end + end else minetest.remove_node(n.pos) local node_timer = minetest.get_node_timer(n.pos) @@ -273,13 +296,13 @@ function mesecon.mvps_push_or_pull(pos, stackdir, movedir, maximum, player_name, end end if is_dropper then - first_dropper = id - break + -- get id of the first dropper, but we still let everything else drop, so don't break here + if not first_dropper then first_dropper = id end end end -- update mesecons for removed nodes ( has to be done after all nodes have been removed ) - for id, n in ipairs(nodes) do + for id, n in ipairs(all_nodes) do if first_dropper and id >= first_dropper then break end @@ -287,7 +310,7 @@ function mesecon.mvps_push_or_pull(pos, stackdir, movedir, maximum, player_name, end -- add nodes - for id, n in ipairs(nodes) do + for id, n in ipairs(all_nodes) do if first_dropper and id >= first_dropper then break end From af206ed8b33ed4bb34b04ae9b0c264255b339d74 Mon Sep 17 00:00:00 2001 From: seventeenthShulker Date: Sun, 18 Jun 2023 21:14:43 +0200 Subject: [PATCH 259/982] All bamboo plant tiles can be broken with pistons --- mods/ITEMS/mcl_bamboo/bamboo_base.lua | 8 ++++---- mods/ITEMS/mcl_bamboo/globals.lua | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/mods/ITEMS/mcl_bamboo/bamboo_base.lua b/mods/ITEMS/mcl_bamboo/bamboo_base.lua index 1c7e99a61..0cbea4361 100644 --- a/mods/ITEMS/mcl_bamboo/bamboo_base.lua +++ b/mods/ITEMS/mcl_bamboo/bamboo_base.lua @@ -251,7 +251,7 @@ local bamboo_def = { minetest.register_node(BAMBOO, bamboo_def) local bamboo_top = table.copy(bamboo_def) -bamboo_top.groups = {not_in_creative_inventory = 1, handy = 1, axey = 1, choppy = 1, flammable = 3} +bamboo_top.groups = {not_in_creative_inventory = 1, handy = 1, axey = 1, choppy = 1, dig_by_piston = 1, plant = 1, non_mycelium_plant = 1, flammable = 3} bamboo_top.tiles = {"mcl_bamboo_endcap.png"} bamboo_top.drawtype = "plantlike_rooted" --"plantlike" --bamboo_top.paramtype2 = "meshoptions" @@ -361,7 +361,7 @@ bamboo_one_def.selection_box = { {-0.05, -0.5, 0.285, -0.275, 0.5, 0.06}, } } -bamboo_one_def.groups = {not_in_creative_inventory = 1, handy = 1, axey = 1, choppy = 1, flammable = 3} +bamboo_one_def.groups = {not_in_creative_inventory = 1, handy = 1, axey = 1, choppy = 1, dig_by_piston = 1, plant = 1, non_mycelium_plant = 1, flammable = 3} mcl_bamboo.mcl_log(dump(mcl_bamboo.bamboo_index)) minetest.register_node(mcl_bamboo.bamboo_index[2], bamboo_one_def) local bamboo_two_def = table.copy(bamboo_def) @@ -385,7 +385,7 @@ bamboo_two_def.selection_box = { {0.25, -0.5, 0.325, 0.025, 0.5, 0.100}, } } -bamboo_two_def.groups = {not_in_creative_inventory = 1, handy = 1, axey = 1, choppy = 1, flammable = 3} +bamboo_two_def.groups = {not_in_creative_inventory = 1, handy = 1, axey = 1, choppy = 1, dig_by_piston = 1, plant = 1, non_mycelium_plant = 1, flammable = 3} minetest.register_node(mcl_bamboo.bamboo_index[3], bamboo_two_def) local bamboo_three_def = table.copy(bamboo_def) @@ -408,5 +408,5 @@ bamboo_three_def.selection_box = { {-0.125, -0.5, 0.125, -0.3125, 0.5, 0.3125}, } } -bamboo_three_def.groups = {not_in_creative_inventory = 1, handy = 1, axey = 1, choppy = 1, flammable = 3} +bamboo_three_def.groups = {not_in_creative_inventory = 1, handy = 1, axey = 1, choppy = 1, dig_by_piston = 1, plant = 1, non_mycelium_plant = 1, flammable = 3} minetest.register_node(mcl_bamboo.bamboo_index[4], bamboo_three_def) diff --git a/mods/ITEMS/mcl_bamboo/globals.lua b/mods/ITEMS/mcl_bamboo/globals.lua index f96395228..37fafc2fd 100644 --- a/mods/ITEMS/mcl_bamboo/globals.lua +++ b/mods/ITEMS/mcl_bamboo/globals.lua @@ -67,7 +67,7 @@ end local BAMBOO_ENDCAP_NAME = "mcl_bamboo:bamboo_endcap" --- For when I learn more about the pistons... +-- check if supporting block is broken. pistons now break the bamboo plant. function mcl_bamboo.break_orphaned(pos) mcl_bamboo.mcl_log("Break_Orphaned called.") local node_below = minetest.get_node(vector.offset(pos, 0, -1, 0)) From 918b8eee38f9474415470e6c3394f76999dba04d Mon Sep 17 00:00:00 2001 From: seventeenthShulker Date: Tue, 20 Jun 2023 17:33:45 +0200 Subject: [PATCH 260/982] Fix unsticky defs for shulker_box_small names (some did not exist) --- mods/ITEMS/REDSTONE/mesecons_mvps/init.lua | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/mods/ITEMS/REDSTONE/mesecons_mvps/init.lua b/mods/ITEMS/REDSTONE/mesecons_mvps/init.lua index d85943e45..814c5d80d 100644 --- a/mods/ITEMS/REDSTONE/mesecons_mvps/init.lua +++ b/mods/ITEMS/REDSTONE/mesecons_mvps/init.lua @@ -930,16 +930,16 @@ mesecon.register_mvps_unsticky("mcl_chests:black_shulker_box_small") mesecon.register_mvps_unsticky("mcl_chests:blue_shulker_box_small") mesecon.register_mvps_unsticky("mcl_chests:brown_shulker_box_small") mesecon.register_mvps_unsticky("mcl_chests:cyan_shulker_box_small") +mesecon.register_mvps_unsticky("mcl_chests:dark_green_shulker_box_small") +mesecon.register_mvps_unsticky("mcl_chests:dark_grey_shulker_box_small") +mesecon.register_mvps_unsticky("mcl_chests:lightblue_shulker_box_small") mesecon.register_mvps_unsticky("mcl_chests:green_shulker_box_small") -mesecon.register_mvps_unsticky("mcl_chests:grey_shulker_box_small") -mesecon.register_mvps_unsticky("mcl_chests:light_blue_shulker_box_small") -mesecon.register_mvps_unsticky("mcl_chests:lime_shulker_box_small") mesecon.register_mvps_unsticky("mcl_chests:orange_shulker_box_small") mesecon.register_mvps_unsticky("mcl_chests:magenta_shulker_box_small") mesecon.register_mvps_unsticky("mcl_chests:pink_shulker_box_small") -mesecon.register_mvps_unsticky("mcl_chests:purple_shulker_box_small") +mesecon.register_mvps_unsticky("mcl_chests:violet_shulker_box_small") mesecon.register_mvps_unsticky("mcl_chests:red_shulker_box_small") -mesecon.register_mvps_unsticky("mcl_chests:silver_shulker_box_small") +mesecon.register_mvps_unsticky("mcl_chests:grey_shulker_box_small") mesecon.register_mvps_unsticky("mcl_chests:white_shulker_box_small") mesecon.register_mvps_unsticky("mcl_chests:yellow_shulker_box_small") -- Snow From 058684f17f8ae824dda9ced84224fc3002b824d6 Mon Sep 17 00:00:00 2001 From: seventeenthShulker Date: Sun, 2 Jul 2023 13:08:59 +0200 Subject: [PATCH 261/982] Improve dig_node simulation and fix duplication --- mods/ITEMS/REDSTONE/mesecons/util.lua | 9 +++++++++ mods/ITEMS/REDSTONE/mesecons_mvps/init.lua | 17 ++++++++--------- 2 files changed, 17 insertions(+), 9 deletions(-) diff --git a/mods/ITEMS/REDSTONE/mesecons/util.lua b/mods/ITEMS/REDSTONE/mesecons/util.lua index b6602526a..12dbc0240 100644 --- a/mods/ITEMS/REDSTONE/mesecons/util.lua +++ b/mods/ITEMS/REDSTONE/mesecons/util.lua @@ -246,6 +246,15 @@ function mesecon.mergetable(source, dest) return rval end +-- +function mesecon.join_table(t1, t2) + local rval = mesecon.tablecopy(t2) + for i, v in ipairs(t1) do + table.insert(rval, mesecon.tablecopy(v)) + end + return rval +end + function mesecon.register_node(name, spec_common, spec_off, spec_on) spec_common.drop = spec_common.drop or name .. "_off" spec_common.on_blast = spec_common.on_blast or mesecon.on_blastnode diff --git a/mods/ITEMS/REDSTONE/mesecons_mvps/init.lua b/mods/ITEMS/REDSTONE/mesecons_mvps/init.lua index 814c5d80d..f282f4dca 100644 --- a/mods/ITEMS/REDSTONE/mesecons_mvps/init.lua +++ b/mods/ITEMS/REDSTONE/mesecons_mvps/init.lua @@ -234,7 +234,7 @@ function mesecon.mvps_push_or_pull(pos, stackdir, movedir, maximum, player_name, end if not nodes then return end - + local newpos={} -- check node availability to push/pull into, and fill newpos[i] for i in ipairs(nodes) do @@ -259,7 +259,7 @@ function mesecon.mvps_push_or_pull(pos, stackdir, movedir, maximum, player_name, end local all_nodes = nodes - if dig_nodes and #dig_nodes > 0 then all_nodes = mesecon.mergetable(dig_nodes, nodes) end + if dig_nodes and #dig_nodes > 0 then all_nodes = mesecon.join_table(dig_nodes, nodes) end if are_protected(all_nodes, player_name) then return end @@ -270,13 +270,11 @@ function mesecon.mvps_push_or_pull(pos, stackdir, movedir, maximum, player_name, n.meta = minetest.get_meta(n.pos):to_table() local is_dropper = mesecon.is_mvps_dropper(n.node, movedir, all_nodes, id) if is_dropper then - -- minetest.dig_node has been shown to be buggy (https://git.minetest.land/MineClone2/MineClone2/issues/3547) - if minetest.get_item_group(n.node.name, "dig_immediate") == 3 then - -- should dig as normal - minetest.dig_node(n.pos) - else - -- simulate dig_node because nothing drops otherwise + -- if current node has already been destroyed (e.g. chain reaction of sugar cane breaking), skip it + if minetest.get_node(n.pos).name == n.node.name then + -- simulate dig_node using handle_node_drops local drops = minetest.get_node_drops(n.node.name, "") + local counted_drops = {} minetest.remove_node(n.pos) for _, callback in pairs(minetest.registered_on_dignodes) do callback(n.pos, n) @@ -285,8 +283,9 @@ function mesecon.mvps_push_or_pull(pos, stackdir, movedir, maximum, player_name, if type(item) ~= "string" then item = item:get_name() .. item:get_count() end - minetest.add_item(n.pos, item) + table.insert(counted_drops, item) end + minetest.handle_node_drops(n.pos, counted_drops) end else minetest.remove_node(n.pos) From 5d8688dbebfccf31c27ce7dca500236cedceffd3 Mon Sep 17 00:00:00 2001 From: seventeenthShulker Date: Sun, 2 Jul 2023 14:30:36 +0200 Subject: [PATCH 262/982] Change tall flowers to `buildable_to = false` --- mods/ITEMS/mcl_flowers/init.lua | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/mods/ITEMS/mcl_flowers/init.lua b/mods/ITEMS/mcl_flowers/init.lua index e89d01b65..24b07428a 100644 --- a/mods/ITEMS/mcl_flowers/init.lua +++ b/mods/ITEMS/mcl_flowers/init.lua @@ -252,7 +252,7 @@ local function add_large_plant(name, desc, longdesc, bottom_img, top_img, inv_im paramtype2 = paramtype2, palette = palette, walkable = false, - buildable_to = true, + buildable_to = false, drop = drop_bottom, _mcl_shears_drop = shears_drop, _mcl_fortune_drop = fortune_drop, @@ -354,7 +354,7 @@ local function add_large_plant(name, desc, longdesc, bottom_img, top_img, inv_im paramtype2 = paramtype2, palette = palette, walkable = false, - buildable_to = true, + buildable_to = false, selection_box = { type = "fixed", fixed = { -selbox_radius, -0.5, -selbox_radius, selbox_radius, selbox_top_height, selbox_radius }, From 089e3d46f18b1f09dc03a2b35ea152b996b7f110 Mon Sep 17 00:00:00 2001 From: seventeenthShulker Date: Sun, 2 Jul 2023 16:54:56 +0200 Subject: [PATCH 263/982] Several more blocks comply with MC piston mechanics. --- mods/ITEMS/mcl_bells/init.lua | 2 +- mods/ITEMS/mcl_lanterns/init.lua | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/mods/ITEMS/mcl_bells/init.lua b/mods/ITEMS/mcl_bells/init.lua index 32bdfe3d7..46b8b9f89 100644 --- a/mods/ITEMS/mcl_bells/init.lua +++ b/mods/ITEMS/mcl_bells/init.lua @@ -33,7 +33,7 @@ minetest.register_node("mcl_bells:bell", { "mcl_bells_bell_side.png", }, is_ground_content = false, - groups = {pickaxey=2, deco_block=1 }, + groups = {pickaxey=2, deco_block=1, dig_by_piston=1 }, sounds = mcl_sounds.node_sound_metal_defaults(), _mcl_blast_resistance = 5, _mcl_hardness = 5, diff --git a/mods/ITEMS/mcl_lanterns/init.lua b/mods/ITEMS/mcl_lanterns/init.lua index 5be325e48..f978358b7 100644 --- a/mods/ITEMS/mcl_lanterns/init.lua +++ b/mods/ITEMS/mcl_lanterns/init.lua @@ -118,7 +118,7 @@ function mcl_lanterns.register_lantern(name, def) node_placement_prediction = "", sunlight_propagates = true, light_source = def.light_level, - groups = {pickaxey = 1, attached_node = 1, deco_block = 1, lantern = 1}, + groups = {pickaxey = 1, attached_node = 1, deco_block = 1, lantern = 1, dig_by_piston=1}, selection_box = { type = "fixed", fixed = { From e5829f719d10d4c8376bcce3b603f42261ecb8e3 Mon Sep 17 00:00:00 2001 From: seventeenthShulker Date: Sun, 2 Jul 2023 17:08:44 +0200 Subject: [PATCH 264/982] All signs are mvps_stopper upon registration All buttons are mvps_unsticky upon registration Add some missing unmovable nodes Bamboo trapdoor is now sticky --- mods/ITEMS/REDSTONE/mesecons_button/init.lua | 5 +++ mods/ITEMS/REDSTONE/mesecons_mvps/init.lua | 36 +++++--------------- mods/ITEMS/mcl_signs/signs_api.lua | 34 ++++++++++++++++++ 3 files changed, 48 insertions(+), 27 deletions(-) diff --git a/mods/ITEMS/REDSTONE/mesecons_button/init.lua b/mods/ITEMS/REDSTONE/mesecons_button/init.lua index 275cac2e2..b812ea956 100644 --- a/mods/ITEMS/REDSTONE/mesecons_button/init.lua +++ b/mods/ITEMS/REDSTONE/mesecons_button/init.lua @@ -211,6 +211,11 @@ function mesecon.register_button(basename, description, texture, recipeitem, sou output = "mesecons_button:button_"..basename.."_off", recipe = {{ recipeitem }}, }) + + if minetest.get_modpath("mesecons_mvps") then + mesecon.register_mvps_unsticky("mesecons_button:button_"..basename.."_off") + mesecon.register_mvps_unsticky("mesecons_button:button_"..basename.."_on") + end end mesecon.register_button( diff --git a/mods/ITEMS/REDSTONE/mesecons_mvps/init.lua b/mods/ITEMS/REDSTONE/mesecons_mvps/init.lua index f282f4dca..12bfd0ca8 100644 --- a/mods/ITEMS/REDSTONE/mesecons_mvps/init.lua +++ b/mods/ITEMS/REDSTONE/mesecons_mvps/init.lua @@ -433,10 +433,8 @@ mesecon.register_mvps_stopper("mesecons_solarpanel:solar_panel_inverted_on") mesecon.register_mvps_stopper("mesecons_solarpanel:solar_panel_inverted_off") mesecon.register_mvps_stopper("mcl_banners:hanging_banner") mesecon.register_mvps_stopper("mcl_banners:standing_banner") -mesecon.register_mvps_stopper("mcl_campfires:campfire") -mesecon.register_mvps_stopper("mcl_campfires:campfire_lit") -mesecon.register_mvps_stopper("mcl_campfires:soul_campfire") -mesecon.register_mvps_stopper("mcl_campfires:soul_campfire_lit") +mesecon.register_mvps_stopper("mcl_beehives:bee_nest") +mesecon.register_mvps_stopper("mcl_beehives:beehive") -- Unmovable by technical restrictions. -- Open formspec would screw up if node is destroyed (minor problem) @@ -467,13 +465,14 @@ mesecon.register_mvps_stopper("mcl_chests:trapped_chest") mesecon.register_mvps_stopper("mcl_chests:trapped_chest_small") mesecon.register_mvps_stopper("mcl_chests:trapped_chest_left") mesecon.register_mvps_stopper("mcl_chests:trapped_chest_right") -mesecon.register_mvps_stopper("mcl_signs:wall_sign") -mesecon.register_mvps_stopper("mcl_signs:standing_sign") -mesecon.register_mvps_stopper("mcl_signs:standing_sign22_5") -mesecon.register_mvps_stopper("mcl_signs:standing_sign45") -mesecon.register_mvps_stopper("mcl_signs:standing_sign67_5") mesecon.register_mvps_stopper("mcl_barrels:barrel_open") mesecon.register_mvps_stopper("mcl_barrels:barrel_closed") +mesecon.register_mvps_stopper("mcl_campfires:campfire") +mesecon.register_mvps_stopper("mcl_campfires:campfire_lit") +mesecon.register_mvps_stopper("mcl_campfires:soul_campfire") +mesecon.register_mvps_stopper("mcl_campfires:soul_campfire_lit") +mesecon.register_mvps_stopper("mcl_lectern:lectern") +mesecon.register_mvps_stopper("mcl_grindstone:grindstone") -- Unmovable by design: objects @@ -517,8 +516,6 @@ mesecon.register_mvps_unsticky("mcl_bamboo:bamboo_2") mesecon.register_mvps_unsticky("mcl_bamboo:bamboo_3") mesecon.register_mvps_unsticky("mcl_bamboo:bamboo_door") -mesecon.register_mvps_unsticky("mcl_bamboo:bamboo_trapdoor") -mesecon.register_mvps_unsticky("mcl_signs:wall_sign_bamboo") mesecon.register_mvps_unsticky("mcl_bamboo:scaffolding") -- Beds @@ -554,21 +551,6 @@ mesecon.register_mvps_unsticky("mcl_beds:bed_white_top") mesecon.register_mvps_unsticky("mcl_beds:bed_white_bottom") mesecon.register_mvps_unsticky("mcl_beds:bed_yellow_top") mesecon.register_mvps_unsticky("mcl_beds:bed_yellow_bottom") --- Buttons -mesecon.register_mvps_unsticky("mesecons_button:button_stone_off") -mesecon.register_mvps_unsticky("mesecons_button:button_stone_on") -mesecon.register_mvps_unsticky("mesecons_button:button_wood_off") -mesecon.register_mvps_unsticky("mesecons_button:button_wood_on") -mesecon.register_mvps_unsticky("mesecons_button:button_acaciawood_off") -mesecon.register_mvps_unsticky("mesecons_button:button_acaciawood_on") -mesecon.register_mvps_unsticky("mesecons_button:button_birchwood_off") -mesecon.register_mvps_unsticky("mesecons_button:button_birchwood_on") -mesecon.register_mvps_unsticky("mesecons_button:button_darkwood_off") -mesecon.register_mvps_unsticky("mesecons_button:button_darkwood_on") -mesecon.register_mvps_unsticky("mesecons_button:button_sprucewood_off") -mesecon.register_mvps_unsticky("mesecons_button:button_sprucewood_on") -mesecon.register_mvps_unsticky("mesecons_button:button_junglewood_off") -mesecon.register_mvps_unsticky("mesecons_button:button_junglewood_on") -- Cactus, Sugarcane & Vines mesecon.register_mvps_unsticky("mcl_core:cactus") mesecon.register_mvps_unsticky("mcl_core:reeds") @@ -581,7 +563,7 @@ mesecon.register_mvps_unsticky("mcl_cake:cake_4") mesecon.register_mvps_unsticky("mcl_cake:cake_5") mesecon.register_mvps_unsticky("mcl_cake:cake_6") mesecon.register_mvps_unsticky("mcl_cake:cake") --- Carpet +-- Carpet - pullable in MC but breaks when pulled downwards. At the moment, it just cannot be pulled. mesecon.register_mvps_unsticky("mcl_wool:black_carpet") mesecon.register_mvps_unsticky("mcl_wool:blue_carpet") mesecon.register_mvps_unsticky("mcl_wool:brown_carpet") diff --git a/mods/ITEMS/mcl_signs/signs_api.lua b/mods/ITEMS/mcl_signs/signs_api.lua index 7ada6a646..52bb7bbbf 100644 --- a/mods/ITEMS/mcl_signs/signs_api.lua +++ b/mods/ITEMS/mcl_signs/signs_api.lua @@ -764,6 +764,15 @@ function mcl_signs.register_sign (modname, color, _name, ttsign) table.insert(mcl_signs.standing_rotation_levels, { "mcl_signs:standing_sign22_5" .. _name, 1 }) table.insert(mcl_signs.standing_rotation_levels, { "mcl_signs:standing_sign45" .. _name, 2 }) table.insert(mcl_signs.standing_rotation_levels, { "mcl_signs:standing_sign67_5" .. _name, 3 }) + + -- register as unpushable + if minetest.get_modpath("mesecons_mvps") then + mesecon.register_mvps_stopper("mcl_signs:wall_sign" .. _name) + mesecon.register_mvps_stopper("mcl_signs:standing_sign" .. _name) + mesecon.register_mvps_stopper("mcl_signs:standing_sign22_5" .. _name) + mesecon.register_mvps_stopper("mcl_signs:standing_sign45" .. _name) + mesecon.register_mvps_stopper("mcl_signs:standing_sign67_5" .. _name) + end end --- The same as register_sign, except caller defines the textures. Note, there is a greyscale version of the sign, @@ -1002,6 +1011,14 @@ function mcl_signs.register_sign_custom (modname, _name, tiles, color, inventory table.insert(mcl_signs.standing_rotation_levels, { "mcl_signs:standing_sign45" .. _name, 2 }) table.insert(mcl_signs.standing_rotation_levels, { "mcl_signs:standing_sign67_5" .. _name, 3 }) + -- register as unpushable + if minetest.get_modpath("mesecons_mvps") then + mesecon.register_mvps_stopper("mcl_signs:wall_sign" .. _name) + mesecon.register_mvps_stopper("mcl_signs:standing_sign" .. _name) + mesecon.register_mvps_stopper("mcl_signs:standing_sign22_5" .. _name) + mesecon.register_mvps_stopper("mcl_signs:standing_sign45" .. _name) + mesecon.register_mvps_stopper("mcl_signs:standing_sign67_5" .. _name) + end end --- Override an existing sign, tint the textures, and gives it an unique node name. Creates both wall and standing signs. @@ -1234,6 +1251,15 @@ function mcl_signs.reregister_sign (modname, color, _name, ttsign) table.insert(mcl_signs.standing_rotation_levels, { "mcl_signs:standing_sign22_5" .. _name, 1 }) table.insert(mcl_signs.standing_rotation_levels, { "mcl_signs:standing_sign45" .. _name, 2 }) table.insert(mcl_signs.standing_rotation_levels, { "mcl_signs:standing_sign67_5" .. _name, 3 }) + + -- register as unpushable + if minetest.get_modpath("mesecons_mvps") then + mesecon.register_mvps_stopper("mcl_signs:wall_sign" .. _name) + mesecon.register_mvps_stopper("mcl_signs:standing_sign" .. _name) + mesecon.register_mvps_stopper("mcl_signs:standing_sign22_5" .. _name) + mesecon.register_mvps_stopper("mcl_signs:standing_sign45" .. _name) + mesecon.register_mvps_stopper("mcl_signs:standing_sign67_5" .. _name) + end end --- The same as reregister_sign, except caller defines the textures. Note, there is a greyscale version of the sign, @@ -1469,6 +1495,14 @@ function mcl_signs.reregister_sign_custom (modname, _name, tiles, color, invento table.insert(mcl_signs.standing_rotation_levels, { "mcl_signs:standing_sign45" .. _name, 2 }) table.insert(mcl_signs.standing_rotation_levels, { "mcl_signs:standing_sign67_5" .. _name, 3 }) + -- register as unpushable + if minetest.get_modpath("mesecons_mvps") then + mesecon.register_mvps_stopper("mcl_signs:wall_sign" .. _name) + mesecon.register_mvps_stopper("mcl_signs:standing_sign" .. _name) + mesecon.register_mvps_stopper("mcl_signs:standing_sign22_5" .. _name) + mesecon.register_mvps_stopper("mcl_signs:standing_sign45" .. _name) + mesecon.register_mvps_stopper("mcl_signs:standing_sign67_5" .. _name) + end end --- Usage: Call this with the mod's name, the wood's item string (for the planks), and with the sign's suffix. From 98cf3b7f7a27733f5672d1349c37d3a02621e625 Mon Sep 17 00:00:00 2001 From: seventeenthShulker Date: Tue, 4 Jul 2023 18:22:05 +0200 Subject: [PATCH 265/982] Check node_replaceable after dig_by_piston Allows tallgrass, nether vines etc to drop --- mods/ITEMS/REDSTONE/mesecons_mvps/init.lua | 65 +++++++++++----------- 1 file changed, 32 insertions(+), 33 deletions(-) diff --git a/mods/ITEMS/REDSTONE/mesecons_mvps/init.lua b/mods/ITEMS/REDSTONE/mesecons_mvps/init.lua index 12bfd0ca8..b36721e78 100644 --- a/mods/ITEMS/REDSTONE/mesecons_mvps/init.lua +++ b/mods/ITEMS/REDSTONE/mesecons_mvps/init.lua @@ -141,44 +141,43 @@ function mesecon.mvps_get_stack(pos, dir, maximum, piston_pos) return end - if not node_replaceable(nn.name) then - if minetest.get_item_group(nn.name, "dig_by_piston") == 1 then - -- if we want the node to drop, e.g. sugar cane, do not count towards push limit - table.insert(dig_nodes, {node = nn, pos = {x=np.x, y=np.y, z=np.z}}) - else + if minetest.get_item_group(nn.name, "dig_by_piston") == 1 then + -- if we want the node to drop, e.g. sugar cane, do not count towards push limit + table.insert(dig_nodes, {node = nn, pos = {x=np.x, y=np.y, z=np.z}}) + else + if not node_replaceable(nn.name) then table.insert(nodes, {node = nn, pos = {x=np.x, y=np.y, z=np.z}}) if #nodes > maximum then return nil, nil, false, true end - end - - -- add connected nodes to frontiers, connected is a vector list - -- the vectors must be absolute positions - local connected = {} - local has_loop - if minetest.registered_nodes[nn.name] - and minetest.registered_nodes[nn.name].mvps_sticky then - connected, has_loop = minetest.registered_nodes[nn.name].mvps_sticky(np, nn, piston_pos) - if has_loop then - return {}, {}, true, false - end - end - table.insert(connected, vector.add(np, dir)) - - -- Make sure there are no duplicates in frontiers / nodes before - -- adding nodes in "connected" to frontiers - for _, cp in ipairs(connected) do - local duplicate = false - for _, rp in ipairs(nodes) do - if vector.equals(cp, rp.pos) then - duplicate = true + + -- add connected nodes to frontiers, connected is a vector list + -- the vectors must be absolute positions + local connected = {} + local has_loop + if minetest.registered_nodes[nn.name] and minetest.registered_nodes[nn.name].mvps_sticky then + connected, has_loop = minetest.registered_nodes[nn.name].mvps_sticky(np, nn, piston_pos) + if has_loop then + return {}, {}, true, false end end - for _, fp in ipairs(frontiers) do - if vector.equals(cp, fp) then - duplicate = true + table.insert(connected, vector.add(np, dir)) + + -- Make sure there are no duplicates in frontiers / nodes before + -- adding nodes in "connected" to frontiers + for _, cp in ipairs(connected) do + local duplicate = false + for _, rp in ipairs(nodes) do + if vector.equals(cp, rp.pos) then + duplicate = true + end + end + for _, fp in ipairs(frontiers) do + if vector.equals(cp, fp) then + duplicate = true + end + end + if not duplicate and not mesecon.is_mvps_stopper(minetest.get_node(cp)) and minetest.get_item_group(nn.name, "dig_by_piston") == 0 then + table.insert(frontiers, cp) end - end - if not duplicate and not mesecon.is_mvps_stopper(minetest.get_node(cp)) and minetest.get_item_group(nn.name, "dig_by_piston") == 0 then - table.insert(frontiers, cp) end end end From 0580b14310fac1113d9684eb3c9f4f80d058cea8 Mon Sep 17 00:00:00 2001 From: seventeenthShulker Date: Thu, 6 Jul 2023 14:17:54 +0200 Subject: [PATCH 266/982] Vertical pistons now save owner meta --- mods/ITEMS/REDSTONE/mesecons_pistons/init.lua | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/mods/ITEMS/REDSTONE/mesecons_pistons/init.lua b/mods/ITEMS/REDSTONE/mesecons_pistons/init.lua index 93b8df96d..262ac6eb5 100644 --- a/mods/ITEMS/REDSTONE/mesecons_pistons/init.lua +++ b/mods/ITEMS/REDSTONE/mesecons_pistons/init.lua @@ -138,14 +138,12 @@ local function piston_off(pos, node) end local function piston_orientate(pos, placer) - mesecon.mvps_set_owner(pos, placer) - -- not placed by player if not placer then return end - + -- placer pitch in degrees local pitch = placer:get_look_vertical() * (180 / math.pi) - + local node = minetest.get_node(pos) local pistonspec = minetest.registered_nodes[node.name].mesecons_piston if pitch > 55 then @@ -153,6 +151,9 @@ local function piston_orientate(pos, placer) elseif pitch < -55 then minetest.add_node(pos, {name=pistonspec.piston_down}) end + + -- set owner meta after setting node, or it will not keep + mesecon.mvps_set_owner(pos, placer) end From 0637182697739f57ebcee109071a29024910a449 Mon Sep 17 00:00:00 2001 From: seventeenthShulker Date: Thu, 6 Jul 2023 15:34:49 +0200 Subject: [PATCH 267/982] Tallgrass and dead bush added to dig_by_piston --- mods/ITEMS/mcl_core/nodes_misc.lua | 4 ++-- mods/ITEMS/mcl_flowers/init.lua | 4 +--- 2 files changed, 3 insertions(+), 5 deletions(-) diff --git a/mods/ITEMS/mcl_core/nodes_misc.lua b/mods/ITEMS/mcl_core/nodes_misc.lua index d830cc310..9986eaf2d 100644 --- a/mods/ITEMS/mcl_core/nodes_misc.lua +++ b/mods/ITEMS/mcl_core/nodes_misc.lua @@ -139,8 +139,8 @@ minetest.register_node("mcl_core:deadbush", { sunlight_propagates = true, walkable = false, buildable_to = true, - groups = {handy = 1, shearsy = 1, flammable = 3, attached_node = 1, plant = 1, non_mycelium_plant = 1, dig_by_water = 1, - destroy_by_lava_flow = 1, deco_block = 1, fire_encouragement = 60, fire_flammability = 100}, + groups = {handy = 1, shearsy = 1, flammable = 3, attached_node = 1, plant = 1, non_mycelium_plant = 1, dig_by_piston = 1, + dig_by_water = 1, destroy_by_lava_flow = 1, deco_block = 1, fire_encouragement = 60, fire_flammability = 100}, drop = { max_items = 1, items = { diff --git a/mods/ITEMS/mcl_flowers/init.lua b/mods/ITEMS/mcl_flowers/init.lua index 24b07428a..10189240b 100644 --- a/mods/ITEMS/mcl_flowers/init.lua +++ b/mods/ITEMS/mcl_flowers/init.lua @@ -128,8 +128,6 @@ local fortune_wheat_seed_drop = { overwrite = true, } --- CHECKME: How does tall grass behave when pushed by a piston? - --- Tall Grass --- local def_tallgrass = { description = S("Tall Grass"), @@ -155,7 +153,7 @@ local def_tallgrass = { groups = { handy = 1, shearsy = 1, attached_node = 1, deco_block = 1, plant = 1, place_flowerlike = 2, non_mycelium_plant = 1, - flammable = 3, fire_encouragement = 60, fire_flammability = 100, + flammable = 3, fire_encouragement = 60, fire_flammability = 10, dig_by_piston = 1, dig_by_water = 1, destroy_by_lava_flow = 1, compostability = 30, grass_palette = 1 }, sounds = mcl_sounds.node_sound_leaves_defaults(), From 3e12b3c7006aaae64c232834ab78b68980271060 Mon Sep 17 00:00:00 2001 From: seventeenthShulker Date: Thu, 6 Jul 2023 15:41:41 +0200 Subject: [PATCH 268/982] Check protection of certain nodes before push/pull - The node directly in front of a piston (including air) - The 'final' position of any connected nodes --- mods/ITEMS/REDSTONE/mesecons_mvps/init.lua | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/mods/ITEMS/REDSTONE/mesecons_mvps/init.lua b/mods/ITEMS/REDSTONE/mesecons_mvps/init.lua index b36721e78..d1a1171e8 100644 --- a/mods/ITEMS/REDSTONE/mesecons_mvps/init.lua +++ b/mods/ITEMS/REDSTONE/mesecons_mvps/init.lua @@ -207,6 +207,11 @@ local function are_protected(nodes, player_name) end function mesecon.mvps_push(pos, dir, maximum, player_name, piston_pos) + -- check if the node in front of the piston is protected against player_name (to prevent replacing air) + if minetest.is_protected(pos, player_name) then + return false + end + return mesecon.mvps_push_or_pull(pos, dir, dir, maximum, player_name, piston_pos) end @@ -241,6 +246,9 @@ function mesecon.mvps_push_or_pull(pos, stackdir, movedir, maximum, player_name, if (newpos[i].x == piston_pos.x) and (newpos[i].y == piston_pos.y) and (newpos[i].z == piston_pos.z) then return end + if minetest.is_protected(newpos[i], player_name) then + return + end if not is_available(newpos[i]) then local available = false for j in ipairs(nodes) do From 378df76e5f122f354289d16c1fe3c07c4be222dc Mon Sep 17 00:00:00 2001 From: seventeenthShulker Date: Mon, 16 Oct 2023 22:06:52 +0200 Subject: [PATCH 269/982] Prevent signs from being replaced by pushed/pulled blocks --- mods/ITEMS/mcl_signs/signs_api.lua | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mods/ITEMS/mcl_signs/signs_api.lua b/mods/ITEMS/mcl_signs/signs_api.lua index 52bb7bbbf..2c0908124 100644 --- a/mods/ITEMS/mcl_signs/signs_api.lua +++ b/mods/ITEMS/mcl_signs/signs_api.lua @@ -85,7 +85,7 @@ end mcl_signs = {} -- GLOBALS -mcl_signs.sign_groups = { handy = 1, axey = 1, deco_block = 1, material_wood = 1, attached_node = 1, dig_by_piston = 1, flammable = -1 } +mcl_signs.sign_groups = { handy = 1, axey = 1, deco_block = 1, material_wood = 1, attached_node = 1, flammable = -1 } --- colors used for wools. mcl_signs.mcl_wool_colors = { unicolor_white = "#FFFFFF", From 520fd773fbc06d896f4e13dce419aff03fce4456 Mon Sep 17 00:00:00 2001 From: seventeenthShulker Date: Mon, 16 Oct 2023 22:07:52 +0200 Subject: [PATCH 270/982] Fix random crash when piston breaks node with no player --- mods/HUD/mcl_inventory/creative.lua | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/mods/HUD/mcl_inventory/creative.lua b/mods/HUD/mcl_inventory/creative.lua index bb2f226a2..5dfc2b7ae 100644 --- a/mods/HUD/mcl_inventory/creative.lua +++ b/mods/HUD/mcl_inventory/creative.lua @@ -741,12 +741,14 @@ if minetest.is_creative_enabled("") then for _, item in ipairs(drops) do minetest.add_item(pos, item) end - end - local inv = digger:get_inventory() - if inv then - for _, item in ipairs(drops) do - if not inv:contains_item("main", item, true) then - inv:add_item("main", item) + else + -- If there is a player + local inv = digger:get_inventory() + if inv then + for _, item in ipairs(drops) do + if not inv:contains_item("main", item, true) then + inv:add_item("main", item) + end end end end From c37da143dacc0e64f019dce3ab6217fb03781cc8 Mon Sep 17 00:00:00 2001 From: seventeenthShulker Date: Mon, 16 Oct 2023 22:08:17 +0200 Subject: [PATCH 271/982] Add crying obsidian and lodestone to mvps_stoppers --- mods/ITEMS/REDSTONE/mesecons_mvps/init.lua | 2 ++ 1 file changed, 2 insertions(+) diff --git a/mods/ITEMS/REDSTONE/mesecons_mvps/init.lua b/mods/ITEMS/REDSTONE/mesecons_mvps/init.lua index d1a1171e8..9534d66c9 100644 --- a/mods/ITEMS/REDSTONE/mesecons_mvps/init.lua +++ b/mods/ITEMS/REDSTONE/mesecons_mvps/init.lua @@ -423,6 +423,7 @@ mesecon.register_mvps_stopper("mcl_core:realm_barrier") mesecon.register_mvps_stopper("mcl_core:void") mesecon.register_mvps_stopper("mcl_core:bedrock") mesecon.register_mvps_stopper("mcl_core:obsidian") +mesecon.register_mvps_stopper("mcl_core:crying_obsidian") mesecon.register_mvps_stopper("mcl_chests:ender_chest") mesecon.register_mvps_stopper("mcl_chests:ender_chest_small") mesecon.register_mvps_stopper("mcl_mobspawners:spawner") @@ -442,6 +443,7 @@ mesecon.register_mvps_stopper("mcl_banners:hanging_banner") mesecon.register_mvps_stopper("mcl_banners:standing_banner") mesecon.register_mvps_stopper("mcl_beehives:bee_nest") mesecon.register_mvps_stopper("mcl_beehives:beehive") +mesecon.register_mvps_stopper("mcl_compass:lodestone") -- Unmovable by technical restrictions. -- Open formspec would screw up if node is destroyed (minor problem) From 00cfca5947d28c824a6973a512d1f1bb1b3f7c99 Mon Sep 17 00:00:00 2001 From: seventeenthShulker Date: Mon, 23 Oct 2023 12:13:12 +0200 Subject: [PATCH 272/982] Make carpet sticky again --- mods/ITEMS/REDSTONE/mesecons_mvps/init.lua | 17 ----------------- 1 file changed, 17 deletions(-) diff --git a/mods/ITEMS/REDSTONE/mesecons_mvps/init.lua b/mods/ITEMS/REDSTONE/mesecons_mvps/init.lua index 9534d66c9..88ca9d30e 100644 --- a/mods/ITEMS/REDSTONE/mesecons_mvps/init.lua +++ b/mods/ITEMS/REDSTONE/mesecons_mvps/init.lua @@ -572,23 +572,6 @@ mesecon.register_mvps_unsticky("mcl_cake:cake_4") mesecon.register_mvps_unsticky("mcl_cake:cake_5") mesecon.register_mvps_unsticky("mcl_cake:cake_6") mesecon.register_mvps_unsticky("mcl_cake:cake") --- Carpet - pullable in MC but breaks when pulled downwards. At the moment, it just cannot be pulled. -mesecon.register_mvps_unsticky("mcl_wool:black_carpet") -mesecon.register_mvps_unsticky("mcl_wool:blue_carpet") -mesecon.register_mvps_unsticky("mcl_wool:brown_carpet") -mesecon.register_mvps_unsticky("mcl_wool:cyan_carpet") -mesecon.register_mvps_unsticky("mcl_wool:green_carpet") -mesecon.register_mvps_unsticky("mcl_wool:grey_carpet") -mesecon.register_mvps_unsticky("mcl_wool:light_blue_carpet") -mesecon.register_mvps_unsticky("mcl_wool:lime_carpet") -mesecon.register_mvps_unsticky("mcl_wool:orange_carpet") -mesecon.register_mvps_unsticky("mcl_wool:magenta_carpet") -mesecon.register_mvps_unsticky("mcl_wool:pink_carpet") -mesecon.register_mvps_unsticky("mcl_wool:purple_carpet") -mesecon.register_mvps_unsticky("mcl_wool:red_carpet") -mesecon.register_mvps_unsticky("mcl_wool:silver_carpet") -mesecon.register_mvps_unsticky("mcl_wool:white_carpet") -mesecon.register_mvps_unsticky("mcl_wool:yellow_carpet") -- Carved & Jack O'Lantern Pumpkins, Pumpkin & Melon mesecon.register_mvps_unsticky("mcl_farming:pumpkin_face") mesecon.register_mvps_unsticky("mcl_farming:pumpkin_face_light") From 9b2b8ee56e5ea643b3dca671034af980a365da5d Mon Sep 17 00:00:00 2001 From: Dehydrate6684 Date: Sun, 5 Nov 2023 14:06:53 +0800 Subject: [PATCH 273/982] Removed direction checks --- mods/ITEMS/mcl_core/nodes_climb.lua | 36 +++----------------------- mods/ITEMS/mcl_doors/api_trapdoors.lua | 3 +-- 2 files changed, 5 insertions(+), 34 deletions(-) diff --git a/mods/ITEMS/mcl_core/nodes_climb.lua b/mods/ITEMS/mcl_core/nodes_climb.lua index c1514926f..609dd3cb9 100644 --- a/mods/ITEMS/mcl_core/nodes_climb.lua +++ b/mods/ITEMS/mcl_core/nodes_climb.lua @@ -11,42 +11,15 @@ local function rotate_climbable(pos, node, user, mode) return false end ----Checks the direction (param2) of a ladder and a trapdoor and determine if they are ----facing the same direction. ---- ----@param ladder integer The param2 value of the ladder. ----@param trapdoor integer The param2 value of the trapdoor. ----@return boolean If the ladder and trapdoor are in the same direction. -function mcl_core.check_direction(ladder, trapdoor) - local convert_table = { - { 1, 23 }, - { 3, 21 }, - { 0, 20 }, - { 2, 22 }, - } - - local conversion = convert_table[ladder - 1]; - if not conversion then - return false - elseif conversion[1] == trapdoor or conversion[2] == trapdoor then - return true - end - - return false -end - ---Updates the trapdoor above (if any). --- ---@param pos mt.Vector The position of the ladder. ----@param ladder integer The param2 value of the ladder. ---@param event "place" | "destruct" The place or destruct event. -local function update_trapdoor(pos, ladder, event) +local function update_trapdoor(pos, event) local top_pos = vector.offset(pos, 0, 1, 0) local top_node = minetest.get_node_or_nil(top_pos) - - if top_node and minetest.get_item_group(top_node.name, "trapdoor") == 2 - and mcl_core.check_direction(ladder, top_node.param2) then + if top_node and minetest.get_item_group(top_node.name, "trapdoor") == 2 then local new_name = top_node.name if event == "place" then new_name = string.gsub(new_name, "open$", "ladder") @@ -142,11 +115,10 @@ minetest.register_node("mcl_core:ladder", { return itemstack end, after_destruct = function(pos, old) - update_trapdoor(pos, old.param2, "destruct") + update_trapdoor(pos, "destruct") end, after_place_node = function(pos) - local me = minetest.get_node(pos) - update_trapdoor(pos, me.param2, "place") + update_trapdoor(pos, "place") end, _mcl_blast_resistance = 0.4, _mcl_hardness = 0.4, diff --git a/mods/ITEMS/mcl_doors/api_trapdoors.lua b/mods/ITEMS/mcl_doors/api_trapdoors.lua index 17765f27e..8bbefdda3 100644 --- a/mods/ITEMS/mcl_doors/api_trapdoors.lua +++ b/mods/ITEMS/mcl_doors/api_trapdoors.lua @@ -79,8 +79,7 @@ function mcl_doors:register_trapdoor(name, def) -- Checking if there is something underneath the trapdoor if bottom_node then local is_ladder = minetest.get_item_group(bottom_node.name, "ladder") - local same_direction = mcl_core.check_direction(bottom_node.param2, me.param2) - if is_ladder > 0 and same_direction then + if is_ladder > 0 then name_end = "_ladder" end end From e5a260b56304e5cd959c54879c87728a86df8ef7 Mon Sep 17 00:00:00 2001 From: Dehydrate6684 Date: Sun, 5 Nov 2023 14:10:58 +0800 Subject: [PATCH 274/982] Added vines and skulk vines to ladder group --- mods/ITEMS/mcl_core/nodes_climb.lua | 15 +++++++++++---- mods/ITEMS/mcl_sculk/init.lua | 18 ++++++++++++++++-- 2 files changed, 27 insertions(+), 6 deletions(-) diff --git a/mods/ITEMS/mcl_core/nodes_climb.lua b/mods/ITEMS/mcl_core/nodes_climb.lua index 609dd3cb9..0de0e9abd 100644 --- a/mods/ITEMS/mcl_core/nodes_climb.lua +++ b/mods/ITEMS/mcl_core/nodes_climb.lua @@ -15,7 +15,7 @@ end --- ---@param pos mt.Vector The position of the ladder. ---@param event "place" | "destruct" The place or destruct event. -local function update_trapdoor(pos, event) +function mcl_core.update_trapdoor(pos, event) local top_pos = vector.offset(pos, 0, 1, 0) local top_node = minetest.get_node_or_nil(top_pos) @@ -115,10 +115,10 @@ minetest.register_node("mcl_core:ladder", { return itemstack end, after_destruct = function(pos, old) - update_trapdoor(pos, "destruct") + mcl_core.update_trapdoor(pos, "destruct") end, after_place_node = function(pos) - update_trapdoor(pos, "place") + mcl_core.update_trapdoor(pos, "place") end, _mcl_blast_resistance = 0.4, _mcl_hardness = 0.4, @@ -158,7 +158,8 @@ minetest.register_node("mcl_core:vine", { flammable = 2, fire_encouragement = 15, fire_flammability = 100, - foliage_palette_wallmounted = 1 + foliage_palette_wallmounted = 1, + ladder = 1 }, sounds = mcl_sounds.node_sound_leaves_defaults(), drop = "", @@ -230,6 +231,12 @@ minetest.register_node("mcl_core:vine", { minetest.registered_nodes[node.name].on_dig(below, node, digger) end end, + after_destruct = function(pos, old) + mcl_core.update_trapdoor(pos, "destruct") + end, + after_place_node = function(pos) + mcl_core.update_trapdoor(pos, "place") + end, _mcl_blast_resistance = 0.2, diff --git a/mods/ITEMS/mcl_sculk/init.lua b/mods/ITEMS/mcl_sculk/init.lua index b2ef04152..4af60178e 100644 --- a/mods/ITEMS/mcl_sculk/init.lua +++ b/mods/ITEMS/mcl_sculk/init.lua @@ -215,9 +215,23 @@ minetest.register_node("mcl_sculk:vein", { type = "wallmounted", }, groups = { - handy = 1, axey = 1, shearsy = 1, swordy = 1, deco_block = 1, - dig_by_piston = 1, destroy_by_lava_flow = 1, sculk = 1, dig_by_water = 1, + handy = 1, + axey = 1, + shearsy = 1, + swordy = 1, + deco_block = 1, + dig_by_piston = 1, + destroy_by_lava_flow = 1, + sculk = 1, + dig_by_water = 1, + ladder = 1 }, + after_destruct = function(pos, old) + mcl_core.update_trapdoor(pos, "destruct") + end, + after_place_node = function(pos) + mcl_core.update_trapdoor(pos, "place") + end, sounds = sounds, drop = "", _mcl_shears_drop = true, From 952a96b57d93d770202fcf5fe2b6a8983a5447fb Mon Sep 17 00:00:00 2001 From: chmodsayshello Date: Sun, 5 Nov 2023 20:35:13 +0100 Subject: [PATCH 275/982] fix leggings trim textures --- textures/silence_leggings.png | Bin 575 -> 641 bytes textures/wayfinder_leggings.png | Bin 276 -> 97 bytes 2 files changed, 0 insertions(+), 0 deletions(-) diff --git a/textures/silence_leggings.png b/textures/silence_leggings.png index ee4e23dfe241067b62311ca266fe4b181233b3a3..83b18c856fc0676a0389bb5faadc0be18a99462e 100644 GIT binary patch literal 641 zcmV-{0)G98P)>{D&8gnF1%)&*5k%BW(ZUjF_%bC0tk*1@es2D;H zV-rP)iC&c>evExWiRH$MN+;0p7l)&5xIJ5TJh>&NQ_{P}40@tO+y*?2b}1{$7jtnlQ5->l(r8IpQql-e8ht8G zu9YY*17@L(t+FW?fGTkjzgB0>SK_5;HZQ9TPm2q-fn5d+LlZoPBvir~HsoL2d;}fP z4hg8=jQDF=nfri#sDr!E1!1Rx%$eg*1GUf(;}D1QW|V}u>ws2S2@O!^MCdY|aNcF>zc}(2sP+sfM5|bwUt=vrd&Xp~yKwzvB#E#ThJc7H55c z0A+m}ID^H`emfhODL3*3Ock~0xAiogaT?&T2+-5&NvqHbsbw@M2$bgL_!uAK7JtK^ z^S4$~SyA3wQ+$%o|LULd&-OQa&0eq>?_I6P^Vgu*Rx@wmom=NbfoZ4&0V?+eeSiou z)PQ+(ePHhud~Cq^Yy!HVhBaz2|B*d;0t~zzh3py$ z8uou(e@O4s5wR@pkV$e+w2G@FMW)4qNbTt3qEW<1igd08^1Z;H=TT)$w99T;E^o>n zHm}X-z51y3fSr;Zvh6p0NbLK&fFvrRMKU1w(1TUtM00000NkvXXu0mjfL6;*3 literal 575 zcmeAS@N?(olHy`uVBq!ia0vp^4M6O`0VEi{?^Rd~q?k&A{DK+&M^9AR%D}+*!_&nv zB;(%OnTC0{9YkE_^IT=Tv-0zuBToeHEZtlokV@n@ za!mE=)!T>X9!NYL#F=pD1e3@c1 zNvN-lEZ5m4)5z8QfZdkiJHvg3ilyzp?|)7H8nSvN!$%H>W^K2_t=kzaOSp{;Hnl_^ zGrnNecK*ojb<5=n6864PXAbc`y(nq>j~V6XUdoAh+h4Y_+jVDxW9zbA>@!l|UoO5q zw_Lq1i}Tu3`O{ey_Z@k8W3jopZn5 zJFxh0lq2t_PQJx+LB`EYM8`vJKVyA%Jc@Lz3ynC0u22ire0f>MU3 LtDnm{r-UW|0bup7 diff --git a/textures/wayfinder_leggings.png b/textures/wayfinder_leggings.png index 64dbe2015ccbc1bcc7ad8473581edb28197608e0..096b5056781f496d55e47421a7d016c0acc30a5f 100644 GIT binary patch literal 97 zcmeAS@N?(olHy`uVBq!ia0vp^4nVBH$P6TB1iv{Bq?iMILR^9L@+#X~K#H*>$S;_| p;n|HeAcx1(#W6%eGFgJPf{}qyfq_w2tP7-v!PC{xWt~$(699zd6aoMM literal 276 zcmV+v0qg#WP) Date: Mon, 6 Nov 2023 20:22:46 +0100 Subject: [PATCH 276/982] Fixed the wayfinder --- textures/wayfinder_leggings.png | Bin 97 -> 4354 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/textures/wayfinder_leggings.png b/textures/wayfinder_leggings.png index 096b5056781f496d55e47421a7d016c0acc30a5f..48da69e7b4fc1f4f903b88a40c4e894cc5135962 100644 GIT binary patch literal 4354 zcmeHKeM}qY89#>*f-_P!mI^Jf9FCeo%Gvi}8{Z8RgUyEtCN8*zlx6ez?rbixeU9&p z4b2uxLzM)Yq)FGUS(-wtWoeQ|YbzSMb}O_YgtBC7t9AKWK}nmYO#(w(*GYx4_s&2- ztu!I6|6$3#d!P6B{NCsJJY6yZ->}9qp@U(z0yf^{;I$vQ4g^;N|@sEH#EWn2YgV2#Q?_ID1pxMwgBg#ic!#jP!oK>V=ikxW{^|`?kFx z!IznC`pKV@u24spo_%?9*F*1SttmN|&}UisW9O2)%E}LKh;&rLx|fDBUie_!_74X8 z;gi?j4P);;tiGIE`|6qr{GIbx?)_}+aLH386&K82M{a(;?D8Xoe!29$XZpVy zs2Te3kFiy2sBV-Z)_b+r ztJP_@TBoxCIUM@g6XvqFEg5}3t?qhmMXxt?>sjYBx1Q7N=~5RTP2Jr3VCJ7n-|Vnk z_g}r5-F3E=mAkc7S10!uwWZ&+=gYB?53h}6_88Xg_D1?t zj#K9(Jc|{N7u{Gfaiegtb@-k>{JITG92$%4h3ZBeQ*JJFo4gFP&a_ zn)vmry|HJ1Ra3sdd|PEc{a)g(RZnXl9zWB41MkNhi35l4y}ql}lQful;>n7~V+T#g zHd7yq8}~kNrmnrK+`<3-z#q^>H5FgU)pzMV#nU? zr$2A|X#cJEI-JecYJ&%nNlfnT)fUn^3@);%x0qk5vQLpXQy z#jd^YC&AWDzX>)!YIVO+cJXGx=*aC`w}*%qzxp}k!ovqkcNAoSu8Z-YyJ{U36e9$* zG%I*GZ7dK1Z3jX5>tZ3A*}_S%hx744vu5=5H#IQNnl&{B2kHn}xq7~=Da=(jRl1m_ zEey$O))lDpV-z3=a1ss20{);##mpLomjdsyS*L*&h_uD5sdYGEs}Sa3y;iS9k>VKN zfNKiWaDJHeQdPE+DGD$$Yw9H_MCo+VXjB^|v_jaY!$^|Up|}pm5r9C%#-K#Ukf69) zrigRcIFSkSA&D1)u*^w&gotF;Xuv!?9bX{iaLmvL#VHkl9=aGE(qURu7YOKPdx%nT z10b0S=o>vm7uck_Dozw4VTLPi;DXZX*%T}@;~$EI{YpA4qvQNs06;~sDmG`yQoF-B z;~`7n;{zeZ3y3`jDe>MrV$F$7o>9`79SCrr;hlq?&Rqcml*2*U1STSfXSbO(^7<4j zFg!~suMA@}p&lGV@{BBj=nb?Hp*hBckQm9aq`_-o4D2i_dr*|kTHtt5C5FRU(7~G$8B+x za4>5s_+TViIXM+K@uoR=EY-H_#WiKBIrb!6GOFxUU8SpLV;v} zu(aH#fIzW>TqtXpqa`8i5(K|lBU8Y#=ghPNY$ukMXd5kYfE2|E3d1PW=)zG7$0>}w z4+X5Uh*$wO zlI)J+q)(PDNxM5Ot$s-qm|}KYq02PLxYHA#cOO+1qFK##kL*iGNNDSPW#1xg;@b0z z+Dp!_EitY5-S5+XbYBjdGrYBRms;h+6H`B3Wi0GneC6d^i5aaeEoYXuC*DdvaiN{v zpwFS*OTX)?T))2It<@c9-lJhZ$0kRiY K+D;a^TmB1Wq8wEK delta 79 zcmZotN}M3!$;iyWz%V2D&2b>b9N-h;3Z$1;+1>(Dj3q&S!3+-1ZlnP@Jf1F&Arg|w b608-B42%j4jKX4FAUzD8u6{1-oD!M<`~ecX From 52b65554d9e68362214302af700aedb347a96687 Mon Sep 17 00:00:00 2001 From: Araca Date: Mon, 6 Nov 2023 20:12:36 +0000 Subject: [PATCH 277/982] Do not output enchanted item if enchantment is impossible (#3998) To Fix #3672 , I avoid displaying the output item if enchantment is not possible for various reason * Level of added enchantment is below the one from input item * Incompatible enchantment Co-authored-by: Araca <> Reviewed-on: https://git.minetest.land/MineClone2/MineClone2/pulls/3998 Reviewed-by: the-real-herowl Co-authored-by: Araca Co-committed-by: Araca --- mods/ITEMS/mcl_enchanting/engine.lua | 20 ++++++++------------ 1 file changed, 8 insertions(+), 12 deletions(-) diff --git a/mods/ITEMS/mcl_enchanting/engine.lua b/mods/ITEMS/mcl_enchanting/engine.lua index b5766dd28..67ef72056 100644 --- a/mods/ITEMS/mcl_enchanting/engine.lua +++ b/mods/ITEMS/mcl_enchanting/engine.lua @@ -180,16 +180,18 @@ function mcl_enchanting.combine(itemstack, combine_with) return false end local enchantments = mcl_enchanting.get_enchantments(itemstack) + local any_new_enchantment = false for enchantment, combine_level in pairs(mcl_enchanting.get_enchantments(combine_with)) do local enchantment_def = mcl_enchanting.enchantments[enchantment] local enchantment_level = enchantments[enchantment] - if enchantment_level then + if enchantment_level then -- The enchantment already exist in the provided item if enchantment_level == combine_level then enchantment_level = math.min(enchantment_level + 1, enchantment_def.max_level) else enchantment_level = math.max(enchantment_level, combine_level) end - elseif mcl_enchanting.item_supports_enchantment(itemname, enchantment) then + any_new_enchantment = any_new_enchantment or ( enchantment_level ~= enchantments[enchantment] ) + elseif mcl_enchanting.item_supports_enchantment(itemname, enchantment) then -- this is a new enchantement to try to add local supported = true for incompatible in pairs(enchantment_def.incompatible) do if enchantments[incompatible] then @@ -199,24 +201,18 @@ function mcl_enchanting.combine(itemstack, combine_with) end if supported then enchantment_level = combine_level + any_new_enchantment = true end end if enchantment_level and enchantment_level > 0 then enchantments[enchantment] = enchantment_level end end - local any_enchantment = false - for enchantment, enchantment_level in pairs(enchantments) do - if enchantment_level > 0 then - any_enchantment = true - break - end - end - if any_enchantment then + if any_new_enchantment then itemstack:set_name(enchanted_itemname) + mcl_enchanting.set_enchantments(itemstack, enchantments) end - mcl_enchanting.set_enchantments(itemstack, enchantments) - return true + return any_new_enchantment end function mcl_enchanting.enchantments_snippet(_, _, itemstack) From ae5564e6581eedcb02e949cb6305b8b57e0247df Mon Sep 17 00:00:00 2001 From: codiac Date: Sun, 10 Sep 2023 21:33:37 +1000 Subject: [PATCH 278/982] Make golem go home. Fixes #3288 --- mods/ENTITIES/mobs_mc/iron_golem.lua | 25 +++++++++++++++++++------ 1 file changed, 19 insertions(+), 6 deletions(-) diff --git a/mods/ENTITIES/mobs_mc/iron_golem.lua b/mods/ENTITIES/mobs_mc/iron_golem.lua index 6b428c6f8..9cdb6aa10 100644 --- a/mods/ENTITIES/mobs_mc/iron_golem.lua +++ b/mods/ENTITIES/mobs_mc/iron_golem.lua @@ -9,7 +9,8 @@ local S = minetest.get_translator("mobs_mc") --################### IRON GOLEM --################### -local etime = 0 +local walk_dist = 40 +local tele_dist = 80 mcl_mobs.register_mob("mobs_mc:iron_golem", { description = S("Iron Golem"), @@ -85,11 +86,23 @@ mcl_mobs.register_mob("mobs_mc:iron_golem", { punch_start = 40, punch_end = 50, }, jump = true, - on_step = function(self,dtime) - etime = etime + dtime - if etime > 10 then - if self._home and vector.distance(self._home,self.object:get_pos()) > 50 then - self:gopath(self._home) + do_custom = function(self, dtime) + self.home_timer = (self.home_timer or 0) + dtime + + if self.home_timer > 10 then + self.home_timer = 0 + if self._home then + local dist = vector.distance(self._home,self.object:get_pos()) + if dist >= tele_dist then + self.object:set_pos(self._home) + self.state = "stand" + self.order = "follow" + elseif dist >= walk_dist then + self:gopath(self._home, function(self) + self.state = "stand" + self.order = "follow" + end) + end end end end, From 06f9486e4dac1cb9143d333fa8d45c61eba3a088 Mon Sep 17 00:00:00 2001 From: codiac Date: Mon, 11 Sep 2023 15:18:39 +1000 Subject: [PATCH 279/982] Do not go home if attacking --- mods/ENTITIES/mobs_mc/iron_golem.lua | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mods/ENTITIES/mobs_mc/iron_golem.lua b/mods/ENTITIES/mobs_mc/iron_golem.lua index 9cdb6aa10..2d081e4fe 100644 --- a/mods/ENTITIES/mobs_mc/iron_golem.lua +++ b/mods/ENTITIES/mobs_mc/iron_golem.lua @@ -91,7 +91,7 @@ mcl_mobs.register_mob("mobs_mc:iron_golem", { if self.home_timer > 10 then self.home_timer = 0 - if self._home then + if self._home and self.state ~= "attack" then local dist = vector.distance(self._home,self.object:get_pos()) if dist >= tele_dist then self.object:set_pos(self._home) From 89c97690c8960731b37eabb794c32df204316924 Mon Sep 17 00:00:00 2001 From: codiac Date: Wed, 13 Sep 2023 15:21:19 +1000 Subject: [PATCH 280/982] Add a setting to enable mod nav hacks --- mods/ENTITIES/mobs_mc/iron_golem.lua | 3 ++- settingtypes.txt | 4 ++++ 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/mods/ENTITIES/mobs_mc/iron_golem.lua b/mods/ENTITIES/mobs_mc/iron_golem.lua index 2d081e4fe..b79971b9b 100644 --- a/mods/ENTITIES/mobs_mc/iron_golem.lua +++ b/mods/ENTITIES/mobs_mc/iron_golem.lua @@ -4,6 +4,7 @@ --License for code WTFPL and otherwise stated in readmes local S = minetest.get_translator("mobs_mc") +local allow_nav_hacks = minetest.settings:get_bool("mcl_mob_allow_nav_hacks ",false) --################### --################### IRON GOLEM @@ -93,7 +94,7 @@ mcl_mobs.register_mob("mobs_mc:iron_golem", { self.home_timer = 0 if self._home and self.state ~= "attack" then local dist = vector.distance(self._home,self.object:get_pos()) - if dist >= tele_dist then + if allow_nav_hacks and dist >= tele_dist then self.object:set_pos(self._home) self.state = "stand" self.order = "follow" diff --git a/settingtypes.txt b/settingtypes.txt index 82086de14..0b466f76f 100644 --- a/settingtypes.txt +++ b/settingtypes.txt @@ -207,6 +207,10 @@ mcl_mobs_overworld_threshold (Artificial light threshold to stop monster spawns mcl_mobs_overworld_sky_threshold (Skylight threshold to stop monster spawns in the Overworld) int 7 0 14 mcl_mobs_overworld_passive_threshold (Combined light threshold to stop animal and npc spawns in the Overworld) int 7 0 14 +# Enable workarounds for faulty mob navigation. +# Hack 1: teleport golems home if they are very far from home +mcl_mob_allow_nav_hacks (Mob navigation hacks) bool false + [Audio] # Enable flame sound. flame_sound (Flame sound) bool true From 71282e196eda35f748506de8918bf3433b5c5dde Mon Sep 17 00:00:00 2001 From: codiac Date: Sun, 24 Sep 2023 22:19:06 +1000 Subject: [PATCH 281/982] Move mob nav hacks to Experimental --- settingtypes.txt | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/settingtypes.txt b/settingtypes.txt index 0b466f76f..6d4bfb9e8 100644 --- a/settingtypes.txt +++ b/settingtypes.txt @@ -207,10 +207,6 @@ mcl_mobs_overworld_threshold (Artificial light threshold to stop monster spawns mcl_mobs_overworld_sky_threshold (Skylight threshold to stop monster spawns in the Overworld) int 7 0 14 mcl_mobs_overworld_passive_threshold (Combined light threshold to stop animal and npc spawns in the Overworld) int 7 0 14 -# Enable workarounds for faulty mob navigation. -# Hack 1: teleport golems home if they are very far from home -mcl_mob_allow_nav_hacks (Mob navigation hacks) bool false - [Audio] # Enable flame sound. flame_sound (Flame sound) bool true @@ -294,6 +290,10 @@ fix_doubleplants (Mcimport double plant fixes) bool true # Allow players to create Minecraft-like maps. enable_real_maps (Enable Real Maps) bool true +# Enable workarounds for faulty mob navigation. +# Hack 1: teleport golems home if they are very far from home +mcl_mob_allow_nav_hacks (Mob navigation hacks) bool false + [Additional Features] # Enable Bookshelf inventories mcl_bookshelf_inventories (Enable bookshelf inventories) bool true From 32ef89aca3c0e2ac7072712694f7b98b7638ecb4 Mon Sep 17 00:00:00 2001 From: Aliaksei Urbanski Date: Sat, 11 Nov 2023 21:01:45 +0000 Subject: [PATCH 282/982] Fix minor README's imperfections (#4001) I've prepared some minor changes for `README`s. Reviewed-on: https://git.minetest.land/MineClone2/MineClone2/pulls/4001 Reviewed-by: the-real-herowl Co-authored-by: Aliaksei Urbanski Co-committed-by: Aliaksei Urbanski --- README.md | 14 +++++++------- README_locale/README.fr.md | 2 +- README_locale/README.ru.md | 6 +++--- 3 files changed, 11 insertions(+), 11 deletions(-) diff --git a/README.md b/README.md index 287ded5d9..4dc0ee92d 100644 --- a/README.md +++ b/README.md @@ -27,7 +27,7 @@ Or you can play in “creative mode” in which you can build almost anything in ## How to play (quick start) ### Getting started * **Punch a tree** trunk until it breaks and collect wood -* Place the **wood into the 2×2 grid** (your “crafting grid” in your inventory menu and craft 4 wood planks +* Place the **wood into the 2×2 grid** (your “crafting grid” in your inventory menu) and craft 4 wood planks * Place the 4 wood planks in a 2×2 shape in the crafting grid to **make a crafting table** * **Rightclick the crafting table** for a 3×3 crafting grid to craft more complex things * Use the **crafting guide** (book icon) to learn all the possible crafting recipes @@ -37,15 +37,15 @@ Or you can play in “creative mode” in which you can build almost anything in ### Farming * Find seeds -* Craft hoe -* Rightclick dirt or similar block with hoe to create farmland +* Craft a hoe +* Rightclick dirt or a similar block with a hoe to create farmland * Place seeds on farmland and watch them grow -* Collect plant when fully grown +* Collect plants when fully grown * If near water, farmland becomes wet and speeds up growth ### Furnace -* Craft furnace -* Furnace allows you to obtain more items +* Craft a furnace +* The furnace allows you to obtain more items * Upper slot must contain a smeltable item (example: iron ore) * Lower slot must contain a fuel item (example: coal) * See tooltips in crafting guide to learn about fuels and smeltable items @@ -162,7 +162,7 @@ Bonus features (not found in Minecraft): * Built-in crafting guide which shows you crafting and smelting recipes * In-game help system containing extensive help about gameplay basics, blocks, items and more * Temporary crafting recipes. They only exist to make some otherwise unaccessible items available when you're not in creative mode. These recipes will be removed as development goes on an more features become available -* Saplings in chests in mapgen v6 +* Saplings in chests in [mapgen v6](https://wiki.minetest.net/Map_generator#v6) * Fully moddable (thanks to Minetest's powerful Lua API) * New blocks and items: * Lookup tool, shows you the help for whatever it touches diff --git a/README_locale/README.fr.md b/README_locale/README.fr.md index 9317f09f3..624e540da 100644 --- a/README_locale/README.fr.md +++ b/README_locale/README.fr.md @@ -137,7 +137,7 @@ Fonctionnalités bonus (absentes de Minecraft) : * Guide d'artisanat intégré au jeu qui montre les recettes d'artisanat et de cuisson * Système d'aide intégré au jeu contenant des informations à propos des techniques de base, blocs, objets et plus * Recettes d'artisanat temporaires. Elles existent uniquement pour rendre des objets accessibles qui ne le seraient pas autrement sauf en mode créatif. Elles seront retirées au cours de l'avancement du développement et de l'ajout de nouvelles fonctionnalités. -* Pousses dans les coffres en mapgen v6 +* Pousses dans les coffres en [mapgen v6](https://wiki.minetest.net/Map_generator#v6) * Entièrement moddable (grâce la puissante API Lua de Minetest) * Nouveaux blocs et objets : * Outil de recherche, montre l'aide de ce qu'il touche diff --git a/README_locale/README.ru.md b/README_locale/README.ru.md index ebf7f0b26..99fe93db8 100644 --- a/README_locale/README.ru.md +++ b/README_locale/README.ru.md @@ -154,12 +154,12 @@ Mineclone2, то ветка master обычно относительно ста * Некоторые вагонетки (с сундуком и с воронкой уже работают) * Пара нетривиальных блоков и предметов -Бонусные воронкой (нет в Minecraft-е): +Бонусные возможности (нет в Minecraft-е): * Встроенный гайд для крафта покажет вам рецепты крафта и переплавки * Внутриигровая справка содержит всестороннюю информацию об основах игры, блоках, предметах и прочее * Временные рецепты крафта. Они существуют, чтобы получить доступ к ранее недоступным предметам вне творческого режима. Они будут удалены как только разработка позволит им стать доступными -* Саженцы в сундуках мапгена v6 +* Саженцы в сундуках в [mapgen v6](https://wiki.minetest.net/Map_generator#v6) * Полностью модифицируема (благодаря мощному Lua API в Minetest) * Новые блоки и предметы: * Инструмент просмотра покажет справку о том чего коснется @@ -177,7 +177,7 @@ Mineclone2, то ветка master обычно относительно ста * Недостающие блоки, предметы, мобы * Некоторые предметы с другими названиями, чтобы лучше их различать * Другая музыка для проигрывателей -* Другие текступы (Pixel Perfection) +* Другие текстуры (Pixel Perfection) * Другие звуки (разные источники) * Другой движок (Minetest) * Другие пасхалки From 378b8f8f6c181086a4f71cc1987028cdec2a4909 Mon Sep 17 00:00:00 2001 From: the-real-herowl Date: Mon, 13 Nov 2023 13:35:12 +0100 Subject: [PATCH 283/982] Fix item not dropping at tool last use --- mods/ENTITIES/mcl_item_entity/init.lua | 113 +++++++++++++++++++++++++ 1 file changed, 113 insertions(+) diff --git a/mods/ENTITIES/mcl_item_entity/init.lua b/mods/ENTITIES/mcl_item_entity/init.lua index 149b5ed93..2feeb640c 100644 --- a/mods/ENTITIES/mcl_item_entity/init.lua +++ b/mods/ENTITIES/mcl_item_entity/init.lua @@ -362,6 +362,119 @@ function minetest.handle_node_drops(pos, drops, digger) end end +local function user_name(user) + return user and user:get_player_name() or "" +end + +-- Returns a logging function. For empty names, does not log. +local function make_log(name) + return name ~= "" and minetest.log or function() end +end + +function minetest.node_dig(pos, node, digger) + local diggername = user_name(digger) + local log = make_log(diggername) + local def = minetest.registered_nodes[node.name] + -- Copy pos because the callback could modify it + if def and (not def.diggable or + (def.can_dig and not def.can_dig(vector.copy(pos), digger))) then + log("info", diggername .. " tried to dig " + .. node.name .. " which is not diggable " + .. minetest.pos_to_string(pos)) + return false + end + + if minetest.is_protected(pos, diggername) then + log("action", diggername + .. " tried to dig " .. node.name + .. " at protected position " + .. minetest.pos_to_string(pos)) + minetest.record_protection_violation(pos, diggername) + return false + end + + log('action', diggername .. " digs " + .. node.name .. " at " .. minetest.pos_to_string(pos)) + + local wielded = digger and digger:get_wielded_item() + local drops = minetest.get_node_drops(node, wielded and wielded:get_name()) + + -- Check to see if metadata should be preserved. + if def and def.preserve_metadata then + local oldmeta = minetest.get_meta(pos):to_table().fields + -- Copy pos and node because the callback can modify them. + local pos_copy = vector.copy(pos) + local node_copy = {name=node.name, param1=node.param1, param2=node.param2} + local drop_stacks = {} + for k, v in pairs(drops) do + drop_stacks[k] = ItemStack(v) + end + drops = drop_stacks + def.preserve_metadata(pos_copy, node_copy, oldmeta, drops) + end + + -- Handle drops + minetest.handle_node_drops(pos, drops, digger) + + if wielded then + local wdef = wielded:get_definition() + local tp = wielded:get_tool_capabilities() + local dp = minetest.get_dig_params(def and def.groups, tp, wielded:get_wear()) + if wdef and wdef.after_use then + wielded = wdef.after_use(wielded, digger, node, dp) or wielded + else + -- Wear out tool + if not minetest.is_creative_enabled(diggername) then + wielded:add_wear(dp.wear) + if wielded:get_count() == 0 and wdef.sound and wdef.sound.breaks then + minetest.sound_play(wdef.sound.breaks, { + pos = pos, + gain = 0.5 + }, true) + end + end + end + digger:set_wielded_item(wielded) + end + + local oldmetadata = nil + if def and def.after_dig_node then + oldmetadata = minetest.get_meta(pos):to_table() + end + + -- Remove node and update + minetest.remove_node(pos) + + -- Play sound if it was done by a player + if diggername ~= "" and def and def.sounds and def.sounds.dug then + minetest.sound_play(def.sounds.dug, { + pos = pos, + exclude_player = diggername, + }, true) + end + + -- Run callback + if def and def.after_dig_node then + -- Copy pos and node because callback can modify them + local pos_copy = vector.copy(pos) + local node_copy = {name=node.name, param1=node.param1, param2=node.param2} + def.after_dig_node(pos_copy, node_copy, oldmetadata, digger) + end + + -- Run script hook + for _, callback in ipairs(minetest.registered_on_dignodes) do + local origin = minetest.callback_origins[callback] + minetest.set_last_run_mod(origin.mod) + + -- Copy pos and node because callback can modify them + local pos_copy = vector.copy(pos) + local node_copy = {name=node.name, param1=node.param1, param2=node.param2} + callback(pos_copy, node_copy, digger) + end + + return true +end + -- Drop single items by default function minetest.item_drop(itemstack, dropper, pos) if dropper and dropper:is_player() then From a764818e13522dac881bb5078da78bc10d92956a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mikita=20Wi=C5=9Bniewski?= Date: Tue, 14 Nov 2023 15:35:30 +0000 Subject: [PATCH 284/982] Add a new 'pumpkin' group (#4012) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Creates a new 'pumpkin' group, which combines Pumpkin, Faceless Pumkin and Jack o'Lantern under a shared category. This helps tidy up the mesecons_noteblock code a bit, and possibly other mods too. Reviewed-on: https://git.minetest.land/MineClone2/MineClone2/pulls/4012 Reviewed-by: the-real-herowl Co-authored-by: Mikita Wiśniewski Co-committed-by: Mikita Wiśniewski --- mods/ITEMS/REDSTONE/mesecons_noteblock/init.lua | 4 ++-- mods/ITEMS/mcl_farming/pumpkin.lua | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/mods/ITEMS/REDSTONE/mesecons_noteblock/init.lua b/mods/ITEMS/REDSTONE/mesecons_noteblock/init.lua index ac56d8bc5..b841545b3 100644 --- a/mods/ITEMS/REDSTONE/mesecons_noteblock/init.lua +++ b/mods/ITEMS/REDSTONE/mesecons_noteblock/init.lua @@ -152,8 +152,6 @@ function mesecon.noteblock_play(pos, param2) soundname="mesecons_noteblock_xylophone_metal" elseif block_below_name == "mcl_nether:soul_sand" then soundname="mesecons_noteblock_cowbell" - elseif block_below_name == "mcl_farming:pumpkin" or block_below_name == "mcl_farming:pumpkin_face" or block_below_name == "mcl_farming:pumpkin_face_light" then - soundname="mesecons_noteblock_didgeridoo" elseif block_below_name == "mcl_core:emeraldblock" then soundname="mesecons_noteblock_squarewave" elseif block_below_name == "mcl_farming:hay_block" then @@ -162,6 +160,8 @@ function mesecon.noteblock_play(pos, param2) soundname="mesecons_noteblock_piano_digital" elseif minetest.get_item_group(block_below_name, "wool") ~= 0 then soundname="mesecons_noteblock_guitar" + elseif minetest.get_item_group(block_below_name, "pumpkin") ~= 0 then + soundname="mesecons_noteblock_didgeridoo" elseif minetest.get_item_group(block_below_name, "material_glass") ~= 0 then soundname="mesecons_noteblock_hit" elseif minetest.get_item_group(block_below_name, "material_wood") ~= 0 then diff --git a/mods/ITEMS/mcl_farming/pumpkin.lua b/mods/ITEMS/mcl_farming/pumpkin.lua index 7387a78c9..7354c0038 100644 --- a/mods/ITEMS/mcl_farming/pumpkin.lua +++ b/mods/ITEMS/mcl_farming/pumpkin.lua @@ -101,7 +101,7 @@ local pumpkin_base_def = { tiles = {"farming_pumpkin_top.png", "farming_pumpkin_top.png", "farming_pumpkin_side.png"}, groups = { handy = 1, axey = 1, plant = 1, building_block = 1, dig_by_piston = 1, dig_immediate_piston = 1, - enderman_takable = 1, compostability = 65 + pumpkin = 1, enderman_takable = 1, compostability = 65 }, sounds = mcl_sounds.node_sound_wood_defaults(), on_rotate = on_rotate, @@ -199,7 +199,7 @@ minetest.register_node("mcl_farming:pumpkin_face_light", { paramtype2 = "facedir", light_source = minetest.LIGHT_MAX, tiles = {"farming_pumpkin_top.png", "farming_pumpkin_top.png", "farming_pumpkin_side.png", "farming_pumpkin_side.png", "farming_pumpkin_side.png", "farming_pumpkin_face_light.png"}, - groups = {handy=1,axey=1, building_block=1, dig_by_piston=1 }, + groups = {handy=1, axey=1, pumpkin=1, building_block=1, dig_by_piston=1 }, sounds = mcl_sounds.node_sound_wood_defaults(), on_construct = function(pos) -- Attempt to spawn iron golem or snow golem From e53d9ec8d73bb634bfbab6f9cc3bbc14159344e3 Mon Sep 17 00:00:00 2001 From: the-real-herowl Date: Sat, 18 Nov 2023 02:30:33 +0100 Subject: [PATCH 285/982] Added comments --- mods/ENTITIES/mcl_item_entity/init.lua | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/mods/ENTITIES/mcl_item_entity/init.lua b/mods/ENTITIES/mcl_item_entity/init.lua index 2feeb640c..c12bd045e 100644 --- a/mods/ENTITIES/mcl_item_entity/init.lua +++ b/mods/ENTITIES/mcl_item_entity/init.lua @@ -362,15 +362,16 @@ function minetest.handle_node_drops(pos, drops, digger) end end +-- the following code is pulled from Minetest builtin without changes except for the call order being changed, +-- until a comment saying explicitly it's the end of such code +-- TODO if this gets a fix in the engine, remove the block of code local function user_name(user) return user and user:get_player_name() or "" end - -- Returns a logging function. For empty names, does not log. local function make_log(name) return name ~= "" and minetest.log or function() end end - function minetest.node_dig(pos, node, digger) local diggername = user_name(digger) local log = make_log(diggername) @@ -474,6 +475,7 @@ function minetest.node_dig(pos, node, digger) return true end +-- end of code pulled from Minetest -- Drop single items by default function minetest.item_drop(itemstack, dropper, pos) From 6ee2dbe70c2f082421dafafc368a243c3e04b849 Mon Sep 17 00:00:00 2001 From: chmodsayshello Date: Sat, 18 Nov 2023 21:21:17 +0000 Subject: [PATCH 286/982] Add MineCraft like sleeping player hud (#4011) This adds a sleeping hud/actionbar that'll be displayed to players currently not sleeping. Reviewed-on: https://git.minetest.land/MineClone2/MineClone2/pulls/4011 Reviewed-by: the-real-herowl Co-authored-by: chmodsayshello Co-committed-by: chmodsayshello --- mods/ITEMS/mcl_beds/functions.lua | 9 +++++++++ mods/ITEMS/mcl_beds/locale/mcl_beds.de.tr | 3 ++- mods/ITEMS/mcl_beds/locale/template.txt | 3 ++- 3 files changed, 13 insertions(+), 2 deletions(-) diff --git a/mods/ITEMS/mcl_beds/functions.lua b/mods/ITEMS/mcl_beds/functions.lua index fdb4f8f41..6c59fff04 100644 --- a/mods/ITEMS/mcl_beds/functions.lua +++ b/mods/ITEMS/mcl_beds/functions.lua @@ -383,6 +383,15 @@ function mcl_beds.on_rightclick(pos, player, is_top) end if message then mcl_title.set(player, "actionbar", {text=message, color="white", stay=60}) + else -- someone just successfully entered a bed + local connected_players = minetest.get_connected_players() + local sleep_hud_message = S("@1/@2 players currently in bed.", player_in_bed, players_in_bed_setting() * #connected_players / 100) + for _, player in pairs(connected_players) do + if not mcl_beds.player[player:get_player_name()] then -- only send message to players not sleeping. + if mcl_title.params_get(player) then mcl_title.clear(player) end -- clear, old message is still being displayed + mcl_title.set(player, "actionbar", {text=sleep_hud_message, color="white", stay=60}) + end + end end else lay_down(player, nil, nil, false) diff --git a/mods/ITEMS/mcl_beds/locale/mcl_beds.de.tr b/mods/ITEMS/mcl_beds/locale/mcl_beds.de.tr index 97867b44b..6771596a5 100644 --- a/mods/ITEMS/mcl_beds/locale/mcl_beds.de.tr +++ b/mods/ITEMS/mcl_beds/locale/mcl_beds.de.tr @@ -46,4 +46,5 @@ send!=senden! You are missing the 'shout' privilege! It's required in order to talk in chat...=Ihnen fehlt das 'shout' Privileg! Es wird benötigt, um im Chat reden zu können... You exceeded the maximum number of messages per 10 seconds!=Sie haben die maximale Anzahl an Chatnachrichten pro 10 Sekunden überschritten! Hey! Would you guys mind sleeping?=Hey, würdet Ihr bitte zu Bett gehen? -Sorry, but you have to wait @1 seconds until you may use this button again!=Sie müssen leider noch @1 Sekunden warten, bevor sie diesen Knopf erneut benutzen können! \ No newline at end of file +Sorry, but you have to wait @1 seconds until you may use this button again!=Sie müssen leider noch @1 Sekunden warten, bevor sie diesen Knopf erneut benutzen können! +@1/@2 players currently in bed.=@1/@2 Spieler aktuell im Bett. \ No newline at end of file diff --git a/mods/ITEMS/mcl_beds/locale/template.txt b/mods/ITEMS/mcl_beds/locale/template.txt index 42e59509e..e604299e0 100644 --- a/mods/ITEMS/mcl_beds/locale/template.txt +++ b/mods/ITEMS/mcl_beds/locale/template.txt @@ -46,4 +46,5 @@ send!= You are missing the 'shout' privilege! It's required in order to talk in chat...= You exceeded the maximum number of messages per 10 seconds!= Hey! Would you guys mind sleeping?= -Sorry, but you have to wait @1 seconds until you may use this button again!= \ No newline at end of file +Sorry, but you have to wait @1 seconds until you may use this button again!= +@1/@2 players currently in bed.= \ No newline at end of file From 4df6f82c649f5899288aa88511880de0648d78fd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jos=C3=A9=20M?= Date: Sat, 18 Nov 2023 22:20:02 +0000 Subject: [PATCH 287/982] Fix spanish translation errors (#4018) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Reviewed-on: https://git.minetest.land/MineClone2/MineClone2/pulls/4018 Reviewed-by: the-real-herowl Co-authored-by: José M Co-committed-by: José M --- mods/ENVIRONMENT/lightning/locale/lightning.es.tr | 3 +-- mods/HUD/mcl_achievements/locale/mcl_achievements.es.tr | 7 +++++-- .../REDSTONE/mcl_dispensers/locale/mcl_dispensers.es.tr | 5 ++++- 3 files changed, 10 insertions(+), 5 deletions(-) diff --git a/mods/ENVIRONMENT/lightning/locale/lightning.es.tr b/mods/ENVIRONMENT/lightning/locale/lightning.es.tr index 5d207a5c6..3b164f530 100644 --- a/mods/ENVIRONMENT/lightning/locale/lightning.es.tr +++ b/mods/ENVIRONMENT/lightning/locale/lightning.es.tr @@ -1,4 +1,3 @@ # textdomain: lightning -@1 was struck by lightning.=@ 1 fue alcanzado por un rayo. -Let lightning strike at the specified position or yourself=Deje que un rayo golpee en la posición especificada o sobre usted mismo. +Let lightning strike at the specified position or player.No parameter will strike yourself.=Deje que un rayo golpee en la posición especificada o jugador.Ningún parámetro le golpeará a usted mismo. No position specified and unknown player=Ninguna posición especificada y jugador desconocido diff --git a/mods/HUD/mcl_achievements/locale/mcl_achievements.es.tr b/mods/HUD/mcl_achievements/locale/mcl_achievements.es.tr index 6f00d76b7..19f18703b 100644 --- a/mods/HUD/mcl_achievements/locale/mcl_achievements.es.tr +++ b/mods/HUD/mcl_achievements/locale/mcl_achievements.es.tr @@ -108,7 +108,10 @@ Put lava in a bucket.=Pon lava en un cubo. Hero of the Village=Héroe de la aldea Successfully defend a village from a raid=Defiende una aldea de una invasión Voluntary Exile=Exilio voluntario -Kill a raid captain. Maybe consider staying away from the local villages for the time being...=Mata al capitán de una invasión. -Sería mejor alejarte de las aldeas por un tiempo... +Kill a raid captain. Maybe consider staying away from the local villages for the time being...=Mata al capitán de una invasión. Sería mejor alejarte de las aldeas por un tiempo... Tactical Fishing=Pesca táctica Catch a fish... without a fishing rod!=Atrapa a un pez... ¡sin una caña de pescar! +Crafting a New Look=Forjando una nueva imagen +Craft a trimmed armor at a Smithing Table=Decora una armadura en una mesa de herrería +Smithing with Style=Forjando con estilo +Apply these smithing templates at least once: Spire, Snout, Rib, Ward, Silence, Vex, Tide, Wayfinder=Aplica estos moldes de herrería al menos una vez: agujas, hocico, costillas, guardián, silencio, vex, mareas, buscacaminos diff --git a/mods/ITEMS/REDSTONE/mcl_dispensers/locale/mcl_dispensers.es.tr b/mods/ITEMS/REDSTONE/mcl_dispensers/locale/mcl_dispensers.es.tr index cf695307a..1b1481f5c 100644 --- a/mods/ITEMS/REDSTONE/mcl_dispensers/locale/mcl_dispensers.es.tr +++ b/mods/ITEMS/REDSTONE/mcl_dispensers/locale/mcl_dispensers.es.tr @@ -2,12 +2,13 @@ Dispenser=Dispensador A dispenser is a block which acts as a redstone component which, when powered with redstone power, dispenses an item. It has a container with 9 inventory slots.=Un dispensador es un bloque que actúa como un componente de redstone que, cuando se alimenta con energía de redstone, dispensa un artículo. Tiene un contenedor con 9 ranuras de inventario. Place the dispenser in one of 6 possible directions. The “hole” is where items will fly out of the dispenser. Use the dispenser to access its inventory. Insert the items you wish to dispense. Supply the dispenser with redstone energy once to dispense a random item.=Coloque el dispensador en una de las 6 direcciones posibles. El "agujero" es donde los artículos saldrán volando del dispensador. Use el dispensador para acceder a su inventario. Inserte los artículos que desea dispensar. Proporcione al dispensador energía de redstone una vez para dispensar un elemento aleatorio: +The dispenser will do different things, depending on the dispensed item:= El dispensador hará diferentes cosas, dependiendo del artículo dispensado: • Arrows: Are launched=• Flechas: Se lanzan • Eggs and snowballs: Are thrown=• Huevos y bolas de nieve: Son lanzados • Fire charges: Are fired in a straight line=• Cargas de fuego: Se disparan en línea recta • Armor: Will be equipped to players and armor stands=• Armadura: Estará equipada para jugadores y armaduras • Boats: Are placed on water or are dropped=• Barcas: Se colocan en el agua o se dejan caer -• Minecart: Are placed on rails or are dropped=• Carro de minas: Se colocan sobre rieles o se dejan caer = +• Minecart: Are placed on rails or are dropped=• Carro de minas: Se colocan sobre rieles o se dejan caer • Bone meal: Is applied on the block it is facing=• Harina de hueso: Se aplica en el bloque que está enfrentando • Empty buckets: Are used to collect a liquid source=• Cubos vacíos: Se utilizan para recolectar una fuente líquida • Filled buckets: Are used to place a liquid source=• Cubos llenos: Se utilizan para colocar una fuente de líquido @@ -20,3 +21,5 @@ Place the dispenser in one of 6 possible directions. The “hole” is where ite Downwards-Facing Dispenser=Dispensador orientado hacia abajo Upwards-Facing Dispenser=Dispensador orientado hacia arriba Inventory=Inventario +9 inventory slots=9 ranuras de inventario +Launches item when powered by redstone power=Laza un artículo cuando recibe energía de redstone From 7cbba73d50b63954c401c53f8a041e1f4f6c8e08 Mon Sep 17 00:00:00 2001 From: Eliy21 Date: Thu, 23 Nov 2023 00:32:23 +0000 Subject: [PATCH 288/982] Combat (mostly PvE) rebalancing (#4005) -Added short mob invulnerability time after being hit -Added separate shorter range for hitting mobs (as opposed to node interaction) -Reworked mob knockback -Slowed down natural health regeneration from saturation -Added a setting for the saturation health regen speed Reviewed-on: https://git.minetest.land/MineClone2/MineClone2/pulls/4005 Reviewed-by: the-real-herowl Co-authored-by: Eliy21 Co-committed-by: Eliy21 --- mods/ENTITIES/mcl_mobs/combat.lua | 44 ++++++++++++++++++++++++++----- mods/ENTITIES/mcl_mobs/init.lua | 1 + mods/ITEMS/mcl_bows/bow.lua | 2 +- mods/PLAYER/mcl_hunger/init.lua | 5 ++-- settingtypes.txt | 4 +++ 5 files changed, 46 insertions(+), 10 deletions(-) diff --git a/mods/ENTITIES/mcl_mobs/combat.lua b/mods/ENTITIES/mcl_mobs/combat.lua index 7775c1b8e..6952f6581 100644 --- a/mods/ENTITIES/mcl_mobs/combat.lua +++ b/mods/ENTITIES/mcl_mobs/combat.lua @@ -532,11 +532,28 @@ function mob_class:on_punch(hitter, tflp, tool_capabilities, dir) return end + local time_now = minetest.get_us_time() + local is_player = hitter:is_player() if is_player then + local time_diff = time_now - self.invul_timestamp + + -- check for invulnerability time in microseconds (0.5 second) + if time_diff <= 500000 and time_diff >= 0 then + return + end + + local mob_pos = self.object:get_pos() + local player_pos = hitter:get_pos() + + -- is mob out of reach? + if vector.distance(mob_pos, player_pos) > 3 then + return + end + -- is mob protected? - if self.protected and minetest.is_protected(self.object:get_pos(), hitter:get_player_name()) then + if self.protected and minetest.is_protected(mob_pos, hitter:get_player_name()) then return end @@ -545,7 +562,7 @@ function mob_class:on_punch(hitter, tflp, tool_capabilities, dir) end -- set/update 'drop xp' timestamp if hitted by player - self.xp_timestamp = minetest.get_us_time() + self.xp_timestamp = time_now end @@ -657,6 +674,9 @@ function mob_class:on_punch(hitter, tflp, tool_capabilities, dir) -- do damage self.health = self.health - damage + -- give invulnerability + self.invul_timestamp = time_now + -- skip future functions if dead, except alerting others if self:check_for_death( "hit", {type = "punch", puncher = hitter}) then die = true @@ -672,10 +692,10 @@ function mob_class:on_punch(hitter, tflp, tool_capabilities, dir) if not v then return end local r = 1.4 - math.min(punch_interval, 1.4) local kb = r * (math.abs(v.x)+math.abs(v.z)) - local up = 2 + local up = 2.625 if die==true then - kb=kb*2 + kb=kb*1.25 end -- if already in air then dont go up anymore when hit @@ -689,7 +709,7 @@ function mob_class:on_punch(hitter, tflp, tool_capabilities, dir) if tool_capabilities.damage_groups["knockback"] then kb = tool_capabilities.damage_groups["knockback"] else - kb = kb * 1.5 + kb = kb * 1.25 end @@ -699,9 +719,19 @@ function mob_class:on_punch(hitter, tflp, tool_capabilities, dir) end if hitter and is_player then local wielditem = hitter:get_wielded_item() - kb = kb + 3 * mcl_enchanting.get_enchantment(wielditem, "knockback") - elseif luaentity and luaentity._knockback then + local hv = hitter:get_velocity() + local dir_dot = (hv.x * dir.x) + (hv.z * dir.z) + local player_mag = math.sqrt((hv.x * hv.x) + (hv.z * hv.z)) + local mob_mag = math.sqrt((v.x * v.x) + (v.z * v.z)) + kb = kb + 9 * mcl_enchanting.get_enchantment(wielditem, "knockback") + -- add player velocity to mob knockback + if dir_dot > 0 and mob_mag <= player_mag * 0.625 then + kb = kb + ((math.abs(hv.x) + math.abs(hv.z)) * r) + end + elseif luaentity and luaentity._knockback and die == false then kb = kb + luaentity._knockback + elseif luaentity and luaentity._knockback and die == true then + kb = kb + luaentity._knockback * 0.25 end self._kb_turn = true self._turn_to=self.object:get_yaw()-1.57 diff --git a/mods/ENTITIES/mcl_mobs/init.lua b/mods/ENTITIES/mcl_mobs/init.lua index 843315039..630548f12 100644 --- a/mods/ENTITIES/mcl_mobs/init.lua +++ b/mods/ENTITIES/mcl_mobs/init.lua @@ -171,6 +171,7 @@ function mcl_mobs.register_mob(name, def) xp_min = def.xp_min or 0, xp_max = def.xp_max or 0, xp_timestamp = 0, + invul_timestamp = 0, breath_max = def.breath_max or 15, breathes_in_water = def.breathes_in_water or false, physical = true, diff --git a/mods/ITEMS/mcl_bows/bow.lua b/mods/ITEMS/mcl_bows/bow.lua index 23b6b4310..174208c3c 100644 --- a/mods/ITEMS/mcl_bows/bow.lua +++ b/mods/ITEMS/mcl_bows/bow.lua @@ -48,7 +48,7 @@ function mcl_bows.shoot_arrow(arrow_item, pos, dir, yaw, shooter, power, damage, damage = damage + (enchantments.power + 1) / 4 end if enchantments.punch then - knockback = enchantments.punch * 3 + knockback = enchantments.punch * 21 end if enchantments.flame then mcl_burning.set_on_fire(obj, math.huge) diff --git a/mods/PLAYER/mcl_hunger/init.lua b/mods/PLAYER/mcl_hunger/init.lua index 321139c5f..cc3965f57 100644 --- a/mods/PLAYER/mcl_hunger/init.lua +++ b/mods/PLAYER/mcl_hunger/init.lua @@ -146,8 +146,9 @@ minetest.register_globalstep(function(dtime) local food_level = mcl_hunger.get_hunger(player) local food_saturation_level = mcl_hunger.get_saturation(player) local player_health = player:get_hp() + local max_tick_timer = tonumber(minetest.settings:get("mcl_health_regen_delay")) or 4 - if food_tick_timer > 4.0 then + if food_tick_timer > max_tick_timer then food_tick_timer = 0 -- let hunger work always @@ -173,7 +174,7 @@ minetest.register_globalstep(function(dtime) end end - elseif food_tick_timer > 0.5 and food_level == 20 and food_saturation_level > 0 then -- fast regeneration + elseif food_tick_timer > max_tick_timer and food_level == 20 and food_saturation_level > 0 then -- fast regeneration if player_health > 0 and player_health < 20 then food_tick_timer = 0 player:set_hp(player_health+1) diff --git a/settingtypes.txt b/settingtypes.txt index 6d4bfb9e8..c2f97c817 100644 --- a/settingtypes.txt +++ b/settingtypes.txt @@ -95,6 +95,10 @@ mcl_creative_dig_speed (Creative mode dig speed) float 0.2 # If enabled the hunger mechanic will be active mcl_enable_hunger (Hunger mechanic) bool true +# Health regeneration delay when hunger bar is full +# Default:4 +mcl_health_regen_delay (Health regen delay) float 4 0 + [Mobs] # If enabled, mobs will spawn naturally. This does not affect # affect mob spawners. From 86da47b922df22fd36e1121ea8e1d2fb3e6c8dfc Mon Sep 17 00:00:00 2001 From: 3raven <3raven@noreply.git.minetest.land> Date: Sat, 25 Nov 2023 01:08:06 +0000 Subject: [PATCH 289/982] French translation update (#4006) Update french translation, add missing chain, fix typo Reviewed-on: https://git.minetest.land/MineClone2/MineClone2/pulls/4006 Reviewed-by: AFCMS Co-authored-by: 3raven <3raven@noreply.git.minetest.land> Co-committed-by: 3raven <3raven@noreply.git.minetest.land> --- .../ENTITIES/mcl_boats/locale/mcl_boats.fr.tr | 2 ++ mods/ENTITIES/mobs_mc/locale/mobs_mc.fr.tr | 14 +++++++++-- .../mcl_raids/locale/mcl_raids.fr.tr | 2 ++ mods/HELP/mcl_doc/locale/template.txt | 1 + mods/HUD/awards/locale/awards.fr.tr | 6 +++++ .../locale/mcl_achievements.fr.tr | 4 ++++ mods/HUD/mcl_credits/locale/mcl_credits.fr.tr | 7 +++++- .../mcl_ver_info/locale/mcl_ver_info.fr.tr | 1 + mods/ITEMS/REDSTONE/mesecons_button/init.lua | 2 +- .../locale/mesecons_button.fr.tr | 1 + .../locale/mesecons_button.ru.tr | 2 +- .../mesecons_button/locale/template.txt | 2 +- mods/ITEMS/mcl_armor/locale/mcl_armor.fr.tr | 3 ++- mods/ITEMS/mcl_bamboo/locale/mcl_bamboo.fr.tr | 1 + .../mcl_banners/locale/mcl_banners.fr.tr | 1 + mods/ITEMS/mcl_beds/locale/mcl_beds.fr.tr | 6 +++++ mods/ITEMS/mcl_bows/locale/mcl_bows.fr.tr | 2 +- .../locale/mcl_cherry_blossom.fr.tr | 24 +++++++++++++++++++ mods/ITEMS/mcl_doors/locale/mcl_doors.fr.tr | 2 ++ .../locale/mcl_flowerpots.fr.tr | 1 + .../mcl_portals/locale/mcl_portals.fr.tr | 12 +++++----- .../mcl_sus_stew/locale/mcl_sus_stew.fr.tr | 2 ++ mods/PLAYER/mcl_music/locale/mcl_music.fr.tr | 7 ++++++ 23 files changed, 91 insertions(+), 14 deletions(-) create mode 100644 mods/ENVIRONMENT/mcl_raids/locale/mcl_raids.fr.tr create mode 100644 mods/ITEMS/mcl_cherry_blossom/locale/mcl_cherry_blossom.fr.tr create mode 100644 mods/ITEMS/mcl_sus_stew/locale/mcl_sus_stew.fr.tr create mode 100644 mods/PLAYER/mcl_music/locale/mcl_music.fr.tr diff --git a/mods/ENTITIES/mcl_boats/locale/mcl_boats.fr.tr b/mods/ENTITIES/mcl_boats/locale/mcl_boats.fr.tr index e1ecd9b01..2ea047154 100644 --- a/mods/ENTITIES/mcl_boats/locale/mcl_boats.fr.tr +++ b/mods/ENTITIES/mcl_boats/locale/mcl_boats.fr.tr @@ -12,6 +12,7 @@ Water vehicle=Véhicule aquatique Sneak to dismount=Se baisser pour descendre Obsidian Boat=Bateau en obsidienne Mangrove Boat=Bateau en palétuvier +Cherry Boat=Bateau en cerisier Oak Chest Boat=Bateau en chêne avec coffre Spruce Chest Boat=Bateau en sapin avec coffre Birch Chest Boat=Bateau en bouleau avec coffre @@ -19,3 +20,4 @@ Jungle Chest Boat=Bateau en acajou avec coffre Acacia Chest Boat=Bateau en acacia avec coffre Dark Oak Chest Boat=Bateau en chêne noir avec coffre Mangrove Chest Boat=Bateau en palétuvier avec coffre +Cherry Chest Boat=Bateau en cerisier avec coffre diff --git a/mods/ENTITIES/mobs_mc/locale/mobs_mc.fr.tr b/mods/ENTITIES/mobs_mc/locale/mobs_mc.fr.tr index 81c93a33b..2c71ff47e 100644 --- a/mods/ENTITIES/mobs_mc/locale/mobs_mc.fr.tr +++ b/mods/ENTITIES/mobs_mc/locale/mobs_mc.fr.tr @@ -21,6 +21,7 @@ Mule=Mule Iron Golem=Golem de fer Llama=Lama Ocelot=Ocelot +Cat=Chat Parrot=Perroquet Pig=Cochon Polar Bear=Ours blanc @@ -48,8 +49,15 @@ Witch=Sorcière Wither=Wither Wolf=Loup Husk=Zombie Momifié +Baby Husk=Bébé Zombie Momifié Zombie=Zombie -Zombie Piglin=Zombie Cochon +Baby Zombie=Bébé Zombie +Piglin=Piglin +Baby Piglin=Bébé Piglin +Zombie Piglin=Piglin Zombie +Baby Zombie Piglin=Bébé Piglin Zombie +Sword Piglin=Piglin avec une épée +Piglin Brute=Piglin Barbare Farmer=Fermier Fisherman=Pêcheur Fletcher=Archer @@ -69,5 +77,7 @@ Dolphin=Dauphin Pillager=Pilleur Tropical fish=Poisson tropical Hoglin=Hoglin +Baby hoglin=Bébé Hoglin +Zoglin=Zoglin Strider=Arpenteur -Glow Squid=Poulpe Brillant \ No newline at end of file +Glow Squid=Poulpe Brillant diff --git a/mods/ENVIRONMENT/mcl_raids/locale/mcl_raids.fr.tr b/mods/ENVIRONMENT/mcl_raids/locale/mcl_raids.fr.tr new file mode 100644 index 000000000..92d40e998 --- /dev/null +++ b/mods/ENVIRONMENT/mcl_raids/locale/mcl_raids.fr.tr @@ -0,0 +1,2 @@ +# textdomain: mcl_raids +Ominous Banner=Bannière de mauvais augure diff --git a/mods/HELP/mcl_doc/locale/template.txt b/mods/HELP/mcl_doc/locale/template.txt index de652f05e..ec825644c 100644 --- a/mods/HELP/mcl_doc/locale/template.txt +++ b/mods/HELP/mcl_doc/locale/template.txt @@ -2,6 +2,7 @@ Water can flow into this block and cause it to drop as an item.= This block can be turned into dirt with a hoe.= This block can be turned into farmland with a hoe.= +This block can be turned into grass path with a shovel.= This block acts as a soil for all saplings.= This block acts as a soil for some saplings.= Sugar canes will grow on this block.= diff --git a/mods/HUD/awards/locale/awards.fr.tr b/mods/HUD/awards/locale/awards.fr.tr index 567c86818..7c3fd2a84 100644 --- a/mods/HUD/awards/locale/awards.fr.tr +++ b/mods/HUD/awards/locale/awards.fr.tr @@ -62,3 +62,9 @@ Advancement “@1” does not exist.=Le progrès «@1» n'existe pas. Mine a block: @1=Miner un bloc : @1 Mine blocks: @1×@2=Miner des blocs : @1×@2 Awards are disabled, enable them first by using /awards enable!=Les récompenses sont désactivées, activez les d'abord en utilisant /awards enable ! +Goal Completed:=Objectif atteint : +Goal Completed!=Objectif atteint ! +Goal Completed: @1=Objectif atteint : @1 +Challenge Completed:=Défi relevé : +Challenge Completed!=Défi relevé ! +Challenge Completed: @1=Défi relevé : @1 diff --git a/mods/HUD/mcl_achievements/locale/mcl_achievements.fr.tr b/mods/HUD/mcl_achievements/locale/mcl_achievements.fr.tr index 95800d5e9..238846cc3 100644 --- a/mods/HUD/mcl_achievements/locale/mcl_achievements.fr.tr +++ b/mods/HUD/mcl_achievements/locale/mcl_achievements.fr.tr @@ -111,3 +111,7 @@ Voluntary Exile=Exil volontaire Kill a raid captain. Maybe consider staying away from the local villages for the time being...=Tuez un capitaine de pillards. Mieux vaut rester loin des villages pour l'instant... Tactical Fishing=Pêche tactique Catch a fish... without a fishing rod!=Attrapez un poisson... sans canne à pêche ! +Crafting a New Look=Motif de Jalousie +Craft a trimmed armor at a Smithing Table=Fabriquez une pièce d'armure ornée sur la table de forge +Smithing with Style=La classe de la cuirasse +Apply these smithing templates at least once: Spire, Snout, Rib, Ward, Silence, Vex, Tide, Wayfinder=Appliquez ces modèles de forge au moins une fois : Tour, Groin, Côte, Abîme, Silence, Vex, Marée, Éclaireur \ No newline at end of file diff --git a/mods/HUD/mcl_credits/locale/mcl_credits.fr.tr b/mods/HUD/mcl_credits/locale/mcl_credits.fr.tr index b34249eff..4007ad4bc 100644 --- a/mods/HUD/mcl_credits/locale/mcl_credits.fr.tr +++ b/mods/HUD/mcl_credits/locale/mcl_credits.fr.tr @@ -5,10 +5,15 @@ Contributors=Contributeurs Creator of MineClone=Créateur de MineClone Creator of MineClone2=Créateur de MineClone2 Developers=Développeurs +Past Developers=Anciens Développeurs Jump to speed up (additionally sprint)=Saut pour accélérer (peut être combiné avec sprint) Maintainers=Mainteneurs +Previous Maintainers=Anciens Mainteneurs MineClone5=MineClone5 Original Mod Authors=Auteurs des mods originaux Sneak to skip=Shift pour passer Textures=Textures -Translations=Traductions \ No newline at end of file +Translations=Traductions +Music=Musique +Funders=Fondateurs +Special thanks=Remerciements spéciaux diff --git a/mods/HUD/mcl_ver_info/locale/mcl_ver_info.fr.tr b/mods/HUD/mcl_ver_info/locale/mcl_ver_info.fr.tr index 3e6c9af6d..0a5d2bfd0 100644 --- a/mods/HUD/mcl_ver_info/locale/mcl_ver_info.fr.tr +++ b/mods/HUD/mcl_ver_info/locale/mcl_ver_info.fr.tr @@ -1,2 +1,3 @@ # textdomain: mcl_ver_info Sorry, but your version of Minetest doesn't support the latest API. Please upgrade your minetest.=Désolé, mais votre version de Minetest ne supporte la dernière API. Veuillez mettre à jour minetest. +Display Mineclone 2 game version.=Affiche la version de Mineclone 2. diff --git a/mods/ITEMS/REDSTONE/mesecons_button/init.lua b/mods/ITEMS/REDSTONE/mesecons_button/init.lua index b812ea956..8e2159045 100644 --- a/mods/ITEMS/REDSTONE/mesecons_button/init.lua +++ b/mods/ITEMS/REDSTONE/mesecons_button/init.lua @@ -108,7 +108,7 @@ function mesecon.register_button(basename, description, texture, recipeitem, sou if groups_off.material_wood ~= 0 then longdesc = S("A wooden button is a redstone component made out of wood which can be pushed to provide redstone power. When pushed, it powers adjacent redstone components for 1.5 seconds. Wooden buttons may also be pushed by arrows.") else - longdesc = S("A button is a redstone compent which can be pushed to provide redstone power. When pushed, it powers adjacent redstone components for @1 seconds.", button_timer) + longdesc = S("A button is a redstone component which can be pushed to provide redstone power. When pushed, it powers adjacent redstone components for @1 seconds.", button_timer) end end diff --git a/mods/ITEMS/REDSTONE/mesecons_button/locale/mesecons_button.fr.tr b/mods/ITEMS/REDSTONE/mesecons_button/locale/mesecons_button.fr.tr index 1d844bd36..7ccc763be 100644 --- a/mods/ITEMS/REDSTONE/mesecons_button/locale/mesecons_button.fr.tr +++ b/mods/ITEMS/REDSTONE/mesecons_button/locale/mesecons_button.fr.tr @@ -17,3 +17,4 @@ A wooden button is a redstone component made out of wood which can be pushed to Provides redstone power when pushed=Fournit une puissance de redstone lorsqu'il est poussé Push duration: @1s=Durée de poussée : @1s Pushable by arrow=Poussable par une flèche +A button is a redstone component which can be pushed to provide redstone power. When pushed, it powers adjacent redstone components for @1 seconds.=Un bouton est un composant redstone qui peut être poussé afin de fournir de la puissance redstone. Lorsqu'il est poussé, il fournit de la puissance redstone pendant @1 seconde. diff --git a/mods/ITEMS/REDSTONE/mesecons_button/locale/mesecons_button.ru.tr b/mods/ITEMS/REDSTONE/mesecons_button/locale/mesecons_button.ru.tr index 164d58fb2..b66a7e892 100644 --- a/mods/ITEMS/REDSTONE/mesecons_button/locale/mesecons_button.ru.tr +++ b/mods/ITEMS/REDSTONE/mesecons_button/locale/mesecons_button.ru.tr @@ -17,4 +17,4 @@ A wooden button is a redstone component made out of wood which can be pushed to Provides redstone power when pushed=Выдаёт сигнал редстоуна при нажатии Push duration: @1s=Длительность нажатия: @1с Pushable by arrow=Нажимается стрелами -A button is a redstone compent which can be pushed to provide redstone power. When pushed, it powers adjacent redstone components for @1 seconds.=Кнопка это компонент редстоуна, её можно нажать, чтобы получить сигнал редстоуна. При нажатии она включает соседние компоненты редстоуна на @1 с. +A button is a redstone component which can be pushed to provide redstone power. When pushed, it powers adjacent redstone components for @1 seconds.=Кнопка это компонент редстоуна, её можно нажать, чтобы получить сигнал редстоуна. При нажатии она включает соседние компоненты редстоуна на @1 с. diff --git a/mods/ITEMS/REDSTONE/mesecons_button/locale/template.txt b/mods/ITEMS/REDSTONE/mesecons_button/locale/template.txt index d42a03741..68d10061a 100644 --- a/mods/ITEMS/REDSTONE/mesecons_button/locale/template.txt +++ b/mods/ITEMS/REDSTONE/mesecons_button/locale/template.txt @@ -17,4 +17,4 @@ A wooden button is a redstone component made out of wood which can be pushed to Provides redstone power when pushed= Push duration: @1s= Pushable by arrow= -A button is a redstone compent which can be pushed to provide redstone power. When pushed, it powers adjacent redstone components for @1 seconds.= +A button is a redstone component which can be pushed to provide redstone power. When pushed, it powers adjacent redstone components for @1 seconds.= diff --git a/mods/ITEMS/mcl_armor/locale/mcl_armor.fr.tr b/mods/ITEMS/mcl_armor/locale/mcl_armor.fr.tr index b3a2c6dbc..09d88f5d4 100644 --- a/mods/ITEMS/mcl_armor/locale/mcl_armor.fr.tr +++ b/mods/ITEMS/mcl_armor/locale/mcl_armor.fr.tr @@ -47,4 +47,5 @@ Thorns=Épines Reflects some of the damage taken when hit, at the cost of reducing durability with each proc.=Reflète une partie des dégâts subis lors de la frappe, au prix d'une réduction de la durabilité à chaque déclenchement. Aqua Affinity=Affinité aquatique - +#Translations for armor trims +Smithing Template '@1'=Modèle à forger '@1' diff --git a/mods/ITEMS/mcl_bamboo/locale/mcl_bamboo.fr.tr b/mods/ITEMS/mcl_bamboo/locale/mcl_bamboo.fr.tr index e95d16baa..e83f1d87f 100644 --- a/mods/ITEMS/mcl_bamboo/locale/mcl_bamboo.fr.tr +++ b/mods/ITEMS/mcl_bamboo/locale/mcl_bamboo.fr.tr @@ -24,6 +24,7 @@ Bamboo Mosaic Stair=Escalier mosaïque de bambou Bamboo Plank Slab=Dalle de planches de bambou Bamboo Plank Stair=Escalier de planches de bambou Bamboo Pressure Plate=Plaque de pression de bambou +Bamboo Sign=Panneau de bambou Bamboo Slab=Dalle de bambou Bamboo Stair=Escalier de bambou Bamboo Trapdoor=Trappe de bambou diff --git a/mods/ITEMS/mcl_banners/locale/mcl_banners.fr.tr b/mods/ITEMS/mcl_banners/locale/mcl_banners.fr.tr index 78095a4a7..016abb6e7 100644 --- a/mods/ITEMS/mcl_banners/locale/mcl_banners.fr.tr +++ b/mods/ITEMS/mcl_banners/locale/mcl_banners.fr.tr @@ -76,3 +76,4 @@ You can copy the pattern of a banner by placing two banners of the same color in And one additional layer=Et une couche supplémentaire And @1 additional layers=Et @1 couches supplémentaires Paintable decoration=Décoration à peindre +Preview Banner=Aperçu de la bannière diff --git a/mods/ITEMS/mcl_beds/locale/mcl_beds.fr.tr b/mods/ITEMS/mcl_beds/locale/mcl_beds.fr.tr index cc69db33b..ab4917c95 100644 --- a/mods/ITEMS/mcl_beds/locale/mcl_beds.fr.tr +++ b/mods/ITEMS/mcl_beds/locale/mcl_beds.fr.tr @@ -41,3 +41,9 @@ You will fall asleep when @1% of all players are in bed.=Vous vous endormirez lo You're in bed.=Tu es au lit. Allows you to sleep=Vous permet de dormir Respawn Anchor=Ancre de réapparition +Chat:=Discussion +send!=envoyé ! +You are missing the 'shout' privilege! It's required in order to talk in chat...=Il vous manque le privilège 'shout' ! C'est indispensable pour participer à la discussion... +You exceeded the maximum number of messages per 10 seconds!=Vous avez dépassé le nombre maximal de message par 10 secondes ! +Hey! Would you guys mind sleeping?=Eh, vous ne voulez pas dormir ? +Sorry, but you have to wait @1 seconds until you may use this button again!=Désolé, mais il faut attendre @1 seconde avant de réutiliser ce bouton ! diff --git a/mods/ITEMS/mcl_bows/locale/mcl_bows.fr.tr b/mods/ITEMS/mcl_bows/locale/mcl_bows.fr.tr index 901be04df..6f91cd986 100644 --- a/mods/ITEMS/mcl_bows/locale/mcl_bows.fr.tr +++ b/mods/ITEMS/mcl_bows/locale/mcl_bows.fr.tr @@ -15,4 +15,4 @@ Damage from dispenser: 3=Dégâts du distributeur : 3 Launches arrows=Lance des flèches Crossbow=Arbalète Crossbows are ranged weapons to shoot arrows at your foes.=Les arbalètes sont des armes à distance pour tirer des flèches sur vos ennemis. -To use the crossbow, you first need to have at least one arrow anywhere in your inventory (unless in Creative Mode). Hold down the right mouse button to charge, release to shoot.=Pour utiliser l'arbalète, vous devez d'abord avoir au moins une flèche n'importe où dans votre inventaire (sauf en mode créatif). Maintenez enfoncé le bouton droit de la souris pour charger, relâchez pour tirer. +To use the crossbow, you first need to have at least one arrow anywhere in your inventory (unless in Creative Mode). Hold down the right mouse button to charge, release to load an arrow into the chamber, then to shoot press left mouse.=Pour utiliser l'arbalète, vous devez d'abord avoir au moins une flèche n'importe où dans votre inventaire (sauf en mode créatif). Maintenez enfoncé le bouton droit de la souris pour charger, relâchez pour charger la flèche dans la chambre, puis pour tirer cliquez droit. diff --git a/mods/ITEMS/mcl_cherry_blossom/locale/mcl_cherry_blossom.fr.tr b/mods/ITEMS/mcl_cherry_blossom/locale/mcl_cherry_blossom.fr.tr new file mode 100644 index 000000000..2f6b7db22 --- /dev/null +++ b/mods/ITEMS/mcl_cherry_blossom/locale/mcl_cherry_blossom.fr.tr @@ -0,0 +1,24 @@ +# textdomain: mcl_cherry_blossom +Cherry Log=Bûche de cerisier +The trunk of a cherry blossom tree.=Le tronc d'un cerisier. +Stripped Cherry Log=Bûche de cerisier écorcée +The stripped trunk of a cherry blossom tree.=Le tronc écorcé d'un cerisier. +Cherry Bark=Bois de cerisier +This is a decorative block surrounded by the bark of a tree trunk.=Ceci est un bloc décoratif entouré de bois de cerisier +Stripped Cherry Wood=Bois de cerisier écorcé +The stripped wood of a cherry blossom tree.=Le bois écorcé d'un cerisier +Cherry Wood Planks=Planches de cerisier +Cherry Leaves=Feuilles de cerisier +Cherry blossom leaves are grown from cherry blossom trees.=Les feuilles de cerisier poussent sur les cerisiers +Cherry Sapling=Pousse de cerisier +Cherry blossom sapling can be planted to grow cherry trees.=Les pousses de cerisier peuvent être plantées pour faire pousser des cerisiers. +Cherry Door=Porte en cerisier +Cherry Trapdoor=Trappe en cerisier +Cherry Stairs=Escalier en cerisier +Cherry Slab=Dalle en cerisier +Double Cherry Slab=Double Dalle en cerisier +Cherry Sign=Panneau de cerisier +Cherry Fence=Barrière en cerisier +Cherry Gate=Portillion en cerisier +Cherry Pressure Plate=Plaque de pression en cerisier +Cherry Button=Bouton de Cerisier diff --git a/mods/ITEMS/mcl_doors/locale/mcl_doors.fr.tr b/mods/ITEMS/mcl_doors/locale/mcl_doors.fr.tr index c7d3ddaa1..01de53274 100644 --- a/mods/ITEMS/mcl_doors/locale/mcl_doors.fr.tr +++ b/mods/ITEMS/mcl_doors/locale/mcl_doors.fr.tr @@ -22,3 +22,5 @@ Iron Trapdoor=Trappe en fer Iron trapdoors are horizontal barriers which can only be opened and closed by redstone signals, but not by hand. They occupy the upper or lower part of a block, depending on how they have been placed. When open, they can be climbed like a ladder.=Les trappes en fer sont des barrières horizontales qui ne peuvent être ouvertes et fermées que par des signaux de redstone, mais pas à la main. Ils occupent la partie supérieure ou inférieure d'un bloc, selon la façon dont ils ont été placés. Lorsqu'elles sont ouvertes, elles peuvent être montées comme une échelle. Openable by players and redstone power=Ouvrable par les joueurs et puissance redstone Openable by redstone power=Ouvrable par la puissance redstone +This door is a 2-block high barrier which can only be opened by redstone power, not by hand.=Cette porte est une barrière d'une hauteur de 2 blocs qui ne peut être ouverte que par la puissance redstone et pas à la main. +This door is a 2-block high barrier which can be opened or closed by hand or by redstone power.=Cette porte est une barrière d'une hauteur de 2 blocs qui peut être ouverte ou fermée à la main ou par la puissance redstone. diff --git a/mods/ITEMS/mcl_flowerpots/locale/mcl_flowerpots.fr.tr b/mods/ITEMS/mcl_flowerpots/locale/mcl_flowerpots.fr.tr index 362b96c57..067eded9b 100644 --- a/mods/ITEMS/mcl_flowerpots/locale/mcl_flowerpots.fr.tr +++ b/mods/ITEMS/mcl_flowerpots/locale/mcl_flowerpots.fr.tr @@ -24,3 +24,4 @@ Flower Pot=Pot de fleurs Flower pots are decorative blocks in which flowers and other small plants can be placed.=Les pots de fleurs sont des blocs décoratifs dans lesquels des fleurs et d'autres petites plantes peuvent être placées. Just place a plant on the flower pot. Flower pots can hold small flowers (not higher than 1 block), saplings, ferns, dead bushes, mushrooms and cacti. Rightclick a potted plant to retrieve the plant.=Placez simplement une plante sur le pot de fleurs. Les pots de fleurs peuvent contenir de petites fleurs (pas plus d'un bloc), des pousses, des fougères, des buissons morts, des champignons et des cactus. Cliquez avec le bouton droit sur une plante en pot pour récupérer la plante. Can hold a small flower or plant=Peut contenir une petite fleur ou plante +Cherry Sapling Flower Pot=Pousse de Cerisier en pot diff --git a/mods/ITEMS/mcl_portals/locale/mcl_portals.fr.tr b/mods/ITEMS/mcl_portals/locale/mcl_portals.fr.tr index 72e939785..3fca2e134 100644 --- a/mods/ITEMS/mcl_portals/locale/mcl_portals.fr.tr +++ b/mods/ITEMS/mcl_portals/locale/mcl_portals.fr.tr @@ -6,14 +6,14 @@ Hop into the portal to teleport. Entering an End portal in the Overworld telepor End Portal Frame=Cadre de portail de l'End End portal frames are used in the construction of End portals. Each block has a socket for an eye of ender.=Les portails de l'End sont utilisés dans la construction de portails de l'End. Chaque bloc a une prise pour un œil d'Ender. NOTE: The End dimension is currently incomplete and might change in future versions.=REMARQUE : la dimension de l'End est actuellement incomplète et pourrait changer dans les futures versions. -To create an End portal, you need 12 end portal frames and 12 eyes of ender. The end portal frames have to be arranged around a horizontal 3×3 area with each block facing inward. Any other arrangement will fail.= -Place an eye of ender into each block. The end portal appears in the middle after placing the final eye.= +To create an End portal, you need 12 end portal frames and 12 eyes of ender. The end portal frames have to be arranged around a horizontal 3×3 area with each block facing inward. Any other arrangement will fail.=Pour créer un portail de l'End, vous avez besoin de 12 cadres de portail de l'End et 12 œil d'Ender. Les cadres de portail doivent être placé sur une surface horizontal 3*3 avec chaque bloc tourné vers l'intérieur. Tout autre disposition échouera. +Place an eye of ender into each block. The end portal appears in the middle after placing the final eye.=Placer un œil d'Ender dans chaque bloc. Le portail apparaît au milieu après avoir placé l'œil final. Once placed, an eye of ender can not be taken back.=Une fois placé, un œil d'Ender ne peut pas être repris. End Portal Frame with Eye of Ender=Cadre de portail de l'End avec œil d'Ender -End Gateway Portal= -Used to construct end gateway portals= -An End gateway portal teleports creatures and objects to the outer End (and back!).= -Throw an ender pearl into the portal to teleport. Entering an Gateway portal near the Overworld teleports you to the outer End. At this destination another gateway portal will be constructed, which you can use to get back.= +End Gateway Portal=Portail de Passage de l'End +Used to construct end gateway portals=Utilisé pour construire des portails de passage de l'End. +An End gateway portal teleports creatures and objects to the outer End (and back!).=Un portail de passage de l'End téléporte des créatures et objets vers la bordure de l'End (et les ramène !). +Throw an ender pearl into the portal to teleport. Entering an Gateway portal near the Overworld teleports you to the outer End. At this destination another gateway portal will be constructed, which you can use to get back.=Jetez une perle d'Ender dans le portail pour vous téléporter. Entrer dans un portail de passage de l'End près de l'Overworld vous téléporte vers la bordure de l'End. À cette destination un autre portail de passage sera généré, qui pourra être utilisé pour revenir. Nether Portal=Portail du Nether A Nether portal teleports creatures and objects to the hot and dangerous Nether dimension (and back!). Enter at your own risk!=Un portail du Nether téléporte des créatures et des objets dans la chaude et dangereuse dimension du Nether (et vice-versa !). Entrez à vos risques et périls ! Stand in the portal for a moment to activate the teleportation. Entering a Nether portal for the first time will also create a new portal in the other dimension. If a Nether portal has been built in the Nether, it will lead to the Overworld. A Nether portal is destroyed if the any of the obsidian which surrounds it is destroyed, or if it was caught in an explosion.=Tenez-vous un instant dans le portail pour activer la téléportation. Entrer pour la première fois sur un portail Nether créera également un nouveau portail dans l'Overworld. Si un portail du Nether a été construit dans le Nether, il mènera à l'Overworld. Un portail du Nether est détruit si l'une des obsidiennes qui l'entourent est détruite, ou s'il a été pris dans une explosion. diff --git a/mods/ITEMS/mcl_sus_stew/locale/mcl_sus_stew.fr.tr b/mods/ITEMS/mcl_sus_stew/locale/mcl_sus_stew.fr.tr new file mode 100644 index 000000000..bc6ad5b88 --- /dev/null +++ b/mods/ITEMS/mcl_sus_stew/locale/mcl_sus_stew.fr.tr @@ -0,0 +1,2 @@ +# textdomain: mcl_sus_stew +Suspicious Stew=Soupe suspecte diff --git a/mods/PLAYER/mcl_music/locale/mcl_music.fr.tr b/mods/PLAYER/mcl_music/locale/mcl_music.fr.tr new file mode 100644 index 000000000..3b5a684d5 --- /dev/null +++ b/mods/PLAYER/mcl_music/locale/mcl_music.fr.tr @@ -0,0 +1,7 @@ +# textdomain: mcl_music +You need the debug privilege in order to turn ingame music on or off for somebody else!=Vous avez besoin du privilège "debug“ pour allumer ou éteindre la musique pour une autre personne dans le jeu ! +Couldn't find player @1!= Le joueur @1 est introuvable ! +Set music for @1 to: @2=Jouer la musique @2 pour @1 +Turns music for yourself or another player on or off.=Joue ou arrête la musique pour vous ou un autre joueur. +on=on +off=off From 45532ebe6d1de88345f06895c26bbdd7ffdb91a1 Mon Sep 17 00:00:00 2001 From: ChrisPHP Date: Sun, 30 Jul 2023 18:25:48 +0100 Subject: [PATCH 290/982] Add gui to list craft recipes for some stones --- mods/ITEMS/mcl_stonecutter/init.lua | 123 ++++++++++++++++++++++++++++ 1 file changed, 123 insertions(+) diff --git a/mods/ITEMS/mcl_stonecutter/init.lua b/mods/ITEMS/mcl_stonecutter/init.lua index e75884990..a68f5cf84 100644 --- a/mods/ITEMS/mcl_stonecutter/init.lua +++ b/mods/ITEMS/mcl_stonecutter/init.lua @@ -7,6 +7,71 @@ local S = minetest.get_translator(minetest.get_current_modname()) +local recipes = { + {"mcl_core:cobble", "mcl_stairs:slab_cobble", "mcl_walls:cobble", "mcl_stairs:stair_cobble"}, + {"mcl_core:granite", "mcl_stairs:slab_granite", "mcl_walls:granite", "mcl_stairs:stair_granite", "mcl_core:granite_smooth", "mcl_stairs:stair_granite_smooth", "mcl_stairs:slab_granite_smooth"}, + {"mcl_core:diorite", "mcl_stairs:slab_diorite", "mcl_walls:diorite", "mcl_stairs:stair_diorite", "mcl_core:diorite_smooth", "mcl_stairs:stair_diorite_smooth", "mcl_stairs:slab_diorite_smooth"}, +} + + +local FMT = { + item_image_button = "item_image_button[%f,%f;%f,%f;%s;%s;%s]", + item_image = "item_image[%f,%f;%f,%f;%s]", +} + +local function show_stonecutter_formspec(items, input) + local cut_items = {} + + local x_len = 0 + local y_len = 0.5 + + if items ~= nil then + for index, value in pairs(items) do + x_len = x_len + 1 + if x_len > 5 then + y_len = y_len + 1 + x_len = 1 + end + local test = string.format(FMT.item_image_button,x_len+1,y_len,1,1, value, value, "") + cut_items[index] = test + end + end + + local formspec = "size[9,8.75]".. + "label[0,4.0;"..minetest.formspec_escape(minetest.colorize("#313131", S("Inventory"))).."]".. + "label[1,0.1;"..minetest.formspec_escape(minetest.colorize("#313131", S("Stonecutter"))).."]".. + "list[context;main;0,0;8,4;]".. + "list[current_player;main;0,4.5;9,3;9]".. + mcl_formspec.get_itemslot_bg(0,4.5,9,3).. + "list[current_player;main;0,7.74;9,1;]".. + mcl_formspec.get_itemslot_bg(0,7.74,9,1).. + "list[context;input;0.5,1.7;1,1;]".. + mcl_formspec.get_itemslot_bg(0.5,1.7,1,1).. + "list[context;output;7.5,1.7;1,1;]".. + mcl_formspec.get_itemslot_bg(7.5,1.7,1,1).. + table.concat(cut_items).. + "listring[context;output]".. + "listring[current_player;main]".. + "listring[context;input]".. + "listring[current_player;main]" + + return formspec +end + +local function update_stonecutter_slots(meta) + local inv = meta:get_inventory() + local input = inv:get_stack("input", 1) + local name = input:get_name() + + local new_output + for index, value in pairs(recipes) do + if name == value[1] then + meta:set_string("formspec", show_stonecutter_formspec(recipes[index])) + end + end +end + + minetest.register_node("mcl_stonecutter:stonecutter", { description = S("Stone Cutter"), _tt_help = S("Used to cut stone like materials."), @@ -46,6 +111,64 @@ minetest.register_node("mcl_stonecutter:stonecutter", { _mcl_blast_resistance = 3.5, _mcl_hardness = 3.5, sounds = mcl_sounds.node_sound_stone_defaults(), + + allow_metadata_inventory_take = function(pos, listname, index, stack, player) + local name = player:get_player_name() + if minetest.is_protected(pos, name) then + minetest.record_protection_violation(pos, name) + return 0 + else + return stack:get_count() + end + end, + on_metadata_inventory_move = function(pos, from_list, from_index, to_list, to_index, count, player) + local meta = minetest.get_meta(pos) + if from_list == "output" and to_list == "input" then + local inv = meta:get_inventory() + for i=1, inv:get_size("input") do + if i ~= to_index then + local istack = inv:get_stack("input", i) + istack:set_count(math.max(0, istack:get_count() - count)) + inv:set_stack("input", i, istack) + end + end + end + update_stonecutter_slots(meta) + end, + allow_metadata_inventory_put = function(pos, listname, index, stack, player) + local name = player:get_player_name() + if minetest.is_protected(pos, name) then + minetest.record_protection_violation(pos, name) + return 0 + elseif listname == "output" then + return 0 + else + return stack:get_count() + end + end, + on_metadata_inventory_put = function(pos, listname, index, stack, player) + local meta = minetest.get_meta(pos) + update_stonecutter_slots(meta) + end, + + on_construct = function(pos) + local meta = minetest.get_meta(pos) + local inv = meta:get_inventory() + inv:set_size("input", 1) + inv:set_size("output", 1) + local form = show_stonecutter_formspec() + meta:set_string("formspec", form) + end, + + on_rightclick = function(pos, node, player, itemstack) + local name = player:get_player_name() + if not player:get_player_control().sneak then + local meta = minetest.get_meta(pos) + --show_stonecutter_formspec(name, "main", player) + update_stonecutter_slots(meta) + --meta:set_string("formspec", show_stonecutter_formspec(items[1])) + end + end, }) minetest.register_craft({ From 2af08c3188f4247ec6825461208ddf79b8c17a53 Mon Sep 17 00:00:00 2001 From: ChrisPHP Date: Sun, 30 Jul 2023 21:58:42 +0100 Subject: [PATCH 291/982] clear formspec on taking input item --- mods/ITEMS/mcl_stonecutter/init.lua | 34 +++++++++++++++++++++-------- 1 file changed, 25 insertions(+), 9 deletions(-) diff --git a/mods/ITEMS/mcl_stonecutter/init.lua b/mods/ITEMS/mcl_stonecutter/init.lua index a68f5cf84..34ead2100 100644 --- a/mods/ITEMS/mcl_stonecutter/init.lua +++ b/mods/ITEMS/mcl_stonecutter/init.lua @@ -5,7 +5,7 @@ -- TO-DO: -- * Add GUI -local S = minetest.get_translator(minetest.get_current_modname()) +local S = minetest.get_translator("mcl_stonecutter") local recipes = { {"mcl_core:cobble", "mcl_stairs:slab_cobble", "mcl_walls:cobble", "mcl_stairs:stair_cobble"}, @@ -16,12 +16,10 @@ local recipes = { local FMT = { item_image_button = "item_image_button[%f,%f;%f,%f;%s;%s;%s]", - item_image = "item_image[%f,%f;%f,%f;%s]", } local function show_stonecutter_formspec(items, input) local cut_items = {} - local x_len = 0 local y_len = 0.5 @@ -32,7 +30,7 @@ local function show_stonecutter_formspec(items, input) y_len = y_len + 1 x_len = 1 end - local test = string.format(FMT.item_image_button,x_len+1,y_len,1,1, value, value, "") + local test = string.format(FMT.item_image_button,x_len+1,y_len,1,1, value, "item_button", value) cut_items[index] = test end end @@ -64,10 +62,14 @@ local function update_stonecutter_slots(meta) local name = input:get_name() local new_output - for index, value in pairs(recipes) do - if name == value[1] then - meta:set_string("formspec", show_stonecutter_formspec(recipes[index])) + if not input:is_empty() then + for index, value in pairs(recipes) do + if name == value[1] then + meta:set_string("formspec", show_stonecutter_formspec(recipes[index])) + end end + else + meta:set_string("formspec", show_stonecutter_formspec(nil)) end end @@ -150,7 +152,12 @@ minetest.register_node("mcl_stonecutter:stonecutter", { local meta = minetest.get_meta(pos) update_stonecutter_slots(meta) end, - + on_metadata_inventory_take = function(pos, listname, index, stack, player) + local meta = minetest.get_meta(pos) + if listname == "input" then + update_stonecutter_slots(meta) + end + end, on_construct = function(pos) local meta = minetest.get_meta(pos) local inv = meta:get_inventory() @@ -159,7 +166,6 @@ minetest.register_node("mcl_stonecutter:stonecutter", { local form = show_stonecutter_formspec() meta:set_string("formspec", form) end, - on_rightclick = function(pos, node, player, itemstack) local name = player:get_player_name() if not player:get_player_control().sneak then @@ -169,6 +175,16 @@ minetest.register_node("mcl_stonecutter:stonecutter", { --meta:set_string("formspec", show_stonecutter_formspec(items[1])) end end, + on_receive_fields = function(pos, formname, fields, sender) + local sender_name = sender:get_player_name() + if minetest.is_protected(pos, sender_name) then + minetest.record_protection_violation(pos, sender_name) + return + end + if fields.item_button then + print(fields.item_button) + end + end, }) minetest.register_craft({ From 752372752197c5f05130c438c89e3e8b1d8eaafa Mon Sep 17 00:00:00 2001 From: ChrisPHP Date: Sun, 30 Jul 2023 22:41:19 +0100 Subject: [PATCH 292/982] take output from stonecutter --- mods/ITEMS/mcl_stonecutter/init.lua | 24 ++++++++++++++++-------- 1 file changed, 16 insertions(+), 8 deletions(-) diff --git a/mods/ITEMS/mcl_stonecutter/init.lua b/mods/ITEMS/mcl_stonecutter/init.lua index 34ead2100..88da2d2f8 100644 --- a/mods/ITEMS/mcl_stonecutter/init.lua +++ b/mods/ITEMS/mcl_stonecutter/init.lua @@ -13,7 +13,6 @@ local recipes = { {"mcl_core:diorite", "mcl_stairs:slab_diorite", "mcl_walls:diorite", "mcl_stairs:stair_diorite", "mcl_core:diorite_smooth", "mcl_stairs:stair_diorite_smooth", "mcl_stairs:slab_diorite_smooth"}, } - local FMT = { item_image_button = "item_image_button[%f,%f;%f,%f;%s;%s;%s]", } @@ -61,7 +60,7 @@ local function update_stonecutter_slots(meta) local input = inv:get_stack("input", 1) local name = input:get_name() - local new_output + local new_output = ItemStack(meta:get_string("cut_stone")) if not input:is_empty() then for index, value in pairs(recipes) do if name == value[1] then @@ -71,8 +70,12 @@ local function update_stonecutter_slots(meta) else meta:set_string("formspec", show_stonecutter_formspec(nil)) end -end + if new_output then + new_output:set_count(2) + inv:set_stack("output", 1, new_output) + end +end minetest.register_node("mcl_stonecutter:stonecutter", { description = S("Stone Cutter"), @@ -154,9 +157,14 @@ minetest.register_node("mcl_stonecutter:stonecutter", { end, on_metadata_inventory_take = function(pos, listname, index, stack, player) local meta = minetest.get_meta(pos) - if listname == "input" then - update_stonecutter_slots(meta) + if listname == "output" then + local inv = meta:get_inventory() + local input = inv:get_stack("input", 1) + input:take_item() + inv:set_stack("input", 1, input) + meta:set_string("cut_stone", nil) end + update_stonecutter_slots(meta) end, on_construct = function(pos) local meta = minetest.get_meta(pos) @@ -170,9 +178,7 @@ minetest.register_node("mcl_stonecutter:stonecutter", { local name = player:get_player_name() if not player:get_player_control().sneak then local meta = minetest.get_meta(pos) - --show_stonecutter_formspec(name, "main", player) update_stonecutter_slots(meta) - --meta:set_string("formspec", show_stonecutter_formspec(items[1])) end end, on_receive_fields = function(pos, formname, fields, sender) @@ -182,7 +188,9 @@ minetest.register_node("mcl_stonecutter:stonecutter", { return end if fields.item_button then - print(fields.item_button) + local meta = minetest.get_meta(pos) + meta:set_string("cut_stone", fields.item_button) + update_stonecutter_slots(meta) end end, }) From 47990eec2bd3106eb5d931c7ac3747e0a1cebd01 Mon Sep 17 00:00:00 2001 From: ChrisPHP Date: Mon, 31 Jul 2023 08:56:02 +0100 Subject: [PATCH 293/982] begin adding check if item canbe cut --- mods/ITEMS/mcl_stonecutter/init.lua | 47 ++++++++++++++++++++++++++++- 1 file changed, 46 insertions(+), 1 deletion(-) diff --git a/mods/ITEMS/mcl_stonecutter/init.lua b/mods/ITEMS/mcl_stonecutter/init.lua index 88da2d2f8..801dd32c0 100644 --- a/mods/ITEMS/mcl_stonecutter/init.lua +++ b/mods/ITEMS/mcl_stonecutter/init.lua @@ -13,6 +13,31 @@ local recipes = { {"mcl_core:diorite", "mcl_stairs:slab_diorite", "mcl_walls:diorite", "mcl_stairs:stair_diorite", "mcl_core:diorite_smooth", "mcl_stairs:stair_diorite_smooth", "mcl_stairs:slab_diorite_smooth"}, } +local compaitble_items = { + "mcl_core:cobble", + "mcl_core:mossycobble", + "mcl_core:stone", + "mcl_core:stone_smooth", + "mcl_core:granite", + "mcl_core:granite_smooth", + "mcl_core:diorite", + "mcl_core:diorite_smooth", + "mcl_core:andesite", + "mcl_core:andesite_smooth", + "mcl_core:stonebrick", + "mcl_core:stonebrickmossy", + "mcl_core:sandstone", + "mcl_core:redsandstone", + "mcl_ocean:prismarine", + "mcl_ocean:prismarine_brick", + "mcl_ocean:prismarine_dark", + "mcl_mud:mud_bricks", + "mcl_nether:quartzblock", + "mcl_nether:quartz_smooth", + "mcl_end:purpur_block", + "mcl_end:end_bricks", +} + local FMT = { item_image_button = "item_image_button[%f,%f;%f,%f;%s;%s;%s]", } @@ -55,10 +80,30 @@ local function show_stonecutter_formspec(items, input) return formspec end +local function get_item_string_name(input) + local colonIndex = string.find(input, ":") + if colonIndex then + input = string.sub(input, colonIndex + 1) + else + return input + end + local whitespaceIndex = string.find(input, "%s") + if whitespaceIndex then + return string.sub(input, 1, whitespaceIndex - 1) + else + return input + end +end + local function update_stonecutter_slots(meta) local inv = meta:get_inventory() local input = inv:get_stack("input", 1) local name = input:get_name() + local name_stripped = get_item_string_name(input:to_string()) + if name_stripped ~= "" then + local itemdef = minetest.registered_items["mcl_stairs:stair_"..name_stripped] + print(itemdef) + end local new_output = ItemStack(meta:get_string("cut_stone")) if not input:is_empty() then @@ -162,8 +207,8 @@ minetest.register_node("mcl_stonecutter:stonecutter", { local input = inv:get_stack("input", 1) input:take_item() inv:set_stack("input", 1, input) - meta:set_string("cut_stone", nil) end + meta:set_string("cut_stone", nil) update_stonecutter_slots(meta) end, on_construct = function(pos) From 9da07af3700e6a8da5fa73aac95b7bbe5375ffa2 Mon Sep 17 00:00:00 2001 From: ChrisPHP Date: Tue, 1 Aug 2023 09:14:09 +0100 Subject: [PATCH 294/982] Check if item can be made into stairs, slabs and walls --- mods/ITEMS/mcl_stonecutter/init.lua | 60 +++++++++++++++++++++-------- 1 file changed, 45 insertions(+), 15 deletions(-) diff --git a/mods/ITEMS/mcl_stonecutter/init.lua b/mods/ITEMS/mcl_stonecutter/init.lua index 801dd32c0..f46603aa0 100644 --- a/mods/ITEMS/mcl_stonecutter/init.lua +++ b/mods/ITEMS/mcl_stonecutter/init.lua @@ -7,12 +7,6 @@ local S = minetest.get_translator("mcl_stonecutter") -local recipes = { - {"mcl_core:cobble", "mcl_stairs:slab_cobble", "mcl_walls:cobble", "mcl_stairs:stair_cobble"}, - {"mcl_core:granite", "mcl_stairs:slab_granite", "mcl_walls:granite", "mcl_stairs:stair_granite", "mcl_core:granite_smooth", "mcl_stairs:stair_granite_smooth", "mcl_stairs:slab_granite_smooth"}, - {"mcl_core:diorite", "mcl_stairs:slab_diorite", "mcl_walls:diorite", "mcl_stairs:stair_diorite", "mcl_core:diorite_smooth", "mcl_stairs:stair_diorite_smooth", "mcl_stairs:slab_diorite_smooth"}, -} - local compaitble_items = { "mcl_core:cobble", "mcl_core:mossycobble", @@ -28,14 +22,19 @@ local compaitble_items = { "mcl_core:stonebrickmossy", "mcl_core:sandstone", "mcl_core:redsandstone", + "mcl_core:brick_block", "mcl_ocean:prismarine", "mcl_ocean:prismarine_brick", "mcl_ocean:prismarine_dark", "mcl_mud:mud_bricks", "mcl_nether:quartzblock", "mcl_nether:quartz_smooth", + "mcl_nether:red_nether_brick", + "mcl_nether:nether_brick", "mcl_end:purpur_block", "mcl_end:end_bricks", + "mcl_blackstone:blackstone", + "mcl_blackstone:blackstone_polished" } local FMT = { @@ -95,23 +94,54 @@ local function get_item_string_name(input) end end +local function is_input_in_table(element) + for _, value in ipairs(compaitble_items) do + if value == element then + return true + end + end + return false +end + local function update_stonecutter_slots(meta) local inv = meta:get_inventory() local input = inv:get_stack("input", 1) local name = input:get_name() local name_stripped = get_item_string_name(input:to_string()) - if name_stripped ~= "" then - local itemdef = minetest.registered_items["mcl_stairs:stair_"..name_stripped] - print(itemdef) - end - + local cuttable_recipes = {} local new_output = ItemStack(meta:get_string("cut_stone")) - if not input:is_empty() then - for index, value in pairs(recipes) do - if name == value[1] then - meta:set_string("formspec", show_stonecutter_formspec(recipes[index])) + + + print(name) + if is_input_in_table(name) then + if name_stripped ~= "" then + local stair = "mcl_stairs:stair_"..name_stripped + local slab = "mcl_stairs:slab_"..name_stripped + local wall = "mcl_walls:"..name_stripped + local smooth = "mcl_core:"..name_stripped.."_smooth" + if minetest.registered_items[slab] ~= nil then + table.insert(cuttable_recipes, slab) + end + if minetest.registered_items[stair] ~= nil then + table.insert(cuttable_recipes, stair) + end + if minetest.registered_items[wall] ~= nil then + table.insert(cuttable_recipes, wall) + end + if minetest.registered_items[smooth] ~= nil then + local smooth_stair = "mcl_stairs:stair_"..name_stripped.."_smooth" + local smooth_slab = "mcl_stairs:slab_"..name_stripped.."_smooth" + + table.insert(cuttable_recipes, smooth) + if minetest.registered_items[smooth_slab] ~= nil then + table.insert(cuttable_recipes, smooth_slab) + end + if minetest.registered_items[smooth_stair] ~= nil then + table.insert(cuttable_recipes, smooth_stair) + end end end + meta:set_string("formspec", show_stonecutter_formspec(cuttable_recipes)) else meta:set_string("formspec", show_stonecutter_formspec(nil)) end From 07d2759ae4e9331d9be404f41fbef50e131c5994 Mon Sep 17 00:00:00 2001 From: ChrisPHP Date: Tue, 1 Aug 2023 18:05:01 +0100 Subject: [PATCH 295/982] Check if item is a slab or not --- mods/ITEMS/mcl_stonecutter/init.lua | 16 +++++++++------- 1 file changed, 9 insertions(+), 7 deletions(-) diff --git a/mods/ITEMS/mcl_stonecutter/init.lua b/mods/ITEMS/mcl_stonecutter/init.lua index f46603aa0..bd74a8256 100644 --- a/mods/ITEMS/mcl_stonecutter/init.lua +++ b/mods/ITEMS/mcl_stonecutter/init.lua @@ -109,10 +109,8 @@ local function update_stonecutter_slots(meta) local name = input:get_name() local name_stripped = get_item_string_name(input:to_string()) local cuttable_recipes = {} - local new_output = ItemStack(meta:get_string("cut_stone")) + local new_output = meta:get_string("cut_stone") - - print(name) if is_input_in_table(name) then if name_stripped ~= "" then local stair = "mcl_stairs:stair_"..name_stripped @@ -145,10 +143,14 @@ local function update_stonecutter_slots(meta) else meta:set_string("formspec", show_stonecutter_formspec(nil)) end - - if new_output then - new_output:set_count(2) - inv:set_stack("output", 1, new_output) + if new_output = '' then + cut_item = ItemStack(new_output) + if string.find(new_output, "mcl_stairs:slab_") then + cut_item:set_count(2) + else + cut_item:set_count(1) + end + inv:set_stack("output", 1, cut_item) end end From 356045b3e325fbb881c93b33c2f54708dee82b07 Mon Sep 17 00:00:00 2001 From: ChrisPHP Date: Tue, 1 Aug 2023 18:17:48 +0100 Subject: [PATCH 296/982] Add comments and drop items when destroyed --- mods/ITEMS/mcl_stonecutter/init.lua | 56 +++++++++++++++++++++++++++-- 1 file changed, 53 insertions(+), 3 deletions(-) diff --git a/mods/ITEMS/mcl_stonecutter/init.lua b/mods/ITEMS/mcl_stonecutter/init.lua index bd74a8256..59334914f 100644 --- a/mods/ITEMS/mcl_stonecutter/init.lua +++ b/mods/ITEMS/mcl_stonecutter/init.lua @@ -7,6 +7,7 @@ local S = minetest.get_translator("mcl_stonecutter") +-- compatible items for the stonecutter local compaitble_items = { "mcl_core:cobble", "mcl_core:mossycobble", @@ -41,11 +42,13 @@ local FMT = { item_image_button = "item_image_button[%f,%f;%f,%f;%s;%s;%s]", } +-- formspecs local function show_stonecutter_formspec(items, input) local cut_items = {} local x_len = 0 local y_len = 0.5 + -- This loops through all the items that can be made and inserted into the formspec if items ~= nil then for index, value in pairs(items) do x_len = x_len + 1 @@ -79,6 +82,7 @@ local function show_stonecutter_formspec(items, input) return formspec end +-- Strips the start of the item like "mcl_core:" and removes any numbers or whitespaces after it local function get_item_string_name(input) local colonIndex = string.find(input, ":") if colonIndex then @@ -94,6 +98,7 @@ local function get_item_string_name(input) end end +-- Simply checks if the item is compaitble with the stonecutter local function is_input_in_table(element) for _, value in ipairs(compaitble_items) do if value == element then @@ -103,20 +108,25 @@ local function is_input_in_table(element) return false end +-- Updates the formspec local function update_stonecutter_slots(meta) local inv = meta:get_inventory() local input = inv:get_stack("input", 1) local name = input:get_name() - local name_stripped = get_item_string_name(input:to_string()) - local cuttable_recipes = {} local new_output = meta:get_string("cut_stone") + -- Checks if input is in the array if is_input_in_table(name) then + local cuttable_recipes = {} + local name_stripped = get_item_string_name(input:to_string()) if name_stripped ~= "" then + -- Strings for the possible items it can craft into local stair = "mcl_stairs:stair_"..name_stripped local slab = "mcl_stairs:slab_"..name_stripped local wall = "mcl_walls:"..name_stripped local smooth = "mcl_core:"..name_stripped.."_smooth" + + -- Goes through and checks if the item exists and inserts it into the table if minetest.registered_items[slab] ~= nil then table.insert(cuttable_recipes, slab) end @@ -143,7 +153,9 @@ local function update_stonecutter_slots(meta) else meta:set_string("formspec", show_stonecutter_formspec(nil)) end - if new_output = '' then + + -- Checks if the chosen item is a slab or not, if it's a slab set the output to be a stack of 2 + if new_output ~= '' then cut_item = ItemStack(new_output) if string.find(new_output, "mcl_stairs:slab_") then cut_item:set_count(2) @@ -154,6 +166,18 @@ local function update_stonecutter_slots(meta) end end +-- Only drop the items that were in the input slot +local function drop_stonecutter_items(pos, meta) + local inv = meta:get_inventory() + for i=1, inv:get_size("input") do + local stack = inv:get_stack("input", i) + if not stack:is_empty() then + local p = {x=pos.x+math.random(0, 10)/10-0.5, y=pos.y, z=pos.z+math.random(0, 10)/10-0.5} + minetest.add_item(p, stack) + end + end +end + minetest.register_node("mcl_stonecutter:stonecutter", { description = S("Stone Cutter"), _tt_help = S("Used to cut stone like materials."), @@ -194,6 +218,13 @@ minetest.register_node("mcl_stonecutter:stonecutter", { _mcl_hardness = 3.5, sounds = mcl_sounds.node_sound_stone_defaults(), + after_dig_node = function(pos, oldnode, oldmetadata, digger) + local meta = minetest.get_meta(pos) + local meta2 = meta:to_table() + meta:from_table(oldmetadata) + drop_stonecutter_items(pos, meta) + meta:from_table(meta2) + end, allow_metadata_inventory_take = function(pos, listname, index, stack, player) local name = player:get_player_name() if minetest.is_protected(pos, name) then @@ -203,6 +234,25 @@ minetest.register_node("mcl_stonecutter:stonecutter", { return stack:get_count() end end, + allow_metadata_inventory_move = function(pos, from_list, from_index, to_list, to_index, count, player) + local name = player:get_player_name() + if minetest.is_protected(pos, name) then + minetest.record_protection_violation(pos, name) + return 0 + elseif to_list == "output" then + return 0 + elseif from_list == "output" and to_list == "input" then + local meta = minetest.get_meta(pos) + local inv = meta:get_inventory() + if inv:get_stack(to_list, to_index):is_empty() then + return count + else + return 0 + end + else + return count + end + end, on_metadata_inventory_move = function(pos, from_list, from_index, to_list, to_index, count, player) local meta = minetest.get_meta(pos) if from_list == "output" and to_list == "input" then From 7fcc2e3be3bdc8c40a6203ec2112b8e3f6d858a7 Mon Sep 17 00:00:00 2001 From: ChrisPHP Date: Tue, 1 Aug 2023 22:39:24 +0100 Subject: [PATCH 297/982] Minor output fixes --- mods/ITEMS/mcl_stonecutter/init.lua | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/mods/ITEMS/mcl_stonecutter/init.lua b/mods/ITEMS/mcl_stonecutter/init.lua index 59334914f..2977538e0 100644 --- a/mods/ITEMS/mcl_stonecutter/init.lua +++ b/mods/ITEMS/mcl_stonecutter/init.lua @@ -2,8 +2,6 @@ --||||| STONECUTTER ||||| --||||||||||||||||||||||| --- TO-DO: --- * Add GUI local S = minetest.get_translator("mcl_stonecutter") @@ -163,6 +161,8 @@ local function update_stonecutter_slots(meta) cut_item:set_count(1) end inv:set_stack("output", 1, cut_item) + else + inv:set_stack("output", 1, "") end end From 0e60231c2e7fb9f8d9a7ae22dfd1590d3a6d4123 Mon Sep 17 00:00:00 2001 From: ChrisPHP Date: Tue, 1 Aug 2023 22:48:45 +0100 Subject: [PATCH 298/982] Only reset output if input is empty --- mods/ITEMS/mcl_stonecutter/init.lua | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/mods/ITEMS/mcl_stonecutter/init.lua b/mods/ITEMS/mcl_stonecutter/init.lua index 2977538e0..44a25d2dc 100644 --- a/mods/ITEMS/mcl_stonecutter/init.lua +++ b/mods/ITEMS/mcl_stonecutter/init.lua @@ -289,8 +289,12 @@ minetest.register_node("mcl_stonecutter:stonecutter", { local input = inv:get_stack("input", 1) input:take_item() inv:set_stack("input", 1, input) + if input:get_count() == 0 then + meta:set_string("cut_stone", nil) + end + else + meta:set_string("cut_stone", nil) end - meta:set_string("cut_stone", nil) update_stonecutter_slots(meta) end, on_construct = function(pos) From 5f0ad98daefe5f8606d79e595ac6982d44d52eb8 Mon Sep 17 00:00:00 2001 From: ChrisPHP Date: Sun, 6 Aug 2023 12:45:32 +0100 Subject: [PATCH 299/982] Use node group for items that can be used in the stonecutter --- mods/ITEMS/mcl_blackstone/init.lua | 4 +-- mods/ITEMS/mcl_copper/nodes.lua | 32 +++++++++++----------- mods/ITEMS/mcl_core/nodes_base.lua | 38 +++++++++++++------------- mods/ITEMS/mcl_end/building.lua | 6 ++--- mods/ITEMS/mcl_mud/init.lua | 2 +- mods/ITEMS/mcl_nether/init.lua | 8 +++--- mods/ITEMS/mcl_ocean/prismarine.lua | 6 ++--- mods/ITEMS/mcl_stonecutter/init.lua | 42 ++--------------------------- 8 files changed, 50 insertions(+), 88 deletions(-) diff --git a/mods/ITEMS/mcl_blackstone/init.lua b/mods/ITEMS/mcl_blackstone/init.lua index 138e02191..e1bf751cd 100644 --- a/mods/ITEMS/mcl_blackstone/init.lua +++ b/mods/ITEMS/mcl_blackstone/init.lua @@ -12,7 +12,7 @@ minetest.register_node("mcl_blackstone:blackstone", { tiles = {"mcl_blackstone_top.png", "mcl_blackstone_top.png", "mcl_blackstone_side.png"}, sounds = mcl_sounds.node_sound_stone_defaults(), is_ground_content = false, - groups = {cracky = 3, pickaxey=1, material_stone=1, cobble=1}, + groups = {cracky = 3, pickaxey=1, material_stone=1, cobble=1, stonecuttable=1, stonecuttable=1}, _mcl_blast_resistance = 6, _mcl_hardness = 1.5, }) @@ -103,7 +103,7 @@ minetest.register_node("mcl_blackstone:blackstone_polished", { tiles = {"mcl_blackstone_polished.png"}, sounds = mcl_sounds.node_sound_stone_defaults(), is_ground_content = false, - groups = {cracky = 3, pickaxey=1, material_stone=1}, + groups = {cracky = 3, pickaxey=1, material_stone=1, stonecuttable=1}, _mcl_blast_resistance = 6, _mcl_hardness = 2, }) diff --git a/mods/ITEMS/mcl_copper/nodes.lua b/mods/ITEMS/mcl_copper/nodes.lua index af5a49a1c..b7b78a542 100644 --- a/mods/ITEMS/mcl_copper/nodes.lua +++ b/mods/ITEMS/mcl_copper/nodes.lua @@ -30,7 +30,7 @@ minetest.register_node("mcl_copper:block", { _doc_items_longdesc = S("A block of copper is mostly a decorative block."), tiles = {"mcl_copper_block.png"}, is_ground_content = false, - groups = {pickaxey = 2, building_block = 1, oxidizable = 1}, + groups = {pickaxey = 2, building_block = 1, oxidizable = 1, stonecuttable=1}, sounds = mcl_sounds.node_sound_metal_defaults(), _mcl_blast_resistance = 6, _mcl_hardness = 3, @@ -43,7 +43,7 @@ minetest.register_node("mcl_copper:waxed_block", { _doc_items_longdesc = S("A block of copper is mostly a decorative block."), tiles = {"mcl_copper_block.png"}, is_ground_content = false, - groups = {pickaxey = 2, building_block = 1, waxed = 1}, + groups = {pickaxey = 2, building_block = 1, waxed = 1, stonecuttable=1}, sounds = mcl_sounds.node_sound_metal_defaults(), _mcl_blast_resistance = 6, _mcl_hardness = 3, @@ -55,7 +55,7 @@ minetest.register_node("mcl_copper:block_exposed", { _doc_items_longdesc = S("Exposed copper is a decorative block."), tiles = {"mcl_copper_exposed.png"}, is_ground_content = false, - groups = {pickaxey = 2, building_block = 1, oxidizable = 1}, + groups = {pickaxey = 2, building_block = 1, oxidizable = 1, stonecuttable=1}, sounds = mcl_sounds.node_sound_metal_defaults(), _mcl_blast_resistance = 6, _mcl_hardness = 5, @@ -69,7 +69,7 @@ minetest.register_node("mcl_copper:waxed_block_exposed", { _doc_items_longdesc = S("Exposed copper is a decorative block."), tiles = {"mcl_copper_exposed.png"}, is_ground_content = false, - groups = {pickaxey = 2, building_block = 1, waxed = 1}, + groups = {pickaxey = 2, building_block = 1, waxed = 1, stonecuttable=1}, sounds = mcl_sounds.node_sound_metal_defaults(), _mcl_blast_resistance = 6, _mcl_hardness = 5, @@ -81,7 +81,7 @@ minetest.register_node("mcl_copper:block_weathered", { _doc_items_longdesc = S("Weathered copper is a decorative block."), tiles = {"mcl_copper_weathered.png"}, is_ground_content = false, - groups = {pickaxey = 2, building_block = 1, oxidizable = 1}, + groups = {pickaxey = 2, building_block = 1, oxidizable = 1, stonecuttable=1}, sounds = mcl_sounds.node_sound_metal_defaults(), _mcl_blast_resistance = 6, _mcl_hardness = 5, @@ -95,7 +95,7 @@ minetest.register_node("mcl_copper:waxed_block_weathered", { _doc_items_longdesc = S("Weathered copper is a decorative block."), tiles = {"mcl_copper_weathered.png"}, is_ground_content = false, - groups = {pickaxey = 2, building_block = 1, waxed = 1}, + groups = {pickaxey = 2, building_block = 1, waxed = 1, stonecuttable=1}, sounds = mcl_sounds.node_sound_metal_defaults(), _mcl_blast_resistance = 6, _mcl_hardness = 5, @@ -107,7 +107,7 @@ minetest.register_node("mcl_copper:block_oxidized", { _doc_items_longdesc = S("Oxidized copper is a decorative block."), tiles = {"mcl_copper_oxidized.png"}, is_ground_content = false, - groups = {pickaxey = 2, building_block = 1}, + groups = {pickaxey = 2, building_block = 1, stonecuttable=1}, sounds = mcl_sounds.node_sound_metal_defaults(), _mcl_blast_resistance = 6, _mcl_hardness = 5, @@ -120,7 +120,7 @@ minetest.register_node("mcl_copper:waxed_block_oxidized", { _doc_items_longdesc = S("Oxidized copper is a decorative block."), tiles = {"mcl_copper_oxidized.png"}, is_ground_content = false, - groups = {pickaxey = 2, building_block = 1, waxed = 1}, + groups = {pickaxey = 2, building_block = 1, waxed = 1, stonecuttable=1}, sounds = mcl_sounds.node_sound_metal_defaults(), _mcl_blast_resistance = 6, _mcl_hardness = 5, @@ -132,7 +132,7 @@ minetest.register_node("mcl_copper:block_cut", { _doc_items_longdesc = S("Cut copper is a decorative block."), tiles = {"mcl_copper_block_cut.png"}, is_ground_content = false, - groups = {pickaxey = 2, building_block = 1, oxidizable = 1}, + groups = {pickaxey = 2, building_block = 1, oxidizable = 1, stonecuttable=1}, sounds = mcl_sounds.node_sound_metal_defaults(), _mcl_blast_resistance = 6, _mcl_hardness = 5, @@ -145,7 +145,7 @@ minetest.register_node("mcl_copper:waxed_block_cut", { _doc_items_longdesc = S("Cut copper is a decorative block."), tiles = {"mcl_copper_block_cut.png"}, is_ground_content = false, - groups = {pickaxey = 2, building_block = 1, waxed = 1}, + groups = {pickaxey = 2, building_block = 1, waxed = 1, stonecuttable=1}, sounds = mcl_sounds.node_sound_metal_defaults(), _mcl_blast_resistance = 6, _mcl_hardness = 5, @@ -157,7 +157,7 @@ minetest.register_node("mcl_copper:block_exposed_cut", { _doc_items_longdesc = S("Exposed cut copper is a decorative block."), tiles = {"mcl_copper_exposed_cut.png"}, is_ground_content = false, - groups = {pickaxey = 2, building_block = 1, oxidizable = 1}, + groups = {pickaxey = 2, building_block = 1, oxidizable = 1, stonecuttable=1}, sounds = mcl_sounds.node_sound_metal_defaults(), _mcl_blast_resistance = 6, _mcl_hardness = 5, @@ -171,7 +171,7 @@ minetest.register_node("mcl_copper:waxed_block_exposed_cut", { _doc_items_longdesc = S("Exposed cut copper is a decorative block."), tiles = {"mcl_copper_exposed_cut.png"}, is_ground_content = false, - groups = {pickaxey = 2, building_block = 1, waxed = 1}, + groups = {pickaxey = 2, building_block = 1, waxed = 1, stonecuttable=1}, sounds = mcl_sounds.node_sound_metal_defaults(), _mcl_blast_resistance = 6, _mcl_hardness = 5, @@ -183,7 +183,7 @@ minetest.register_node("mcl_copper:block_weathered_cut", { _doc_items_longdesc = S("Weathered cut copper is a decorative block."), tiles = {"mcl_copper_weathered_cut.png"}, is_ground_content = false, - groups = {pickaxey = 2, building_block = 1, oxidizable = 1}, + groups = {pickaxey = 2, building_block = 1, oxidizable = 1, stonecuttable=1}, sounds = mcl_sounds.node_sound_metal_defaults(), _mcl_blast_resistance = 6, _mcl_hardness = 5, @@ -197,7 +197,7 @@ minetest.register_node("mcl_copper:waxed_block_weathered_cut", { _doc_items_longdesc = S("Weathered cut copper is a decorative block."), tiles = {"mcl_copper_weathered_cut.png"}, is_ground_content = false, - groups = {pickaxey = 2, building_block = 1, waxed = 1}, + groups = {pickaxey = 2, building_block = 1, waxed = 1, stonecuttable=1}, sounds = mcl_sounds.node_sound_metal_defaults(), _mcl_blast_resistance = 6, _mcl_hardness = 5, @@ -209,7 +209,7 @@ minetest.register_node("mcl_copper:block_oxidized_cut", { _doc_items_longdesc = S("Oxidized cut copper is a decorative block."), tiles = {"mcl_copper_oxidized_cut.png"}, is_ground_content = false, - groups = {pickaxey = 2, building_block = 1}, + groups = {pickaxey = 2, building_block = 1, stonecuttable=1}, sounds = mcl_sounds.node_sound_metal_defaults(), _mcl_blast_resistance = 6, _mcl_hardness = 5, @@ -222,7 +222,7 @@ minetest.register_node("mcl_copper:waxed_block_oxidized_cut", { _doc_items_longdesc = S("Oxidized cut copper is a decorative block."), tiles = {"mcl_copper_oxidized_cut.png"}, is_ground_content = false, - groups = {pickaxey = 2, building_block = 1, waxed = 1}, + groups = {pickaxey = 2, building_block = 1, waxed = 1, stonecuttable=1}, sounds = mcl_sounds.node_sound_metal_defaults(), _mcl_blast_resistance = 6, _mcl_hardness = 5, diff --git a/mods/ITEMS/mcl_core/nodes_base.lua b/mods/ITEMS/mcl_core/nodes_base.lua index f36d5cabd..3f269def4 100644 --- a/mods/ITEMS/mcl_core/nodes_base.lua +++ b/mods/ITEMS/mcl_core/nodes_base.lua @@ -27,7 +27,7 @@ minetest.register_node("mcl_core:stone", { tiles = {"default_stone.png"}, is_ground_content = true, stack_max = 64, - groups = {pickaxey=1, stone=1, building_block=1, material_stone=1}, + groups = {pickaxey=1, stone=1, building_block=1, material_stone=1, stonecuttable=1}, drop = "mcl_core:cobble", sounds = mcl_sounds.node_sound_stone_defaults(), _mcl_blast_resistance = 6, @@ -236,7 +236,7 @@ minetest.register_node("mcl_core:stonebrick", { _doc_items_longdesc = doc.sub.items.temp.build, tiles = {"default_stone_brick.png"}, stack_max = 64, - groups = {pickaxey=1, stone=1, stonebrick=1, building_block=1, material_stone=1}, + groups = {pickaxey=1, stone=1, stonebrick=1, building_block=1, material_stone=1, stonecuttable=1}, sounds = mcl_sounds.node_sound_stone_defaults(), is_ground_content = false, _mcl_blast_resistance = 6, @@ -272,7 +272,7 @@ minetest.register_node("mcl_core:stonebrickmossy", { _doc_items_longdesc = doc.sub.items.temp.build, tiles = {"mcl_core_stonebrick_mossy.png"}, stack_max = 64, - groups = {pickaxey=1, stone=1, stonebrick=1, building_block=1, material_stone=1}, + groups = {pickaxey=1, stone=1, stonebrick=1, building_block=1, material_stone=1, stonecuttable=1}, sounds = mcl_sounds.node_sound_stone_defaults(), is_ground_content = false, _mcl_blast_resistance = 6, @@ -284,7 +284,7 @@ minetest.register_node("mcl_core:stone_smooth", { _doc_items_longdesc = doc.sub.items.temp.build, tiles = {"mcl_stairs_stone_slab_top.png"}, stack_max = 64, - groups = {pickaxey=1, stone=1, building_block=1, material_stone=1}, + groups = {pickaxey=1, stone=1, building_block=1, material_stone=1, stonecuttable=1}, sounds = mcl_sounds.node_sound_stone_defaults(), is_ground_content = false, _mcl_blast_resistance = 6, @@ -297,7 +297,7 @@ minetest.register_node("mcl_core:granite", { tiles = {"mcl_core_granite.png"}, is_ground_content = true, stack_max = 64, - groups = {pickaxey=1, stone=1, building_block=1, material_stone=1}, + groups = {pickaxey=1, stone=1, building_block=1, material_stone=1, stonecuttable=1}, sounds = mcl_sounds.node_sound_stone_defaults(), _mcl_blast_resistance = 6, _mcl_hardness = 1.5, @@ -309,7 +309,7 @@ minetest.register_node("mcl_core:granite_smooth", { tiles = {"mcl_core_granite_smooth.png"}, stack_max = 64, is_ground_content = false, - groups = {pickaxey=1, stone=1, building_block=1, material_stone=1}, + groups = {pickaxey=1, stone=1, building_block=1, material_stone=1, stonecuttable=1}, sounds = mcl_sounds.node_sound_stone_defaults(), _mcl_blast_resistance = 6, _mcl_hardness = 1.5, @@ -321,7 +321,7 @@ minetest.register_node("mcl_core:andesite", { tiles = {"mcl_core_andesite.png"}, is_ground_content = true, stack_max = 64, - groups = {pickaxey=1, stone=1, building_block=1, material_stone=1}, + groups = {pickaxey=1, stone=1, building_block=1, material_stone=1, stonecuttable=1}, sounds = mcl_sounds.node_sound_stone_defaults(), _mcl_blast_resistance = 6, _mcl_hardness = 1.5, @@ -333,7 +333,7 @@ minetest.register_node("mcl_core:andesite_smooth", { tiles = {"mcl_core_andesite_smooth.png"}, is_ground_content = false, stack_max = 64, - groups = {pickaxey=1, stone=1, building_block=1, material_stone=1}, + groups = {pickaxey=1, stone=1, building_block=1, material_stone=1, stonecuttable=1}, sounds = mcl_sounds.node_sound_stone_defaults(), _mcl_blast_resistance = 6, _mcl_hardness = 1.5, @@ -345,7 +345,7 @@ minetest.register_node("mcl_core:diorite", { tiles = {"mcl_core_diorite.png"}, is_ground_content = true, stack_max = 64, - groups = {pickaxey=1, stone=1, building_block=1, material_stone=1}, + groups = {pickaxey=1, stone=1, building_block=1, material_stone=1, stonecuttable=1}, sounds = mcl_sounds.node_sound_stone_defaults(), _mcl_blast_resistance = 6, _mcl_hardness = 1.5, @@ -357,7 +357,7 @@ minetest.register_node("mcl_core:diorite_smooth", { tiles = {"mcl_core_diorite_smooth.png"}, is_ground_content = false, stack_max = 64, - groups = {pickaxey=1, stone=1, building_block=1, material_stone=1}, + groups = {pickaxey=1, stone=1, building_block=1, material_stone=1, stonecuttable=1}, sounds = mcl_sounds.node_sound_stone_defaults(), _mcl_blast_resistance = 6, _mcl_hardness = 1.5, @@ -586,7 +586,7 @@ minetest.register_node("mcl_core:sandstone", { tiles = {"mcl_core_sandstone_top.png", "mcl_core_sandstone_bottom.png", "mcl_core_sandstone_normal.png"}, is_ground_content = true, stack_max = 64, - groups = {pickaxey=1, sandstone=1, normal_sandstone=1, building_block=1, material_stone=1}, + groups = {pickaxey=1, sandstone=1, normal_sandstone=1, building_block=1, material_stone=1, stonecuttable=1}, sounds = mcl_sounds.node_sound_stone_defaults(), _mcl_blast_resistance = 0.8, _mcl_hardness = 0.8, @@ -598,7 +598,7 @@ minetest.register_node("mcl_core:sandstonesmooth", { tiles = {"mcl_core_sandstone_top.png", "mcl_core_sandstone_bottom.png", "mcl_core_sandstone_smooth.png"}, is_ground_content = false, stack_max = 64, - groups = {pickaxey=1, sandstone=1, normal_sandstone=1, building_block=1, material_stone=1}, + groups = {pickaxey=1, sandstone=1, normal_sandstone=1, building_block=1, material_stone=1, stonecuttable=1}, sounds = mcl_sounds.node_sound_stone_defaults(), _mcl_blast_resistance = 6, _mcl_hardness = 2, @@ -623,7 +623,7 @@ minetest.register_node("mcl_core:sandstonesmooth2", { tiles = {"mcl_core_sandstone_top.png"}, is_ground_content = false, stack_max = 64, - groups = {pickaxey=1, sandstone=1, normal_sandstone=1, building_block=1, material_stone=1}, + groups = {pickaxey=1, sandstone=1, normal_sandstone=1, building_block=1, material_stone=1, stonecuttable=1}, sounds = mcl_sounds.node_sound_stone_defaults(), _mcl_blast_resistance = 6, _mcl_hardness = 2, @@ -649,7 +649,7 @@ minetest.register_node("mcl_core:redsandstone", { tiles = {"mcl_core_red_sandstone_top.png", "mcl_core_red_sandstone_bottom.png", "mcl_core_red_sandstone_normal.png"}, is_ground_content = true, stack_max = 64, - groups = {pickaxey=1, sandstone=1, red_sandstone=1, building_block=1, material_stone=1}, + groups = {pickaxey=1, sandstone=1, red_sandstone=1, building_block=1, material_stone=1, stonecuttable=1}, sounds = mcl_sounds.node_sound_stone_defaults(), _mcl_blast_resistance = 0.8, _mcl_hardness = 0.8, @@ -661,7 +661,7 @@ minetest.register_node("mcl_core:redsandstonesmooth", { tiles = {"mcl_core_red_sandstone_top.png", "mcl_core_red_sandstone_bottom.png", "mcl_core_red_sandstone_smooth.png"}, is_ground_content = false, stack_max = 64, - groups = {pickaxey=1, sandstone=1, red_sandstone=1, building_block=1, material_stone=1}, + groups = {pickaxey=1, sandstone=1, red_sandstone=1, building_block=1, material_stone=1, stonecuttable=1}, sounds = mcl_sounds.node_sound_stone_defaults(), _mcl_blast_resistance = 0.8, _mcl_hardness = 0.8, @@ -685,7 +685,7 @@ minetest.register_node("mcl_core:redsandstonesmooth2", { tiles = {"mcl_core_red_sandstone_top.png"}, is_ground_content = false, stack_max = 64, - groups = {pickaxey=1, sandstone=1, red_sandstone=1, building_block=1, material_stone=1}, + groups = {pickaxey=1, sandstone=1, red_sandstone=1, building_block=1, material_stone=1, stonecuttable=1}, sounds = mcl_sounds.node_sound_stone_defaults(), _mcl_blast_resistance = 0.8, _mcl_hardness = 0.8, @@ -715,7 +715,7 @@ minetest.register_node("mcl_core:brick_block", { tiles = {"default_brick.png"}, is_ground_content = false, stack_max = 64, - groups = {pickaxey=1, building_block=1, material_stone=1}, + groups = {pickaxey=1, building_block=1, material_stone=1, stonecuttable=1}, sounds = mcl_sounds.node_sound_stone_defaults(), _mcl_blast_resistance = 6, _mcl_hardness = 2, @@ -768,7 +768,7 @@ minetest.register_node("mcl_core:cobble", { tiles = {"default_cobble.png"}, is_ground_content = false, stack_max = 64, - groups = {pickaxey=1, building_block=1, material_stone=1, cobble=1}, + groups = {pickaxey=1, building_block=1, material_stone=1, cobble=1, stonecuttable=1}, sounds = mcl_sounds.node_sound_stone_defaults(), _mcl_blast_resistance = 6, _mcl_hardness = 2, @@ -780,7 +780,7 @@ minetest.register_node("mcl_core:mossycobble", { tiles = {"default_mossycobble.png"}, is_ground_content = false, stack_max = 64, - groups = {pickaxey=1, building_block=1, material_stone=1}, + groups = {pickaxey=1, building_block=1, material_stone=1, stonecuttable=1}, sounds = mcl_sounds.node_sound_stone_defaults(), _mcl_blast_resistance = 6, _mcl_hardness = 2, diff --git a/mods/ITEMS/mcl_end/building.lua b/mods/ITEMS/mcl_end/building.lua index 82f6e76e4..f96c10633 100644 --- a/mods/ITEMS/mcl_end/building.lua +++ b/mods/ITEMS/mcl_end/building.lua @@ -13,7 +13,7 @@ minetest.register_node("mcl_end:end_stone", { _doc_items_longdesc = doc.sub.items.temp.build, tiles = {"mcl_end_end_stone.png"}, stack_max = 64, - groups = {pickaxey=1, building_block=1, material_stone=1}, + groups = {pickaxey=1, building_block=1, material_stone=1, stonecuttable=1}, sounds = mcl_sounds.node_sound_stone_defaults(), after_dig_node = mcl_end.check_detach_chorus_plant, _mcl_blast_resistance = 9, @@ -26,7 +26,7 @@ minetest.register_node("mcl_end:end_bricks", { tiles = {"mcl_end_end_bricks.png"}, is_ground_content = false, stack_max = 64, - groups = {pickaxey=1, building_block=1, material_stone=1}, + groups = {pickaxey=1, building_block=1, material_stone=1, stonecuttable=1}, sounds = mcl_sounds.node_sound_stone_defaults(), _mcl_blast_resistance = 9, _mcl_hardness = 3, @@ -38,7 +38,7 @@ minetest.register_node("mcl_end:purpur_block", { tiles = {"mcl_end_purpur_block.png"}, is_ground_content = false, stack_max = 64, - groups = {pickaxey=1, building_block=1, material_stone=1, purpur_block=1}, + groups = {pickaxey=1, building_block=1, material_stone=1, purpur_block=1, stonecuttable=1}, sounds = mcl_sounds.node_sound_stone_defaults(), _mcl_blast_resistance = 6, _mcl_hardness = 1.5, diff --git a/mods/ITEMS/mcl_mud/init.lua b/mods/ITEMS/mcl_mud/init.lua index 64ff36c09..b7542e0d5 100644 --- a/mods/ITEMS/mcl_mud/init.lua +++ b/mods/ITEMS/mcl_mud/init.lua @@ -38,7 +38,7 @@ minetest.register_node("mcl_mud:mud_bricks", { _doc_items_longdesc = S("Decorative block crafted from packed mud."), _doc_items_hidden = false, tiles = {"mcl_mud_bricks.png"}, - groups = {handy=1, pickaxey=1, building_block=1}, + groups = {handy=1, pickaxey=1, building_block=1, stonecuttable=1}, sounds = mcl_sounds.node_sound_stone_defaults(), _mcl_blast_resistance = 3, _mcl_hardness = 1.5, diff --git a/mods/ITEMS/mcl_nether/init.lua b/mods/ITEMS/mcl_nether/init.lua index 548bd90d5..81b6d352c 100644 --- a/mods/ITEMS/mcl_nether/init.lua +++ b/mods/ITEMS/mcl_nether/init.lua @@ -176,7 +176,7 @@ minetest.register_node("mcl_nether:nether_brick", { stack_max = 64, tiles = {"mcl_nether_nether_brick.png"}, is_ground_content = false, - groups = {pickaxey=1, building_block=1, material_stone=1}, + groups = {pickaxey=1, building_block=1, material_stone=1, stonecuttable=1}, sounds = mcl_sounds.node_sound_stone_defaults(), _mcl_blast_resistance = 6, _mcl_hardness = 2, @@ -189,7 +189,7 @@ minetest.register_node("mcl_nether:red_nether_brick", { stack_max = 64, tiles = {"mcl_nether_red_nether_brick.png"}, is_ground_content = false, - groups = {pickaxey=1, building_block=1, material_stone=1}, + groups = {pickaxey=1, building_block=1, material_stone=1, stonecuttable=1}, sounds = mcl_sounds.node_sound_stone_defaults(), _mcl_blast_resistance = 6, _mcl_hardness = 2, @@ -219,7 +219,7 @@ minetest.register_node("mcl_nether:quartz_block", { stack_max = 64, is_ground_content = false, tiles = {"mcl_nether_quartz_block_top.png", "mcl_nether_quartz_block_bottom.png", "mcl_nether_quartz_block_side.png"}, - groups = {pickaxey=1, quartz_block=1,building_block=1, material_stone=1}, + groups = {pickaxey=1, quartz_block=1,building_block=1, material_stone=1, stonecuttable=1}, sounds = mcl_sounds.node_sound_stone_defaults(), _mcl_blast_resistance = 0.8, _mcl_hardness = 0.8, @@ -257,7 +257,7 @@ minetest.register_node("mcl_nether:quartz_smooth", { stack_max = 64, is_ground_content = false, tiles = {"mcl_nether_quartz_block_bottom.png"}, - groups = {pickaxey=1, quartz_block=1,building_block=1, material_stone=1}, + groups = {pickaxey=1, quartz_block=1,building_block=1, material_stone=1, stonecuttable=1}, sounds = mcl_sounds.node_sound_stone_defaults(), _mcl_blast_resistance = 0.8, _mcl_hardness = 0.8, diff --git a/mods/ITEMS/mcl_ocean/prismarine.lua b/mods/ITEMS/mcl_ocean/prismarine.lua index fff07cb7e..e3b899a49 100644 --- a/mods/ITEMS/mcl_ocean/prismarine.lua +++ b/mods/ITEMS/mcl_ocean/prismarine.lua @@ -38,7 +38,7 @@ minetest.register_node("mcl_ocean:prismarine", { is_ground_content = false, -- Texture should have 22 frames for smooth transitions. tiles = {{name="mcl_ocean_prismarine_anim.png", animation={type="vertical_frames", aspect_w=32, aspect_h=32, length=45.0}}}, - groups = {pickaxey=1, building_block=1, material_stone=1}, + groups = {pickaxey=1, building_block=1, material_stone=1, stonecuttable=1}, sounds = mcl_sounds.node_sound_stone_defaults(), _mcl_blast_resistance = 6, _mcl_hardness = 1.5, @@ -50,7 +50,7 @@ minetest.register_node("mcl_ocean:prismarine_brick", { stack_max = 64, is_ground_content = false, tiles = {"mcl_ocean_prismarine_bricks.png"}, - groups = {pickaxey=1, building_block=1, material_stone=1}, + groups = {pickaxey=1, building_block=1, material_stone=1, stonecuttable=1}, sounds = mcl_sounds.node_sound_stone_defaults(), _mcl_blast_resistance = 6, _mcl_hardness = 1.5, @@ -62,7 +62,7 @@ minetest.register_node("mcl_ocean:prismarine_dark", { stack_max = 64, is_ground_content = false, tiles = {"mcl_ocean_prismarine_dark.png"}, - groups = {pickaxey=1, building_block=1, material_stone=1}, + groups = {pickaxey=1, building_block=1, material_stone=1, stonecuttable=1}, sounds = mcl_sounds.node_sound_stone_defaults(), _mcl_blast_resistance = 6, _mcl_hardness = 1.5, diff --git a/mods/ITEMS/mcl_stonecutter/init.lua b/mods/ITEMS/mcl_stonecutter/init.lua index 44a25d2dc..a8d3f4d14 100644 --- a/mods/ITEMS/mcl_stonecutter/init.lua +++ b/mods/ITEMS/mcl_stonecutter/init.lua @@ -7,33 +7,6 @@ local S = minetest.get_translator("mcl_stonecutter") -- compatible items for the stonecutter local compaitble_items = { - "mcl_core:cobble", - "mcl_core:mossycobble", - "mcl_core:stone", - "mcl_core:stone_smooth", - "mcl_core:granite", - "mcl_core:granite_smooth", - "mcl_core:diorite", - "mcl_core:diorite_smooth", - "mcl_core:andesite", - "mcl_core:andesite_smooth", - "mcl_core:stonebrick", - "mcl_core:stonebrickmossy", - "mcl_core:sandstone", - "mcl_core:redsandstone", - "mcl_core:brick_block", - "mcl_ocean:prismarine", - "mcl_ocean:prismarine_brick", - "mcl_ocean:prismarine_dark", - "mcl_mud:mud_bricks", - "mcl_nether:quartzblock", - "mcl_nether:quartz_smooth", - "mcl_nether:red_nether_brick", - "mcl_nether:nether_brick", - "mcl_end:purpur_block", - "mcl_end:end_bricks", - "mcl_blackstone:blackstone", - "mcl_blackstone:blackstone_polished" } local FMT = { @@ -96,16 +69,6 @@ local function get_item_string_name(input) end end --- Simply checks if the item is compaitble with the stonecutter -local function is_input_in_table(element) - for _, value in ipairs(compaitble_items) do - if value == element then - return true - end - end - return false -end - -- Updates the formspec local function update_stonecutter_slots(meta) local inv = meta:get_inventory() @@ -114,7 +77,7 @@ local function update_stonecutter_slots(meta) local new_output = meta:get_string("cut_stone") -- Checks if input is in the array - if is_input_in_table(name) then + if minetest.get_item_group(name, "stonecuttable") > 0 then local cuttable_recipes = {} local name_stripped = get_item_string_name(input:to_string()) if name_stripped ~= "" then @@ -154,7 +117,7 @@ local function update_stonecutter_slots(meta) -- Checks if the chosen item is a slab or not, if it's a slab set the output to be a stack of 2 if new_output ~= '' then - cut_item = ItemStack(new_output) + local cut_item = ItemStack(new_output) if string.find(new_output, "mcl_stairs:slab_") then cut_item:set_count(2) else @@ -306,7 +269,6 @@ minetest.register_node("mcl_stonecutter:stonecutter", { meta:set_string("formspec", form) end, on_rightclick = function(pos, node, player, itemstack) - local name = player:get_player_name() if not player:get_player_control().sneak then local meta = minetest.get_meta(pos) update_stonecutter_slots(meta) From ca37ce5744ba8bd4b35d610e57e3b87d0cd55c30 Mon Sep 17 00:00:00 2001 From: ChrisPHP Date: Sun, 6 Aug 2023 12:49:27 +0100 Subject: [PATCH 300/982] Remove hardcoded one element array --- mods/ITEMS/mcl_stonecutter/init.lua | 10 +--------- 1 file changed, 1 insertion(+), 9 deletions(-) diff --git a/mods/ITEMS/mcl_stonecutter/init.lua b/mods/ITEMS/mcl_stonecutter/init.lua index a8d3f4d14..b532c68c5 100644 --- a/mods/ITEMS/mcl_stonecutter/init.lua +++ b/mods/ITEMS/mcl_stonecutter/init.lua @@ -5,14 +5,6 @@ local S = minetest.get_translator("mcl_stonecutter") --- compatible items for the stonecutter -local compaitble_items = { -} - -local FMT = { - item_image_button = "item_image_button[%f,%f;%f,%f;%s;%s;%s]", -} - -- formspecs local function show_stonecutter_formspec(items, input) local cut_items = {} @@ -27,7 +19,7 @@ local function show_stonecutter_formspec(items, input) y_len = y_len + 1 x_len = 1 end - local test = string.format(FMT.item_image_button,x_len+1,y_len,1,1, value, "item_button", value) + local test = string.format("item_image_button[%f,%f;%f,%f;%s;%s;%s]",x_len+1,y_len,1,1, value, "item_button", value) cut_items[index] = test end end From 01d43bb33aa2c483887aafadbd58741fb7f6baa7 Mon Sep 17 00:00:00 2001 From: ChrisPHP Date: Sun, 6 Aug 2023 13:07:32 +0100 Subject: [PATCH 301/982] Remove unused meta on drop items --- mods/ITEMS/mcl_stonecutter/init.lua | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/mods/ITEMS/mcl_stonecutter/init.lua b/mods/ITEMS/mcl_stonecutter/init.lua index b532c68c5..77ca5c066 100644 --- a/mods/ITEMS/mcl_stonecutter/init.lua +++ b/mods/ITEMS/mcl_stonecutter/init.lua @@ -26,7 +26,7 @@ local function show_stonecutter_formspec(items, input) local formspec = "size[9,8.75]".. "label[0,4.0;"..minetest.formspec_escape(minetest.colorize("#313131", S("Inventory"))).."]".. - "label[1,0.1;"..minetest.formspec_escape(minetest.colorize("#313131", S("Stonecutter"))).."]".. + "label[1,0.1;"..minetest.formspec_escape(minetest.colorize("#313131", S("Stone Cutter"))).."]".. "list[context;main;0,0;8,4;]".. "list[current_player;main;0,4.5;9,3;9]".. mcl_formspec.get_itemslot_bg(0,4.5,9,3).. @@ -175,10 +175,8 @@ minetest.register_node("mcl_stonecutter:stonecutter", { after_dig_node = function(pos, oldnode, oldmetadata, digger) local meta = minetest.get_meta(pos) - local meta2 = meta:to_table() meta:from_table(oldmetadata) drop_stonecutter_items(pos, meta) - meta:from_table(meta2) end, allow_metadata_inventory_take = function(pos, listname, index, stack, player) local name = player:get_player_name() From a9f26fb3547cbe79811ef6c7736b84c2ffc36aa4 Mon Sep 17 00:00:00 2001 From: ChrisPHP Date: Sun, 6 Aug 2023 20:14:58 +0100 Subject: [PATCH 302/982] use item groups to determine the cuttable items --- mods/ITEMS/mcl_blackstone/init.lua | 58 ++++++-- mods/ITEMS/mcl_copper/nodes.lua | 64 ++++---- mods/ITEMS/mcl_core/nodes_base.lua | 40 ++--- mods/ITEMS/mcl_end/building.lua | 8 +- mods/ITEMS/mcl_mud/init.lua | 2 +- mods/ITEMS/mcl_nether/init.lua | 12 +- mods/ITEMS/mcl_ocean/prismarine.lua | 6 +- mods/ITEMS/mcl_stairs/register.lua | 223 +++++++++++++++++++++++----- mods/ITEMS/mcl_stonecutter/init.lua | 67 +++------ mods/ITEMS/mcl_walls/register.lua | 30 ++-- 10 files changed, 338 insertions(+), 172 deletions(-) diff --git a/mods/ITEMS/mcl_blackstone/init.lua b/mods/ITEMS/mcl_blackstone/init.lua index e1bf751cd..c46fba97b 100644 --- a/mods/ITEMS/mcl_blackstone/init.lua +++ b/mods/ITEMS/mcl_blackstone/init.lua @@ -12,7 +12,7 @@ minetest.register_node("mcl_blackstone:blackstone", { tiles = {"mcl_blackstone_top.png", "mcl_blackstone_top.png", "mcl_blackstone_side.png"}, sounds = mcl_sounds.node_sound_stone_defaults(), is_ground_content = false, - groups = {cracky = 3, pickaxey=1, material_stone=1, cobble=1, stonecuttable=1, stonecuttable=1}, + groups = {cracky = 3, pickaxey=1, material_stone=1, cobble=1, stonecuttable=21}, _mcl_blast_resistance = 6, _mcl_hardness = 1.5, }) @@ -73,7 +73,7 @@ minetest.register_node("mcl_blackstone:basalt_polished", { on_place = mcl_util.rotate_axis, on_rotate = on_rotate, is_ground_content = false, - groups = {cracky = 3, pickaxey=1, material_stone=1}, + groups = {cracky = 3, pickaxey=1, material_stone=1, stonecutter_output=19}, _mcl_blast_resistance = 4.2, _mcl_hardness = 1.25, }) @@ -85,7 +85,7 @@ minetest.register_node("mcl_blackstone:basalt", { on_place = mcl_util.rotate_axis, on_rotate = on_rotate, is_ground_content = false, - groups = {cracky = 3, pickaxey=1, material_stone=1}, + groups = {cracky = 3, pickaxey=1, material_stone=1, stonecuttable=19}, _mcl_blast_resistance = 4.2, _mcl_hardness = 1.25, }) @@ -103,7 +103,7 @@ minetest.register_node("mcl_blackstone:blackstone_polished", { tiles = {"mcl_blackstone_polished.png"}, sounds = mcl_sounds.node_sound_stone_defaults(), is_ground_content = false, - groups = {cracky = 3, pickaxey=1, material_stone=1, stonecuttable=1}, + groups = {cracky = 3, pickaxey=1, material_stone=1, stonecuttable=21, stonecutter_output=21}, _mcl_blast_resistance = 6, _mcl_hardness = 2, }) @@ -112,7 +112,7 @@ minetest.register_node("mcl_blackstone:blackstone_chiseled_polished", { tiles = {"mcl_blackstone_chiseled_polished.png"}, sounds = mcl_sounds.node_sound_stone_defaults(), is_ground_content = false, - groups = {cracky = 3, pickaxey=1, material_stone=1}, + groups = {cracky = 3, pickaxey=1, material_stone=1, stonecutter_output=21}, _mcl_blast_resistance = 6, _mcl_hardness = 1.5, }) @@ -121,7 +121,7 @@ minetest.register_node("mcl_blackstone:blackstone_brick_polished", { tiles = {"mcl_blackstone_polished_bricks.png"}, sounds = mcl_sounds.node_sound_stone_defaults(), is_ground_content = false, - groups = {cracky = 3, pickaxey=1, material_stone=1}, + groups = {cracky = 3, pickaxey=1, material_stone=1, stonecutter_output=21}, _mcl_blast_resistance = 6, _mcl_hardness = 1.5, }) @@ -131,7 +131,7 @@ minetest.register_node("mcl_blackstone:quartz_brick", { sounds = mcl_sounds.node_sound_stone_defaults(), is_ground_content = false, sounds = mcl_sounds.node_sound_stone_defaults(), - groups = {cracky = 3, pickaxey=1, material_stone=1}, + groups = {cracky = 3, pickaxey=1, material_stone=1, stonecutter_output=14}, _mcl_blast_resistance = 0.8, _mcl_hardness = 0.8, }) @@ -193,16 +193,50 @@ minetest.registered_nodes["mcl_fire:fire"].on_construct=function(pos) end --slabs/stairs -mcl_stairs.register_stair_and_slab_simple("blackstone", "mcl_blackstone:blackstone", S("Blackstone Stair"), S("Blackstone Slab"), S("Double Blackstone Slab")) -mcl_stairs.register_stair_and_slab_simple("blackstone_polished", "mcl_blackstone:blackstone_polished", S("Polished Blackstone Stair"), S("Polished Blackstone Slab"), S("Polished Double Blackstone Slab")) -mcl_stairs.register_stair_and_slab_simple("blackstone_chiseled_polished", "mcl_blackstone:blackstone_chiseled_polished", S("Chiseled Polished Blackstone Stair"), S("Chiseled Polished Blackstone Slab"), S("Double Chiseled Polished Blackstone Slab")) -mcl_stairs.register_stair_and_slab_simple("blackstone_brick_polished", "mcl_blackstone:blackstone_brick_polished", S("Polished Blackstone Brick Stair"), S("Polished Blackstone Brick Slab"), S("Double Polished Blackstone Brick Slab")) +mcl_stairs.register_stair_and_slab("blackstone", "mcl_blackstone:blackstone", + {cracky=3, pickaxey=1, material_stone=1, stonecutter_output=21}, + {"mcl_blackstone_top.png", "mcl_blackstone_top.png", "mcl_blackstone_side.png"}, + S("Blackstone Stairs"), + S("Blackstone Slab"), + mcl_sounds.node_sound_stone_defaults(), 6, 2, + S("Double Blackstone Slab"), nil) + +mcl_stairs.register_stair_and_slab("blackstone_polished", "mcl_blackstone:blackstone_polished", + {cracky=3, pickaxey=1, material_stone=1, stonecutter_output=21}, + {"mcl_blackstone_polished.png"}, + S("Polished Blackstone Stairs"), + S("Polished Blackstone Slab"), + mcl_sounds.node_sound_stone_defaults(), 6, 2, + S("Double Polished Blackstone Slab"), nil) + +mcl_stairs.register_stair_and_slab("blackstone_chiseled_polished", "mcl_blackstone:blackstone_chiseled_polished", + {cracky=3, pickaxey=1, material_stone=1, stonecutter_output=21}, + {"mcl_blackstone_chiseled_polished.png"}, + S("Chiseled Polished Blackstone Stairs"), + S("Chiseled Polished Blackstone Slab"), + mcl_sounds.node_sound_stone_defaults(), 6, 2, + S("Double Chiseled Polished Blackstone Slab"), nil) + +mcl_stairs.register_stair_and_slab("blackstone_brick_polished", "mcl_blackstone:blackstone_brick_polished", + {cracky=3, pickaxey=1, material_stone=1, stonecutter_output=21}, + {"mcl_blackstone_polished_bricks.png"}, + S("Polished Blackstone Brick Stair Stairs"), + S("Polished Blackstone Brick Stair Slab"), + mcl_sounds.node_sound_stone_defaults(), 6, 2, + S("Double Polished Blackstone Brick Stair Slab"), nil) --Wall mcl_walls.register_wall( "mcl_blackstone:wall", S("Blackstone Wall"), - "mcl_blackstone:blackstone" + "mcl_blackstone:blackstone", + { + "mcl_blackstone_top.png", + "mcl_blackstone_top.png", + "mcl_blackstone_side.png" + }, + "", + { cracky=3, pickaxey=1, material_stone=1, stonecutter_output=21 } ) --lavacooling diff --git a/mods/ITEMS/mcl_copper/nodes.lua b/mods/ITEMS/mcl_copper/nodes.lua index b7b78a542..f131d9967 100644 --- a/mods/ITEMS/mcl_copper/nodes.lua +++ b/mods/ITEMS/mcl_copper/nodes.lua @@ -30,7 +30,7 @@ minetest.register_node("mcl_copper:block", { _doc_items_longdesc = S("A block of copper is mostly a decorative block."), tiles = {"mcl_copper_block.png"}, is_ground_content = false, - groups = {pickaxey = 2, building_block = 1, oxidizable = 1, stonecuttable=1}, + groups = {pickaxey = 2, building_block = 1, oxidizable = 1, stonecuttable=22}, sounds = mcl_sounds.node_sound_metal_defaults(), _mcl_blast_resistance = 6, _mcl_hardness = 3, @@ -43,7 +43,7 @@ minetest.register_node("mcl_copper:waxed_block", { _doc_items_longdesc = S("A block of copper is mostly a decorative block."), tiles = {"mcl_copper_block.png"}, is_ground_content = false, - groups = {pickaxey = 2, building_block = 1, waxed = 1, stonecuttable=1}, + groups = {pickaxey = 2, building_block = 1, waxed = 1, stonecuttable=23}, sounds = mcl_sounds.node_sound_metal_defaults(), _mcl_blast_resistance = 6, _mcl_hardness = 3, @@ -55,7 +55,7 @@ minetest.register_node("mcl_copper:block_exposed", { _doc_items_longdesc = S("Exposed copper is a decorative block."), tiles = {"mcl_copper_exposed.png"}, is_ground_content = false, - groups = {pickaxey = 2, building_block = 1, oxidizable = 1, stonecuttable=1}, + groups = {pickaxey = 2, building_block = 1, oxidizable = 1, stonecuttable=24}, sounds = mcl_sounds.node_sound_metal_defaults(), _mcl_blast_resistance = 6, _mcl_hardness = 5, @@ -69,7 +69,7 @@ minetest.register_node("mcl_copper:waxed_block_exposed", { _doc_items_longdesc = S("Exposed copper is a decorative block."), tiles = {"mcl_copper_exposed.png"}, is_ground_content = false, - groups = {pickaxey = 2, building_block = 1, waxed = 1, stonecuttable=1}, + groups = {pickaxey = 2, building_block = 1, waxed = 1, stonecuttable=25}, sounds = mcl_sounds.node_sound_metal_defaults(), _mcl_blast_resistance = 6, _mcl_hardness = 5, @@ -81,7 +81,7 @@ minetest.register_node("mcl_copper:block_weathered", { _doc_items_longdesc = S("Weathered copper is a decorative block."), tiles = {"mcl_copper_weathered.png"}, is_ground_content = false, - groups = {pickaxey = 2, building_block = 1, oxidizable = 1, stonecuttable=1}, + groups = {pickaxey = 2, building_block = 1, oxidizable = 1, stonecuttable=26}, sounds = mcl_sounds.node_sound_metal_defaults(), _mcl_blast_resistance = 6, _mcl_hardness = 5, @@ -95,7 +95,7 @@ minetest.register_node("mcl_copper:waxed_block_weathered", { _doc_items_longdesc = S("Weathered copper is a decorative block."), tiles = {"mcl_copper_weathered.png"}, is_ground_content = false, - groups = {pickaxey = 2, building_block = 1, waxed = 1, stonecuttable=1}, + groups = {pickaxey = 2, building_block = 1, waxed = 1, stonecuttable=27}, sounds = mcl_sounds.node_sound_metal_defaults(), _mcl_blast_resistance = 6, _mcl_hardness = 5, @@ -107,7 +107,7 @@ minetest.register_node("mcl_copper:block_oxidized", { _doc_items_longdesc = S("Oxidized copper is a decorative block."), tiles = {"mcl_copper_oxidized.png"}, is_ground_content = false, - groups = {pickaxey = 2, building_block = 1, stonecuttable=1}, + groups = {pickaxey = 2, building_block = 1, stonecuttable=28}, sounds = mcl_sounds.node_sound_metal_defaults(), _mcl_blast_resistance = 6, _mcl_hardness = 5, @@ -120,7 +120,7 @@ minetest.register_node("mcl_copper:waxed_block_oxidized", { _doc_items_longdesc = S("Oxidized copper is a decorative block."), tiles = {"mcl_copper_oxidized.png"}, is_ground_content = false, - groups = {pickaxey = 2, building_block = 1, waxed = 1, stonecuttable=1}, + groups = {pickaxey = 2, building_block = 1, waxed = 1, stonecuttable=29}, sounds = mcl_sounds.node_sound_metal_defaults(), _mcl_blast_resistance = 6, _mcl_hardness = 5, @@ -132,7 +132,7 @@ minetest.register_node("mcl_copper:block_cut", { _doc_items_longdesc = S("Cut copper is a decorative block."), tiles = {"mcl_copper_block_cut.png"}, is_ground_content = false, - groups = {pickaxey = 2, building_block = 1, oxidizable = 1, stonecuttable=1}, + groups = {pickaxey = 2, building_block = 1, oxidizable = 1, stonecuttable=22, stonecutter_output=22}, sounds = mcl_sounds.node_sound_metal_defaults(), _mcl_blast_resistance = 6, _mcl_hardness = 5, @@ -145,7 +145,7 @@ minetest.register_node("mcl_copper:waxed_block_cut", { _doc_items_longdesc = S("Cut copper is a decorative block."), tiles = {"mcl_copper_block_cut.png"}, is_ground_content = false, - groups = {pickaxey = 2, building_block = 1, waxed = 1, stonecuttable=1}, + groups = {pickaxey = 2, building_block = 1, waxed = 1, stonecuttable=23, stonecutter_output=23}, sounds = mcl_sounds.node_sound_metal_defaults(), _mcl_blast_resistance = 6, _mcl_hardness = 5, @@ -157,7 +157,7 @@ minetest.register_node("mcl_copper:block_exposed_cut", { _doc_items_longdesc = S("Exposed cut copper is a decorative block."), tiles = {"mcl_copper_exposed_cut.png"}, is_ground_content = false, - groups = {pickaxey = 2, building_block = 1, oxidizable = 1, stonecuttable=1}, + groups = {pickaxey = 2, building_block = 1, oxidizable = 1, stonecuttable=24, stonecutter_output=24}, sounds = mcl_sounds.node_sound_metal_defaults(), _mcl_blast_resistance = 6, _mcl_hardness = 5, @@ -171,7 +171,7 @@ minetest.register_node("mcl_copper:waxed_block_exposed_cut", { _doc_items_longdesc = S("Exposed cut copper is a decorative block."), tiles = {"mcl_copper_exposed_cut.png"}, is_ground_content = false, - groups = {pickaxey = 2, building_block = 1, waxed = 1, stonecuttable=1}, + groups = {pickaxey = 2, building_block = 1, waxed = 1, stonecuttable=25, stonecutter_output=25}, sounds = mcl_sounds.node_sound_metal_defaults(), _mcl_blast_resistance = 6, _mcl_hardness = 5, @@ -183,7 +183,7 @@ minetest.register_node("mcl_copper:block_weathered_cut", { _doc_items_longdesc = S("Weathered cut copper is a decorative block."), tiles = {"mcl_copper_weathered_cut.png"}, is_ground_content = false, - groups = {pickaxey = 2, building_block = 1, oxidizable = 1, stonecuttable=1}, + groups = {pickaxey = 2, building_block = 1, oxidizable = 1, stonecuttable=26, stonecutter_output=26}, sounds = mcl_sounds.node_sound_metal_defaults(), _mcl_blast_resistance = 6, _mcl_hardness = 5, @@ -197,7 +197,7 @@ minetest.register_node("mcl_copper:waxed_block_weathered_cut", { _doc_items_longdesc = S("Weathered cut copper is a decorative block."), tiles = {"mcl_copper_weathered_cut.png"}, is_ground_content = false, - groups = {pickaxey = 2, building_block = 1, waxed = 1, stonecuttable=1}, + groups = {pickaxey = 2, building_block = 1, waxed = 1, stonecuttable=27, stonecutter_output=27}, sounds = mcl_sounds.node_sound_metal_defaults(), _mcl_blast_resistance = 6, _mcl_hardness = 5, @@ -209,7 +209,7 @@ minetest.register_node("mcl_copper:block_oxidized_cut", { _doc_items_longdesc = S("Oxidized cut copper is a decorative block."), tiles = {"mcl_copper_oxidized_cut.png"}, is_ground_content = false, - groups = {pickaxey = 2, building_block = 1, stonecuttable=1}, + groups = {pickaxey = 2, building_block = 1, stonecuttable=28, stonecutter_output=28}, sounds = mcl_sounds.node_sound_metal_defaults(), _mcl_blast_resistance = 6, _mcl_hardness = 5, @@ -222,7 +222,7 @@ minetest.register_node("mcl_copper:waxed_block_oxidized_cut", { _doc_items_longdesc = S("Oxidized cut copper is a decorative block."), tiles = {"mcl_copper_oxidized_cut.png"}, is_ground_content = false, - groups = {pickaxey = 2, building_block = 1, waxed = 1, stonecuttable=1}, + groups = {pickaxey = 2, building_block = 1, waxed = 1, stonecuttable=29, stonecutter_output=29}, sounds = mcl_sounds.node_sound_metal_defaults(), _mcl_blast_resistance = 6, _mcl_hardness = 5, @@ -230,112 +230,112 @@ minetest.register_node("mcl_copper:waxed_block_oxidized_cut", { }) mcl_stairs.register_slab("copper_cut", "mcl_copper:block_cut", - {pickaxey = 2, oxidizable = 1}, + {pickaxey = 2, oxidizable = 1, stonecutter_output = 22}, {"mcl_copper_block_cut.png", "mcl_copper_block_cut.png", "mcl_copper_block_cut.png"}, S("Slab of Cut Copper"), nil, nil, nil, S("Double Slab of Cut Copper")) mcl_stairs.register_slab("waxed_copper_cut", "mcl_copper:waxed_block_cut", - {pickaxey = 2, waxed = 1}, + {pickaxey = 2, waxed = 1, stonecutter_output = 23}, {"mcl_copper_block_cut.png", "mcl_copper_block_cut.png", "mcl_copper_block_cut.png"}, S("Waxed Slab of Cut Copper"), nil, nil, nil, S("Waxed Double Slab of Cut Copper")) mcl_stairs.register_slab("copper_exposed_cut", "mcl_copper:block_exposed_cut", - {pickaxey = 2, oxidizable = 1}, + {pickaxey = 2, oxidizable = 1, stonecutter_output = 24}, {"mcl_copper_exposed_cut.png", "mcl_copper_exposed_cut.png", "mcl_copper_exposed_cut.png"}, S("Slab of Exposed Cut Copper"), nil, nil, nil, S("Double Slab of Exposed Cut Copper")) mcl_stairs.register_slab("waxed_copper_exposed_cut", "mcl_copper:waxed_block_exposed_cut", - {pickaxey = 2, waxed = 1}, + {pickaxey = 2, waxed = 1, stonecutter_output = 25}, {"mcl_copper_exposed_cut.png", "mcl_copper_exposed_cut.png", "mcl_copper_exposed_cut.png"}, S("Waxed Slab of Exposed Cut Copper"), nil, nil, nil, S("Waxed Double Slab of Exposed Cut Copper")) mcl_stairs.register_slab("copper_weathered_cut", "mcl_copper:block_weathered_cut", - {pickaxey = 2, oxidizable = 1}, + {pickaxey = 2, oxidizable = 1, stonecutter_output = 26}, {"mcl_copper_weathered_cut.png", "mcl_copper_weathered_cut.png", "mcl_copper_weathered_cut.png"}, S("Slab of Weathered Cut Copper"), nil, nil, nil, S("Double Slab of Weathered Cut Copper")) mcl_stairs.register_slab("waxed_copper_weathered_cut", "mcl_copper:waxed_block_weathered_cut", - {pickaxey = 2, waxed = 1}, + {pickaxey = 2, waxed = 1, stonecutter_output = 27}, {"mcl_copper_weathered_cut.png", "mcl_copper_weathered_cut.png", "mcl_copper_weathered_cut.png"}, S("Waxed Slab of Weathered Cut Copper"), nil, nil, nil, S("Waxed Double Slab of Weathered Cut Copper")) mcl_stairs.register_slab("copper_oxidized_cut", "mcl_copper:block_oxidized_cut", - {pickaxey = 2}, + {pickaxey = 2, stonecutter_output = 28}, {"mcl_copper_oxidized_cut.png", "mcl_copper_oxidized_cut.png", "mcl_copper_oxidized_cut.png"}, S("Slab of Oxidized Cut Copper"), nil, nil, nil, S("Double Slab of Oxidized Cut Copper")) mcl_stairs.register_slab("waxed_copper_oxidized_cut", "mcl_copper:waxed_block_oxidized_cut", - {pickaxey = 2, waxed = 1}, + {pickaxey = 2, waxed = 1, stonecutter_output = 29}, {"mcl_copper_oxidized_cut.png", "mcl_copper_oxidized_cut.png", "mcl_copper_oxidized_cut.png"}, S("Waxed Slab of Oxidized Cut Copper"), nil, nil, nil, S("Waxed Double Slab of Oxidized Cut Copper")) mcl_stairs.register_stair("copper_cut", "mcl_copper:block_cut", - {pickaxey = 2, oxidizable = 1}, + {pickaxey = 2, oxidizable = 1, stonecutter_output = 22}, {"mcl_copper_block_cut.png", "mcl_copper_block_cut.png", "mcl_copper_block_cut.png", "mcl_copper_block_cut.png", "mcl_copper_block_cut.png", "mcl_copper_block_cut.png"}, S("Stairs of Cut Copper"), nil, 6, nil, "woodlike") mcl_stairs.register_stair("waxed_copper_cut", "mcl_copper:waxed_block_cut", - {pickaxey = 2, waxed = 1}, + {pickaxey = 2, waxed = 1, stonecutter_output = 23}, {"mcl_copper_block_cut.png", "mcl_copper_block_cut.png", "mcl_copper_block_cut.png", "mcl_copper_block_cut.png", "mcl_copper_block_cut.png", "mcl_copper_block_cut.png"}, S("Waxed Stairs of Cut Copper"), nil, 6, nil, "woodlike") mcl_stairs.register_stair("copper_exposed_cut", "mcl_copper:block_exposed_cut", - {pickaxey = 2, oxidizable = 1}, + {pickaxey = 2, oxidizable = 1, stonecutter_output = 24}, {"mcl_copper_exposed_cut.png", "mcl_copper_exposed_cut.png", "mcl_copper_exposed_cut.png", "mcl_copper_exposed_cut.png", "mcl_copper_exposed_cut.png", "mcl_copper_exposed_cut.png"}, S("Stairs of Exposed Cut Copper"), nil, 6, nil, "woodlike") mcl_stairs.register_stair("waxed_copper_exposed_cut", "mcl_copper:waxed_block_exposed_cut", - {pickaxey = 2, waxed = 1}, + {pickaxey = 2, waxed = 1, stonecutter_output = 25}, {"mcl_copper_exposed_cut.png", "mcl_copper_exposed_cut.png", "mcl_copper_exposed_cut.png", "mcl_copper_exposed_cut.png", "mcl_copper_exposed_cut.png", "mcl_copper_exposed_cut.png"}, S("Waxed Stairs of Exposed Cut Copper"), nil, 6, nil, "woodlike") mcl_stairs.register_stair("copper_weathered_cut", "mcl_copper:block_weathered_cut", - {pickaxey = 2, oxidizable = 1}, + {pickaxey = 2, oxidizable = 1, stonecutter_output = 26}, {"mcl_copper_weathered_cut.png", "mcl_copper_weathered_cut.png", "mcl_copper_weathered_cut.png", "mcl_copper_weathered_cut.png", "mcl_copper_weathered_cut.png", "mcl_copper_weathered_cut.png"}, S("Stairs of Weathered Cut Copper"), nil, 6, nil, "woodlike") mcl_stairs.register_stair("waxed_copper_weathered_cut", "mcl_copper:waxed_block_weathered_cut", - {pickaxey = 2, waxed = 1}, + {pickaxey = 2, waxed = 1, stonecutter_output = 27}, {"mcl_copper_weathered_cut.png", "mcl_copper_weathered_cut.png", "mcl_copper_weathered_cut.png", "mcl_copper_weathered_cut.png", "mcl_copper_weathered_cut.png", "mcl_copper_weathered_cut.png"}, S("Waxed Stairs of Weathered Cut Copper"), nil, 6, nil, "woodlike") mcl_stairs.register_stair("copper_oxidized_cut", "mcl_copper:block_oxidized_cut", - {pickaxey = 2}, + {pickaxey = 2, stonecutter_output = 28}, {"mcl_copper_oxidized_cut.png", "mcl_copper_oxidized_cut.png", "mcl_copper_oxidized_cut.png", "mcl_copper_oxidized_cut.png", "mcl_copper_oxidized_cut.png", "mcl_copper_oxidized_cut.png"}, S("Stairs of Oxidized Cut Copper"), nil, 6, nil, "woodlike") mcl_stairs.register_stair("waxed_copper_oxidized_cut", "mcl_copper:waxed_block_oxidized_cut", - {pickaxey = 2, waxed = 1}, + {pickaxey = 2, waxed = 1, stonecutter_output = 29}, {"mcl_copper_oxidized_cut.png", "mcl_copper_oxidized_cut.png", "mcl_copper_oxidized_cut.png", "mcl_copper_oxidized_cut.png", "mcl_copper_oxidized_cut.png", "mcl_copper_oxidized_cut.png"}, S("Waxed Stairs of Oxidized Cut Copper"), nil, 6, nil, diff --git a/mods/ITEMS/mcl_core/nodes_base.lua b/mods/ITEMS/mcl_core/nodes_base.lua index 3f269def4..41fecbde3 100644 --- a/mods/ITEMS/mcl_core/nodes_base.lua +++ b/mods/ITEMS/mcl_core/nodes_base.lua @@ -236,7 +236,7 @@ minetest.register_node("mcl_core:stonebrick", { _doc_items_longdesc = doc.sub.items.temp.build, tiles = {"default_stone_brick.png"}, stack_max = 64, - groups = {pickaxey=1, stone=1, stonebrick=1, building_block=1, material_stone=1, stonecuttable=1}, + groups = {pickaxey=1, stone=1, stonebrick=1, building_block=1, material_stone=1, stonecuttable=1, stonecutter_output=1}, sounds = mcl_sounds.node_sound_stone_defaults(), is_ground_content = false, _mcl_blast_resistance = 6, @@ -248,7 +248,7 @@ minetest.register_node("mcl_core:stonebrickcarved", { _doc_items_longdesc = doc.sub.items.temp.build, tiles = {"mcl_core_stonebrick_carved.png"}, stack_max = 64, - groups = {pickaxey=1, stone=1, stonebrick=1, building_block=1, material_stone=1}, + groups = {pickaxey=1, stone=1, stonebrick=1, building_block=1, material_stone=1, stonecutter_output=1}, sounds = mcl_sounds.node_sound_stone_defaults(), is_ground_content = false, _mcl_blast_resistance = 6, @@ -272,7 +272,7 @@ minetest.register_node("mcl_core:stonebrickmossy", { _doc_items_longdesc = doc.sub.items.temp.build, tiles = {"mcl_core_stonebrick_mossy.png"}, stack_max = 64, - groups = {pickaxey=1, stone=1, stonebrick=1, building_block=1, material_stone=1, stonecuttable=1}, + groups = {pickaxey=1, stone=1, stonebrick=1, building_block=1, material_stone=1, stonecuttable=3}, sounds = mcl_sounds.node_sound_stone_defaults(), is_ground_content = false, _mcl_blast_resistance = 6, @@ -297,7 +297,7 @@ minetest.register_node("mcl_core:granite", { tiles = {"mcl_core_granite.png"}, is_ground_content = true, stack_max = 64, - groups = {pickaxey=1, stone=1, building_block=1, material_stone=1, stonecuttable=1}, + groups = {pickaxey=1, stone=1, building_block=1, material_stone=1, stonecuttable=4}, sounds = mcl_sounds.node_sound_stone_defaults(), _mcl_blast_resistance = 6, _mcl_hardness = 1.5, @@ -309,7 +309,7 @@ minetest.register_node("mcl_core:granite_smooth", { tiles = {"mcl_core_granite_smooth.png"}, stack_max = 64, is_ground_content = false, - groups = {pickaxey=1, stone=1, building_block=1, material_stone=1, stonecuttable=1}, + groups = {pickaxey=1, stone=1, building_block=1, material_stone=1, stonecuttable=4, stonecutter_output=4}, sounds = mcl_sounds.node_sound_stone_defaults(), _mcl_blast_resistance = 6, _mcl_hardness = 1.5, @@ -321,7 +321,7 @@ minetest.register_node("mcl_core:andesite", { tiles = {"mcl_core_andesite.png"}, is_ground_content = true, stack_max = 64, - groups = {pickaxey=1, stone=1, building_block=1, material_stone=1, stonecuttable=1}, + groups = {pickaxey=1, stone=1, building_block=1, material_stone=1, stonecuttable=5}, sounds = mcl_sounds.node_sound_stone_defaults(), _mcl_blast_resistance = 6, _mcl_hardness = 1.5, @@ -333,7 +333,7 @@ minetest.register_node("mcl_core:andesite_smooth", { tiles = {"mcl_core_andesite_smooth.png"}, is_ground_content = false, stack_max = 64, - groups = {pickaxey=1, stone=1, building_block=1, material_stone=1, stonecuttable=1}, + groups = {pickaxey=1, stone=1, building_block=1, material_stone=1, stonecuttable=5, stonecutter_output=5}, sounds = mcl_sounds.node_sound_stone_defaults(), _mcl_blast_resistance = 6, _mcl_hardness = 1.5, @@ -345,7 +345,7 @@ minetest.register_node("mcl_core:diorite", { tiles = {"mcl_core_diorite.png"}, is_ground_content = true, stack_max = 64, - groups = {pickaxey=1, stone=1, building_block=1, material_stone=1, stonecuttable=1}, + groups = {pickaxey=1, stone=1, building_block=1, material_stone=1, stonecuttable=6}, sounds = mcl_sounds.node_sound_stone_defaults(), _mcl_blast_resistance = 6, _mcl_hardness = 1.5, @@ -357,7 +357,7 @@ minetest.register_node("mcl_core:diorite_smooth", { tiles = {"mcl_core_diorite_smooth.png"}, is_ground_content = false, stack_max = 64, - groups = {pickaxey=1, stone=1, building_block=1, material_stone=1, stonecuttable=1}, + groups = {pickaxey=1, stone=1, building_block=1, material_stone=1, stonecuttable=6, stonecutter_output=6}, sounds = mcl_sounds.node_sound_stone_defaults(), _mcl_blast_resistance = 6, _mcl_hardness = 1.5, @@ -586,7 +586,7 @@ minetest.register_node("mcl_core:sandstone", { tiles = {"mcl_core_sandstone_top.png", "mcl_core_sandstone_bottom.png", "mcl_core_sandstone_normal.png"}, is_ground_content = true, stack_max = 64, - groups = {pickaxey=1, sandstone=1, normal_sandstone=1, building_block=1, material_stone=1, stonecuttable=1}, + groups = {pickaxey=1, sandstone=1, normal_sandstone=1, building_block=1, material_stone=1, stonecuttable=9}, sounds = mcl_sounds.node_sound_stone_defaults(), _mcl_blast_resistance = 0.8, _mcl_hardness = 0.8, @@ -598,7 +598,7 @@ minetest.register_node("mcl_core:sandstonesmooth", { tiles = {"mcl_core_sandstone_top.png", "mcl_core_sandstone_bottom.png", "mcl_core_sandstone_smooth.png"}, is_ground_content = false, stack_max = 64, - groups = {pickaxey=1, sandstone=1, normal_sandstone=1, building_block=1, material_stone=1, stonecuttable=1}, + groups = {pickaxey=1, sandstone=1, normal_sandstone=1, building_block=1, material_stone=1, stonecuttable=9, stonecutter_output=9}, sounds = mcl_sounds.node_sound_stone_defaults(), _mcl_blast_resistance = 6, _mcl_hardness = 2, @@ -610,7 +610,7 @@ minetest.register_node("mcl_core:sandstonecarved", { tiles = {"mcl_core_sandstone_top.png", "mcl_core_sandstone_bottom.png", "mcl_core_sandstone_carved.png"}, is_ground_content = false, stack_max = 64, - groups = {pickaxey=1, sandstone=1, normal_sandstone=1, building_block=1, material_stone=1}, + groups = {pickaxey=1, sandstone=1, normal_sandstone=1, building_block=1, material_stone=1, stonecutter_output=9}, sounds = mcl_sounds.node_sound_stone_defaults(), _mcl_blast_resistance = 0.8, _mcl_hardness = 0.8, @@ -623,7 +623,7 @@ minetest.register_node("mcl_core:sandstonesmooth2", { tiles = {"mcl_core_sandstone_top.png"}, is_ground_content = false, stack_max = 64, - groups = {pickaxey=1, sandstone=1, normal_sandstone=1, building_block=1, material_stone=1, stonecuttable=1}, + groups = {pickaxey=1, sandstone=1, normal_sandstone=1, building_block=1, material_stone=1, stonecuttable=9, stonecutter_output=9}, sounds = mcl_sounds.node_sound_stone_defaults(), _mcl_blast_resistance = 6, _mcl_hardness = 2, @@ -649,7 +649,7 @@ minetest.register_node("mcl_core:redsandstone", { tiles = {"mcl_core_red_sandstone_top.png", "mcl_core_red_sandstone_bottom.png", "mcl_core_red_sandstone_normal.png"}, is_ground_content = true, stack_max = 64, - groups = {pickaxey=1, sandstone=1, red_sandstone=1, building_block=1, material_stone=1, stonecuttable=1}, + groups = {pickaxey=1, sandstone=1, red_sandstone=1, building_block=1, material_stone=1, stonecuttable=10}, sounds = mcl_sounds.node_sound_stone_defaults(), _mcl_blast_resistance = 0.8, _mcl_hardness = 0.8, @@ -661,7 +661,7 @@ minetest.register_node("mcl_core:redsandstonesmooth", { tiles = {"mcl_core_red_sandstone_top.png", "mcl_core_red_sandstone_bottom.png", "mcl_core_red_sandstone_smooth.png"}, is_ground_content = false, stack_max = 64, - groups = {pickaxey=1, sandstone=1, red_sandstone=1, building_block=1, material_stone=1, stonecuttable=1}, + groups = {pickaxey=1, sandstone=1, red_sandstone=1, building_block=1, material_stone=1, stonecuttable=10, stonecutter_output=10}, sounds = mcl_sounds.node_sound_stone_defaults(), _mcl_blast_resistance = 0.8, _mcl_hardness = 0.8, @@ -673,7 +673,7 @@ minetest.register_node("mcl_core:redsandstonecarved", { tiles = {"mcl_core_red_sandstone_top.png", "mcl_core_red_sandstone_bottom.png", "mcl_core_red_sandstone_carved.png"}, is_ground_content = false, stack_max = 64, - groups = {pickaxey=1, sandstone=1, red_sandstone=1, building_block=1, material_stone=1}, + groups = {pickaxey=1, sandstone=1, red_sandstone=1, building_block=1, material_stone=1, stonecutter_output=10}, sounds = mcl_sounds.node_sound_stone_defaults(), _mcl_blast_resistance = 0.8, _mcl_hardness = 0.8, @@ -685,7 +685,7 @@ minetest.register_node("mcl_core:redsandstonesmooth2", { tiles = {"mcl_core_red_sandstone_top.png"}, is_ground_content = false, stack_max = 64, - groups = {pickaxey=1, sandstone=1, red_sandstone=1, building_block=1, material_stone=1, stonecuttable=1}, + groups = {pickaxey=1, sandstone=1, red_sandstone=1, building_block=1, material_stone=1, stonecuttable=1, stonecutter_output=10}, sounds = mcl_sounds.node_sound_stone_defaults(), _mcl_blast_resistance = 0.8, _mcl_hardness = 0.8, @@ -715,7 +715,7 @@ minetest.register_node("mcl_core:brick_block", { tiles = {"default_brick.png"}, is_ground_content = false, stack_max = 64, - groups = {pickaxey=1, building_block=1, material_stone=1, stonecuttable=1}, + groups = {pickaxey=1, building_block=1, material_stone=1, stonecuttable=16}, sounds = mcl_sounds.node_sound_stone_defaults(), _mcl_blast_resistance = 6, _mcl_hardness = 2, @@ -768,7 +768,7 @@ minetest.register_node("mcl_core:cobble", { tiles = {"default_cobble.png"}, is_ground_content = false, stack_max = 64, - groups = {pickaxey=1, building_block=1, material_stone=1, cobble=1, stonecuttable=1}, + groups = {pickaxey=1, building_block=1, material_stone=1, cobble=1, stonecuttable=7}, sounds = mcl_sounds.node_sound_stone_defaults(), _mcl_blast_resistance = 6, _mcl_hardness = 2, @@ -780,7 +780,7 @@ minetest.register_node("mcl_core:mossycobble", { tiles = {"default_mossycobble.png"}, is_ground_content = false, stack_max = 64, - groups = {pickaxey=1, building_block=1, material_stone=1, stonecuttable=1}, + groups = {pickaxey=1, building_block=1, material_stone=1, stonecuttable=8}, sounds = mcl_sounds.node_sound_stone_defaults(), _mcl_blast_resistance = 6, _mcl_hardness = 2, diff --git a/mods/ITEMS/mcl_end/building.lua b/mods/ITEMS/mcl_end/building.lua index f96c10633..b3a6adf30 100644 --- a/mods/ITEMS/mcl_end/building.lua +++ b/mods/ITEMS/mcl_end/building.lua @@ -13,7 +13,7 @@ minetest.register_node("mcl_end:end_stone", { _doc_items_longdesc = doc.sub.items.temp.build, tiles = {"mcl_end_end_stone.png"}, stack_max = 64, - groups = {pickaxey=1, building_block=1, material_stone=1, stonecuttable=1}, + groups = {pickaxey=1, building_block=1, material_stone=1, stonecuttable=20}, sounds = mcl_sounds.node_sound_stone_defaults(), after_dig_node = mcl_end.check_detach_chorus_plant, _mcl_blast_resistance = 9, @@ -26,7 +26,7 @@ minetest.register_node("mcl_end:end_bricks", { tiles = {"mcl_end_end_bricks.png"}, is_ground_content = false, stack_max = 64, - groups = {pickaxey=1, building_block=1, material_stone=1, stonecuttable=1}, + groups = {pickaxey=1, building_block=1, material_stone=1, stonecuttable=20, stonecutter_output=20}, sounds = mcl_sounds.node_sound_stone_defaults(), _mcl_blast_resistance = 9, _mcl_hardness = 3, @@ -38,7 +38,7 @@ minetest.register_node("mcl_end:purpur_block", { tiles = {"mcl_end_purpur_block.png"}, is_ground_content = false, stack_max = 64, - groups = {pickaxey=1, building_block=1, material_stone=1, purpur_block=1, stonecuttable=1}, + groups = {pickaxey=1, building_block=1, material_stone=1, purpur_block=1, stonecuttable=15}, sounds = mcl_sounds.node_sound_stone_defaults(), _mcl_blast_resistance = 6, _mcl_hardness = 1.5, @@ -52,7 +52,7 @@ minetest.register_node("mcl_end:purpur_pillar", { is_ground_content = false, on_place = mcl_util.rotate_axis, tiles = {"mcl_end_purpur_pillar_top.png", "mcl_end_purpur_pillar_top.png", "mcl_end_purpur_pillar.png"}, - groups = {pickaxey=1, building_block=1, material_stone=1, purpur_block=1}, + groups = {pickaxey=1, building_block=1, material_stone=1, purpur_block=1, stonecutter_output=15}, sounds = mcl_sounds.node_sound_stone_defaults(), on_rotate = on_rotate, _mcl_blast_resistance = 6, diff --git a/mods/ITEMS/mcl_mud/init.lua b/mods/ITEMS/mcl_mud/init.lua index b7542e0d5..5a99ff754 100644 --- a/mods/ITEMS/mcl_mud/init.lua +++ b/mods/ITEMS/mcl_mud/init.lua @@ -38,7 +38,7 @@ minetest.register_node("mcl_mud:mud_bricks", { _doc_items_longdesc = S("Decorative block crafted from packed mud."), _doc_items_hidden = false, tiles = {"mcl_mud_bricks.png"}, - groups = {handy=1, pickaxey=1, building_block=1, stonecuttable=1}, + groups = {handy=1, pickaxey=1, building_block=1, stonecuttable=30}, sounds = mcl_sounds.node_sound_stone_defaults(), _mcl_blast_resistance = 3, _mcl_hardness = 1.5, diff --git a/mods/ITEMS/mcl_nether/init.lua b/mods/ITEMS/mcl_nether/init.lua index 81b6d352c..396bb1926 100644 --- a/mods/ITEMS/mcl_nether/init.lua +++ b/mods/ITEMS/mcl_nether/init.lua @@ -176,7 +176,7 @@ minetest.register_node("mcl_nether:nether_brick", { stack_max = 64, tiles = {"mcl_nether_nether_brick.png"}, is_ground_content = false, - groups = {pickaxey=1, building_block=1, material_stone=1, stonecuttable=1}, + groups = {pickaxey=1, building_block=1, material_stone=1, stonecuttable=17}, sounds = mcl_sounds.node_sound_stone_defaults(), _mcl_blast_resistance = 6, _mcl_hardness = 2, @@ -189,7 +189,7 @@ minetest.register_node("mcl_nether:red_nether_brick", { stack_max = 64, tiles = {"mcl_nether_red_nether_brick.png"}, is_ground_content = false, - groups = {pickaxey=1, building_block=1, material_stone=1, stonecuttable=1}, + groups = {pickaxey=1, building_block=1, material_stone=1, stonecuttable=18}, sounds = mcl_sounds.node_sound_stone_defaults(), _mcl_blast_resistance = 6, _mcl_hardness = 2, @@ -219,7 +219,7 @@ minetest.register_node("mcl_nether:quartz_block", { stack_max = 64, is_ground_content = false, tiles = {"mcl_nether_quartz_block_top.png", "mcl_nether_quartz_block_bottom.png", "mcl_nether_quartz_block_side.png"}, - groups = {pickaxey=1, quartz_block=1,building_block=1, material_stone=1, stonecuttable=1}, + groups = {pickaxey=1, quartz_block=1,building_block=1, material_stone=1, stonecuttable=14}, sounds = mcl_sounds.node_sound_stone_defaults(), _mcl_blast_resistance = 0.8, _mcl_hardness = 0.8, @@ -231,7 +231,7 @@ minetest.register_node("mcl_nether:quartz_chiseled", { stack_max = 64, is_ground_content = false, tiles = {"mcl_nether_quartz_chiseled_top.png", "mcl_nether_quartz_chiseled_top.png", "mcl_nether_quartz_chiseled_side.png"}, - groups = {pickaxey=1, quartz_block=1,building_block=1, material_stone=1}, + groups = {pickaxey=1, quartz_block=1,building_block=1, material_stone=1, stonecutter_output=14}, sounds = mcl_sounds.node_sound_stone_defaults(), _mcl_blast_resistance = 0.8, _mcl_hardness = 0.8, @@ -245,7 +245,7 @@ minetest.register_node("mcl_nether:quartz_pillar", { is_ground_content = false, on_place = mcl_util.rotate_axis, tiles = {"mcl_nether_quartz_pillar_top.png", "mcl_nether_quartz_pillar_top.png", "mcl_nether_quartz_pillar_side.png"}, - groups = {pickaxey=1, quartz_block=1,building_block=1, material_stone=1}, + groups = {pickaxey=1, quartz_block=1,building_block=1, material_stone=1, stonecutter_output=14}, sounds = mcl_sounds.node_sound_stone_defaults(), on_rotate = on_rotate, _mcl_blast_resistance = 0.8, @@ -257,7 +257,7 @@ minetest.register_node("mcl_nether:quartz_smooth", { stack_max = 64, is_ground_content = false, tiles = {"mcl_nether_quartz_block_bottom.png"}, - groups = {pickaxey=1, quartz_block=1,building_block=1, material_stone=1, stonecuttable=1}, + groups = {pickaxey=1, quartz_block=1,building_block=1, material_stone=1, stonecuttable=14, stonecutter_output=14}, sounds = mcl_sounds.node_sound_stone_defaults(), _mcl_blast_resistance = 0.8, _mcl_hardness = 0.8, diff --git a/mods/ITEMS/mcl_ocean/prismarine.lua b/mods/ITEMS/mcl_ocean/prismarine.lua index e3b899a49..e1a0a3a98 100644 --- a/mods/ITEMS/mcl_ocean/prismarine.lua +++ b/mods/ITEMS/mcl_ocean/prismarine.lua @@ -38,7 +38,7 @@ minetest.register_node("mcl_ocean:prismarine", { is_ground_content = false, -- Texture should have 22 frames for smooth transitions. tiles = {{name="mcl_ocean_prismarine_anim.png", animation={type="vertical_frames", aspect_w=32, aspect_h=32, length=45.0}}}, - groups = {pickaxey=1, building_block=1, material_stone=1, stonecuttable=1}, + groups = {pickaxey=1, building_block=1, material_stone=1, stonecuttable=11}, sounds = mcl_sounds.node_sound_stone_defaults(), _mcl_blast_resistance = 6, _mcl_hardness = 1.5, @@ -50,7 +50,7 @@ minetest.register_node("mcl_ocean:prismarine_brick", { stack_max = 64, is_ground_content = false, tiles = {"mcl_ocean_prismarine_bricks.png"}, - groups = {pickaxey=1, building_block=1, material_stone=1, stonecuttable=1}, + groups = {pickaxey=1, building_block=1, material_stone=1, stonecuttable=12}, sounds = mcl_sounds.node_sound_stone_defaults(), _mcl_blast_resistance = 6, _mcl_hardness = 1.5, @@ -62,7 +62,7 @@ minetest.register_node("mcl_ocean:prismarine_dark", { stack_max = 64, is_ground_content = false, tiles = {"mcl_ocean_prismarine_dark.png"}, - groups = {pickaxey=1, building_block=1, material_stone=1, stonecuttable=1}, + groups = {pickaxey=1, building_block=1, material_stone=1, stonecuttable=13}, sounds = mcl_sounds.node_sound_stone_defaults(), _mcl_blast_resistance = 6, _mcl_hardness = 1.5, diff --git a/mods/ITEMS/mcl_stairs/register.lua b/mods/ITEMS/mcl_stairs/register.lua index eee4c5dc2..706f12cd2 100644 --- a/mods/ITEMS/mcl_stairs/register.lua +++ b/mods/ITEMS/mcl_stairs/register.lua @@ -30,167 +30,318 @@ for w=1, #woods do wood[5]) end -mcl_stairs.register_stair_and_slab_simple("stone_rough", "mcl_core:stone", S("Stone Stairs"), S("Stone Slab"), S("Double Stone Slab")) + +mcl_stairs.register_slab("stone_rough", "mcl_core:stone", + {pickaxey=1, material_stone=1, stonecutter_output=1}, + {"default_stone.png"}, + S("Stone Slab"), + mcl_sounds.node_sound_stone_defaults(), 6, 2, + S("Double Stone Slab")) +mcl_stairs.register_stair("stone_rough", "group:stone", + {pickaxey=1, material_stone=1,stonecutter_output=1}, + {"default_stone.png"}, + S("Stone Stairs"), + mcl_sounds.node_sound_stone_defaults(), 0.8, 0.8) mcl_stairs.register_slab("stone", "mcl_core:stone_smooth", - {pickaxey=1, material_stone=1}, + {pickaxey=1, material_stone=1, stonecutter_output=2}, {"mcl_stairs_stone_slab_top.png", "mcl_stairs_stone_slab_top.png", "mcl_stairs_stone_slab_side.png"}, S("Polished Stone Slab"), mcl_sounds.node_sound_stone_defaults(), 6, 2, S("Double Polished Stone Slab")) -mcl_stairs.register_stair_and_slab_simple("andesite", "mcl_core:andesite", S("Andesite Stairs"), S("Andesite Slab"), S("Double Andesite Slab")) -mcl_stairs.register_stair_and_slab_simple("granite", "mcl_core:granite", S("Granite Stairs"), S("Granite Slab"), S("Double Granite Slab")) -mcl_stairs.register_stair_and_slab_simple("diorite", "mcl_core:diorite", S("Diorite Stairs"), S("Diorite Slab"), S("Double Diorite Slab")) +mcl_stairs.register_stair("andesite", "mcl_core:andesite", + {pickaxey=1, material_stone=1,stonecutter_output=5}, + {"mcl_core_andesite.png"}, + S("Andesite Stairs"), + mcl_sounds.node_sound_stone_defaults(), 0.8, 0.8) +mcl_stairs.register_slab("andesite", "mcl_core:andesite", + {pickaxey=1, material_stone=1, stonecutter_output=5}, + {"mcl_core_andesite.png"}, + S("Andesite Slab"), + mcl_sounds.node_sound_stone_defaults(), 6, 2, + S("Double Andesite Slab")) -mcl_stairs.register_stair_and_slab_simple("cobble", "mcl_core:cobble", S("Cobblestone Stairs"), S("Cobblestone Slab"), S("Double Cobblestone Slab")) -mcl_stairs.register_stair_and_slab_simple("mossycobble", "mcl_core:mossycobble", S("Mossy Cobblestone Stairs"), S("Mossy Cobblestone Slab"), S("Double Mossy Cobblestone Slab")) +mcl_stairs.register_stair("granite", "mcl_core:granite", + {pickaxey=1, material_stone=1,stonecutter_output=4}, + {"mcl_core_granite.png"}, + S("Granite Stairs"), + mcl_sounds.node_sound_stone_defaults(), 0.8, 0.8) +mcl_stairs.register_slab("granite", "mcl_core:granite", + {pickaxey=1, material_stone=1, stonecutter_output=4}, + {"mcl_core_granite.png"}, + S("Granite Slab"), + mcl_sounds.node_sound_stone_defaults(), 6, 2, + S("Double Granite Slab")) -mcl_stairs.register_stair_and_slab_simple("brick_block", "mcl_core:brick_block", S("Brick Stairs"), S("Brick Slab"), S("Double Brick Slab")) +mcl_stairs.register_stair("diorite", "mcl_core:diorite", + {pickaxey=1, material_stone=1,stonecutter_output=6}, + {"mcl_core_diorite.png"}, + S("Granite Stairs"), + mcl_sounds.node_sound_stone_defaults(), 0.8, 0.8) +mcl_stairs.register_slab("granite", "mcl_core:diorite", + {pickaxey=1, material_stone=1, stonecutter_output=6}, + {"mcl_core_diorite.png"}, + S("Diorite Slab"), + mcl_sounds.node_sound_stone_defaults(), 6, 2, + S("Double Diorite Slab")) +mcl_stairs.register_stair("cobble", "mcl_core:cobble", + {pickaxey=1, material_stone=1,stonecutter_output=7}, + {"default_cobble.png"}, + S("Cobblestone Stairs"), + mcl_sounds.node_sound_stone_defaults(), 0.8, 0.8) +mcl_stairs.register_slab("cobble", "mcl_core:cobble", + {pickaxey=1, material_stone=1, stonecutter_output=7}, + {"default_cobble.png"}, + S("Cobblestone Slab"), + mcl_sounds.node_sound_stone_defaults(), 6, 2, + S("Double Cobblestone Slab")) + +mcl_stairs.register_stair("mossycobble", "mcl_core:mossycobble", + {pickaxey=1, material_stone=1,stonecutter_output=8}, + {"default_mossycobble.png"}, + S("Mossy Cobblestone Stairs"), + mcl_sounds.node_sound_stone_defaults(), 0.8, 0.8) +mcl_stairs.register_slab("mossycobble", "mcl_core:mossycobble", + {pickaxey=1, material_stone=1, stonecutter_output=8}, + {"default_mossycobble.png"}, + S("Mossy Cobblestone Slab"), + mcl_sounds.node_sound_stone_defaults(), 6, 2, + S("Double Mossy Cobblestone Slab")) + +mcl_stairs.register_stair("brick_block", "mcl_core:brick_block", + {pickaxey=1, material_stone=1,stonecutter_output=16}, + {"default_brick.png"}, + S("Brick Stairs"), + mcl_sounds.node_sound_stone_defaults(), 0.8, 0.8) +mcl_stairs.register_slab("brick_block", "mcl_core:brick_block", + {pickaxey=1, material_stone=1, stonecutter_output=16}, + {"default_brick.png"}, + S("Brick Slab"), + mcl_sounds.node_sound_stone_defaults(), 6, 2, + S("Double Brick Slab")) mcl_stairs.register_stair("sandstone", "group:normal_sandstone", - {pickaxey=1, material_stone=1}, + {pickaxey=1, material_stone=1, stonecutter_output=9}, {"mcl_core_sandstone_top.png", "mcl_core_sandstone_bottom.png", "mcl_core_sandstone_normal.png"}, S("Sandstone Stairs"), mcl_sounds.node_sound_stone_defaults(), 0.8, 0.8, nil, "mcl_core:sandstone") --fixme: extra parameter from previous release mcl_stairs.register_slab("sandstone", "group:normal_sandstone", - {pickaxey=1, material_stone=1}, + {pickaxey=1, material_stone=1, stonecutter_output=9}, {"mcl_core_sandstone_top.png", "mcl_core_sandstone_bottom.png", "mcl_core_sandstone_normal.png"}, S("Sandstone Slab"), mcl_sounds.node_sound_stone_defaults(), 6, 2, S("Double Sandstone Slab"), "mcl_core:sandstone") --fixme: extra parameter from previous release -mcl_stairs.register_stair_and_slab_simple("sandstonesmooth2", "mcl_core:sandstonesmooth2", S("Smooth Sandstone Stairs"), S("Smooth Sandstone Slab"), S("Double Smooth Sandstone Slab")) + +mcl_stairs.register_stair("sandstonesmooth2", "mcl_core:sandstonesmooth2", + {pickaxey=1, material_stone=1, stonecutter_output=9}, + {"mcl_core_sandstone_top.png"}, + S("Smooth Sandstone Stairs"), + mcl_sounds.node_sound_stone_defaults(), 0.8, 0.8) +mcl_stairs.register_slab("sandstonesmooth2", "mcl_core:sandstonesmooth2", + {pickaxey=1, material_stone=1, stonecutter_output=9}, + {"mcl_core_sandstone_top.png"}, + S("Smooth Sandstone Slab"), + mcl_sounds.node_sound_stone_defaults(), 6, 2, + S("Double Smooth Sandstone Slab")) mcl_stairs.register_stair("redsandstone", "group:red_sandstone", - {pickaxey=1, material_stone=1}, + {pickaxey=1, material_stone=1, stonecutter_output=10}, {"mcl_core_red_sandstone_top.png", "mcl_core_red_sandstone_bottom.png", "mcl_core_red_sandstone_normal.png"}, S("Red Sandstone Stairs"), mcl_sounds.node_sound_stone_defaults(), 0.8, 0.8, nil, "mcl_core:redsandstone") --fixme: extra parameter from previous release mcl_stairs.register_slab("redsandstone", "group:red_sandstone", - {pickaxey=1, material_stone=1}, + {pickaxey=1, material_stone=1, stonecutter_output=10}, {"mcl_core_red_sandstone_top.png", "mcl_core_red_sandstone_bottom.png", "mcl_core_red_sandstone_normal.png"}, S("Red Sandstone Slab"), mcl_sounds.node_sound_stone_defaults(), 6, 2, S("Double Red Sandstone Slab"), "mcl_core:redsandstone") --fixme: extra parameter from previous release -mcl_stairs.register_stair_and_slab_simple("redsandstonesmooth2", "mcl_core:redsandstonesmooth2", S("Smooth Red Sandstone Stairs"), S("Smooth Red Sandstone Slab"), S("Double Smooth Red Sandstone Slab")) + +mcl_stairs.register_stair("redsandstonesmooth2", "mcl_core:redsandstonesmooth2", + {pickaxey=1, material_stone=1, stonecutter_output=10}, + {"mcl_core_red_sandstone_top.png"}, + S("Smooth Red Sandstone Stairs"), + mcl_sounds.node_sound_stone_defaults(), 0.8, 0.8) +mcl_stairs.register_slab("redsandstonesmooth2", "mcl_core:redsandstonesmooth2", + {pickaxey=1, material_stone=1, stonecutter_output=10}, + {"mcl_core_red_sandstone_top.png"}, + S("Smooth Red Sandstone Slab"), + mcl_sounds.node_sound_stone_defaults(), 6, 2, + S("Double Smooth Red Sandstone Slab")) -- Intentionally not group:stonebrick because of mclx_stairs mcl_stairs.register_stair("stonebrick", "mcl_core:stonebrick", - {pickaxey=1, material_stone=1}, + {pickaxey=1, material_stone=1, stonecutter_output=1}, {"default_stone_brick.png"}, S("Stone Bricks Stairs"), mcl_sounds.node_sound_stone_defaults(), 6, 1.5, nil, "mcl_core:stonebrick") --fixme: extra parameter from previous release mcl_stairs.register_slab("stonebrick", "mcl_core:stonebrick", - {pickaxey=1, material_stone=1}, + {pickaxey=1, material_stone=1, stonecutter_output=1}, {"default_stone_brick.png"}, S("Stone Bricks Slab"), mcl_sounds.node_sound_stone_defaults(), 6, 2, S("Double Stone Bricks Slab"), "mcl_core:stonebrick") --fixme: extra parameter from previous release mcl_stairs.register_stair("quartzblock", "group:quartz_block", - {pickaxey=1, material_stone=1}, + {pickaxey=1, material_stone=1, stonecutter_output=14}, {"mcl_nether_quartz_block_top.png", "mcl_nether_quartz_block_bottom.png", "mcl_nether_quartz_block_side.png"}, S("Quartz Stairs"), mcl_sounds.node_sound_stone_defaults(), 0.8, 0.8, nil, "mcl_nether:quartz_block") --fixme: extra parameter from previous release mcl_stairs.register_slab("quartzblock", "group:quartz_block", - {pickaxey=1, material_stone=1}, + {pickaxey=1, material_stone=1, stonecutter_output=14}, {"mcl_nether_quartz_block_top.png", "mcl_nether_quartz_block_bottom.png", "mcl_nether_quartz_block_side.png"}, S("Quartz Slab"), mcl_sounds.node_sound_stone_defaults(), 6, 2, S("Double Quartz Slab"), "mcl_nether:quartz_block") --fixme: extra parameter from previous release -mcl_stairs.register_stair_and_slab_simple("quartz_smooth", "mcl_nether:quartz_smooth", S("Smooth Quartz Stairs"), S("Smooth Quartz Slab"), S("Double Smooth Quartz Slab")) +mcl_stairs.register_stair("quartz_smooth", "mcl_nether:quartz_smooth", + {pickaxey=1, material_stone=1, stonecutter_output=14}, + {"mcl_nether_quartz_block_bottom.png"}, + S("Smooth Quartz Stairs"), + mcl_sounds.node_sound_stone_defaults(), 0.8, 0.8) +mcl_stairs.register_slab("quartz_smooth", "mcl_nether:quartz_smooth", + {pickaxey=1, material_stone=1, stonecutter_output=14}, + {"mcl_nether_quartz_block_bottom.png"}, + S("Smooth Quartz Slab"), + mcl_sounds.node_sound_stone_defaults(), 6, 2, + S("Double Smooth Quartz Slab")) mcl_stairs.register_stair_and_slab("nether_brick", "mcl_nether:nether_brick", - {pickaxey=1, material_stone=1}, + {pickaxey=1, material_stone=1, stonecutter_output=17}, {"mcl_nether_nether_brick.png"}, S("Nether Brick Stairs"), S("Nether Brick Slab"), mcl_sounds.node_sound_stone_defaults(), 6, 2, S("Double Nether Brick Slab"), nil) mcl_stairs.register_stair_and_slab("red_nether_brick", "mcl_nether:red_nether_brick", - {pickaxey=1, material_stone=1}, + {pickaxey=1, material_stone=1, stonecutter_output=18}, {"mcl_nether_red_nether_brick.png"}, S("Red Nether Brick Stairs"), S("Red Nether Brick Slab"), mcl_sounds.node_sound_stone_defaults(), 6, 2, S("Double Red Nether Brick Slab"), nil) -mcl_stairs.register_stair_and_slab_simple("end_bricks", "mcl_end:end_bricks", S("End Stone Brick Stairs"), S("End Stone Brick Slab"), S("Double End Stone Brick Slab")) +mcl_stairs.register_stair_and_slab("end_bricks", "mcl_end:end_bricks", + {pickaxey=1, material_stone=1, stonecutter_output=20}, + {"mcl_end_end_bricks.png"}, + S("End Stone Brick Stairs"), + S("End Stone Brick Slab"), + mcl_sounds.node_sound_stone_defaults(), 6, 2, + S("Double End Stone Brick Slab"), nil) mcl_stairs.register_stair("purpur_block", "group:purpur_block", - {pickaxey=1, material_stone=1}, + {pickaxey=1, material_stone=1, stonecutter_output=15}, {"mcl_end_purpur_block.png"}, S("Purpur Stairs"), mcl_sounds.node_sound_stone_defaults(), 6, 1.5, nil) mcl_stairs.register_slab("purpur_block", "group:purpur_block", - {pickaxey=1, material_stone=1}, + {pickaxey=1, material_stone=1, stonecutter_output=15}, {"mcl_end_purpur_block.png"}, S("Purpur Slab"), mcl_sounds.node_sound_stone_defaults(), 6, 2, S("Double Purpur Slab")) -mcl_stairs.register_stair_and_slab_simple("prismarine", "mcl_ocean:prismarine", S("Prismarine Stairs"), S("Prismarine Slab"), S("Double Prismarine Slab")) +mcl_stairs.register_stair("prismarine", "mcl_ocean:prismarine", + {pickaxey=1, material_stone=1, stonecutter_output=11}, + {{name="mcl_ocean_prismarine_anim.png", animation={type="vertical_frames", aspect_w=32, aspect_h=32, length=45.0}}}, + S("Prismarine Stairs"), + mcl_sounds.node_sound_stone_defaults(), 6, 1.5, + nil) +mcl_stairs.register_slab("prismarine", "mcl_ocean:prismarine", + {pickaxey=1, material_stone=1, stonecutter_output=11}, + {{name="mcl_ocean_prismarine_anim.png", animation={type="vertical_frames", aspect_w=32, aspect_h=32, length=45.0}}}, + S("Prismarine Slab"), + mcl_sounds.node_sound_stone_defaults(), 6, 2, + S("Double Prismarine Slab")) -mcl_stairs.register_stair_and_slab_simple("mud_brick", "mcl_mud:mud_bricks", S("Mud Brick Stair"), S("Mud Brick Slab"), S("Double Mud Brick Slab")) +mcl_stairs.register_stair("prismarine_brick", "mcl_ocean:prismarine_brick", + {pickaxey=1, material_stone=1, stonecutter_output=12}, + {"mcl_ocean_prismarine_bricks.png"}, + S("prismarine Brick Stairs"), + mcl_sounds.node_sound_stone_defaults(), 6, 1.5, + nil) +mcl_stairs.register_slab("prismarine_brick", "mcl_ocean:prismarine_brick", + {pickaxey=1, material_stone=1, stonecutter_output=12}, + {"mcl_ocean_prismarine_bricks.png"}, + S("prismarine Brick Slab"), + mcl_sounds.node_sound_stone_defaults(), 6, 2, + S("Double prismarine_brick Slab")) -mcl_stairs.register_stair_and_slab_simple("prismarine_brick", "mcl_ocean:prismarine_brick", S("Prismarine Brick Stairs"), S("Prismarine Brick Slab"), S("Double Prismarine Brick Slab")) -mcl_stairs.register_stair_and_slab_simple("prismarine_dark", "mcl_ocean:prismarine_dark", S("Dark Prismarine Stairs"), S("Dark Prismarine Slab"), S("Double Dark Prismarine Slab")) +mcl_stairs.register_stair("prismarine_dark", "mcl_ocean:prismarine_dark", + {pickaxey=1, material_stone=1, stonecutter_output=13}, + {"mcl_ocean_prismarine_dark.png"}, + S("prismarine Brick Stairs"), + mcl_sounds.node_sound_stone_defaults(), 6, 1.5, + nil) +mcl_stairs.register_slab("prismarine_dark", "mcl_ocean:prismarine_dark", + {pickaxey=1, material_stone=1, stonecutter_output=13}, + {"mcl_ocean_prismarine_dark.png"}, + S("Dark Prismarine Slab"), + mcl_sounds.node_sound_stone_defaults(), 6, 2, + S("Double Dark Prismarine Slab")) + +mcl_stairs.register_stair_and_slab("mud_brick", "mcl_mud:mud_bricks", + {pickaxey=1, material_stone=1, stonecutter_output=30}, + {"mcl_mud_bricks.png"}, + S("Mud Brick Stairs"), + S("Mud Brick Slab"), + mcl_sounds.node_sound_stone_defaults(), 6, 2, + S("Double Mud Brick Slab"), nil) mcl_stairs.register_slab("andesite_smooth", "mcl_core:andesite_smooth", - {pickaxey=1}, + {pickaxey=1, stonecutter_output=5}, {"mcl_core_andesite_smooth.png", "mcl_core_andesite_smooth.png", "mcl_stairs_andesite_smooth_slab.png"}, S("Polished Andesite Slab"), nil, 6, nil, S("Double Polished Andesite Slab")) mcl_stairs.register_stair("andesite_smooth", "mcl_core:andesite_smooth", - {pickaxey=1}, + {pickaxey=1, stonecutter_output=5}, {"mcl_stairs_andesite_smooth_slab.png", "mcl_core_andesite_smooth.png", "mcl_core_andesite_smooth.png", "mcl_core_andesite_smooth.png", "mcl_core_andesite_smooth.png", "mcl_stairs_andesite_smooth_slab.png"}, S("Polished Andesite Stairs"), nil, 6, nil, "woodlike") mcl_stairs.register_slab("granite_smooth", "mcl_core:granite_smooth", - {pickaxey=1}, + {pickaxey=1, stonecutter_output=4}, {"mcl_core_granite_smooth.png", "mcl_core_granite_smooth.png", "mcl_stairs_granite_smooth_slab.png"}, S("Polished Granite Slab"), nil, 6, nil, S("Double Polished Granite Slab")) mcl_stairs.register_stair("granite_smooth", "mcl_core:granite_smooth", - {pickaxey=1}, + {pickaxey=1, stonecutter_output=4}, {"mcl_stairs_granite_smooth_slab.png", "mcl_core_granite_smooth.png", "mcl_core_granite_smooth.png", "mcl_core_granite_smooth.png", "mcl_core_granite_smooth.png", "mcl_stairs_granite_smooth_slab.png"}, S("Polished Granite Stairs"), nil, 6, nil, "woodlike") mcl_stairs.register_slab("diorite_smooth", "mcl_core:diorite_smooth", - {pickaxey=1}, + {pickaxey=1, stonecutter_output=6}, {"mcl_core_diorite_smooth.png", "mcl_core_diorite_smooth.png", "mcl_stairs_diorite_smooth_slab.png"}, S("Polished Diorite Slab"), nil, 6, nil, S("Double Polished Diorite Slab")) mcl_stairs.register_stair("diorite_smooth", "mcl_core:diorite_smooth", - {pickaxey=1}, + {pickaxey=1, stonecutter_output=6}, {"mcl_stairs_diorite_smooth_slab.png", "mcl_core_diorite_smooth.png", "mcl_core_diorite_smooth.png", "mcl_core_diorite_smooth.png", "mcl_core_diorite_smooth.png", "mcl_stairs_diorite_smooth_slab.png"}, S("Polished Diorite Stairs"), nil, 6, nil, "woodlike") mcl_stairs.register_stair("stonebrickmossy", "mcl_core:stonebrickmossy", - {pickaxey=1}, + {pickaxey=1, stonecutter_output=3}, {"mcl_core_stonebrick_mossy.png"}, S("Mossy Stone Brick Stairs"), mcl_sounds.node_sound_stone_defaults(), 6, 1.5, nil) mcl_stairs.register_slab("stonebrickmossy", "mcl_core:stonebrickmossy", - {pickaxey=1}, + {pickaxey=1, stonecutter_output=3}, {"mcl_core_stonebrick_mossy.png"}, S("Mossy Stone Brick Slab"), mcl_sounds.node_sound_stone_defaults(), 6, 2, diff --git a/mods/ITEMS/mcl_stonecutter/init.lua b/mods/ITEMS/mcl_stonecutter/init.lua index 77ca5c066..1fd37cdc6 100644 --- a/mods/ITEMS/mcl_stonecutter/init.lua +++ b/mods/ITEMS/mcl_stonecutter/init.lua @@ -45,60 +45,41 @@ local function show_stonecutter_formspec(items, input) return formspec end --- Strips the start of the item like "mcl_core:" and removes any numbers or whitespaces after it -local function get_item_string_name(input) - local colonIndex = string.find(input, ":") - if colonIndex then - input = string.sub(input, colonIndex + 1) - else - return input +local function check(item_name) + if string.match(item_name, "mcl_walls") then + if string.match(item_name, "%d") then + return true + end + return false end - local whitespaceIndex = string.find(input, "%s") - if whitespaceIndex then - return string.sub(input, 1, whitespaceIndex - 1) - else - return input - end + if string.match(item_name, "_outer") then + return true + elseif string.match(item_name, "_inner") then + return true + elseif string.match(item_name, "_top") then + return true + elseif string.match(item_name, "_double") then + return true + end + return false end + -- Updates the formspec local function update_stonecutter_slots(meta) local inv = meta:get_inventory() local input = inv:get_stack("input", 1) local name = input:get_name() local new_output = meta:get_string("cut_stone") + local compat_item = minetest.get_item_group(name, "stonecuttable") - -- Checks if input is in the array - if minetest.get_item_group(name, "stonecuttable") > 0 then + -- Checks if input is in the group + if compat_item > 0 then local cuttable_recipes = {} - local name_stripped = get_item_string_name(input:to_string()) - if name_stripped ~= "" then - -- Strings for the possible items it can craft into - local stair = "mcl_stairs:stair_"..name_stripped - local slab = "mcl_stairs:slab_"..name_stripped - local wall = "mcl_walls:"..name_stripped - local smooth = "mcl_core:"..name_stripped.."_smooth" - - -- Goes through and checks if the item exists and inserts it into the table - if minetest.registered_items[slab] ~= nil then - table.insert(cuttable_recipes, slab) - end - if minetest.registered_items[stair] ~= nil then - table.insert(cuttable_recipes, stair) - end - if minetest.registered_items[wall] ~= nil then - table.insert(cuttable_recipes, wall) - end - if minetest.registered_items[smooth] ~= nil then - local smooth_stair = "mcl_stairs:stair_"..name_stripped.."_smooth" - local smooth_slab = "mcl_stairs:slab_"..name_stripped.."_smooth" - - table.insert(cuttable_recipes, smooth) - if minetest.registered_items[smooth_slab] ~= nil then - table.insert(cuttable_recipes, smooth_slab) - end - if minetest.registered_items[smooth_stair] ~= nil then - table.insert(cuttable_recipes, smooth_stair) + for item_name, item_def in pairs(minetest.registered_items) do + if item_def.groups and item_def.groups["stonecutter_output"] == compat_item then + if check(item_name) == false then + table.insert(cuttable_recipes, item_name) end end end diff --git a/mods/ITEMS/mcl_walls/register.lua b/mods/ITEMS/mcl_walls/register.lua index 96a1b9b9f..241c5ecc1 100644 --- a/mods/ITEMS/mcl_walls/register.lua +++ b/mods/ITEMS/mcl_walls/register.lua @@ -1,17 +1,17 @@ local S = minetest.get_translator(minetest.get_current_modname()) -mcl_walls.register_wall("mcl_walls:cobble", S("Cobblestone Wall"), "mcl_core:cobble", {"mcl_walls_cobble_wall_top.png", "default_cobble.png", "mcl_walls_cobble_wall_side.png"}) -mcl_walls.register_wall("mcl_walls:mossycobble", S("Mossy Cobblestone Wall"), "mcl_core:mossycobble", {"mcl_walls_cobble_mossy_wall_top.png", "default_mossycobble.png", "mcl_walls_cobble_mossy_wall_side.png"}) -mcl_walls.register_wall("mcl_walls:andesite", S("Andesite Wall"), "mcl_core:andesite") -mcl_walls.register_wall("mcl_walls:granite", S("Granite Wall"), "mcl_core:granite") -mcl_walls.register_wall("mcl_walls:diorite", S("Diorite Wall"), "mcl_core:diorite") -mcl_walls.register_wall("mcl_walls:brick", S("Brick Wall"), "mcl_core:brick_block") -mcl_walls.register_wall("mcl_walls:sandstone", S("Sandstone Wall"), "mcl_core:sandstone") -mcl_walls.register_wall("mcl_walls:redsandstone", S("Red Sandstone Wall"), "mcl_core:redsandstone") -mcl_walls.register_wall("mcl_walls:stonebrick", S("Stone Brick Wall"), "mcl_core:stonebrick") -mcl_walls.register_wall("mcl_walls:stonebrickmossy", S("Mossy Stone Brick Wall"), "mcl_core:stonebrickmossy") -mcl_walls.register_wall("mcl_walls:prismarine", S("Prismarine Wall"), "mcl_ocean:prismarine") -mcl_walls.register_wall("mcl_walls:endbricks", S("End Stone Brick Wall"), "mcl_end:end_bricks") -mcl_walls.register_wall("mcl_walls:netherbrick", S("Nether Brick Wall"), "mcl_nether:nether_brick") -mcl_walls.register_wall("mcl_walls:rednetherbrick", S("Red Nether Brick Wall"), "mcl_nether:red_nether_brick") -mcl_walls.register_wall("mcl_walls:mudbrick", S("Mud Brick Wall"), "mcl_mud:mud_bricks") \ No newline at end of file +mcl_walls.register_wall("mcl_walls:cobble", S("Cobblestone Wall"), "mcl_core:cobble", {"mcl_walls_cobble_wall_top.png", "default_cobble.png", "mcl_walls_cobble_wall_side.png"}, "", {pickaxey=1, material_stone=1, stonecutter_output=7}) +mcl_walls.register_wall("mcl_walls:mossycobble", S("Mossy Cobblestone Wall"), "mcl_core:mossycobble", {"mcl_walls_cobble_mossy_wall_top.png", "default_mossycobble.png", "mcl_walls_cobble_mossy_wall_side.png"}, "", {pickaxey=1, material_stone=1, stonecutter_output=8}) +mcl_walls.register_wall("mcl_walls:andesite", S("Andesite Wall"), "mcl_core:andesite", {"mcl_core_andesite.png"}, "", {pickaxey=1, material_stone=1, stonecutter_output=5}) +mcl_walls.register_wall("mcl_walls:granite", S("Granite Wall"), "mcl_core:granite", {"mcl_core_granite.png"}, "", {pickaxey=1, material_stone=1, stonecutter_output=4}) +mcl_walls.register_wall("mcl_walls:diorite", S("Diorite Wall"), "mcl_core:diorite", {"mcl_core_diorite.png"}, "", {pickaxey=1, material_stone=1, stonecutter_output=6}) +mcl_walls.register_wall("mcl_walls:brick", S("Brick Wall"), "mcl_core:brick_block", {"default_brick.png"}, "", {pickaxey=1, material_stone=1, stonecutter_output=16}) +mcl_walls.register_wall("mcl_walls:sandstone", S("Sandstone Wall"), "mcl_core:sandstone", {"mcl_core_sandstone_top.png", "mcl_core_sandstone_bottom.png", "mcl_core_sandstone_normal.png"}, "", {pickaxey=1, material_stone=1, stonecutter_output=9}) +mcl_walls.register_wall("mcl_walls:redsandstone", S("Red Sandstone Wall"), "mcl_core:redsandstone", {"mcl_core_red_sandstone_top.png", "mcl_core_red_sandstone_bottom.png", "mcl_core_red_sandstone_carved.png"}, "", {pickaxey=1, material_stone=1, stonecutter_output=10}) +mcl_walls.register_wall("mcl_walls:stonebrick", S("Stone Brick Wall"), "mcl_core:stonebrick", {"default_stone_brick.png"}, "", {pickaxey=1, material_stone=1, stonecutter_output=1}) +mcl_walls.register_wall("mcl_walls:stonebrickmossy", S("Mossy Stone Brick Wall"), "mcl_core:stonebrickmossy", {"mcl_core_stonebrick_mossy.png"}, "", {pickaxey=1, material_stone=1, stonecutter_output=3}) +mcl_walls.register_wall("mcl_walls:prismarine", S("Prismarine Wall"), "mcl_ocean:prismarine",{{name="mcl_ocean_prismarine_anim.png", animation={type="vertical_frames", aspect_w=32, aspect_h=32, length=45.0}}}, "", {pickaxey=1, material_stone=1, stonecutter_output=11}) +mcl_walls.register_wall("mcl_walls:endbricks", S("End Stone Brick Wall"), "mcl_end:end_bricks", {"mcl_end_end_bricks.png"}, "", {pickaxey=1, material_stone=1, stonecutter_output=20}) +mcl_walls.register_wall("mcl_walls:netherbrick", S("Nether Brick Wall"), "mcl_nether:nether_brick", {"mcl_nether_nether_brick.png"}, "", {pickaxey=1, material_stone=1, stonecutter_output=17}) +mcl_walls.register_wall("mcl_walls:rednetherbrick", S("Red Nether Brick Wall"), "mcl_nether:red_nether_brick", {"mcl_nether_red_nether_brick.png"}, "", {pickaxey=1, material_stone=1, stonecutter_output=18}) +mcl_walls.register_wall("mcl_walls:mudbrick", S("Mud Brick Wall"), "mcl_mud:mud_bricks", {"mcl_mud_bricks.png"}, "", {handy=1, pickaxey=1, material_stone=1, stonecutter_output=30}) \ No newline at end of file From 524c9c1bcc9cb36f6e9582d5d907d91f57885fd6 Mon Sep 17 00:00:00 2001 From: ChrisPHP Date: Sun, 6 Aug 2023 21:42:34 +0100 Subject: [PATCH 303/982] Dupe glitch fizes and remove item label --- mods/ITEMS/mcl_stonecutter/README.md | 2 +- mods/ITEMS/mcl_stonecutter/init.lua | 35 ++++++++++++++-------------- 2 files changed, 19 insertions(+), 18 deletions(-) diff --git a/mods/ITEMS/mcl_stonecutter/README.md b/mods/ITEMS/mcl_stonecutter/README.md index c6316a5a2..3b6e23e05 100644 --- a/mods/ITEMS/mcl_stonecutter/README.md +++ b/mods/ITEMS/mcl_stonecutter/README.md @@ -5,7 +5,7 @@ Adds the stonecutter block. Used to cut stone like materials into stairs, slabs, License of code --------------- See the main MineClone 2 README.md file. -Author: PrairieWind +Author: PrairieWind, ChrisPHP, cora License of media ---------------- diff --git a/mods/ITEMS/mcl_stonecutter/init.lua b/mods/ITEMS/mcl_stonecutter/init.lua index 1fd37cdc6..2794da561 100644 --- a/mods/ITEMS/mcl_stonecutter/init.lua +++ b/mods/ITEMS/mcl_stonecutter/init.lua @@ -19,8 +19,7 @@ local function show_stonecutter_formspec(items, input) y_len = y_len + 1 x_len = 1 end - local test = string.format("item_image_button[%f,%f;%f,%f;%s;%s;%s]",x_len+1,y_len,1,1, value, "item_button", value) - cut_items[index] = test + table.insert(cut_items,string.format("item_image_button[%f,%f;%f,%f;%s;%s;%s]",x_len+1,y_len,1,1, value, value, "")) end end @@ -66,11 +65,11 @@ end -- Updates the formspec -local function update_stonecutter_slots(meta) +local function update_stonecutter_slots(pos,str) + local meta = minetest.get_meta(pos) local inv = meta:get_inventory() local input = inv:get_stack("input", 1) local name = input:get_name() - local new_output = meta:get_string("cut_stone") local compat_item = minetest.get_item_group(name, "stonecuttable") -- Checks if input is in the group @@ -89,9 +88,9 @@ local function update_stonecutter_slots(meta) end -- Checks if the chosen item is a slab or not, if it's a slab set the output to be a stack of 2 - if new_output ~= '' then - local cut_item = ItemStack(new_output) - if string.find(new_output, "mcl_stairs:slab_") then + if minetest.get_item_group(str, "stonecutter_output") > 0 then + local cut_item = ItemStack(str) + if string.match(str, "mcl_stairs:slab_") then cut_item:set_count(2) else cut_item:set_count(1) @@ -112,6 +111,7 @@ local function drop_stonecutter_items(pos, meta) minetest.add_item(p, stack) end end + minetest.set_node(pos,{name="air"}) end minetest.register_node("mcl_stonecutter:stonecutter", { @@ -199,7 +199,7 @@ minetest.register_node("mcl_stonecutter:stonecutter", { end end end - update_stonecutter_slots(meta) + update_stonecutter_slots(pos) end, allow_metadata_inventory_put = function(pos, listname, index, stack, player) local name = player:get_player_name() @@ -213,8 +213,7 @@ minetest.register_node("mcl_stonecutter:stonecutter", { end end, on_metadata_inventory_put = function(pos, listname, index, stack, player) - local meta = minetest.get_meta(pos) - update_stonecutter_slots(meta) + update_stonecutter_slots(pos) end, on_metadata_inventory_take = function(pos, listname, index, stack, player) local meta = minetest.get_meta(pos) @@ -229,7 +228,7 @@ minetest.register_node("mcl_stonecutter:stonecutter", { else meta:set_string("cut_stone", nil) end - update_stonecutter_slots(meta) + update_stonecutter_slots(pos) end, on_construct = function(pos) local meta = minetest.get_meta(pos) @@ -241,8 +240,7 @@ minetest.register_node("mcl_stonecutter:stonecutter", { end, on_rightclick = function(pos, node, player, itemstack) if not player:get_player_control().sneak then - local meta = minetest.get_meta(pos) - update_stonecutter_slots(meta) + update_stonecutter_slots(pos) end end, on_receive_fields = function(pos, formname, fields, sender) @@ -251,10 +249,13 @@ minetest.register_node("mcl_stonecutter:stonecutter", { minetest.record_protection_violation(pos, sender_name) return end - if fields.item_button then - local meta = minetest.get_meta(pos) - meta:set_string("cut_stone", fields.item_button) - update_stonecutter_slots(meta) + if fields then + for field_name, value in pairs(fields) do + local item_name = tostring(field_name) + if item_name then + update_stonecutter_slots(pos, item_name) + end + end end end, }) From 5dda3033a5b1316dd528abb0eca66cdff0f5c0c4 Mon Sep 17 00:00:00 2001 From: ChrisPHP Date: Sun, 6 Aug 2023 22:17:18 +0100 Subject: [PATCH 304/982] Prevent input from being a selectable option --- mods/ITEMS/mcl_stonecutter/init.lua | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/mods/ITEMS/mcl_stonecutter/init.lua b/mods/ITEMS/mcl_stonecutter/init.lua index 2794da561..5db74d3ac 100644 --- a/mods/ITEMS/mcl_stonecutter/init.lua +++ b/mods/ITEMS/mcl_stonecutter/init.lua @@ -44,6 +44,8 @@ local function show_stonecutter_formspec(items, input) return formspec end + +--Checks for the string for the different stair and wall positions that shouldn't be craftable local function check(item_name) if string.match(item_name, "mcl_walls") then if string.match(item_name, "%d") then @@ -77,7 +79,7 @@ local function update_stonecutter_slots(pos,str) local cuttable_recipes = {} for item_name, item_def in pairs(minetest.registered_items) do if item_def.groups and item_def.groups["stonecutter_output"] == compat_item then - if check(item_name) == false then + if check(item_name) == false and name ~= item_name then table.insert(cuttable_recipes, item_name) end end From 40fb043de2c4f894cb6e3e2b80f1dd90f5aa7f14 Mon Sep 17 00:00:00 2001 From: ChrisPHP Date: Mon, 7 Aug 2023 08:45:03 +0100 Subject: [PATCH 305/982] Add stage so smooth items can't be reverted --- mods/ITEMS/mcl_core/nodes_base.lua | 16 +++++++-------- mods/ITEMS/mcl_nether/init.lua | 2 +- mods/ITEMS/mcl_stairs/register.lua | 30 ++++++++++++++--------------- mods/ITEMS/mcl_stonecutter/init.lua | 10 ++++++---- mods/ITEMS/mcl_walls/register.lua | 2 +- 5 files changed, 31 insertions(+), 29 deletions(-) diff --git a/mods/ITEMS/mcl_core/nodes_base.lua b/mods/ITEMS/mcl_core/nodes_base.lua index 41fecbde3..c6613802a 100644 --- a/mods/ITEMS/mcl_core/nodes_base.lua +++ b/mods/ITEMS/mcl_core/nodes_base.lua @@ -236,7 +236,7 @@ minetest.register_node("mcl_core:stonebrick", { _doc_items_longdesc = doc.sub.items.temp.build, tiles = {"default_stone_brick.png"}, stack_max = 64, - groups = {pickaxey=1, stone=1, stonebrick=1, building_block=1, material_stone=1, stonecuttable=1, stonecutter_output=1}, + groups = {pickaxey=1, stone=1, stonebrick=1, building_block=1, material_stone=1, stonecuttable=1, stonecutter_output=1, stonecutter_stage=1}, sounds = mcl_sounds.node_sound_stone_defaults(), is_ground_content = false, _mcl_blast_resistance = 6, @@ -248,7 +248,7 @@ minetest.register_node("mcl_core:stonebrickcarved", { _doc_items_longdesc = doc.sub.items.temp.build, tiles = {"mcl_core_stonebrick_carved.png"}, stack_max = 64, - groups = {pickaxey=1, stone=1, stonebrick=1, building_block=1, material_stone=1, stonecutter_output=1}, + groups = {pickaxey=1, stone=1, stonebrick=1, building_block=1, material_stone=1, stonecutter_output=1, stonecutter_stage=1}, sounds = mcl_sounds.node_sound_stone_defaults(), is_ground_content = false, _mcl_blast_resistance = 6, @@ -309,7 +309,7 @@ minetest.register_node("mcl_core:granite_smooth", { tiles = {"mcl_core_granite_smooth.png"}, stack_max = 64, is_ground_content = false, - groups = {pickaxey=1, stone=1, building_block=1, material_stone=1, stonecuttable=4, stonecutter_output=4}, + groups = {pickaxey=1, stone=1, building_block=1, material_stone=1, stonecuttable=4, stonecutter_output=4, stonecutter_stage=1}, sounds = mcl_sounds.node_sound_stone_defaults(), _mcl_blast_resistance = 6, _mcl_hardness = 1.5, @@ -321,7 +321,7 @@ minetest.register_node("mcl_core:andesite", { tiles = {"mcl_core_andesite.png"}, is_ground_content = true, stack_max = 64, - groups = {pickaxey=1, stone=1, building_block=1, material_stone=1, stonecuttable=5}, + groups = {pickaxey=1, stone=1, building_block=1, material_stone=1, stonecuttable=5,}, sounds = mcl_sounds.node_sound_stone_defaults(), _mcl_blast_resistance = 6, _mcl_hardness = 1.5, @@ -333,7 +333,7 @@ minetest.register_node("mcl_core:andesite_smooth", { tiles = {"mcl_core_andesite_smooth.png"}, is_ground_content = false, stack_max = 64, - groups = {pickaxey=1, stone=1, building_block=1, material_stone=1, stonecuttable=5, stonecutter_output=5}, + groups = {pickaxey=1, stone=1, building_block=1, material_stone=1, stonecuttable=5, stonecutter_output=5, stonecutter_stage=1}, sounds = mcl_sounds.node_sound_stone_defaults(), _mcl_blast_resistance = 6, _mcl_hardness = 1.5, @@ -357,7 +357,7 @@ minetest.register_node("mcl_core:diorite_smooth", { tiles = {"mcl_core_diorite_smooth.png"}, is_ground_content = false, stack_max = 64, - groups = {pickaxey=1, stone=1, building_block=1, material_stone=1, stonecuttable=6, stonecutter_output=6}, + groups = {pickaxey=1, stone=1, building_block=1, material_stone=1, stonecuttable=6, stonecutter_output=6, stonecutter_stage=1}, sounds = mcl_sounds.node_sound_stone_defaults(), _mcl_blast_resistance = 6, _mcl_hardness = 1.5, @@ -623,7 +623,7 @@ minetest.register_node("mcl_core:sandstonesmooth2", { tiles = {"mcl_core_sandstone_top.png"}, is_ground_content = false, stack_max = 64, - groups = {pickaxey=1, sandstone=1, normal_sandstone=1, building_block=1, material_stone=1, stonecuttable=9, stonecutter_output=9}, + groups = {pickaxey=1, sandstone=1, normal_sandstone=1, building_block=1, material_stone=1, stonecuttable=9, stonecutter_output=9, stonecutter_stage=1}, sounds = mcl_sounds.node_sound_stone_defaults(), _mcl_blast_resistance = 6, _mcl_hardness = 2, @@ -685,7 +685,7 @@ minetest.register_node("mcl_core:redsandstonesmooth2", { tiles = {"mcl_core_red_sandstone_top.png"}, is_ground_content = false, stack_max = 64, - groups = {pickaxey=1, sandstone=1, red_sandstone=1, building_block=1, material_stone=1, stonecuttable=1, stonecutter_output=10}, + groups = {pickaxey=1, sandstone=1, red_sandstone=1, building_block=1, material_stone=1, stonecuttable=10, stonecutter_output=10, stonecutter_stage=1}, sounds = mcl_sounds.node_sound_stone_defaults(), _mcl_blast_resistance = 0.8, _mcl_hardness = 0.8, diff --git a/mods/ITEMS/mcl_nether/init.lua b/mods/ITEMS/mcl_nether/init.lua index 396bb1926..f66877707 100644 --- a/mods/ITEMS/mcl_nether/init.lua +++ b/mods/ITEMS/mcl_nether/init.lua @@ -257,7 +257,7 @@ minetest.register_node("mcl_nether:quartz_smooth", { stack_max = 64, is_ground_content = false, tiles = {"mcl_nether_quartz_block_bottom.png"}, - groups = {pickaxey=1, quartz_block=1,building_block=1, material_stone=1, stonecuttable=14, stonecutter_output=14}, + groups = {pickaxey=1, quartz_block=1,building_block=1, material_stone=1, stonecuttable=31, stonecutter_output=31}, sounds = mcl_sounds.node_sound_stone_defaults(), _mcl_blast_resistance = 0.8, _mcl_hardness = 0.8, diff --git a/mods/ITEMS/mcl_stairs/register.lua b/mods/ITEMS/mcl_stairs/register.lua index 706f12cd2..a669f2a22 100644 --- a/mods/ITEMS/mcl_stairs/register.lua +++ b/mods/ITEMS/mcl_stairs/register.lua @@ -79,7 +79,7 @@ mcl_stairs.register_stair("diorite", "mcl_core:diorite", {"mcl_core_diorite.png"}, S("Granite Stairs"), mcl_sounds.node_sound_stone_defaults(), 0.8, 0.8) -mcl_stairs.register_slab("granite", "mcl_core:diorite", +mcl_stairs.register_slab("diorite", "mcl_core:diorite", {pickaxey=1, material_stone=1, stonecutter_output=6}, {"mcl_core_diorite.png"}, S("Diorite Slab"), @@ -136,12 +136,12 @@ mcl_stairs.register_slab("sandstone", "group:normal_sandstone", S("Double Sandstone Slab"), "mcl_core:sandstone") --fixme: extra parameter from previous release mcl_stairs.register_stair("sandstonesmooth2", "mcl_core:sandstonesmooth2", - {pickaxey=1, material_stone=1, stonecutter_output=9}, + {pickaxey=1, material_stone=1, stonecutter_output=9, stonecutter_stage=1}, {"mcl_core_sandstone_top.png"}, S("Smooth Sandstone Stairs"), mcl_sounds.node_sound_stone_defaults(), 0.8, 0.8) mcl_stairs.register_slab("sandstonesmooth2", "mcl_core:sandstonesmooth2", - {pickaxey=1, material_stone=1, stonecutter_output=9}, + {pickaxey=1, material_stone=1, stonecutter_output=9, stonecutter_stage=1}, {"mcl_core_sandstone_top.png"}, S("Smooth Sandstone Slab"), mcl_sounds.node_sound_stone_defaults(), 6, 2, @@ -161,12 +161,12 @@ mcl_stairs.register_slab("redsandstone", "group:red_sandstone", S("Double Red Sandstone Slab"), "mcl_core:redsandstone") --fixme: extra parameter from previous release mcl_stairs.register_stair("redsandstonesmooth2", "mcl_core:redsandstonesmooth2", - {pickaxey=1, material_stone=1, stonecutter_output=10}, + {pickaxey=1, material_stone=1, stonecutter_output=10, stonecutter_stage=1}, {"mcl_core_red_sandstone_top.png"}, S("Smooth Red Sandstone Stairs"), mcl_sounds.node_sound_stone_defaults(), 0.8, 0.8) mcl_stairs.register_slab("redsandstonesmooth2", "mcl_core:redsandstonesmooth2", - {pickaxey=1, material_stone=1, stonecutter_output=10}, + {pickaxey=1, material_stone=1, stonecutter_output=10, stonecutter_stage=1}, {"mcl_core_red_sandstone_top.png"}, S("Smooth Red Sandstone Slab"), mcl_sounds.node_sound_stone_defaults(), 6, 2, @@ -174,13 +174,13 @@ mcl_stairs.register_slab("redsandstonesmooth2", "mcl_core:redsandstonesmooth2", -- Intentionally not group:stonebrick because of mclx_stairs mcl_stairs.register_stair("stonebrick", "mcl_core:stonebrick", - {pickaxey=1, material_stone=1, stonecutter_output=1}, + {pickaxey=1, material_stone=1, stonecutter_output=1, stonecutter_stage=1}, {"default_stone_brick.png"}, S("Stone Bricks Stairs"), mcl_sounds.node_sound_stone_defaults(), 6, 1.5, nil, "mcl_core:stonebrick") --fixme: extra parameter from previous release mcl_stairs.register_slab("stonebrick", "mcl_core:stonebrick", - {pickaxey=1, material_stone=1, stonecutter_output=1}, + {pickaxey=1, material_stone=1, stonecutter_output=1, stonecutter_stage=1}, {"default_stone_brick.png"}, S("Stone Bricks Slab"), mcl_sounds.node_sound_stone_defaults(), 6, 2, @@ -200,12 +200,12 @@ mcl_stairs.register_slab("quartzblock", "group:quartz_block", S("Double Quartz Slab"), "mcl_nether:quartz_block") --fixme: extra parameter from previous release mcl_stairs.register_stair("quartz_smooth", "mcl_nether:quartz_smooth", - {pickaxey=1, material_stone=1, stonecutter_output=14}, + {pickaxey=1, material_stone=1, stonecutter_output=31}, {"mcl_nether_quartz_block_bottom.png"}, S("Smooth Quartz Stairs"), mcl_sounds.node_sound_stone_defaults(), 0.8, 0.8) mcl_stairs.register_slab("quartz_smooth", "mcl_nether:quartz_smooth", - {pickaxey=1, material_stone=1, stonecutter_output=14}, + {pickaxey=1, material_stone=1, stonecutter_output=31}, {"mcl_nether_quartz_block_bottom.png"}, S("Smooth Quartz Slab"), mcl_sounds.node_sound_stone_defaults(), 6, 2, @@ -295,39 +295,39 @@ mcl_stairs.register_stair_and_slab("mud_brick", "mcl_mud:mud_bricks", S("Double Mud Brick Slab"), nil) mcl_stairs.register_slab("andesite_smooth", "mcl_core:andesite_smooth", - {pickaxey=1, stonecutter_output=5}, + {pickaxey=1, stonecutter_output=5, stonecutter_stage=1}, {"mcl_core_andesite_smooth.png", "mcl_core_andesite_smooth.png", "mcl_stairs_andesite_smooth_slab.png"}, S("Polished Andesite Slab"), nil, 6, nil, S("Double Polished Andesite Slab")) mcl_stairs.register_stair("andesite_smooth", "mcl_core:andesite_smooth", - {pickaxey=1, stonecutter_output=5}, + {pickaxey=1, stonecutter_output=5, stonecutter_stage=1}, {"mcl_stairs_andesite_smooth_slab.png", "mcl_core_andesite_smooth.png", "mcl_core_andesite_smooth.png", "mcl_core_andesite_smooth.png", "mcl_core_andesite_smooth.png", "mcl_stairs_andesite_smooth_slab.png"}, S("Polished Andesite Stairs"), nil, 6, nil, "woodlike") mcl_stairs.register_slab("granite_smooth", "mcl_core:granite_smooth", - {pickaxey=1, stonecutter_output=4}, + {pickaxey=1, stonecutter_output=4, stonecutter_stage=1}, {"mcl_core_granite_smooth.png", "mcl_core_granite_smooth.png", "mcl_stairs_granite_smooth_slab.png"}, S("Polished Granite Slab"), nil, 6, nil, S("Double Polished Granite Slab")) mcl_stairs.register_stair("granite_smooth", "mcl_core:granite_smooth", - {pickaxey=1, stonecutter_output=4}, + {pickaxey=1, stonecutter_output=4, stonecutter_stage=1}, {"mcl_stairs_granite_smooth_slab.png", "mcl_core_granite_smooth.png", "mcl_core_granite_smooth.png", "mcl_core_granite_smooth.png", "mcl_core_granite_smooth.png", "mcl_stairs_granite_smooth_slab.png"}, S("Polished Granite Stairs"), nil, 6, nil, "woodlike") mcl_stairs.register_slab("diorite_smooth", "mcl_core:diorite_smooth", - {pickaxey=1, stonecutter_output=6}, + {pickaxey=1, stonecutter_output=6, stonecutter_stage=1}, {"mcl_core_diorite_smooth.png", "mcl_core_diorite_smooth.png", "mcl_stairs_diorite_smooth_slab.png"}, S("Polished Diorite Slab"), nil, 6, nil, S("Double Polished Diorite Slab")) mcl_stairs.register_stair("diorite_smooth", "mcl_core:diorite_smooth", - {pickaxey=1, stonecutter_output=6}, + {pickaxey=1, stonecutter_output=6, stonecutter_stage=1}, {"mcl_stairs_diorite_smooth_slab.png", "mcl_core_diorite_smooth.png", "mcl_core_diorite_smooth.png", "mcl_core_diorite_smooth.png", "mcl_core_diorite_smooth.png", "mcl_stairs_diorite_smooth_slab.png"}, S("Polished Diorite Stairs"), nil, 6, nil, diff --git a/mods/ITEMS/mcl_stonecutter/init.lua b/mods/ITEMS/mcl_stonecutter/init.lua index 5db74d3ac..11f4f5556 100644 --- a/mods/ITEMS/mcl_stonecutter/init.lua +++ b/mods/ITEMS/mcl_stonecutter/init.lua @@ -26,7 +26,6 @@ local function show_stonecutter_formspec(items, input) local formspec = "size[9,8.75]".. "label[0,4.0;"..minetest.formspec_escape(minetest.colorize("#313131", S("Inventory"))).."]".. "label[1,0.1;"..minetest.formspec_escape(minetest.colorize("#313131", S("Stone Cutter"))).."]".. - "list[context;main;0,0;8,4;]".. "list[current_player;main;0,4.5;9,3;9]".. mcl_formspec.get_itemslot_bg(0,4.5,9,3).. "list[current_player;main;0,7.74;9,1;]".. @@ -46,12 +45,12 @@ end --Checks for the string for the different stair and wall positions that shouldn't be craftable -local function check(item_name) +local function check(item_name, input_name) + print(item_name) if string.match(item_name, "mcl_walls") then if string.match(item_name, "%d") then return true end - return false end if string.match(item_name, "_outer") then return true @@ -62,6 +61,9 @@ local function check(item_name) elseif string.match(item_name, "_double") then return true end + if minetest.get_item_group(item_name, "stonecutter_stage") == 0 and minetest.get_item_group(input_name, "stonecutter_stage") > 0 then + return true + end return false end @@ -79,7 +81,7 @@ local function update_stonecutter_slots(pos,str) local cuttable_recipes = {} for item_name, item_def in pairs(minetest.registered_items) do if item_def.groups and item_def.groups["stonecutter_output"] == compat_item then - if check(item_name) == false and name ~= item_name then + if check(item_name, name) == false and name ~= item_name then table.insert(cuttable_recipes, item_name) end end diff --git a/mods/ITEMS/mcl_walls/register.lua b/mods/ITEMS/mcl_walls/register.lua index 241c5ecc1..2307f2bfe 100644 --- a/mods/ITEMS/mcl_walls/register.lua +++ b/mods/ITEMS/mcl_walls/register.lua @@ -8,7 +8,7 @@ mcl_walls.register_wall("mcl_walls:diorite", S("Diorite Wall"), "mcl_core:diorit mcl_walls.register_wall("mcl_walls:brick", S("Brick Wall"), "mcl_core:brick_block", {"default_brick.png"}, "", {pickaxey=1, material_stone=1, stonecutter_output=16}) mcl_walls.register_wall("mcl_walls:sandstone", S("Sandstone Wall"), "mcl_core:sandstone", {"mcl_core_sandstone_top.png", "mcl_core_sandstone_bottom.png", "mcl_core_sandstone_normal.png"}, "", {pickaxey=1, material_stone=1, stonecutter_output=9}) mcl_walls.register_wall("mcl_walls:redsandstone", S("Red Sandstone Wall"), "mcl_core:redsandstone", {"mcl_core_red_sandstone_top.png", "mcl_core_red_sandstone_bottom.png", "mcl_core_red_sandstone_carved.png"}, "", {pickaxey=1, material_stone=1, stonecutter_output=10}) -mcl_walls.register_wall("mcl_walls:stonebrick", S("Stone Brick Wall"), "mcl_core:stonebrick", {"default_stone_brick.png"}, "", {pickaxey=1, material_stone=1, stonecutter_output=1}) +mcl_walls.register_wall("mcl_walls:stonebrick", S("Stone Brick Wall"), "mcl_core:stonebrick", {"default_stone_brick.png"}, "", {pickaxey=1, material_stone=1, stonecutter_output=1, stonecutter_stage=1}) mcl_walls.register_wall("mcl_walls:stonebrickmossy", S("Mossy Stone Brick Wall"), "mcl_core:stonebrickmossy", {"mcl_core_stonebrick_mossy.png"}, "", {pickaxey=1, material_stone=1, stonecutter_output=3}) mcl_walls.register_wall("mcl_walls:prismarine", S("Prismarine Wall"), "mcl_ocean:prismarine",{{name="mcl_ocean_prismarine_anim.png", animation={type="vertical_frames", aspect_w=32, aspect_h=32, length=45.0}}}, "", {pickaxey=1, material_stone=1, stonecutter_output=11}) mcl_walls.register_wall("mcl_walls:endbricks", S("End Stone Brick Wall"), "mcl_end:end_bricks", {"mcl_end_end_bricks.png"}, "", {pickaxey=1, material_stone=1, stonecutter_output=20}) From 559f5003224d830ff4a6dc27927bbf4106d8566c Mon Sep 17 00:00:00 2001 From: ChrisPHP Date: Tue, 8 Aug 2023 07:57:49 +0100 Subject: [PATCH 306/982] Update readme for stonecutter --- mods/ITEMS/mcl_stonecutter/README.md | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/mods/ITEMS/mcl_stonecutter/README.md b/mods/ITEMS/mcl_stonecutter/README.md index 3b6e23e05..e5888ea0b 100644 --- a/mods/ITEMS/mcl_stonecutter/README.md +++ b/mods/ITEMS/mcl_stonecutter/README.md @@ -2,6 +2,15 @@ mcl_stonecutter =============== Adds the stonecutter block. Used to cut stone like materials into stairs, slabs, etc. Also used as the Stone Mason Villager's jobsite. +### Adding recipes + +* To add a new compatible input the item needs to be in the group "stonecuttable". +* It's output item needs to be in the group "stonecutter_output". +* "stonecuttable" and "stonecutter_output" need to have the same number. +* Items like polished granite should only be able to make it's polished variants +while normal granite can make both. These inputs and outputs need to be in the group + "stonecutter_stage". + License of code --------------- See the main MineClone 2 README.md file. From 12568a6749abafa034b484d2c85ecd4bff7630a5 Mon Sep 17 00:00:00 2001 From: ChrisPHP Date: Sun, 20 Aug 2023 17:02:55 +0100 Subject: [PATCH 307/982] use on_destruct instead of after dig node --- mods/ITEMS/mcl_stonecutter/init.lua | 9 ++------- 1 file changed, 2 insertions(+), 7 deletions(-) diff --git a/mods/ITEMS/mcl_stonecutter/init.lua b/mods/ITEMS/mcl_stonecutter/init.lua index 11f4f5556..128891516 100644 --- a/mods/ITEMS/mcl_stonecutter/init.lua +++ b/mods/ITEMS/mcl_stonecutter/init.lua @@ -107,6 +107,7 @@ end -- Only drop the items that were in the input slot local function drop_stonecutter_items(pos, meta) + local meta = minetest.get_meta(pos) local inv = meta:get_inventory() for i=1, inv:get_size("input") do local stack = inv:get_stack("input", i) @@ -115,7 +116,6 @@ local function drop_stonecutter_items(pos, meta) minetest.add_item(p, stack) end end - minetest.set_node(pos,{name="air"}) end minetest.register_node("mcl_stonecutter:stonecutter", { @@ -157,12 +157,7 @@ minetest.register_node("mcl_stonecutter:stonecutter", { _mcl_blast_resistance = 3.5, _mcl_hardness = 3.5, sounds = mcl_sounds.node_sound_stone_defaults(), - - after_dig_node = function(pos, oldnode, oldmetadata, digger) - local meta = minetest.get_meta(pos) - meta:from_table(oldmetadata) - drop_stonecutter_items(pos, meta) - end, + on_destruct = drop_stonecutter_items, allow_metadata_inventory_take = function(pos, listname, index, stack, player) local name = player:get_player_name() if minetest.is_protected(pos, name) then From b252e577ec1541a41b132a9249b5bcf9f3ea5228 Mon Sep 17 00:00:00 2001 From: the-real-herowl Date: Mon, 13 Nov 2023 17:01:37 +0100 Subject: [PATCH 308/982] Implement recipe registering API --- mods/ITEMS/mcl_stonecutter/init.lua | 107 ++++++++++++---------------- 1 file changed, 47 insertions(+), 60 deletions(-) diff --git a/mods/ITEMS/mcl_stonecutter/init.lua b/mods/ITEMS/mcl_stonecutter/init.lua index 128891516..8f4f24aa1 100644 --- a/mods/ITEMS/mcl_stonecutter/init.lua +++ b/mods/ITEMS/mcl_stonecutter/init.lua @@ -5,6 +5,30 @@ local S = minetest.get_translator("mcl_stonecutter") +mcl_stonecutter = {} +mcl_stonecutter.registered_recipes = {} + +-- API +-- input - string - name of a registered item +-- output - string - name of a registered item +-- count - int - number of the output - +-- - defaults to 1 +-- - non-int rounded down +function mcl_stonecutter.register_recipe(input, output, count) + if not (minetest.registered_items[input] and minetest.registered_items[output]) then + error("Input or output is not a registered item") + end + local n = count + if type(count) ~= "number" then + n = 1 + end + n = math.floor(n) + if not mcl_stonecutter.registered_recipes[input] then + mcl_stonecutter.registered_recipes[input] = {} + end + mcl_stonecutter.registered_recipes[input][output] = n +end + -- formspecs local function show_stonecutter_formspec(items, input) local cut_items = {} @@ -13,13 +37,13 @@ local function show_stonecutter_formspec(items, input) -- This loops through all the items that can be made and inserted into the formspec if items ~= nil then - for index, value in pairs(items) do + for name, count in pairs(items) do x_len = x_len + 1 if x_len > 5 then y_len = y_len + 1 x_len = 1 end - table.insert(cut_items,string.format("item_image_button[%f,%f;%f,%f;%s;%s;%s]",x_len+1,y_len,1,1, value, value, "")) + table.insert(cut_items,string.format("item_image_button[%f,%f;%f,%f;%s;%s;%s]",x_len+1,y_len,1,1, name, name, tostring(count))) end end @@ -43,66 +67,28 @@ local function show_stonecutter_formspec(items, input) return formspec end - ---Checks for the string for the different stair and wall positions that shouldn't be craftable -local function check(item_name, input_name) - print(item_name) - if string.match(item_name, "mcl_walls") then - if string.match(item_name, "%d") then - return true - end - end - if string.match(item_name, "_outer") then - return true - elseif string.match(item_name, "_inner") then - return true - elseif string.match(item_name, "_top") then - return true - elseif string.match(item_name, "_double") then - return true - end - if minetest.get_item_group(item_name, "stonecutter_stage") == 0 and minetest.get_item_group(input_name, "stonecutter_stage") > 0 then - return true - end - return false -end - - -- Updates the formspec -local function update_stonecutter_slots(pos,str) +local function update_stonecutter_slots(pos, str) local meta = minetest.get_meta(pos) local inv = meta:get_inventory() local input = inv:get_stack("input", 1) local name = input:get_name() - local compat_item = minetest.get_item_group(name, "stonecuttable") + local recipes = mcl_stonecutter.registered_recipes[name] - -- Checks if input is in the group - if compat_item > 0 then - local cuttable_recipes = {} - for item_name, item_def in pairs(minetest.registered_items) do - if item_def.groups and item_def.groups["stonecutter_output"] == compat_item then - if check(item_name, name) == false and name ~= item_name then - table.insert(cuttable_recipes, item_name) - end - end + if recipes then + meta:set_string("formspec", show_stonecutter_formspec(recipes)) + if str then + local recipe = recipes[str] + if not recipe then return end + local cut_item = ItemStack(str) + cut_item:set_count(recipe) + inv:set_stack("output", 1, cut_item) + else + inv:set_stack("output", 1, "") end - meta:set_string("formspec", show_stonecutter_formspec(cuttable_recipes)) else meta:set_string("formspec", show_stonecutter_formspec(nil)) end - - -- Checks if the chosen item is a slab or not, if it's a slab set the output to be a stack of 2 - if minetest.get_item_group(str, "stonecutter_output") > 0 then - local cut_item = ItemStack(str) - if string.match(str, "mcl_stairs:slab_") then - cut_item:set_count(2) - else - cut_item:set_count(1) - end - inv:set_stack("output", 1, cut_item) - else - inv:set_stack("output", 1, "") - end end -- Only drop the items that were in the input slot @@ -114,6 +100,7 @@ local function drop_stonecutter_items(pos, meta) if not stack:is_empty() then local p = {x=pos.x+math.random(0, 10)/10-0.5, y=pos.y, z=pos.z+math.random(0, 10)/10-0.5} minetest.add_item(p, stack) +-- inv:set_stack("input", i, ItemStack()) end end end @@ -127,18 +114,18 @@ minetest.register_node("mcl_stonecutter:stonecutter", { "mcl_stonecutter_bottom.png", "mcl_stonecutter_side.png", "mcl_stonecutter_side.png", - {name="mcl_stonecutter_saw.png", + {name="mcl_stonecutter_saw.png", animation={ - type="vertical_frames", - aspect_w=16, - aspect_h=16, + type="vertical_frames", + aspect_w=16, + aspect_h=16, length=1 }}, - {name="mcl_stonecutter_saw.png", + {name="mcl_stonecutter_saw.png", animation={ - type="vertical_frames", - aspect_w=16, - aspect_h=16, + type="vertical_frames", + aspect_w=16, + aspect_h=16, length=1 }} }, From 19cea45c17e7a2af516df1db0f7b1da5e2668e8f Mon Sep 17 00:00:00 2001 From: the-real-herowl Date: Mon, 13 Nov 2023 21:13:16 +0100 Subject: [PATCH 309/982] Stonecutter fixes and improvements -improved stonecutter API, making it more robust -fixed a dupe bug --- mods/ITEMS/mcl_stonecutter/init.lua | 24 ++++++++++++++++++++++-- 1 file changed, 22 insertions(+), 2 deletions(-) diff --git a/mods/ITEMS/mcl_stonecutter/init.lua b/mods/ITEMS/mcl_stonecutter/init.lua index 8f4f24aa1..b32cf14fe 100644 --- a/mods/ITEMS/mcl_stonecutter/init.lua +++ b/mods/ITEMS/mcl_stonecutter/init.lua @@ -15,8 +15,12 @@ mcl_stonecutter.registered_recipes = {} -- - defaults to 1 -- - non-int rounded down function mcl_stonecutter.register_recipe(input, output, count) - if not (minetest.registered_items[input] and minetest.registered_items[output]) then - error("Input or output is not a registered item") + if mcl_stonecutter.registered_recipes[input] and mcl_stonecutter.registered_recipes[input][output] then return end + if not minetest.registered_items[input] then + error("Input is not a registered item: ".. input) + end + if not minetest.registered_items[output] then + error("Output is not a registered item: ".. output) end local n = count if type(count) ~= "number" then @@ -27,6 +31,21 @@ function mcl_stonecutter.register_recipe(input, output, count) mcl_stonecutter.registered_recipes[input] = {} end mcl_stonecutter.registered_recipes[input][output] = n + + local fallthrough = mcl_stonecutter.registered_recipes[output] + if fallthrough then + for o, c in pairs(fallthrough) do + mcl_stonecutter.register_recipe(input, o, c) + end + end + + for i, recipes in pairs(mcl_stonecutter.registered_recipes) do + for name, c in pairs(recipes) do + if name == input then + mcl_stonecutter.register_recipe(i, output, c*n) + end + end + end end -- formspecs @@ -88,6 +107,7 @@ local function update_stonecutter_slots(pos, str) end else meta:set_string("formspec", show_stonecutter_formspec(nil)) + inv:set_stack("output", 1, "") end end From ead2e772c28d4a037770d3f029de072ffd2de68f Mon Sep 17 00:00:00 2001 From: the-real-herowl Date: Mon, 13 Nov 2023 21:16:05 +0100 Subject: [PATCH 310/982] First batch of stonecutter recipes under new API -core blocks -stairs -slabs -walls --- mods/ITEMS/mcl_core/mod.conf | 2 +- mods/ITEMS/mcl_core/nodes_base.lua | 13 +++++++++++++ mods/ITEMS/mcl_stairs/api.lua | 5 +++++ mods/ITEMS/mcl_stairs/mod.conf | 2 +- mods/ITEMS/mcl_stairs/register.lua | 18 +++++++++--------- mods/ITEMS/mcl_walls/init.lua | 2 ++ mods/ITEMS/mcl_walls/mod.conf | 2 +- 7 files changed, 32 insertions(+), 12 deletions(-) diff --git a/mods/ITEMS/mcl_core/mod.conf b/mods/ITEMS/mcl_core/mod.conf index 45018df75..d96f159b5 100644 --- a/mods/ITEMS/mcl_core/mod.conf +++ b/mods/ITEMS/mcl_core/mod.conf @@ -1,4 +1,4 @@ name = mcl_core description = Core items of MineClone 2: Basic biome blocks (dirt, sand, stones, etc.), derived items, glass, sugar cane, cactus, barrier, mining tools, hand, craftitems, and misc. items which don't really fit anywhere else. -depends = mcl_autogroup, mcl_init, mcl_sounds, mcl_particles, mcl_util, mcl_worlds, doc_items, mcl_enchanting, mcl_colors +depends = mcl_autogroup, mcl_init, mcl_sounds, mcl_particles, mcl_util, mcl_worlds, doc_items, mcl_enchanting, mcl_colors, mcl_stonecutter optional_depends = doc diff --git a/mods/ITEMS/mcl_core/nodes_base.lua b/mods/ITEMS/mcl_core/nodes_base.lua index c6613802a..dbf746d7c 100644 --- a/mods/ITEMS/mcl_core/nodes_base.lua +++ b/mods/ITEMS/mcl_core/nodes_base.lua @@ -1124,6 +1124,19 @@ minetest.register_node("mcl_core:snowblock", { _mcl_silk_touch_drop = true, }) +-- Stonecutter recipes +mcl_stonecutter.register_recipe("mcl_core:stone", "mcl_core:stonebrick") +mcl_stonecutter.register_recipe("mcl_core:stone", "mcl_core:stonebrickcarved") +mcl_stonecutter.register_recipe("mcl_core:stonebrick", "mcl_core:stonebrickcarved") +mcl_stonecutter.register_recipe("mcl_core:granite", "mcl_core:granite_smooth") +mcl_stonecutter.register_recipe("mcl_core:andesite", "mcl_core:andesite_smooth") +mcl_stonecutter.register_recipe("mcl_core:diorite", "mcl_core:diorite_smooth") +mcl_stonecutter.register_recipe("mcl_core:sandstone", "mcl_core:sandstonesmooth") +mcl_stonecutter.register_recipe("mcl_core:sandstone", "mcl_core:sandstonecarved") +mcl_stonecutter.register_recipe("mcl_core:redsandstone", "mcl_core:redsandstonesmooth") +mcl_stonecutter.register_recipe("mcl_core:redsandstone", "mcl_core:redsandstonecarved") + + -- Add entry aliases for the Help if minetest.get_modpath("doc") then doc.add_entry_alias("nodes", "mcl_core:stone_with_redstone", "nodes", "mcl_core:stone_with_redstone_lit") diff --git a/mods/ITEMS/mcl_stairs/api.lua b/mods/ITEMS/mcl_stairs/api.lua index 6167d7e06..bebe7ba99 100644 --- a/mods/ITEMS/mcl_stairs/api.lua +++ b/mods/ITEMS/mcl_stairs/api.lua @@ -173,6 +173,9 @@ function mcl_stairs.register_stair(subname, recipeitem, groups, images, descript {recipeitem, recipeitem, recipeitem}, }, }) + + -- Stonecutter recipe + mcl_stonecutter.register_recipe(recipeitem, "mcl_stairs:stair_".. subname) end mcl_stairs.cornerstair.add("mcl_stairs:stair_"..subname, corner_stair_texture_override) @@ -343,6 +346,8 @@ function mcl_stairs.register_slab(subname, recipeitem, groups, images, descripti }, }) + mcl_stonecutter.register_recipe(recipeitem, lower_slab, 2) + end -- Help alias for the upper slab diff --git a/mods/ITEMS/mcl_stairs/mod.conf b/mods/ITEMS/mcl_stairs/mod.conf index 2fb3180b2..b3e0e2aa7 100644 --- a/mods/ITEMS/mcl_stairs/mod.conf +++ b/mods/ITEMS/mcl_stairs/mod.conf @@ -1,2 +1,2 @@ name = mcl_stairs -depends = mcl_core, mcl_sounds, mcl_nether, mcl_end, mcl_ocean, mcl_mud +depends = mcl_core, mcl_sounds, mcl_nether, mcl_end, mcl_ocean, mcl_mud, mcl_stonecutter diff --git a/mods/ITEMS/mcl_stairs/register.lua b/mods/ITEMS/mcl_stairs/register.lua index a669f2a22..228af97af 100644 --- a/mods/ITEMS/mcl_stairs/register.lua +++ b/mods/ITEMS/mcl_stairs/register.lua @@ -37,7 +37,7 @@ mcl_stairs.register_slab("stone_rough", "mcl_core:stone", S("Stone Slab"), mcl_sounds.node_sound_stone_defaults(), 6, 2, S("Double Stone Slab")) -mcl_stairs.register_stair("stone_rough", "group:stone", +mcl_stairs.register_stair("stone_rough", "mcl_core:stone", {pickaxey=1, material_stone=1,stonecutter_output=1}, {"default_stone.png"}, S("Stone Stairs"), @@ -122,13 +122,13 @@ mcl_stairs.register_slab("brick_block", "mcl_core:brick_block", mcl_sounds.node_sound_stone_defaults(), 6, 2, S("Double Brick Slab")) -mcl_stairs.register_stair("sandstone", "group:normal_sandstone", +mcl_stairs.register_stair("sandstone", "mcl_core:sandstone", {pickaxey=1, material_stone=1, stonecutter_output=9}, {"mcl_core_sandstone_top.png", "mcl_core_sandstone_bottom.png", "mcl_core_sandstone_normal.png"}, S("Sandstone Stairs"), mcl_sounds.node_sound_stone_defaults(), 0.8, 0.8, nil, "mcl_core:sandstone") --fixme: extra parameter from previous release -mcl_stairs.register_slab("sandstone", "group:normal_sandstone", +mcl_stairs.register_slab("sandstone", "mcl_core:sandstone", {pickaxey=1, material_stone=1, stonecutter_output=9}, {"mcl_core_sandstone_top.png", "mcl_core_sandstone_bottom.png", "mcl_core_sandstone_normal.png"}, S("Sandstone Slab"), @@ -147,13 +147,13 @@ mcl_stairs.register_slab("sandstonesmooth2", "mcl_core:sandstonesmooth2", mcl_sounds.node_sound_stone_defaults(), 6, 2, S("Double Smooth Sandstone Slab")) -mcl_stairs.register_stair("redsandstone", "group:red_sandstone", +mcl_stairs.register_stair("redsandstone", "mcl_core:redsandstone", {pickaxey=1, material_stone=1, stonecutter_output=10}, {"mcl_core_red_sandstone_top.png", "mcl_core_red_sandstone_bottom.png", "mcl_core_red_sandstone_normal.png"}, S("Red Sandstone Stairs"), mcl_sounds.node_sound_stone_defaults(), 0.8, 0.8, nil, "mcl_core:redsandstone") --fixme: extra parameter from previous release -mcl_stairs.register_slab("redsandstone", "group:red_sandstone", +mcl_stairs.register_slab("redsandstone", "mcl_core:redsandstone", {pickaxey=1, material_stone=1, stonecutter_output=10}, {"mcl_core_red_sandstone_top.png", "mcl_core_red_sandstone_bottom.png", "mcl_core_red_sandstone_normal.png"}, S("Red Sandstone Slab"), @@ -186,13 +186,13 @@ mcl_stairs.register_slab("stonebrick", "mcl_core:stonebrick", mcl_sounds.node_sound_stone_defaults(), 6, 2, S("Double Stone Bricks Slab"), "mcl_core:stonebrick") --fixme: extra parameter from previous release -mcl_stairs.register_stair("quartzblock", "group:quartz_block", +mcl_stairs.register_stair("quartzblock", "mcl_nether:quartz_block", {pickaxey=1, material_stone=1, stonecutter_output=14}, {"mcl_nether_quartz_block_top.png", "mcl_nether_quartz_block_bottom.png", "mcl_nether_quartz_block_side.png"}, S("Quartz Stairs"), mcl_sounds.node_sound_stone_defaults(), 0.8, 0.8, nil, "mcl_nether:quartz_block") --fixme: extra parameter from previous release -mcl_stairs.register_slab("quartzblock", "group:quartz_block", +mcl_stairs.register_slab("quartzblock", "mcl_nether:quartz_block", {pickaxey=1, material_stone=1, stonecutter_output=14}, {"mcl_nether_quartz_block_top.png", "mcl_nether_quartz_block_bottom.png", "mcl_nether_quartz_block_side.png"}, S("Quartz Slab"), @@ -234,13 +234,13 @@ mcl_stairs.register_stair_and_slab("end_bricks", "mcl_end:end_bricks", mcl_sounds.node_sound_stone_defaults(), 6, 2, S("Double End Stone Brick Slab"), nil) -mcl_stairs.register_stair("purpur_block", "group:purpur_block", +mcl_stairs.register_stair("purpur_block", "mcl_end:purpur_block", {pickaxey=1, material_stone=1, stonecutter_output=15}, {"mcl_end_purpur_block.png"}, S("Purpur Stairs"), mcl_sounds.node_sound_stone_defaults(), 6, 1.5, nil) -mcl_stairs.register_slab("purpur_block", "group:purpur_block", +mcl_stairs.register_slab("purpur_block", "mcl_end:purpur_block", {pickaxey=1, material_stone=1, stonecutter_output=15}, {"mcl_end_purpur_block.png"}, S("Purpur Slab"), diff --git a/mods/ITEMS/mcl_walls/init.lua b/mods/ITEMS/mcl_walls/init.lua index caf8b34fe..09a35b549 100644 --- a/mods/ITEMS/mcl_walls/init.lua +++ b/mods/ITEMS/mcl_walls/init.lua @@ -282,6 +282,8 @@ function mcl_walls.register_wall(nodename, description, source, tiles, inventory {source, source, source}, } }) + + mcl_stonecutter.register_recipe(source, nodename) end end diff --git a/mods/ITEMS/mcl_walls/mod.conf b/mods/ITEMS/mcl_walls/mod.conf index b6b221007..b099e4c1d 100644 --- a/mods/ITEMS/mcl_walls/mod.conf +++ b/mods/ITEMS/mcl_walls/mod.conf @@ -1,3 +1,3 @@ name = mcl_walls -depends = mcl_core, mcl_end, mcl_ocean, mcl_nether, mcl_sounds, mcl_mud +depends = mcl_core, mcl_end, mcl_ocean, mcl_nether, mcl_sounds, mcl_mud, mcl_stonecutter optional_depends = doc From d46b9071a05b6d0b82c0476f65d913632a680f7e Mon Sep 17 00:00:00 2001 From: the-real-herowl Date: Mon, 13 Nov 2023 21:17:36 +0100 Subject: [PATCH 311/982] Added nether and end stonecutter recipes --- mods/ITEMS/mcl_end/building.lua | 2 ++ mods/ITEMS/mcl_end/mod.conf | 2 +- mods/ITEMS/mcl_nether/init.lua | 4 ++++ mods/ITEMS/mcl_nether/mod.conf | 2 +- 4 files changed, 8 insertions(+), 2 deletions(-) diff --git a/mods/ITEMS/mcl_end/building.lua b/mods/ITEMS/mcl_end/building.lua index b3a6adf30..fec0df475 100644 --- a/mods/ITEMS/mcl_end/building.lua +++ b/mods/ITEMS/mcl_end/building.lua @@ -211,3 +211,5 @@ minetest.register_craft({ }, }) +mcl_stonecutter.register_recipe("mcl_end:end_stone", "mcl_end:end_bricks") +mcl_stonecutter.register_recipe("mcl_end:purpur_block", "mcl_end:purpur_pillar") diff --git a/mods/ITEMS/mcl_end/mod.conf b/mods/ITEMS/mcl_end/mod.conf index 021417e86..3547074cf 100644 --- a/mods/ITEMS/mcl_end/mod.conf +++ b/mods/ITEMS/mcl_end/mod.conf @@ -1,2 +1,2 @@ name = mcl_end -depends = screwdriver, mcl_sounds, mcl_util, doc_items, mcl_worlds, mcl_structures \ No newline at end of file +depends = screwdriver, mcl_sounds, mcl_util, doc_items, mcl_worlds, mcl_structures, mcl_stonecutter diff --git a/mods/ITEMS/mcl_nether/init.lua b/mods/ITEMS/mcl_nether/init.lua index f66877707..10a7b4dc5 100644 --- a/mods/ITEMS/mcl_nether/init.lua +++ b/mods/ITEMS/mcl_nether/init.lua @@ -415,5 +415,9 @@ minetest.register_craft({ } }) +-- TODO register stonecutter recipe for chiseled nether brick when it is added +mcl_stonecutter.register_recipe("mcl_nether:quartz_block", "mcl_nether:quartz_chiseled") +mcl_stonecutter.register_recipe("mcl_nether:quartz_block", "mcl_nether:quartz_pillar") + dofile(minetest.get_modpath(minetest.get_current_modname()).."/nether_wart.lua") dofile(minetest.get_modpath(minetest.get_current_modname()).."/lava.lua") diff --git a/mods/ITEMS/mcl_nether/mod.conf b/mods/ITEMS/mcl_nether/mod.conf index f5ffa61ac..afeca9967 100644 --- a/mods/ITEMS/mcl_nether/mod.conf +++ b/mods/ITEMS/mcl_nether/mod.conf @@ -1,3 +1,3 @@ name = mcl_nether -depends = mcl_core, mcl_sounds, mcl_util, walkover, doc_items, mcl_colors +depends = mcl_core, mcl_sounds, mcl_util, walkover, doc_items, mcl_colors, mcl_stonecutter optional_depends = doc, screwdriver From 6ebd3ccb7db073648c8df819ca2b48531e34c753 Mon Sep 17 00:00:00 2001 From: the-real-herowl Date: Mon, 13 Nov 2023 21:18:39 +0100 Subject: [PATCH 312/982] Third batch of stonecutter recipes -deepslate -blackstone -quartz bricks --- mods/ITEMS/mcl_blackstone/init.lua | 9 ++++++++- mods/ITEMS/mcl_blackstone/mod.conf | 2 +- mods/ITEMS/mcl_deepslate/init.lua | 6 ++++++ mods/ITEMS/mcl_deepslate/mod.conf | 2 +- 4 files changed, 16 insertions(+), 3 deletions(-) diff --git a/mods/ITEMS/mcl_blackstone/init.lua b/mods/ITEMS/mcl_blackstone/init.lua index c46fba97b..ab8ecd2fa 100644 --- a/mods/ITEMS/mcl_blackstone/init.lua +++ b/mods/ITEMS/mcl_blackstone/init.lua @@ -12,7 +12,7 @@ minetest.register_node("mcl_blackstone:blackstone", { tiles = {"mcl_blackstone_top.png", "mcl_blackstone_top.png", "mcl_blackstone_side.png"}, sounds = mcl_sounds.node_sound_stone_defaults(), is_ground_content = false, - groups = {cracky = 3, pickaxey=1, material_stone=1, cobble=1, stonecuttable=21}, + groups = {cracky = 3, pickaxey=1, material_stone=1, cobble=1}, _mcl_blast_resistance = 6, _mcl_hardness = 1.5, }) @@ -400,3 +400,10 @@ minetest.register_craft({ { "group:soul_block" }, } }) + +-- stonecutter recipes +mcl_stonecutter.register_recipe("mcl_blackstone:basalt", "mcl_blackstone:basalt_polished") +mcl_stonecutter.register_recipe("mcl_blackstone:blackstone", "mcl_blackstone:blackstone_polished") +mcl_stonecutter.register_recipe("mcl_blackstone:blackstone_polished", "mcl_blackstone:blackstone_chiseled_polished") +mcl_stonecutter.register_recipe("mcl_blackstone:blackstone_polished", "mcl_blackstone:blackstone_brick_polished") +mcl_stonecutter.register_recipe("mcl_nether:quartz_block", "mcl_blackstone:quartz_brick") diff --git a/mods/ITEMS/mcl_blackstone/mod.conf b/mods/ITEMS/mcl_blackstone/mod.conf index 8728f5b01..14a482067 100644 --- a/mods/ITEMS/mcl_blackstone/mod.conf +++ b/mods/ITEMS/mcl_blackstone/mod.conf @@ -1,3 +1,3 @@ name = mcl_blackstone author = debian044 -depends = mcl_core, screwdriver, mcl_stairs, mclx_stairs, mcl_walls, mclx_fences, mcl_torches, mcl_fire +depends = mcl_core, screwdriver, mcl_stairs, mclx_stairs, mcl_walls, mclx_fences, mcl_torches, mcl_fire, mcl_stonecutter, mcl_nether diff --git a/mods/ITEMS/mcl_deepslate/init.lua b/mods/ITEMS/mcl_deepslate/init.lua index b4549159f..0abb0c579 100644 --- a/mods/ITEMS/mcl_deepslate/init.lua +++ b/mods/ITEMS/mcl_deepslate/init.lua @@ -243,6 +243,10 @@ for i = 1, 3 do output = "mcl_deepslate:deepslate_"..deepslate_variants[i+1][1].." 4", recipe = { { s, s }, { s, s } } }) + mcl_stonecutter.register_recipe( + "mcl_deepslate:deepslate_"..deepslate_variants[i][1], + "mcl_deepslate:deepslate_"..deepslate_variants[i+1][1] + ) end for _, p in pairs({ "bricks", "tiles" }) do @@ -275,3 +279,5 @@ minetest.register_craft({ { "mcl_stairs:slab_deepslate_cobbled" }, }, }) + +mcl_stonecutter.register_recipe("mcl_deepslate:deepslate_cobbled", "mcl_deepslate:deepslate_chiseled") diff --git a/mods/ITEMS/mcl_deepslate/mod.conf b/mods/ITEMS/mcl_deepslate/mod.conf index 7e9a44cfc..e542c3fb0 100644 --- a/mods/ITEMS/mcl_deepslate/mod.conf +++ b/mods/ITEMS/mcl_deepslate/mod.conf @@ -1,4 +1,4 @@ name = mcl_deepslate author = NO11 -depends = mcl_raw_ores, mcl_core, mcl_sounds, mcl_dye, mcl_util, screwdriver, mobs_mc, walkover, mcl_walls, mcl_stairs, mcl_brewing, mcl_mobitems, mcl_furnaces, mcl_farming, mcl_worlds +depends = mcl_raw_ores, mcl_core, mcl_sounds, mcl_dye, mcl_util, screwdriver, mobs_mc, walkover, mcl_walls, mcl_stairs, mcl_brewing, mcl_mobitems, mcl_furnaces, mcl_farming, mcl_worlds, mcl_stonecutter optional_depends = mcl_copper From 0c7b4d473c408ded017e0669f37b15941f7e9f34 Mon Sep 17 00:00:00 2001 From: the-real-herowl Date: Mon, 13 Nov 2023 21:19:09 +0100 Subject: [PATCH 313/982] Copper blocks stonecutter recipes --- mods/ITEMS/mcl_copper/crafting.lua | 6 ++++++ mods/ITEMS/mcl_copper/mod.conf | 2 +- 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/mods/ITEMS/mcl_copper/crafting.lua b/mods/ITEMS/mcl_copper/crafting.lua index 41084afb3..6754534db 100644 --- a/mods/ITEMS/mcl_copper/crafting.lua +++ b/mods/ITEMS/mcl_copper/crafting.lua @@ -59,6 +59,12 @@ for _, w in ipairs(waxable_blocks) do }) end +local cuttable_blocks = { "block", "waxed_block", "block_exposed", "waxed_block_exposed", "block_weathered", "waxed_block_weathered", "block_oxidized", "waxed_block_oxidized" } + +for _, w in ipairs(cuttable_blocks) do + mcl_stonecutter.register_recipe("mcl_copper:"..w, "mcl_copper:"..w.."_cut") +end + minetest.register_craft({ output = "mcl_copper:copper_ingot 9", recipe = { diff --git a/mods/ITEMS/mcl_copper/mod.conf b/mods/ITEMS/mcl_copper/mod.conf index a48ee56f7..64937b2e1 100644 --- a/mods/ITEMS/mcl_copper/mod.conf +++ b/mods/ITEMS/mcl_copper/mod.conf @@ -1,4 +1,4 @@ name = mcl_copper author = NO11 -depends = mcl_core, mcl_sounds, mcl_stairs, mcl_util, mcl_oxidation +depends = mcl_core, mcl_sounds, mcl_stairs, mcl_util, mcl_oxidation, mcl_stonecutter description = Adds Copper Ore, blocks and items. From fd17bf1a29c3644e93aeeb0b3922de7b617e0923 Mon Sep 17 00:00:00 2001 From: the-real-herowl Date: Mon, 13 Nov 2023 21:27:42 +0100 Subject: [PATCH 314/982] Removed old implementation groups --- mods/ITEMS/mcl_blackstone/init.lua | 22 +++---- mods/ITEMS/mcl_copper/nodes.lua | 64 +++++++++---------- mods/ITEMS/mcl_core/nodes_base.lua | 44 ++++++------- mods/ITEMS/mcl_end/building.lua | 8 +-- mods/ITEMS/mcl_mud/init.lua | 4 +- mods/ITEMS/mcl_nether/init.lua | 12 ++-- mods/ITEMS/mcl_ocean/prismarine.lua | 6 +- mods/ITEMS/mcl_stairs/register.lua | 98 ++++++++++++++--------------- mods/ITEMS/mcl_walls/register.lua | 30 ++++----- 9 files changed, 144 insertions(+), 144 deletions(-) diff --git a/mods/ITEMS/mcl_blackstone/init.lua b/mods/ITEMS/mcl_blackstone/init.lua index ab8ecd2fa..e42554f59 100644 --- a/mods/ITEMS/mcl_blackstone/init.lua +++ b/mods/ITEMS/mcl_blackstone/init.lua @@ -73,7 +73,7 @@ minetest.register_node("mcl_blackstone:basalt_polished", { on_place = mcl_util.rotate_axis, on_rotate = on_rotate, is_ground_content = false, - groups = {cracky = 3, pickaxey=1, material_stone=1, stonecutter_output=19}, + groups = {cracky = 3, pickaxey=1, material_stone=1}, _mcl_blast_resistance = 4.2, _mcl_hardness = 1.25, }) @@ -85,7 +85,7 @@ minetest.register_node("mcl_blackstone:basalt", { on_place = mcl_util.rotate_axis, on_rotate = on_rotate, is_ground_content = false, - groups = {cracky = 3, pickaxey=1, material_stone=1, stonecuttable=19}, + groups = {cracky = 3, pickaxey=1, material_stone=1}, _mcl_blast_resistance = 4.2, _mcl_hardness = 1.25, }) @@ -103,7 +103,7 @@ minetest.register_node("mcl_blackstone:blackstone_polished", { tiles = {"mcl_blackstone_polished.png"}, sounds = mcl_sounds.node_sound_stone_defaults(), is_ground_content = false, - groups = {cracky = 3, pickaxey=1, material_stone=1, stonecuttable=21, stonecutter_output=21}, + groups = {cracky = 3, pickaxey=1, material_stone=1}, _mcl_blast_resistance = 6, _mcl_hardness = 2, }) @@ -112,7 +112,7 @@ minetest.register_node("mcl_blackstone:blackstone_chiseled_polished", { tiles = {"mcl_blackstone_chiseled_polished.png"}, sounds = mcl_sounds.node_sound_stone_defaults(), is_ground_content = false, - groups = {cracky = 3, pickaxey=1, material_stone=1, stonecutter_output=21}, + groups = {cracky = 3, pickaxey=1, material_stone=1}, _mcl_blast_resistance = 6, _mcl_hardness = 1.5, }) @@ -121,7 +121,7 @@ minetest.register_node("mcl_blackstone:blackstone_brick_polished", { tiles = {"mcl_blackstone_polished_bricks.png"}, sounds = mcl_sounds.node_sound_stone_defaults(), is_ground_content = false, - groups = {cracky = 3, pickaxey=1, material_stone=1, stonecutter_output=21}, + groups = {cracky = 3, pickaxey=1, material_stone=1}, _mcl_blast_resistance = 6, _mcl_hardness = 1.5, }) @@ -131,7 +131,7 @@ minetest.register_node("mcl_blackstone:quartz_brick", { sounds = mcl_sounds.node_sound_stone_defaults(), is_ground_content = false, sounds = mcl_sounds.node_sound_stone_defaults(), - groups = {cracky = 3, pickaxey=1, material_stone=1, stonecutter_output=14}, + groups = {cracky = 3, pickaxey=1, material_stone=1}, _mcl_blast_resistance = 0.8, _mcl_hardness = 0.8, }) @@ -194,7 +194,7 @@ end --slabs/stairs mcl_stairs.register_stair_and_slab("blackstone", "mcl_blackstone:blackstone", - {cracky=3, pickaxey=1, material_stone=1, stonecutter_output=21}, + {cracky=3, pickaxey=1, material_stone=1}, {"mcl_blackstone_top.png", "mcl_blackstone_top.png", "mcl_blackstone_side.png"}, S("Blackstone Stairs"), S("Blackstone Slab"), @@ -202,7 +202,7 @@ mcl_stairs.register_stair_and_slab("blackstone", "mcl_blackstone:blackstone", S("Double Blackstone Slab"), nil) mcl_stairs.register_stair_and_slab("blackstone_polished", "mcl_blackstone:blackstone_polished", - {cracky=3, pickaxey=1, material_stone=1, stonecutter_output=21}, + {cracky=3, pickaxey=1, material_stone=1}, {"mcl_blackstone_polished.png"}, S("Polished Blackstone Stairs"), S("Polished Blackstone Slab"), @@ -210,7 +210,7 @@ mcl_stairs.register_stair_and_slab("blackstone_polished", "mcl_blackstone:blacks S("Double Polished Blackstone Slab"), nil) mcl_stairs.register_stair_and_slab("blackstone_chiseled_polished", "mcl_blackstone:blackstone_chiseled_polished", - {cracky=3, pickaxey=1, material_stone=1, stonecutter_output=21}, + {cracky=3, pickaxey=1, material_stone=1}, {"mcl_blackstone_chiseled_polished.png"}, S("Chiseled Polished Blackstone Stairs"), S("Chiseled Polished Blackstone Slab"), @@ -218,7 +218,7 @@ mcl_stairs.register_stair_and_slab("blackstone_chiseled_polished", "mcl_blacksto S("Double Chiseled Polished Blackstone Slab"), nil) mcl_stairs.register_stair_and_slab("blackstone_brick_polished", "mcl_blackstone:blackstone_brick_polished", - {cracky=3, pickaxey=1, material_stone=1, stonecutter_output=21}, + {cracky=3, pickaxey=1, material_stone=1}, {"mcl_blackstone_polished_bricks.png"}, S("Polished Blackstone Brick Stair Stairs"), S("Polished Blackstone Brick Stair Slab"), @@ -236,7 +236,7 @@ mcl_walls.register_wall( "mcl_blackstone_side.png" }, "", - { cracky=3, pickaxey=1, material_stone=1, stonecutter_output=21 } + { cracky=3, pickaxey=1, material_stone=1 } ) --lavacooling diff --git a/mods/ITEMS/mcl_copper/nodes.lua b/mods/ITEMS/mcl_copper/nodes.lua index f131d9967..af5a49a1c 100644 --- a/mods/ITEMS/mcl_copper/nodes.lua +++ b/mods/ITEMS/mcl_copper/nodes.lua @@ -30,7 +30,7 @@ minetest.register_node("mcl_copper:block", { _doc_items_longdesc = S("A block of copper is mostly a decorative block."), tiles = {"mcl_copper_block.png"}, is_ground_content = false, - groups = {pickaxey = 2, building_block = 1, oxidizable = 1, stonecuttable=22}, + groups = {pickaxey = 2, building_block = 1, oxidizable = 1}, sounds = mcl_sounds.node_sound_metal_defaults(), _mcl_blast_resistance = 6, _mcl_hardness = 3, @@ -43,7 +43,7 @@ minetest.register_node("mcl_copper:waxed_block", { _doc_items_longdesc = S("A block of copper is mostly a decorative block."), tiles = {"mcl_copper_block.png"}, is_ground_content = false, - groups = {pickaxey = 2, building_block = 1, waxed = 1, stonecuttable=23}, + groups = {pickaxey = 2, building_block = 1, waxed = 1}, sounds = mcl_sounds.node_sound_metal_defaults(), _mcl_blast_resistance = 6, _mcl_hardness = 3, @@ -55,7 +55,7 @@ minetest.register_node("mcl_copper:block_exposed", { _doc_items_longdesc = S("Exposed copper is a decorative block."), tiles = {"mcl_copper_exposed.png"}, is_ground_content = false, - groups = {pickaxey = 2, building_block = 1, oxidizable = 1, stonecuttable=24}, + groups = {pickaxey = 2, building_block = 1, oxidizable = 1}, sounds = mcl_sounds.node_sound_metal_defaults(), _mcl_blast_resistance = 6, _mcl_hardness = 5, @@ -69,7 +69,7 @@ minetest.register_node("mcl_copper:waxed_block_exposed", { _doc_items_longdesc = S("Exposed copper is a decorative block."), tiles = {"mcl_copper_exposed.png"}, is_ground_content = false, - groups = {pickaxey = 2, building_block = 1, waxed = 1, stonecuttable=25}, + groups = {pickaxey = 2, building_block = 1, waxed = 1}, sounds = mcl_sounds.node_sound_metal_defaults(), _mcl_blast_resistance = 6, _mcl_hardness = 5, @@ -81,7 +81,7 @@ minetest.register_node("mcl_copper:block_weathered", { _doc_items_longdesc = S("Weathered copper is a decorative block."), tiles = {"mcl_copper_weathered.png"}, is_ground_content = false, - groups = {pickaxey = 2, building_block = 1, oxidizable = 1, stonecuttable=26}, + groups = {pickaxey = 2, building_block = 1, oxidizable = 1}, sounds = mcl_sounds.node_sound_metal_defaults(), _mcl_blast_resistance = 6, _mcl_hardness = 5, @@ -95,7 +95,7 @@ minetest.register_node("mcl_copper:waxed_block_weathered", { _doc_items_longdesc = S("Weathered copper is a decorative block."), tiles = {"mcl_copper_weathered.png"}, is_ground_content = false, - groups = {pickaxey = 2, building_block = 1, waxed = 1, stonecuttable=27}, + groups = {pickaxey = 2, building_block = 1, waxed = 1}, sounds = mcl_sounds.node_sound_metal_defaults(), _mcl_blast_resistance = 6, _mcl_hardness = 5, @@ -107,7 +107,7 @@ minetest.register_node("mcl_copper:block_oxidized", { _doc_items_longdesc = S("Oxidized copper is a decorative block."), tiles = {"mcl_copper_oxidized.png"}, is_ground_content = false, - groups = {pickaxey = 2, building_block = 1, stonecuttable=28}, + groups = {pickaxey = 2, building_block = 1}, sounds = mcl_sounds.node_sound_metal_defaults(), _mcl_blast_resistance = 6, _mcl_hardness = 5, @@ -120,7 +120,7 @@ minetest.register_node("mcl_copper:waxed_block_oxidized", { _doc_items_longdesc = S("Oxidized copper is a decorative block."), tiles = {"mcl_copper_oxidized.png"}, is_ground_content = false, - groups = {pickaxey = 2, building_block = 1, waxed = 1, stonecuttable=29}, + groups = {pickaxey = 2, building_block = 1, waxed = 1}, sounds = mcl_sounds.node_sound_metal_defaults(), _mcl_blast_resistance = 6, _mcl_hardness = 5, @@ -132,7 +132,7 @@ minetest.register_node("mcl_copper:block_cut", { _doc_items_longdesc = S("Cut copper is a decorative block."), tiles = {"mcl_copper_block_cut.png"}, is_ground_content = false, - groups = {pickaxey = 2, building_block = 1, oxidizable = 1, stonecuttable=22, stonecutter_output=22}, + groups = {pickaxey = 2, building_block = 1, oxidizable = 1}, sounds = mcl_sounds.node_sound_metal_defaults(), _mcl_blast_resistance = 6, _mcl_hardness = 5, @@ -145,7 +145,7 @@ minetest.register_node("mcl_copper:waxed_block_cut", { _doc_items_longdesc = S("Cut copper is a decorative block."), tiles = {"mcl_copper_block_cut.png"}, is_ground_content = false, - groups = {pickaxey = 2, building_block = 1, waxed = 1, stonecuttable=23, stonecutter_output=23}, + groups = {pickaxey = 2, building_block = 1, waxed = 1}, sounds = mcl_sounds.node_sound_metal_defaults(), _mcl_blast_resistance = 6, _mcl_hardness = 5, @@ -157,7 +157,7 @@ minetest.register_node("mcl_copper:block_exposed_cut", { _doc_items_longdesc = S("Exposed cut copper is a decorative block."), tiles = {"mcl_copper_exposed_cut.png"}, is_ground_content = false, - groups = {pickaxey = 2, building_block = 1, oxidizable = 1, stonecuttable=24, stonecutter_output=24}, + groups = {pickaxey = 2, building_block = 1, oxidizable = 1}, sounds = mcl_sounds.node_sound_metal_defaults(), _mcl_blast_resistance = 6, _mcl_hardness = 5, @@ -171,7 +171,7 @@ minetest.register_node("mcl_copper:waxed_block_exposed_cut", { _doc_items_longdesc = S("Exposed cut copper is a decorative block."), tiles = {"mcl_copper_exposed_cut.png"}, is_ground_content = false, - groups = {pickaxey = 2, building_block = 1, waxed = 1, stonecuttable=25, stonecutter_output=25}, + groups = {pickaxey = 2, building_block = 1, waxed = 1}, sounds = mcl_sounds.node_sound_metal_defaults(), _mcl_blast_resistance = 6, _mcl_hardness = 5, @@ -183,7 +183,7 @@ minetest.register_node("mcl_copper:block_weathered_cut", { _doc_items_longdesc = S("Weathered cut copper is a decorative block."), tiles = {"mcl_copper_weathered_cut.png"}, is_ground_content = false, - groups = {pickaxey = 2, building_block = 1, oxidizable = 1, stonecuttable=26, stonecutter_output=26}, + groups = {pickaxey = 2, building_block = 1, oxidizable = 1}, sounds = mcl_sounds.node_sound_metal_defaults(), _mcl_blast_resistance = 6, _mcl_hardness = 5, @@ -197,7 +197,7 @@ minetest.register_node("mcl_copper:waxed_block_weathered_cut", { _doc_items_longdesc = S("Weathered cut copper is a decorative block."), tiles = {"mcl_copper_weathered_cut.png"}, is_ground_content = false, - groups = {pickaxey = 2, building_block = 1, waxed = 1, stonecuttable=27, stonecutter_output=27}, + groups = {pickaxey = 2, building_block = 1, waxed = 1}, sounds = mcl_sounds.node_sound_metal_defaults(), _mcl_blast_resistance = 6, _mcl_hardness = 5, @@ -209,7 +209,7 @@ minetest.register_node("mcl_copper:block_oxidized_cut", { _doc_items_longdesc = S("Oxidized cut copper is a decorative block."), tiles = {"mcl_copper_oxidized_cut.png"}, is_ground_content = false, - groups = {pickaxey = 2, building_block = 1, stonecuttable=28, stonecutter_output=28}, + groups = {pickaxey = 2, building_block = 1}, sounds = mcl_sounds.node_sound_metal_defaults(), _mcl_blast_resistance = 6, _mcl_hardness = 5, @@ -222,7 +222,7 @@ minetest.register_node("mcl_copper:waxed_block_oxidized_cut", { _doc_items_longdesc = S("Oxidized cut copper is a decorative block."), tiles = {"mcl_copper_oxidized_cut.png"}, is_ground_content = false, - groups = {pickaxey = 2, building_block = 1, waxed = 1, stonecuttable=29, stonecutter_output=29}, + groups = {pickaxey = 2, building_block = 1, waxed = 1}, sounds = mcl_sounds.node_sound_metal_defaults(), _mcl_blast_resistance = 6, _mcl_hardness = 5, @@ -230,112 +230,112 @@ minetest.register_node("mcl_copper:waxed_block_oxidized_cut", { }) mcl_stairs.register_slab("copper_cut", "mcl_copper:block_cut", - {pickaxey = 2, oxidizable = 1, stonecutter_output = 22}, + {pickaxey = 2, oxidizable = 1}, {"mcl_copper_block_cut.png", "mcl_copper_block_cut.png", "mcl_copper_block_cut.png"}, S("Slab of Cut Copper"), nil, nil, nil, S("Double Slab of Cut Copper")) mcl_stairs.register_slab("waxed_copper_cut", "mcl_copper:waxed_block_cut", - {pickaxey = 2, waxed = 1, stonecutter_output = 23}, + {pickaxey = 2, waxed = 1}, {"mcl_copper_block_cut.png", "mcl_copper_block_cut.png", "mcl_copper_block_cut.png"}, S("Waxed Slab of Cut Copper"), nil, nil, nil, S("Waxed Double Slab of Cut Copper")) mcl_stairs.register_slab("copper_exposed_cut", "mcl_copper:block_exposed_cut", - {pickaxey = 2, oxidizable = 1, stonecutter_output = 24}, + {pickaxey = 2, oxidizable = 1}, {"mcl_copper_exposed_cut.png", "mcl_copper_exposed_cut.png", "mcl_copper_exposed_cut.png"}, S("Slab of Exposed Cut Copper"), nil, nil, nil, S("Double Slab of Exposed Cut Copper")) mcl_stairs.register_slab("waxed_copper_exposed_cut", "mcl_copper:waxed_block_exposed_cut", - {pickaxey = 2, waxed = 1, stonecutter_output = 25}, + {pickaxey = 2, waxed = 1}, {"mcl_copper_exposed_cut.png", "mcl_copper_exposed_cut.png", "mcl_copper_exposed_cut.png"}, S("Waxed Slab of Exposed Cut Copper"), nil, nil, nil, S("Waxed Double Slab of Exposed Cut Copper")) mcl_stairs.register_slab("copper_weathered_cut", "mcl_copper:block_weathered_cut", - {pickaxey = 2, oxidizable = 1, stonecutter_output = 26}, + {pickaxey = 2, oxidizable = 1}, {"mcl_copper_weathered_cut.png", "mcl_copper_weathered_cut.png", "mcl_copper_weathered_cut.png"}, S("Slab of Weathered Cut Copper"), nil, nil, nil, S("Double Slab of Weathered Cut Copper")) mcl_stairs.register_slab("waxed_copper_weathered_cut", "mcl_copper:waxed_block_weathered_cut", - {pickaxey = 2, waxed = 1, stonecutter_output = 27}, + {pickaxey = 2, waxed = 1}, {"mcl_copper_weathered_cut.png", "mcl_copper_weathered_cut.png", "mcl_copper_weathered_cut.png"}, S("Waxed Slab of Weathered Cut Copper"), nil, nil, nil, S("Waxed Double Slab of Weathered Cut Copper")) mcl_stairs.register_slab("copper_oxidized_cut", "mcl_copper:block_oxidized_cut", - {pickaxey = 2, stonecutter_output = 28}, + {pickaxey = 2}, {"mcl_copper_oxidized_cut.png", "mcl_copper_oxidized_cut.png", "mcl_copper_oxidized_cut.png"}, S("Slab of Oxidized Cut Copper"), nil, nil, nil, S("Double Slab of Oxidized Cut Copper")) mcl_stairs.register_slab("waxed_copper_oxidized_cut", "mcl_copper:waxed_block_oxidized_cut", - {pickaxey = 2, waxed = 1, stonecutter_output = 29}, + {pickaxey = 2, waxed = 1}, {"mcl_copper_oxidized_cut.png", "mcl_copper_oxidized_cut.png", "mcl_copper_oxidized_cut.png"}, S("Waxed Slab of Oxidized Cut Copper"), nil, nil, nil, S("Waxed Double Slab of Oxidized Cut Copper")) mcl_stairs.register_stair("copper_cut", "mcl_copper:block_cut", - {pickaxey = 2, oxidizable = 1, stonecutter_output = 22}, + {pickaxey = 2, oxidizable = 1}, {"mcl_copper_block_cut.png", "mcl_copper_block_cut.png", "mcl_copper_block_cut.png", "mcl_copper_block_cut.png", "mcl_copper_block_cut.png", "mcl_copper_block_cut.png"}, S("Stairs of Cut Copper"), nil, 6, nil, "woodlike") mcl_stairs.register_stair("waxed_copper_cut", "mcl_copper:waxed_block_cut", - {pickaxey = 2, waxed = 1, stonecutter_output = 23}, + {pickaxey = 2, waxed = 1}, {"mcl_copper_block_cut.png", "mcl_copper_block_cut.png", "mcl_copper_block_cut.png", "mcl_copper_block_cut.png", "mcl_copper_block_cut.png", "mcl_copper_block_cut.png"}, S("Waxed Stairs of Cut Copper"), nil, 6, nil, "woodlike") mcl_stairs.register_stair("copper_exposed_cut", "mcl_copper:block_exposed_cut", - {pickaxey = 2, oxidizable = 1, stonecutter_output = 24}, + {pickaxey = 2, oxidizable = 1}, {"mcl_copper_exposed_cut.png", "mcl_copper_exposed_cut.png", "mcl_copper_exposed_cut.png", "mcl_copper_exposed_cut.png", "mcl_copper_exposed_cut.png", "mcl_copper_exposed_cut.png"}, S("Stairs of Exposed Cut Copper"), nil, 6, nil, "woodlike") mcl_stairs.register_stair("waxed_copper_exposed_cut", "mcl_copper:waxed_block_exposed_cut", - {pickaxey = 2, waxed = 1, stonecutter_output = 25}, + {pickaxey = 2, waxed = 1}, {"mcl_copper_exposed_cut.png", "mcl_copper_exposed_cut.png", "mcl_copper_exposed_cut.png", "mcl_copper_exposed_cut.png", "mcl_copper_exposed_cut.png", "mcl_copper_exposed_cut.png"}, S("Waxed Stairs of Exposed Cut Copper"), nil, 6, nil, "woodlike") mcl_stairs.register_stair("copper_weathered_cut", "mcl_copper:block_weathered_cut", - {pickaxey = 2, oxidizable = 1, stonecutter_output = 26}, + {pickaxey = 2, oxidizable = 1}, {"mcl_copper_weathered_cut.png", "mcl_copper_weathered_cut.png", "mcl_copper_weathered_cut.png", "mcl_copper_weathered_cut.png", "mcl_copper_weathered_cut.png", "mcl_copper_weathered_cut.png"}, S("Stairs of Weathered Cut Copper"), nil, 6, nil, "woodlike") mcl_stairs.register_stair("waxed_copper_weathered_cut", "mcl_copper:waxed_block_weathered_cut", - {pickaxey = 2, waxed = 1, stonecutter_output = 27}, + {pickaxey = 2, waxed = 1}, {"mcl_copper_weathered_cut.png", "mcl_copper_weathered_cut.png", "mcl_copper_weathered_cut.png", "mcl_copper_weathered_cut.png", "mcl_copper_weathered_cut.png", "mcl_copper_weathered_cut.png"}, S("Waxed Stairs of Weathered Cut Copper"), nil, 6, nil, "woodlike") mcl_stairs.register_stair("copper_oxidized_cut", "mcl_copper:block_oxidized_cut", - {pickaxey = 2, stonecutter_output = 28}, + {pickaxey = 2}, {"mcl_copper_oxidized_cut.png", "mcl_copper_oxidized_cut.png", "mcl_copper_oxidized_cut.png", "mcl_copper_oxidized_cut.png", "mcl_copper_oxidized_cut.png", "mcl_copper_oxidized_cut.png"}, S("Stairs of Oxidized Cut Copper"), nil, 6, nil, "woodlike") mcl_stairs.register_stair("waxed_copper_oxidized_cut", "mcl_copper:waxed_block_oxidized_cut", - {pickaxey = 2, waxed = 1, stonecutter_output = 29}, + {pickaxey = 2, waxed = 1}, {"mcl_copper_oxidized_cut.png", "mcl_copper_oxidized_cut.png", "mcl_copper_oxidized_cut.png", "mcl_copper_oxidized_cut.png", "mcl_copper_oxidized_cut.png", "mcl_copper_oxidized_cut.png"}, S("Waxed Stairs of Oxidized Cut Copper"), nil, 6, nil, diff --git a/mods/ITEMS/mcl_core/nodes_base.lua b/mods/ITEMS/mcl_core/nodes_base.lua index dbf746d7c..db2561082 100644 --- a/mods/ITEMS/mcl_core/nodes_base.lua +++ b/mods/ITEMS/mcl_core/nodes_base.lua @@ -27,7 +27,7 @@ minetest.register_node("mcl_core:stone", { tiles = {"default_stone.png"}, is_ground_content = true, stack_max = 64, - groups = {pickaxey=1, stone=1, building_block=1, material_stone=1, stonecuttable=1}, + groups = {pickaxey=1, stone=1, building_block=1, material_stone=1}, drop = "mcl_core:cobble", sounds = mcl_sounds.node_sound_stone_defaults(), _mcl_blast_resistance = 6, @@ -236,7 +236,7 @@ minetest.register_node("mcl_core:stonebrick", { _doc_items_longdesc = doc.sub.items.temp.build, tiles = {"default_stone_brick.png"}, stack_max = 64, - groups = {pickaxey=1, stone=1, stonebrick=1, building_block=1, material_stone=1, stonecuttable=1, stonecutter_output=1, stonecutter_stage=1}, + groups = {pickaxey=1, stone=1, stonebrick=1, building_block=1, material_stone=1}, sounds = mcl_sounds.node_sound_stone_defaults(), is_ground_content = false, _mcl_blast_resistance = 6, @@ -248,7 +248,7 @@ minetest.register_node("mcl_core:stonebrickcarved", { _doc_items_longdesc = doc.sub.items.temp.build, tiles = {"mcl_core_stonebrick_carved.png"}, stack_max = 64, - groups = {pickaxey=1, stone=1, stonebrick=1, building_block=1, material_stone=1, stonecutter_output=1, stonecutter_stage=1}, + groups = {pickaxey=1, stone=1, stonebrick=1, building_block=1, material_stone=1}, sounds = mcl_sounds.node_sound_stone_defaults(), is_ground_content = false, _mcl_blast_resistance = 6, @@ -272,7 +272,7 @@ minetest.register_node("mcl_core:stonebrickmossy", { _doc_items_longdesc = doc.sub.items.temp.build, tiles = {"mcl_core_stonebrick_mossy.png"}, stack_max = 64, - groups = {pickaxey=1, stone=1, stonebrick=1, building_block=1, material_stone=1, stonecuttable=3}, + groups = {pickaxey=1, stone=1, stonebrick=1, building_block=1, material_stone=1}, sounds = mcl_sounds.node_sound_stone_defaults(), is_ground_content = false, _mcl_blast_resistance = 6, @@ -284,7 +284,7 @@ minetest.register_node("mcl_core:stone_smooth", { _doc_items_longdesc = doc.sub.items.temp.build, tiles = {"mcl_stairs_stone_slab_top.png"}, stack_max = 64, - groups = {pickaxey=1, stone=1, building_block=1, material_stone=1, stonecuttable=1}, + groups = {pickaxey=1, stone=1, building_block=1, material_stone=1}, sounds = mcl_sounds.node_sound_stone_defaults(), is_ground_content = false, _mcl_blast_resistance = 6, @@ -297,7 +297,7 @@ minetest.register_node("mcl_core:granite", { tiles = {"mcl_core_granite.png"}, is_ground_content = true, stack_max = 64, - groups = {pickaxey=1, stone=1, building_block=1, material_stone=1, stonecuttable=4}, + groups = {pickaxey=1, stone=1, building_block=1, material_stone=1}, sounds = mcl_sounds.node_sound_stone_defaults(), _mcl_blast_resistance = 6, _mcl_hardness = 1.5, @@ -309,7 +309,7 @@ minetest.register_node("mcl_core:granite_smooth", { tiles = {"mcl_core_granite_smooth.png"}, stack_max = 64, is_ground_content = false, - groups = {pickaxey=1, stone=1, building_block=1, material_stone=1, stonecuttable=4, stonecutter_output=4, stonecutter_stage=1}, + groups = {pickaxey=1, stone=1, building_block=1, material_stone=1}, sounds = mcl_sounds.node_sound_stone_defaults(), _mcl_blast_resistance = 6, _mcl_hardness = 1.5, @@ -321,7 +321,7 @@ minetest.register_node("mcl_core:andesite", { tiles = {"mcl_core_andesite.png"}, is_ground_content = true, stack_max = 64, - groups = {pickaxey=1, stone=1, building_block=1, material_stone=1, stonecuttable=5,}, + groups = {pickaxey=1, stone=1, building_block=1, material_stone=1}, sounds = mcl_sounds.node_sound_stone_defaults(), _mcl_blast_resistance = 6, _mcl_hardness = 1.5, @@ -333,7 +333,7 @@ minetest.register_node("mcl_core:andesite_smooth", { tiles = {"mcl_core_andesite_smooth.png"}, is_ground_content = false, stack_max = 64, - groups = {pickaxey=1, stone=1, building_block=1, material_stone=1, stonecuttable=5, stonecutter_output=5, stonecutter_stage=1}, + groups = {pickaxey=1, stone=1, building_block=1, material_stone=1}, sounds = mcl_sounds.node_sound_stone_defaults(), _mcl_blast_resistance = 6, _mcl_hardness = 1.5, @@ -345,7 +345,7 @@ minetest.register_node("mcl_core:diorite", { tiles = {"mcl_core_diorite.png"}, is_ground_content = true, stack_max = 64, - groups = {pickaxey=1, stone=1, building_block=1, material_stone=1, stonecuttable=6}, + groups = {pickaxey=1, stone=1, building_block=1, material_stone=1}, sounds = mcl_sounds.node_sound_stone_defaults(), _mcl_blast_resistance = 6, _mcl_hardness = 1.5, @@ -357,7 +357,7 @@ minetest.register_node("mcl_core:diorite_smooth", { tiles = {"mcl_core_diorite_smooth.png"}, is_ground_content = false, stack_max = 64, - groups = {pickaxey=1, stone=1, building_block=1, material_stone=1, stonecuttable=6, stonecutter_output=6, stonecutter_stage=1}, + groups = {pickaxey=1, stone=1, building_block=1, material_stone=1}, sounds = mcl_sounds.node_sound_stone_defaults(), _mcl_blast_resistance = 6, _mcl_hardness = 1.5, @@ -586,7 +586,7 @@ minetest.register_node("mcl_core:sandstone", { tiles = {"mcl_core_sandstone_top.png", "mcl_core_sandstone_bottom.png", "mcl_core_sandstone_normal.png"}, is_ground_content = true, stack_max = 64, - groups = {pickaxey=1, sandstone=1, normal_sandstone=1, building_block=1, material_stone=1, stonecuttable=9}, + groups = {pickaxey=1, sandstone=1, normal_sandstone=1, building_block=1, material_stone=1}, sounds = mcl_sounds.node_sound_stone_defaults(), _mcl_blast_resistance = 0.8, _mcl_hardness = 0.8, @@ -598,7 +598,7 @@ minetest.register_node("mcl_core:sandstonesmooth", { tiles = {"mcl_core_sandstone_top.png", "mcl_core_sandstone_bottom.png", "mcl_core_sandstone_smooth.png"}, is_ground_content = false, stack_max = 64, - groups = {pickaxey=1, sandstone=1, normal_sandstone=1, building_block=1, material_stone=1, stonecuttable=9, stonecutter_output=9}, + groups = {pickaxey=1, sandstone=1, normal_sandstone=1, building_block=1, material_stone=1}, sounds = mcl_sounds.node_sound_stone_defaults(), _mcl_blast_resistance = 6, _mcl_hardness = 2, @@ -610,7 +610,7 @@ minetest.register_node("mcl_core:sandstonecarved", { tiles = {"mcl_core_sandstone_top.png", "mcl_core_sandstone_bottom.png", "mcl_core_sandstone_carved.png"}, is_ground_content = false, stack_max = 64, - groups = {pickaxey=1, sandstone=1, normal_sandstone=1, building_block=1, material_stone=1, stonecutter_output=9}, + groups = {pickaxey=1, sandstone=1, normal_sandstone=1, building_block=1, material_stone=1}, sounds = mcl_sounds.node_sound_stone_defaults(), _mcl_blast_resistance = 0.8, _mcl_hardness = 0.8, @@ -623,7 +623,7 @@ minetest.register_node("mcl_core:sandstonesmooth2", { tiles = {"mcl_core_sandstone_top.png"}, is_ground_content = false, stack_max = 64, - groups = {pickaxey=1, sandstone=1, normal_sandstone=1, building_block=1, material_stone=1, stonecuttable=9, stonecutter_output=9, stonecutter_stage=1}, + groups = {pickaxey=1, sandstone=1, normal_sandstone=1, building_block=1, material_stone=1}, sounds = mcl_sounds.node_sound_stone_defaults(), _mcl_blast_resistance = 6, _mcl_hardness = 2, @@ -649,7 +649,7 @@ minetest.register_node("mcl_core:redsandstone", { tiles = {"mcl_core_red_sandstone_top.png", "mcl_core_red_sandstone_bottom.png", "mcl_core_red_sandstone_normal.png"}, is_ground_content = true, stack_max = 64, - groups = {pickaxey=1, sandstone=1, red_sandstone=1, building_block=1, material_stone=1, stonecuttable=10}, + groups = {pickaxey=1, sandstone=1, red_sandstone=1, building_block=1, material_stone=1}, sounds = mcl_sounds.node_sound_stone_defaults(), _mcl_blast_resistance = 0.8, _mcl_hardness = 0.8, @@ -661,7 +661,7 @@ minetest.register_node("mcl_core:redsandstonesmooth", { tiles = {"mcl_core_red_sandstone_top.png", "mcl_core_red_sandstone_bottom.png", "mcl_core_red_sandstone_smooth.png"}, is_ground_content = false, stack_max = 64, - groups = {pickaxey=1, sandstone=1, red_sandstone=1, building_block=1, material_stone=1, stonecuttable=10, stonecutter_output=10}, + groups = {pickaxey=1, sandstone=1, red_sandstone=1, building_block=1, material_stone=1}, sounds = mcl_sounds.node_sound_stone_defaults(), _mcl_blast_resistance = 0.8, _mcl_hardness = 0.8, @@ -673,7 +673,7 @@ minetest.register_node("mcl_core:redsandstonecarved", { tiles = {"mcl_core_red_sandstone_top.png", "mcl_core_red_sandstone_bottom.png", "mcl_core_red_sandstone_carved.png"}, is_ground_content = false, stack_max = 64, - groups = {pickaxey=1, sandstone=1, red_sandstone=1, building_block=1, material_stone=1, stonecutter_output=10}, + groups = {pickaxey=1, sandstone=1, red_sandstone=1, building_block=1, material_stone=1}, sounds = mcl_sounds.node_sound_stone_defaults(), _mcl_blast_resistance = 0.8, _mcl_hardness = 0.8, @@ -685,7 +685,7 @@ minetest.register_node("mcl_core:redsandstonesmooth2", { tiles = {"mcl_core_red_sandstone_top.png"}, is_ground_content = false, stack_max = 64, - groups = {pickaxey=1, sandstone=1, red_sandstone=1, building_block=1, material_stone=1, stonecuttable=10, stonecutter_output=10, stonecutter_stage=1}, + groups = {pickaxey=1, sandstone=1, red_sandstone=1, building_block=1, material_stone=1}, sounds = mcl_sounds.node_sound_stone_defaults(), _mcl_blast_resistance = 0.8, _mcl_hardness = 0.8, @@ -715,7 +715,7 @@ minetest.register_node("mcl_core:brick_block", { tiles = {"default_brick.png"}, is_ground_content = false, stack_max = 64, - groups = {pickaxey=1, building_block=1, material_stone=1, stonecuttable=16}, + groups = {pickaxey=1, building_block=1, material_stone=1}, sounds = mcl_sounds.node_sound_stone_defaults(), _mcl_blast_resistance = 6, _mcl_hardness = 2, @@ -768,7 +768,7 @@ minetest.register_node("mcl_core:cobble", { tiles = {"default_cobble.png"}, is_ground_content = false, stack_max = 64, - groups = {pickaxey=1, building_block=1, material_stone=1, cobble=1, stonecuttable=7}, + groups = {pickaxey=1, building_block=1, material_stone=1, cobble=1}, sounds = mcl_sounds.node_sound_stone_defaults(), _mcl_blast_resistance = 6, _mcl_hardness = 2, @@ -780,7 +780,7 @@ minetest.register_node("mcl_core:mossycobble", { tiles = {"default_mossycobble.png"}, is_ground_content = false, stack_max = 64, - groups = {pickaxey=1, building_block=1, material_stone=1, stonecuttable=8}, + groups = {pickaxey=1, building_block=1, material_stone=1}, sounds = mcl_sounds.node_sound_stone_defaults(), _mcl_blast_resistance = 6, _mcl_hardness = 2, diff --git a/mods/ITEMS/mcl_end/building.lua b/mods/ITEMS/mcl_end/building.lua index fec0df475..7a3cdfd1d 100644 --- a/mods/ITEMS/mcl_end/building.lua +++ b/mods/ITEMS/mcl_end/building.lua @@ -13,7 +13,7 @@ minetest.register_node("mcl_end:end_stone", { _doc_items_longdesc = doc.sub.items.temp.build, tiles = {"mcl_end_end_stone.png"}, stack_max = 64, - groups = {pickaxey=1, building_block=1, material_stone=1, stonecuttable=20}, + groups = {pickaxey=1, building_block=1, material_stone=1}, sounds = mcl_sounds.node_sound_stone_defaults(), after_dig_node = mcl_end.check_detach_chorus_plant, _mcl_blast_resistance = 9, @@ -26,7 +26,7 @@ minetest.register_node("mcl_end:end_bricks", { tiles = {"mcl_end_end_bricks.png"}, is_ground_content = false, stack_max = 64, - groups = {pickaxey=1, building_block=1, material_stone=1, stonecuttable=20, stonecutter_output=20}, + groups = {pickaxey=1, building_block=1, material_stone=1}, sounds = mcl_sounds.node_sound_stone_defaults(), _mcl_blast_resistance = 9, _mcl_hardness = 3, @@ -38,7 +38,7 @@ minetest.register_node("mcl_end:purpur_block", { tiles = {"mcl_end_purpur_block.png"}, is_ground_content = false, stack_max = 64, - groups = {pickaxey=1, building_block=1, material_stone=1, purpur_block=1, stonecuttable=15}, + groups = {pickaxey=1, building_block=1, material_stone=1, purpur_block=1}, sounds = mcl_sounds.node_sound_stone_defaults(), _mcl_blast_resistance = 6, _mcl_hardness = 1.5, @@ -52,7 +52,7 @@ minetest.register_node("mcl_end:purpur_pillar", { is_ground_content = false, on_place = mcl_util.rotate_axis, tiles = {"mcl_end_purpur_pillar_top.png", "mcl_end_purpur_pillar_top.png", "mcl_end_purpur_pillar.png"}, - groups = {pickaxey=1, building_block=1, material_stone=1, purpur_block=1, stonecutter_output=15}, + groups = {pickaxey=1, building_block=1, material_stone=1, purpur_block=1}, sounds = mcl_sounds.node_sound_stone_defaults(), on_rotate = on_rotate, _mcl_blast_resistance = 6, diff --git a/mods/ITEMS/mcl_mud/init.lua b/mods/ITEMS/mcl_mud/init.lua index 5a99ff754..3c3e66a99 100644 --- a/mods/ITEMS/mcl_mud/init.lua +++ b/mods/ITEMS/mcl_mud/init.lua @@ -38,7 +38,7 @@ minetest.register_node("mcl_mud:mud_bricks", { _doc_items_longdesc = S("Decorative block crafted from packed mud."), _doc_items_hidden = false, tiles = {"mcl_mud_bricks.png"}, - groups = {handy=1, pickaxey=1, building_block=1, stonecuttable=30}, + groups = {handy=1, pickaxey=1, building_block=1}, sounds = mcl_sounds.node_sound_stone_defaults(), _mcl_blast_resistance = 3, _mcl_hardness = 1.5, @@ -62,4 +62,4 @@ minetest.register_craft({ {"mcl_mud:packed_mud", "mcl_mud:packed_mud"}, {"mcl_mud:packed_mud", "mcl_mud:packed_mud"} } -}) \ No newline at end of file +}) diff --git a/mods/ITEMS/mcl_nether/init.lua b/mods/ITEMS/mcl_nether/init.lua index 10a7b4dc5..252768df5 100644 --- a/mods/ITEMS/mcl_nether/init.lua +++ b/mods/ITEMS/mcl_nether/init.lua @@ -176,7 +176,7 @@ minetest.register_node("mcl_nether:nether_brick", { stack_max = 64, tiles = {"mcl_nether_nether_brick.png"}, is_ground_content = false, - groups = {pickaxey=1, building_block=1, material_stone=1, stonecuttable=17}, + groups = {pickaxey=1, building_block=1, material_stone=1}, sounds = mcl_sounds.node_sound_stone_defaults(), _mcl_blast_resistance = 6, _mcl_hardness = 2, @@ -189,7 +189,7 @@ minetest.register_node("mcl_nether:red_nether_brick", { stack_max = 64, tiles = {"mcl_nether_red_nether_brick.png"}, is_ground_content = false, - groups = {pickaxey=1, building_block=1, material_stone=1, stonecuttable=18}, + groups = {pickaxey=1, building_block=1, material_stone=1}, sounds = mcl_sounds.node_sound_stone_defaults(), _mcl_blast_resistance = 6, _mcl_hardness = 2, @@ -219,7 +219,7 @@ minetest.register_node("mcl_nether:quartz_block", { stack_max = 64, is_ground_content = false, tiles = {"mcl_nether_quartz_block_top.png", "mcl_nether_quartz_block_bottom.png", "mcl_nether_quartz_block_side.png"}, - groups = {pickaxey=1, quartz_block=1,building_block=1, material_stone=1, stonecuttable=14}, + groups = {pickaxey=1, quartz_block=1,building_block=1, material_stone=1}, sounds = mcl_sounds.node_sound_stone_defaults(), _mcl_blast_resistance = 0.8, _mcl_hardness = 0.8, @@ -231,7 +231,7 @@ minetest.register_node("mcl_nether:quartz_chiseled", { stack_max = 64, is_ground_content = false, tiles = {"mcl_nether_quartz_chiseled_top.png", "mcl_nether_quartz_chiseled_top.png", "mcl_nether_quartz_chiseled_side.png"}, - groups = {pickaxey=1, quartz_block=1,building_block=1, material_stone=1, stonecutter_output=14}, + groups = {pickaxey=1, quartz_block=1,building_block=1, material_stone=1}, sounds = mcl_sounds.node_sound_stone_defaults(), _mcl_blast_resistance = 0.8, _mcl_hardness = 0.8, @@ -245,7 +245,7 @@ minetest.register_node("mcl_nether:quartz_pillar", { is_ground_content = false, on_place = mcl_util.rotate_axis, tiles = {"mcl_nether_quartz_pillar_top.png", "mcl_nether_quartz_pillar_top.png", "mcl_nether_quartz_pillar_side.png"}, - groups = {pickaxey=1, quartz_block=1,building_block=1, material_stone=1, stonecutter_output=14}, + groups = {pickaxey=1, quartz_block=1,building_block=1, material_stone=1}, sounds = mcl_sounds.node_sound_stone_defaults(), on_rotate = on_rotate, _mcl_blast_resistance = 0.8, @@ -257,7 +257,7 @@ minetest.register_node("mcl_nether:quartz_smooth", { stack_max = 64, is_ground_content = false, tiles = {"mcl_nether_quartz_block_bottom.png"}, - groups = {pickaxey=1, quartz_block=1,building_block=1, material_stone=1, stonecuttable=31, stonecutter_output=31}, + groups = {pickaxey=1, quartz_block=1,building_block=1, material_stone=1}, sounds = mcl_sounds.node_sound_stone_defaults(), _mcl_blast_resistance = 0.8, _mcl_hardness = 0.8, diff --git a/mods/ITEMS/mcl_ocean/prismarine.lua b/mods/ITEMS/mcl_ocean/prismarine.lua index e1a0a3a98..fff07cb7e 100644 --- a/mods/ITEMS/mcl_ocean/prismarine.lua +++ b/mods/ITEMS/mcl_ocean/prismarine.lua @@ -38,7 +38,7 @@ minetest.register_node("mcl_ocean:prismarine", { is_ground_content = false, -- Texture should have 22 frames for smooth transitions. tiles = {{name="mcl_ocean_prismarine_anim.png", animation={type="vertical_frames", aspect_w=32, aspect_h=32, length=45.0}}}, - groups = {pickaxey=1, building_block=1, material_stone=1, stonecuttable=11}, + groups = {pickaxey=1, building_block=1, material_stone=1}, sounds = mcl_sounds.node_sound_stone_defaults(), _mcl_blast_resistance = 6, _mcl_hardness = 1.5, @@ -50,7 +50,7 @@ minetest.register_node("mcl_ocean:prismarine_brick", { stack_max = 64, is_ground_content = false, tiles = {"mcl_ocean_prismarine_bricks.png"}, - groups = {pickaxey=1, building_block=1, material_stone=1, stonecuttable=12}, + groups = {pickaxey=1, building_block=1, material_stone=1}, sounds = mcl_sounds.node_sound_stone_defaults(), _mcl_blast_resistance = 6, _mcl_hardness = 1.5, @@ -62,7 +62,7 @@ minetest.register_node("mcl_ocean:prismarine_dark", { stack_max = 64, is_ground_content = false, tiles = {"mcl_ocean_prismarine_dark.png"}, - groups = {pickaxey=1, building_block=1, material_stone=1, stonecuttable=13}, + groups = {pickaxey=1, building_block=1, material_stone=1}, sounds = mcl_sounds.node_sound_stone_defaults(), _mcl_blast_resistance = 6, _mcl_hardness = 1.5, diff --git a/mods/ITEMS/mcl_stairs/register.lua b/mods/ITEMS/mcl_stairs/register.lua index 228af97af..546be8112 100644 --- a/mods/ITEMS/mcl_stairs/register.lua +++ b/mods/ITEMS/mcl_stairs/register.lua @@ -32,141 +32,141 @@ end mcl_stairs.register_slab("stone_rough", "mcl_core:stone", - {pickaxey=1, material_stone=1, stonecutter_output=1}, + {pickaxey=1, material_stone=1}, {"default_stone.png"}, S("Stone Slab"), mcl_sounds.node_sound_stone_defaults(), 6, 2, S("Double Stone Slab")) mcl_stairs.register_stair("stone_rough", "mcl_core:stone", - {pickaxey=1, material_stone=1,stonecutter_output=1}, + {pickaxey=1, material_stone=1}, {"default_stone.png"}, S("Stone Stairs"), mcl_sounds.node_sound_stone_defaults(), 0.8, 0.8) mcl_stairs.register_slab("stone", "mcl_core:stone_smooth", - {pickaxey=1, material_stone=1, stonecutter_output=2}, + {pickaxey=1, material_stone=1}, {"mcl_stairs_stone_slab_top.png", "mcl_stairs_stone_slab_top.png", "mcl_stairs_stone_slab_side.png"}, S("Polished Stone Slab"), mcl_sounds.node_sound_stone_defaults(), 6, 2, S("Double Polished Stone Slab")) mcl_stairs.register_stair("andesite", "mcl_core:andesite", - {pickaxey=1, material_stone=1,stonecutter_output=5}, + {pickaxey=1, material_stone=1}, {"mcl_core_andesite.png"}, S("Andesite Stairs"), mcl_sounds.node_sound_stone_defaults(), 0.8, 0.8) mcl_stairs.register_slab("andesite", "mcl_core:andesite", - {pickaxey=1, material_stone=1, stonecutter_output=5}, + {pickaxey=1, material_stone=1}, {"mcl_core_andesite.png"}, S("Andesite Slab"), mcl_sounds.node_sound_stone_defaults(), 6, 2, S("Double Andesite Slab")) mcl_stairs.register_stair("granite", "mcl_core:granite", - {pickaxey=1, material_stone=1,stonecutter_output=4}, + {pickaxey=1, material_stone=1}, {"mcl_core_granite.png"}, S("Granite Stairs"), mcl_sounds.node_sound_stone_defaults(), 0.8, 0.8) mcl_stairs.register_slab("granite", "mcl_core:granite", - {pickaxey=1, material_stone=1, stonecutter_output=4}, + {pickaxey=1, material_stone=1}, {"mcl_core_granite.png"}, S("Granite Slab"), mcl_sounds.node_sound_stone_defaults(), 6, 2, S("Double Granite Slab")) mcl_stairs.register_stair("diorite", "mcl_core:diorite", - {pickaxey=1, material_stone=1,stonecutter_output=6}, + {pickaxey=1, material_stone=1}, {"mcl_core_diorite.png"}, S("Granite Stairs"), mcl_sounds.node_sound_stone_defaults(), 0.8, 0.8) mcl_stairs.register_slab("diorite", "mcl_core:diorite", - {pickaxey=1, material_stone=1, stonecutter_output=6}, + {pickaxey=1, material_stone=1}, {"mcl_core_diorite.png"}, S("Diorite Slab"), mcl_sounds.node_sound_stone_defaults(), 6, 2, S("Double Diorite Slab")) mcl_stairs.register_stair("cobble", "mcl_core:cobble", - {pickaxey=1, material_stone=1,stonecutter_output=7}, + {pickaxey=1, material_stone=1}, {"default_cobble.png"}, S("Cobblestone Stairs"), mcl_sounds.node_sound_stone_defaults(), 0.8, 0.8) mcl_stairs.register_slab("cobble", "mcl_core:cobble", - {pickaxey=1, material_stone=1, stonecutter_output=7}, + {pickaxey=1, material_stone=1}, {"default_cobble.png"}, S("Cobblestone Slab"), mcl_sounds.node_sound_stone_defaults(), 6, 2, S("Double Cobblestone Slab")) mcl_stairs.register_stair("mossycobble", "mcl_core:mossycobble", - {pickaxey=1, material_stone=1,stonecutter_output=8}, + {pickaxey=1, material_stone=1}, {"default_mossycobble.png"}, S("Mossy Cobblestone Stairs"), mcl_sounds.node_sound_stone_defaults(), 0.8, 0.8) mcl_stairs.register_slab("mossycobble", "mcl_core:mossycobble", - {pickaxey=1, material_stone=1, stonecutter_output=8}, + {pickaxey=1, material_stone=1}, {"default_mossycobble.png"}, S("Mossy Cobblestone Slab"), mcl_sounds.node_sound_stone_defaults(), 6, 2, S("Double Mossy Cobblestone Slab")) mcl_stairs.register_stair("brick_block", "mcl_core:brick_block", - {pickaxey=1, material_stone=1,stonecutter_output=16}, + {pickaxey=1, material_stone=1}, {"default_brick.png"}, S("Brick Stairs"), mcl_sounds.node_sound_stone_defaults(), 0.8, 0.8) mcl_stairs.register_slab("brick_block", "mcl_core:brick_block", - {pickaxey=1, material_stone=1, stonecutter_output=16}, + {pickaxey=1, material_stone=1}, {"default_brick.png"}, S("Brick Slab"), mcl_sounds.node_sound_stone_defaults(), 6, 2, S("Double Brick Slab")) mcl_stairs.register_stair("sandstone", "mcl_core:sandstone", - {pickaxey=1, material_stone=1, stonecutter_output=9}, + {pickaxey=1, material_stone=1}, {"mcl_core_sandstone_top.png", "mcl_core_sandstone_bottom.png", "mcl_core_sandstone_normal.png"}, S("Sandstone Stairs"), mcl_sounds.node_sound_stone_defaults(), 0.8, 0.8, nil, "mcl_core:sandstone") --fixme: extra parameter from previous release mcl_stairs.register_slab("sandstone", "mcl_core:sandstone", - {pickaxey=1, material_stone=1, stonecutter_output=9}, + {pickaxey=1, material_stone=1}, {"mcl_core_sandstone_top.png", "mcl_core_sandstone_bottom.png", "mcl_core_sandstone_normal.png"}, S("Sandstone Slab"), mcl_sounds.node_sound_stone_defaults(), 6, 2, S("Double Sandstone Slab"), "mcl_core:sandstone") --fixme: extra parameter from previous release mcl_stairs.register_stair("sandstonesmooth2", "mcl_core:sandstonesmooth2", - {pickaxey=1, material_stone=1, stonecutter_output=9, stonecutter_stage=1}, + {pickaxey=1, material_stone=1}, {"mcl_core_sandstone_top.png"}, S("Smooth Sandstone Stairs"), mcl_sounds.node_sound_stone_defaults(), 0.8, 0.8) mcl_stairs.register_slab("sandstonesmooth2", "mcl_core:sandstonesmooth2", - {pickaxey=1, material_stone=1, stonecutter_output=9, stonecutter_stage=1}, + {pickaxey=1, material_stone=1}, {"mcl_core_sandstone_top.png"}, S("Smooth Sandstone Slab"), mcl_sounds.node_sound_stone_defaults(), 6, 2, S("Double Smooth Sandstone Slab")) mcl_stairs.register_stair("redsandstone", "mcl_core:redsandstone", - {pickaxey=1, material_stone=1, stonecutter_output=10}, + {pickaxey=1, material_stone=1}, {"mcl_core_red_sandstone_top.png", "mcl_core_red_sandstone_bottom.png", "mcl_core_red_sandstone_normal.png"}, S("Red Sandstone Stairs"), mcl_sounds.node_sound_stone_defaults(), 0.8, 0.8, nil, "mcl_core:redsandstone") --fixme: extra parameter from previous release mcl_stairs.register_slab("redsandstone", "mcl_core:redsandstone", - {pickaxey=1, material_stone=1, stonecutter_output=10}, + {pickaxey=1, material_stone=1}, {"mcl_core_red_sandstone_top.png", "mcl_core_red_sandstone_bottom.png", "mcl_core_red_sandstone_normal.png"}, S("Red Sandstone Slab"), mcl_sounds.node_sound_stone_defaults(), 6, 2, S("Double Red Sandstone Slab"), "mcl_core:redsandstone") --fixme: extra parameter from previous release mcl_stairs.register_stair("redsandstonesmooth2", "mcl_core:redsandstonesmooth2", - {pickaxey=1, material_stone=1, stonecutter_output=10, stonecutter_stage=1}, + {pickaxey=1, material_stone=1}, {"mcl_core_red_sandstone_top.png"}, S("Smooth Red Sandstone Stairs"), mcl_sounds.node_sound_stone_defaults(), 0.8, 0.8) mcl_stairs.register_slab("redsandstonesmooth2", "mcl_core:redsandstonesmooth2", - {pickaxey=1, material_stone=1, stonecutter_output=10, stonecutter_stage=1}, + {pickaxey=1, material_stone=1}, {"mcl_core_red_sandstone_top.png"}, S("Smooth Red Sandstone Slab"), mcl_sounds.node_sound_stone_defaults(), 6, 2, @@ -174,52 +174,52 @@ mcl_stairs.register_slab("redsandstonesmooth2", "mcl_core:redsandstonesmooth2", -- Intentionally not group:stonebrick because of mclx_stairs mcl_stairs.register_stair("stonebrick", "mcl_core:stonebrick", - {pickaxey=1, material_stone=1, stonecutter_output=1, stonecutter_stage=1}, + {pickaxey=1, material_stone=1}, {"default_stone_brick.png"}, S("Stone Bricks Stairs"), mcl_sounds.node_sound_stone_defaults(), 6, 1.5, nil, "mcl_core:stonebrick") --fixme: extra parameter from previous release mcl_stairs.register_slab("stonebrick", "mcl_core:stonebrick", - {pickaxey=1, material_stone=1, stonecutter_output=1, stonecutter_stage=1}, + {pickaxey=1, material_stone=1}, {"default_stone_brick.png"}, S("Stone Bricks Slab"), mcl_sounds.node_sound_stone_defaults(), 6, 2, S("Double Stone Bricks Slab"), "mcl_core:stonebrick") --fixme: extra parameter from previous release mcl_stairs.register_stair("quartzblock", "mcl_nether:quartz_block", - {pickaxey=1, material_stone=1, stonecutter_output=14}, + {pickaxey=1, material_stone=1}, {"mcl_nether_quartz_block_top.png", "mcl_nether_quartz_block_bottom.png", "mcl_nether_quartz_block_side.png"}, S("Quartz Stairs"), mcl_sounds.node_sound_stone_defaults(), 0.8, 0.8, nil, "mcl_nether:quartz_block") --fixme: extra parameter from previous release mcl_stairs.register_slab("quartzblock", "mcl_nether:quartz_block", - {pickaxey=1, material_stone=1, stonecutter_output=14}, + {pickaxey=1, material_stone=1}, {"mcl_nether_quartz_block_top.png", "mcl_nether_quartz_block_bottom.png", "mcl_nether_quartz_block_side.png"}, S("Quartz Slab"), mcl_sounds.node_sound_stone_defaults(), 6, 2, S("Double Quartz Slab"), "mcl_nether:quartz_block") --fixme: extra parameter from previous release mcl_stairs.register_stair("quartz_smooth", "mcl_nether:quartz_smooth", - {pickaxey=1, material_stone=1, stonecutter_output=31}, + {pickaxey=1, material_stone=1}, {"mcl_nether_quartz_block_bottom.png"}, S("Smooth Quartz Stairs"), mcl_sounds.node_sound_stone_defaults(), 0.8, 0.8) mcl_stairs.register_slab("quartz_smooth", "mcl_nether:quartz_smooth", - {pickaxey=1, material_stone=1, stonecutter_output=31}, + {pickaxey=1, material_stone=1}, {"mcl_nether_quartz_block_bottom.png"}, S("Smooth Quartz Slab"), mcl_sounds.node_sound_stone_defaults(), 6, 2, S("Double Smooth Quartz Slab")) mcl_stairs.register_stair_and_slab("nether_brick", "mcl_nether:nether_brick", - {pickaxey=1, material_stone=1, stonecutter_output=17}, + {pickaxey=1, material_stone=1}, {"mcl_nether_nether_brick.png"}, S("Nether Brick Stairs"), S("Nether Brick Slab"), mcl_sounds.node_sound_stone_defaults(), 6, 2, S("Double Nether Brick Slab"), nil) mcl_stairs.register_stair_and_slab("red_nether_brick", "mcl_nether:red_nether_brick", - {pickaxey=1, material_stone=1, stonecutter_output=18}, + {pickaxey=1, material_stone=1}, {"mcl_nether_red_nether_brick.png"}, S("Red Nether Brick Stairs"), S("Red Nether Brick Slab"), @@ -227,7 +227,7 @@ mcl_stairs.register_stair_and_slab("red_nether_brick", "mcl_nether:red_nether_br S("Double Red Nether Brick Slab"), nil) mcl_stairs.register_stair_and_slab("end_bricks", "mcl_end:end_bricks", - {pickaxey=1, material_stone=1, stonecutter_output=20}, + {pickaxey=1, material_stone=1}, {"mcl_end_end_bricks.png"}, S("End Stone Brick Stairs"), S("End Stone Brick Slab"), @@ -235,59 +235,59 @@ mcl_stairs.register_stair_and_slab("end_bricks", "mcl_end:end_bricks", S("Double End Stone Brick Slab"), nil) mcl_stairs.register_stair("purpur_block", "mcl_end:purpur_block", - {pickaxey=1, material_stone=1, stonecutter_output=15}, + {pickaxey=1, material_stone=1}, {"mcl_end_purpur_block.png"}, S("Purpur Stairs"), mcl_sounds.node_sound_stone_defaults(), 6, 1.5, nil) mcl_stairs.register_slab("purpur_block", "mcl_end:purpur_block", - {pickaxey=1, material_stone=1, stonecutter_output=15}, + {pickaxey=1, material_stone=1}, {"mcl_end_purpur_block.png"}, S("Purpur Slab"), mcl_sounds.node_sound_stone_defaults(), 6, 2, S("Double Purpur Slab")) mcl_stairs.register_stair("prismarine", "mcl_ocean:prismarine", - {pickaxey=1, material_stone=1, stonecutter_output=11}, + {pickaxey=1, material_stone=1}, {{name="mcl_ocean_prismarine_anim.png", animation={type="vertical_frames", aspect_w=32, aspect_h=32, length=45.0}}}, S("Prismarine Stairs"), mcl_sounds.node_sound_stone_defaults(), 6, 1.5, nil) mcl_stairs.register_slab("prismarine", "mcl_ocean:prismarine", - {pickaxey=1, material_stone=1, stonecutter_output=11}, + {pickaxey=1, material_stone=1}, {{name="mcl_ocean_prismarine_anim.png", animation={type="vertical_frames", aspect_w=32, aspect_h=32, length=45.0}}}, S("Prismarine Slab"), mcl_sounds.node_sound_stone_defaults(), 6, 2, S("Double Prismarine Slab")) mcl_stairs.register_stair("prismarine_brick", "mcl_ocean:prismarine_brick", - {pickaxey=1, material_stone=1, stonecutter_output=12}, + {pickaxey=1, material_stone=1}, {"mcl_ocean_prismarine_bricks.png"}, S("prismarine Brick Stairs"), mcl_sounds.node_sound_stone_defaults(), 6, 1.5, nil) mcl_stairs.register_slab("prismarine_brick", "mcl_ocean:prismarine_brick", - {pickaxey=1, material_stone=1, stonecutter_output=12}, + {pickaxey=1, material_stone=1}, {"mcl_ocean_prismarine_bricks.png"}, S("prismarine Brick Slab"), mcl_sounds.node_sound_stone_defaults(), 6, 2, S("Double prismarine_brick Slab")) mcl_stairs.register_stair("prismarine_dark", "mcl_ocean:prismarine_dark", - {pickaxey=1, material_stone=1, stonecutter_output=13}, + {pickaxey=1, material_stone=1}, {"mcl_ocean_prismarine_dark.png"}, S("prismarine Brick Stairs"), mcl_sounds.node_sound_stone_defaults(), 6, 1.5, nil) mcl_stairs.register_slab("prismarine_dark", "mcl_ocean:prismarine_dark", - {pickaxey=1, material_stone=1, stonecutter_output=13}, + {pickaxey=1, material_stone=1}, {"mcl_ocean_prismarine_dark.png"}, S("Dark Prismarine Slab"), mcl_sounds.node_sound_stone_defaults(), 6, 2, S("Double Dark Prismarine Slab")) mcl_stairs.register_stair_and_slab("mud_brick", "mcl_mud:mud_bricks", - {pickaxey=1, material_stone=1, stonecutter_output=30}, + {pickaxey=1, material_stone=1}, {"mcl_mud_bricks.png"}, S("Mud Brick Stairs"), S("Mud Brick Slab"), @@ -295,53 +295,53 @@ mcl_stairs.register_stair_and_slab("mud_brick", "mcl_mud:mud_bricks", S("Double Mud Brick Slab"), nil) mcl_stairs.register_slab("andesite_smooth", "mcl_core:andesite_smooth", - {pickaxey=1, stonecutter_output=5, stonecutter_stage=1}, + {pickaxey=1}, {"mcl_core_andesite_smooth.png", "mcl_core_andesite_smooth.png", "mcl_stairs_andesite_smooth_slab.png"}, S("Polished Andesite Slab"), nil, 6, nil, S("Double Polished Andesite Slab")) mcl_stairs.register_stair("andesite_smooth", "mcl_core:andesite_smooth", - {pickaxey=1, stonecutter_output=5, stonecutter_stage=1}, + {pickaxey=1}, {"mcl_stairs_andesite_smooth_slab.png", "mcl_core_andesite_smooth.png", "mcl_core_andesite_smooth.png", "mcl_core_andesite_smooth.png", "mcl_core_andesite_smooth.png", "mcl_stairs_andesite_smooth_slab.png"}, S("Polished Andesite Stairs"), nil, 6, nil, "woodlike") mcl_stairs.register_slab("granite_smooth", "mcl_core:granite_smooth", - {pickaxey=1, stonecutter_output=4, stonecutter_stage=1}, + {pickaxey=1}, {"mcl_core_granite_smooth.png", "mcl_core_granite_smooth.png", "mcl_stairs_granite_smooth_slab.png"}, S("Polished Granite Slab"), nil, 6, nil, S("Double Polished Granite Slab")) mcl_stairs.register_stair("granite_smooth", "mcl_core:granite_smooth", - {pickaxey=1, stonecutter_output=4, stonecutter_stage=1}, + {pickaxey=1}, {"mcl_stairs_granite_smooth_slab.png", "mcl_core_granite_smooth.png", "mcl_core_granite_smooth.png", "mcl_core_granite_smooth.png", "mcl_core_granite_smooth.png", "mcl_stairs_granite_smooth_slab.png"}, S("Polished Granite Stairs"), nil, 6, nil, "woodlike") mcl_stairs.register_slab("diorite_smooth", "mcl_core:diorite_smooth", - {pickaxey=1, stonecutter_output=6, stonecutter_stage=1}, + {pickaxey=1}, {"mcl_core_diorite_smooth.png", "mcl_core_diorite_smooth.png", "mcl_stairs_diorite_smooth_slab.png"}, S("Polished Diorite Slab"), nil, 6, nil, S("Double Polished Diorite Slab")) mcl_stairs.register_stair("diorite_smooth", "mcl_core:diorite_smooth", - {pickaxey=1, stonecutter_output=6, stonecutter_stage=1}, + {pickaxey=1}, {"mcl_stairs_diorite_smooth_slab.png", "mcl_core_diorite_smooth.png", "mcl_core_diorite_smooth.png", "mcl_core_diorite_smooth.png", "mcl_core_diorite_smooth.png", "mcl_stairs_diorite_smooth_slab.png"}, S("Polished Diorite Stairs"), nil, 6, nil, "woodlike") mcl_stairs.register_stair("stonebrickmossy", "mcl_core:stonebrickmossy", - {pickaxey=1, stonecutter_output=3}, + {pickaxey=1}, {"mcl_core_stonebrick_mossy.png"}, S("Mossy Stone Brick Stairs"), mcl_sounds.node_sound_stone_defaults(), 6, 1.5, nil) mcl_stairs.register_slab("stonebrickmossy", "mcl_core:stonebrickmossy", - {pickaxey=1, stonecutter_output=3}, + {pickaxey=1}, {"mcl_core_stonebrick_mossy.png"}, S("Mossy Stone Brick Slab"), mcl_sounds.node_sound_stone_defaults(), 6, 2, diff --git a/mods/ITEMS/mcl_walls/register.lua b/mods/ITEMS/mcl_walls/register.lua index 2307f2bfe..c2859935e 100644 --- a/mods/ITEMS/mcl_walls/register.lua +++ b/mods/ITEMS/mcl_walls/register.lua @@ -1,17 +1,17 @@ local S = minetest.get_translator(minetest.get_current_modname()) -mcl_walls.register_wall("mcl_walls:cobble", S("Cobblestone Wall"), "mcl_core:cobble", {"mcl_walls_cobble_wall_top.png", "default_cobble.png", "mcl_walls_cobble_wall_side.png"}, "", {pickaxey=1, material_stone=1, stonecutter_output=7}) -mcl_walls.register_wall("mcl_walls:mossycobble", S("Mossy Cobblestone Wall"), "mcl_core:mossycobble", {"mcl_walls_cobble_mossy_wall_top.png", "default_mossycobble.png", "mcl_walls_cobble_mossy_wall_side.png"}, "", {pickaxey=1, material_stone=1, stonecutter_output=8}) -mcl_walls.register_wall("mcl_walls:andesite", S("Andesite Wall"), "mcl_core:andesite", {"mcl_core_andesite.png"}, "", {pickaxey=1, material_stone=1, stonecutter_output=5}) -mcl_walls.register_wall("mcl_walls:granite", S("Granite Wall"), "mcl_core:granite", {"mcl_core_granite.png"}, "", {pickaxey=1, material_stone=1, stonecutter_output=4}) -mcl_walls.register_wall("mcl_walls:diorite", S("Diorite Wall"), "mcl_core:diorite", {"mcl_core_diorite.png"}, "", {pickaxey=1, material_stone=1, stonecutter_output=6}) -mcl_walls.register_wall("mcl_walls:brick", S("Brick Wall"), "mcl_core:brick_block", {"default_brick.png"}, "", {pickaxey=1, material_stone=1, stonecutter_output=16}) -mcl_walls.register_wall("mcl_walls:sandstone", S("Sandstone Wall"), "mcl_core:sandstone", {"mcl_core_sandstone_top.png", "mcl_core_sandstone_bottom.png", "mcl_core_sandstone_normal.png"}, "", {pickaxey=1, material_stone=1, stonecutter_output=9}) -mcl_walls.register_wall("mcl_walls:redsandstone", S("Red Sandstone Wall"), "mcl_core:redsandstone", {"mcl_core_red_sandstone_top.png", "mcl_core_red_sandstone_bottom.png", "mcl_core_red_sandstone_carved.png"}, "", {pickaxey=1, material_stone=1, stonecutter_output=10}) -mcl_walls.register_wall("mcl_walls:stonebrick", S("Stone Brick Wall"), "mcl_core:stonebrick", {"default_stone_brick.png"}, "", {pickaxey=1, material_stone=1, stonecutter_output=1, stonecutter_stage=1}) -mcl_walls.register_wall("mcl_walls:stonebrickmossy", S("Mossy Stone Brick Wall"), "mcl_core:stonebrickmossy", {"mcl_core_stonebrick_mossy.png"}, "", {pickaxey=1, material_stone=1, stonecutter_output=3}) -mcl_walls.register_wall("mcl_walls:prismarine", S("Prismarine Wall"), "mcl_ocean:prismarine",{{name="mcl_ocean_prismarine_anim.png", animation={type="vertical_frames", aspect_w=32, aspect_h=32, length=45.0}}}, "", {pickaxey=1, material_stone=1, stonecutter_output=11}) -mcl_walls.register_wall("mcl_walls:endbricks", S("End Stone Brick Wall"), "mcl_end:end_bricks", {"mcl_end_end_bricks.png"}, "", {pickaxey=1, material_stone=1, stonecutter_output=20}) -mcl_walls.register_wall("mcl_walls:netherbrick", S("Nether Brick Wall"), "mcl_nether:nether_brick", {"mcl_nether_nether_brick.png"}, "", {pickaxey=1, material_stone=1, stonecutter_output=17}) -mcl_walls.register_wall("mcl_walls:rednetherbrick", S("Red Nether Brick Wall"), "mcl_nether:red_nether_brick", {"mcl_nether_red_nether_brick.png"}, "", {pickaxey=1, material_stone=1, stonecutter_output=18}) -mcl_walls.register_wall("mcl_walls:mudbrick", S("Mud Brick Wall"), "mcl_mud:mud_bricks", {"mcl_mud_bricks.png"}, "", {handy=1, pickaxey=1, material_stone=1, stonecutter_output=30}) \ No newline at end of file +mcl_walls.register_wall("mcl_walls:cobble", S("Cobblestone Wall"), "mcl_core:cobble", {"mcl_walls_cobble_wall_top.png", "default_cobble.png", "mcl_walls_cobble_wall_side.png"}) +mcl_walls.register_wall("mcl_walls:mossycobble", S("Mossy Cobblestone Wall"), "mcl_core:mossycobble", {"mcl_walls_cobble_mossy_wall_top.png", "default_mossycobble.png", "mcl_walls_cobble_mossy_wall_side.png"}) +mcl_walls.register_wall("mcl_walls:andesite", S("Andesite Wall"), "mcl_core:andesite") +mcl_walls.register_wall("mcl_walls:granite", S("Granite Wall"), "mcl_core:granite") +mcl_walls.register_wall("mcl_walls:diorite", S("Diorite Wall"), "mcl_core:diorite") +mcl_walls.register_wall("mcl_walls:brick", S("Brick Wall"), "mcl_core:brick_block") +mcl_walls.register_wall("mcl_walls:sandstone", S("Sandstone Wall"), "mcl_core:sandstone") +mcl_walls.register_wall("mcl_walls:redsandstone", S("Red Sandstone Wall"), "mcl_core:redsandstone") +mcl_walls.register_wall("mcl_walls:stonebrick", S("Stone Brick Wall"), "mcl_core:stonebrick") +mcl_walls.register_wall("mcl_walls:stonebrickmossy", S("Mossy Stone Brick Wall"), "mcl_core:stonebrickmossy") +mcl_walls.register_wall("mcl_walls:prismarine", S("Prismarine Wall"), "mcl_ocean:prismarine") +mcl_walls.register_wall("mcl_walls:endbricks", S("End Stone Brick Wall"), "mcl_end:end_bricks") +mcl_walls.register_wall("mcl_walls:netherbrick", S("Nether Brick Wall"), "mcl_nether:nether_brick") +mcl_walls.register_wall("mcl_walls:rednetherbrick", S("Red Nether Brick Wall"), "mcl_nether:red_nether_brick") +mcl_walls.register_wall("mcl_walls:mudbrick", S("Mud Brick Wall"), "mcl_mud:mud_bricks") From c183da7714e207409d38f42a86a46bf8a5458930 Mon Sep 17 00:00:00 2001 From: the-real-herowl Date: Mon, 13 Nov 2023 21:49:57 +0100 Subject: [PATCH 315/982] Updated README --- mods/ITEMS/mcl_stonecutter/README.md | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) diff --git a/mods/ITEMS/mcl_stonecutter/README.md b/mods/ITEMS/mcl_stonecutter/README.md index e5888ea0b..cd6b5a95a 100644 --- a/mods/ITEMS/mcl_stonecutter/README.md +++ b/mods/ITEMS/mcl_stonecutter/README.md @@ -4,17 +4,18 @@ Adds the stonecutter block. Used to cut stone like materials into stairs, slabs, ### Adding recipes -* To add a new compatible input the item needs to be in the group "stonecuttable". -* It's output item needs to be in the group "stonecutter_output". -* "stonecuttable" and "stonecutter_output" need to have the same number. -* Items like polished granite should only be able to make it's polished variants -while normal granite can make both. These inputs and outputs need to be in the group - "stonecutter_stage". +* To add a new custom stonecutter recipe, use `mcl_stonecutter.register_recipe(input, output, count)` +* `input` must be a name of a registered item +* `output` must also be a name of a registered item +* `count` should be a number denoting output count, this defaults to 1 for `nil` and invalid values + * a number with a fraction passed as count will be rounded down +* Stairs, slabs and walls get their recipes registered automatically +* Recipe chains are followed automatically, so any recipes taking `output` of another recipe as input will also be taking `input` of that recipe as their input License of code --------------- See the main MineClone 2 README.md file. -Author: PrairieWind, ChrisPHP, cora +Author: PrairieWind, ChrisPHP, cora, Herowl License of media ---------------- From 2128dd4c15bcd6d94e0f14a60e2be06c10c5a1f6 Mon Sep 17 00:00:00 2001 From: AFCMS Date: Sun, 19 Nov 2023 01:23:57 +0100 Subject: [PATCH 316/982] Add basic table ordered keys iterator --- mods/CORE/mcl_util/init.lua | 24 ++++++++++++++++++++++++ 1 file changed, 24 insertions(+) diff --git a/mods/CORE/mcl_util/init.lua b/mods/CORE/mcl_util/init.lua index e894eebd7..17c4bfc14 100644 --- a/mods/CORE/mcl_util/init.lua +++ b/mods/CORE/mcl_util/init.lua @@ -22,6 +22,30 @@ function table.update_nil(t, ...) return t end +---Works the same as `pairs`, but order returned by keys +--- +---Taken from https://www.lua.org/pil/19.3.html +---@generic T: table, K, V, C +---@param t T +---@param f? fun(a: C, b: C):boolean +---@return fun():K, V +function table.pairs_by_keys(t, f) + local a = {} + for n in pairs(t) do table.insert(a, n) end + table.sort(a, f) + + local i = 0 -- iterator variable + local function iter() -- iterator function + i = i + 1 + if a[i] == nil then + return nil + else + return a[i], t[a[i]] + end + end + return iter +end + local LOGGING_ON = minetest.settings:get_bool("mcl_logging_default", false) local LOG_MODULE = "[MCL2]" function mcl_util.mcl_log(message, module, bypass_default_logger) From a001f847861d913440604530d028dbf0a807f93b Mon Sep 17 00:00:00 2001 From: AFCMS Date: Sun, 19 Nov 2023 01:24:54 +0100 Subject: [PATCH 317/982] Add utility functions to clean inventory lists --- mods/CORE/mcl_util/init.lua | 50 +++++++++++++++++++++++++++++++++++++ 1 file changed, 50 insertions(+) diff --git a/mods/CORE/mcl_util/init.lua b/mods/CORE/mcl_util/init.lua index 17c4bfc14..ec50bc3fb 100644 --- a/mods/CORE/mcl_util/init.lua +++ b/mods/CORE/mcl_util/init.lua @@ -1137,3 +1137,53 @@ function mcl_util.get_colorwallmounted_rotation(pos) end end end + +---Move items from one inventory list to another, drop items that do not fit in provided pos and direction. +---@param src_inv mt.InvRef +---@param src_listname string +---@param out_inv mt.InvRef +---@param out_listname string +---@param pos mt.Vector Position to throw items at +---@param dir? mt.Vector Direction to throw items in +---@param insta_collect? boolean Enable instant collection, let players collect dropped items instantly. Default `false` +function mcl_util.move_list(src_inv, src_listname, out_inv, out_listname, pos, dir, insta_collect) + local src_list = src_inv:get_list(src_listname) + + if not src_list then return end + for i, stack in ipairs(src_list) do + if out_inv:room_for_item(out_listname, stack) then + out_inv:add_item(out_listname, stack) + else + local p = vector.copy(pos) + p.x = p.x + (math.random(1, 3) * 0.2) + p.z = p.z + (math.random(1, 3) * 0.2) + + local obj = minetest.add_item(p, stack) + if obj then + if dir then + local v = vector.copy(dir) + v.x = v.x * 4 + v.y = v.y * 4 + 2 + v.z = v.z * 4 + obj:set_velocity(v) + minetest.log("error", vector.to_string(v)) + end + if not insta_collect then + obj:get_luaentity()._insta_collect = false + end + end + end + + stack:clear() + src_inv:set_stack(src_listname, i, stack) + end +end + +---Move items from a player's inventory list to its main inventory list, drop items that do not fit in front of him. +---@param player mt.PlayerObjectRef +---@param src_listname string +function mcl_util.move_player_list(player, src_listname) + mcl_util.move_list(player:get_inventory(), src_listname, player:get_inventory(), "main", + vector.offset(player:get_pos(), 0, 1.2, 0), + player:get_look_dir(), false) +end From 4836418cf6d90b0b43d12a699703b8583414e017 Mon Sep 17 00:00:00 2001 From: AFCMS Date: Sun, 19 Nov 2023 01:42:12 +0100 Subject: [PATCH 318/982] Rework Stonecutter --- mods/ITEMS/mcl_stonecutter/README.md | 6 +- mods/ITEMS/mcl_stonecutter/init.lua | 466 ++++++++++++++++----------- mods/ITEMS/mcl_stonecutter/mod.conf | 2 +- 3 files changed, 284 insertions(+), 190 deletions(-) diff --git a/mods/ITEMS/mcl_stonecutter/README.md b/mods/ITEMS/mcl_stonecutter/README.md index cd6b5a95a..7fd31aa97 100644 --- a/mods/ITEMS/mcl_stonecutter/README.md +++ b/mods/ITEMS/mcl_stonecutter/README.md @@ -12,10 +12,14 @@ Adds the stonecutter block. Used to cut stone like materials into stairs, slabs, * Stairs, slabs and walls get their recipes registered automatically * Recipe chains are followed automatically, so any recipes taking `output` of another recipe as input will also be taking `input` of that recipe as their input +### Displaying the Stonecutter menu + +* To display the stonecutter formspec to a player use `mcl_stonecutter.show_stonecutter_form(player)` + License of code --------------- See the main MineClone 2 README.md file. -Author: PrairieWind, ChrisPHP, cora, Herowl +Author: PrairieWind, ChrisPHP, cora, Herowl, AFCMS License of media ---------------- diff --git a/mods/ITEMS/mcl_stonecutter/init.lua b/mods/ITEMS/mcl_stonecutter/init.lua index b32cf14fe..26ec0d419 100644 --- a/mods/ITEMS/mcl_stonecutter/init.lua +++ b/mods/ITEMS/mcl_stonecutter/init.lua @@ -2,35 +2,65 @@ --||||| STONECUTTER ||||| --||||||||||||||||||||||| +-- The stonecutter is implemented just like the crafting table, meaning the node doesn't have any state. +-- Instead it trigger the display of a per-player menu. The input and output slots, the wanted item are stored into the player meta. +-- +-- Player inventory lists: +-- * stonecutter_input (1) +-- * stonecutter_output (1) +-- Player meta: +-- * stonecutter_selected (string, wanted item name) + local S = minetest.get_translator("mcl_stonecutter") +local C = minetest.colorize +local show_formspec = minetest.show_formspec + +local formspec_name = "mcl_stonecutter:stonecutter" mcl_stonecutter = {} + + +---Table of registered recipes +--- +---```lua +---mcl_stonecutter.registered_recipes = { +--- ["mcl_core:input_item"] = { +--- ["mcl_core:output_item"] = 1, +--- ["mcl_core:output_item2"] = 2, +--- }, +---} +---``` +---@type table> mcl_stonecutter.registered_recipes = {} --- API --- input - string - name of a registered item --- output - string - name of a registered item --- count - int - number of the output - --- - defaults to 1 --- - non-int rounded down + +---Registers a recipe for the stonecutter +---@param input string Name of a registered item +---@param output string Name of a registered item +---@param count? integer Number of the output, defaults to `1` function mcl_stonecutter.register_recipe(input, output, count) - if mcl_stonecutter.registered_recipes[input] and mcl_stonecutter.registered_recipes[input][output] then return end + if mcl_stonecutter.registered_recipes[input] and mcl_stonecutter.registered_recipes[input][output] then + minetest.log("warning", + "[mcl_stonecutter] Recipe already registered: [" .. input .. "] -> [" .. output .. " " .. count .. "]") + return + end + if not minetest.registered_items[input] then - error("Input is not a registered item: ".. input) + error("Input is not a registered item: " .. input) end + if not minetest.registered_items[output] then - error("Output is not a registered item: ".. output) + error("Output is not a registered item: " .. output) end - local n = count - if type(count) ~= "number" then - n = 1 - end - n = math.floor(n) + + count = count or 1 + if not mcl_stonecutter.registered_recipes[input] then mcl_stonecutter.registered_recipes[input] = {} end - mcl_stonecutter.registered_recipes[input][output] = n + + mcl_stonecutter.registered_recipes[input][output] = count local fallthrough = mcl_stonecutter.registered_recipes[output] if fallthrough then @@ -42,88 +72,239 @@ function mcl_stonecutter.register_recipe(input, output, count) for i, recipes in pairs(mcl_stonecutter.registered_recipes) do for name, c in pairs(recipes) do if name == input then - mcl_stonecutter.register_recipe(i, output, c*n) + mcl_stonecutter.register_recipe(i, output, c * count) end end end end --- formspecs -local function show_stonecutter_formspec(items, input) - local cut_items = {} - local x_len = 0 - local y_len = 0.5 +---Minetest currently (5.7) doesn't prevent using `:` characters in field names +---But using them prevent the buttons from beeing styled with `style[]` elements +---https://github.com/minetest/minetest/issues/14013 - -- This loops through all the items that can be made and inserted into the formspec - if items ~= nil then - for name, count in pairs(items) do - x_len = x_len + 1 - if x_len > 5 then - y_len = y_len + 1 - x_len = 1 - end - table.insert(cut_items,string.format("item_image_button[%f,%f;%f,%f;%s;%s;%s]",x_len+1,y_len,1,1, name, name, tostring(count))) - end +---@param itemname string +local function itenname_to_fieldname(itemname) + return string.gsub(itemname, ":", "__") +end + +---@param fieldname string +local function fieldname_to_itemname(fieldname) + return string.gsub(fieldname, "__", ":") +end + +---Build the formspec for the stonecutter with given output button +---@param player mt.PlayerObjectRef +---@param items? table +local function build_stonecutter_formspec(player, items) + local meta = player:get_meta() + local selected = meta:get_string("stonecutter_selected") + + items = items or {} + + -- Buttons are 3.5 / 4 = 0.875 wide + local c = 0 + local items_content = "style_type[item_image_button;noclip=false;content_offset=0]" .. + (selected ~= "" and "style[" .. itenname_to_fieldname(selected) .. ";border=false;bgimg=mcl_inventory_button9_pressed.png;bgimg_pressed=mcl_inventory_button9_pressed.png;bgimg_middle=2,2]" or "") + + for name, count in table.pairs_by_keys(items) do + c = c + 1 + local x = ((c - 1) % 4) * 0.875 + local y = (math.floor((c - 1) / 4)) * 0.875 + + items_content = items_content .. + string.format("item_image_button[%f,%f;0.875,0.875;%s;%s;]", x, y, + name, itenname_to_fieldname(name), tostring(count)) end - local formspec = "size[9,8.75]".. - "label[0,4.0;"..minetest.formspec_escape(minetest.colorize("#313131", S("Inventory"))).."]".. - "label[1,0.1;"..minetest.formspec_escape(minetest.colorize("#313131", S("Stone Cutter"))).."]".. - "list[current_player;main;0,4.5;9,3;9]".. - mcl_formspec.get_itemslot_bg(0,4.5,9,3).. - "list[current_player;main;0,7.74;9,1;]".. - mcl_formspec.get_itemslot_bg(0,7.74,9,1).. - "list[context;input;0.5,1.7;1,1;]".. - mcl_formspec.get_itemslot_bg(0.5,1.7,1,1).. - "list[context;output;7.5,1.7;1,1;]".. - mcl_formspec.get_itemslot_bg(7.5,1.7,1,1).. - table.concat(cut_items).. - "listring[context;output]".. - "listring[current_player;main]".. - "listring[context;input]".. - "listring[current_player;main]" + local formspec = table.concat({ + "formspec_version[4]", + "size[11.75,10.425]", + "label[0.375,0.375;" .. C(mcl_formspec.label_color, S("Stone Cutter")) .. "]", + + -- Pattern input slot + mcl_formspec.get_itemslot_bg_v4(1.625, 2, 1, 1), + "list[current_player;stonecutter_input;1.625,2;1,1;]", + + -- Container background + "image[4.075,0.7;3.6,3.6;mcl_inventory_background9.png;2]", + + -- Style for item image buttons + "style_type[item_image_button;noclip=false;content_offset=0]", + + -- Scroll Container with buttons if needed + "scroll_container[4.125,0.75;3.5,3.5;scroll;vertical;0.875]", + items_content, + "scroll_container_end[]", + + -- Scrollbar + -- TODO: style the scrollbar correctly when possible + "scrollbaroptions[min=0;max=" .. + math.max(math.floor(#items / 4) + 1 - 4, 0) .. ";smallstep=1;largesteps=1]", + "scrollbar[7.625,0.7;0.75,3.6;vertical;scroll;0]", + + -- Output slot + mcl_formspec.get_itemslot_bg_v4(9.75, 2, 1, 1, 0.2), + "list[current_player;stonecutter_output;9.75,2;1,1;]", + + -- Player inventory + "label[0.375,4.7;" .. C(mcl_formspec.label_color, S("Inventory")) .. "]", + mcl_formspec.get_itemslot_bg_v4(0.375, 5.1, 9, 3), + "list[current_player;main;0.375,5.1;9,3;9]", + + mcl_formspec.get_itemslot_bg_v4(0.375, 9.05, 9, 1), + "list[current_player;main;0.375,9.05;9,1;]", + + "listring[current_player;stonecutter_output]", + "listring[current_player;main]", + "listring[current_player;stonecutter_input]", + "listring[current_player;main]", + }) return formspec end --- Updates the formspec -local function update_stonecutter_slots(pos, str) - local meta = minetest.get_meta(pos) - local inv = meta:get_inventory() - local input = inv:get_stack("input", 1) - local name = input:get_name() - local recipes = mcl_stonecutter.registered_recipes[name] + +---Display stonecutter menu to a player +---@param player mt.PlayerObjectRef +function mcl_stonecutter.show_stonecutter_form(player) + show_formspec(player:get_player_name(), formspec_name, + build_stonecutter_formspec(player, + mcl_stonecutter.registered_recipes[player:get_inventory():get_stack("stonecutter_input", 1):get_name()])) +end + +---Change the selected output item. +---@param player mt.PlayerObjectRef +---@param item_name? string The item name of the output +function set_selected_item(player, item_name) + player:get_meta():set_string("stonecutter_selected", item_name and item_name or "") +end + +minetest.register_on_joinplayer(function(player) + local inv = player:get_inventory() + + inv:set_size("stonecutter_input", 1) + inv:set_size("stonecutter_output", 1) + + set_selected_item(player, nil) + + --The player might have items remaining in the slots from the previous join; this is likely + --when the server has been shutdown and the server didn't clean up the player inventories. + mcl_util.move_player_list(player, "stonecutter_input") + mcl_util.move_player_list(player, "stonecutter_output") +end) + +minetest.register_on_leaveplayer(function(player) + set_selected_item(player, nil) + + mcl_util.move_player_list(player, "stonecutter_input") + mcl_util.move_player_list(player, "stonecutter_output") +end) + +---Update content of the stonecutter output slot with the input slot and the selected item +---@param player mt.PlayerObjectRef +function update_stonecutter_slots(player) + local meta = player:get_meta() + local inv = player:get_inventory() + + local input = inv:get_stack("stonecutter_input", 1) + local recipes = mcl_stonecutter.registered_recipes[input:get_name()] + local output_item = meta:get_string("stonecutter_selected") if recipes then - meta:set_string("formspec", show_stonecutter_formspec(recipes)) - if str then - local recipe = recipes[str] - if not recipe then return end - local cut_item = ItemStack(str) - cut_item:set_count(recipe) - inv:set_stack("output", 1, cut_item) + if output_item then + local recipe = recipes[output_item] + if recipe then + local cut_item = ItemStack(output_item) + cut_item:set_count(recipe) + inv:set_stack("stonecutter_output", 1, cut_item) + else + inv:set_stack("stonecutter_output", 1, nil) + end else - inv:set_stack("output", 1, "") + inv:set_stack("stonecutter_output", 1, nil) end else - meta:set_string("formspec", show_stonecutter_formspec(nil)) - inv:set_stack("output", 1, "") + inv:set_stack("stonecutter_output", 1, nil) + end + + mcl_stonecutter.show_stonecutter_form(player) +end + +--Drop items in slots and reset selected item on closing +minetest.register_on_player_receive_fields(function(player, formname, fields) + if formname ~= formspec_name then return end + + if fields.quit then + mcl_util.move_player_list(player, "stonecutter_input") + mcl_util.move_player_list(player, "stonecutter_output") + return + end + + for field_name, value in pairs(fields) do + if field_name ~= "scroll" then + local itemname = fieldname_to_itemname(field_name) + player:get_meta():set_string("stonecutter_selected", itemname) + set_selected_item(player, itemname) + update_stonecutter_slots(player) + mcl_stonecutter.show_stonecutter_form(player) + break + end + end +end) + + +minetest.register_allow_player_inventory_action(function(player, action, inventory, inventory_info) + if action == "move" then + if inventory_info.to_list == "stonecutter_output" then + return 0 + end + + if inventory_info.from_list == "stonecutter_output" and inventory_info.to_list == "stonecutter_input" then + if inventory:get_stack(inventory_info.to_list, inventory_info.to_index):is_empty() then + return inventory_info.count + else + return 0 + end + end + elseif action == "put" then + if inventory_info.to_list == "stonecutter_output" then + return 0 + end + end +end) + +function remove_from_input(player, inventory) + local meta = player:get_meta() + local selected = meta:get_string("stonecutter_selected") + local istack = inventory:get_stack("stonecutter_input", 1) + + -- selected should normally never be nil, but just in case + if selected then + istack:set_count(math.max(0, istack:get_count() - 1)) + inventory:set_stack("stonecutter_input", 1, istack) end end --- Only drop the items that were in the input slot -local function drop_stonecutter_items(pos, meta) - local meta = minetest.get_meta(pos) - local inv = meta:get_inventory() - for i=1, inv:get_size("input") do - local stack = inv:get_stack("input", i) - if not stack:is_empty() then - local p = {x=pos.x+math.random(0, 10)/10-0.5, y=pos.y, z=pos.z+math.random(0, 10)/10-0.5} - minetest.add_item(p, stack) --- inv:set_stack("input", i, ItemStack()) +minetest.register_on_player_inventory_action(function(player, action, inventory, inventory_info) + if action == "move" then + if inventory_info.to_list == "stonecutter_input" or inventory_info.from_list == "stonecutter_input" then + update_stonecutter_slots(player) + return + elseif inventory_info.from_list == "stonecutter_output" then + remove_from_input(player, inventory) + update_stonecutter_slots(player) + end + elseif action == "put" then + if inventory_info.listname == "stonecutter_input" or inventory_info.listname == "stonecutter_input" then + update_stonecutter_slots(player) + end + elseif action == "take" then + if inventory_info.listname == "stonecutter_output" then + remove_from_input(player, inventory) + update_stonecutter_slots(player) end end -end +end) minetest.register_node("mcl_stonecutter:stonecutter", { description = S("Stone Cutter"), @@ -134,134 +315,43 @@ minetest.register_node("mcl_stonecutter:stonecutter", { "mcl_stonecutter_bottom.png", "mcl_stonecutter_side.png", "mcl_stonecutter_side.png", - {name="mcl_stonecutter_saw.png", - animation={ - type="vertical_frames", - aspect_w=16, - aspect_h=16, - length=1 - }}, - {name="mcl_stonecutter_saw.png", - animation={ - type="vertical_frames", - aspect_w=16, - aspect_h=16, - length=1 - }} + { + name = "mcl_stonecutter_saw.png", + animation = { + type = "vertical_frames", + aspect_w = 16, + aspect_h = 16, + length = 1 + } + }, + { + name = "mcl_stonecutter_saw.png", + animation = { + type = "vertical_frames", + aspect_w = 16, + aspect_h = 16, + length = 1 + } + } }, use_texture_alpha = "clip", drawtype = "nodebox", paramtype = "light", paramtype2 = "facedir", - groups = { pickaxey=1, material_stone=1 }, + groups = { pickaxey = 1, material_stone = 1 }, node_box = { type = "fixed", fixed = { - {-0.5, -0.5, -0.5, 0.5, 0.0625, 0.5}, -- NodeBox1 - {-0.4375, 0.0625, 0, 0.4375, 0.5, 0}, -- NodeBox2 + { -0.5, -0.5, -0.5, 0.5, 0.0625, 0.5 }, -- NodeBox1 + { -0.4375, 0.0625, 0, 0.4375, 0.5, 0 }, -- NodeBox2 } }, _mcl_blast_resistance = 3.5, _mcl_hardness = 3.5, sounds = mcl_sounds.node_sound_stone_defaults(), - on_destruct = drop_stonecutter_items, - allow_metadata_inventory_take = function(pos, listname, index, stack, player) - local name = player:get_player_name() - if minetest.is_protected(pos, name) then - minetest.record_protection_violation(pos, name) - return 0 - else - return stack:get_count() - end - end, - allow_metadata_inventory_move = function(pos, from_list, from_index, to_list, to_index, count, player) - local name = player:get_player_name() - if minetest.is_protected(pos, name) then - minetest.record_protection_violation(pos, name) - return 0 - elseif to_list == "output" then - return 0 - elseif from_list == "output" and to_list == "input" then - local meta = minetest.get_meta(pos) - local inv = meta:get_inventory() - if inv:get_stack(to_list, to_index):is_empty() then - return count - else - return 0 - end - else - return count - end - end, - on_metadata_inventory_move = function(pos, from_list, from_index, to_list, to_index, count, player) - local meta = minetest.get_meta(pos) - if from_list == "output" and to_list == "input" then - local inv = meta:get_inventory() - for i=1, inv:get_size("input") do - if i ~= to_index then - local istack = inv:get_stack("input", i) - istack:set_count(math.max(0, istack:get_count() - count)) - inv:set_stack("input", i, istack) - end - end - end - update_stonecutter_slots(pos) - end, - allow_metadata_inventory_put = function(pos, listname, index, stack, player) - local name = player:get_player_name() - if minetest.is_protected(pos, name) then - minetest.record_protection_violation(pos, name) - return 0 - elseif listname == "output" then - return 0 - else - return stack:get_count() - end - end, - on_metadata_inventory_put = function(pos, listname, index, stack, player) - update_stonecutter_slots(pos) - end, - on_metadata_inventory_take = function(pos, listname, index, stack, player) - local meta = minetest.get_meta(pos) - if listname == "output" then - local inv = meta:get_inventory() - local input = inv:get_stack("input", 1) - input:take_item() - inv:set_stack("input", 1, input) - if input:get_count() == 0 then - meta:set_string("cut_stone", nil) - end - else - meta:set_string("cut_stone", nil) - end - update_stonecutter_slots(pos) - end, - on_construct = function(pos) - local meta = minetest.get_meta(pos) - local inv = meta:get_inventory() - inv:set_size("input", 1) - inv:set_size("output", 1) - local form = show_stonecutter_formspec() - meta:set_string("formspec", form) - end, on_rightclick = function(pos, node, player, itemstack) if not player:get_player_control().sneak then - update_stonecutter_slots(pos) - end - end, - on_receive_fields = function(pos, formname, fields, sender) - local sender_name = sender:get_player_name() - if minetest.is_protected(pos, sender_name) then - minetest.record_protection_violation(pos, sender_name) - return - end - if fields then - for field_name, value in pairs(fields) do - local item_name = tostring(field_name) - if item_name then - update_stonecutter_slots(pos, item_name) - end - end + mcl_stonecutter.show_stonecutter_form(player) end end, }) diff --git a/mods/ITEMS/mcl_stonecutter/mod.conf b/mods/ITEMS/mcl_stonecutter/mod.conf index d9781e474..cc36848e5 100644 --- a/mods/ITEMS/mcl_stonecutter/mod.conf +++ b/mods/ITEMS/mcl_stonecutter/mod.conf @@ -1,4 +1,4 @@ name = mcl_stonecutter author = PrairieWind description = This mod adds a stonecutter, which is used to cut stone like materials, and used as the jobsite for the Stone Mason Villager. -depends = mcl_sounds +depends = mcl_sounds, mcl_util From e324a1a74b30a771ffefdb13399629bd42450dc0 Mon Sep 17 00:00:00 2001 From: AFCMS Date: Wed, 22 Nov 2023 09:11:50 +0100 Subject: [PATCH 319/982] Make inventory use the util functions --- mods/HUD/mcl_inventory/init.lua | 68 +++++---------------------------- 1 file changed, 9 insertions(+), 59 deletions(-) diff --git a/mods/HUD/mcl_inventory/init.lua b/mods/HUD/mcl_inventory/init.lua index cf484101c..c2555581c 100644 --- a/mods/HUD/mcl_inventory/init.lua +++ b/mods/HUD/mcl_inventory/init.lua @@ -3,56 +3,6 @@ mcl_inventory = {} dofile(minetest.get_modpath(minetest.get_current_modname()) .. "/creative.lua") dofile(minetest.get_modpath(minetest.get_current_modname()) .. "/survival.lua") ---local mod_player = minetest.get_modpath("mcl_player") ---local mod_craftguide = minetest.get_modpath("mcl_craftguide") - ----Returns a single itemstack in the given inventory to the main inventory, or drop it when there's no space left. ----@param itemstack mt.ItemStack ----@param dropper mt.ObjectRef ----@param pos mt.Vector ----@param inv mt.InvRef -local function return_item(itemstack, dropper, pos, inv) - if dropper:is_player() then - -- Return to main inventory - if inv:room_for_item("main", itemstack) then - inv:add_item("main", itemstack) - else - -- Drop item on the ground - local v = dropper:get_look_dir() - local p = vector.offset(pos, 0, 1.2, 0) - p.x = p.x + (math.random(1, 3) * 0.2) - p.z = p.z + (math.random(1, 3) * 0.2) - local obj = minetest.add_item(p, itemstack) - if obj then - v.x = v.x * 4 - v.y = v.y * 4 + 2 - v.z = v.z * 4 - obj:set_velocity(v) - obj:get_luaentity()._insta_collect = false - end - end - else - -- Fallback for unexpected cases - minetest.add_item(pos, itemstack) - end - return itemstack -end - ----Return items in the given inventory list (name) to the main inventory, or drop them if there is no space left. ----@param player mt.PlayerObjectRef ----@param name string -local function return_fields(player, name) - local inv = player:get_inventory() - - local list = inv:get_list(name) - if not list then return end - for i, stack in ipairs(list) do - return_item(stack, player, player:get_pos(), inv) - stack:clear() - inv:set_stack(name, i, stack) - end -end - ---@param player mt.PlayerObjectRef ---@param armor_change_only? boolean local function set_inventory(player, armor_change_only) @@ -72,9 +22,9 @@ end -- Drop items in craft grid and reset inventory on closing minetest.register_on_player_receive_fields(function(player, formname, fields) if fields.quit then - return_fields(player, "craft") - return_fields(player, "enchanting_lapis") - return_fields(player, "enchanting_item") + mcl_util.move_player_list(player, "craft") + mcl_util.move_player_list(player, "enchanting_lapis") + mcl_util.move_player_list(player, "enchanting_item") if not minetest.is_creative_enabled(player:get_player_name()) and (formname == "" or formname == "main") then set_inventory(player) end @@ -88,9 +38,9 @@ end -- Drop crafting grid items on leaving minetest.register_on_leaveplayer(function(player) - return_fields(player, "craft") - return_fields(player, "enchanting_lapis") - return_fields(player, "enchanting_item") + mcl_util.move_player_list(player, "craft") + mcl_util.move_player_list(player, "enchanting_lapis") + mcl_util.move_player_list(player, "enchanting_item") end) minetest.register_on_joinplayer(function(player) @@ -116,9 +66,9 @@ minetest.register_on_joinplayer(function(player) items remaining in the crafting grid from the previous join; this is likely when the server has been shutdown and the server didn't clean up the player inventories. ]] - return_fields(player, "craft") - return_fields(player, "enchanting_item") - return_fields(player, "enchanting_lapis") + mcl_util.move_player_list(player, "craft") + mcl_util.move_player_list(player, "enchanting_lapis") + mcl_util.move_player_list(player, "enchanting_item") end) ---@param player mt.PlayerObjectRef From af2f58248f26aabeb7ae5afa3e6a5ea488822cc7 Mon Sep 17 00:00:00 2001 From: the-real-herowl Date: Thu, 23 Nov 2023 03:14:22 +0100 Subject: [PATCH 320/982] Added the ability to stonecut up to full stack --- mods/ITEMS/mcl_stonecutter/init.lua | 44 +++++++++++++++++++++++++++-- 1 file changed, 41 insertions(+), 3 deletions(-) diff --git a/mods/ITEMS/mcl_stonecutter/init.lua b/mods/ITEMS/mcl_stonecutter/init.lua index 26ec0d419..02dc02925 100644 --- a/mods/ITEMS/mcl_stonecutter/init.lua +++ b/mods/ITEMS/mcl_stonecutter/init.lua @@ -92,6 +92,20 @@ local function fieldname_to_itemname(fieldname) return string.gsub(fieldname, "__", ":") end +-- Get the player configured stack size when taking items from creative inventory +---@param player mt.PlayerObjectRef +---@return integer +local function get_stack_size(player) + return player:get_meta():get_int("mcl_stonecutter:switch_stack") +end + +-- Set the player configured stack size when taking items from creative inventory +---@param player mt.PlayerObjectRef +---@param n integer +local function set_stack_size(player, n) + player:get_meta():set_int("mcl_stonecutter:switch_stack", n) +end + ---Build the formspec for the stonecutter with given output button ---@param player mt.PlayerObjectRef ---@param items? table @@ -142,6 +156,11 @@ local function build_stonecutter_formspec(player, items) math.max(math.floor(#items / 4) + 1 - 4, 0) .. ";smallstep=1;largesteps=1]", "scrollbar[7.625,0.7;0.75,3.6;vertical;scroll;0]", + -- Switch stack size button + "image_button[9.75,0.75;1,1;mcl_stonecutter_saw.png^[verticalframe:3:1;__switch_stack;]", + "label[10.25,1.5;" .. C("#FFFFFF", tostring(get_stack_size(player))) .. "]", + "tooltip[__switch_stack;" .. S("Switch stack size") .. "]", + -- Output slot mcl_formspec.get_itemslot_bg_v4(9.75, 2, 1, 1, 0.2), "list[current_player;stonecutter_output;9.75,2;1,1;]", @@ -209,13 +228,16 @@ function update_stonecutter_slots(player) local input = inv:get_stack("stonecutter_input", 1) local recipes = mcl_stonecutter.registered_recipes[input:get_name()] local output_item = meta:get_string("stonecutter_selected") + local stack_size = meta:get_int("mcl_stonecutter:switch_stack") if recipes then if output_item then local recipe = recipes[output_item] if recipe then local cut_item = ItemStack(output_item) - cut_item:set_count(recipe) + local count = math.min(math.floor(stack_size/recipe), input:get_count()) * recipe + if count < recipe then count = recipe end + cut_item:set_count(count) inv:set_stack("stonecutter_output", 1, cut_item) else inv:set_stack("stonecutter_output", 1, nil) @@ -240,6 +262,17 @@ minetest.register_on_player_receive_fields(function(player, formname, fields) return end + if fields.__switch_stack then + local switch = 1 + if get_stack_size(player) == 1 then + switch = 64 + end + set_stack_size(player, switch) + update_stonecutter_slots(player) + mcl_stonecutter.show_stonecutter_form(player) + return + end + for field_name, value in pairs(fields) do if field_name ~= "scroll" then local itemname = fieldname_to_itemname(field_name) @@ -277,10 +310,15 @@ function remove_from_input(player, inventory) local meta = player:get_meta() local selected = meta:get_string("stonecutter_selected") local istack = inventory:get_stack("stonecutter_input", 1) + local recipes = mcl_stonecutter.registered_recipes[istack:get_name()] + local stack_size = meta:get_int("mcl_stonecutter:switch_stack") -- selected should normally never be nil, but just in case - if selected then - istack:set_count(math.max(0, istack:get_count() - 1)) + if selected and recipes then + local recipe = recipes[selected] + local count = math.floor(stack_size/recipe) + if count < 1 then count = 1 end + istack:set_count(math.max(0, istack:get_count() - count)) inventory:set_stack("stonecutter_input", 1, istack) end end From a6025b751a476e3a6b829d8eff394fddfee244a3 Mon Sep 17 00:00:00 2001 From: the-real-herowl Date: Thu, 23 Nov 2023 03:42:49 +0100 Subject: [PATCH 321/982] Uneven crafts support -taking part of the resulting stack now produces well-defined results -stonecutter won't allow amount undivisible by recipe count anymore --- mods/ITEMS/mcl_stonecutter/init.lua | 31 +++++++++++++++++++++++++---- 1 file changed, 27 insertions(+), 4 deletions(-) diff --git a/mods/ITEMS/mcl_stonecutter/init.lua b/mods/ITEMS/mcl_stonecutter/init.lua index 02dc02925..8e33470de 100644 --- a/mods/ITEMS/mcl_stonecutter/init.lua +++ b/mods/ITEMS/mcl_stonecutter/init.lua @@ -299,14 +299,37 @@ minetest.register_allow_player_inventory_action(function(player, action, invento return 0 end end + + if inventory_info.from_list == "stonecutter_output" then + local selected = player:get_meta():get_string("stonecutter_selected") + local istack = inventory:get_stack("stonecutter_input", 1) + local recipes = mcl_stonecutter.registered_recipes[istack:get_name()] + if not selected or not recipes then return 0 end + local recipe = recipes[selected] + local remainder = inventory_info.count % recipe + if remainder ~= 0 then + return 0 + end + end elseif action == "put" then if inventory_info.to_list == "stonecutter_output" then return 0 end + if inventory_info.from_list == "stonecutter_output" then + local selected = player:get_meta():get_string("stonecutter_selected") + local istack = inventory:get_stack("stonecutter_input", 1) + local recipes = mcl_stonecutter.registered_recipes[istack:get_name()] + if not selected or not recipes then return 0 end + local recipe = recipes[selected] + local remainder = inventory_info.stack:get_count() % recipe + if remainder ~= 0 then + return 0 + end + end end end) -function remove_from_input(player, inventory) +function remove_from_input(player, inventory, crafted_count) local meta = player:get_meta() local selected = meta:get_string("stonecutter_selected") local istack = inventory:get_stack("stonecutter_input", 1) @@ -316,7 +339,7 @@ function remove_from_input(player, inventory) -- selected should normally never be nil, but just in case if selected and recipes then local recipe = recipes[selected] - local count = math.floor(stack_size/recipe) + local count = crafted_count/recipe if count < 1 then count = 1 end istack:set_count(math.max(0, istack:get_count() - count)) inventory:set_stack("stonecutter_input", 1, istack) @@ -329,7 +352,7 @@ minetest.register_on_player_inventory_action(function(player, action, inventory, update_stonecutter_slots(player) return elseif inventory_info.from_list == "stonecutter_output" then - remove_from_input(player, inventory) + remove_from_input(player, inventory, inventory_info.count) update_stonecutter_slots(player) end elseif action == "put" then @@ -338,7 +361,7 @@ minetest.register_on_player_inventory_action(function(player, action, inventory, end elseif action == "take" then if inventory_info.listname == "stonecutter_output" then - remove_from_input(player, inventory) + remove_from_input(player, inventory, inventory_info.stack:get_count()) update_stonecutter_slots(player) end end From bb48e474881c152d38e652eb19f04282a9329c12 Mon Sep 17 00:00:00 2001 From: the-real-herowl Date: Fri, 24 Nov 2023 01:33:32 +0100 Subject: [PATCH 322/982] Made stonecutter player metadata consistent --- mods/ITEMS/mcl_stonecutter/init.lua | 17 +++++++++-------- 1 file changed, 9 insertions(+), 8 deletions(-) diff --git a/mods/ITEMS/mcl_stonecutter/init.lua b/mods/ITEMS/mcl_stonecutter/init.lua index 8e33470de..e715d8519 100644 --- a/mods/ITEMS/mcl_stonecutter/init.lua +++ b/mods/ITEMS/mcl_stonecutter/init.lua @@ -9,7 +9,8 @@ -- * stonecutter_input (1) -- * stonecutter_output (1) -- Player meta: --- * stonecutter_selected (string, wanted item name) +-- * mcl_stonecutter:selected (string, wanted item name) +-- * mcl_stonecutter:switch_stack (int, wanted craft count: 1 or 64 = once or until full stack) local S = minetest.get_translator("mcl_stonecutter") @@ -111,7 +112,7 @@ end ---@param items? table local function build_stonecutter_formspec(player, items) local meta = player:get_meta() - local selected = meta:get_string("stonecutter_selected") + local selected = meta:get_string("mcl_stonecutter:selected") items = items or {} @@ -195,7 +196,7 @@ end ---@param player mt.PlayerObjectRef ---@param item_name? string The item name of the output function set_selected_item(player, item_name) - player:get_meta():set_string("stonecutter_selected", item_name and item_name or "") + player:get_meta():set_string("mcl_stonecutter:selected", item_name and item_name or "") end minetest.register_on_joinplayer(function(player) @@ -227,7 +228,7 @@ function update_stonecutter_slots(player) local input = inv:get_stack("stonecutter_input", 1) local recipes = mcl_stonecutter.registered_recipes[input:get_name()] - local output_item = meta:get_string("stonecutter_selected") + local output_item = meta:get_string("mcl_stonecutter:selected") local stack_size = meta:get_int("mcl_stonecutter:switch_stack") if recipes then @@ -276,7 +277,7 @@ minetest.register_on_player_receive_fields(function(player, formname, fields) for field_name, value in pairs(fields) do if field_name ~= "scroll" then local itemname = fieldname_to_itemname(field_name) - player:get_meta():set_string("stonecutter_selected", itemname) + player:get_meta():set_string("mcl_stonecutter:selected", itemname) set_selected_item(player, itemname) update_stonecutter_slots(player) mcl_stonecutter.show_stonecutter_form(player) @@ -301,7 +302,7 @@ minetest.register_allow_player_inventory_action(function(player, action, invento end if inventory_info.from_list == "stonecutter_output" then - local selected = player:get_meta():get_string("stonecutter_selected") + local selected = player:get_meta():get_string("mcl_stonecutter:selected") local istack = inventory:get_stack("stonecutter_input", 1) local recipes = mcl_stonecutter.registered_recipes[istack:get_name()] if not selected or not recipes then return 0 end @@ -316,7 +317,7 @@ minetest.register_allow_player_inventory_action(function(player, action, invento return 0 end if inventory_info.from_list == "stonecutter_output" then - local selected = player:get_meta():get_string("stonecutter_selected") + local selected = player:get_meta():get_string("mcl_stonecutter:selected") local istack = inventory:get_stack("stonecutter_input", 1) local recipes = mcl_stonecutter.registered_recipes[istack:get_name()] if not selected or not recipes then return 0 end @@ -331,7 +332,7 @@ end) function remove_from_input(player, inventory, crafted_count) local meta = player:get_meta() - local selected = meta:get_string("stonecutter_selected") + local selected = meta:get_string("mcl_stonecutter:selected") local istack = inventory:get_stack("stonecutter_input", 1) local recipes = mcl_stonecutter.registered_recipes[istack:get_name()] local stack_size = meta:get_int("mcl_stonecutter:switch_stack") From b4080b62753ae2cd07d3bee72a0a20721ccf6dd1 Mon Sep 17 00:00:00 2001 From: the-real-herowl Date: Sat, 25 Nov 2023 01:04:53 +0100 Subject: [PATCH 323/982] Credits update in mod.conf --- mods/ITEMS/mcl_stonecutter/mod.conf | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mods/ITEMS/mcl_stonecutter/mod.conf b/mods/ITEMS/mcl_stonecutter/mod.conf index cc36848e5..01cf2a75f 100644 --- a/mods/ITEMS/mcl_stonecutter/mod.conf +++ b/mods/ITEMS/mcl_stonecutter/mod.conf @@ -1,4 +1,4 @@ name = mcl_stonecutter -author = PrairieWind +author = PrairieWind, ChrisPHP, cora, Herowl, AFCMS description = This mod adds a stonecutter, which is used to cut stone like materials, and used as the jobsite for the Stone Mason Villager. depends = mcl_sounds, mcl_util From f1c5f0ca1c6b2862acb394ad4672f37f1f7f1e75 Mon Sep 17 00:00:00 2001 From: the-real-herowl Date: Sun, 26 Nov 2023 00:39:55 +0100 Subject: [PATCH 324/982] Fixed duplication bug --- mods/ITEMS/mcl_stonecutter/init.lua | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/mods/ITEMS/mcl_stonecutter/init.lua b/mods/ITEMS/mcl_stonecutter/init.lua index e715d8519..5605db659 100644 --- a/mods/ITEMS/mcl_stonecutter/init.lua +++ b/mods/ITEMS/mcl_stonecutter/init.lua @@ -210,14 +210,14 @@ minetest.register_on_joinplayer(function(player) --The player might have items remaining in the slots from the previous join; this is likely --when the server has been shutdown and the server didn't clean up the player inventories. mcl_util.move_player_list(player, "stonecutter_input") - mcl_util.move_player_list(player, "stonecutter_output") + player:get_inventory():set_list("stonecutter_output", {}) end) minetest.register_on_leaveplayer(function(player) set_selected_item(player, nil) mcl_util.move_player_list(player, "stonecutter_input") - mcl_util.move_player_list(player, "stonecutter_output") + player:get_inventory():set_list("stonecutter_output", {}) end) ---Update content of the stonecutter output slot with the input slot and the selected item @@ -259,7 +259,7 @@ minetest.register_on_player_receive_fields(function(player, formname, fields) if fields.quit then mcl_util.move_player_list(player, "stonecutter_input") - mcl_util.move_player_list(player, "stonecutter_output") + player:get_inventory():set_list("stonecutter_output", {}) return end From 8fd988da113e1196e189d8cead805f8ff4faccc1 Mon Sep 17 00:00:00 2001 From: the-real-herowl Date: Sun, 26 Nov 2023 00:47:02 +0100 Subject: [PATCH 325/982] Increased cut copper recipe output --- mods/ITEMS/mcl_copper/crafting.lua | 4 ++-- mods/ITEMS/mcl_stonecutter/init.lua | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/mods/ITEMS/mcl_copper/crafting.lua b/mods/ITEMS/mcl_copper/crafting.lua index 6754534db..f4af0eee3 100644 --- a/mods/ITEMS/mcl_copper/crafting.lua +++ b/mods/ITEMS/mcl_copper/crafting.lua @@ -61,8 +61,8 @@ end local cuttable_blocks = { "block", "waxed_block", "block_exposed", "waxed_block_exposed", "block_weathered", "waxed_block_weathered", "block_oxidized", "waxed_block_oxidized" } -for _, w in ipairs(cuttable_blocks) do - mcl_stonecutter.register_recipe("mcl_copper:"..w, "mcl_copper:"..w.."_cut") +for _, c in ipairs(cuttable_blocks) do + mcl_stonecutter.register_recipe("mcl_copper:"..c, "mcl_copper:"..c.."_cut", 4) end minetest.register_craft({ diff --git a/mods/ITEMS/mcl_stonecutter/init.lua b/mods/ITEMS/mcl_stonecutter/init.lua index 5605db659..5edf424da 100644 --- a/mods/ITEMS/mcl_stonecutter/init.lua +++ b/mods/ITEMS/mcl_stonecutter/init.lua @@ -66,7 +66,7 @@ function mcl_stonecutter.register_recipe(input, output, count) local fallthrough = mcl_stonecutter.registered_recipes[output] if fallthrough then for o, c in pairs(fallthrough) do - mcl_stonecutter.register_recipe(input, o, c) + mcl_stonecutter.register_recipe(input, o, c * count) end end From 570ea114ecebee92d5c4c341c87ea6d6e05dfeb6 Mon Sep 17 00:00:00 2001 From: ThePython10110 Date: Mon, 27 Nov 2023 02:21:48 +0000 Subject: [PATCH 326/982] Fix weathered cut copper crafting (#4033) Just fixing a typo. Reviewed-on: https://git.minetest.land/MineClone2/MineClone2/pulls/4033 Reviewed-by: the-real-herowl Co-authored-by: ThePython10110 Co-committed-by: ThePython10110 --- mods/ITEMS/mcl_copper/crafting.lua | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mods/ITEMS/mcl_copper/crafting.lua b/mods/ITEMS/mcl_copper/crafting.lua index 41084afb3..b500a82b0 100644 --- a/mods/ITEMS/mcl_copper/crafting.lua +++ b/mods/ITEMS/mcl_copper/crafting.lua @@ -41,7 +41,7 @@ minetest.register_craft({ }) minetest.register_craft({ - output = "mcl_copper:mcl_copper:block_weathered_cut 4", + output = "mcl_copper:block_weathered_cut 4", recipe = { { "mcl_copper:block_weathered", "mcl_copper:block_weathered" }, { "mcl_copper:block_weathered", "mcl_copper:block_weathered" }, From 10441637176783f59d9a5411d6428d61f5353611 Mon Sep 17 00:00:00 2001 From: the-real-herowl Date: Mon, 27 Nov 2023 02:22:39 +0000 Subject: [PATCH 327/982] Fixed the ambiguous /clear command being dangerous (#4026) Implements #3826 Reviewed-on: https://git.minetest.land/MineClone2/MineClone2/pulls/4026 Co-authored-by: the-real-herowl Co-committed-by: the-real-herowl --- mods/MISC/mcl_commands/alias.lua | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) diff --git a/mods/MISC/mcl_commands/alias.lua b/mods/MISC/mcl_commands/alias.lua index 5c9ee9f3c..2c700408b 100644 --- a/mods/MISC/mcl_commands/alias.lua +++ b/mods/MISC/mcl_commands/alias.lua @@ -18,7 +18,7 @@ if minetest.settings:get_bool("mcl_builtin_commands_overide", true) then register_chatcommand_alias("tell", "msg") register_chatcommand_alias("w", "msg") register_chatcommand_alias("tp", "teleport") - rename_chatcommand("clear", "clearinv") + register_chatcommand_alias("clearinventory", "clearinv") minetest.register_chatcommand("banlist", { description = S("List bans"), @@ -27,4 +27,14 @@ if minetest.settings:get_bool("mcl_builtin_commands_overide", true) then return true, S("Ban list: @1", minetest.get_ban_list()) end, }) -end \ No newline at end of file + + minetest.register_chatcommand("clear", { + description = S("List clear commands"), + func = function(name) + return true, S("To clear inventory use /clearinv or /clearinventory").."\n".. + S("To clear mobs use /clearmobs").."\n".. + S("To clear the weather use /weather clear").."\n".. + S("Clearing the chat is not possible, you can hide the chat using \"Toggle chat log\" key (default F2) on PC or the chat icon on the mobile version") + end, + }) +end From 25fa21ddbdc70a85ce5434f20d2b2d300179502a Mon Sep 17 00:00:00 2001 From: bakawun Date: Mon, 27 Nov 2023 10:47:55 +0100 Subject: [PATCH 328/982] Set all mob spawn chance weights according to mc now that weights are actually taken into account --- mods/ENTITIES/mobs_mc/axolotl.lua | 2 +- mods/ENTITIES/mobs_mc/bat.lua | 2 +- mods/ENTITIES/mobs_mc/blaze.lua | 2 +- mods/ENTITIES/mobs_mc/chicken.lua | 2 +- mods/ENTITIES/mobs_mc/cod.lua | 2 +- mods/ENTITIES/mobs_mc/cow+mooshroom.lua | 4 ++-- mods/ENTITIES/mobs_mc/creeper.lua | 2 +- mods/ENTITIES/mobs_mc/dolphin.lua | 2 +- mods/ENTITIES/mobs_mc/enderman.lua | 8 ++++---- mods/ENTITIES/mobs_mc/ghast.lua | 2 +- mods/ENTITIES/mobs_mc/glow_squid.lua | 2 +- mods/ENTITIES/mobs_mc/hoglin+zoglin.lua | 2 +- mods/ENTITIES/mobs_mc/horse.lua | 4 ++-- mods/ENTITIES/mobs_mc/llama.lua | 2 +- mods/ENTITIES/mobs_mc/ocelot.lua | 2 +- mods/ENTITIES/mobs_mc/parrot.lua | 2 +- mods/ENTITIES/mobs_mc/pig.lua | 2 +- mods/ENTITIES/mobs_mc/piglin.lua | 8 ++++---- mods/ENTITIES/mobs_mc/polar_bear.lua | 2 +- mods/ENTITIES/mobs_mc/rabbit.lua | 2 +- mods/ENTITIES/mobs_mc/salmon.lua | 2 +- mods/ENTITIES/mobs_mc/sheep.lua | 2 +- mods/ENTITIES/mobs_mc/skeleton+stray.lua | 6 +++--- mods/ENTITIES/mobs_mc/skeleton_wither.lua | 2 +- mods/ENTITIES/mobs_mc/slime+magma_cube.lua | 18 +++++++++--------- mods/ENTITIES/mobs_mc/spider.lua | 2 +- mods/ENTITIES/mobs_mc/squid.lua | 2 +- mods/ENTITIES/mobs_mc/strider.lua | 4 ++-- mods/ENTITIES/mobs_mc/tropical_fish.lua | 2 +- mods/ENTITIES/mobs_mc/villager.lua | 2 +- mods/ENTITIES/mobs_mc/villager_zombie.lua | 2 +- mods/ENTITIES/mobs_mc/wolf.lua | 2 +- mods/ENTITIES/mobs_mc/zombie.lua | 8 ++++---- 33 files changed, 55 insertions(+), 55 deletions(-) diff --git a/mods/ENTITIES/mobs_mc/axolotl.lua b/mods/ENTITIES/mobs_mc/axolotl.lua index 563db8bf7..f3f423c01 100644 --- a/mods/ENTITIES/mobs_mc/axolotl.lua +++ b/mods/ENTITIES/mobs_mc/axolotl.lua @@ -171,7 +171,7 @@ mcl_mobs:spawn_specific( 0, minetest.LIGHT_MAX+1, 30, -4000, +100, 3, water-16, water+1) diff --git a/mods/ENTITIES/mobs_mc/bat.lua b/mods/ENTITIES/mobs_mc/bat.lua index b8b650877..cc36e3836 100644 --- a/mods/ENTITIES/mobs_mc/bat.lua +++ b/mods/ENTITIES/mobs_mc/bat.lua @@ -150,7 +150,7 @@ mcl_mobs:spawn_specific( 0, maxlight, 20, -5000, +100, 2, mcl_vars.mg_overworld_min, mobs_mc.water_level-1) diff --git a/mods/ENTITIES/mobs_mc/blaze.lua b/mods/ENTITIES/mobs_mc/blaze.lua index 98cf4728a..bbc47df94 100644 --- a/mods/ENTITIES/mobs_mc/blaze.lua +++ b/mods/ENTITIES/mobs_mc/blaze.lua @@ -151,7 +151,7 @@ mcl_mobs:spawn_specific( 0, minetest.LIGHT_MAX+1, 30, -5000, +1000, 3, mcl_vars.mg_nether_min, mcl_vars.mg_nether_max) diff --git a/mods/ENTITIES/mobs_mc/chicken.lua b/mods/ENTITIES/mobs_mc/chicken.lua index 5702db4c7..1adf47569 100644 --- a/mods/ENTITIES/mobs_mc/chicken.lua +++ b/mods/ENTITIES/mobs_mc/chicken.lua @@ -157,7 +157,7 @@ mcl_mobs:spawn_specific( }, 9, minetest.LIGHT_MAX+1, -30, 17000, +30, 100, 3, mobs_mc.water_level, mcl_vars.mg_overworld_max) diff --git a/mods/ENTITIES/mobs_mc/cod.lua b/mods/ENTITIES/mobs_mc/cod.lua index 656b2c14c..4f41f763d 100644 --- a/mods/ENTITIES/mobs_mc/cod.lua +++ b/mods/ENTITIES/mobs_mc/cod.lua @@ -266,7 +266,7 @@ mcl_mobs:spawn_specific( 0, minetest.LIGHT_MAX+1, 30, -4000, +750, 3, water-16, water+1) diff --git a/mods/ENTITIES/mobs_mc/cow+mooshroom.lua b/mods/ENTITIES/mobs_mc/cow+mooshroom.lua index 86b94eea3..4ee21b2ea 100644 --- a/mods/ENTITIES/mobs_mc/cow+mooshroom.lua +++ b/mods/ENTITIES/mobs_mc/cow+mooshroom.lua @@ -207,7 +207,7 @@ mcl_mobs:spawn_specific( 9, minetest.LIGHT_MAX+1, 30, -17000, +80, 10, mobs_mc.water_level, mcl_vars.mg_overworld_max) @@ -225,7 +225,7 @@ mcl_mobs:spawn_specific( 9, minetest.LIGHT_MAX+1, 30, -17000, +80, 5, mcl_vars.mg_overworld_min, mcl_vars.mg_overworld_max) diff --git a/mods/ENTITIES/mobs_mc/creeper.lua b/mods/ENTITIES/mobs_mc/creeper.lua index a36550a93..0b3d41c28 100644 --- a/mods/ENTITIES/mobs_mc/creeper.lua +++ b/mods/ENTITIES/mobs_mc/creeper.lua @@ -407,7 +407,7 @@ mcl_mobs:spawn_specific( 0, 7, 20, -16500, +1000, 2, mcl_vars.mg_overworld_min, mcl_vars.mg_overworld_max) diff --git a/mods/ENTITIES/mobs_mc/dolphin.lua b/mods/ENTITIES/mobs_mc/dolphin.lua index 153734c39..5469feb23 100644 --- a/mods/ENTITIES/mobs_mc/dolphin.lua +++ b/mods/ENTITIES/mobs_mc/dolphin.lua @@ -244,7 +244,7 @@ mcl_mobs:spawn_specific( 0, minetest.LIGHT_MAX+1, 30, -4000, +70, 3, water-16, water+1) diff --git a/mods/ENTITIES/mobs_mc/enderman.lua b/mods/ENTITIES/mobs_mc/enderman.lua index a57160e4d..d3ce1e5cc 100644 --- a/mods/ENTITIES/mobs_mc/enderman.lua +++ b/mods/ENTITIES/mobs_mc/enderman.lua @@ -668,7 +668,7 @@ mcl_mobs:spawn_specific( 0, minetest.LIGHT_MAX+1, 30, -3000, +100, 12, mcl_vars.mg_end_min, mcl_vars.mg_end_max) @@ -816,7 +816,7 @@ mcl_mobs:spawn_specific( 0, 7, 30, -19000, +100, 2, mcl_vars.mg_overworld_min, mcl_vars.mg_overworld_max) @@ -833,7 +833,7 @@ mcl_mobs:spawn_specific( 0, 11, 30, -27500, +100, 4, mcl_vars.mg_nether_min, mcl_vars.mg_nether_max) @@ -849,7 +849,7 @@ mcl_mobs:spawn_specific( 0, 11, 30, -5000, +100, 4, mcl_vars.mg_nether_min, mcl_vars.mg_nether_max) diff --git a/mods/ENTITIES/mobs_mc/ghast.lua b/mods/ENTITIES/mobs_mc/ghast.lua index 1a3d34e1b..08d09ed07 100644 --- a/mods/ENTITIES/mobs_mc/ghast.lua +++ b/mods/ENTITIES/mobs_mc/ghast.lua @@ -97,7 +97,7 @@ mcl_mobs:spawn_specific( 0, 7, 30, -72000, +400, 2, mcl_vars.mg_nether_min, mcl_vars.mg_nether_max) diff --git a/mods/ENTITIES/mobs_mc/glow_squid.lua b/mods/ENTITIES/mobs_mc/glow_squid.lua index 2d3f19270..679bb4cfe 100644 --- a/mods/ENTITIES/mobs_mc/glow_squid.lua +++ b/mods/ENTITIES/mobs_mc/glow_squid.lua @@ -237,7 +237,7 @@ mcl_mobs:spawn_specific( 0, minetest.LIGHT_MAX + 1, 30, - 10000, + 100, 3, water - 16, water) diff --git a/mods/ENTITIES/mobs_mc/hoglin+zoglin.lua b/mods/ENTITIES/mobs_mc/hoglin+zoglin.lua index 8f8590933..056cc0eb0 100644 --- a/mods/ENTITIES/mobs_mc/hoglin+zoglin.lua +++ b/mods/ENTITIES/mobs_mc/hoglin+zoglin.lua @@ -129,7 +129,7 @@ mcl_mobs:spawn_specific( 0, minetest.LIGHT_MAX+1, 30, -6000, +200, 3, mcl_vars.mg_nether_min, mcl_vars.mg_nether_max) diff --git a/mods/ENTITIES/mobs_mc/horse.lua b/mods/ENTITIES/mobs_mc/horse.lua index 07aa58572..08281b8cd 100644 --- a/mods/ENTITIES/mobs_mc/horse.lua +++ b/mods/ENTITIES/mobs_mc/horse.lua @@ -612,7 +612,7 @@ mcl_mobs:spawn_specific( 0, minetest.LIGHT_MAX+1, 30, -15000, +40, 4, mobs_mc.water_level+3, mcl_vars.mg_overworld_max) @@ -635,7 +635,7 @@ mcl_mobs:spawn_specific( 9, minetest.LIGHT_MAX+1, 30, -15000, +10, 4, mobs_mc.water_level+3, mcl_vars.mg_overworld_max) diff --git a/mods/ENTITIES/mobs_mc/llama.lua b/mods/ENTITIES/mobs_mc/llama.lua index 578e7c88a..78d190121 100644 --- a/mods/ENTITIES/mobs_mc/llama.lua +++ b/mods/ENTITIES/mobs_mc/llama.lua @@ -291,7 +291,7 @@ mcl_mobs:spawn_specific( 0, minetest.LIGHT_MAX+1, 30, -15000, +50, 5, mobs_mc.water_level+15, mcl_vars.mg_overworld_max) diff --git a/mods/ENTITIES/mobs_mc/ocelot.lua b/mods/ENTITIES/mobs_mc/ocelot.lua index 7aadda492..8f79a589d 100644 --- a/mods/ENTITIES/mobs_mc/ocelot.lua +++ b/mods/ENTITIES/mobs_mc/ocelot.lua @@ -186,7 +186,7 @@ mcl_mobs:spawn_specific( 0, minetest.LIGHT_MAX+1, 30, -15000, +300, 5, mobs_mc.water_level+15, mcl_vars.mg_overworld_max) diff --git a/mods/ENTITIES/mobs_mc/parrot.lua b/mods/ENTITIES/mobs_mc/parrot.lua index 7d4c50f1c..834ad22ae 100644 --- a/mods/ENTITIES/mobs_mc/parrot.lua +++ b/mods/ENTITIES/mobs_mc/parrot.lua @@ -235,7 +235,7 @@ mcl_mobs:spawn_specific( 0, minetest.LIGHT_MAX+1, 7, -30000, +400, 1, mobs_mc.water_level+7, mcl_vars.mg_overworld_max) diff --git a/mods/ENTITIES/mobs_mc/pig.lua b/mods/ENTITIES/mobs_mc/pig.lua index 7b1f4e879..304c4c800 100644 --- a/mods/ENTITIES/mobs_mc/pig.lua +++ b/mods/ENTITIES/mobs_mc/pig.lua @@ -258,7 +258,7 @@ mcl_mobs:spawn_specific( 9, minetest.LIGHT_MAX+1, 30, -15000, +100, 8, mcl_vars.mg_overworld_min, mcl_vars.mg_overworld_max) diff --git a/mods/ENTITIES/mobs_mc/piglin.lua b/mods/ENTITIES/mobs_mc/piglin.lua index 27f5a72f4..0e0ffecf7 100644 --- a/mods/ENTITIES/mobs_mc/piglin.lua +++ b/mods/ENTITIES/mobs_mc/piglin.lua @@ -397,7 +397,7 @@ mcl_mobs:spawn_specific( 0, minetest.LIGHT_MAX+1, 30, -6000, +150, 3, mcl_vars.mg_lava_nether_max, mcl_vars.mg_nether_max) @@ -413,7 +413,7 @@ mcl_mobs:spawn_specific( 0, minetest.LIGHT_MAX+1, 30, -6000, +150, 3, mcl_vars.mg_lava_nether_max, mcl_vars.mg_nether_max) @@ -429,7 +429,7 @@ mcl_mobs:spawn_specific( 0, minetest.LIGHT_MAX+1, 30, - 6000, + 1000, 3, mcl_vars.mg_nether_min, mcl_vars.mg_nether_max) @@ -446,7 +446,7 @@ mcl_mobs:spawn_specific( 0, minetest.LIGHT_MAX+1, 30, - 100000, + 50, 4, mcl_vars.mg_nether_min, mcl_vars.mg_nether_max) diff --git a/mods/ENTITIES/mobs_mc/polar_bear.lua b/mods/ENTITIES/mobs_mc/polar_bear.lua index 18d6f3a13..aa690bc20 100644 --- a/mods/ENTITIES/mobs_mc/polar_bear.lua +++ b/mods/ENTITIES/mobs_mc/polar_bear.lua @@ -86,7 +86,7 @@ mcl_mobs:spawn_specific( 0, minetest.LIGHT_MAX+1, 30, -7000, +50, 3, mcl_vars.mg_overworld_min, mcl_vars.mg_overworld_max) diff --git a/mods/ENTITIES/mobs_mc/rabbit.lua b/mods/ENTITIES/mobs_mc/rabbit.lua index 38fae935f..c519e5e7f 100644 --- a/mods/ENTITIES/mobs_mc/rabbit.lua +++ b/mods/ENTITIES/mobs_mc/rabbit.lua @@ -148,7 +148,7 @@ mcl_mobs:spawn_specific( 9, minetest.LIGHT_MAX+1, 30, -15000, +40, 8, mcl_vars.mg_overworld_min, mcl_vars.mg_overworld_max) diff --git a/mods/ENTITIES/mobs_mc/salmon.lua b/mods/ENTITIES/mobs_mc/salmon.lua index f8e0c4e02..80adbd2c1 100644 --- a/mods/ENTITIES/mobs_mc/salmon.lua +++ b/mods/ENTITIES/mobs_mc/salmon.lua @@ -220,7 +220,7 @@ mcl_mobs:spawn_specific( 0, minetest.LIGHT_MAX+1, 30, -4000, +260, 3, water-16, water+1) diff --git a/mods/ENTITIES/mobs_mc/sheep.lua b/mods/ENTITIES/mobs_mc/sheep.lua index 4a5e924d8..56476d027 100644 --- a/mods/ENTITIES/mobs_mc/sheep.lua +++ b/mods/ENTITIES/mobs_mc/sheep.lua @@ -379,7 +379,7 @@ mcl_mobs:spawn_specific( 9, minetest.LIGHT_MAX+1, 30, -15000, +120, 3, mcl_vars.mg_overworld_min, mcl_vars.mg_overworld_max) diff --git a/mods/ENTITIES/mobs_mc/skeleton+stray.lua b/mods/ENTITIES/mobs_mc/skeleton+stray.lua index 215047fdd..2ce2fba5b 100644 --- a/mods/ENTITIES/mobs_mc/skeleton+stray.lua +++ b/mods/ENTITIES/mobs_mc/skeleton+stray.lua @@ -299,7 +299,7 @@ mcl_mobs:spawn_specific( 0, 7, 20, -17000, +800, 2, mcl_vars.mg_overworld_min, mcl_vars.mg_overworld_max) @@ -316,7 +316,7 @@ mcl_mobs:spawn_specific( 0, minetest.LIGHT_MAX+1, 30, -10000, +800, 3, mcl_vars.mg_nether_min, mcl_vars.mg_nether_max) @@ -336,7 +336,7 @@ mcl_mobs:spawn_specific( 0, 7, 20, -19000, +1200, 2, mobs_mc.water_level, mcl_vars.mg_overworld_max) diff --git a/mods/ENTITIES/mobs_mc/skeleton_wither.lua b/mods/ENTITIES/mobs_mc/skeleton_wither.lua index 865fa13f0..cd2b44abb 100644 --- a/mods/ENTITIES/mobs_mc/skeleton_wither.lua +++ b/mods/ENTITIES/mobs_mc/skeleton_wither.lua @@ -116,7 +116,7 @@ mcl_mobs:spawn_specific( 0, 7, 30, -5000, +500, 5, mcl_vars.mg_nether_min, mcl_vars.mg_nether_max) diff --git a/mods/ENTITIES/mobs_mc/slime+magma_cube.lua b/mods/ENTITIES/mobs_mc/slime+magma_cube.lua index 321a9c1ce..f84e04ed9 100644 --- a/mods/ENTITIES/mobs_mc/slime+magma_cube.lua +++ b/mods/ENTITIES/mobs_mc/slime+magma_cube.lua @@ -321,7 +321,7 @@ cave_biomes, 0, minetest.LIGHT_MAX+1, 30, -12000, +1000, 4, cave_min, cave_max, @@ -335,7 +335,7 @@ swampy_biomes, 0, swamp_light_max, 30, -12000, +1000, 4, swamp_min, swamp_max) @@ -348,7 +348,7 @@ cave_biomes, 0, minetest.LIGHT_MAX+1, 30, -8500, +1000, 4, cave_min, cave_max, @@ -362,7 +362,7 @@ swampy_biomes, 0, swamp_light_max, 30, -8500, +1000, 4, swamp_min, swamp_max) @@ -375,7 +375,7 @@ cave_biomes, 0, minetest.LIGHT_MAX+1, 30, -10000, +1000, 4, cave_min, cave_max, @@ -389,7 +389,7 @@ swampy_biomes, 0, swamp_light_max, 30, -10000, +1000, 4, swamp_min, swamp_max) @@ -512,7 +512,7 @@ magma_cube_biomes, 0, minetest.LIGHT_MAX+1, 30, -15000, +100, 4, nether_min, nether_max) @@ -525,7 +525,7 @@ magma_cube_biomes, 0, minetest.LIGHT_MAX+1, 30, -15500, +100, 4, nether_min, nether_max) @@ -538,7 +538,7 @@ magma_cube_biomes, 0, minetest.LIGHT_MAX+1, 30, -16000, +100, 4, nether_min, nether_max) diff --git a/mods/ENTITIES/mobs_mc/spider.lua b/mods/ENTITIES/mobs_mc/spider.lua index 38138a71c..16f802c09 100644 --- a/mods/ENTITIES/mobs_mc/spider.lua +++ b/mods/ENTITIES/mobs_mc/spider.lua @@ -287,7 +287,7 @@ mcl_mobs:spawn_specific( 0, 7, 30, -17000, +1000, 2, mcl_vars.mg_overworld_min, mcl_vars.mg_overworld_max) diff --git a/mods/ENTITIES/mobs_mc/squid.lua b/mods/ENTITIES/mobs_mc/squid.lua index a692fd8d4..0cd0c6c5a 100644 --- a/mods/ENTITIES/mobs_mc/squid.lua +++ b/mods/ENTITIES/mobs_mc/squid.lua @@ -211,7 +211,7 @@ mcl_mobs:spawn_specific( 0, minetest.LIGHT_MAX+1, 30, -5500, +80, 3, water-16, water+1) diff --git a/mods/ENTITIES/mobs_mc/strider.lua b/mods/ENTITIES/mobs_mc/strider.lua index 142025e06..18ce7ea4a 100644 --- a/mods/ENTITIES/mobs_mc/strider.lua +++ b/mods/ENTITIES/mobs_mc/strider.lua @@ -225,7 +225,7 @@ mcl_mobs:spawn_setup({ }, min_height = mcl_vars.mg_nether_min, max_height = mcl_vars.mg_nether_max, - chance = 2000, + chance = 200, }) mcl_mobs:spawn_setup({ @@ -241,7 +241,7 @@ mcl_mobs:spawn_setup({ }, min_height = mcl_vars.mg_nether_min, max_height = mcl_vars.mg_nether_max, - chance = 100, + chance = 20, }) -- spawn eggs diff --git a/mods/ENTITIES/mobs_mc/tropical_fish.lua b/mods/ENTITIES/mobs_mc/tropical_fish.lua index 79b32bb8b..f5de8ecdd 100644 --- a/mods/ENTITIES/mobs_mc/tropical_fish.lua +++ b/mods/ENTITIES/mobs_mc/tropical_fish.lua @@ -183,7 +183,7 @@ mcl_mobs:spawn_specific( 0, minetest.LIGHT_MAX+1, 30, -4000, +750, 3, water-16, water+1) diff --git a/mods/ENTITIES/mobs_mc/villager.lua b/mods/ENTITIES/mobs_mc/villager.lua index cb421b78b..6df9b8d53 100644 --- a/mods/ENTITIES/mobs_mc/villager.lua +++ b/mods/ENTITIES/mobs_mc/villager.lua @@ -2335,7 +2335,7 @@ mcl_mobs:spawn_specific( 0, minetest.LIGHT_MAX+1, 30, -20, +2, 4, mobs_mc.water_level+1, mcl_vars.mg_overworld_max) diff --git a/mods/ENTITIES/mobs_mc/villager_zombie.lua b/mods/ENTITIES/mobs_mc/villager_zombie.lua index 5af1fc879..ada456aff 100644 --- a/mods/ENTITIES/mobs_mc/villager_zombie.lua +++ b/mods/ENTITIES/mobs_mc/villager_zombie.lua @@ -225,7 +225,7 @@ mcl_mobs:spawn_specific( 0, 7, 30, -4090, +50, 4, mcl_vars.mg_overworld_min, mcl_vars.mg_overworld_max) diff --git a/mods/ENTITIES/mobs_mc/wolf.lua b/mods/ENTITIES/mobs_mc/wolf.lua index c52b5b1a3..e2cb206b1 100644 --- a/mods/ENTITIES/mobs_mc/wolf.lua +++ b/mods/ENTITIES/mobs_mc/wolf.lua @@ -224,7 +224,7 @@ mcl_mobs:spawn_specific( 0, minetest.LIGHT_MAX+1, 30, -9000, +80, 7, mobs_mc.water_level+3, mcl_vars.mg_overworld_max) diff --git a/mods/ENTITIES/mobs_mc/zombie.lua b/mods/ENTITIES/mobs_mc/zombie.lua index 6a4f5d48a..cf2001f9b 100644 --- a/mods/ENTITIES/mobs_mc/zombie.lua +++ b/mods/ENTITIES/mobs_mc/zombie.lua @@ -243,7 +243,7 @@ mcl_mobs:spawn_specific( 0, 7, 30, -6000, +1000, 4, mcl_vars.mg_overworld_min, mcl_vars.mg_overworld_max) @@ -332,7 +332,7 @@ mcl_mobs:spawn_specific( 0, 7, 30, -60000, +50, 4, mcl_vars.mg_overworld_min, mcl_vars.mg_overworld_max) @@ -348,7 +348,7 @@ mcl_mobs:spawn_specific( 0, 7, 30, -6500, +2400, 4, mcl_vars.mg_overworld_min, mcl_vars.mg_overworld_max) @@ -362,7 +362,7 @@ mcl_mobs:spawn_specific( 0, 7, 30, -65000, +120, 4, mcl_vars.mg_overworld_min, mcl_vars.mg_overworld_max) From 1da7bb0bdcf438276faadae17ac1426ec8c68612 Mon Sep 17 00:00:00 2001 From: Kostinatyn Tsiupa Date: Fri, 27 Oct 2023 01:15:57 +0300 Subject: [PATCH 329/982] hopper reimplementation Reimplemented hoppers and all (blast_furnace, furnace, smoker, composters, double chaets, shulker_boxes, droppers, bookshelvs and brewing_stands) connected nodes --- GROUPS.md | 12 +- mods/CORE/mcl_util/init.lua | 229 +++++----------- mods/ITEMS/REDSTONE/mcl_droppers/init.lua | 37 ++- mods/ITEMS/mcl_blast_furnace/init.lua | 11 +- mods/ITEMS/mcl_books/init.lua | 8 +- mods/ITEMS/mcl_brewing/init.lua | 108 +++++++- mods/ITEMS/mcl_chests/init.lua | 79 +++++- mods/ITEMS/mcl_composters/init.lua | 147 ++++++++--- mods/ITEMS/mcl_composters/mod.conf | 2 +- mods/ITEMS/mcl_furnaces/init.lua | 38 ++- mods/ITEMS/mcl_hoppers/init.lua | 244 ++++-------------- mods/ITEMS/mcl_itemframes/item_frames_API.lua | 2 +- mods/ITEMS/mcl_jukebox/init.lua | 2 +- mods/ITEMS/mcl_potions/init.lua | 4 +- mods/ITEMS/mcl_potions/lingering.lua | 2 +- mods/ITEMS/mcl_potions/potions.lua | 10 +- mods/ITEMS/mcl_potions/splash.lua | 2 +- mods/ITEMS/mcl_smoker/init.lua | 11 +- 18 files changed, 504 insertions(+), 444 deletions(-) diff --git a/GROUPS.md b/GROUPS.md index e6d878990..0eb2d2d7c 100644 --- a/GROUPS.md +++ b/GROUPS.md @@ -170,16 +170,8 @@ These groups are used mostly for informational purposes * `ammo_bow=1`: Item is used as ammo for bows * `non_combat_armor=1`: Item can be equipped as armor, but is not made for combat (e.g. zombie head, pumpkin) * `container`: Node is a container which physically stores items within and has at least 1 inventory - * `container=2`: Has one inventory with list name `"main"`. Items can be placed and taken freely - * `container=3`: Same as `container=2`, but shulker boxes can not be inserted - * `container=4`: Furnace-like, has lists `"src"`, `"fuel"` and `"dst"`. - It is expected that this also reacts on `on_timer`; - the node timer must be started from other mods when they add into `"src"` or `"fuel"` - * `container=5`: Left part of a 2-part horizontal connected container. Both parts have a `"main"` inventory - list. Both inventories are considered to belong together. This is used for large chests. - * `container=6`: Same as above, but for the right part. - * `container=7`: Has inventory list "`main`", no movement allowed - * `container=1`: Other/unspecified container type + * `container=1`: Container type, which does not allow hoppers to transfer items + * `container=2`: Items can be placed and taken freely. Can have inventory with list name `"main"` or define `_mcl_hoppers_on_try_pull`, `_mcl_hoppers_on_try_push`, `_mcl_hoppers_on_after_pull`, `_mcl_hoppers_on_after_push` to play along hoppers nicely. * `spawn_egg=1`: Spawn egg * `pressure_plate=1`: Pressure plate (off) diff --git a/mods/CORE/mcl_util/init.lua b/mods/CORE/mcl_util/init.lua index e894eebd7..5d44bb29f 100644 --- a/mods/CORE/mcl_util/init.lua +++ b/mods/CORE/mcl_util/init.lua @@ -241,34 +241,25 @@ function mcl_util.get_double_container_neighbor_pos(pos, param2, side) end end --- Iterates through all items in the given inventory and --- returns the slot of the first item which matches a condition. --- Returns nil if no item was found. ---- source_inventory: Inventory to take the item from ---- source_list: List name of the source inventory from which to take the item ---- destination_inventory: Put item into this inventory ---- destination_list: List name of the destination inventory to which to put the item into ---- condition: Function which takes an itemstack and returns true if it matches the desired item condition. ---- If set to nil, the slot of the first item stack will be taken unconditionally. --- dst_inventory and dst_list can also be nil if condition is nil. -function mcl_util.get_eligible_transfer_item_slot(src_inventory, src_list, dst_inventory, dst_list, condition) - local size = src_inventory:get_size(src_list) +--- Selects item stack to transfer from +---@param src_inventory InvRef Source innentory to pull from +---@param src_list string Name of source inventory list to pull from +---@param dst_inventory InvRef Destination inventory to push to +---@param dst_list string Name of destination inventory list to push to +---@param condition? fun(stack: ItemStack) Condition which items are allowed to be transfered. +---@return integer Item stack number to be transfered +function mcl_util.select_stack(src_inventory, src_list, dst_inventory, dst_list, condition) + local src_size = src_inventory:get_size(src_list) local stack - for i = 1, size do + for i = 1, src_size do stack = src_inventory:get_stack(src_list, i) - if not stack:is_empty() and (condition == nil or condition(stack, src_inventory, src_list, dst_inventory, dst_list)) then + if not stack:is_empty() and dst_inventory:room_for_item(dst_list, stack) and ((condition == nil or condition(stack))) then return i end end return nil end --- Returns true if itemstack is a shulker box -local function is_not_shulker_box(itemstack) - local g = minetest.get_item_group(itemstack:get_name(), "shulker_box") - return g == 0 or g == nil -end - -- Moves a single item from one inventory to another. --- source_inventory: Inventory to take the item from --- source_list: List name of the source inventory from which to take the item @@ -279,13 +270,6 @@ end -- Returns true on success and false on failure -- Possible failures: No item in source slot, destination inventory full function mcl_util.move_item(source_inventory, source_list, source_stack_id, destination_inventory, destination_list) - if source_stack_id == -1 then - source_stack_id = mcl_util.get_first_occupied_inventory_slot(source_inventory, source_list) - if source_stack_id == nil then - return false - end - end - if not source_inventory:is_empty(source_list) then local stack = source_inventory:get_stack(source_list, source_stack_id) if not stack:is_empty() then @@ -303,150 +287,75 @@ function mcl_util.move_item(source_inventory, source_list, source_stack_id, dest return false end --- Moves a single item from one container node into another. Performs a variety of high-level --- checks to prevent invalid transfers such as shulker boxes into shulker boxes ---- source_pos: Position ({x,y,z}) of the node to take the item from ---- destination_pos: Position ({x,y,z}) of the node to put the item into ---- source_list (optional): List name of the source inventory from which to take the item. Default is normally "main"; "dst" for furnace ---- source_stack_id (optional): The inventory position ID of the source inventory to take the item from (-1 for slot of the first valid item; -1 is default) ---- destination_list (optional): List name of the destination inventory. Default is normally "main"; "src" for furnace --- Returns true on success and false on failure. -function mcl_util.move_item_container(source_pos, destination_pos, source_list, source_stack_id, destination_list) - local dpos = table.copy(destination_pos) - local spos = table.copy(source_pos) - local snode = minetest.get_node(spos) - local dnode = minetest.get_node(dpos) +--- Try pushing item from hopper inventory to destination inventory +---@param pos Vector +---@param dst_pos Vector +function mcl_util.hopper_push(pos, dst_pos) + local hop_inv = minetest.get_meta(pos):get_inventory() + local hop_list = 'main' - local dctype = minetest.get_item_group(dnode.name, "container") - local sctype = minetest.get_item_group(snode.name, "container") + -- Get node pos' for item transfer + local dst = minetest.get_node(dst_pos) + if not minetest.registered_nodes[dst.name] then return end + local dst_type = minetest.get_item_group(dst.name, "container") + if dst_type ~= 2 then return end + local dst_def = minetest.registered_nodes[dst.name] - -- Container type 7 does not allow any movement - if sctype == 7 then - return false + local dst_list = 'main' + local dst_inv, stack_id + + if dst_def._mcl_hoppers_on_try_push then + dst_inv, dst_list, stack_id = dst_def._mcl_hoppers_on_try_push(dst_pos, pos, hop_inv, hop_list) + else + local dst_meta = minetest.get_meta(dst_pos) + dst_inv = dst_meta:get_inventory() + stack_id = mcl_util.select_stack(hop_inv, hop_list, dst_inv, dst_list) end - -- Normalize double container by forcing to always use the left segment first - local function normalize_double_container(pos, node, ctype) - if ctype == 6 then - pos = mcl_util.get_double_container_neighbor_pos(pos, node.param2, "right") - if not pos then - return false - end - node = minetest.get_node(pos) - ctype = minetest.get_item_group(node.name, "container") - -- The left segment seems incorrect? We better bail out! - if ctype ~= 5 then - return false - end + if stack_id ~= nil then + local ok = mcl_util.move_item(hop_inv, hop_list, stack_id, dst_inv, dst_list) + if dst_def._mcl_hoppers_on_after_push then + dst_def._mcl_hoppers_on_after_push(dst_pos) end - return pos, node, ctype - end - - spos, snode, sctype = normalize_double_container(spos, snode, sctype) - dpos, dnode, dctype = normalize_double_container(dpos, dnode, dctype) - if not spos or not dpos then return false end - - local smeta = minetest.get_meta(spos) - local dmeta = minetest.get_meta(dpos) - - local sinv = smeta:get_inventory() - local dinv = dmeta:get_inventory() - - -- Default source lists - if not source_list then - -- Main inventory for most container types - if sctype == 2 or sctype == 3 or sctype == 5 or sctype == 6 or sctype == 7 then - source_list = "main" - -- Furnace: output - elseif sctype == 4 then - source_list = "dst" - -- Unknown source container type. Bail out - else - return false + if ok then + return true end end - -- Automatically select stack slot ID if set to automatic - if not source_stack_id then - source_stack_id = -1 - end - if source_stack_id == -1 then - local cond = nil - -- Prevent shulker box inception - if dctype == 3 then - cond = is_not_shulker_box - end - source_stack_id = mcl_util.get_eligible_transfer_item_slot(sinv, source_list, dinv, dpos, cond) - if not source_stack_id then - -- Try again if source is a double container - if sctype == 5 then - spos = mcl_util.get_double_container_neighbor_pos(spos, snode.param2, "left") - smeta = minetest.get_meta(spos) - sinv = smeta:get_inventory() - - source_stack_id = mcl_util.get_eligible_transfer_item_slot(sinv, source_list, dinv, dpos, cond) - if not source_stack_id then - return false - end - else - return false - end - end - end - - -- Abort transfer if shulker box wants to go into shulker box - if dctype == 3 then - local stack = sinv:get_stack(source_list, source_stack_id) - if stack and minetest.get_item_group(stack:get_name(), "shulker_box") == 1 then - return false - end - end - -- Container type 7 does not allow any placement - if dctype == 7 then - return false - end - - -- If it's a container, put it into the container - if dctype ~= 0 then - -- Automatically select a destination list if omitted - if not destination_list then - -- Main inventory for most container types - if dctype == 2 or dctype == 3 or dctype == 5 or dctype == 6 or dctype == 7 then - destination_list = "main" - -- Furnace source slot - elseif dctype == 4 then - destination_list = "src" - end - end - if destination_list then - -- Move item - local ok = mcl_util.move_item(sinv, source_list, source_stack_id, dinv, destination_list) - - -- Try transfer to neighbor node if transfer failed and double container - if not ok and dctype == 5 then - dpos = mcl_util.get_double_container_neighbor_pos(dpos, dnode.param2, "left") - dmeta = minetest.get_meta(dpos) - dinv = dmeta:get_inventory() - - ok = mcl_util.move_item(sinv, source_list, source_stack_id, dinv, destination_list) - end - - -- Update furnace - if ok and dctype == 4 then - -- Start furnace's timer function, it will sort out whether furnace can burn or not. - minetest.get_node_timer(dpos):start(1.0) - end - - return ok - end - end return false end --- Returns the ID of the first non-empty slot in the given inventory list --- or nil, if inventory is empty. -function mcl_util.get_first_occupied_inventory_slot(inventory, listname) - return mcl_util.get_eligible_transfer_item_slot(inventory, listname) +-- Try pulling from source inventory to hopper inventory +---@param pos Vector +---@param src_pos Vector +function mcl_util.hopper_pull(pos, src_pos) + local hop_inv = minetest.get_meta(pos):get_inventory() + local hop_list = 'main' + + -- Get node pos' for item transfer + local src = minetest.get_node(src_pos) + if not minetest.registered_nodes[src.name] then return end + local src_type = minetest.get_item_group(src.name, "container") + if src_type ~= 2 then return end + local src_def = minetest.registered_nodes[src.name] + + local src_list = 'main' + local src_inv, stack_id + + if src_def._mcl_hoppers_on_try_pull then + src_inv, src_list, stack_id = src_def._mcl_hoppers_on_try_pull(src_pos, pos, hop_inv, hop_list) + else + local src_meta = minetest.get_meta(src_pos) + src_inv = src_meta:get_inventory() + stack_id = mcl_util.select_stack(src_inv, src_list, hop_inv, hop_list) + end + + if stack_id ~= nil then + local ok = mcl_util.move_item(src_inv, src_list, stack_id, hop_inv, hop_list) + if src_def._mcl_hoppers_on_after_pull then + src_def._mcl_hoppers_on_after_pull(src_pos) + end + end end local function drop_item_stack(pos, stack) diff --git a/mods/ITEMS/REDSTONE/mcl_droppers/init.lua b/mods/ITEMS/REDSTONE/mcl_droppers/init.lua index 09e221a4d..e47371bc9 100644 --- a/mods/ITEMS/REDSTONE/mcl_droppers/init.lua +++ b/mods/ITEMS/REDSTONE/mcl_droppers/init.lua @@ -125,7 +125,11 @@ local dropperdef = { local dropnode = minetest.get_node(droppos) -- Do not drop into solid nodes, unless they are containers local dropnodedef = minetest.registered_nodes[dropnode.name] - if dropnodedef.walkable and not dropnodedef.groups.container then + if dropnodedef.groups.container == 2 then + -- If they are containers - double down as hopper + mcl_util.hopper_push(pos, droppos) + end + if dropnodedef.walkable then return end local stacks = {} @@ -141,25 +145,18 @@ local dropperdef = { local dropitem = ItemStack(stack) dropitem:set_count(1) local stack_id = stacks[r].stackpos - - -- If it's a container, attempt to put it into the container - local dropped = mcl_util.move_item_container(pos, droppos, nil, stack_id) - -- No container? - if not dropped and not dropnodedef.groups.container then - -- Drop item normally - local pos_variation = 100 - droppos = vector.offset(droppos, - math.random(-pos_variation, pos_variation) / 1000, - math.random(-pos_variation, pos_variation) / 1000, - math.random(-pos_variation, pos_variation) / 1000 - ) - local item_entity = minetest.add_item(droppos, dropitem) - local drop_vel = vector.subtract(droppos, pos) - local speed = 3 - item_entity:set_velocity(vector.multiply(drop_vel, speed)) - stack:take_item() - inv:set_stack("main", stack_id, stack) - end + local pos_variation = 100 + droppos = vector.offset(droppos, + math.random(-pos_variation, pos_variation) / 1000, + math.random(-pos_variation, pos_variation) / 1000, + math.random(-pos_variation, pos_variation) / 1000 + ) + local item_entity = minetest.add_item(droppos, dropitem) + local drop_vel = vector.subtract(droppos, pos) + local speed = 3 + item_entity:set_velocity(vector.multiply(drop_vel, speed)) + stack:take_item() + inv:set_stack("main", stack_id, stack) end end, rules = mesecon.rules.alldirs, diff --git a/mods/ITEMS/mcl_blast_furnace/init.lua b/mods/ITEMS/mcl_blast_furnace/init.lua index 51a8f193a..7d0f091d9 100644 --- a/mods/ITEMS/mcl_blast_furnace/init.lua +++ b/mods/ITEMS/mcl_blast_furnace/init.lua @@ -453,7 +453,7 @@ minetest.register_node("mcl_blast_furnace:blast_furnace", { "blast_furnace_side.png", "blast_furnace_front.png" }, paramtype2 = "facedir", - groups = { pickaxey = 1, container = 4, deco_block = 1, material_stone = 1 }, + groups = { pickaxey = 1, container = 2, deco_block = 1, material_stone = 1 }, is_ground_content = false, sounds = mcl_sounds.node_sound_stone_defaults(), @@ -514,6 +514,11 @@ minetest.register_node("mcl_blast_furnace:blast_furnace", { _mcl_blast_resistance = 3.5, _mcl_hardness = 3.5, on_rotate = on_rotate, + _mcl_hoppers_on_try_pull = mcl_furnaces.hoppers_on_try_pull, + _mcl_hoppers_on_try_push = mcl_furnaces.hoppers_on_try_push, + _mcl_hoppers_on_after_push = function(pos) + minetest.get_node_timer(pos):start(1.0) + end, }) minetest.register_node("mcl_blast_furnace:blast_furnace_active", { @@ -531,7 +536,7 @@ minetest.register_node("mcl_blast_furnace:blast_furnace_active", { paramtype = "light", light_source = LIGHT_ACTIVE_FURNACE, drop = "mcl_blast_furnace:blast_furnace", - groups = { pickaxey = 1, container = 4, deco_block = 1, not_in_creative_inventory = 1, material_stone = 1 }, + groups = { pickaxey = 1, container = 2, deco_block = 1, not_in_creative_inventory = 1, material_stone = 1 }, is_ground_content = false, sounds = mcl_sounds.node_sound_stone_defaults(), on_timer = blast_furnace_node_timer, @@ -574,6 +579,8 @@ minetest.register_node("mcl_blast_furnace:blast_furnace_active", { _mcl_hardness = 3.5, on_rotate = on_rotate, after_rotate = after_rotate_active, + _mcl_hoppers_on_try_pull = mcl_furnaces.hoppers_on_try_pull, + _mcl_hoppers_on_try_push = mcl_furnaces.hoppers_on_try_push, }) minetest.register_craft({ diff --git a/mods/ITEMS/mcl_books/init.lua b/mods/ITEMS/mcl_books/init.lua index e2f391b17..25d93b854 100644 --- a/mods/ITEMS/mcl_books/init.lua +++ b/mods/ITEMS/mcl_books/init.lua @@ -438,7 +438,7 @@ minetest.register_node("mcl_books:bookshelf", { flammable = 3, fire_encouragement = 30, fire_flammability = 20, - container = 1 + container = 2 }, drop = "mcl_books:book 3", sounds = wood_sound, @@ -472,6 +472,12 @@ minetest.register_node("mcl_books:bookshelf", { on_blast = on_blast, on_rightclick = bookshelf_gui, on_destruct = close_forms, + _mcl_hoppers_on_try_push = function(pos, hop_pos, hop_inv, hop_list) + local meta = minetest.get_meta(pos) + local inv = meta:get_inventory() + return inv, "main", mcl_util.select_stack(hop_inv, hop_list, inv, "main", + function(stack) return minetest.get_item_group(stack:get_name(), "book") == 1 or stack:get_name() == "mcl_enchanting:book_enchanted" end) + end, }) minetest.register_craft({ diff --git a/mods/ITEMS/mcl_brewing/init.lua b/mods/ITEMS/mcl_brewing/init.lua index 9c6879430..cb5374d81 100644 --- a/mods/ITEMS/mcl_brewing/init.lua +++ b/mods/ITEMS/mcl_brewing/init.lua @@ -376,13 +376,41 @@ local function allow_take(pos, listname, index, stack, player) end end +local function hoppers_on_try_push(pos, hop_pos, hop_inv, hop_list) + local meta = minetest.get_meta(pos) + local inv = meta:get_inventory() + if math.abs(pos.y - hop_pos.y) > math.abs(pos.x - hop_pos.x) and math.abs(pos.y - hop_pos.y) > math.abs(pos.z - hop_pos.z) then + return inv, "input", mcl_util.select_stack(hop_inv, hop_list, inv, "input", + function(stack) return minetest.get_item_group(stack:get_name(), "brewitem") == 1 and minetest.get_item_group(stack:get_name(), "bottle") == 0 end) + else + local stack = mcl_util.select_stack(hop_inv, hop_list, inv, "fuel", function(stack) return stack:get_name() == "mcl_mobitems:blaze_powder" end) + if stack then + return inv, "fuel", stack + else + return inv, "stand", mcl_util.select_stack(hop_inv, hop_list, inv, "stand", + function(stack) return minetest.get_item_group(stack:get_name(), "bottle") == 1 end) + end + end +end + +local function hoppers_on_try_pull(pos, hop_pos, hop_inv, hop_list) + local meta = minetest.get_meta(pos) + local stand_timer = meta:get_float("stand_timer") or 0 + if stand_timer > 0 then + return nil, nil, nil + end + + local inv = meta:get_inventory() + local stack = mcl_util.select_stack(inv, "stand", hop_inv, hop_list) + return inv, "stand", stack +end minetest.register_node("mcl_brewing:stand_000", { description = S("Brewing Stand"), _doc_items_longdesc = S("The stand allows you to brew potions!"), _doc_items_usagehelp = doc_string, _tt_help = S("Brew Potions"), - groups = {pickaxey=1, brewitem=1 }, + groups = {pickaxey=1, container = 2, brewitem=1 }, tiles = tiles, use_texture_alpha = minetest.features.use_texture_alpha_string_modes and "clip" or true, drop = "mcl_brewing:stand", @@ -444,12 +472,20 @@ minetest.register_node("mcl_brewing:stand_000", { on_timer = brewing_stand_timer, on_rotate = on_rotate, + _mcl_hoppers_on_try_push = hoppers_on_try_push, + _mcl_hoppers_on_try_pull = hoppers_on_try_pull, + _mcl_hoppers_on_after_push = function(pos) + on_put(pos, nil, nil, nil, nil) + end, + _mcl_hoppers_on_after_pull = function(pos) + on_put(pos, nil, nil, nil, nil) + end, }) minetest.register_node("mcl_brewing:stand_100", { description = S("Brewing Stand"), _doc_items_create_entry = false, _tt_help = S("Brew Potions"), - groups = {pickaxey=1, not_in_creative_inventory = 1, not_in_craft_guide = 1}, + groups = { pickaxey=1, container = 2, not_in_creative_inventory = 1, not_in_craft_guide = 1 }, tiles = tiles, use_texture_alpha = minetest.features.use_texture_alpha_string_modes and "clip" or true, drop = "mcl_brewing:stand", @@ -514,13 +550,21 @@ minetest.register_node("mcl_brewing:stand_100", { end, on_timer = brewing_stand_timer, on_rotate = on_rotate, + _mcl_hoppers_on_try_push = hoppers_on_try_push, + _mcl_hoppers_on_try_pull = hoppers_on_try_pull, + _mcl_hoppers_on_after_push = function(pos) + on_put(pos, nil, nil, nil, nil) + end, + _mcl_hoppers_on_after_pull = function(pos) + on_put(pos, nil, nil, nil, nil) + end, }) minetest.register_node("mcl_brewing:stand_010", { description = S("Brewing Stand"), _doc_items_create_entry = false, _tt_help = S("Brew Potions"), - groups = {pickaxey=1, not_in_creative_inventory = 1, not_in_craft_guide = 1}, + groups = {pickaxey=1, container = 2, not_in_creative_inventory = 1, not_in_craft_guide = 1}, tiles = tiles, use_texture_alpha = minetest.features.use_texture_alpha_string_modes and "clip" or true, drop = "mcl_brewing:stand", @@ -586,13 +630,21 @@ minetest.register_node("mcl_brewing:stand_010", { end, on_timer = brewing_stand_timer, on_rotate = on_rotate, + _mcl_hoppers_on_try_push = hoppers_on_try_push, + _mcl_hoppers_on_try_pull = hoppers_on_try_pull, + _mcl_hoppers_on_after_push = function(pos) + on_put(pos, nil, nil, nil, nil) + end, + _mcl_hoppers_on_after_pull = function(pos) + on_put(pos, nil, nil, nil, nil) + end, }) minetest.register_node("mcl_brewing:stand_001", { description = S("Brewing Stand"), _doc_items_create_entry = false, _tt_help = S("Brew Potions"), - groups = {pickaxey=1, not_in_creative_inventory = 1, not_in_craft_guide = 1}, + groups = {pickaxey=1, container = 2, not_in_creative_inventory = 1, not_in_craft_guide = 1}, tiles = tiles, use_texture_alpha = minetest.features.use_texture_alpha_string_modes and "clip" or true, drop = "mcl_brewing:stand", @@ -653,13 +705,21 @@ minetest.register_node("mcl_brewing:stand_001", { end, on_timer = brewing_stand_timer, on_rotate = on_rotate, + _mcl_hoppers_on_try_push = hoppers_on_try_push, + _mcl_hoppers_on_try_pull = hoppers_on_try_pull, + _mcl_hoppers_on_after_push = function(pos) + on_put(pos, nil, nil, nil, nil) + end, + _mcl_hoppers_on_after_pull = function(pos) + on_put(pos, nil, nil, nil, nil) + end, }) minetest.register_node("mcl_brewing:stand_110", { description = S("Brewing Stand"), _doc_items_create_entry = false, _tt_help = S("Brew Potions"), - groups = {pickaxey=1, not_in_creative_inventory = 1, not_in_craft_guide = 1}, + groups = {pickaxey=1, container = 2, not_in_creative_inventory = 1, not_in_craft_guide = 1}, tiles = tiles, use_texture_alpha = minetest.features.use_texture_alpha_string_modes and "clip" or true, drop = "mcl_brewing:stand", @@ -730,13 +790,21 @@ minetest.register_node("mcl_brewing:stand_110", { end, on_timer = brewing_stand_timer, on_rotate = on_rotate, + _mcl_hoppers_on_try_push = hoppers_on_try_push, + _mcl_hoppers_on_try_pull = hoppers_on_try_pull, + _mcl_hoppers_on_after_push = function(pos) + on_put(pos, nil, nil, nil, nil) + end, + _mcl_hoppers_on_after_pull = function(pos) + on_put(pos, nil, nil, nil, nil) + end, }) minetest.register_node("mcl_brewing:stand_101", { description = S("Brewing Stand"), _doc_items_create_entry = false, _tt_help = S("Brew Potions"), - groups = {pickaxey=1, not_in_creative_inventory = 1, not_in_craft_guide = 1}, + groups = {pickaxey=1, container = 2, not_in_creative_inventory = 1, not_in_craft_guide = 1}, tiles = tiles, use_texture_alpha = minetest.features.use_texture_alpha_string_modes and "clip" or true, drop = "mcl_brewing:stand", @@ -803,13 +871,21 @@ minetest.register_node("mcl_brewing:stand_101", { end, on_timer = brewing_stand_timer, on_rotate = on_rotate, + _mcl_hoppers_on_try_push = hoppers_on_try_push, + _mcl_hoppers_on_try_pull = hoppers_on_try_pull, + _mcl_hoppers_on_after_push = function(pos) + on_put(pos, nil, nil, nil, nil) + end, + _mcl_hoppers_on_after_pull = function(pos) + on_put(pos, nil, nil, nil, nil) + end, }) minetest.register_node("mcl_brewing:stand_011", { description = S("Brewing Stand"), _doc_items_create_entry = false, _tt_help = S("Brew Potions"), - groups = {pickaxey=1, not_in_creative_inventory = 1, not_in_craft_guide = 1}, + groups = {pickaxey=1, container = 2, not_in_creative_inventory = 1, not_in_craft_guide = 1}, tiles = tiles, use_texture_alpha = minetest.features.use_texture_alpha_string_modes and "clip" or true, drop = "mcl_brewing:stand", @@ -876,13 +952,21 @@ minetest.register_node("mcl_brewing:stand_011", { end, on_timer = brewing_stand_timer, on_rotate = on_rotate, + _mcl_hoppers_on_try_push = hoppers_on_try_push, + _mcl_hoppers_on_try_pull = hoppers_on_try_pull, + _mcl_hoppers_on_after_push = function(pos) + on_put(pos, nil, nil, nil, nil) + end, + _mcl_hoppers_on_after_pull = function(pos) + on_put(pos, nil, nil, nil, nil) + end, }) minetest.register_node("mcl_brewing:stand_111", { description = S("Brewing Stand"), _doc_items_create_entry = false, _tt_help = S("Brew Potions"), - groups = {pickaxey=1, not_in_creative_inventory = 1, not_in_craft_guide = 1}, + groups = {pickaxey=1, container = 2, not_in_creative_inventory = 1, not_in_craft_guide = 1}, tiles = tiles, use_texture_alpha = minetest.features.use_texture_alpha_string_modes and "clip" or true, drop = "mcl_brewing:stand", @@ -956,6 +1040,14 @@ minetest.register_node("mcl_brewing:stand_111", { end, on_timer = brewing_stand_timer, on_rotate = on_rotate, + _mcl_hoppers_on_try_push = hoppers_on_try_push, + _mcl_hoppers_on_try_pull = hoppers_on_try_pull, + _mcl_hoppers_on_after_push = function(pos) + on_put(pos, nil, nil, nil, nil) + end, + _mcl_hoppers_on_after_pull = function(pos) + on_put(pos, nil, nil, nil, nil) + end, }) minetest.register_craft({ diff --git a/mods/ITEMS/mcl_chests/init.lua b/mods/ITEMS/mcl_chests/init.lua index 6f3272149..38b1102a3 100644 --- a/mods/ITEMS/mcl_chests/init.lua +++ b/mods/ITEMS/mcl_chests/init.lua @@ -10,6 +10,8 @@ local sf = string.format local mod_doc = minetest.get_modpath("doc") +mcl_chests = {} + -- Christmas chest setup local it_is_christmas = false local date = os.date("*t") @@ -596,7 +598,7 @@ local function register_chest(basename, desc, longdesc, usagehelp, tt_help, tile groups = { handy = 1, axey = 1, - container = 5, + container = 2, not_in_creative_inventory = 1, material_wood = 1, flammable = -1, @@ -751,6 +753,34 @@ local function register_chest(basename, desc, longdesc, usagehelp, tt_help, tile end, mesecons = mesecons, on_rotate = no_rotate, + _mcl_hoppers_on_try_pull = function(pos, hop_pos, hop_inv, hop_list) + local meta = minetest.get_meta(pos) + local inv = meta:get_inventory() + local stack_id = mcl_util.select_stack(inv, "main", hop_inv, hop_list) + if stack_id ~= nil then + return inv, "main", stack_id + end + local node = minetest.get_node(pos) + local pos_other = mcl_util.get_double_container_neighbor_pos(pos, node.param2, "left") + local meta_other = minetest.get_meta(pos_other) + local inv_other = meta_other:get_inventory() + stack_id = mcl_util.select_stack(inv_other, "main", hop_inv, hop_list) + return inv_other, "main", stack_id + end, + _mcl_hoppers_on_try_push = function(pos, hop_pos, hop_inv, hop_list) + local meta = minetest.get_meta(pos) + local inv = meta:get_inventory() + local stack_id = mcl_util.select_stack(hop_inv, hop_list, inv, "main") + if stack_id ~= nil then + return inv, "main", stack_id + end + local node = minetest.get_node(pos) + local pos_other = mcl_util.get_double_container_neighbor_pos(pos, node.param2, "left") + local meta_other = minetest.get_meta(pos_other) + local inv_other = meta_other:get_inventory() + stack_id = mcl_util.select_stack(hop_inv, hop_list, inv_other, "main") + return inv_other, "main", stack_id + end, }) minetest.register_node("mcl_chests:" .. basename .. "_right", { @@ -766,7 +796,7 @@ local function register_chest(basename, desc, longdesc, usagehelp, tt_help, tile groups = { handy = 1, axey = 1, - container = 6, + container = 2, not_in_creative_inventory = 1, material_wood = 1, flammable = -1, @@ -916,6 +946,34 @@ local function register_chest(basename, desc, longdesc, usagehelp, tt_help, tile end, mesecons = mesecons, on_rotate = no_rotate, + _mcl_hoppers_on_try_pull = function(pos, hop_pos, hop_inv, hop_list) + local node = minetest.get_node(pos) + local pos_other = mcl_util.get_double_container_neighbor_pos(pos, node.param2, "right") + local meta_other = minetest.get_meta(pos_other) + local inv_other = meta_other:get_inventory() + local stack_id = mcl_util.select_stack(inv_other, "main", hop_inv, hop_list) + if stack_id ~= nil then + return inv_other, "main", stack_id + end + local meta = minetest.get_meta(pos) + local inv = meta:get_inventory() + stack_id = mcl_util.select_stack(inv, "main", hop_inv, hop_list) + return inv, "main", stack_id + end, + _mcl_hoppers_on_try_push = function(pos, hop_pos, hop_inv, hop_list) + local node = minetest.get_node(pos) + local pos_other = mcl_util.get_double_container_neighbor_pos(pos, node.param2, "right") + local meta_other = minetest.get_meta(pos_other) + local inv_other = meta_other:get_inventory() + local stack_id = mcl_util.select_stack(hop_inv, hop_list, inv_other, "main") + if stack_id ~= nil then + return inv_other, "main", stack_id + end + local meta = minetest.get_meta(pos) + local inv = meta:get_inventory() + stack_id = mcl_util.select_stack(hop_inv, hop_list, inv, "main") + return inv, "main", stack_id + end, }) if mod_doc then @@ -1305,7 +1363,7 @@ for color, desc in pairs(boxtypes) do groups = { handy = 1, pickaxey = 1, - container = 3, + container = 2, deco_block = 1, dig_by_piston = 1, shulker_box = 1, @@ -1378,7 +1436,7 @@ for color, desc in pairs(boxtypes) do groups = { handy = 1, pickaxey = 1, - container = 3, + container = 2, deco_block = 1, dig_by_piston = 1, shulker_box = 1, @@ -1471,6 +1529,11 @@ for color, desc in pairs(boxtypes) do end, _mcl_blast_resistance = 6, _mcl_hardness = 2, + _mcl_hoppers_on_try_push = function(pos, hop_pos, hop_inv, hop_list) + local meta = minetest.get_meta(pos) + local inv = meta:get_inventory() + return inv, "main", mcl_util.select_stack(hop_inv, hop_list, inv, "main", mcl_chests.is_not_shulker_box) + end, }) if mod_doc and not is_canonical then @@ -1487,6 +1550,14 @@ for color, desc in pairs(boxtypes) do }) end +--- Returns false if itemstack is a shulker box +---@param itemstack ItemStack +---@return boolean +function mcl_chests.is_not_shulker_box(stack) + local g = minetest.get_item_group(stack:get_name(), "shulker_box") + return g == 0 or g == nil +end + minetest.register_craft({ output = "mcl_chests:violet_shulker_box", recipe = { diff --git a/mods/ITEMS/mcl_composters/init.lua b/mods/ITEMS/mcl_composters/init.lua index d60422afd..5a67ef92b 100644 --- a/mods/ITEMS/mcl_composters/init.lua +++ b/mods/ITEMS/mcl_composters/init.lua @@ -81,34 +81,44 @@ local function composter_add_item(pos, node, player, itemstack, pointed_thing) max_hear_distance = 16, }, true) end - -- calculate leveling up chance - local rand = math.random(0,100) - if chance >= rand then - -- get current compost level - local level = registered_nodes[node.name]["_mcl_compost_level"] - -- spawn green particles above new layer - mcl_dye.add_bone_meal_particle(vector_offset(pos, 0, level/8, 0)) - -- update composter block - if level < 7 then - level = level + 1 - else - level = "ready" - end - swap_node(pos, {name = "mcl_composters:composter_" .. level}) - minetest.sound_play({name="default_grass_footstep", gain=0.4}, { - pos = pos, - gain= 0.4, - max_hear_distance = 16, - }, true) - -- a full composter becomes ready for harvest after one second - -- the block will get updated by the node timer callback set in node reg def - if level == 7 then - local timer = get_node_timer(pos) + composter_progress_chance(pos, node, chance) + end + return itemstack +end + +--- Math and node swap during compost progression +---@param pos Vector Position of the node +---@param node node +---@param chance integer Value of "compostability" group of inserted item +function composter_progress_chance(pos, node, chance) + -- calculate leveling up chance + local rand = math.random(0,100) + if chance >= rand then + -- get current compost level + local level = registered_nodes[node.name]["_mcl_compost_level"] + -- spawn green particles above new layer + mcl_dye.add_bone_meal_particle(vector_offset(pos, 0, level/8, 0)) + -- update composter block + if level < 7 then + level = level + 1 + else + level = "ready" + end + swap_node(pos, {name = "mcl_composters:composter_" .. level}) + minetest.sound_play({name="default_grass_footstep", gain=0.4}, { + pos = pos, + gain= 0.4, + max_hear_distance = 16, + }, true) + -- a full composter becomes ready for harvest after one second + -- the block will get updated by the node timer callback set in node reg def + if level == 7 then + local timer = get_node_timer(pos) + if not timer:is_started() then timer:start(1) end end end - return itemstack end --- Update a full composter block to ready for harvesting. @@ -147,6 +157,10 @@ local function composter_harvest(pos, node, player, itemstack, pointed_thing) record_protection_violation(pos, name) return itemstack end + local meta = minetest.get_meta(pos) + local inv = meta:get_inventory() + --remove bone meal from internal inventory + inv:set_stack("dst", 1, ItemStack()) -- reset ready type composter to empty type swap_node(pos, {name="mcl_composters:composter"}) -- spawn bone meal item @@ -175,6 +189,14 @@ local function composter_get_nodeboxes(level) } end +local function hopper_push_condition(stack) + local chance = get_item_group(stack:get_name(), "compostability") + if chance > 0 then + return true + end + return false +end + --- Register empty composter node. -- -- This is the craftable base model that can be placed in an inventory. @@ -197,12 +219,40 @@ minetest.register_node("mcl_composters:composter", { groups = { handy=1, material_wood=1, deco_block=1, dirtifier=1, flammable=2, fire_encouragement=3, fire_flammability=4, + container = 2 }, sounds = mcl_sounds.node_sound_wood_defaults(), _mcl_hardness = 0.6, _mcl_blast_resistance = 0.6, _mcl_compost_level = 0, - on_rightclick = composter_add_item + on_rightclick = composter_add_item, + on_construct = function(pos) + local meta = minetest.get_meta(pos) + local inv = meta:get_inventory() + inv:set_size("src", 1) + inv:set_size("dst", 1) + end, + _mcl_hoppers_on_try_pull = function(pos, hop_pos, hop_inv, hop_list) + return nil, nil, nil + end, + _mcl_hoppers_on_try_push = function(pos, hop_pos, hop_inv, hop_list) + local meta = minetest.get_meta(pos) + local inv = meta:get_inventory() + return inv, "src", mcl_util.select_stack(hop_inv, hop_list, inv, "src", hopper_push_condition) + end, + _mcl_hoppers_on_after_push = function(pos) + local meta = minetest.get_meta(pos) + local inv = meta:get_inventory() + local stack = inv:get_stack("src", 1) + if not stack:is_empty() then + local chance = get_item_group(stack:get_name(), "compostability") + if chance > 0 then + local node = minetest.get_node(pos) + composter_progress_chance(pos, node, chance) + end + end + inv:remove_item("src", stack) + end, }) --- Template function for composters with compost. @@ -228,7 +278,7 @@ local function register_filled_composter(level) handy=1, material_wood=1, deco_block=1, dirtifier=1, not_in_creative_inventory=1, not_in_craft_guide=1, flammable=2, fire_encouragement=3, fire_flammability=4, - comparator_signal=level + comparator_signal=level, container = 2 }, sounds = mcl_sounds.node_sound_wood_defaults(), drop = "mcl_composters:composter", @@ -236,7 +286,28 @@ local function register_filled_composter(level) _mcl_blast_resistance = 0.6, _mcl_compost_level = level, on_rightclick = composter_add_item, - on_timer = composter_ready + on_timer = composter_ready, + _mcl_hoppers_on_try_pull = function(pos, hop_pos, hop_inv, hop_list) + return nil, nil, nil + end, + _mcl_hoppers_on_try_push = function(pos, hop_pos, hop_inv, hop_list) + local meta = minetest.get_meta(pos) + local inv = meta:get_inventory() + return inv, "src", mcl_util.select_stack(hop_inv, hop_list, inv, "src", hopper_push_condition) + end, + _mcl_hoppers_on_after_push = function(pos) + local meta = minetest.get_meta(pos) + local inv = meta:get_inventory() + local stack = inv:get_stack("src", 1) + if not stack:is_empty() then + local chance = get_item_group(stack:get_name(), "compostability") + if chance > 0 then + local node = minetest.get_node(pos) + composter_progress_chance(pos, node, chance) + end + end + inv:remove_item("src", stack) + end, }) -- Add entry aliases for the Help @@ -270,14 +341,32 @@ minetest.register_node("mcl_composters:composter_ready", { handy=1, material_wood=1, deco_block=1, dirtifier=1, not_in_creative_inventory=1, not_in_craft_guide=1, flammable=2, fire_encouragement=3, fire_flammability=4, - comparator_signal=8 + comparator_signal=8, container = 2 }, sounds = mcl_sounds.node_sound_wood_defaults(), drop = "mcl_composters:composter", _mcl_hardness = 0.6, _mcl_blast_resistance = 0.6, _mcl_compost_level = 7, - on_rightclick = composter_harvest + on_rightclick = composter_harvest, + _mcl_hoppers_on_try_push = function(pos, hop_pos, hop_inv, hop_list) + return nil, nil, nil + end, + _mcl_hoppers_on_try_pull = function(pos, hop_pos, hop_inv, hop_list) + local meta = minetest.get_meta(pos) + local inv = meta:get_inventory() + --remove bone meal from internal inventory + inv:set_stack("dst", 1, ItemStack()) + inv:add_item("dst", "mcl_bone_meal:bone_meal") + local stack = inv:get_stack("dst", 1) + if not stack:is_empty() and hop_inv:room_for_item(hop_list, stack) then + return inv, "dst", 1 + end + return nil, nil, nil + end, + _mcl_hoppers_on_after_pull = function(pos) + minetest.swap_node(pos, {name = "mcl_composters:composter"}) + end, }) -- Add entry aliases for the Help diff --git a/mods/ITEMS/mcl_composters/mod.conf b/mods/ITEMS/mcl_composters/mod.conf index 86d729887..ed6119d3a 100644 --- a/mods/ITEMS/mcl_composters/mod.conf +++ b/mods/ITEMS/mcl_composters/mod.conf @@ -1,5 +1,5 @@ name = mcl_composters author = kabou description = Composters can convert various organic items into bonemeal. -depends = mcl_core, mcl_sounds, mcl_dye +depends = mcl_core, mcl_sounds, mcl_dye, mcl_hoppers optional_depends = doc diff --git a/mods/ITEMS/mcl_furnaces/init.lua b/mods/ITEMS/mcl_furnaces/init.lua index 9cb8ffb16..74e2efecb 100644 --- a/mods/ITEMS/mcl_furnaces/init.lua +++ b/mods/ITEMS/mcl_furnaces/init.lua @@ -4,6 +4,8 @@ local F = minetest.formspec_escape local LIGHT_ACTIVE_FURNACE = 13 +mcl_furnaces = {} + -- -- Formspecs -- @@ -445,6 +447,31 @@ local function furnace_node_timer(pos, elapsed) return result end +function mcl_furnaces.hoppers_on_try_pull(pos, hop_pos, hop_inv, hop_list) + local meta = minetest.get_meta(pos) + local inv = meta:get_inventory() + local stack = inv:get_stack("dst", 1) + if not stack:is_empty() and hop_inv:room_for_item(hop_list, stack) then + return inv, "dst", 1 + end + -- Allow empty bucket extraction + stack = inv:get_stack("fuel", 1) + if not stack:is_empty() and not mcl_util.is_fuel(stack) and hop_inv:room_for_item(hop_list, stack) then + return inv, "fuel", 1 + end + return nil, nil, nil +end + +function mcl_furnaces.hoppers_on_try_push(pos, hop_pos, hop_inv, hop_list) + local meta = minetest.get_meta(pos) + local inv = meta:get_inventory() + if math.abs(pos.y - hop_pos.y) > math.abs(pos.x - hop_pos.x) and math.abs(pos.y - hop_pos.y) > math.abs(pos.z - hop_pos.z) then + return inv, "src", mcl_util.select_stack(hop_inv, hop_list, inv, "src") + else + return inv, "fuel", mcl_util.select_stack(hop_inv, hop_list, inv, "fuel", mcl_util.is_fuel) + end +end + local on_rotate, after_rotate_active if minetest.get_modpath("screwdriver") then on_rotate = screwdriver.rotate_simple @@ -475,7 +502,7 @@ minetest.register_node("mcl_furnaces:furnace", { "default_furnace_side.png", "default_furnace_front.png" }, paramtype2 = "facedir", - groups = { pickaxey = 1, container = 4, deco_block = 1, material_stone = 1 }, + groups = { pickaxey = 1, container = 2, deco_block = 1, material_stone = 1 }, is_ground_content = false, sounds = mcl_sounds.node_sound_stone_defaults(), @@ -538,6 +565,11 @@ minetest.register_node("mcl_furnaces:furnace", { _mcl_blast_resistance = 3.5, _mcl_hardness = 3.5, on_rotate = on_rotate, + _mcl_hoppers_on_try_pull = mcl_furnaces.hoppers_on_try_pull, + _mcl_hoppers_on_try_push = mcl_furnaces.hoppers_on_try_push, + _mcl_hoppers_on_after_push = function(pos) + minetest.get_node_timer(pos):start(1.0) + end, }) minetest.register_node("mcl_furnaces:furnace_active", { @@ -552,7 +584,7 @@ minetest.register_node("mcl_furnaces:furnace_active", { paramtype = "light", light_source = LIGHT_ACTIVE_FURNACE, drop = "mcl_furnaces:furnace", - groups = { pickaxey = 1, container = 4, deco_block = 1, not_in_creative_inventory = 1, material_stone = 1 }, + groups = { pickaxey = 1, container = 2, deco_block = 1, not_in_creative_inventory = 1, material_stone = 1 }, is_ground_content = false, sounds = mcl_sounds.node_sound_stone_defaults(), on_timer = furnace_node_timer, @@ -592,6 +624,8 @@ minetest.register_node("mcl_furnaces:furnace_active", { _mcl_hardness = 3.5, on_rotate = on_rotate, after_rotate = after_rotate_active, + _mcl_hoppers_on_try_pull = mcl_furnaces.hoppers_on_try_pull, + _mcl_hoppers_on_try_push = mcl_furnaces.hoppers_on_try_push, }) minetest.register_craft({ diff --git a/mods/ITEMS/mcl_hoppers/init.lua b/mods/ITEMS/mcl_hoppers/init.lua index b4378b21b..23a511ce5 100644 --- a/mods/ITEMS/mcl_hoppers/init.lua +++ b/mods/ITEMS/mcl_hoppers/init.lua @@ -470,31 +470,38 @@ minetest.register_abm({ if entity and entity.name then --mcl_log("Name of object near: " .. tostring(entity.name)) - if entity.name == "mcl_minecarts:hopper_minecart" or entity.name == "mcl_minecarts:chest_minecart" then + if entity.name == "mcl_minecarts:hopper_minecart" or entity.name == "mcl_minecarts:chest_minecart" or entity.name == "mcl_boats:chest_boat" then local hm_pos = entity.object:get_pos() mcl_log("We have a minecart with inventory close: " .. minetest.pos_to_string(hm_pos)) - --if hm_pos.y == pos.y + 1 then mcl_log("y is correct") end + local ent_pos_y + if entity.name == "mcl_minecarts:hopper_minecart" or entity.name == "mcl_minecarts:chest_minecart" then + ent_pos_y = hm_pos.y + elseif entity.name == "mcl_boats:chest_boat" then + ent_pos_y = math.floor(hm_pos.y + 0.8) + end + + local DIST_FROM_MC = 1.5 + --if ent_pos_y == pos.y - 1 then mcl_log("y is correct") end --if (hm_pos.x >= pos.x - DIST_FROM_MC and hm_pos.x <= pos.x + DIST_FROM_MC) then mcl_log("x is within range") end --if (hm_pos.z >= pos.z - DIST_FROM_MC and hm_pos.z <= pos.z + DIST_FROM_MC) then mcl_log("z is within range") end - local DIST_FROM_MC = 1.5 - if (hm_pos.y == pos.y + 1) + if (ent_pos_y == pos.y + 1) and (hm_pos.x >= pos.x - DIST_FROM_MC and hm_pos.x <= pos.x + DIST_FROM_MC) and (hm_pos.z >= pos.z - DIST_FROM_MC and hm_pos.z <= pos.z + DIST_FROM_MC) then mcl_log("Minecart close enough") if entity.name == "mcl_minecarts:hopper_minecart" then hopper_pull_from_mc(entity, pos, 5) - elseif entity.name == "mcl_minecarts:chest_minecart" then + elseif entity.name == "mcl_minecarts:chest_minecart" or entity.name == "mcl_boats:chest_boat" then hopper_pull_from_mc(entity, pos, 27) end - elseif (hm_pos.y == pos.y - 1) + elseif (ent_pos_y == pos.y - 1) and (hm_pos.x >= pos.x - DIST_FROM_MC and hm_pos.x <= pos.x + DIST_FROM_MC) and (hm_pos.z >= pos.z - DIST_FROM_MC and hm_pos.z <= pos.z + DIST_FROM_MC) then mcl_log("Minecart close enough") if entity.name == "mcl_minecarts:hopper_minecart" then hopper_push_to_mc(entity, pos, 5) - elseif entity.name == "mcl_minecarts:chest_minecart" then + elseif entity.name == "mcl_minecarts:chest_minecart" or entity.name == "mcl_boats:chest_boat" then hopper_push_to_mc(entity, pos, 27) end end @@ -545,25 +552,7 @@ minetest.register_abm({ end, }) ----Returns true if itemstack is fuel, but not for lava bucket if destination already has one ----@param itemstack ItemStack ----@param src_inventory InvRef ----@param src_list string ----@param dst_inventory InvRef ----@param dst_list string ----@return boolean -local function is_transferrable_fuel(itemstack, src_inventory, src_list, dst_inventory, dst_list) - if mcl_util.is_fuel(itemstack) then - if itemstack:get_name() == "mcl_buckets:bucket_lava" then - return dst_inventory:is_empty(dst_list) - else - return true - end - else - return false - end -end - +-- Register push/pull for "straight" hopper minetest.register_abm({ label = "Hopper/container item exchange", nodenames = { "mcl_hoppers:hopper" }, @@ -571,31 +560,26 @@ minetest.register_abm({ interval = 1.0, chance = 1, action = function(pos, node, active_object_count, active_object_count_wider) - -- Get node pos' for item transfer - local uppos = vector.offset(pos, 0, 1, 0) - local downpos = vector.offset(pos, 0, -1, 0) - - -- Suck an item from the container above into the hopper - local upnode = minetest.get_node(uppos) - if not minetest.registered_nodes[upnode.name] then return end - local g = minetest.get_item_group(upnode.name, "container") - local sucked = mcl_util.move_item_container(uppos, pos) - - -- Also suck in non-fuel items from furnace fuel slot - if not sucked and g == 4 then - local finv = minetest.get_inventory({type = "node", pos = uppos}) - if finv and not mcl_util.is_fuel(finv:get_stack("fuel", 1)) then - mcl_util.move_item_container(uppos, pos, "fuel") - end + if minetest.get_node_timer(pos):is_started() then + return end - -- Move an item from the hopper into container below - local downnode = minetest.get_node(downpos) - if not minetest.registered_nodes[downnode.name] then return end - mcl_util.move_item_container(pos, downpos) + -- Move from internal inventory to dst first + local dst_pos = vector.offset(pos, 0, -1, 0) + local pushed = mcl_util.hopper_push(pos, dst_pos) + + local src_pos = vector.offset(pos, 0, 1, 0) + mcl_util.hopper_pull(pos, src_pos) + + local dst_node = minetest.get_node(dst_pos) + if pushed and (dst_node.name == "mcl_hoppers:hopper" or dst_node.name == "mcl_hoppers:hopper_side") then + --Pause destination hopper + minetest.get_node_timer(dst_pos):start(1.0) + end end, }) +-- Register push/pull for "bent" hopper minetest.register_abm({ label = "Side-hopper/container item exchange", nodenames = { "mcl_hoppers:hopper_side" }, @@ -603,164 +587,36 @@ minetest.register_abm({ interval = 1.0, chance = 1, action = function(pos, node, active_object_count, active_object_count_wider) + if minetest.get_node_timer(pos):is_started() then + --Pause if already recived item this tick + return + end + -- Determine to which side the hopper is facing, get nodes local face = minetest.get_node(pos).param2 - local front = {} + local dst_pos = {} if face == 0 then - front = vector.offset(pos, -1, 0, 0) + dst_pos = vector.offset(pos, -1, 0, 0) elseif face == 1 then - front = vector.offset(pos, 0, 0, 1) + dst_pos = vector.offset(pos, 0, 0, 1) elseif face == 2 then - front = vector.offset(pos, 1, 0, 0) + dst_pos = vector.offset(pos, 1, 0, 0) elseif face == 3 then - front = vector.offset(pos, 0, 0, -1) + dst_pos = vector.offset(pos, 0, 0, -1) end - local above = vector.offset(pos, 0, 1, 0) - - local frontnode = minetest.get_node(front) - if not minetest.registered_nodes[frontnode.name] then return end - - -- Suck an item from the container above into the hopper - local abovenode = minetest.get_node(above) - if not minetest.registered_nodes[abovenode.name] then return end - local g = minetest.get_item_group(abovenode.name, "container") - local sucked = mcl_util.move_item_container(above, pos) - - -- Also suck in non-fuel items from furnace fuel slot - if not sucked and g == 4 then - local finv = minetest.get_inventory({type = "node", pos = above}) - if finv and not mcl_util.is_fuel(finv:get_stack("fuel", 1)) then - mcl_util.move_item_container(above, pos, "fuel") - end + local pushed = mcl_util.hopper_push(pos, dst_pos) + + local src_pos = vector.offset(pos, 0, 1, 0) + mcl_util.hopper_pull(pos, src_pos) + + local dst_node = minetest.get_node(dst_pos) + if pushed and (dst_node.name == "mcl_hoppers:hopper" or dst_node.name == "mcl_hoppers:hopper_side") then + --Pause destination hopper + minetest.get_node_timer(dst_pos):start(1.0) end - - -- Move an item from the hopper into the container to which the hopper points to - local g = minetest.get_item_group(frontnode.name, "container") - if g == 2 or g == 3 or g == 5 or g == 6 then - mcl_util.move_item_container(pos, front) - elseif g == 4 then - -- Put fuel into fuel slot - local sinv = minetest.get_inventory({type = "node", pos = pos}) - local dinv = minetest.get_inventory({type = "node", pos = front}) - local slot_id, _ = mcl_util.get_eligible_transfer_item_slot(sinv, "main", dinv, "fuel", is_transferrable_fuel) - if slot_id then - mcl_util.move_item_container(pos, front, nil, slot_id, "fuel") - end - end - end + end, }) -if minetest.get_modpath("mcl_composters") then - minetest.register_abm({ - label = "Bonemeal extraction from composter", - nodenames = {"mcl_hoppers:hopper", "mcl_hoppers:hopper_side"}, - neighbors = {"mcl_composters:composter_ready"}, - interval = 1.0, - chance = 1, - action = function(pos, node, active_object_count, active_object_count_wider) - local uppos = vector.offset(pos, 0, 1, 0) - --local downpos = vector.offset(pos, 0, -1, 0) - - -- Get bonemeal from composter above - local upnode = minetest.get_node(uppos) - if upnode.name == "mcl_composters:composter_ready" then - local meta = minetest.get_meta(pos) - local inv = meta:get_inventory() - - minetest.swap_node(uppos, {name = "mcl_composters:composter"}) - - inv:add_item("main", "mcl_bone_meal:bone_meal") - end - end, - }) - - ---@param node node - ---@return integer? - ---@nodiscard - local function composter_level(node) - local nn = node.name - if nn == "mcl_composters:composter" then - return 0 - elseif nn == "mcl_composters:composter_1" then - return 1 - elseif nn == "mcl_composters:composter_2" then - return 2 - elseif nn == "mcl_composters:composter_3" then - return 3 - elseif nn == "mcl_composters:composter_4" then - return 4 - elseif nn == "mcl_composters:composter_5" then - return 5 - elseif nn == "mcl_composters:composter_6" then - return 6 - elseif nn == "mcl_composters:composter_7" then - return 7 - else - return nil - end - end - - for i = 1, 7 do - assert(composter_level({name = "mcl_composters:composter_" .. i}) == i) - end - - assert(composter_level({name = "mcl_composters:composter"}) == 0) - assert(composter_level({name = "mcl_composters:some_other_node"}) == nil) - - minetest.register_abm({ - label = "Add compostable items on composter", - nodenames = {"mcl_hoppers:hopper"}, - neighbors = { - "mcl_composters:composter", - "mcl_composters:composter_1", - "mcl_composters:composter_2", - "mcl_composters:composter_3", - "mcl_composters:composter_4", - "mcl_composters:composter_5", - "mcl_composters:composter_6", - "mcl_composters:composter_7", - }, - interval = 1.0, - chance = 1, - action = function(pos, node, active_object_count, active_object_count_wider) - --local uppos = vector.offset(pos, 0, 1, 0) - local downpos = vector.offset(pos, 0, -1, 0) - - local downnode = minetest.get_node(downpos) - - ---@type integer|string|nil - local level = composter_level(downnode) - - --Consume compostable items and update composter below - if level then - local meta = minetest.get_meta(pos) - local inv = meta:get_inventory() - - for i = 1, 5 do - local stack = inv:get_stack("main", i) - local compchance = minetest.get_item_group(stack:get_name(), "compostability") - - if compchance > 0 then - stack:take_item() - inv:set_stack("main", i, stack) - - if compchance >= math.random(0, 100) then - mcl_dye.add_bone_meal_particle(vector.offset(downpos, 0, level / 8, 0)) - if level < 7 then - level = level + 1 - else - level = "ready" - end - minetest.swap_node(downpos, {name = "mcl_composters:composter_" .. level}) - end - break - end - end - end - end, - }) -end - minetest.register_craft({ output = "mcl_hoppers:hopper", recipe = { diff --git a/mods/ITEMS/mcl_itemframes/item_frames_API.lua b/mods/ITEMS/mcl_itemframes/item_frames_API.lua index 999becf05..dbdaa313d 100644 --- a/mods/ITEMS/mcl_itemframes/item_frames_API.lua +++ b/mods/ITEMS/mcl_itemframes/item_frames_API.lua @@ -638,7 +638,7 @@ function mcl_itemframes.create_base_definitions() paramtype = "light", paramtype2 = "facedir", sunlight_propagates = true, - groups = { dig_immediate = 3, deco_block = 1, dig_by_piston = 1, container = 7, }, -- attached_node_facedir = 1 }, -- allows for more placement options. + groups = { dig_immediate = 3, deco_block = 1, dig_by_piston = 1, container = 1, }, -- attached_node_facedir = 1 }, -- allows for more placement options. sounds = mcl_sounds.node_sound_defaults(), node_placement_prediction = "", diff --git a/mods/ITEMS/mcl_jukebox/init.lua b/mods/ITEMS/mcl_jukebox/init.lua index d817bdac7..e64bc52c7 100644 --- a/mods/ITEMS/mcl_jukebox/init.lua +++ b/mods/ITEMS/mcl_jukebox/init.lua @@ -121,7 +121,7 @@ minetest.register_node("mcl_jukebox:jukebox", { _doc_items_usagehelp = S("Place a music disc into an empty jukebox to insert the music disc and play music. If the jukebox already has a music disc, you will retrieve this music disc first. The music can only be heard by you, not by other players."), tiles = {"mcl_jukebox_top.png", "mcl_jukebox_side.png", "mcl_jukebox_side.png"}, sounds = mcl_sounds.node_sound_wood_defaults(), - groups = {handy=1,axey=1, container=7, deco_block=1, material_wood=1, flammable=-1}, + groups = {handy=1,axey=1, container=1, deco_block=1, material_wood=1, flammable=-1}, is_ground_content = false, on_construct = function(pos) local meta = minetest.get_meta(pos) diff --git a/mods/ITEMS/mcl_potions/init.lua b/mods/ITEMS/mcl_potions/init.lua index 73fcdae16..8e4c53cad 100644 --- a/mods/ITEMS/mcl_potions/init.lua +++ b/mods/ITEMS/mcl_potions/init.lua @@ -256,7 +256,7 @@ minetest.register_craftitem("mcl_potions:water", { stack_max = 1, inventory_image = potion_image("#0022FF"), wield_image = potion_image("#0022FF"), - groups = {brewitem=1, food=3, can_eat_when_full=1, water_bottle=1}, + groups = {brewitem=1, food=3, can_eat_when_full=1, water_bottle=1, bottle=1}, on_place = water_bottle_on_place, _on_dispense = dispense_water_bottle, _dispense_into_walkable = true, @@ -273,7 +273,7 @@ minetest.register_craftitem("mcl_potions:river_water", { stack_max = 1, inventory_image = potion_image("#0044FF"), wield_image = potion_image("#0044FF"), - groups = {brewitem=1, food=3, can_eat_when_full=1, water_bottle=1}, + groups = {brewitem=1, food=3, can_eat_when_full=1, water_bottle=1, bottle=1}, on_place = water_bottle_on_place, _on_dispense = dispense_water_bottle, _dispense_into_walkable = true, diff --git a/mods/ITEMS/mcl_potions/lingering.lua b/mods/ITEMS/mcl_potions/lingering.lua index 17088ad13..46d94cad3 100644 --- a/mods/ITEMS/mcl_potions/lingering.lua +++ b/mods/ITEMS/mcl_potions/lingering.lua @@ -102,7 +102,7 @@ function mcl_potions.register_lingering(name, descr, color, def) _doc_items_longdesc = longdesc, _doc_items_usagehelp = S("Use the “Punch” key to throw it."), inventory_image = lingering_image(color), - groups = {brewitem=1, not_in_creative_inventory=0}, + groups = {brewitem=1, not_in_creative_inventory=0, bottle=1}, on_use = function(item, placer, pointed_thing) local velocity = 10 local dir = placer:get_look_dir(); diff --git a/mods/ITEMS/mcl_potions/potions.lua b/mods/ITEMS/mcl_potions/potions.lua index 57c06c29d..225fffed2 100644 --- a/mods/ITEMS/mcl_potions/potions.lua +++ b/mods/ITEMS/mcl_potions/potions.lua @@ -163,7 +163,7 @@ local function register_potion(def) stack_max = def.stack_max or 1, inventory_image = def.image or potion_image(def.color), wield_image = def.image or potion_image(def.color), - groups = def.groups or {brewitem=1, food=3, can_eat_when_full=1 }, + groups = def.groups or {brewitem=1, food=3, can_eat_when_full=1, bottle=1}, on_place = on_use, on_secondary_use = on_use, }) @@ -260,7 +260,7 @@ local function register_potion(def) stack_max = def.stack_max or 1, inventory_image = def.image or potion_image(def.color), wield_image = def.image or potion_image(def.color), - groups = def.groups or {brewitem=1, food=3, can_eat_when_full=1}, + groups = def.groups or {brewitem=1, food=3, can_eat_when_full=1, bottle=1}, on_place = on_use, on_secondary_use = on_use, }) @@ -343,7 +343,7 @@ local function register_potion(def) stack_max = 1, inventory_image = def.image or potion_image(def.color), wield_image = def.image or potion_image(def.color), - groups = def.groups or {brewitem=1, food=3, can_eat_when_full=1}, + groups = def.groups or {brewitem=1, food=3, can_eat_when_full=1, bottle=1}, on_place = on_use, on_secondary_use = on_use, }) @@ -411,7 +411,7 @@ local awkward_def = { _tt = S("No effect"), _longdesc = S("Has an awkward taste and is used for brewing potions."), color = "#0000FF", - groups = {brewitem=1, food=3, can_eat_when_full=1}, + groups = {brewitem=1, food=3, can_eat_when_full=1, bottle=1}, on_use = minetest.item_eat(0, "mcl_potions:glass_bottle"), } @@ -450,7 +450,7 @@ local dragon_breath_def = { no_effect = true, _longdesc = S("This item is used in brewing and can be combined with splash potions to create lingering potions."), image = "mcl_potions_dragon_breath.png", - groups = { brewitem = 1 }, + groups = { brewitem = 1, bottle = 1 }, on_use = nil, stack_max = 64, } diff --git a/mods/ITEMS/mcl_potions/splash.lua b/mods/ITEMS/mcl_potions/splash.lua index 6b6238dbf..0b8aedeab 100644 --- a/mods/ITEMS/mcl_potions/splash.lua +++ b/mods/ITEMS/mcl_potions/splash.lua @@ -26,7 +26,7 @@ function mcl_potions.register_splash(name, descr, color, def) _doc_items_longdesc = longdesc, _doc_items_usagehelp = S("Use the “Punch” key to throw it."), inventory_image = splash_image(color), - groups = {brewitem=1, not_in_creative_inventory=0}, + groups = {brewitem=1, not_in_creative_inventory=0, bottle=1}, on_use = function(item, placer, pointed_thing) local velocity = 10 local dir = placer:get_look_dir(); diff --git a/mods/ITEMS/mcl_smoker/init.lua b/mods/ITEMS/mcl_smoker/init.lua index 757f13054..787d0c429 100644 --- a/mods/ITEMS/mcl_smoker/init.lua +++ b/mods/ITEMS/mcl_smoker/init.lua @@ -453,7 +453,7 @@ minetest.register_node("mcl_smoker:smoker", { "smoker_side.png", "smoker_front.png" }, paramtype2 = "facedir", - groups = { pickaxey = 1, container = 4, deco_block = 1, material_stone = 1 }, + groups = { pickaxey = 1, container = 2, deco_block = 1, material_stone = 1 }, is_ground_content = false, sounds = mcl_sounds.node_sound_stone_defaults(), @@ -519,6 +519,11 @@ minetest.register_node("mcl_smoker:smoker", { _mcl_blast_resistance = 3.5, _mcl_hardness = 3.5, on_rotate = on_rotate, + _mcl_hoppers_on_try_pull = mcl_furnaces.hoppers_on_try_pull, + _mcl_hoppers_on_try_push = mcl_furnaces.hoppers_on_try_push, + _mcl_hoppers_on_after_push = function(pos) + minetest.get_node_timer(pos):start(1.0) + end, }) minetest.register_node("mcl_smoker:smoker_active", { @@ -536,7 +541,7 @@ minetest.register_node("mcl_smoker:smoker_active", { paramtype = "light", light_source = LIGHT_ACTIVE_FURNACE, drop = "mcl_smoker:smoker", - groups = { pickaxey = 1, container = 4, deco_block = 1, not_in_creative_inventory = 1, material_stone = 1 }, + groups = { pickaxey = 1, container = 2, deco_block = 1, not_in_creative_inventory = 1, material_stone = 1 }, is_ground_content = false, sounds = mcl_sounds.node_sound_stone_defaults(), on_timer = smoker_node_timer, @@ -579,6 +584,8 @@ minetest.register_node("mcl_smoker:smoker_active", { _mcl_hardness = 3.5, on_rotate = on_rotate, after_rotate = after_rotate_active, + _mcl_hoppers_on_try_pull = mcl_furnaces.hoppers_on_try_pull, + _mcl_hoppers_on_try_push = mcl_furnaces.hoppers_on_try_push, }) minetest.register_craft({ From b57f6be81d3a1ea1eac5a7208fb15f5217d5bd46 Mon Sep 17 00:00:00 2001 From: Eliy21 Date: Tue, 28 Nov 2023 01:37:45 +0000 Subject: [PATCH 330/982] Make showing advancement chat messages into a setting (#4032) Reviewed-on: https://git.minetest.land/MineClone2/MineClone2/pulls/4032 Reviewed-by: the-real-herowl Co-authored-by: Eliy21 Co-committed-by: Eliy21 --- mods/HUD/awards/api.lua | 4 +++- settingtypes.txt | 3 +++ 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/mods/HUD/awards/api.lua b/mods/HUD/awards/api.lua index 6333272bd..ca87a812c 100644 --- a/mods/HUD/awards/api.lua +++ b/mods/HUD/awards/api.lua @@ -217,7 +217,9 @@ function awards.unlock(name, award) -- Get award minetest.log("action", name.." has gotten award "..award) - minetest.chat_send_all(S("@1 has made the advancement @2", name, minetest.colorize(mcl_colors.GREEN, "[" .. (awdef.title or award) .. "]"))) + if minetest.settings:get_bool("mcl_showAdvancementMessages", true) then + minetest.chat_send_all(S("@1 has made the advancement @2", name, minetest.colorize(mcl_colors.GREEN, "[" .. (awdef.title or award) .. "]"))) + end data.unlocked[award] = award awards.save() diff --git a/settingtypes.txt b/settingtypes.txt index c2f97c817..a78b33e3b 100644 --- a/settingtypes.txt +++ b/settingtypes.txt @@ -73,6 +73,9 @@ mcl_elytra_rocket_speed (Elytra rocket speed cap) float 3.5 2.0 5.5 # If enabled, chat messages are shown to everyone when a player dies. mcl_showDeathMessages (Show death messages) bool true +# If enabled, chat messages are shown to everyone when a player makes an advancement. +mcl_showAdvancementMessages (Show advancement messages) bool true + # If enabled, the recipe book will progressively be filled with new recipes that can be crafted from all items you ever have had in your inventory. # Recommended for new players and for a spoiler-free gameplay experience. # If disabled, all recipes will be shown. From 4cf865a36c7110a28513f98c8d87db55c5efa9b2 Mon Sep 17 00:00:00 2001 From: codiac Date: Tue, 28 Nov 2023 02:45:18 +0000 Subject: [PATCH 331/982] Fix passive threshold in nether and end (#4030) Fix light check for passive mobs in other dimensions. It is apparently the same in all dimensions. If a mob has it's own spawn_check function then that should be used regardless of it's type. Fixes #4029 Reviewed-on: https://git.minetest.land/MineClone2/MineClone2/pulls/4030 Reviewed-by: the-real-herowl Co-authored-by: codiac Co-committed-by: codiac --- mods/ENTITIES/mcl_mobs/spawning.lua | 33 ++++++++++++++--------------- 1 file changed, 16 insertions(+), 17 deletions(-) diff --git a/mods/ENTITIES/mcl_mobs/spawning.lua b/mods/ENTITIES/mcl_mobs/spawning.lua index 9c51c0f86..885391759 100644 --- a/mods/ENTITIES/mcl_mobs/spawning.lua +++ b/mods/ENTITIES/mcl_mobs/spawning.lua @@ -732,27 +732,26 @@ local function spawn_check(pos, spawn_def) local sky_light = minetest.get_natural_light(pos) local art_light = minetest.get_artificial_light(my_node.param1) - if dimension == "nether" then - if art_light <= nether_threshold then - return true - end - elseif dimension == "end" then - if art_light <= end_threshold then - return true - end - elseif dimension == "overworld" then - if mob_type == "monster" then - if mob_def.spawn_check then - return mob_def.spawn_check(pos, gotten_light, art_light, sky_light) - elseif art_light <= overworld_threshold and sky_light <= overworld_sky_threshold then + if mob_def.spawn_check then + return mob_def.spawn_check(pos, gotten_light, art_light, sky_light) + elseif mob_type == "monster" then + if dimension == "nether" then + if art_light <= nether_threshold then return true end - else - if mob_def.spawn_check then - return mob_def.spawn_check(pos, gotten_light, art_light, sky_light) - elseif gotten_light > overworld_passive_threshold then + elseif dimension == "end" then + if art_light <= end_threshold then return true end + elseif dimension == "overworld" then + if art_light <= overworld_threshold and sky_light <= overworld_sky_threshold then + return true + end + end + else + -- passive threshold is apparently the same in all dimensions ... + if gotten_light > overworld_passive_threshold then + return true end end else From 9be5de980e1db382a7c08c4658c2c752dd617989 Mon Sep 17 00:00:00 2001 From: michaljmalinowski Date: Tue, 28 Nov 2023 20:26:24 +0000 Subject: [PATCH 332/982] Update mods/MAPGEN/mcl_biomes/init.lua update melon and pumpkin biomes --- mods/MAPGEN/mcl_biomes/init.lua | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/mods/MAPGEN/mcl_biomes/init.lua b/mods/MAPGEN/mcl_biomes/init.lua index d42720d26..df2b4dfb8 100644 --- a/mods/MAPGEN/mcl_biomes/init.lua +++ b/mods/MAPGEN/mcl_biomes/init.lua @@ -5186,7 +5186,7 @@ local function register_decorations() y_min = 1, y_max = mcl_vars.mg_overworld_max, decoration = "mcl_farming:melon", - biomes = {"Jungle"}, + biomes = {"Jungle", "BambooJungle"}, }) minetest.register_decoration({ deco_type = "simple", @@ -5203,7 +5203,7 @@ local function register_decorations() y_min = 1, y_max = mcl_vars.mg_overworld_max, decoration = "mcl_farming:melon", - biomes = {"JungleM"}, + biomes = {"JungleM", "BambooJungleM"}, }) minetest.register_decoration({ deco_type = "simple", @@ -5220,7 +5220,7 @@ local function register_decorations() y_min = 1, y_max = mcl_vars.mg_overworld_max, decoration = "mcl_farming:melon", - biomes = {"JungleEdge", "JungleEdgeM"}, + biomes = {"JungleEdge", "JungleEdgeM", "BambooJungleEdge", "BambooJungleEdgeM"}, }) -- Lots of melons in Jungle Edge M @@ -5260,6 +5260,7 @@ local function register_decorations() }, y_min = 1, y_max = mcl_vars.mg_overworld_max, + biomes = {"ExtremeHills", "ExtremeHillsM", "ExtremeHills+", "Taiga", "MegaTaiga", "MegaSpruceTaiga", "Plains", "SunflowerPlains", "Swampland", "MangroveSwamp"}, }) -- Grasses and ferns From 43e7a952acedf3c8c793f200b66ceefe3044a7c8 Mon Sep 17 00:00:00 2001 From: chmodsayshello Date: Thu, 30 Nov 2023 22:29:56 +0100 Subject: [PATCH 333/982] use math.ceil to get amount of needed players --- mods/ITEMS/mcl_beds/functions.lua | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mods/ITEMS/mcl_beds/functions.lua b/mods/ITEMS/mcl_beds/functions.lua index 6c59fff04..394c748e7 100644 --- a/mods/ITEMS/mcl_beds/functions.lua +++ b/mods/ITEMS/mcl_beds/functions.lua @@ -385,7 +385,7 @@ function mcl_beds.on_rightclick(pos, player, is_top) mcl_title.set(player, "actionbar", {text=message, color="white", stay=60}) else -- someone just successfully entered a bed local connected_players = minetest.get_connected_players() - local sleep_hud_message = S("@1/@2 players currently in bed.", player_in_bed, players_in_bed_setting() * #connected_players / 100) + local sleep_hud_message = S("@1/@2 players currently in bed.", player_in_bed, math.ceil(players_in_bed_setting() * #connected_players / 100)) for _, player in pairs(connected_players) do if not mcl_beds.player[player:get_player_name()] then -- only send message to players not sleeping. if mcl_title.params_get(player) then mcl_title.clear(player) end -- clear, old message is still being displayed From 2ba73f832c7d21451be760f40fc4b25060d42a03 Mon Sep 17 00:00:00 2001 From: bakawun Date: Mon, 4 Dec 2023 20:17:39 +0100 Subject: [PATCH 334/982] horse: drops: remove 2nd saddle, add armor --- mods/ENTITIES/mobs_mc/horse.lua | 23 ++++++++++------------- 1 file changed, 10 insertions(+), 13 deletions(-) diff --git a/mods/ENTITIES/mobs_mc/horse.lua b/mods/ENTITIES/mobs_mc/horse.lua index 07aa58572..5bf241758 100644 --- a/mods/ENTITIES/mobs_mc/horse.lua +++ b/mods/ENTITIES/mobs_mc/horse.lua @@ -44,18 +44,6 @@ local function get_drops(self) max = 2, looting = "common", }) - if self._saddle then - table.insert(self.drops,{name = "mcl_mobitems:saddle", - chance = 1, - min = 1, - max = 1,}) - end - if self._chest then - table.insert(self.drops,{name = "mcl_chests:chest", - chance = 1, - min = 1, - max = 1,}) - end end -- Helper functions to determine equipment rules @@ -245,10 +233,18 @@ local horse = { on_die = function(self, pos) - -- drop saddle when horse is killed while riding + -- drop saddle when horse is killed if self._saddle then minetest.add_item(pos, "mcl_mobitems:saddle") end + -- drop chest when mule/donkey is killed + if self._chest then + minetest.add_item(pos, "mcl_chests:chest") + end + -- drop armor when horse is killed + if self._wearing_armor then + minetest.add_item(pos, self._horse_armor) + end -- also detach from horse properly if self.driver then mcl_mobs.detach(self.driver, {x = 1, y = 0, z = 1}) @@ -401,6 +397,7 @@ local horse = { -- Put on armor and take armor from player's inventory local armor = minetest.get_item_group(iname, "horse_armor") self._horse_armor = iname + self._wearing_armor = true local w = clicker:get_wielded_item() if not minetest.is_creative_enabled(clicker:get_player_name()) then w:take_item() From 027e0e8337ed2b6de1b313116f44ea9c4f405068 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jos=C3=A9=20Mu=C3=B1oz?= Date: Tue, 5 Dec 2023 00:05:39 +0000 Subject: [PATCH 335/982] Fix a typo in the spanish translation (#4039) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Reviewed-on: https://git.minetest.land/MineClone2/MineClone2/pulls/4039 Reviewed-by: the-real-herowl Co-authored-by: José Muñoz Co-committed-by: José Muñoz --- mods/ITEMS/mcl_bows/locale/mcl_bows.es.tr | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mods/ITEMS/mcl_bows/locale/mcl_bows.es.tr b/mods/ITEMS/mcl_bows/locale/mcl_bows.es.tr index 4ed4d8640..0375eb320 100644 --- a/mods/ITEMS/mcl_bows/locale/mcl_bows.es.tr +++ b/mods/ITEMS/mcl_bows/locale/mcl_bows.es.tr @@ -11,7 +11,7 @@ To use the bow, you first need to have at least one arrow anywhere in your inven Bow=Arco Ammunition=Munición Damage from bow: 1-10=Daño con arco: 1-10 -Damage from dispenser: 3=Daño por dispendsador: 3 +Damage from dispenser: 3=Daño por dispensador: 3 Launches arrows=Lanza flechas Crossbow=Ballesta Crossbows are ranged weapons to shoot arrows at your foes.=Las ballestas son armas a distancia para disparar flechas a tus enemigos. From e29654a0f697e1333f57612aa72d318699d1877e Mon Sep 17 00:00:00 2001 From: the-real-herowl Date: Mon, 27 Nov 2023 03:37:28 +0100 Subject: [PATCH 336/982] Revert healing interval default to the lower value --- mods/PLAYER/mcl_hunger/init.lua | 2 +- settingtypes.txt | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/mods/PLAYER/mcl_hunger/init.lua b/mods/PLAYER/mcl_hunger/init.lua index cc3965f57..a039169e3 100644 --- a/mods/PLAYER/mcl_hunger/init.lua +++ b/mods/PLAYER/mcl_hunger/init.lua @@ -146,7 +146,7 @@ minetest.register_globalstep(function(dtime) local food_level = mcl_hunger.get_hunger(player) local food_saturation_level = mcl_hunger.get_saturation(player) local player_health = player:get_hp() - local max_tick_timer = tonumber(minetest.settings:get("mcl_health_regen_delay")) or 4 + local max_tick_timer = tonumber(minetest.settings:get("mcl_health_regen_delay")) or 0.5 if food_tick_timer > max_tick_timer then food_tick_timer = 0 diff --git a/settingtypes.txt b/settingtypes.txt index a78b33e3b..f5743bc1d 100644 --- a/settingtypes.txt +++ b/settingtypes.txt @@ -99,8 +99,8 @@ mcl_creative_dig_speed (Creative mode dig speed) float 0.2 mcl_enable_hunger (Hunger mechanic) bool true # Health regeneration delay when hunger bar is full -# Default:4 -mcl_health_regen_delay (Health regen delay) float 4 0 +# Default: 0.5 s +mcl_health_regen_delay (Health regen delay) float 0.5 0 [Mobs] # If enabled, mobs will spawn naturally. This does not affect From 24ffd64cadb9dbce40fdabb9fc8a9b2ac9351200 Mon Sep 17 00:00:00 2001 From: the-real-herowl Date: Tue, 28 Nov 2023 03:34:26 +0100 Subject: [PATCH 337/982] Knockback fixes --- mods/ENTITIES/mcl_mobs/combat.lua | 4 ++-- mods/HUD/mcl_death_messages/init.lua | 1 - mods/ITEMS/mcl_enchanting/enchantments.lua | 8 +++++++- mods/PLAYER/mcl_criticals/init.lua | 3 +-- 4 files changed, 10 insertions(+), 6 deletions(-) diff --git a/mods/ENTITIES/mcl_mobs/combat.lua b/mods/ENTITIES/mcl_mobs/combat.lua index 6952f6581..ad7e202c6 100644 --- a/mods/ENTITIES/mcl_mobs/combat.lua +++ b/mods/ENTITIES/mcl_mobs/combat.lua @@ -719,12 +719,12 @@ function mob_class:on_punch(hitter, tflp, tool_capabilities, dir) end if hitter and is_player then local wielditem = hitter:get_wielded_item() + kb = kb + 9 * mcl_enchanting.get_enchantment(wielditem, "knockback") + -- add player velocity to mob knockback local hv = hitter:get_velocity() local dir_dot = (hv.x * dir.x) + (hv.z * dir.z) local player_mag = math.sqrt((hv.x * hv.x) + (hv.z * hv.z)) local mob_mag = math.sqrt((v.x * v.x) + (v.z * v.z)) - kb = kb + 9 * mcl_enchanting.get_enchantment(wielditem, "knockback") - -- add player velocity to mob knockback if dir_dot > 0 and mob_mag <= player_mag * 0.625 then kb = kb + ((math.abs(hv.x) + math.abs(hv.z)) * r) end diff --git a/mods/HUD/mcl_death_messages/init.lua b/mods/HUD/mcl_death_messages/init.lua index 6c2040545..82749ca94 100644 --- a/mods/HUD/mcl_death_messages/init.lua +++ b/mods/HUD/mcl_death_messages/init.lua @@ -156,7 +156,6 @@ mcl_death_messages = { plain = "@1 died a sweet death", assist = "@1 was poked to death by a sweet berry bush whilst trying to escape @2", }, - -- Missing snowballs: The Minecraft wiki mentions them but the MC source code does not. }, } diff --git a/mods/ITEMS/mcl_enchanting/enchantments.lua b/mods/ITEMS/mcl_enchanting/enchantments.lua index f137b4230..7e06ae43b 100644 --- a/mods/ITEMS/mcl_enchanting/enchantments.lua +++ b/mods/ITEMS/mcl_enchanting/enchantments.lua @@ -278,7 +278,13 @@ function minetest.calculate_knockback(player, hitter, time_from_last_punch, tool end if hitter and hitter:is_player() then local wielditem = hitter:get_wielded_item() - knockback = knockback + 3 * mcl_enchanting.get_enchantment(wielditem, "knockback") + knockback = knockback + 5 * mcl_enchanting.get_enchantment(wielditem, "knockback") + -- add player velocity to knockback + local hv = hitter:get_velocity() + local dir_dot = (hv.x * dir.x) + (hv.z * dir.z) + if dir_dot > 0 then + knockback = knockback + dir_dot * 2 + end elseif luaentity and luaentity._knockback then knockback = knockback + luaentity._knockback end diff --git a/mods/PLAYER/mcl_criticals/init.lua b/mods/PLAYER/mcl_criticals/init.lua index 27d09abb2..3e292d165 100644 --- a/mods/PLAYER/mcl_criticals/init.lua +++ b/mods/PLAYER/mcl_criticals/init.lua @@ -23,8 +23,7 @@ mcl_damage.register_modifier(function(obj, damage, reason) texture = "mcl_particles_crit.png^[colorize:#bc7a57:127", }) minetest.sound_play("mcl_criticals_hit", {object = obj}) - -- the minecraft wiki is actually wrong about a crit dealing 150% damage, see minecraft source code - return damage + math.random(0, math.floor(damage * 1.5 + 2)) + return damage * math.random(1.5, 2.5) end end end, -100) From cca664552483df860c0495f426b87d9e2b4287d2 Mon Sep 17 00:00:00 2001 From: the-real-herowl Date: Tue, 28 Nov 2023 04:28:05 +0100 Subject: [PATCH 338/982] Added player damage invulnerability --- mods/PLAYER/mcl_playerplus/init.lua | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/mods/PLAYER/mcl_playerplus/init.lua b/mods/PLAYER/mcl_playerplus/init.lua index 99da0a01a..61ca0e103 100644 --- a/mods/PLAYER/mcl_playerplus/init.lua +++ b/mods/PLAYER/mcl_playerplus/init.lua @@ -721,6 +721,20 @@ mcl_damage.register_modifier(function(obj, damage, reason) end end, -200) +-- damage invulnerability +mcl_damage.register_modifier(function(obj, damage, reason) + local invul = obj:get_meta():get_int("mcl_damage:invulnerable") + if invul > 0 then + return 0 + else + obj:get_meta():set_int("mcl_damage:invulnerable", 1) + minetest.after(0.5, function() + obj:get_meta():set_int("mcl_damage:invulnerable", 0) + end) + return damage + end +end, -1000) + minetest.register_on_respawnplayer(function(player) local pos = player:get_pos() minetest.add_particlespawner({ From 46d9c6600047bf39cb9bd597d328791c877d60cc Mon Sep 17 00:00:00 2001 From: the-real-herowl Date: Tue, 28 Nov 2023 04:35:19 +0100 Subject: [PATCH 339/982] Fixed mobs executing custom on_punch with punch fail --- mods/ENTITIES/mcl_mobs/combat.lua | 44 +++++++++++++++---------------- 1 file changed, 22 insertions(+), 22 deletions(-) diff --git a/mods/ENTITIES/mcl_mobs/combat.lua b/mods/ENTITIES/mcl_mobs/combat.lua index ad7e202c6..6b660c787 100644 --- a/mods/ENTITIES/mcl_mobs/combat.lua +++ b/mods/ENTITIES/mcl_mobs/combat.lua @@ -516,6 +516,28 @@ end -- deal damage and effects when mob punched function mob_class:on_punch(hitter, tflp, tool_capabilities, dir) + local is_player = hitter:is_player() + local mob_pos = self.object:get_pos() + local player_pos = hitter:get_pos() + + if is_player then + -- is mob out of reach? + if vector.distance(mob_pos, player_pos) > 3 then + return + end + -- is mob protected? + if self.protected and minetest.is_protected(mob_pos, hitter:get_player_name()) then + return + end + end + + local time_now = minetest.get_us_time() + local time_diff = time_now - self.invul_timestamp + + -- check for invulnerability time in microseconds (0.5 second) + if time_diff <= 500000 and time_diff >= 0 then + return + end -- custom punch function if self.do_punch then @@ -534,29 +556,7 @@ function mob_class:on_punch(hitter, tflp, tool_capabilities, dir) local time_now = minetest.get_us_time() - local is_player = hitter:is_player() - if is_player then - local time_diff = time_now - self.invul_timestamp - - -- check for invulnerability time in microseconds (0.5 second) - if time_diff <= 500000 and time_diff >= 0 then - return - end - - local mob_pos = self.object:get_pos() - local player_pos = hitter:get_pos() - - -- is mob out of reach? - if vector.distance(mob_pos, player_pos) > 3 then - return - end - - -- is mob protected? - if self.protected and minetest.is_protected(mob_pos, hitter:get_player_name()) then - return - end - if minetest.is_creative_enabled(hitter:get_player_name()) then self.health = 0 end From 1857341b59ab9ed7d2b084c2162b45431c32d291 Mon Sep 17 00:00:00 2001 From: the-real-herowl Date: Tue, 28 Nov 2023 04:35:42 +0100 Subject: [PATCH 340/982] Fixed player knockback from arrows --- mods/ITEMS/mcl_enchanting/enchantments.lua | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/mods/ITEMS/mcl_enchanting/enchantments.lua b/mods/ITEMS/mcl_enchanting/enchantments.lua index 7e06ae43b..c6436339c 100644 --- a/mods/ITEMS/mcl_enchanting/enchantments.lua +++ b/mods/ITEMS/mcl_enchanting/enchantments.lua @@ -286,7 +286,13 @@ function minetest.calculate_knockback(player, hitter, time_from_last_punch, tool knockback = knockback + dir_dot * 2 end elseif luaentity and luaentity._knockback then - knockback = knockback + luaentity._knockback + local kb = knockback + luaentity._knockback / 4 + local punch_dir = dir + punch_dir.y = 0 + punch_dir = vector.normalize(punch_dir) * kb + punch_dir.y = 4 + player:add_velocity(punch_dir) + knockback = 0 end return knockback end From 589de76613c3966b82f3992d5289cb29c1b82bdf Mon Sep 17 00:00:00 2001 From: the-real-herowl Date: Tue, 5 Dec 2023 01:57:40 +0100 Subject: [PATCH 341/982] Fixed a code branch never being run --- mods/PLAYER/mcl_hunger/init.lua | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mods/PLAYER/mcl_hunger/init.lua b/mods/PLAYER/mcl_hunger/init.lua index a039169e3..ff625a5f7 100644 --- a/mods/PLAYER/mcl_hunger/init.lua +++ b/mods/PLAYER/mcl_hunger/init.lua @@ -148,7 +148,7 @@ minetest.register_globalstep(function(dtime) local player_health = player:get_hp() local max_tick_timer = tonumber(minetest.settings:get("mcl_health_regen_delay")) or 0.5 - if food_tick_timer > max_tick_timer then + if food_tick_timer > 4 then food_tick_timer = 0 -- let hunger work always From 0673fcc25bc9907bc7d3909b17ebf82951f8da32 Mon Sep 17 00:00:00 2001 From: Eliy21 Date: Tue, 5 Dec 2023 01:08:50 +0000 Subject: [PATCH 342/982] Respawn dead players when they login so they don't get stuck without the death formspec (#4041) Hopefully will prevent the dead player not respawning when logging in bug from happening Reviewed-on: https://git.minetest.land/MineClone2/MineClone2/pulls/4041 Reviewed-by: the-real-herowl Co-authored-by: Eliy21 Co-committed-by: Eliy21 --- mods/PLAYER/mcl_playerplus/init.lua | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/mods/PLAYER/mcl_playerplus/init.lua b/mods/PLAYER/mcl_playerplus/init.lua index 99da0a01a..0ad34cae8 100644 --- a/mods/PLAYER/mcl_playerplus/init.lua +++ b/mods/PLAYER/mcl_playerplus/init.lua @@ -657,6 +657,7 @@ end) -- set to blank on join (for 3rd party mods) minetest.register_on_joinplayer(function(player) local name = player:get_player_name() + local hp = player:get_hp() mcl_playerplus_internal[name] = { lastPos = nil, @@ -671,6 +672,10 @@ minetest.register_on_joinplayer(function(player) player:set_bone_position("Arm_Right_Pitch_Control", vector.new(-3, 5.785, 0)) player:set_bone_position("Arm_Left_Pitch_Control", vector.new(3, 5.785, 0)) player:set_bone_position("Body_Control", vector.new(0, 6.75, 0)) + -- Respawn dead players on joining + if hp <= 0 then + player:respawn() + end end) -- clear when player leaves From f39fe17895b3807ec59e7b6fc7d8097546754eb6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jos=C3=A9=20M?= Date: Mon, 4 Dec 2023 22:51:50 -0600 Subject: [PATCH 343/982] Update mesecons_lightsone spanish translation Fixed a syntaxis error at line 3 and added the missing translation for line 4 --- .../mesecons_lightstone/locale/mesecons_lightstone.es.tr | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/mods/ITEMS/REDSTONE/mesecons_lightstone/locale/mesecons_lightstone.es.tr b/mods/ITEMS/REDSTONE/mesecons_lightstone/locale/mesecons_lightstone.es.tr index 713f0be5e..f2a47d3ac 100644 --- a/mods/ITEMS/REDSTONE/mesecons_lightstone/locale/mesecons_lightstone.es.tr +++ b/mods/ITEMS/REDSTONE/mesecons_lightstone/locale/mesecons_lightstone.es.tr @@ -1,3 +1,4 @@ # textdomain: mesecons_lightstone Redstone Lamp=Lámpara de redstone -Redstone lamps are simple redstone components which glow brightly (light level @1) when they receive redstone power.=Las lámparas Redstone son componentes simples de redstone que brillan intensamente (nivel de luz @ 1) cuando reciben energía de redstone. +Redstone lamps are simple redstone components which glow brightly (light level @1) when they receive redstone power.=Las lámparas de redstone son componentes simples de redstone que brillan intensamente (nivel de luz @1) cuando reciben energía de redstone. +Glows when powered by redstone power=Brilla cuando recibe energía de redstone From 86dad4693ee040b53a81daa8811b48f1ebfdd036 Mon Sep 17 00:00:00 2001 From: Eliy21 Date: Tue, 5 Dec 2023 08:21:37 +0000 Subject: [PATCH 344/982] Add warning log if players with 0 hp joined (#4051) Reviewed-on: https://git.minetest.land/MineClone2/MineClone2/pulls/4051 Reviewed-by: the-real-herowl Co-authored-by: Eliy21 Co-committed-by: Eliy21 --- mods/PLAYER/mcl_playerplus/init.lua | 1 + 1 file changed, 1 insertion(+) diff --git a/mods/PLAYER/mcl_playerplus/init.lua b/mods/PLAYER/mcl_playerplus/init.lua index 0ad34cae8..92e22b0e6 100644 --- a/mods/PLAYER/mcl_playerplus/init.lua +++ b/mods/PLAYER/mcl_playerplus/init.lua @@ -675,6 +675,7 @@ minetest.register_on_joinplayer(function(player) -- Respawn dead players on joining if hp <= 0 then player:respawn() + minetest.log("warning", name .. " joined the game with 0 hp and has been forced to respawn") end end) From 4127d120d25a7fa18dfd1d49feaf0ef2110489d6 Mon Sep 17 00:00:00 2001 From: Eliy21 Date: Tue, 5 Dec 2023 12:49:49 +0000 Subject: [PATCH 345/982] Add server privs restriction to mcl_villages build tool (#4043) Fixes #4022 ### Testing -Make a new world, check host server and go into creative mode -Since you're the server you have the server privs so get the mcl_villages build tool item in creative inventory and use it to see if it works -Have someone join your server and give them the same item to use and see if they are restricted from using it Reviewed-on: https://git.minetest.land/MineClone2/MineClone2/pulls/4043 Reviewed-by: chmodsayshello Co-authored-by: Eliy21 Co-committed-by: Eliy21 --- mods/MAPGEN/mcl_villages/init.lua | 4 ++++ mods/MAPGEN/mcl_villages/locale/mcl_villages.de.tr | 4 ++++ mods/MAPGEN/mcl_villages/locale/mcl_villages.fr.tr | 3 ++- mods/MAPGEN/mcl_villages/locale/mcl_villages.ja.tr | 3 ++- mods/MAPGEN/mcl_villages/locale/mcl_villages.ru.tr | 3 ++- mods/MAPGEN/mcl_villages/locale/template.txt | 3 ++- 6 files changed, 16 insertions(+), 4 deletions(-) create mode 100644 mods/MAPGEN/mcl_villages/locale/mcl_villages.de.tr diff --git a/mods/MAPGEN/mcl_villages/init.lua b/mods/MAPGEN/mcl_villages/init.lua index 0cb0712b5..6662f6bd1 100644 --- a/mods/MAPGEN/mcl_villages/init.lua +++ b/mods/MAPGEN/mcl_villages/init.lua @@ -128,6 +128,10 @@ if minetest.is_creative_enabled("") then -- build ssettlement on_place = function(itemstack, placer, pointed_thing) if not pointed_thing.under then return end + if not minetest.check_player_privs(placer, "server") then + minetest.chat_send_player(placer:get_player_name(), S("Placement denied. You need the “server” privilege to place villages.")) + return + end local minp = vector.subtract( pointed_thing.under, half_map_chunk_size) local maxp = vector.add( pointed_thing.under, half_map_chunk_size) build_a_settlement(minp, maxp, math.random(0,32767)) diff --git a/mods/MAPGEN/mcl_villages/locale/mcl_villages.de.tr b/mods/MAPGEN/mcl_villages/locale/mcl_villages.de.tr new file mode 100644 index 000000000..6a8f1f681 --- /dev/null +++ b/mods/MAPGEN/mcl_villages/locale/mcl_villages.de.tr @@ -0,0 +1,4 @@ +# textdomain: mcl_villages +Chiseled Stone Village Bricks=Dorfziegel aus gemeißeltem Stein +mcl_villages build tool=mcl_villages Konstruktionswerkzeug +Placement denied. You need the “server” privilege to place villages.=Platzierung verweigert. Sie benötigen das "server" Privileg, um Dörfer zu platzieren. \ No newline at end of file diff --git a/mods/MAPGEN/mcl_villages/locale/mcl_villages.fr.tr b/mods/MAPGEN/mcl_villages/locale/mcl_villages.fr.tr index b648cd36c..af1d0ab49 100644 --- a/mods/MAPGEN/mcl_villages/locale/mcl_villages.fr.tr +++ b/mods/MAPGEN/mcl_villages/locale/mcl_villages.fr.tr @@ -1,3 +1,4 @@ # textdomain: mcl_villages Chiseled Stone Village Bricks=Pierre sculptée du village -mcl_villages build tool=outil de construction de mcl_villages \ No newline at end of file +mcl_villages build tool=outil de construction de mcl_villages +Placement denied. You need the “server” privilege to place villages.=Placement refusé. Vous devez disposer du privilège "server" pour placer des villages. \ No newline at end of file diff --git a/mods/MAPGEN/mcl_villages/locale/mcl_villages.ja.tr b/mods/MAPGEN/mcl_villages/locale/mcl_villages.ja.tr index 4d0e4794f..6a63a577d 100644 --- a/mods/MAPGEN/mcl_villages/locale/mcl_villages.ja.tr +++ b/mods/MAPGEN/mcl_villages/locale/mcl_villages.ja.tr @@ -1,3 +1,4 @@ # textdomain: mcl_villages Chiseled Stone Village Bricks=模様入り石村レンガ -mcl_villages build tool=mcl_villages 構築ツール \ No newline at end of file +mcl_villages build tool=mcl_villages 構築ツール +Placement denied. You need the “server” privilege to place villages.=配置が拒否されました。村の配置には「server」権限が必要です。 \ No newline at end of file diff --git a/mods/MAPGEN/mcl_villages/locale/mcl_villages.ru.tr b/mods/MAPGEN/mcl_villages/locale/mcl_villages.ru.tr index 525e5811b..021bd78f1 100644 --- a/mods/MAPGEN/mcl_villages/locale/mcl_villages.ru.tr +++ b/mods/MAPGEN/mcl_villages/locale/mcl_villages.ru.tr @@ -1,3 +1,4 @@ # textdomain: mcl_villages Chiseled Stone Village Bricks=Резные деревенские каменные кирпичи -mcl_villages build tool=Инструмент постройки деревни \ No newline at end of file +mcl_villages build tool=Инструмент постройки деревни +Placement denied. You need the “server” privilege to place villages.=Размещение запрещено. Для размещения деревень необходима привилегия "server". \ No newline at end of file diff --git a/mods/MAPGEN/mcl_villages/locale/template.txt b/mods/MAPGEN/mcl_villages/locale/template.txt index 464daea9b..c410f4837 100644 --- a/mods/MAPGEN/mcl_villages/locale/template.txt +++ b/mods/MAPGEN/mcl_villages/locale/template.txt @@ -1,3 +1,4 @@ # textdomain: mcl_villages Chiseled Stone Village Bricks= -mcl_villages build tool= \ No newline at end of file +mcl_villages build tool= +Placement denied. You need the “server” privilege to place villages.= \ No newline at end of file From bb1e572287204092d31514dfa0952de0b8051b7e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jos=C3=A9=20M?= Date: Tue, 5 Dec 2023 18:39:29 -0600 Subject: [PATCH 346/982] Update mcl_compass.es.tr and fix syntax errors --- .../mcl_compass/locale/mcl_compass.es.tr | 19 ++++++++++++------- 1 file changed, 12 insertions(+), 7 deletions(-) diff --git a/mods/ITEMS/mcl_compass/locale/mcl_compass.es.tr b/mods/ITEMS/mcl_compass/locale/mcl_compass.es.tr index 77b36cad9..ca6eb8dcd 100644 --- a/mods/ITEMS/mcl_compass/locale/mcl_compass.es.tr +++ b/mods/ITEMS/mcl_compass/locale/mcl_compass.es.tr @@ -1,9 +1,14 @@ # textdomain: mcl_compass Compass=Brújula -Points to the world origin= -Compasses are tools which point to the world origin (X@=0, Z@=0) or the spawn point in the Overworld.=Las brújulas son herramientas que apuntan al origen del mundo (X @ = 0, Z @ = 0) o al punto de generación en el mundo. -A Compass always points to the world spawn point when the player is in the overworld. In other dimensions, it spins randomly.= -Lodestone Compass= -Points to a lodestone= -Lodestone compasses resemble regular compasses, but they point to a specific lodestone.= -A Lodestone compass can be made from an ordinary compass by using it on a lodestone. After becoming a lodestone compass, it always points to its linked lodestone, provided that they are in the same dimension. If not in the same dimension, the lodestone compass spins randomly, similarly to a regular compass when outside the overworld. A lodestone compass can be relinked with another lodestone.= +Points to the world origin=Apunta hacia el punto de generación del mundo +Compasses are tools which point to the world origin (X@=0, Z@=0) or the spawn point in the Overworld.=Las brújulas son herramientas que apuntan al origen del mundo (X@=0, Z@=0) o al punto de generación en la superficie. +A Compass always points to the world spawn point when the player is in the overworld. In other dimensions, it spins randomly.=Una brújula siempre apunta al punto de generación del mundo cuando el jugador está en la superficie. En otras dimensiones, gira aleatoriamente. +Lodestone Compass=Brújula magnetizada +Points to a lodestone=Apunta hacia una magnetita +Lodestone compasses resemble regular compasses, but they point to a specific lodestone.=Las brújulas magnetizadas se parecen a las brújulas normales, pero apuntan a una magnetita específica. +A Lodestone compass can be made from an ordinary compass by using it on a lodestone. After becoming a lodestone compass, it always points to its linked lodestone, provided that they are in the same dimension. If not in the same dimension, the lodestone compass spins randomly, similarly to a regular compass when outside the overworld. A lodestone compass can be relinked with another lodestone.=Una brújula magnetizada puede fabricarse a partir de una brújula normal, siempre que estén en la misma dimensión. Si no están en la misma dimensión, la brújula magnetizada girará aleatoriamente, de forma similar a una brújula normal cuando está fuera de la superficie. Una brújula magnetizada puede volver a enlazarse con otra magnetita. +Lodestone=Magnetita +Recovery Compass=Brújula de recuperación +Points to your last death location=Apunta hacia la ubicación de tu última muerte +Recovery Compasses are compasses that point to your last death location=Las brújulas de recuperación son brújulas que apuntan hacia la ubicación de tu última muerte +Recovery Compasses always point to the location of your last death, in case you haven't died yet, it will just randomly spin around=Las brújulas de recuperación siempre apuntan hacia la ubicación de tu última muerte, en caso de que aún no hayas muerto, simplemente girará aleatoriamente From 47f920c9dfa4c2172e953578e64c8cdf3a8334e3 Mon Sep 17 00:00:00 2001 From: the-real-herowl Date: Tue, 5 Dec 2023 03:05:20 +0100 Subject: [PATCH 347/982] Updated release credits and set version for 0.85 --- CREDITS.md | 28 +++++++++++++++++++++++++--- game.conf | 2 +- mods/HUD/mcl_credits/people.lua | 29 ++++++++++++++++++++++++++--- 3 files changed, 52 insertions(+), 7 deletions(-) diff --git a/CREDITS.md b/CREDITS.md index 39eed70e1..3a651cc58 100644 --- a/CREDITS.md +++ b/CREDITS.md @@ -8,30 +8,32 @@ ## Maintainers * AncientMariner -* Nicu +* Herowl ## Previous Maintainers * Fleckenstein * cora +* Nicu ## Developers * AFCMS * epCode * chmodsayshello -* PrairieWind * MrRar * FossFanatic * SmokeyDope +* Faerraven / Michieal +* Codiac ## Past Developers * jordan4ibanez * iliekprogrammar * kabou * kay27 -* Faerraven / Michieal * MysticTempest * NO11 * SumianVoice +* PrairieWind ## Contributors * RandomLegoBrick @@ -112,6 +114,19 @@ * Niterux * appgurueu * seventeenthShulker +* DinoNuggies4665 +* basxto +* Morik666 +* Eliy21 +* mdk +* pepebotella +* Alessandra Lozoya +* VanicGame +* ThePython10110 +* Araca +* Montandalar +* mim +* Dark ## Music * Jordach for the jukebox music compilation from Big Freaking Dig @@ -155,6 +170,7 @@ * cora * Faerraven / Michieal * PrairieWind +* ChrisPHP ## 3D Models * 22i @@ -162,6 +178,7 @@ * epCode * Faerraven / Michieal * SumianVoice +* thunder1035 ## Textures * XSSheep @@ -181,6 +198,8 @@ * Aeonix_Aeon * Wbjitscool * SmokeyDope +* thunder1035 +* Herowl ## Translations * Wuzzy @@ -200,6 +219,9 @@ * Temak * megustanlosfrijoles * kbundg +* Isaac Dennis +* ADLON +* Sab Pyrope ## Funders * 40W diff --git a/game.conf b/game.conf index 3ad5a33a5..07f30eef5 100644 --- a/game.conf +++ b/game.conf @@ -1,4 +1,4 @@ title = MineClone 2 description = A survival sandbox game. Survive, gather, hunt, build, explore, and do much more. disallowed_mapgens = v6 -version=0.85.0-SNAPSHOT \ No newline at end of file +version=0.85.0 diff --git a/mods/HUD/mcl_credits/people.lua b/mods/HUD/mcl_credits/people.lua index 7421350d0..d9e08ca37 100644 --- a/mods/HUD/mcl_credits/people.lua +++ b/mods/HUD/mcl_credits/people.lua @@ -10,30 +10,32 @@ return { }}, {S("Maintainers"), 0xFF51D5, { "AncientMariner", - "Nicu", + "Herowl", }}, {S("Previous Maintainers"), 0xFFFFFF, { "Fleckenstein", "cora", + "Nicu", }}, {S("Developers"), 0xF84355, { "AFCMS", "epCode", "chmodsayshello", - "PrairieWind", "MrRar", "FossFanatic ", "SmokeyDope", + "Faerraven / Michieal", + "Codiac", }}, {S("Past Developers"), 0xF84355, { "jordan4ibanez", "iliekprogrammar", "kabou", "kay27", - "Faerraven / Michieal", "MysticTempest", "NO11", "SumianVoice", + "PrairieWind", }}, {S("Contributors"), 0x52FF00, { "RandomLegoBrick", @@ -114,6 +116,19 @@ return { "Niterux", "appgurueu", "seventeenthShulker", + "DinoNuggies4665", + "basxto", + "Morik666", + "Eliy21", + "mdk", + "pepebotella", + "Alessandra Lozoya", + "VanicGame", + "ThePython10110", + "Araca", + "Montandalar", + "mim", + "Dark", }}, {S("Music"), 0xA60014, { "Jordach for the jukebox music compilation from Big Freaking Dig", @@ -157,6 +172,7 @@ return { "cora", "Faerraven / Michieal", "PrairieWind", + "ChrisPHP", }}, {S("3D Models"), 0x0019FF, { "22i", @@ -164,6 +180,7 @@ return { "epCode", "Faerraven / Michieal", "SumianVoice", + "thunder1035", }}, {S("Textures"), 0xFF9705, { "XSSheep", @@ -180,8 +197,11 @@ return { "Faerraven / Michieal", "Nicu", "Exhale", + "Aeonix_Aeon", "Wbjitscool", "SmokeyDope", + "thunder1035", + "Herowl", }}, {S("Translations"), 0x00FF60, { "Wuzzy", @@ -201,6 +221,9 @@ return { "Temak", "megustanlosfrijoles", "kbundg", + "Isaac Dennis", + "ADLON", + "Sab Pyrope", }}, {S("Funders"), 0xF7FF00, { "40W", From 333db53e7b2dc30188d4668d3332e9f3d2196198 Mon Sep 17 00:00:00 2001 From: the-real-herowl Date: Tue, 5 Dec 2023 03:18:43 +0100 Subject: [PATCH 348/982] Add release notes for 0.85 --- .../0_85-the_fire_and_stone_release.md | 102 ++++++++++++++++++ 1 file changed, 102 insertions(+) create mode 100644 releasenotes/0_85-the_fire_and_stone_release.md diff --git a/releasenotes/0_85-the_fire_and_stone_release.md b/releasenotes/0_85-the_fire_and_stone_release.md new file mode 100644 index 000000000..856bc7853 --- /dev/null +++ b/releasenotes/0_85-the_fire_and_stone_release.md @@ -0,0 +1,102 @@ +## 0.85 – The Fire and Stone release + +### Contributors +#### New maintainer +* Herowl + +#### New contributors +* Codiac +* DinoNuggies4665 +* basxto +* Morik666 +* Eliy21 +* mdk +* pepebotella +* Alessandra Lozoya +* VanicGame +* ThePython10110 +* Araca +* Montandalar +* mim +* Dark +* ChrisPHP +* thunder1035 +* Isaac Dennis +* ADLON +* Sab Pyrope + +### Mobs improvements +Creeper received some adjustments, should be smarter, but easier to avoid if you're quick. Axolotl on the other hand won't eat your sheep anymore. + +Wither received a massive rework by Herowl, complete with custom attacks. Make sure to check him out, especially if you're up for a challenge. + +Iron Golem received some AI changes by our new contributor, Codiac, which should prevent him getting lost so much. + +Another rework done by Codiac was a change of how mob spawning takes light level into account. It should now be easier to prevent hostile spawns by lighting areas up, among other things. + +### Stonecutter functionality +Stonecutter finally received its functionality! Thanks to the work done by ChrisPHP, Herowl and AFCMS you can now cut every kind of stone into slabs, stairs, and decorated variants with unprecedented ease. + +### Campfire update +Another node that received a large update is the campfire, as well as the soul version. Thanks to the great work of PrairieWind, DinoNuggies4665, thunder1035, Wbjitscool, & AncientMariner, you can now cook items on them, and see it being done! + +### Combat rebalancing +Combat should feel better than ever before with changes by Eliy21 and Herowl! Knockback is stronger and more visible, every hit causes a short window of damage resistance, critical hits are more stable, hunger-based health regeneration works slightly differently... check it out! + +### Armor trims +You can now decorate your armor with colorful gems and metals on the smithing table thanks to the work of chmodsayshello. + +### Path undoing +Welcome our very own feature, path undoing! Brought to you by SmokeyDope and Herowl, you can now convert paths back to dirt by shift+right-clicking them with a shovel. + +### Formspec refactoring +Various GUI formspecs were updated in a massive rework by AFCMS to the newer version, as well as given new features. This includes survival and creative inventories (survival inventory got API allowing adding multiple tabs), as well as nodes like chests, furnaces, dispensers and hoppers. + +### Hopper reimplementation +Speaking of hoppers, our new contributor, Morik666, did an amazing job implementing a new API for hoppers, allowing to add various ways for other nodes to interact with the hoppers, including the nodes added by mods. + +### Pistons fixes +Pistons now work better thanks to seventeenthShulker, who fixed many bugs related to them. Sadly, even with these changes and the aforementioned hopper changes, not all mechanisms work as they should due to engine limitations that we are yet to make workarounds for. + +### Translations updated +* Brazilian Portuguese by Isaac Dennis +* Russian by ADLON & Sab Pyrope +* French by 3raven +* Spanish by megustanlosfrijoles + +### Other changes +* Texture names moving away from "`default_`" prefix – Liquid textures – by FossFanatic +* Cherry wood items fixes – by PrairieWind, 3raven, & MrRar +* Bamboo placing bug fixed – by seventeenthShulker +* Multishot enchantment fixed – by seventeenthShulker +* Missing textures added – by Wbjitscool +* Typo fixes – by pepebotella, Nicu, basxto, & mdk +* Villager trades update – by Alessandra Lozoya & Codiac +* Internal refactoring – by MrRar +* Banners' colors and texture adjustements – by VanicGame +* Copper crafting recipes fixes – by basxto & ThePython10110 +* Enchanting fixes – by Codiac & Araca +* Mob floating improvements – by Codiac +* Ruined portal spawn fix – by SmokeyDope +* Barrels sound fix – by SmokeyDope +* New settings added – by Eliy21 +* Trapdoors climbing update – by Dehydrate6684 +* Blast resistance fixes – by seventeenthShulker +* Documentation fixes – by Montandalar, mim, & the developer team +* Player eye height raising – by Dark +* Craft guide searching fix – by Araca +* Boat passenger fixes – by Eliy21 +* Duplication bug fixed – by Herowl +* Nodes now drop properly when tool breaks while digging – by Herowl +* Sleeping HUD – by chmodsayshello +* Pumpkin group – by rudzik8 +* Fixed /clear being unclear and dangerous – by Herowl +* Fixed players sometimes being stuck dead even on relog – by Eliy21 + +### Crashes fixed +* Unknown nodes and callbacks related crash – by MrRar +* Campfire and bamboo related crash – by Michieal +* Unknown nodes related crash – by pepebotella +* Minetest vector code related crash – by AncientMariner +* Waterlogged roots and kelp related crash – by Michieal + From 9a7e39654c67ff424861af535dc51c6a5464a5a8 Mon Sep 17 00:00:00 2001 From: the-real-herowl Date: Tue, 5 Dec 2023 03:40:37 +0100 Subject: [PATCH 349/982] Minor credits update --- CREDITS.md | 1 - releasenotes/0_85-the_fire_and_stone_release.md | 3 +++ 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/CREDITS.md b/CREDITS.md index 3a651cc58..959cc36d7 100644 --- a/CREDITS.md +++ b/CREDITS.md @@ -119,7 +119,6 @@ * Morik666 * Eliy21 * mdk -* pepebotella * Alessandra Lozoya * VanicGame * ThePython10110 diff --git a/releasenotes/0_85-the_fire_and_stone_release.md b/releasenotes/0_85-the_fire_and_stone_release.md index 856bc7853..bd0fa4291 100644 --- a/releasenotes/0_85-the_fire_and_stone_release.md +++ b/releasenotes/0_85-the_fire_and_stone_release.md @@ -93,6 +93,9 @@ Pistons now work better thanks to seventeenthShulker, who fixed many bugs relate * Fixed /clear being unclear and dangerous – by Herowl * Fixed players sometimes being stuck dead even on relog – by Eliy21 +### Special thanks +* For extensive testing – to Michieal + ### Crashes fixed * Unknown nodes and callbacks related crash – by MrRar * Campfire and bamboo related crash – by Michieal From ca71e949a894c3f4e07d0d042dde5a6397513674 Mon Sep 17 00:00:00 2001 From: the-real-herowl Date: Fri, 8 Dec 2023 23:20:52 +0100 Subject: [PATCH 350/982] Credits update --- CREDITS.md | 1 + mods/HUD/mcl_credits/people.lua | 2 +- releasenotes/0_85-the_fire_and_stone_release.md | 3 +++ 3 files changed, 5 insertions(+), 1 deletion(-) diff --git a/CREDITS.md b/CREDITS.md index 959cc36d7..27f52d249 100644 --- a/CREDITS.md +++ b/CREDITS.md @@ -126,6 +126,7 @@ * Montandalar * mim * Dark +* Bakawun ## Music * Jordach for the jukebox music compilation from Big Freaking Dig diff --git a/mods/HUD/mcl_credits/people.lua b/mods/HUD/mcl_credits/people.lua index d9e08ca37..448f99bda 100644 --- a/mods/HUD/mcl_credits/people.lua +++ b/mods/HUD/mcl_credits/people.lua @@ -121,7 +121,6 @@ return { "Morik666", "Eliy21", "mdk", - "pepebotella", "Alessandra Lozoya", "VanicGame", "ThePython10110", @@ -129,6 +128,7 @@ return { "Montandalar", "mim", "Dark", + "Bakawun", }}, {S("Music"), 0xA60014, { "Jordach for the jukebox music compilation from Big Freaking Dig", diff --git a/releasenotes/0_85-the_fire_and_stone_release.md b/releasenotes/0_85-the_fire_and_stone_release.md index bd0fa4291..3e45fee4e 100644 --- a/releasenotes/0_85-the_fire_and_stone_release.md +++ b/releasenotes/0_85-the_fire_and_stone_release.md @@ -24,6 +24,7 @@ * Isaac Dennis * ADLON * Sab Pyrope +* Bakawun ### Mobs improvements Creeper received some adjustments, should be smarter, but easier to avoid if you're quick. Axolotl on the other hand won't eat your sheep anymore. @@ -92,6 +93,8 @@ Pistons now work better thanks to seventeenthShulker, who fixed many bugs relate * Pumpkin group – by rudzik8 * Fixed /clear being unclear and dangerous – by Herowl * Fixed players sometimes being stuck dead even on relog – by Eliy21 +* Restricted access to the village builder tool to server privs - by Eliy21 +* Fixed horse equipment drops - by Bakawun ### Special thanks * For extensive testing – to Michieal From 3caa99a409714d0994c03abdb97fa73c822ec884 Mon Sep 17 00:00:00 2001 From: the-real-herowl Date: Sat, 9 Dec 2023 00:03:41 +0100 Subject: [PATCH 351/982] Post-release set version 0.86.0-SNAPSHOT --- game.conf | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/game.conf b/game.conf index 07f30eef5..2a48bbf15 100644 --- a/game.conf +++ b/game.conf @@ -1,4 +1,4 @@ title = MineClone 2 description = A survival sandbox game. Survive, gather, hunt, build, explore, and do much more. disallowed_mapgens = v6 -version=0.85.0 +version=0.86.0-SNAPSHOT From 02e7ff41d5d9720da223c32113c5acadf6bb1c55 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jos=C3=A9=20M?= Date: Sat, 9 Dec 2023 23:42:32 -0600 Subject: [PATCH 352/982] Update mcl_fire.es.tr and fix syntax errors --- mods/ITEMS/mcl_fire/locale/mcl_fire.es.tr | 16 +++++++++------- 1 file changed, 9 insertions(+), 7 deletions(-) diff --git a/mods/ITEMS/mcl_fire/locale/mcl_fire.es.tr b/mods/ITEMS/mcl_fire/locale/mcl_fire.es.tr index 6f36b293c..dfef491ab 100644 --- a/mods/ITEMS/mcl_fire/locale/mcl_fire.es.tr +++ b/mods/ITEMS/mcl_fire/locale/mcl_fire.es.tr @@ -1,17 +1,19 @@ # textdomain: mcl_fire Fire Charge=Carga de fuego -Fire charges are primarily projectiles which can be launched from dispensers, they will fly in a straight line and burst into a fire on impact. Alternatively, they can be used to ignite fires directly.=Las cargas de fuego son principalmente proyectiles que se pueden lanzar desde dispensadores, volarán en línea recta y estallarán en un incendio al impactar. Alternativamente, se pueden usar para encender incendios directamente. -Put the fire charge into a dispenser and supply it with redstone power to launch it. To ignite a fire directly, simply place the fire charge on the ground, which uses it up.=Ponga la carga de fuego en un dispensador y suminístrele poder de redstone para lanzarlo. Para encender un fuego directamente, simplemente coloque la carga de fuego en el suelo, que la usa. +Fire charges are primarily projectiles which can be launched from dispensers, they will fly in a straight line and burst into a fire on impact. Alternatively, they can be used to ignite fires directly.=Las cargas de fuego son principalmente proyectiles que se pueden lanzar desde dispensadores, volarán en línea recta y estallarán en un incendio al impactar. Alternativamente, se pueden usar para encender fuegos directamente. +Put the fire charge into a dispenser and supply it with redstone power to launch it. To ignite a fire directly, simply place the fire charge on the ground, which uses it up.=Ponga la carga de fuego en un dispensador y suminístrele poder de redstone para lanzarla. Para encender un fuego directamente, simplemente coloque la carga de fuego en el suelo, que la usa. Flint and Steel=Mechero -Flint and steel is a tool to start fires and ignite blocks.=El mechero es una herramienta para iniciar incendios y encender bloques. -Rightclick the surface of a block to attempt to light a fire in front of it or ignite the block. A few blocks have an unique reaction when ignited.=Haga clic derecho en la superficie de un bloque para intentar encender un fuego frente a él o encender el bloque. Unos pocos bloques tienen una reacción única cuando se encienden. -Fire is a damaging and destructive but short-lived kind of block. It will destroy and spread towards near flammable blocks, but fire will disappear when there is nothing to burn left. It will be extinguished by nearby water and rain. Fire can be destroyed safely by punching it, but it is hurtful if you stand directly in it. If a fire is started above netherrack or a magma block, it will immediately turn into an eternal fire.=El fuego es un tipo de bloque dañino y destructivo pero de corta duración. Destruirá y se extenderá hacia bloques casi inflamables, pero el fuego desaparecerá cuando no quede nada para quemar. Se extinguirá por el agua y la lluvia cercanas. El fuego puede destruirse de manera segura golpeándolo, pero es doloroso si te paras directamente en él. Si se inicia un fuego por encima de la base o un bloque de magma, se convertirá inmediatamente en un fuego eterno. -Fire is a damaging but non-destructive short-lived kind of block. It will disappear when there is no flammable block around. Fire does not destroy blocks, at least not in this world. It will be extinguished by nearby water and rain. Fire can be destroyed safely by punching it, but it is hurtful if you stand directly in it. If a fire is started above netherrack or a magma block, it will immediately turn into an eternal fire.=El fuego es un tipo de bloque dañino pero no destructivo de corta duración. Desaparecerá cuando no haya un bloque inflamable alrededor. El fuego no destruye bloques, al menos no en este mundo. Se extinguirá por el agua y la lluvia cercanas. El fuego puede destruirse de manera segura golpeándolo, pero es doloroso si te paras directamente en él. Si se inicia un fuego por encima de la base o un bloque de magma, se convertirá inmediatamente en un fuego eterno. +Flint and steel is a tool to start fires and ignite blocks.=El mechero es una herramienta para iniciar fuegos y encender bloques. +Rightclick the surface of a block to attempt to light a fire in front of it or ignite the block. A few blocks have an unique reaction when ignited.=Haga clic derecho en la superficie de un bloque para intentar encender un fuego frente a él o encender el bloque. Algunos bloques tienen una reacción única cuando se encienden. +Fire is a damaging and destructive but short-lived kind of block. It will destroy and spread towards near flammable blocks, but fire will disappear when there is nothing to burn left. It will be extinguished by nearby water and rain. Fire can be destroyed safely by punching it, but it is hurtful if you stand directly in it. If a fire is started above netherrack or a magma block, it will immediately turn into an eternal fire.=El fuego es un tipo de bloque dañino y destructivo pero de corta duración. Destruirá y se extenderá hacia bloques inflamables cercanos, pero el fuego desaparecerá cuando no quede nada para quemar. Se extinguirá por agua cercana o lluvia. El fuego puede destruirse de manera segura golpeándolo, pero es doloroso si te paras directamente en él. Si se inicia un fuego por encima de un bloque de netherrack o magma, se convertirá inmediatamente en un fuego eterno. +Fire is a damaging but non-destructive short-lived kind of block. It will disappear when there is no flammable block around. Fire does not destroy blocks, at least not in this world. It will be extinguished by nearby water and rain. Fire can be destroyed safely by punching it, but it is hurtful if you stand directly in it. If a fire is started above netherrack or a magma block, it will immediately turn into an eternal fire.=El fuego es un tipo de bloque dañino pero no destructivo de corta duración. Desaparecerá cuando no haya un bloque inflamable alrededor. El fuego no destruye bloques, al menos no en este mundo. Se extinguirá por el agua y la lluvia cercanas. El fuego puede destruirse de manera segura golpeándolo, pero es doloroso si te paras directamente en él. Si se inicia un fuego por encima de un bloque de netherrack o magma, se convertirá inmediatamente en un fuego eterno. Eternal fire is a damaging block that might create more fire. It will create fire around it when flammable blocks are nearby. Eternal fire can be extinguished by punches and nearby water blocks. Other than (normal) fire, eternal fire does not get extinguished on its own and also continues to burn under rain. Punching eternal fire is safe, but it hurts if you stand inside.=El fuego eterno es un bloque dañino que podría crear más fuego. Creará fuego alrededor cuando haya bloques inflamables cerca. El fuego eterno se puede extinguir con golpes y bloques de agua cercanos. Aparte del fuego (normal), el fuego eterno no se extingue por sí solo y también continúa ardiendo bajo la lluvia. Golpear el fuego eterno es seguro, pero duele si te paras dentro. Eternal fire is a damaging block. Eternal fire can be extinguished by punches and nearby water blocks. Other than (normal) fire, eternal fire does not get extinguished on its own and also continues to burn under rain. Punching eternal fire is safe, but it hurts if you stand inside.=El fuego eterno es un bloque dañino. El fuego eterno se puede extinguir con golpes y bloques de agua cercanos. Aparte del fuego (normal), el fuego eterno no se extingue por sí solo y también continúa ardiendo bajo la lluvia. Golpear el fuego eterno es seguro, pero duele si te paras dentro. @1 has been cooked crisp.=@1 se ha cocinado crujientemente. @1 felt the burn.=@1 sintió la quemadura. @1 died in the flames.=@1 murió en las llamas. -@1 died in a fire.=@ 1 murió en un incendio. +@1 died in a fire.=@1 murió en un incendio. Fire=Fuego Eternal Fire=Fuego eterno +Dispenser projectile=Dispensador de proyectiles +Starts fires and ignites blocks=Provoca incendios y pone bloques en llamas From 1d2a7b35d89dc0c1a5b9f3111dccf7c9b06e55f4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jos=C3=A9=20M?= Date: Sun, 10 Dec 2023 00:07:17 -0600 Subject: [PATCH 353/982] Update mcl_honey.es.tr --- mods/ITEMS/mcl_honey/locale/mcl_honey.es.tr | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/mods/ITEMS/mcl_honey/locale/mcl_honey.es.tr b/mods/ITEMS/mcl_honey/locale/mcl_honey.es.tr index 90382020a..fedf4ecc5 100644 --- a/mods/ITEMS/mcl_honey/locale/mcl_honey.es.tr +++ b/mods/ITEMS/mcl_honey/locale/mcl_honey.es.tr @@ -1,5 +1,6 @@ -Honeycomb=Bloque de panal -Used to craft beehives and protect copper blocks from further oxidation.=Se utiliza para fabricar apiarios de avejas y para proteger bloques de cobre +# textdomain: mcl_honey +Honeycomb=Panal +Used to craft beehives and protect copper blocks from further oxidation.=Se utiliza para fabricar apiarios de avejas y para proteger bloques de cobrede mayor oxidación. Use on copper blocks to prevent further oxidation.=Usa sobre bloques de cobre para evitar mayor oxidación. Honeycomb Block=Bloque de panal Honeycomb Block. Used as a decoration.=Bloque de panal. Se utiliza como decoración como decoración From 8dcb62aa56077408e5f9c2f7b6ac28106d74fe04 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jos=C3=A9=20M?= Date: Sun, 10 Dec 2023 00:11:07 -0600 Subject: [PATCH 354/982] Fix a typo in mcl_honey.es.tr --- mods/ITEMS/mcl_honey/locale/mcl_honey.es.tr | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mods/ITEMS/mcl_honey/locale/mcl_honey.es.tr b/mods/ITEMS/mcl_honey/locale/mcl_honey.es.tr index fedf4ecc5..bf87bf342 100644 --- a/mods/ITEMS/mcl_honey/locale/mcl_honey.es.tr +++ b/mods/ITEMS/mcl_honey/locale/mcl_honey.es.tr @@ -1,6 +1,6 @@ # textdomain: mcl_honey Honeycomb=Panal -Used to craft beehives and protect copper blocks from further oxidation.=Se utiliza para fabricar apiarios de avejas y para proteger bloques de cobrede mayor oxidación. +Used to craft beehives and protect copper blocks from further oxidation.=Se utiliza para fabricar apiarios de abejas y para proteger bloques de cobrede mayor oxidación. Use on copper blocks to prevent further oxidation.=Usa sobre bloques de cobre para evitar mayor oxidación. Honeycomb Block=Bloque de panal Honeycomb Block. Used as a decoration.=Bloque de panal. Se utiliza como decoración como decoración From 1ac65305d6c33f82a32da81a89d807691114a74e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jos=C3=A9=20M?= Date: Sun, 10 Dec 2023 00:13:40 -0600 Subject: [PATCH 355/982] Fix a typo in mcl_honey.es.tr --- mods/ITEMS/mcl_honey/locale/mcl_honey.es.tr | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mods/ITEMS/mcl_honey/locale/mcl_honey.es.tr b/mods/ITEMS/mcl_honey/locale/mcl_honey.es.tr index bf87bf342..f22ae7702 100644 --- a/mods/ITEMS/mcl_honey/locale/mcl_honey.es.tr +++ b/mods/ITEMS/mcl_honey/locale/mcl_honey.es.tr @@ -1,6 +1,6 @@ # textdomain: mcl_honey Honeycomb=Panal -Used to craft beehives and protect copper blocks from further oxidation.=Se utiliza para fabricar apiarios de abejas y para proteger bloques de cobrede mayor oxidación. +Used to craft beehives and protect copper blocks from further oxidation.=Se utiliza para fabricar apiarios de abejas y para proteger bloques de cobre de mayor oxidación. Use on copper blocks to prevent further oxidation.=Usa sobre bloques de cobre para evitar mayor oxidación. Honeycomb Block=Bloque de panal Honeycomb Block. Used as a decoration.=Bloque de panal. Se utiliza como decoración como decoración From 19fd075a2f6e4a59e12671b6af8d2aa126a85505 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jos=C3=A9=20M?= Date: Sun, 10 Dec 2023 01:16:43 -0600 Subject: [PATCH 356/982] Add the textdomain line in mcl_beehives.dk.tr This will remove the warning that is shown when running Wuzzy's Minetest_Translation_tools and will contribute to the issue 3540 --- mods/ITEMS/mcl_beehives/locale/mcl_beehives.dk.tr | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/mods/ITEMS/mcl_beehives/locale/mcl_beehives.dk.tr b/mods/ITEMS/mcl_beehives/locale/mcl_beehives.dk.tr index 61510cbc1..a0596338a 100644 --- a/mods/ITEMS/mcl_beehives/locale/mcl_beehives.dk.tr +++ b/mods/ITEMS/mcl_beehives/locale/mcl_beehives.dk.tr @@ -1,4 +1,5 @@ +# textdomain: mcl_beehives Beehive=Bistade Artificial bee nest.=Kunstigt bibo. Bee Nest=Bibo -A naturally generating block that houses bees and a tasty treat...if you can get it.=En naturligt genereret blok som indeholde bier og velsmagende godter... hvis du kan få fat i dem. \ No newline at end of file +A naturally generating block that houses bees and a tasty treat...if you can get it.=En naturligt genereret blok som indeholde bier og velsmagende godter... hvis du kan få fat i dem. From a60540c17e079008fe675e5e2c5802be89592386 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jos=C3=A9=20M?= Date: Sun, 10 Dec 2023 01:47:35 -0600 Subject: [PATCH 357/982] Remove a non empty translation in template file --- mods/ITEMS/mcl_armor/locale/template.txt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/mods/ITEMS/mcl_armor/locale/template.txt b/mods/ITEMS/mcl_armor/locale/template.txt index 64318f41b..29d98f6b9 100644 --- a/mods/ITEMS/mcl_armor/locale/template.txt +++ b/mods/ITEMS/mcl_armor/locale/template.txt @@ -31,7 +31,7 @@ Elytra= Increases underwater mining speed.= Blast Protection= Reduces explosion damage and knockback.= -Curse of Binding=Malédiction du lien éternel +Curse of Binding= Item cannot be removed from armor slots except due to death, breaking or in Creative Mode.= Feather Falling= Reduces fall damage.= @@ -48,4 +48,4 @@ Reflects some of the damage taken when hit, at the cost of reducing durability w Aqua Affinity= #Translations for armor trims -Smithing Template '@1'= \ No newline at end of file +Smithing Template '@1'= From 6dce3b4bc477a1deecac8af043426ad131ec97ac Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jos=C3=A9=20M?= Date: Sun, 10 Dec 2023 01:56:19 -0600 Subject: [PATCH 358/982] Remove whitespace-only translation in template file --- mods/PLAYER/mcl_skins/locale/template.txt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/mods/PLAYER/mcl_skins/locale/template.txt b/mods/PLAYER/mcl_skins/locale/template.txt index c39d4066d..12ba740d5 100644 --- a/mods/PLAYER/mcl_skins/locale/template.txt +++ b/mods/PLAYER/mcl_skins/locale/template.txt @@ -10,5 +10,5 @@ Bottoms= Tops= Hairs= Headwears= -Open skin configuration screen.= -Select= \ No newline at end of file +Open skin configuration screen.= +Select= From cf70de0ecc944f4ca797a3d1091e2b5ed04aa366 Mon Sep 17 00:00:00 2001 From: the-real-herowl Date: Sun, 10 Dec 2023 16:10:33 +0000 Subject: [PATCH 359/982] Add an on_attack callback for mobs (#4064) Added an on_attack callback that allows to execute additional custom logic after each attack. Reviewed-on: https://git.minetest.land/MineClone2/MineClone2/pulls/4064 Co-authored-by: the-real-herowl Co-committed-by: the-real-herowl --- mods/ENTITIES/mcl_mobs/combat.lua | 4 ++++ mods/ENTITIES/mcl_mobs/init.lua | 3 ++- 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/mods/ENTITIES/mcl_mobs/combat.lua b/mods/ENTITIES/mcl_mobs/combat.lua index 6b660c787..bb16eb71e 100644 --- a/mods/ENTITIES/mcl_mobs/combat.lua +++ b/mods/ENTITIES/mcl_mobs/combat.lua @@ -1252,5 +1252,9 @@ function mob_class:do_states_attack (dtime) self.attack_state(self, dtime) else + if self.on_attack then + self.on_attack(self, dtime) + end + end end diff --git a/mods/ENTITIES/mcl_mobs/init.lua b/mods/ENTITIES/mcl_mobs/init.lua index 630548f12..b0fc73d6e 100644 --- a/mods/ENTITIES/mcl_mobs/init.lua +++ b/mods/ENTITIES/mcl_mobs/init.lua @@ -314,7 +314,8 @@ function mcl_mobs.register_mob(name, def) return self:mob_activate(staticdata, def, dtime) end, - attack_state = def.attack_state, + attack_state = def.attack_state, -- custom attack state + on_attack = def.on_attack, -- called after attack, useful with otherwise predefined attack states (not custom) harmed_by_heal = def.harmed_by_heal, is_boss = def.is_boss, dealt_effect = def.dealt_effect, From 8b00fff4cb7866ec9c780b670a9a88201bd70ffe Mon Sep 17 00:00:00 2001 From: the-real-herowl Date: Mon, 11 Dec 2023 00:37:18 +0100 Subject: [PATCH 360/982] Remove dangling else --- mods/ENTITIES/mcl_mobs/combat.lua | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/mods/ENTITIES/mcl_mobs/combat.lua b/mods/ENTITIES/mcl_mobs/combat.lua index bb16eb71e..4396f3265 100644 --- a/mods/ENTITIES/mcl_mobs/combat.lua +++ b/mods/ENTITIES/mcl_mobs/combat.lua @@ -1250,11 +1250,10 @@ function mob_class:do_states_attack (dtime) elseif self.attack_type == "custom" and self.attack_state then self.attack_state(self, dtime) - else + end if self.on_attack then self.on_attack(self, dtime) end - end end From 5f3c901f11dfc5d7d34d3268cadd0722e075ed4b Mon Sep 17 00:00:00 2001 From: Bakawun Date: Thu, 16 Nov 2023 06:44:11 +0000 Subject: [PATCH 361/982] Ghast: align attributes with mc Ghast should spawn much more rarely than they currently do I set the value to 1/4th of the original value before 72000 was set as an attempt to lower spawn rates, it actually increased them. Align View distance, sound distance and shot interval with mc wiki. https://minecraft.fandom.com/wiki/Ghast Align fireball velocity with mc issue tracker https://bugs.mojang.com/browse/MC-238286 --- mods/ENTITIES/mobs_mc/ghast.lua | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/mods/ENTITIES/mobs_mc/ghast.lua b/mods/ENTITIES/mobs_mc/ghast.lua index 1a3d34e1b..9a396fb2b 100644 --- a/mods/ENTITIES/mobs_mc/ghast.lua +++ b/mods/ENTITIES/mobs_mc/ghast.lua @@ -33,7 +33,7 @@ mcl_mobs.register_mob("mobs_mc:ghast", { death = "mobs_mc_zombie_death", attack = "mobs_fireball", random = "mobs_eerie", - distance = 16, + distance = 80, -- TODO: damage -- TODO: better death }, @@ -50,10 +50,10 @@ mcl_mobs.register_mob("mobs_mc:ghast", { run_start = 0, run_end = 40, }, fall_damage = 0, - view_range = 100, + view_range = 64, attack_type = "dogshoot", arrow = "mobs_mc:fireball", - shoot_interval = 3.5, + shoot_interval = 3, shoot_offset = -5, dogshoot_switch = 1, dogshoot_count_max =1, @@ -107,7 +107,7 @@ mcl_mobs.register_arrow("mobs_mc:fireball", { visual = "sprite", visual_size = {x = 1, y = 1}, textures = {"mcl_fire_fire_charge.png"}, - velocity = 15, + velocity = 5, collisionbox = {-.5, -.5, -.5, .5, .5, .5}, _is_fireball = true, From 351e31a8893937946f7f4b756b20e1d69b9b6a43 Mon Sep 17 00:00:00 2001 From: Zasco Date: Tue, 12 Dec 2023 23:16:51 +0000 Subject: [PATCH 362/982] Move deepslate ore registration within generation check --- mods/MAPGEN/mcl_mapgen_core/ores.lua | 42 ++++++++++++++-------------- 1 file changed, 21 insertions(+), 21 deletions(-) diff --git a/mods/MAPGEN/mcl_mapgen_core/ores.lua b/mods/MAPGEN/mcl_mapgen_core/ores.lua index 403c0333d..3eeaefef8 100644 --- a/mods/MAPGEN/mcl_mapgen_core/ores.lua +++ b/mods/MAPGEN/mcl_mapgen_core/ores.lua @@ -128,27 +128,6 @@ minetest.register_ore({ }) -minetest.register_ore({ - ore_type = "blob", - ore = "mcl_deepslate:deepslate", - wherein = { "mcl_core:stone" }, - clust_scarcity = 200, - clust_num_ores = 100, - clust_size = 10, - y_min = deepslate_min, - y_max = deepslate_max, - noise_params = { - offset = 0, - scale = 1, - spread = { x = 250, y = 250, z = 250 }, - seed = 12345, - octaves = 3, - persist = 0.6, - lacunarity = 2, - flags = "defaults", - } -}) - minetest.register_ore({ ore_type = "blob", ore = "mcl_deepslate:tuff", @@ -173,6 +152,27 @@ minetest.register_ore({ -- DEEPSLATE if minetest.settings:get_bool("mcl_generate_deepslate", true) then + minetest.register_ore({ + ore_type = "blob", + ore = "mcl_deepslate:deepslate", + wherein = { "mcl_core:stone" }, + clust_scarcity = 200, + clust_num_ores = 100, + clust_size = 10, + y_min = deepslate_min, + y_max = deepslate_max, + noise_params = { + offset = 0, + scale = 1, + spread = { x = 250, y = 250, z = 250 }, + seed = 12345, + octaves = 3, + persist = 0.6, + lacunarity = 2, + flags = "defaults", + } + }) + minetest.register_ore({ ore_type = "scatter", ore = "mcl_deepslate:infested_deepslate", From e6ddc03d3c87bd99571d1494b90f301b7ee7d51c Mon Sep 17 00:00:00 2001 From: Bakawun Date: Tue, 7 Nov 2023 17:18:21 +0000 Subject: [PATCH 363/982] Shulker: lower shoot interval to 1 second In this video we can see the shulkers are shooting at a rate of once per second. https://youtube.com/shorts/8tUFaSZ4b7I?si=sszp4cnyXR4dXg9B The wiki confirms this but mentions a range of 1 to 5.5 seconds. I think this range is caused by the shulker closing and stopping shots for a few seconds but no longer than the max interval of 5.5 https://minecraft.fandom.com/wiki/Shulker#:~:text=The%20shulker%20continues%20firing%20every,unaffected%20by%20Levitation%20when%20hit --- mods/ENTITIES/mobs_mc/shulker.lua | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mods/ENTITIES/mobs_mc/shulker.lua b/mods/ENTITIES/mobs_mc/shulker.lua index ecf60debd..62be949f3 100644 --- a/mods/ENTITIES/mobs_mc/shulker.lua +++ b/mods/ENTITIES/mobs_mc/shulker.lua @@ -35,7 +35,7 @@ mcl_mobs.register_mob("mobs_mc:shulker", { type = "monster", spawn_class = "hostile", attack_type = "shoot", - shoot_interval = 0.5, + shoot_interval = 1.0, arrow = "mobs_mc:shulkerbullet", shoot_offset = 0.5, passive = false, From 8d34ff2a9a222338624c3f61f563786e9ee000d3 Mon Sep 17 00:00:00 2001 From: Bakawun Date: Mon, 13 Nov 2023 15:13:52 +0000 Subject: [PATCH 364/982] Shulker: Make shulker peek periodically Adjust walk and animation settings so the shulker peeks out randomly. --- mods/ENTITIES/mobs_mc/shulker.lua | 14 ++++++-------- 1 file changed, 6 insertions(+), 8 deletions(-) diff --git a/mods/ENTITIES/mobs_mc/shulker.lua b/mods/ENTITIES/mobs_mc/shulker.lua index 62be949f3..b468be175 100644 --- a/mods/ENTITIES/mobs_mc/shulker.lua +++ b/mods/ENTITIES/mobs_mc/shulker.lua @@ -51,7 +51,7 @@ mcl_mobs.register_mob("mobs_mc:shulker", { -- TODO: sounds -- TODO: Make shulker dye-able visual_size = {x=3, y=3}, - walk_chance = 0, + walk_chance = 10, knock_back = false, jump = false, can_despawn = false, @@ -65,15 +65,17 @@ mcl_mobs.register_mob("mobs_mc:shulker", { looting_factor = 0.0625}, }, animation = { - stand_speed = 25, walk_speed = 0, run_speed = 50, punch_speed = 25, + stand_speed = 25, walk_speed = 25, run_speed = 50, punch_speed = 25, speed_normal = 25, speed_run = 50, stand_start = 0, stand_end = 25, - walk_start = 25, walk_end = 45, - run_start = 45, run_end = 85, + walk_start = 65, walk_end = 65, + run_start = 65, run_end = 85, punch_start = 80, punch_end = 100, }, view_range = 16, fear_height = 0, + walk_velocity = 0, + run_velocity = 0, noyaw = true, do_custom = function(self,dtime) local pos = self.object:get_pos() @@ -81,10 +83,6 @@ mcl_mobs.register_mob("mobs_mc:shulker", { self.object:set_yaw(0) mcl_mobs:yaw(self, 0, 0, dtime) end - if self.state == "walk" or self.state == "stand" then - self.state = "stand" - self:set_animation("stand") - end if self.state == "attack" then self:set_animation("punch") end From 26cfdf0b7cb2d1915bb11406883fabbf0c405951 Mon Sep 17 00:00:00 2001 From: Bakawun Date: Tue, 14 Nov 2023 10:52:09 +0000 Subject: [PATCH 365/982] Shulker: randomize shoot interval Randomize shoot interval to between 1 and 5.5 seconds and set default shoot interval to 5.5 --- mods/ENTITIES/mobs_mc/shulker.lua | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/mods/ENTITIES/mobs_mc/shulker.lua b/mods/ENTITIES/mobs_mc/shulker.lua index b468be175..f1c723d01 100644 --- a/mods/ENTITIES/mobs_mc/shulker.lua +++ b/mods/ENTITIES/mobs_mc/shulker.lua @@ -35,7 +35,7 @@ mcl_mobs.register_mob("mobs_mc:shulker", { type = "monster", spawn_class = "hostile", attack_type = "shoot", - shoot_interval = 1.0, + shoot_interval = 5.5, arrow = "mobs_mc:shulkerbullet", shoot_offset = 0.5, passive = false, @@ -79,6 +79,7 @@ mcl_mobs.register_mob("mobs_mc:shulker", { noyaw = true, do_custom = function(self,dtime) local pos = self.object:get_pos() + self.shoot_interval = math.random(1, 5.5) if math.floor(self.object:get_yaw()) ~=0 then self.object:set_yaw(0) mcl_mobs:yaw(self, 0, 0, dtime) From b02a3deec7b59b3f27581669820121a612b31ccf Mon Sep 17 00:00:00 2001 From: Bakawun Date: Tue, 14 Nov 2023 13:57:56 +0000 Subject: [PATCH 366/982] Shulker; fix attack open animation, improve peek --- mods/ENTITIES/mobs_mc/shulker.lua | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/mods/ENTITIES/mobs_mc/shulker.lua b/mods/ENTITIES/mobs_mc/shulker.lua index f1c723d01..d1137cfe3 100644 --- a/mods/ENTITIES/mobs_mc/shulker.lua +++ b/mods/ENTITIES/mobs_mc/shulker.lua @@ -68,8 +68,10 @@ mcl_mobs.register_mob("mobs_mc:shulker", { stand_speed = 25, walk_speed = 25, run_speed = 50, punch_speed = 25, speed_normal = 25, speed_run = 50, stand_start = 0, stand_end = 25, - walk_start = 65, walk_end = 65, + walk_start = 45, walk_end = 65, + walk_loop = false, run_start = 65, run_end = 85, + run_loop punch_start = 80, punch_end = 100, }, view_range = 16, @@ -85,7 +87,7 @@ mcl_mobs.register_mob("mobs_mc:shulker", { mcl_mobs:yaw(self, 0, 0, dtime) end if self.state == "attack" then - self:set_animation("punch") + self:set_animation("run") end self.path.way = false self.look_at_players = false From b4511fb8c70d4f8542c0bdc37b663abf383bee33 Mon Sep 17 00:00:00 2001 From: Bakawun Date: Tue, 14 Nov 2023 14:47:24 +0000 Subject: [PATCH 367/982] Shulker, add missing false statement --- mods/ENTITIES/mobs_mc/shulker.lua | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mods/ENTITIES/mobs_mc/shulker.lua b/mods/ENTITIES/mobs_mc/shulker.lua index d1137cfe3..2b29fdcd6 100644 --- a/mods/ENTITIES/mobs_mc/shulker.lua +++ b/mods/ENTITIES/mobs_mc/shulker.lua @@ -71,7 +71,7 @@ mcl_mobs.register_mob("mobs_mc:shulker", { walk_start = 45, walk_end = 65, walk_loop = false, run_start = 65, run_end = 85, - run_loop + run_loop = false, punch_start = 80, punch_end = 100, }, view_range = 16, From f5079f15680583a824bca0d4a069af5321780343 Mon Sep 17 00:00:00 2001 From: cora Date: Wed, 15 Nov 2023 18:59:46 +0100 Subject: [PATCH 368/982] Add an option for mob arrows to be "homing" --- mods/ENTITIES/mcl_mobs/combat.lua | 3 +++ mods/ENTITIES/mcl_mobs/init.lua | 12 ++++++++++++ 2 files changed, 15 insertions(+) diff --git a/mods/ENTITIES/mcl_mobs/combat.lua b/mods/ENTITIES/mcl_mobs/combat.lua index 4396f3265..c7f8d3e84 100644 --- a/mods/ENTITIES/mcl_mobs/combat.lua +++ b/mods/ENTITIES/mcl_mobs/combat.lua @@ -1231,6 +1231,9 @@ function mob_class:do_states_attack (dtime) -- important for mcl_shields ent._shooter = self.object ent._saved_shooter_pos = self.object:get_pos() + if ent.homing then + ent._target = self.attack + end end local amount = (vec.x * vec.x + vec.y * vec.y + vec.z * vec.z) ^ 0.5 diff --git a/mods/ENTITIES/mcl_mobs/init.lua b/mods/ENTITIES/mcl_mobs/init.lua index b0fc73d6e..69bd7ebf4 100644 --- a/mods/ENTITIES/mcl_mobs/init.lua +++ b/mods/ENTITIES/mcl_mobs/init.lua @@ -350,6 +350,7 @@ function mcl_mobs.register_arrow(name, def) hit_node = def.hit_node, hit_mob = def.hit_mob, hit_object = def.hit_object, + homing = def.homing, drop = def.drop or false, -- drops arrow as registered item when true collisionbox = {0, 0, 0, 0, 0, 0}, -- remove box around arrows timer = 0, @@ -422,6 +423,17 @@ function mcl_mobs.register_arrow(name, def) end end + if self.homing and self._target then + local p = self._target:get_pos() + if p then + if minetest.line_of_sight(self.object:get_pos(), p) then + self.object:set_velocity(vector.direction(self.object:get_pos(), p) * self.velocity) + end + else + self.target = nil + end + end + if self.hit_player or self.hit_mob or self.hit_object then for _,player in pairs(minetest.get_objects_inside_radius(pos, 1.5)) do From 58bb26a7eff8d3055af6e5fbc735dbc610c82f8b Mon Sep 17 00:00:00 2001 From: cora Date: Wed, 15 Nov 2023 19:00:01 +0100 Subject: [PATCH 369/982] Make shulker bullets homing --- mods/ENTITIES/mobs_mc/shulker.lua | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mods/ENTITIES/mobs_mc/shulker.lua b/mods/ENTITIES/mobs_mc/shulker.lua index 2b29fdcd6..95ca7df1a 100644 --- a/mods/ENTITIES/mobs_mc/shulker.lua +++ b/mods/ENTITIES/mobs_mc/shulker.lua @@ -158,7 +158,7 @@ mcl_mobs.register_arrow("mobs_mc:shulkerbullet", { visual_size = {x = 0.25, y = 0.25}, textures = {"mobs_mc_shulkerbullet.png"}, velocity = 6, - + homing = true, hit_player = function(self, player) player:punch(self.object, 1.0, { full_punch_interval = 1.0, From 55fe71d73b4d29b2c3dd5808b47212e3d090178e Mon Sep 17 00:00:00 2001 From: cora Date: Thu, 26 Oct 2023 21:32:50 +0200 Subject: [PATCH 370/982] Add a get_arrow_hit_func function to mcl_mobs reason for this is that player:punch used by most mobs ignores armor worn by player --- mods/ENTITIES/mcl_mobs/init.lua | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/mods/ENTITIES/mcl_mobs/init.lua b/mods/ENTITIES/mcl_mobs/init.lua index 69bd7ebf4..cd79fed6f 100644 --- a/mods/ENTITIES/mcl_mobs/init.lua +++ b/mods/ENTITIES/mcl_mobs/init.lua @@ -334,6 +334,13 @@ function mcl_mobs.register_mob(name, def) end -- END mcl_mobs.register_mob function +function mcl_mobs.get_arrow_damage_func(damage, typ) + local typ = mcl_damage.types[typ] and typ or "arrow" + return function(projectile, object) + return mcl_util.deal_damage(object, damage, {type = typ}) + end +end + -- register arrow for shoot attack function mcl_mobs.register_arrow(name, def) From cf51c60527acdf9a9583f4cd48698fe700326369 Mon Sep 17 00:00:00 2001 From: cora Date: Thu, 26 Oct 2023 21:35:13 +0200 Subject: [PATCH 371/982] Fix shulker bullets ignoring armor --- mods/ENTITIES/mobs_mc/shulker.lua | 19 ++----------------- 1 file changed, 2 insertions(+), 17 deletions(-) diff --git a/mods/ENTITIES/mobs_mc/shulker.lua b/mods/ENTITIES/mobs_mc/shulker.lua index 95ca7df1a..bbc7eb0dc 100644 --- a/mods/ENTITIES/mobs_mc/shulker.lua +++ b/mods/ENTITIES/mobs_mc/shulker.lua @@ -159,25 +159,10 @@ mcl_mobs.register_arrow("mobs_mc:shulkerbullet", { textures = {"mobs_mc_shulkerbullet.png"}, velocity = 6, homing = true, - hit_player = function(self, player) - player:punch(self.object, 1.0, { - full_punch_interval = 1.0, - damage_groups = {fleshy = 4}, - }, nil) - end, - - hit_mob = function(self, mob) - mob:punch(self.object, 1.0, { - full_punch_interval = 1.0, - damage_groups = {fleshy = 4}, - }, nil) - end, - - hit_node = function(self, pos, node) - end + hit_player = mcl_mobs.get_arrow_damage_func(4), + hit_mob = mcl_mobs.get_arrow_damage_func(4), }) - mcl_mobs.register_egg("mobs_mc:shulker", S("Shulker"), "#946694", "#4d3852", 0) mcl_mobs:non_spawn_specific("mobs_mc:shulker","overworld",0,minetest.LIGHT_MAX+1) --[[ From 789c9a9a6d2cc73274584ff60d1610d41c18deb2 Mon Sep 17 00:00:00 2001 From: bakawun Date: Thu, 16 Nov 2023 11:21:25 +0100 Subject: [PATCH 372/982] Shulker: make bullet speed match mc speed is 5 according to https://www.gmbinder.com/share/-MelLRYIg8yCfuAqQ82g#:~:text=After%20doing%20some%20experimentation%20I,~5%20blocks%2Fsecond). --- mods/ENTITIES/mobs_mc/shulker.lua | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mods/ENTITIES/mobs_mc/shulker.lua b/mods/ENTITIES/mobs_mc/shulker.lua index bbc7eb0dc..ed0732001 100644 --- a/mods/ENTITIES/mobs_mc/shulker.lua +++ b/mods/ENTITIES/mobs_mc/shulker.lua @@ -157,7 +157,7 @@ mcl_mobs.register_arrow("mobs_mc:shulkerbullet", { visual = "sprite", visual_size = {x = 0.25, y = 0.25}, textures = {"mobs_mc_shulkerbullet.png"}, - velocity = 6, + velocity = 5, homing = true, hit_player = mcl_mobs.get_arrow_damage_func(4), hit_mob = mcl_mobs.get_arrow_damage_func(4), From 686646b86d1d37826957e7b6a2e8849b391f91df Mon Sep 17 00:00:00 2001 From: bakawun Date: Thu, 16 Nov 2023 18:27:54 +0100 Subject: [PATCH 373/982] Shulker: align armor value with mc and set it to 0 when opened --- mods/ENTITIES/mobs_mc/shulker.lua | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/mods/ENTITIES/mobs_mc/shulker.lua b/mods/ENTITIES/mobs_mc/shulker.lua index ed0732001..1b25dd53b 100644 --- a/mods/ENTITIES/mobs_mc/shulker.lua +++ b/mods/ENTITIES/mobs_mc/shulker.lua @@ -43,7 +43,7 @@ mcl_mobs.register_mob("mobs_mc:shulker", { hp_max = 30, xp_min = 5, xp_max = 5, - armor = 150, + armor = 20, collisionbox = {-0.5, -0.01, -0.5, 0.5, 0.99, 0.5}, visual = "mesh", mesh = "mobs_mc_shulker.b3d", @@ -77,7 +77,7 @@ mcl_mobs.register_mob("mobs_mc:shulker", { view_range = 16, fear_height = 0, walk_velocity = 0, - run_velocity = 0, + run_velocity = 0, noyaw = true, do_custom = function(self,dtime) local pos = self.object:get_pos() @@ -88,6 +88,11 @@ mcl_mobs.register_mob("mobs_mc:shulker", { end if self.state == "attack" then self:set_animation("run") + self:armor = 0 + if self.state == "stand" then + self.armor = 20 + if self.state == "walk" or self.state == "run" then + self.armor = 0 end self.path.way = false self.look_at_players = false From 69903aa4eccb1700fc9881e15680b115b3a2b607 Mon Sep 17 00:00:00 2001 From: the-real-herowl Date: Sat, 25 Nov 2023 02:55:06 +0100 Subject: [PATCH 374/982] Fixed crashes --- mods/ENTITIES/mobs_mc/shulker.lua | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/mods/ENTITIES/mobs_mc/shulker.lua b/mods/ENTITIES/mobs_mc/shulker.lua index 1b25dd53b..136652548 100644 --- a/mods/ENTITIES/mobs_mc/shulker.lua +++ b/mods/ENTITIES/mobs_mc/shulker.lua @@ -88,10 +88,10 @@ mcl_mobs.register_mob("mobs_mc:shulker", { end if self.state == "attack" then self:set_animation("run") - self:armor = 0 - if self.state == "stand" then + self.armor = 0 + elseif self.state == "stand" then self.armor = 20 - if self.state == "walk" or self.state == "run" then + elseif self.state == "walk" or self.state == "run" then self.armor = 0 end self.path.way = false From bc101314df221c61334fe2990d78c1a8c83018c5 Mon Sep 17 00:00:00 2001 From: bakawun Date: Mon, 11 Dec 2023 09:36:03 +0100 Subject: [PATCH 375/982] mobs:shulker:use on_attack to set shoot interval to between 1 and 6 seconds --- mods/ENTITIES/mobs_mc/shulker.lua | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/mods/ENTITIES/mobs_mc/shulker.lua b/mods/ENTITIES/mobs_mc/shulker.lua index 136652548..78959b717 100644 --- a/mods/ENTITIES/mobs_mc/shulker.lua +++ b/mods/ENTITIES/mobs_mc/shulker.lua @@ -35,7 +35,7 @@ mcl_mobs.register_mob("mobs_mc:shulker", { type = "monster", spawn_class = "hostile", attack_type = "shoot", - shoot_interval = 5.5, + shoot_interval = 6, arrow = "mobs_mc:shulkerbullet", shoot_offset = 0.5, passive = false, @@ -81,7 +81,6 @@ mcl_mobs.register_mob("mobs_mc:shulker", { noyaw = true, do_custom = function(self,dtime) local pos = self.object:get_pos() - self.shoot_interval = math.random(1, 5.5) if math.floor(self.object:get_yaw()) ~=0 then self.object:set_yaw(0) mcl_mobs:yaw(self, 0, 0, dtime) @@ -155,6 +154,9 @@ mcl_mobs.register_mob("mobs_mc:shulker", { end end end, + on_attack = function(self, dtime) + self.shoot_interval = math.random(1, 6) + end, }) -- bullet arrow (weapon) From 07eb70e9be2201da20424265a543ddbf0826cfe3 Mon Sep 17 00:00:00 2001 From: Wbjitscool Date: Wed, 13 Dec 2023 02:39:25 +0000 Subject: [PATCH 376/982] Update mods/ITEMS/mcl_stonecutter/init.lua --- mods/ITEMS/mcl_stonecutter/init.lua | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mods/ITEMS/mcl_stonecutter/init.lua b/mods/ITEMS/mcl_stonecutter/init.lua index 5edf424da..9284d2a9c 100644 --- a/mods/ITEMS/mcl_stonecutter/init.lua +++ b/mods/ITEMS/mcl_stonecutter/init.lua @@ -392,7 +392,7 @@ minetest.register_node("mcl_stonecutter:stonecutter", { type = "vertical_frames", aspect_w = 16, aspect_h = 16, - length = 1 + length = 0.15 } } }, From ed205190e439c573a291d2f7acc9973d6ff0e84a Mon Sep 17 00:00:00 2001 From: the-real-herowl Date: Wed, 13 Dec 2023 04:10:01 +0100 Subject: [PATCH 377/982] Nerfed slime and magma cube attack range --- mods/ENTITIES/mobs_mc/slime+magma_cube.lua | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/mods/ENTITIES/mobs_mc/slime+magma_cube.lua b/mods/ENTITIES/mobs_mc/slime+magma_cube.lua index 321a9c1ce..61e653781 100644 --- a/mods/ENTITIES/mobs_mc/slime+magma_cube.lua +++ b/mods/ENTITIES/mobs_mc/slime+magma_cube.lua @@ -197,7 +197,7 @@ local slime_big = { distance = 16, }, damage = 4, - reach = 3, + reach = 2.5, armor = 100, drops = {}, -- TODO: Fix animations @@ -238,7 +238,7 @@ slime_small.xp_max = 2 slime_small.collisionbox = {-0.51, -0.01, -0.51, 0.51, 1.00, 0.51} slime_small.visual_size = {x=6.25, y=6.25} slime_small.damage = 3 -slime_small.reach = 2.75 +slime_small.reach = 2.25 slime_small.walk_velocity = 1.8 slime_small.run_velocity = 1.8 slime_small.jump_height = 4.3 @@ -254,8 +254,8 @@ slime_tiny.xp_min = 1 slime_tiny.xp_max = 1 slime_tiny.collisionbox = {-0.2505, -0.01, -0.2505, 0.2505, 0.50, 0.2505} slime_tiny.visual_size = {x=3.125, y=3.125} -slime_tiny.damage = 0 -slime_tiny.reach = 2.5 +slime_tiny.damage = 1 +slime_tiny.reach = 2 slime_tiny.drops = { -- slimeball {name = "mcl_mobitems:slimeball", @@ -418,7 +418,7 @@ local magma_cube_big = { walk_velocity = 2.5, run_velocity = 2.5, damage = 6, - reach = 3, + reach = 2.35, armor = 53, drops = { {name = "mcl_mobitems:magma_cream", @@ -466,7 +466,7 @@ magma_cube_small.xp_max = 2 magma_cube_small.collisionbox = {-0.51, -0.01, -0.51, 0.51, 1.00, 0.51} magma_cube_small.visual_size = {x=6.25, y=6.25} magma_cube_small.damage = 3 -magma_cube_small.reach = 2.75 +magma_cube_small.reach = 2.1 magma_cube_small.walk_velocity = .8 magma_cube_small.run_velocity = 2.0 magma_cube_small.jump_height = 6 @@ -491,7 +491,7 @@ magma_cube_tiny.walk_velocity = 1.02 magma_cube_tiny.run_velocity = 1.02 magma_cube_tiny.jump_height = 4 magma_cube_tiny.damage = 3 -magma_cube_tiny.reach = 2.5 +magma_cube_tiny.reach = 2 magma_cube_tiny.armor = 50 magma_cube_tiny.drops = {} magma_cube_tiny.spawn_small_alternative = nil From a2c8d13f04391136b94c17abded46332065f96f0 Mon Sep 17 00:00:00 2001 From: the-real-herowl Date: Wed, 13 Dec 2023 04:51:56 +0100 Subject: [PATCH 378/982] Nerfed vexes and evokers --- mods/ENTITIES/mobs_mc/vex.lua | 6 +++++- mods/ENTITIES/mobs_mc/villager_evoker.lua | 7 ++++++- 2 files changed, 11 insertions(+), 2 deletions(-) diff --git a/mods/ENTITIES/mobs_mc/vex.lua b/mods/ENTITIES/mobs_mc/vex.lua index fbb33804d..cedbc59ad 100644 --- a/mods/ENTITIES/mobs_mc/vex.lua +++ b/mods/ENTITIES/mobs_mc/vex.lua @@ -37,6 +37,7 @@ mcl_mobs.register_mob("mobs_mc:vex", { walk_velocity = 3.2, run_velocity = 5.9, attack_type = "dogfight", + attack_frequency = 2, sounds = { -- TODO: random death = "mobs_mc_vex_death", @@ -63,10 +64,13 @@ mcl_mobs.register_mob("mobs_mc:vex", { self.object:set_properties({textures=self.base_texture}) end else + if self.base_texture[2] == "mobs_mc_vex_charging.png" then + self.base_texture[2] = "mobs_mc_vex.png" + end if self.base_texture[1] ~= "default_tool_steelsword.png" then self.base_texture[1] = "default_tool_steelsword.png" - self.object:set_properties({textures=self.base_texture}) end + self.object:set_properties({textures=self.base_texture}) end -- Take constant damage if the vex' life clock ran out diff --git a/mods/ENTITIES/mobs_mc/villager_evoker.lua b/mods/ENTITIES/mobs_mc/villager_evoker.lua index a34f0ffe9..9d465c25d 100644 --- a/mods/ENTITIES/mobs_mc/villager_evoker.lua +++ b/mods/ENTITIES/mobs_mc/villager_evoker.lua @@ -42,6 +42,7 @@ mcl_mobs.register_mob("mobs_mc:evoker", { run_velocity = 1.4, group_attack = true, attack_type = "dogfight", + attack_frequency = 15, -- Summon vexes custom_attack = function(self, to_attack) if not spawned_vexes[self] then spawned_vexes[self] = {} end @@ -64,7 +65,6 @@ mcl_mobs.register_mob("mobs_mc:evoker", { table.insert(spawned_vexes[self],ent) end end, - shoot_interval = 15, passive = false, drops = { {name = "mcl_core:emerald", @@ -86,6 +86,11 @@ mcl_mobs.register_mob("mobs_mc:evoker", { }, view_range = 16, fear_height = 4, + + on_spawn = function(self) + self.timer = 15 + return true + end, }) -- spawn eggs From ebd733be829ca7b3b447158c018d30cad12c6735 Mon Sep 17 00:00:00 2001 From: Wbjitscool Date: Wed, 13 Dec 2023 05:22:41 +0000 Subject: [PATCH 379/982] update's the campfire's fire burning animation to make it look better (#4077) improve the look of the campfire's flame/burning animation Reviewed-on: https://git.minetest.land/MineClone2/MineClone2/pulls/4077 Reviewed-by: the-real-herowl Co-authored-by: Wbjitscool Co-committed-by: Wbjitscool --- mods/ITEMS/mcl_campfires/api.lua | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mods/ITEMS/mcl_campfires/api.lua b/mods/ITEMS/mcl_campfires/api.lua index cd23a964b..4c1ddc758 100644 --- a/mods/ITEMS/mcl_campfires/api.lua +++ b/mods/ITEMS/mcl_campfires/api.lua @@ -282,7 +282,7 @@ function mcl_campfires.register_campfire(name, def) type="vertical_frames", aspect_w=32, aspect_h=16, - length=2.0 + length=0.8 }} }, overlay_tiles = { From a8806fe04e580eabbdbe583fb27c786c07cf028e Mon Sep 17 00:00:00 2001 From: Eliy21 Date: Wed, 13 Dec 2023 17:34:42 +0000 Subject: [PATCH 380/982] Add player invulnerability & fix not continuously damaging players when holding the attack key Player invulnerability is the same as Minecraft's Damage Immunity https://minecraft.wiki/w/Damage#Immunity The old code for some reason only allows a few damage by holding and does not continuously damage other players after a few hits --- mods/PLAYER/mcl_playerplus/init.lua | 42 ++++++++++++++++++++--------- 1 file changed, 30 insertions(+), 12 deletions(-) diff --git a/mods/PLAYER/mcl_playerplus/init.lua b/mods/PLAYER/mcl_playerplus/init.lua index 6cfb15bad..ed72a43b4 100644 --- a/mods/PLAYER/mcl_playerplus/init.lua +++ b/mods/PLAYER/mcl_playerplus/init.lua @@ -663,6 +663,8 @@ minetest.register_on_joinplayer(function(player) lastPos = nil, swimDistance = 0, jump_cooldown = -1, -- Cooldown timer for jumping, we need this to prevent the jump exhaustion to increase rapidly + last_damage = 0, + invul_timestamp = 0, } mcl_playerplus.elytra[player] = {active = false, rocketing = 0, speed = 0} @@ -727,19 +729,35 @@ mcl_damage.register_modifier(function(obj, damage, reason) end end, -200) --- damage invulnerability -mcl_damage.register_modifier(function(obj, damage, reason) - local invul = obj:get_meta():get_int("mcl_damage:invulnerable") - if invul > 0 then - return 0 - else - obj:get_meta():set_int("mcl_damage:invulnerable", 1) - minetest.after(0.5, function() - obj:get_meta():set_int("mcl_damage:invulnerable", 0) - end) - return damage +minetest.register_on_punchplayer(function(player, hitter, time_from_last_punch, tool_capabilities, dir, damage) + -- damage invulnerability + if hitter then + local name = player:get_player_name() + local time_now = minetest.get_us_time() + local invul_timestamp = mcl_playerplus_internal[name].invul_timestamp + local time_diff = time_now - invul_timestamp + -- check for invulnerability time in microseconds (0.5 second) + if time_diff <= 500000 and time_diff >= 0 then + damage = damage - mcl_playerplus_internal[name].last_damage + if damage < 0 then + damage = 0 + end + return damage + else + mcl_playerplus_internal[name].last_damage = damage + mcl_playerplus_internal[name].invul_timestamp = time_now + end end -end, -1000) + -- attack reach limit + if hitter and hitter:is_player() then + local player_pos = player:get_pos() + local hitter_pos = hitter:get_pos() + if vector.distance(player_pos, hitter_pos) > 3 then + damage = 0 + return damage + end + end +end) minetest.register_on_respawnplayer(function(player) local pos = player:get_pos() From a8c2d4534a6b52c5cbee876c1d02d6d8c164814c Mon Sep 17 00:00:00 2001 From: Eliy21 Date: Wed, 13 Dec 2023 17:42:42 +0000 Subject: [PATCH 381/982] Nerf long pvp enchanted knockbacks especially when running --- mods/ITEMS/mcl_enchanting/enchantments.lua | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/mods/ITEMS/mcl_enchanting/enchantments.lua b/mods/ITEMS/mcl_enchanting/enchantments.lua index c6436339c..6070efda9 100644 --- a/mods/ITEMS/mcl_enchanting/enchantments.lua +++ b/mods/ITEMS/mcl_enchanting/enchantments.lua @@ -278,12 +278,15 @@ function minetest.calculate_knockback(player, hitter, time_from_last_punch, tool end if hitter and hitter:is_player() then local wielditem = hitter:get_wielded_item() - knockback = knockback + 5 * mcl_enchanting.get_enchantment(wielditem, "knockback") + knockback = knockback + 6 * mcl_enchanting.get_enchantment(wielditem, "knockback") -- add player velocity to knockback + local v = player:get_velocity() local hv = hitter:get_velocity() local dir_dot = (hv.x * dir.x) + (hv.z * dir.z) - if dir_dot > 0 then - knockback = knockback + dir_dot * 2 + local hitter_mag = math.sqrt((hv.x * hv.x) + (hv.z * hv.z)) + local player_mag = math.sqrt((v.x * v.x) + (v.z * v.z)) + if dir_dot > 0 and player_mag <= hitter_mag * 0.625 then + knockback = knockback + hitter_mag * 0.0625 end elseif luaentity and luaentity._knockback then local kb = knockback + luaentity._knockback / 4 From 96aaf89036b3994787f75642ca49c3f6a85b4b6d Mon Sep 17 00:00:00 2001 From: Eliy21 Date: Wed, 13 Dec 2023 18:49:08 +0000 Subject: [PATCH 382/982] Readjust pvp enchant knockback to make the running knockback difference more pronounced --- mods/ITEMS/mcl_enchanting/enchantments.lua | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/mods/ITEMS/mcl_enchanting/enchantments.lua b/mods/ITEMS/mcl_enchanting/enchantments.lua index 6070efda9..44db05fe3 100644 --- a/mods/ITEMS/mcl_enchanting/enchantments.lua +++ b/mods/ITEMS/mcl_enchanting/enchantments.lua @@ -278,7 +278,7 @@ function minetest.calculate_knockback(player, hitter, time_from_last_punch, tool end if hitter and hitter:is_player() then local wielditem = hitter:get_wielded_item() - knockback = knockback + 6 * mcl_enchanting.get_enchantment(wielditem, "knockback") + knockback = knockback + 5 * mcl_enchanting.get_enchantment(wielditem, "knockback") -- add player velocity to knockback local v = player:get_velocity() local hv = hitter:get_velocity() @@ -286,7 +286,7 @@ function minetest.calculate_knockback(player, hitter, time_from_last_punch, tool local hitter_mag = math.sqrt((hv.x * hv.x) + (hv.z * hv.z)) local player_mag = math.sqrt((v.x * v.x) + (v.z * v.z)) if dir_dot > 0 and player_mag <= hitter_mag * 0.625 then - knockback = knockback + hitter_mag * 0.0625 + knockback = knockback + hitter_mag * 0.375 end elseif luaentity and luaentity._knockback then local kb = knockback + luaentity._knockback / 4 From b0e33793ec5b1e7a48cfc6713d6f10235f1e24d6 Mon Sep 17 00:00:00 2001 From: Eliy21 Date: Wed, 13 Dec 2023 20:04:15 +0000 Subject: [PATCH 383/982] Fix a potential bug that could bypass attack reach limit when a stronger attack breaches the invul --- mods/PLAYER/mcl_playerplus/init.lua | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/mods/PLAYER/mcl_playerplus/init.lua b/mods/PLAYER/mcl_playerplus/init.lua index ed72a43b4..83ea1a1aa 100644 --- a/mods/PLAYER/mcl_playerplus/init.lua +++ b/mods/PLAYER/mcl_playerplus/init.lua @@ -730,6 +730,15 @@ mcl_damage.register_modifier(function(obj, damage, reason) end, -200) minetest.register_on_punchplayer(function(player, hitter, time_from_last_punch, tool_capabilities, dir, damage) + -- attack reach limit + if hitter and hitter:is_player() then + local player_pos = player:get_pos() + local hitter_pos = hitter:get_pos() + if vector.distance(player_pos, hitter_pos) > 3 then + damage = 0 + return damage + end + end -- damage invulnerability if hitter then local name = player:get_player_name() @@ -748,15 +757,6 @@ minetest.register_on_punchplayer(function(player, hitter, time_from_last_punch, mcl_playerplus_internal[name].invul_timestamp = time_now end end - -- attack reach limit - if hitter and hitter:is_player() then - local player_pos = player:get_pos() - local hitter_pos = hitter:get_pos() - if vector.distance(player_pos, hitter_pos) > 3 then - damage = 0 - return damage - end - end end) minetest.register_on_respawnplayer(function(player) From 2b71462c1e3e983bb4f1a27c2a0afd2a4994ea7e Mon Sep 17 00:00:00 2001 From: Eliy21 Date: Wed, 13 Dec 2023 20:36:54 +0000 Subject: [PATCH 384/982] Prevent knockback if player is beyond attack reach limit --- mods/ITEMS/mcl_enchanting/enchantments.lua | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/mods/ITEMS/mcl_enchanting/enchantments.lua b/mods/ITEMS/mcl_enchanting/enchantments.lua index 44db05fe3..23145c176 100644 --- a/mods/ITEMS/mcl_enchanting/enchantments.lua +++ b/mods/ITEMS/mcl_enchanting/enchantments.lua @@ -276,7 +276,7 @@ function minetest.calculate_knockback(player, hitter, time_from_last_punch, tool if hitter then luaentity = hitter:get_luaentity() end - if hitter and hitter:is_player() then + if hitter and hitter:is_player() and distance <= 3 then local wielditem = hitter:get_wielded_item() knockback = knockback + 5 * mcl_enchanting.get_enchantment(wielditem, "knockback") -- add player velocity to knockback @@ -288,6 +288,8 @@ function minetest.calculate_knockback(player, hitter, time_from_last_punch, tool if dir_dot > 0 and player_mag <= hitter_mag * 0.625 then knockback = knockback + hitter_mag * 0.375 end + elseif hitter and hitter:is_player() and distance > 3 then + knockback = 0 elseif luaentity and luaentity._knockback then local kb = knockback + luaentity._knockback / 4 local punch_dir = dir From 85b1f5247a691f56201a452db31e0705d6d84e4a Mon Sep 17 00:00:00 2001 From: Eliy21 Date: Thu, 14 Dec 2023 07:46:16 +0000 Subject: [PATCH 385/982] Add vertical lift & minimum pvp knockback --- mods/ITEMS/mcl_enchanting/enchantments.lua | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) diff --git a/mods/ITEMS/mcl_enchanting/enchantments.lua b/mods/ITEMS/mcl_enchanting/enchantments.lua index 23145c176..741621f22 100644 --- a/mods/ITEMS/mcl_enchanting/enchantments.lua +++ b/mods/ITEMS/mcl_enchanting/enchantments.lua @@ -279,8 +279,20 @@ function minetest.calculate_knockback(player, hitter, time_from_last_punch, tool if hitter and hitter:is_player() and distance <= 3 then local wielditem = hitter:get_wielded_item() knockback = knockback + 5 * mcl_enchanting.get_enchantment(wielditem, "knockback") - -- add player velocity to knockback + -- add vertical lift to knockback local v = player:get_velocity() + if v and v.y <= 0.1 and v.y >= -0.1 and dir.y <= 0.44 then + player:add_velocity({ + x = 0, + y = 4.5, + z = 0 + }) + -- add minimum knockback + if knockback <= 1.5 then + knockback = knockback + 6 + end + end + -- add player velocity to knockback local hv = hitter:get_velocity() local dir_dot = (hv.x * dir.x) + (hv.z * dir.z) local hitter_mag = math.sqrt((hv.x * hv.x) + (hv.z * hv.z)) From b2507c36407237f225d4bab47db34ab04da01c0c Mon Sep 17 00:00:00 2001 From: Eliy21 Date: Thu, 14 Dec 2023 08:12:13 +0000 Subject: [PATCH 386/982] Make fire aspect enchant respect attack reach limit --- mods/ITEMS/mcl_enchanting/enchantments.lua | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/mods/ITEMS/mcl_enchanting/enchantments.lua b/mods/ITEMS/mcl_enchanting/enchantments.lua index 741621f22..399081d00 100644 --- a/mods/ITEMS/mcl_enchanting/enchantments.lua +++ b/mods/ITEMS/mcl_enchanting/enchantments.lua @@ -133,7 +133,11 @@ minetest.register_on_punchplayer(function(player, hitter, time_from_last_punch, if wielditem then local fire_aspect_level = mcl_enchanting.get_enchantment(wielditem, "fire_aspect") if fire_aspect_level > 0 then - mcl_burning.set_on_fire(player, fire_aspect_level * 4) + local player_pos = player:get_pos() + local hitter_pos = hitter:get_pos() + if vector.distance(hitter_pos, player_pos) <= 3 then + mcl_burning.set_on_fire(player, fire_aspect_level * 4) + end end end end From ed507d8509caae7dcda9f01bde756ba3c9e10cb6 Mon Sep 17 00:00:00 2001 From: Eliy21 Date: Thu, 14 Dec 2023 08:15:55 +0000 Subject: [PATCH 387/982] Remove unnecessary space in the attack reach limit on mobs code --- mods/ENTITIES/mcl_mobs/combat.lua | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mods/ENTITIES/mcl_mobs/combat.lua b/mods/ENTITIES/mcl_mobs/combat.lua index 4396f3265..5135aff7b 100644 --- a/mods/ENTITIES/mcl_mobs/combat.lua +++ b/mods/ENTITIES/mcl_mobs/combat.lua @@ -522,7 +522,7 @@ function mob_class:on_punch(hitter, tflp, tool_capabilities, dir) if is_player then -- is mob out of reach? - if vector.distance(mob_pos, player_pos) > 3 then + if vector.distance(mob_pos, player_pos) > 3 then return end -- is mob protected? From 49af5d2013b1330649394d3f302b648df5d05073 Mon Sep 17 00:00:00 2001 From: Eliy21 Date: Thu, 14 Dec 2023 08:51:34 +0000 Subject: [PATCH 388/982] Rebalance minimum pvp knockback to account for added knockbacks when moving --- mods/ITEMS/mcl_enchanting/enchantments.lua | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mods/ITEMS/mcl_enchanting/enchantments.lua b/mods/ITEMS/mcl_enchanting/enchantments.lua index 399081d00..34d4c1930 100644 --- a/mods/ITEMS/mcl_enchanting/enchantments.lua +++ b/mods/ITEMS/mcl_enchanting/enchantments.lua @@ -293,7 +293,7 @@ function minetest.calculate_knockback(player, hitter, time_from_last_punch, tool }) -- add minimum knockback if knockback <= 1.5 then - knockback = knockback + 6 + knockback = knockback + 4.5 end end -- add player velocity to knockback From bf9e487fa9fab03579bafc2b60442773d946f3e3 Mon Sep 17 00:00:00 2001 From: Eliy21 Date: Thu, 14 Dec 2023 09:27:28 +0000 Subject: [PATCH 389/982] Adjust minimum pvp knockback to be closer to MC --- mods/ITEMS/mcl_enchanting/enchantments.lua | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mods/ITEMS/mcl_enchanting/enchantments.lua b/mods/ITEMS/mcl_enchanting/enchantments.lua index 34d4c1930..12172ea3e 100644 --- a/mods/ITEMS/mcl_enchanting/enchantments.lua +++ b/mods/ITEMS/mcl_enchanting/enchantments.lua @@ -293,7 +293,7 @@ function minetest.calculate_knockback(player, hitter, time_from_last_punch, tool }) -- add minimum knockback if knockback <= 1.5 then - knockback = knockback + 4.5 + knockback = knockback + 4.875 end end -- add player velocity to knockback From 6b439fd1dedba5ff4c62e880846dd407dcf1bf47 Mon Sep 17 00:00:00 2001 From: Eliy21 Date: Thu, 14 Dec 2023 11:57:55 +0000 Subject: [PATCH 390/982] Add maximum pvp knockback limit & approximate enchant knockback distance to be similar to MC --- mods/ITEMS/mcl_enchanting/enchantments.lua | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/mods/ITEMS/mcl_enchanting/enchantments.lua b/mods/ITEMS/mcl_enchanting/enchantments.lua index 12172ea3e..a9fd40714 100644 --- a/mods/ITEMS/mcl_enchanting/enchantments.lua +++ b/mods/ITEMS/mcl_enchanting/enchantments.lua @@ -282,7 +282,7 @@ function minetest.calculate_knockback(player, hitter, time_from_last_punch, tool end if hitter and hitter:is_player() and distance <= 3 then local wielditem = hitter:get_wielded_item() - knockback = knockback + 5 * mcl_enchanting.get_enchantment(wielditem, "knockback") + knockback = knockback + 3 * mcl_enchanting.get_enchantment(wielditem, "knockback") -- add vertical lift to knockback local v = player:get_velocity() if v and v.y <= 0.1 and v.y >= -0.1 and dir.y <= 0.44 then @@ -304,6 +304,10 @@ function minetest.calculate_knockback(player, hitter, time_from_last_punch, tool if dir_dot > 0 and player_mag <= hitter_mag * 0.625 then knockback = knockback + hitter_mag * 0.375 end + -- add maximum knockback limit + if knockback > 12.875 then + knockback = 12.875 + end elseif hitter and hitter:is_player() and distance > 3 then knockback = 0 elseif luaentity and luaentity._knockback then From cee5bbc206e507eca4cf36fab0240eb000fc469d Mon Sep 17 00:00:00 2001 From: bakawun Date: Thu, 14 Dec 2023 16:50:23 +0100 Subject: [PATCH 391/982] mobs:fix typo in homing function --- mods/ENTITIES/mcl_mobs/init.lua | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mods/ENTITIES/mcl_mobs/init.lua b/mods/ENTITIES/mcl_mobs/init.lua index cd79fed6f..f4322bd31 100644 --- a/mods/ENTITIES/mcl_mobs/init.lua +++ b/mods/ENTITIES/mcl_mobs/init.lua @@ -437,7 +437,7 @@ function mcl_mobs.register_arrow(name, def) self.object:set_velocity(vector.direction(self.object:get_pos(), p) * self.velocity) end else - self.target = nil + self._target = nil end end From ae169b2814e1746ef81f5f6bb0d1abbd6b6598ed Mon Sep 17 00:00:00 2001 From: Eliy21 Date: Fri, 15 Dec 2023 03:09:48 +0000 Subject: [PATCH 392/982] Add fix to crash when moving bought villager trade item to empty sell slot bug by JoseDouglas26 (#4079) Add fix to #4062 by JoseDouglas26 https://git.minetest.land/MineClone2/MineClone2/issues/4062#issuecomment-74045 Reviewed-on: https://git.minetest.land/MineClone2/MineClone2/pulls/4079 Reviewed-by: the-real-herowl Co-authored-by: Eliy21 Co-committed-by: Eliy21 --- mods/ENTITIES/mobs_mc/villager.lua | 1 + 1 file changed, 1 insertion(+) diff --git a/mods/ENTITIES/mobs_mc/villager.lua b/mods/ENTITIES/mobs_mc/villager.lua index cb421b78b..9f1daf53d 100644 --- a/mods/ENTITIES/mobs_mc/villager.lua +++ b/mods/ENTITIES/mobs_mc/villager.lua @@ -1941,6 +1941,7 @@ local trade_inventory = { if not wanted2:is_empty() then inv:remove_item("input", inv:get_stack("wanted", 2)) end + local name = player:get_player_name() local trader = player_trading_with[name] minetest.sound_play("mobs_mc_villager_accept", {to_player = player:get_player_name(),object=trader.object}, true) end From 60367cdbe043e5afeb1ee092e2a55bec1d497272 Mon Sep 17 00:00:00 2001 From: Eliy21 Date: Fri, 15 Dec 2023 15:42:49 +0000 Subject: [PATCH 393/982] Revert unreliable bugfix There are times when the continuous damage when punching players does not happen so will not fix at the moment as using other weapons does still work. --- mods/PLAYER/mcl_playerplus/init.lua | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/mods/PLAYER/mcl_playerplus/init.lua b/mods/PLAYER/mcl_playerplus/init.lua index 83ea1a1aa..99230bf9a 100644 --- a/mods/PLAYER/mcl_playerplus/init.lua +++ b/mods/PLAYER/mcl_playerplus/init.lua @@ -664,7 +664,6 @@ minetest.register_on_joinplayer(function(player) swimDistance = 0, jump_cooldown = -1, -- Cooldown timer for jumping, we need this to prevent the jump exhaustion to increase rapidly last_damage = 0, - invul_timestamp = 0, } mcl_playerplus.elytra[player] = {active = false, rocketing = 0, speed = 0} @@ -742,11 +741,9 @@ minetest.register_on_punchplayer(function(player, hitter, time_from_last_punch, -- damage invulnerability if hitter then local name = player:get_player_name() - local time_now = minetest.get_us_time() - local invul_timestamp = mcl_playerplus_internal[name].invul_timestamp - local time_diff = time_now - invul_timestamp - -- check for invulnerability time in microseconds (0.5 second) - if time_diff <= 500000 and time_diff >= 0 then + -- check for invulnerability time for 0.5 second + local invul = player:get_meta():get_int("mcl_damage:invulnerable") + if invul > 0 then damage = damage - mcl_playerplus_internal[name].last_damage if damage < 0 then damage = 0 @@ -754,7 +751,10 @@ minetest.register_on_punchplayer(function(player, hitter, time_from_last_punch, return damage else mcl_playerplus_internal[name].last_damage = damage - mcl_playerplus_internal[name].invul_timestamp = time_now + player:get_meta():set_int("mcl_damage:invulnerable", 1) + minetest.after(0.5, function() + player:get_meta():set_int("mcl_damage:invulnerable", 0) + end) end end end) From ca556c052ff46d3c4856c26ba57fcbf90bd1adff Mon Sep 17 00:00:00 2001 From: Eliy21 Date: Fri, 15 Dec 2023 15:52:26 +0000 Subject: [PATCH 394/982] Prevent pvp knockbacks when invulnerable --- mods/ITEMS/mcl_enchanting/enchantments.lua | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/mods/ITEMS/mcl_enchanting/enchantments.lua b/mods/ITEMS/mcl_enchanting/enchantments.lua index a9fd40714..5f3971f60 100644 --- a/mods/ITEMS/mcl_enchanting/enchantments.lua +++ b/mods/ITEMS/mcl_enchanting/enchantments.lua @@ -285,7 +285,8 @@ function minetest.calculate_knockback(player, hitter, time_from_last_punch, tool knockback = knockback + 3 * mcl_enchanting.get_enchantment(wielditem, "knockback") -- add vertical lift to knockback local v = player:get_velocity() - if v and v.y <= 0.1 and v.y >= -0.1 and dir.y <= 0.44 then + local invul = player:get_meta():get_int("mcl_damage:invulnerable") + if v and v.y <= 0.1 and v.y >= -0.1 and dir.y <= 0.44 and invul == 0 then player:add_velocity({ x = 0, y = 4.5, @@ -308,6 +309,10 @@ function minetest.calculate_knockback(player, hitter, time_from_last_punch, tool if knockback > 12.875 then knockback = 12.875 end + -- remove knockback if invulnerable + if invul > 0 then + knockback = 0 + end elseif hitter and hitter:is_player() and distance > 3 then knockback = 0 elseif luaentity and luaentity._knockback then From 8e2c5249f54d677a14eae674d8fd7682b1973ac6 Mon Sep 17 00:00:00 2001 From: Eliy21 Date: Fri, 15 Dec 2023 15:59:08 +0000 Subject: [PATCH 395/982] Fix comment on player invul code --- mods/PLAYER/mcl_playerplus/init.lua | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mods/PLAYER/mcl_playerplus/init.lua b/mods/PLAYER/mcl_playerplus/init.lua index 99230bf9a..27eec4845 100644 --- a/mods/PLAYER/mcl_playerplus/init.lua +++ b/mods/PLAYER/mcl_playerplus/init.lua @@ -741,7 +741,7 @@ minetest.register_on_punchplayer(function(player, hitter, time_from_last_punch, -- damage invulnerability if hitter then local name = player:get_player_name() - -- check for invulnerability time for 0.5 second + -- check for invulnerability time (0.5 second) local invul = player:get_meta():get_int("mcl_damage:invulnerable") if invul > 0 then damage = damage - mcl_playerplus_internal[name].last_damage From d7b10d18d8872ff21fb4a5f1505afa799c6d5d83 Mon Sep 17 00:00:00 2001 From: Eliy21 Date: Fri, 15 Dec 2023 16:27:09 +0000 Subject: [PATCH 396/982] Fix not being able to give minimum knockback to players when both near and lower than them --- mods/ITEMS/mcl_enchanting/enchantments.lua | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/mods/ITEMS/mcl_enchanting/enchantments.lua b/mods/ITEMS/mcl_enchanting/enchantments.lua index 5f3971f60..b157f3211 100644 --- a/mods/ITEMS/mcl_enchanting/enchantments.lua +++ b/mods/ITEMS/mcl_enchanting/enchantments.lua @@ -286,12 +286,14 @@ function minetest.calculate_knockback(player, hitter, time_from_last_punch, tool -- add vertical lift to knockback local v = player:get_velocity() local invul = player:get_meta():get_int("mcl_damage:invulnerable") - if v and v.y <= 0.1 and v.y >= -0.1 and dir.y <= 0.44 and invul == 0 then - player:add_velocity({ - x = 0, - y = 4.5, - z = 0 - }) + if v and v.y <= 0.1 and v.y >= -0.1 and invul == 0 then + if dir.y <= 0.44 then + player:add_velocity({ + x = 0, + y = 4.5, + z = 0 + }) + end -- add minimum knockback if knockback <= 1.5 then knockback = knockback + 4.875 From cd83305f07572d68b2ea6ea8b5fc25356e59d499 Mon Sep 17 00:00:00 2001 From: Eliy21 Date: Fri, 15 Dec 2023 18:17:15 +0000 Subject: [PATCH 397/982] Make the vertical lift on pvp knockback similar to MC --- mods/ITEMS/mcl_enchanting/enchantments.lua | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/mods/ITEMS/mcl_enchanting/enchantments.lua b/mods/ITEMS/mcl_enchanting/enchantments.lua index b157f3211..b4092fe93 100644 --- a/mods/ITEMS/mcl_enchanting/enchantments.lua +++ b/mods/ITEMS/mcl_enchanting/enchantments.lua @@ -288,11 +288,11 @@ function minetest.calculate_knockback(player, hitter, time_from_last_punch, tool local invul = player:get_meta():get_int("mcl_damage:invulnerable") if v and v.y <= 0.1 and v.y >= -0.1 and invul == 0 then if dir.y <= 0.44 then - player:add_velocity({ - x = 0, - y = 4.5, - z = 0 - }) + if mcl_enchanting.get_enchantment(wielditem, "knockback") == 0 then + player:add_velocity({x = 0, y = 6.4, z = 0}) + else + player:add_velocity({x = 0, y = 7, z = 0}) + end end -- add minimum knockback if knockback <= 1.5 then From c9692c622481c45eac3213caeea8aa73ccf7cbd3 Mon Sep 17 00:00:00 2001 From: Eliy21 Date: Fri, 15 Dec 2023 19:49:04 +0000 Subject: [PATCH 398/982] Fix player invulnerability not getting disabled permanently bug --- mods/PLAYER/mcl_playerplus/init.lua | 20 ++++++++++++++------ 1 file changed, 14 insertions(+), 6 deletions(-) diff --git a/mods/PLAYER/mcl_playerplus/init.lua b/mods/PLAYER/mcl_playerplus/init.lua index 27eec4845..9b819142e 100644 --- a/mods/PLAYER/mcl_playerplus/init.lua +++ b/mods/PLAYER/mcl_playerplus/init.lua @@ -664,6 +664,7 @@ minetest.register_on_joinplayer(function(player) swimDistance = 0, jump_cooldown = -1, -- Cooldown timer for jumping, we need this to prevent the jump exhaustion to increase rapidly last_damage = 0, + invul_timestamp = 0, } mcl_playerplus.elytra[player] = {active = false, rocketing = 0, speed = 0} @@ -741,9 +742,15 @@ minetest.register_on_punchplayer(function(player, hitter, time_from_last_punch, -- damage invulnerability if hitter then local name = player:get_player_name() - -- check for invulnerability time (0.5 second) - local invul = player:get_meta():get_int("mcl_damage:invulnerable") - if invul > 0 then + local time_now = minetest.get_us_time() + local invul_timestamp = mcl_playerplus_internal[name].invul_timestamp + local time_diff = time_now - invul_timestamp + -- check for invulnerability time in microseconds (0.5 second) + if time_diff <= 500000 and time_diff >= 0 then + player:get_meta():set_int("mcl_damage:invulnerable", 1) + minetest.after(0.5, function() + player:get_meta():set_int("mcl_damage:invulnerable", 0) + end) damage = damage - mcl_playerplus_internal[name].last_damage if damage < 0 then damage = 0 @@ -751,10 +758,11 @@ minetest.register_on_punchplayer(function(player, hitter, time_from_last_punch, return damage else mcl_playerplus_internal[name].last_damage = damage - player:get_meta():set_int("mcl_damage:invulnerable", 1) - minetest.after(0.5, function() + mcl_playerplus_internal[name].invul_timestamp = time_now + local invul = player:get_meta():get_int("mcl_damage:invulnerable") + if invul > 0 then player:get_meta():set_int("mcl_damage:invulnerable", 0) - end) + end end end end) From 9b9747b3d8e82f6df14b58350890a42963e84909 Mon Sep 17 00:00:00 2001 From: Eliy21 Date: Fri, 15 Dec 2023 21:02:07 +0000 Subject: [PATCH 399/982] Prevent excessive vertical knockbacks if hit by a player from below --- mods/ITEMS/mcl_enchanting/enchantments.lua | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/mods/ITEMS/mcl_enchanting/enchantments.lua b/mods/ITEMS/mcl_enchanting/enchantments.lua index b4092fe93..4160da19f 100644 --- a/mods/ITEMS/mcl_enchanting/enchantments.lua +++ b/mods/ITEMS/mcl_enchanting/enchantments.lua @@ -286,7 +286,7 @@ function minetest.calculate_knockback(player, hitter, time_from_last_punch, tool -- add vertical lift to knockback local v = player:get_velocity() local invul = player:get_meta():get_int("mcl_damage:invulnerable") - if v and v.y <= 0.1 and v.y >= -0.1 and invul == 0 then + if v and v.y <= 0.01 and v.y >= -0.01 and invul == 0 then if dir.y <= 0.44 then if mcl_enchanting.get_enchantment(wielditem, "knockback") == 0 then player:add_velocity({x = 0, y = 6.4, z = 0}) @@ -311,6 +311,9 @@ function minetest.calculate_knockback(player, hitter, time_from_last_punch, tool if knockback > 12.875 then knockback = 12.875 end + if knockback > 6.4375 and dir.y >= 0.3 then + knockback = 6.4375 + end -- remove knockback if invulnerable if invul > 0 then knockback = 0 From f799596db9d33f5aba90d7819120834efeeb9815 Mon Sep 17 00:00:00 2001 From: Eliy21 Date: Fri, 15 Dec 2023 22:56:02 +0000 Subject: [PATCH 400/982] Make vertical pvp knockbacks respect attack reach limit & complete excess vertical kb prevention --- mods/ITEMS/mcl_enchanting/enchantments.lua | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/mods/ITEMS/mcl_enchanting/enchantments.lua b/mods/ITEMS/mcl_enchanting/enchantments.lua index 4160da19f..f792014d7 100644 --- a/mods/ITEMS/mcl_enchanting/enchantments.lua +++ b/mods/ITEMS/mcl_enchanting/enchantments.lua @@ -287,7 +287,7 @@ function minetest.calculate_knockback(player, hitter, time_from_last_punch, tool local v = player:get_velocity() local invul = player:get_meta():get_int("mcl_damage:invulnerable") if v and v.y <= 0.01 and v.y >= -0.01 and invul == 0 then - if dir.y <= 0.44 then + if dir.y <= 0.44 and distance <= 3 then if mcl_enchanting.get_enchantment(wielditem, "knockback") == 0 then player:add_velocity({x = 0, y = 6.4, z = 0}) else @@ -313,6 +313,8 @@ function minetest.calculate_knockback(player, hitter, time_from_last_punch, tool end if knockback > 6.4375 and dir.y >= 0.3 then knockback = 6.4375 + elseif knockback <= 6.4375 and dir.y >= 0.3 then + knockback = 1 end -- remove knockback if invulnerable if invul > 0 then From 33e8337bbb57919f6419a0187ffd19a5cab05b15 Mon Sep 17 00:00:00 2001 From: Eliy21 Date: Sat, 16 Dec 2023 07:58:26 +0000 Subject: [PATCH 401/982] Finish remaining excessive vertical pvp knockback prevention adjustments when hit from below --- mods/ITEMS/mcl_enchanting/enchantments.lua | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/mods/ITEMS/mcl_enchanting/enchantments.lua b/mods/ITEMS/mcl_enchanting/enchantments.lua index f792014d7..3c03cc846 100644 --- a/mods/ITEMS/mcl_enchanting/enchantments.lua +++ b/mods/ITEMS/mcl_enchanting/enchantments.lua @@ -286,13 +286,16 @@ function minetest.calculate_knockback(player, hitter, time_from_last_punch, tool -- add vertical lift to knockback local v = player:get_velocity() local invul = player:get_meta():get_int("mcl_damage:invulnerable") + local enchant = mcl_enchanting.get_enchantment(wielditem, "knockback") if v and v.y <= 0.01 and v.y >= -0.01 and invul == 0 then - if dir.y <= 0.44 and distance <= 3 then - if mcl_enchanting.get_enchantment(wielditem, "knockback") == 0 then + if dir.y <= 0.3 then + if enchant == 0 then player:add_velocity({x = 0, y = 6.4, z = 0}) else player:add_velocity({x = 0, y = 7, z = 0}) end + elseif dir.y <= 0.44 and dir.y > 0.3 and enchant > 0 then + knockback = knockback + 3 end -- add minimum knockback if knockback <= 1.5 then @@ -311,10 +314,8 @@ function minetest.calculate_knockback(player, hitter, time_from_last_punch, tool if knockback > 12.875 then knockback = 12.875 end - if knockback > 6.4375 and dir.y >= 0.3 then - knockback = 6.4375 - elseif knockback <= 6.4375 and dir.y >= 0.3 then - knockback = 1 + if knockback > 6.275 and dir.y >= 0.3 and v.y == 0 and enchant == 0 then + knockback = 6.275 end -- remove knockback if invulnerable if invul > 0 then From cfab59d68a2bfafb814b980d947b3b1b5e1848c6 Mon Sep 17 00:00:00 2001 From: Eliy21 Date: Sat, 16 Dec 2023 09:20:29 +0000 Subject: [PATCH 402/982] Rebalanced moving pvp knockbacks --- mods/ITEMS/mcl_enchanting/enchantments.lua | 9 +++------ 1 file changed, 3 insertions(+), 6 deletions(-) diff --git a/mods/ITEMS/mcl_enchanting/enchantments.lua b/mods/ITEMS/mcl_enchanting/enchantments.lua index 3c03cc846..fdcb66388 100644 --- a/mods/ITEMS/mcl_enchanting/enchantments.lua +++ b/mods/ITEMS/mcl_enchanting/enchantments.lua @@ -282,7 +282,7 @@ function minetest.calculate_knockback(player, hitter, time_from_last_punch, tool end if hitter and hitter:is_player() and distance <= 3 then local wielditem = hitter:get_wielded_item() - knockback = knockback + 3 * mcl_enchanting.get_enchantment(wielditem, "knockback") + knockback = knockback + 3.22 * mcl_enchanting.get_enchantment(wielditem, "knockback") -- add vertical lift to knockback local v = player:get_velocity() local invul = player:get_meta():get_int("mcl_damage:invulnerable") @@ -308,12 +308,9 @@ function minetest.calculate_knockback(player, hitter, time_from_last_punch, tool local hitter_mag = math.sqrt((hv.x * hv.x) + (hv.z * hv.z)) local player_mag = math.sqrt((v.x * v.x) + (v.z * v.z)) if dir_dot > 0 and player_mag <= hitter_mag * 0.625 then - knockback = knockback + hitter_mag * 0.375 - end - -- add maximum knockback limit - if knockback > 12.875 then - knockback = 12.875 + knockback = knockback + hitter_mag * 0.6875 end + -- add vertical knockback limit on angled hit if knockback > 6.275 and dir.y >= 0.3 and v.y == 0 and enchant == 0 then knockback = 6.275 end From 8fbd72c1422061a0b99bf3916e3af7f0bca449bc Mon Sep 17 00:00:00 2001 From: Eliy21 Date: Sat, 16 Dec 2023 09:46:18 +0000 Subject: [PATCH 403/982] Optimize code by calling get_enchantment function only once --- mods/ITEMS/mcl_enchanting/enchantments.lua | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/mods/ITEMS/mcl_enchanting/enchantments.lua b/mods/ITEMS/mcl_enchanting/enchantments.lua index fdcb66388..6194945a7 100644 --- a/mods/ITEMS/mcl_enchanting/enchantments.lua +++ b/mods/ITEMS/mcl_enchanting/enchantments.lua @@ -282,11 +282,12 @@ function minetest.calculate_knockback(player, hitter, time_from_last_punch, tool end if hitter and hitter:is_player() and distance <= 3 then local wielditem = hitter:get_wielded_item() - knockback = knockback + 3.22 * mcl_enchanting.get_enchantment(wielditem, "knockback") + --knockback = knockback + 3 * mcl_enchanting.get_enchantment(wielditem, "knockback") + local enchant = mcl_enchanting.get_enchantment(wielditem, "knockback") + knockback = knockback + 3.22 * enchant -- add vertical lift to knockback local v = player:get_velocity() local invul = player:get_meta():get_int("mcl_damage:invulnerable") - local enchant = mcl_enchanting.get_enchantment(wielditem, "knockback") if v and v.y <= 0.01 and v.y >= -0.01 and invul == 0 then if dir.y <= 0.3 then if enchant == 0 then From 32e91b45ae5d6f84844b0db927dfe650da274af1 Mon Sep 17 00:00:00 2001 From: Eliy21 Date: Sat, 16 Dec 2023 11:48:16 +0000 Subject: [PATCH 404/982] Add vertical pvp knockbacks from downward hits & reduce pvp kb on half block angled upward hits --- mods/ITEMS/mcl_enchanting/enchantments.lua | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/mods/ITEMS/mcl_enchanting/enchantments.lua b/mods/ITEMS/mcl_enchanting/enchantments.lua index 6194945a7..836a13a65 100644 --- a/mods/ITEMS/mcl_enchanting/enchantments.lua +++ b/mods/ITEMS/mcl_enchanting/enchantments.lua @@ -290,10 +290,16 @@ function minetest.calculate_knockback(player, hitter, time_from_last_punch, tool local invul = player:get_meta():get_int("mcl_damage:invulnerable") if v and v.y <= 0.01 and v.y >= -0.01 and invul == 0 then if dir.y <= 0.3 then + local regular_v = 6.4 + local enchant_v = 7 + if dir.y <= 0.27 then + regular_v = regular_v * math.abs(dir.y - 1) + enchant_v = enchant_v * math.abs(dir.y - 1) + end if enchant == 0 then - player:add_velocity({x = 0, y = 6.4, z = 0}) + player:add_velocity({x = 0, y = regular_v, z = 0}) else - player:add_velocity({x = 0, y = 7, z = 0}) + player:add_velocity({x = 0, y = enchant_v, z = 0}) end elseif dir.y <= 0.44 and dir.y > 0.3 and enchant > 0 then knockback = knockback + 3 From e8ee9c44635657862dcf54e59f829ddec1a0ed09 Mon Sep 17 00:00:00 2001 From: Eliy21 Date: Sat, 16 Dec 2023 12:58:58 +0000 Subject: [PATCH 405/982] Remove obsolete work-around code --- mods/ITEMS/mcl_enchanting/enchantments.lua | 26 +++++++--------------- 1 file changed, 8 insertions(+), 18 deletions(-) diff --git a/mods/ITEMS/mcl_enchanting/enchantments.lua b/mods/ITEMS/mcl_enchanting/enchantments.lua index 836a13a65..28cb1083c 100644 --- a/mods/ITEMS/mcl_enchanting/enchantments.lua +++ b/mods/ITEMS/mcl_enchanting/enchantments.lua @@ -289,20 +289,14 @@ function minetest.calculate_knockback(player, hitter, time_from_last_punch, tool local v = player:get_velocity() local invul = player:get_meta():get_int("mcl_damage:invulnerable") if v and v.y <= 0.01 and v.y >= -0.01 and invul == 0 then - if dir.y <= 0.3 then - local regular_v = 6.4 - local enchant_v = 7 - if dir.y <= 0.27 then - regular_v = regular_v * math.abs(dir.y - 1) - enchant_v = enchant_v * math.abs(dir.y - 1) - end - if enchant == 0 then - player:add_velocity({x = 0, y = regular_v, z = 0}) - else - player:add_velocity({x = 0, y = enchant_v, z = 0}) - end - elseif dir.y <= 0.44 and dir.y > 0.3 and enchant > 0 then - knockback = knockback + 3 + local regular_v = 6.4 + local enchant_v = 7 + regular_v = regular_v * math.abs(dir.y - 1) + enchant_v = enchant_v * math.abs(dir.y - 1) + if enchant == 0 then + player:add_velocity({x = 0, y = regular_v, z = 0}) + else + player:add_velocity({x = 0, y = enchant_v, z = 0}) end -- add minimum knockback if knockback <= 1.5 then @@ -317,10 +311,6 @@ function minetest.calculate_knockback(player, hitter, time_from_last_punch, tool if dir_dot > 0 and player_mag <= hitter_mag * 0.625 then knockback = knockback + hitter_mag * 0.6875 end - -- add vertical knockback limit on angled hit - if knockback > 6.275 and dir.y >= 0.3 and v.y == 0 and enchant == 0 then - knockback = 6.275 - end -- remove knockback if invulnerable if invul > 0 then knockback = 0 From 0a8874ecad38bf8e9738a2cba67a2f83d0e782cf Mon Sep 17 00:00:00 2001 From: Eliy21 Date: Sun, 17 Dec 2023 16:39:04 +0000 Subject: [PATCH 406/982] Make vertical pvp knockbacks less floaty --- mods/ITEMS/mcl_enchanting/enchantments.lua | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/mods/ITEMS/mcl_enchanting/enchantments.lua b/mods/ITEMS/mcl_enchanting/enchantments.lua index 28cb1083c..1d065db3b 100644 --- a/mods/ITEMS/mcl_enchanting/enchantments.lua +++ b/mods/ITEMS/mcl_enchanting/enchantments.lua @@ -291,13 +291,19 @@ function minetest.calculate_knockback(player, hitter, time_from_last_punch, tool if v and v.y <= 0.01 and v.y >= -0.01 and invul == 0 then local regular_v = 6.4 local enchant_v = 7 + local added_v = 0 regular_v = regular_v * math.abs(dir.y - 1) enchant_v = enchant_v * math.abs(dir.y - 1) if enchant == 0 then player:add_velocity({x = 0, y = regular_v, z = 0}) + added_v = regular_v else player:add_velocity({x = 0, y = enchant_v, z = 0}) + added_v = enchant_v end + minetest.after(0.25, function() + player:add_velocity({x = 0, y = -added_v * 0.375 , z = 0}) + end) -- add minimum knockback if knockback <= 1.5 then knockback = knockback + 4.875 From 8612350fa786053d42eb51260f72b4cc4059835a Mon Sep 17 00:00:00 2001 From: Eliy21 Date: Sun, 17 Dec 2023 17:48:39 +0000 Subject: [PATCH 407/982] Make vertical pvp knockback floatiness reduction include moving hits --- mods/ITEMS/mcl_enchanting/enchantments.lua | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/mods/ITEMS/mcl_enchanting/enchantments.lua b/mods/ITEMS/mcl_enchanting/enchantments.lua index 1d065db3b..05a1e7531 100644 --- a/mods/ITEMS/mcl_enchanting/enchantments.lua +++ b/mods/ITEMS/mcl_enchanting/enchantments.lua @@ -287,11 +287,11 @@ function minetest.calculate_knockback(player, hitter, time_from_last_punch, tool knockback = knockback + 3.22 * enchant -- add vertical lift to knockback local v = player:get_velocity() + local added_v = 0 local invul = player:get_meta():get_int("mcl_damage:invulnerable") if v and v.y <= 0.01 and v.y >= -0.01 and invul == 0 then local regular_v = 6.4 local enchant_v = 7 - local added_v = 0 regular_v = regular_v * math.abs(dir.y - 1) enchant_v = enchant_v * math.abs(dir.y - 1) if enchant == 0 then @@ -301,9 +301,6 @@ function minetest.calculate_knockback(player, hitter, time_from_last_punch, tool player:add_velocity({x = 0, y = enchant_v, z = 0}) added_v = enchant_v end - minetest.after(0.25, function() - player:add_velocity({x = 0, y = -added_v * 0.375 , z = 0}) - end) -- add minimum knockback if knockback <= 1.5 then knockback = knockback + 4.875 @@ -317,6 +314,10 @@ function minetest.calculate_knockback(player, hitter, time_from_last_punch, tool if dir_dot > 0 and player_mag <= hitter_mag * 0.625 then knockback = knockback + hitter_mag * 0.6875 end + -- reduce floatiness + minetest.after(0.25, function() + player:add_velocity({x = 0, y = (v.y + added_v) * -0.375 , z = 0}) + end) -- remove knockback if invulnerable if invul > 0 then knockback = 0 From 6d7ae8ba2df7e4d2639f0e22cef3fb69e3423468 Mon Sep 17 00:00:00 2001 From: Eliy21 Date: Sun, 17 Dec 2023 19:59:18 +0000 Subject: [PATCH 408/982] Add minimum unenchanted knockback to bow --- mods/ITEMS/mcl_bows/bow.lua | 2 ++ 1 file changed, 2 insertions(+) diff --git a/mods/ITEMS/mcl_bows/bow.lua b/mods/ITEMS/mcl_bows/bow.lua index 174208c3c..188035b99 100644 --- a/mods/ITEMS/mcl_bows/bow.lua +++ b/mods/ITEMS/mcl_bows/bow.lua @@ -49,6 +49,8 @@ function mcl_bows.shoot_arrow(arrow_item, pos, dir, yaw, shooter, power, damage, end if enchantments.punch then knockback = enchantments.punch * 21 + else + knockback = 4.875 end if enchantments.flame then mcl_burning.set_on_fire(obj, math.huge) From c39e55e2d4e4ce878cc04947aecdcf7590fe7f0e Mon Sep 17 00:00:00 2001 From: Eliy21 Date: Sun, 17 Dec 2023 20:01:35 +0000 Subject: [PATCH 409/982] Add minimum knockback to crossbow --- mods/ITEMS/mcl_bows/crossbow.lua | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mods/ITEMS/mcl_bows/crossbow.lua b/mods/ITEMS/mcl_bows/crossbow.lua index df7b5f560..fcc60c460 100644 --- a/mods/ITEMS/mcl_bows/crossbow.lua +++ b/mods/ITEMS/mcl_bows/crossbow.lua @@ -48,7 +48,7 @@ function mcl_bows_s.shoot_arrow_crossbow(arrow_item, pos, dir, yaw, shooter, pow if damage == nil then damage = 3 end - local knockback + local knockback = 4.875 if crossbow_stack then local enchantments = mcl_enchanting.get_enchantments(crossbow_stack) if enchantments.piercing then From 200f7451ebfaff94653bca4f9d89495f4e04c6a7 Mon Sep 17 00:00:00 2001 From: Eliy21 Date: Sun, 17 Dec 2023 21:15:55 +0000 Subject: [PATCH 410/982] Remove unnecessary invul code & add damage animation code --- mods/PLAYER/mcl_playerplus/init.lua | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/mods/PLAYER/mcl_playerplus/init.lua b/mods/PLAYER/mcl_playerplus/init.lua index 9b819142e..e3d323854 100644 --- a/mods/PLAYER/mcl_playerplus/init.lua +++ b/mods/PLAYER/mcl_playerplus/init.lua @@ -759,10 +759,10 @@ minetest.register_on_punchplayer(function(player, hitter, time_from_last_punch, else mcl_playerplus_internal[name].last_damage = damage mcl_playerplus_internal[name].invul_timestamp = time_now - local invul = player:get_meta():get_int("mcl_damage:invulnerable") - if invul > 0 then - player:get_meta():set_int("mcl_damage:invulnerable", 0) - end + player:get_meta():set_int("mcl_damage:damage_animation", 1) + minetest.after(0.5, function() + player:get_meta():set_int("mcl_damage:damage_animation", 0) + end) end end end) From 12109e7f44c49f5f4c8815717377a2a5410f12fc Mon Sep 17 00:00:00 2001 From: Eliy21 Date: Sun, 17 Dec 2023 21:18:57 +0000 Subject: [PATCH 411/982] Add player damage animation --- mods/PLAYER/mcl_player/init.lua | 2 ++ 1 file changed, 2 insertions(+) diff --git a/mods/PLAYER/mcl_player/init.lua b/mods/PLAYER/mcl_player/init.lua index 288b697e1..8ebcedccf 100644 --- a/mods/PLAYER/mcl_player/init.lua +++ b/mods/PLAYER/mcl_player/init.lua @@ -228,6 +228,8 @@ minetest.register_globalstep(function(dtime) -- Apply animations based on what the player is doing if player:get_hp() == 0 then player_set_animation(player, "die") + elseif player:get_meta():get_int("mcl_damage:damage_animation") > 0 then + player_set_animation(player, "walk", animation_speed_mod) elseif mcl_playerplus.elytra[player] and mcl_playerplus.elytra[player].active then player_set_animation(player, "stand") elseif walking and velocity.x > 0.35 From 07147e9d5be3b237c351d349d2e42e580dcbe4b8 Mon Sep 17 00:00:00 2001 From: the-real-herowl Date: Mon, 18 Dec 2023 02:56:43 +0100 Subject: [PATCH 412/982] Make slime+magmacube collision boxes rotate properly --- mods/ENTITIES/mobs_mc/slime+magma_cube.lua | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/mods/ENTITIES/mobs_mc/slime+magma_cube.lua b/mods/ENTITIES/mobs_mc/slime+magma_cube.lua index 61e653781..242e2153d 100644 --- a/mods/ENTITIES/mobs_mc/slime+magma_cube.lua +++ b/mods/ENTITIES/mobs_mc/slime+magma_cube.lua @@ -183,7 +183,7 @@ local slime_big = { hp_max = 16, xp_min = 4, xp_max = 4, - collisionbox = {-1.02, -0.01, -1.02, 1.02, 2.03, 1.02}, + collisionbox = {-1.02, -0.01, -1.02, 1.02, 2.03, 1.02, rotate = true}, visual_size = {x=12.5, y=12.5}, textures = {{"mobs_mc_slime.png", "mobs_mc_slime.png"}}, visual = "mesh", @@ -235,7 +235,7 @@ slime_small.hp_min = 4 slime_small.hp_max = 4 slime_small.xp_min = 2 slime_small.xp_max = 2 -slime_small.collisionbox = {-0.51, -0.01, -0.51, 0.51, 1.00, 0.51} +slime_small.collisionbox = {-0.51, -0.01, -0.51, 0.51, 1.00, 0.51, rotate = true} slime_small.visual_size = {x=6.25, y=6.25} slime_small.damage = 3 slime_small.reach = 2.25 @@ -252,7 +252,7 @@ slime_tiny.hp_min = 1 slime_tiny.hp_max = 1 slime_tiny.xp_min = 1 slime_tiny.xp_max = 1 -slime_tiny.collisionbox = {-0.2505, -0.01, -0.2505, 0.2505, 0.50, 0.2505} +slime_tiny.collisionbox = {-0.2505, -0.01, -0.2505, 0.2505, 0.50, 0.2505, rotate = true} slime_tiny.visual_size = {x=3.125, y=3.125} slime_tiny.damage = 1 slime_tiny.reach = 2 @@ -403,7 +403,7 @@ local magma_cube_big = { hp_max = 16, xp_min = 4, xp_max = 4, - collisionbox = {-1.02, -0.01, -1.02, 1.02, 2.03, 1.02}, + collisionbox = {-1.02, -0.01, -1.02, 1.02, 2.03, 1.02, rotate = true}, visual_size = {x=12.5, y=12.5}, textures = {{ "mobs_mc_magmacube.png", "mobs_mc_magmacube.png" }}, visual = "mesh", @@ -463,7 +463,7 @@ magma_cube_small.hp_min = 4 magma_cube_small.hp_max = 4 magma_cube_small.xp_min = 2 magma_cube_small.xp_max = 2 -magma_cube_small.collisionbox = {-0.51, -0.01, -0.51, 0.51, 1.00, 0.51} +magma_cube_small.collisionbox = {-0.51, -0.01, -0.51, 0.51, 1.00, 0.51, rotate = true} magma_cube_small.visual_size = {x=6.25, y=6.25} magma_cube_small.damage = 3 magma_cube_small.reach = 2.1 @@ -485,7 +485,7 @@ magma_cube_tiny.hp_min = 1 magma_cube_tiny.hp_max = 1 magma_cube_tiny.xp_min = 1 magma_cube_tiny.xp_max = 1 -magma_cube_tiny.collisionbox = {-0.2505, -0.01, -0.2505, 0.2505, 0.50, 0.2505} +magma_cube_tiny.collisionbox = {-0.2505, -0.01, -0.2505, 0.2505, 0.50, 0.2505, rotate = true} magma_cube_tiny.visual_size = {x=3.125, y=3.125} magma_cube_tiny.walk_velocity = 1.02 magma_cube_tiny.run_velocity = 1.02 From 692b1012124747d7dd0ee98f2a0eb7d1077ba45f Mon Sep 17 00:00:00 2001 From: bakawun Date: Mon, 18 Dec 2023 09:51:45 +0100 Subject: [PATCH 413/982] mobs:hoglin: add missing sounds these were made by epCode and lincenced under LGPL-3.0. downloaded from https://git.minetest.land/epCode/extra_mobs/commit/49a838e73374467d7d3163863a1f58e8b4c36830 --- .../mobs_mc/sounds/extra_mobs_hoglin.1.ogg | Bin 0 -> 6514 bytes .../mobs_mc/sounds/extra_mobs_hoglin.2.ogg | Bin 0 -> 10262 bytes .../mobs_mc/sounds/extra_mobs_hoglin_hurt.ogg | Bin 0 -> 5751 bytes 3 files changed, 0 insertions(+), 0 deletions(-) create mode 100755 mods/ENTITIES/mobs_mc/sounds/extra_mobs_hoglin.1.ogg create mode 100755 mods/ENTITIES/mobs_mc/sounds/extra_mobs_hoglin.2.ogg create mode 100755 mods/ENTITIES/mobs_mc/sounds/extra_mobs_hoglin_hurt.ogg diff --git a/mods/ENTITIES/mobs_mc/sounds/extra_mobs_hoglin.1.ogg b/mods/ENTITIES/mobs_mc/sounds/extra_mobs_hoglin.1.ogg new file mode 100755 index 0000000000000000000000000000000000000000..06bdc4b248f23aa576569030446b3e56a2cb6196 GIT binary patch literal 6514 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 literal 0 HcmV?d00001 From e202f208691bb484cdc57ce224ae6d9a9942f22d Mon Sep 17 00:00:00 2001 From: bakawun Date: Mon, 18 Dec 2023 09:58:32 +0100 Subject: [PATCH 414/982] mobs:hoglin: use sound .1 for random and reuse hurt sound for death --- mods/ENTITIES/mobs_mc/hoglin+zoglin.lua | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/mods/ENTITIES/mobs_mc/hoglin+zoglin.lua b/mods/ENTITIES/mobs_mc/hoglin+zoglin.lua index 8f8590933..cc7b99d54 100644 --- a/mods/ENTITIES/mobs_mc/hoglin+zoglin.lua +++ b/mods/ENTITIES/mobs_mc/hoglin+zoglin.lua @@ -31,8 +31,9 @@ local hoglin = { } }, visual_size = {x=3, y=3}, sounds = { - random = "extra_mobs_hoglin", + random = "extra_mobs_hoglin.1", damage = "extra_mobs_hoglin_hurt", + death = "extra_mobs_hoglin_hurt", distance = 16, }, jump = true, From f5ba0b79811d55bf53af011cfad2339aba05f97e Mon Sep 17 00:00:00 2001 From: bakawun Date: Mon, 18 Dec 2023 10:31:08 +0100 Subject: [PATCH 415/982] mobs:zoglin: use hoglin sound .2 --- mods/ENTITIES/mobs_mc/hoglin+zoglin.lua | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/mods/ENTITIES/mobs_mc/hoglin+zoglin.lua b/mods/ENTITIES/mobs_mc/hoglin+zoglin.lua index cc7b99d54..f170b5e80 100644 --- a/mods/ENTITIES/mobs_mc/hoglin+zoglin.lua +++ b/mods/ENTITIES/mobs_mc/hoglin+zoglin.lua @@ -93,6 +93,12 @@ local zoglin = table.copy(hoglin) zoglin.description = S("Zoglin") zoglin.fire_resistant = 1 zoglin.textures = {"extra_mobs_zoglin.png"} +sounds = { + random = "extra_mobs_hoglin.2", + damage = "extra_mobs_hoglin_hurt", + death = "extra_mobs_hoglin_hurt", + distance = 16, + }, zoglin.do_custom = function() return end From 7f823f0155ecbb4e4c63ef40224ec757355f264a Mon Sep 17 00:00:00 2001 From: bakawun Date: Mon, 18 Dec 2023 10:38:23 +0100 Subject: [PATCH 416/982] mobs:hoglin:add licence information --- mods/ENTITIES/mobs_mc/LICENSE-media.md | 3 +++ 1 file changed, 3 insertions(+) diff --git a/mods/ENTITIES/mobs_mc/LICENSE-media.md b/mods/ENTITIES/mobs_mc/LICENSE-media.md index c937097c9..278148b85 100644 --- a/mods/ENTITIES/mobs_mc/LICENSE-media.md +++ b/mods/ENTITIES/mobs_mc/LICENSE-media.md @@ -305,6 +305,9 @@ Origin of those models: * `mobs_mc_rabbit_random.*.ogg` (CC0) * Changes were made. * Source: +* [epCode] + * `extra_mobs_hoglin*.ogg` (LGPL 3.0) + * Source: Note: Many of these sounds have been more or less modified to fit the game. From ee51a500b2da77b3ea1f5622a957daf287fba827 Mon Sep 17 00:00:00 2001 From: bakawun Date: Mon, 18 Dec 2023 10:57:39 +0100 Subject: [PATCH 417/982] mobs:piglin: use (alt) zombified piglin sounds --- mods/ENTITIES/mobs_mc/piglin.lua | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/mods/ENTITIES/mobs_mc/piglin.lua b/mods/ENTITIES/mobs_mc/piglin.lua index 27f5a72f4..ac1d8b845 100644 --- a/mods/ENTITIES/mobs_mc/piglin.lua +++ b/mods/ENTITIES/mobs_mc/piglin.lua @@ -61,8 +61,10 @@ local piglin = { } }, visual_size = {x=1, y=1}, sounds = { - random = "extra_mobs_piglin", - damage = "extra_mobs_piglin_hurt", + random = "mobs_mc_zombiepig_random", + war_cry = "mobs_mc_zombiepig_war_cry", death = "mobs_mc_zombiepig_death", + damage = "mobs_mc_zombiepig_hurt.2", + death = "mobs_mc_zombiepig_death.2" distance = 16, }, jump = true, From cc470b9d887327c49f3a3953fcc33b3be262b19b Mon Sep 17 00:00:00 2001 From: bakawun Date: Mon, 18 Dec 2023 11:08:01 +0100 Subject: [PATCH 418/982] mobs:hoglin: fix conversion of tabs to spaces --- mods/ENTITIES/mobs_mc/hoglin+zoglin.lua | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/mods/ENTITIES/mobs_mc/hoglin+zoglin.lua b/mods/ENTITIES/mobs_mc/hoglin+zoglin.lua index f170b5e80..d0518cad9 100644 --- a/mods/ENTITIES/mobs_mc/hoglin+zoglin.lua +++ b/mods/ENTITIES/mobs_mc/hoglin+zoglin.lua @@ -94,10 +94,10 @@ zoglin.description = S("Zoglin") zoglin.fire_resistant = 1 zoglin.textures = {"extra_mobs_zoglin.png"} sounds = { - random = "extra_mobs_hoglin.2", - damage = "extra_mobs_hoglin_hurt", - death = "extra_mobs_hoglin_hurt", - distance = 16, + random = "extra_mobs_hoglin.2", + damage = "extra_mobs_hoglin_hurt", + death = "extra_mobs_hoglin_hurt", + distance = 16, }, zoglin.do_custom = function() return From a786b66d9e8e1476e57522db8219bf1f81098eed Mon Sep 17 00:00:00 2001 From: bakawun Date: Mon, 18 Dec 2023 11:17:25 +0100 Subject: [PATCH 419/982] mobs:skeletons: add sounds to skeleton and stray, fix random sound for wither skeleton --- mods/ENTITIES/mobs_mc/skeleton+stray.lua | 5 +++++ mods/ENTITIES/mobs_mc/skeleton_wither.lua | 2 +- 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/mods/ENTITIES/mobs_mc/skeleton+stray.lua b/mods/ENTITIES/mobs_mc/skeleton+stray.lua index 215047fdd..15778bd87 100644 --- a/mods/ENTITIES/mobs_mc/skeleton+stray.lua +++ b/mods/ENTITIES/mobs_mc/skeleton+stray.lua @@ -44,6 +44,11 @@ local skeleton = { "mcl_bows_bow_0.png", -- wielded_item } }, + sounds = { + random = "mobs_mc_skeleton_random.2", + death = "mobs_mc_skeleton_death", + damage = "mobs_mc_skeleton_hurt", + distance = 16, walk_velocity = 1.2, run_velocity = 2.0, damage = 2, diff --git a/mods/ENTITIES/mobs_mc/skeleton_wither.lua b/mods/ENTITIES/mobs_mc/skeleton_wither.lua index 865fa13f0..23d2ecae2 100644 --- a/mods/ENTITIES/mobs_mc/skeleton_wither.lua +++ b/mods/ENTITIES/mobs_mc/skeleton_wither.lua @@ -37,7 +37,7 @@ mcl_mobs.register_mob("mobs_mc:witherskeleton", { visual_size = {x=1.2, y=1.2}, makes_footstep_sound = true, sounds = { - random = "mobs_mc_skeleton_random", + random = "mobs_mc_skeleton_random.1", death = "mobs_mc_skeleton_death", damage = "mobs_mc_skeleton_hurt", distance = 16, From 14cec16c63445e8f021645b761c3ad3fd5972644 Mon Sep 17 00:00:00 2001 From: Eliy21 Date: Mon, 18 Dec 2023 21:31:38 +0000 Subject: [PATCH 420/982] Increase enchanted bow knockback --- mods/ITEMS/mcl_bows/bow.lua | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mods/ITEMS/mcl_bows/bow.lua b/mods/ITEMS/mcl_bows/bow.lua index 188035b99..e4e34610d 100644 --- a/mods/ITEMS/mcl_bows/bow.lua +++ b/mods/ITEMS/mcl_bows/bow.lua @@ -48,7 +48,7 @@ function mcl_bows.shoot_arrow(arrow_item, pos, dir, yaw, shooter, power, damage, damage = damage + (enchantments.power + 1) / 4 end if enchantments.punch then - knockback = enchantments.punch * 21 + knockback = enchantments.punch * 24 else knockback = 4.875 end From fe90424ee4797e54238d1ba1cf913a4389fc6b59 Mon Sep 17 00:00:00 2001 From: Eliy21 Date: Mon, 18 Dec 2023 21:42:26 +0000 Subject: [PATCH 421/982] Add pvp knockback reduction when moving towards player while attacking --- mods/ITEMS/mcl_enchanting/enchantments.lua | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/mods/ITEMS/mcl_enchanting/enchantments.lua b/mods/ITEMS/mcl_enchanting/enchantments.lua index 05a1e7531..db2aa9da6 100644 --- a/mods/ITEMS/mcl_enchanting/enchantments.lua +++ b/mods/ITEMS/mcl_enchanting/enchantments.lua @@ -316,8 +316,14 @@ function minetest.calculate_knockback(player, hitter, time_from_last_punch, tool end -- reduce floatiness minetest.after(0.25, function() - player:add_velocity({x = 0, y = (v.y + added_v) * -0.375 , z = 0}) + player:add_velocity({x = 0, y = (v.y + added_v) * -0.375, z = 0}) end) + -- reduce knockback when moving towards hitter while attacking + local self_dir_dot = (v.x * dir.x) + (v.z * dir.z) + local control = player:get_player_control() + if self_dir_dot < -4.3 and control.up and control.LMB then + knockback = knockback * 0.6 + end -- remove knockback if invulnerable if invul > 0 then knockback = 0 From 44c656502f4858a5e779e590307a01e3444543fb Mon Sep 17 00:00:00 2001 From: Eliy21 Date: Mon, 18 Dec 2023 22:04:12 +0000 Subject: [PATCH 422/982] Add a prevention in case players get stuck with the damage animation --- mods/PLAYER/mcl_player/init.lua | 3 +++ 1 file changed, 3 insertions(+) diff --git a/mods/PLAYER/mcl_player/init.lua b/mods/PLAYER/mcl_player/init.lua index 8ebcedccf..9681fa86f 100644 --- a/mods/PLAYER/mcl_player/init.lua +++ b/mods/PLAYER/mcl_player/init.lua @@ -230,6 +230,9 @@ minetest.register_globalstep(function(dtime) player_set_animation(player, "die") elseif player:get_meta():get_int("mcl_damage:damage_animation") > 0 then player_set_animation(player, "walk", animation_speed_mod) + minetest.after(0.5, function() + player:get_meta():set_int("mcl_damage:damage_animation", 0) + end) elseif mcl_playerplus.elytra[player] and mcl_playerplus.elytra[player].active then player_set_animation(player, "stand") elseif walking and velocity.x > 0.35 From 11c5d36c558817df61542151076a21e0e0d130c4 Mon Sep 17 00:00:00 2001 From: Michieal Date: Sat, 2 Dec 2023 07:00:25 -0500 Subject: [PATCH 423/982] Initial Commit. --- mods/PLAYER/mcl_fovapi/api.md | 9 +++++ mods/PLAYER/mcl_fovapi/init.lua | 60 +++++++++++++++++++++++++++++++++ mods/PLAYER/mcl_fovapi/mod.conf | 4 +++ 3 files changed, 73 insertions(+) create mode 100644 mods/PLAYER/mcl_fovapi/api.md create mode 100644 mods/PLAYER/mcl_fovapi/init.lua create mode 100644 mods/PLAYER/mcl_fovapi/mod.conf diff --git a/mods/PLAYER/mcl_fovapi/api.md b/mods/PLAYER/mcl_fovapi/api.md new file mode 100644 index 000000000..39d6ee86d --- /dev/null +++ b/mods/PLAYER/mcl_fovapi/api.md @@ -0,0 +1,9 @@ + + + +mcl_fovapi = {} +mcl_fovapi.default_fov = {} +mcl_fovapi.registered_modifiers = {} +mcl_fovapi.applied_modifiers = {} +function mcl_fovapi.register_modifier(name, fov_factor, time, exclusive, on_start, on_end) +function mcl_fovapi.apply_modifier(player, modifier_name) diff --git a/mods/PLAYER/mcl_fovapi/init.lua b/mods/PLAYER/mcl_fovapi/init.lua new file mode 100644 index 000000000..17c0a9262 --- /dev/null +++ b/mods/PLAYER/mcl_fovapi/init.lua @@ -0,0 +1,60 @@ +--- +--- Copyright 2023, Michieal. +--- License: GPL3. (Default Mineclone2 License) +--- Created by michieal. +--- DateTime: 12/2/23 5:47 AM +--- + +mcl_fovapi = {} + +-- Handles default fov for players +mcl_fovapi.default_fov = {} +mcl_fovapi.registered_modifiers = {} +mcl_fovapi.applied_modifiers = {} + +-- set to blank on join (for 3rd party mods) +minetest.register_on_joinplayer(function(player) + local name = player:get_player_name() + -- Assign default FOV + mcl_fovapi.default_fov[name] = player:get_fov() +end) + +-- clear when player leaves +minetest.register_on_leaveplayer(function(player) + local name = player:get_player_name() + -- Remove default FOV + mcl_fovapi.default_fov[name] = nil +end) + +function mcl_fovapi.register_modifier(name, fov_factor, time, exclusive, on_start, on_end) + local def = { + modifer_name = name, + fov = fov_factor, + time = time, + exclusive = exclusive, + on_start = on_start, + on_end = on_end, + } + + mcl_fovapi.registered_modifiers[name] = def + +end + +function mcl_fovapi.apply_modifier(player, modifier_name) + + if modifier_name == nil then return end + if mcl_fovapi.registered_modifiers[modifier_name] == nil then return end + + local modifier = mcl_fovapi.registered_modifiers[modifier_name] + if modifier.on_start ~= nil then + modifier.on_start(player) + end + + mcl_fovapi.applied_modifiers[player][modifier_name] = true -- set the applied to be true. + + -- do modiifier apply code. + + + +end + diff --git a/mods/PLAYER/mcl_fovapi/mod.conf b/mods/PLAYER/mcl_fovapi/mod.conf new file mode 100644 index 000000000..b78c78596 --- /dev/null +++ b/mods/PLAYER/mcl_fovapi/mod.conf @@ -0,0 +1,4 @@ +name = mcl_fovapi +author = Michieal +description = An API for handling FOV changes. +depends = mcl_player \ No newline at end of file From fc80d4fb9f836cd1bee05720e4d0cdc9775c3d97 Mon Sep 17 00:00:00 2001 From: Michieal Date: Sun, 3 Dec 2023 06:47:28 -0500 Subject: [PATCH 424/982] Initial API state. --- mods/PLAYER/mcl_fovapi/api.md | 14 +++- mods/PLAYER/mcl_fovapi/init.lua | 135 +++++++++++++++++++++++++++++--- 2 files changed, 139 insertions(+), 10 deletions(-) diff --git a/mods/PLAYER/mcl_fovapi/api.md b/mods/PLAYER/mcl_fovapi/api.md index 39d6ee86d..05b8be29b 100644 --- a/mods/PLAYER/mcl_fovapi/api.md +++ b/mods/PLAYER/mcl_fovapi/api.md @@ -1,9 +1,21 @@ +registered_modifiers has defs of modifiers +applied_modifiers is indexed by player name mcl_fovapi = {} + mcl_fovapi.default_fov = {} + mcl_fovapi.registered_modifiers = {} + mcl_fovapi.applied_modifiers = {} -function mcl_fovapi.register_modifier(name, fov_factor, time, exclusive, on_start, on_end) + +function mcl_fovapi.register_modifier(name, fov_factor, time, is_multiplier, exclusive, on_start, on_end) + function mcl_fovapi.apply_modifier(player, modifier_name) + +function mcl_fovapi.remove_modifier(player, modifier_name) + +function mcl_fovapi.remove_all_modifiers(player, time) + diff --git a/mods/PLAYER/mcl_fovapi/init.lua b/mods/PLAYER/mcl_fovapi/init.lua index 17c0a9262..649f582ab 100644 --- a/mods/PLAYER/mcl_fovapi/init.lua +++ b/mods/PLAYER/mcl_fovapi/init.lua @@ -5,18 +5,26 @@ --- DateTime: 12/2/23 5:47 AM --- +-- Locals (and cached) +local DEBUG = false -- debug constant for troubleshooting. +local pairs = pairs + +-- Globals mcl_fovapi = {} --- Handles default fov for players -mcl_fovapi.default_fov = {} +mcl_fovapi.default_fov = {} -- Handles default fov for players mcl_fovapi.registered_modifiers = {} mcl_fovapi.applied_modifiers = {} --- set to blank on join (for 3rd party mods) minetest.register_on_joinplayer(function(player) local name = player:get_player_name() -- Assign default FOV mcl_fovapi.default_fov[name] = player:get_fov() + + if DEBUG then + minetest.log("FOV::Player: " .. name .. "\nFOV: " .. player:get_fov()) + end + end) -- clear when player leaves @@ -26,24 +34,41 @@ minetest.register_on_leaveplayer(function(player) mcl_fovapi.default_fov[name] = nil end) -function mcl_fovapi.register_modifier(name, fov_factor, time, exclusive, on_start, on_end) +function mcl_fovapi.register_modifier(name, fov_factor, time, is_multiplier, exclusive, on_start, on_end) + if is_multiplier ~= true and is_multiplier ~= false then + is_multiplier = false + end + if exclusive ~= true and exclusive ~= false then + exclusive = false + end local def = { modifer_name = name, fov = fov_factor, time = time, + is_multiplier = is_multiplier, exclusive = exclusive, on_start = on_start, on_end = on_end, } + if DEBUG then + minetest.log("FOV::Modifier Definition Registered:\n" .. dump(def)) + end + mcl_fovapi.registered_modifiers[name] = def end function mcl_fovapi.apply_modifier(player, modifier_name) - - if modifier_name == nil then return end - if mcl_fovapi.registered_modifiers[modifier_name] == nil then return end + if player == nil then + return + end + if modifier_name == nil then + return + end + if mcl_fovapi.registered_modifiers[modifier_name] == nil then + return + end local modifier = mcl_fovapi.registered_modifiers[modifier_name] if modifier.on_start ~= nil then @@ -51,10 +76,102 @@ function mcl_fovapi.apply_modifier(player, modifier_name) end mcl_fovapi.applied_modifiers[player][modifier_name] = true -- set the applied to be true. + if DEBUG then + minetest.log("FOV::Player Applied Modifiers :" .. dump(mcl_fovapi.applied_modifiers[player])) + end + local pname = player:get_player_name() - -- do modiifier apply code. - + if DEBUG then + minetest.log("FOV::Modifier applied to player:" .. pname .. " modifier: " .. modifier_name) + end + -- modifier apply code. + if modifier.exclusive == true then + -- if exclusive, reset the player's fov, and apply the new fov. + if modifier.is_multiplier then + player:set_fov(0, false, 0) + end + player:set_fov(modifier.fov_factor, modifier.is_multiplier, modifier.time) + else + -- not exclusive? let's apply it in the mix. + -- assume is_multiplier is true. + player:set_fov(modifier.fov_factor, true, modifier.time) + end end +function mcl_fovapi.remove_modifier(player, modifier_name) + if player == nil then + return + end + + if DEBUG then + local name = player:get_player_name() + minetest.log("FOV::Player: " .. name .. " modifier: " .. modifier_name .. "removed.") + end + + mcl_fovapi.applied_modifiers[player][modifier_name] = nil + + -- check for other fov modifiers, and set them up, or reset to default. + + local applied = {} + for k, _ in pairs(mcl_fovapi.applied_modifiers[player]) do + applied[k] = mcl_fovapi.registered_modifiers[k] + end + + if #applied == 0 then + return + end + local exc = false + for k in applied do + if applied[k].exclusive == true then + exc = applied[k] + break + end + end + + -- handle exclusives. + if exc ~= false then + player:set_fov(exc.fov_factor, exc.is_multiplier, 0) -- we want this to be immediate. + else + -- handle normal fov modifiers. + player:set_fov(0, false, 0) -- we want this to be immediate. + for x in applied do + player:set_fov(x.fov_factor, true, 0) + end + end + + if mcl_fovapi.registered_modifiers[modifier_name].on_end ~= nil then + mcl_fovapi.registered_modifiers[modifier_name].on_end(player) + end +end + +function mcl_fovapi.remove_all_modifiers(player) + if player == nil then + return + end + + if DEBUG then + local name = player:get_player_name() + minetest.log("FOV::Player: " .. name .. " modifiers have been reset.") + end + + for x in mcl_fovapi.applied_modifiers[player] do + x = nil + end + + player:set_fov(0, false, 0) + +end + +--[[ +Notes: +set_fov(fov, is_multiplier, transition_time): Sets player's FOV + + fov: FOV value. + is_multiplier: Set to true if the FOV value is a multiplier. Defaults to false. + transition_time: If defined, enables smooth FOV transition. Interpreted as the time (in seconds) to reach target FOV. + If set to 0, FOV change is instantaneous. Defaults to 0. + Set fov to 0 to clear FOV override. + +--]] From bf41e116a1dbfd71be37a8e5f8aedc6686214884 Mon Sep 17 00:00:00 2001 From: Michieal Date: Sun, 3 Dec 2023 08:10:41 -0500 Subject: [PATCH 425/982] Fleshed out the API Documentation. Modified missing pieces of code. --- mods/PLAYER/mcl_fovapi/api.md | 78 ++++++++++++++++++++++++++++----- mods/PLAYER/mcl_fovapi/init.lua | 9 ++-- 2 files changed, 73 insertions(+), 14 deletions(-) diff --git a/mods/PLAYER/mcl_fovapi/api.md b/mods/PLAYER/mcl_fovapi/api.md index 05b8be29b..43a54de53 100644 --- a/mods/PLAYER/mcl_fovapi/api.md +++ b/mods/PLAYER/mcl_fovapi/api.md @@ -1,21 +1,79 @@ +### FOV API -registered_modifiers has defs of modifiers + + * [FOV API](#fov-api) + * [Description](#description) + * [Troubleshooting](#troubleshooting) + * [Modifier Definition](#modifier-definition-) + * [Global MCL_FOVAPI Tables](#global-mclfovapi-tables) + * [Namespaces](#namespaces) + * [Functions](#functions) + -applied_modifiers is indexed by player name +#### Description +This API defines and applies different Field Of View effects to players via MODIFIERS. -mcl_fovapi = {} +#### Troubleshooting +In the `init.lua` file for this module, there is a `DEBUG` variable at the top that will turn on logging. +Use it to see what is going on. -mcl_fovapi.default_fov = {} +#### Modifier Definition +```lua +def = { + modifer_name = name, + fov_factor = fov_factor, + time = time, + is_multiplier = is_multiplier, + exclusive = exclusive, + on_start = on_start, + on_end = on_end, +} +``` +* Modifier Name: The name of the Modifier, used to identify the specific modifier. Case sensitive. +* FOV Factor: A float value defining the FOV to apply. Can be an absolute or percentage, depending on Exclusive and + Is_Multiplier. +* Time: A float value defining the number of seconds to take when applying the FOV Factor. + Used to smoothly move between FOVs. Use 0 for an immediate FOV Shift. (Transition time.) +* Is Multiplier: A bool value used to specify if the FOV Factor is an absolute FOV value or if it should be a percentage + of the current FOV. Defaults to `true` if not defined. +* Exclusive: A bool value used to specify whether the modifier will override all other FOV modifiers. An example of this + is how the spy glass sets the FOV to be a specific value regardless of any other FOV effects applied. Defaults to + `false` if not defined. +* On Start: the `on_start` is a callback function `on_start(player)` that is called if defined. The parameter `player` + is a ref to the player that had the modifier applied. Called from `mcl_fovapi.apply_modifier` immediately after + the FOV Modifier has been applied. +* On End: the `on_end` is a callback function `on_end(player)` that is called if defined. The parameter `player` + is a ref to the player that had the modifier applied. Called from `mcl_fovapi.remove_modifier` immediately after + the FOV Modifier has been removed. -mcl_fovapi.registered_modifiers = {} +Note: passing incorrect values in the definition will have unintended consequences. -mcl_fovapi.applied_modifiers = {} +#### Global MCL_FOVAPI Tables +There are three tables that are accessible via the API. They are `registered_modifiers` and `applied_modifiers`. -function mcl_fovapi.register_modifier(name, fov_factor, time, is_multiplier, exclusive, on_start, on_end) +`mcl_fovapi.registered_modifiers` has the definitions of all the registered FOV Modifiers. Indexed by Modifier Name. +And, `mcl_fovapi.applied_modifiers` is indexed by the Player Name. It contains the names of all the modifiers applied to the +player. The `mcl_fovapi.default_fov` table is indexed by the Player Name, and contains the Default FOVs of the player from the +settings. (Expressed as a value usable in `player:set_fov`.) -function mcl_fovapi.apply_modifier(player, modifier_name) +#### Namespaces +`mcl_fovapi` is the default API Namespace. -function mcl_fovapi.remove_modifier(player, modifier_name) +#### Functions +`mcl_fovapi.register_modifier(name, fov_factor, time, is_multiplier, exclusive, on_start, on_end)` -function mcl_fovapi.remove_all_modifiers(player, time) +Used to register a new FOV Modifier for use. Must be called before applying said modifier to a player. +See Modifier Definition for what the parameters are. +`mcl_fovapi.apply_modifier(player, modifier_name)` + +Used to apply a registered FOV modifier to a player. Takes a reference to the player and the modifier's name (string). + +`mcl_fovapi.remove_modifier(player, modifier_name)` + +Used to remove a specific FOV modifier from a Player. Takes a reference to the player and the modifier's name (string). +Removed immediately. + +`mcl_fovapi.remove_all_modifiers(player)` + +Used to remove all FOV modifiers from a Player. Takes a reference to the Player. FOV change is instantaneous. diff --git a/mods/PLAYER/mcl_fovapi/init.lua b/mods/PLAYER/mcl_fovapi/init.lua index 649f582ab..ace5ca96f 100644 --- a/mods/PLAYER/mcl_fovapi/init.lua +++ b/mods/PLAYER/mcl_fovapi/init.lua @@ -27,23 +27,24 @@ minetest.register_on_joinplayer(function(player) end) --- clear when player leaves minetest.register_on_leaveplayer(function(player) local name = player:get_player_name() - -- Remove default FOV + + -- handle clean up mcl_fovapi.default_fov[name] = nil + mcl_fovapi.applied_modifiers[name] = nil end) function mcl_fovapi.register_modifier(name, fov_factor, time, is_multiplier, exclusive, on_start, on_end) if is_multiplier ~= true and is_multiplier ~= false then - is_multiplier = false + is_multiplier = true end if exclusive ~= true and exclusive ~= false then exclusive = false end local def = { modifer_name = name, - fov = fov_factor, + fov_factor = fov_factor, time = time, is_multiplier = is_multiplier, exclusive = exclusive, From 6cfb55e853c31bf30136c313c447ed063f88ade2 Mon Sep 17 00:00:00 2001 From: Michieal Date: Sun, 3 Dec 2023 08:24:21 -0500 Subject: [PATCH 426/982] Added reset for player respawning to remove FOV modifiers. Fixed missing on_end call in remove_all_modifiers. Added mcl_fovapi to Bows, Sprint, and Spyglass. --- mods/ITEMS/mcl_bows/mod.conf | 2 +- mods/ITEMS/mcl_spyglass/mod.conf | 2 +- mods/PLAYER/mcl_fovapi/init.lua | 7 +++++++ mods/PLAYER/mcl_sprint/mod.conf | 5 +++-- 4 files changed, 12 insertions(+), 4 deletions(-) diff --git a/mods/ITEMS/mcl_bows/mod.conf b/mods/ITEMS/mcl_bows/mod.conf index 7b174826a..0fdd666a3 100644 --- a/mods/ITEMS/mcl_bows/mod.conf +++ b/mods/ITEMS/mcl_bows/mod.conf @@ -1,6 +1,6 @@ name = mcl_bows author = Arcelmi description = This mod adds bows and arrows for MineClone 2. -depends = controls, mcl_particles, mcl_enchanting, mcl_init, mcl_util, mcl_shields +depends = controls, mcl_particles, mcl_enchanting, mcl_init, mcl_util, mcl_shields, mcl_fovapi optional_depends = awards, mcl_achievements, mcl_core, mcl_mobitems, playerphysics, doc, doc_identifier, mesecons_button diff --git a/mods/ITEMS/mcl_spyglass/mod.conf b/mods/ITEMS/mcl_spyglass/mod.conf index c13b281e1..6a78e86a5 100644 --- a/mods/ITEMS/mcl_spyglass/mod.conf +++ b/mods/ITEMS/mcl_spyglass/mod.conf @@ -1,4 +1,4 @@ name = mcl_spyglass author = NO11 description = This mod adds a spyglass, which is an item that can be used for zooming in on specific locations. -depends = mcl_core, controls +depends = mcl_core, controls, mcl_fovapi diff --git a/mods/PLAYER/mcl_fovapi/init.lua b/mods/PLAYER/mcl_fovapi/init.lua index ace5ca96f..153cd47a9 100644 --- a/mods/PLAYER/mcl_fovapi/init.lua +++ b/mods/PLAYER/mcl_fovapi/init.lua @@ -60,6 +60,10 @@ function mcl_fovapi.register_modifier(name, fov_factor, time, is_multiplier, exc end +minetest.register_on_respawnplayer(function(player) + mcl_fovapi.remove_all_modifiers(player:get_player_name()) +end) + function mcl_fovapi.apply_modifier(player, modifier_name) if player == nil then return @@ -162,6 +166,9 @@ function mcl_fovapi.remove_all_modifiers(player) end player:set_fov(0, false, 0) + if mcl_fovapi.registered_modifiers[modifier_name].on_end ~= nil then + mcl_fovapi.registered_modifiers[modifier_name].on_end(player) + end end diff --git a/mods/PLAYER/mcl_sprint/mod.conf b/mods/PLAYER/mcl_sprint/mod.conf index 0d20f80a3..9b9a7366b 100644 --- a/mods/PLAYER/mcl_sprint/mod.conf +++ b/mods/PLAYER/mcl_sprint/mod.conf @@ -1,4 +1,5 @@ name = mcl_sprint author = GunshipPenguin -description = Allows the player to sprint by pressing the “Use” key (default: E). -depends = mcl_playerinfo, playerphysics, mcl_hunger +description = Allows the player to sprint by pressing the “AUX” key (default: E). +depends = mcl_playerinfo, playerphysics, mcl_hunger, mcl_fovapi +optional = mcl_bows \ No newline at end of file From 0a17bbe731766c38fca8e42253862556d61c1d28 Mon Sep 17 00:00:00 2001 From: Michieal Date: Sun, 3 Dec 2023 08:29:53 -0500 Subject: [PATCH 427/982] Added reset for player respawning to remove FOV modifiers. Fixed missing on_end call in remove_all_modifiers. Added mcl_fovapi to Bows, Sprint, and Spyglass. Set up the Spyglass to use the new FOV API. --- mods/ITEMS/mcl_spyglass/init.lua | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/mods/ITEMS/mcl_spyglass/init.lua b/mods/ITEMS/mcl_spyglass/init.lua index fa1a82339..ab557ebbf 100644 --- a/mods/ITEMS/mcl_spyglass/init.lua +++ b/mods/ITEMS/mcl_spyglass/init.lua @@ -17,6 +17,8 @@ minetest.register_craft({ } }) +mcl_fovapi.register_modifier("spyglass", 8, 0.1,false, true, nil, nil) + local spyglass_scope = {} local function add_scope(player) @@ -37,7 +39,8 @@ local function remove_scope(player) player:hud_remove(spyglass_scope[player]) spyglass_scope[player] = nil player:hud_set_flags({wielditem = true}) - player:set_fov(86.1) + mcl_fovapi.remove_modifier(player, "spyglass") -- use the api to remove the FOV effect. + -- old code: player:set_fov(86.1) end end @@ -55,7 +58,8 @@ controls.register_on_hold(function(player, key, time) if key ~= "RMB" then return end local wielditem = player:get_wielded_item() if wielditem:get_name() == "mcl_spyglass:spyglass" then - player:set_fov(8, false, 0.1) + mcl_fovapi.apply_modifier(player, "spyglass") -- apply the FOV effect. + -- old code: player:set_fov(8, false, 0.1) if spyglass_scope[player] == nil then add_scope(player) end From 36f661743e18a8f3c0c1ed540d22e6e9244b27f9 Mon Sep 17 00:00:00 2001 From: Michieal Date: Sun, 3 Dec 2023 08:57:13 -0500 Subject: [PATCH 428/982] Set up the Bows to use the new FOV API. Bows now zoom in and clear out the zoom. --- mods/ITEMS/mcl_bows/bow.lua | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/mods/ITEMS/mcl_bows/bow.lua b/mods/ITEMS/mcl_bows/bow.lua index 174208c3c..cfbdfb421 100644 --- a/mods/ITEMS/mcl_bows/bow.lua +++ b/mods/ITEMS/mcl_bows/bow.lua @@ -33,6 +33,9 @@ local bow_load = {} -- Another player table, this one stores the wield index of the bow being charged local bow_index = {} +-- define FOV modifier(s) +mcl_fovapi.register_modifier("bowcomplete", 0.8, 1, true, false, nil, nil) + function mcl_bows.shoot_arrow(arrow_item, pos, dir, yaw, shooter, power, damage, is_critical, bow_stack, collectable) local obj = minetest.add_entity({x=pos.x,y=pos.y,z=pos.z}, arrow_item.."_entity") if power == nil then @@ -183,6 +186,9 @@ end -- Resets the bow charging state and player speed. To be used when the player is no longer charging the bow local function reset_bow_state(player, also_reset_bows) + -- clear the FOV change from the player. + mcl_fovapi.remove_modifier(player, "bowcomplete") -- for the complete zoom in FOV Modifier. + bow_load[player:get_player_name()] = nil bow_index[player:get_player_name()] = nil if minetest.get_modpath("playerphysics") then @@ -314,6 +320,9 @@ controls.register_on_hold(function(player, key, time) end bow_load[name] = minetest.get_us_time() bow_index[name] = player:get_wield_index() + + -- begin Bow Zoom. + mcl_fovapi.apply_modifier(player, "bowcomplete") else if player:get_wield_index() == bow_index[name] then if type(bow_load[name]) == "number" then From 4f3f59f4bce65b7c42a51891dce27a84be1e3fcf Mon Sep 17 00:00:00 2001 From: Michieal Date: Sun, 3 Dec 2023 09:03:01 -0500 Subject: [PATCH 429/982] Put in checks to prevent repeatedly applying the same FOV modifier. Added short circuit to remove_modifier if the modifier is not currently applied. --- mods/PLAYER/mcl_fovapi/init.lua | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/mods/PLAYER/mcl_fovapi/init.lua b/mods/PLAYER/mcl_fovapi/init.lua index 153cd47a9..b64a78d78 100644 --- a/mods/PLAYER/mcl_fovapi/init.lua +++ b/mods/PLAYER/mcl_fovapi/init.lua @@ -74,6 +74,9 @@ function mcl_fovapi.apply_modifier(player, modifier_name) if mcl_fovapi.registered_modifiers[modifier_name] == nil then return end + if mcl_fovapi.applied_modifiers[player][modifier_name] and mcl_fovapi.applied_modifiers[player][modifier_name] == true then + return + end local modifier = mcl_fovapi.registered_modifiers[modifier_name] if modifier.on_start ~= nil then @@ -110,6 +113,8 @@ function mcl_fovapi.remove_modifier(player, modifier_name) return end + if mcl_fovapi.applied_modifiers[player][modifier_name] == nil then return end + if DEBUG then local name = player:get_player_name() minetest.log("FOV::Player: " .. name .. " modifier: " .. modifier_name .. "removed.") From 2f8389d3f52c18304976987d018bf5d5304d5de9 Mon Sep 17 00:00:00 2001 From: Michieal Date: Fri, 8 Dec 2023 20:38:07 -0500 Subject: [PATCH 430/982] Put in check to prevent Trying to Reference a Nil error in Apply_Modifier. --- mods/PLAYER/mcl_fovapi/init.lua | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/mods/PLAYER/mcl_fovapi/init.lua b/mods/PLAYER/mcl_fovapi/init.lua index b64a78d78..de3dfa01a 100644 --- a/mods/PLAYER/mcl_fovapi/init.lua +++ b/mods/PLAYER/mcl_fovapi/init.lua @@ -74,8 +74,10 @@ function mcl_fovapi.apply_modifier(player, modifier_name) if mcl_fovapi.registered_modifiers[modifier_name] == nil then return end - if mcl_fovapi.applied_modifiers[player][modifier_name] and mcl_fovapi.applied_modifiers[player][modifier_name] == true then - return + if mcl_fovapi.applied_modifiers ~= nil and mcl_fovapi.applied_modifiers[player] ~= nil and mcl_fovapi.applied_modifiers[player][modifier_name] ~= nil then + if mcl_fovapi.applied_modifiers[player][modifier_name] and mcl_fovapi.applied_modifiers[player][modifier_name] == true then + return + end end local modifier = mcl_fovapi.registered_modifiers[modifier_name] @@ -113,7 +115,9 @@ function mcl_fovapi.remove_modifier(player, modifier_name) return end - if mcl_fovapi.applied_modifiers[player][modifier_name] == nil then return end + if mcl_fovapi.applied_modifiers[player][modifier_name] == nil then + return + end if DEBUG then local name = player:get_player_name() From 580a1caa387b1e20cc9937f993fd67a2fcbdae62 Mon Sep 17 00:00:00 2001 From: Michieal Date: Fri, 8 Dec 2023 21:00:11 -0500 Subject: [PATCH 431/982] Reworked some of the Apply_Modifier code to help prevent errors. --- mods/PLAYER/mcl_fovapi/init.lua | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/mods/PLAYER/mcl_fovapi/init.lua b/mods/PLAYER/mcl_fovapi/init.lua index de3dfa01a..debe1142e 100644 --- a/mods/PLAYER/mcl_fovapi/init.lua +++ b/mods/PLAYER/mcl_fovapi/init.lua @@ -74,18 +74,23 @@ function mcl_fovapi.apply_modifier(player, modifier_name) if mcl_fovapi.registered_modifiers[modifier_name] == nil then return end - if mcl_fovapi.applied_modifiers ~= nil and mcl_fovapi.applied_modifiers[player] ~= nil and mcl_fovapi.applied_modifiers[player][modifier_name] ~= nil then + if mcl_fovapi.applied_modifiers and mcl_fovapi.applied_modifiers[player] and mcl_fovapi.applied_modifiers[player][modifier_name] then if mcl_fovapi.applied_modifiers[player][modifier_name] and mcl_fovapi.applied_modifiers[player][modifier_name] == true then return end end + if mcl_fovapi.applied_modifiers[player] == nil then + mcl_fovapi.applied_modifiers[player] = {} + end + local modifier = mcl_fovapi.registered_modifiers[modifier_name] if modifier.on_start ~= nil then modifier.on_start(player) end mcl_fovapi.applied_modifiers[player][modifier_name] = true -- set the applied to be true. + if DEBUG then minetest.log("FOV::Player Applied Modifiers :" .. dump(mcl_fovapi.applied_modifiers[player])) end From a650f8b3681a83dd37f4076f6f023dccc17917a3 Mon Sep 17 00:00:00 2001 From: the-real-herowl Date: Sat, 9 Dec 2023 23:22:36 +0100 Subject: [PATCH 432/982] Made fovapi registration more robust --- mods/PLAYER/mcl_fovapi/init.lua | 51 ++++++++++++++++++++++----------- 1 file changed, 34 insertions(+), 17 deletions(-) diff --git a/mods/PLAYER/mcl_fovapi/init.lua b/mods/PLAYER/mcl_fovapi/init.lua index debe1142e..4eac2b03d 100644 --- a/mods/PLAYER/mcl_fovapi/init.lua +++ b/mods/PLAYER/mcl_fovapi/init.lua @@ -35,28 +35,42 @@ minetest.register_on_leaveplayer(function(player) mcl_fovapi.applied_modifiers[name] = nil end) -function mcl_fovapi.register_modifier(name, fov_factor, time, is_multiplier, exclusive, on_start, on_end) - if is_multiplier ~= true and is_multiplier ~= false then - is_multiplier = true +function mcl_fovapi.register_modifier(def) + if type(def.name) ~= "string" then + error("Modifier name must be a string") end - if exclusive ~= true and exclusive ~= false then - exclusive = false + if type(def.fov_factor) ~= "number" then + error("FOV factor must be a number") end - local def = { - modifer_name = name, - fov_factor = fov_factor, - time = time, - is_multiplier = is_multiplier, - exclusive = exclusive, - on_start = on_start, - on_end = on_end, - } + if type(def.time) ~= "number" then + error("Transition time must be a number") + end + + if def.on_start ~= nil and type(def.on_start) ~= "function" then + error("Callback on_start must be a function") + end + if def.on_end ~= nil and type(def.on_end) ~= "function" then + error("Callback on_end must be a function") + end + + local mdef = {} + + mdef.fov_factor = def.fov_factor + mdef.time = def.time + + if def.is_multiplier == false then mdef.is_multiplier = false + else mdef.is_multiplier = true end + if def.exclusive == true then mdef.exclusive = true + else mdef.exclusive = false end + + mdef.on_start = def.on_start + mdef.on_end = def.on_end if DEBUG then minetest.log("FOV::Modifier Definition Registered:\n" .. dump(def)) end - mcl_fovapi.registered_modifiers[name] = def + mcl_fovapi.registered_modifiers[def.name] = mdef end @@ -130,6 +144,7 @@ function mcl_fovapi.remove_modifier(player, modifier_name) end mcl_fovapi.applied_modifiers[player][modifier_name] = nil + local modifier = mcl_fovapi.registered_modifiers[modifier_name] -- check for other fov modifiers, and set them up, or reset to default. @@ -139,6 +154,7 @@ function mcl_fovapi.remove_modifier(player, modifier_name) end if #applied == 0 then + player:set_fov(0, false, modifier.time) return end local exc = false @@ -154,10 +170,11 @@ function mcl_fovapi.remove_modifier(player, modifier_name) player:set_fov(exc.fov_factor, exc.is_multiplier, 0) -- we want this to be immediate. else -- handle normal fov modifiers. - player:set_fov(0, false, 0) -- we want this to be immediate. + local fov_factor = 1 for x in applied do - player:set_fov(x.fov_factor, true, 0) + fov_factor = fov_factor * x.fov_factor end + player:set_fov(fov_factor, true, modifier.time) end if mcl_fovapi.registered_modifiers[modifier_name].on_end ~= nil then From 3a007e3bb1c1b4d1663a21c8784221beaa7af8e1 Mon Sep 17 00:00:00 2001 From: the-real-herowl Date: Sun, 10 Dec 2023 00:14:16 +0100 Subject: [PATCH 433/982] Re-registered FOV mods using new API version --- mods/ITEMS/mcl_bows/bow.lua | 7 ++++++- mods/ITEMS/mcl_spyglass/init.lua | 8 +++++++- 2 files changed, 13 insertions(+), 2 deletions(-) diff --git a/mods/ITEMS/mcl_bows/bow.lua b/mods/ITEMS/mcl_bows/bow.lua index cfbdfb421..aee5545ab 100644 --- a/mods/ITEMS/mcl_bows/bow.lua +++ b/mods/ITEMS/mcl_bows/bow.lua @@ -34,7 +34,12 @@ local bow_load = {} local bow_index = {} -- define FOV modifier(s) -mcl_fovapi.register_modifier("bowcomplete", 0.8, 1, true, false, nil, nil) +mcl_fovapi.register_modifier({ + name = "bowcomplete", + fov_factor = 0.8, + time = 1, + is_multiplier = true, +}) function mcl_bows.shoot_arrow(arrow_item, pos, dir, yaw, shooter, power, damage, is_critical, bow_stack, collectable) local obj = minetest.add_entity({x=pos.x,y=pos.y,z=pos.z}, arrow_item.."_entity") diff --git a/mods/ITEMS/mcl_spyglass/init.lua b/mods/ITEMS/mcl_spyglass/init.lua index ab557ebbf..a4ea144e1 100644 --- a/mods/ITEMS/mcl_spyglass/init.lua +++ b/mods/ITEMS/mcl_spyglass/init.lua @@ -17,7 +17,13 @@ minetest.register_craft({ } }) -mcl_fovapi.register_modifier("spyglass", 8, 0.1,false, true, nil, nil) +mcl_fovapi.register_modifier({ + name = "spyglass", + fov_factor = 8, + time = 0.1, + is_multiplier = false, + exclusive = true, +}) local spyglass_scope = {} From 7f5ce4e033924f2cf4085c2674ad17595b287356 Mon Sep 17 00:00:00 2001 From: the-real-herowl Date: Sun, 10 Dec 2023 00:15:09 +0100 Subject: [PATCH 434/982] Fixed modifier application and removal --- mods/PLAYER/mcl_fovapi/init.lua | 38 +++++++++++++++++++++++++++------ 1 file changed, 31 insertions(+), 7 deletions(-) diff --git a/mods/PLAYER/mcl_fovapi/init.lua b/mods/PLAYER/mcl_fovapi/init.lua index 4eac2b03d..61fc244b7 100644 --- a/mods/PLAYER/mcl_fovapi/init.lua +++ b/mods/PLAYER/mcl_fovapi/init.lua @@ -123,8 +123,21 @@ function mcl_fovapi.apply_modifier(player, modifier_name) player:set_fov(modifier.fov_factor, modifier.is_multiplier, modifier.time) else -- not exclusive? let's apply it in the mix. - -- assume is_multiplier is true. - player:set_fov(modifier.fov_factor, true, modifier.time) + local fov_factor, is_mult = player:get_fov() + if fov_factor == 0 then + fov_factor = 1 + is_mult = true + end + if modifier.is_multiplier or is_mult then + fov_factor = fov_factor * modifier.fov_factor + else + fov_factor = (fov_factor + modifier.fov_factor) / 2 + end + if modifier.is_multiplier and is_mult then + player:set_fov(fov_factor, true, modifier.time) + else + player:set_fov(fov_factor, false, modififer.time) + end end end @@ -153,12 +166,13 @@ function mcl_fovapi.remove_modifier(player, modifier_name) applied[k] = mcl_fovapi.registered_modifiers[k] end - if #applied == 0 then + local elem = next + if elem(applied) == nil then player:set_fov(0, false, modifier.time) return end local exc = false - for k in applied do + for k, _ in pairs(applied) do if applied[k].exclusive == true then exc = applied[k] break @@ -171,10 +185,20 @@ function mcl_fovapi.remove_modifier(player, modifier_name) else -- handle normal fov modifiers. local fov_factor = 1 - for x in applied do - fov_factor = fov_factor * x.fov_factor + local non_multiplier_added = false + for _, x in pairs(applied) do + if not x.is_multiplier then + if non_multiplier_added then + fov_factor = (fov_factor + x.fov_factor) / 2 + else + non_multiplier_added = true + fov_factor = fov_factor * x.fov_factor + end + else + fov_factor = fov_factor * x.fov_factor + end end - player:set_fov(fov_factor, true, modifier.time) + player:set_fov(fov_factor, not non_multiplier_added, modifier.time) end if mcl_fovapi.registered_modifiers[modifier_name].on_end ~= nil then From 42ec62562daee88d685cd5c6e06b6860c2a1a5dc Mon Sep 17 00:00:00 2001 From: the-real-herowl Date: Sun, 10 Dec 2023 00:15:33 +0100 Subject: [PATCH 435/982] Moved sprinting into the new FOV api --- mods/PLAYER/mcl_player/init.lua | 2 +- mods/PLAYER/mcl_sprint/init.lua | 42 ++++++++++----------------------- 2 files changed, 14 insertions(+), 30 deletions(-) diff --git a/mods/PLAYER/mcl_player/init.lua b/mods/PLAYER/mcl_player/init.lua index 288b697e1..f3cc782d5 100644 --- a/mods/PLAYER/mcl_player/init.lua +++ b/mods/PLAYER/mcl_player/init.lua @@ -177,7 +177,7 @@ minetest.register_on_joinplayer(function(player) player_textures[name] = { "character.png", "blank.png", "blank.png" } --player:set_local_animation({x=0, y=79}, {x=168, y=187}, {x=189, y=198}, {x=200, y=219}, 30) - player:set_fov(86.1) -- see >>> +-- player:set_fov(86.1) -- see >>> end) minetest.register_on_leaveplayer(function(player) diff --git a/mods/PLAYER/mcl_sprint/init.lua b/mods/PLAYER/mcl_sprint/init.lua index 7449ad18c..3d9ef984c 100644 --- a/mods/PLAYER/mcl_sprint/init.lua +++ b/mods/PLAYER/mcl_sprint/init.lua @@ -64,40 +64,24 @@ local function cancelClientSprinting(name) players[name].clientSprint = false end +mcl_fovapi.register_modifier({ + name = "sprint", + fov_factor = 1.1, + time = 0.15, + is_multiplier = true, +}) + local function setSprinting(playerName, sprinting) --Sets the state of a player (0=stopped/moving, 1=sprinting) if not sprinting and not mcl_sprint.is_sprinting(playerName) then return end local player = minetest.get_player_by_name(playerName) - local controls = player:get_player_control() if players[playerName] then players[playerName].sprinting = sprinting - local fov_old = players[playerName].fov - local fov_new = fov_old - local fade_time = .15 - if sprinting == true - or controls.RMB - and string.find(player:get_wielded_item():get_name(), "mcl_bows:bow") - and player:get_wielded_item():get_name() ~= "mcl_bows:bow" then - if sprinting == true then - fov_new = math.min(players[playerName].fov + 0.05, 1.2) - else - fov_new = .7 - players[playerName].fade_time = .3 - end - if sprinting == true then - playerphysics.add_physics_factor(player, "speed", "mcl_sprint:sprint", mcl_sprint.SPEED) - end - elseif sprinting == false - and player:get_wielded_item():get_name() ~= "mcl_bows:bow_0" - and player:get_wielded_item():get_name() ~= "mcl_bows:bow_1" - and player:get_wielded_item():get_name() ~= "mcl_bows:bow_2" then - fov_new = math.max(players[playerName].fov - 0.05, 1.0) - if sprinting == false then - playerphysics.remove_physics_factor(player, "speed", "mcl_sprint:sprint") - end - end - if fov_new ~= fov_old then - players[playerName].fov = fov_new - player:set_fov(fov_new, true, fade_time) + if sprinting then + playerphysics.add_physics_factor(player, "speed", "mcl_sprint:sprint", mcl_sprint.SPEED) + mcl_fovapi.apply_modifier(player, "sprint") + else + playerphysics.remove_physics_factor(player, "speed", "mcl_sprint:sprint") + mcl_fovapi.remove_modifier(player, "sprint") end return true end From 5bf6608483d97994f387f8893de9caf2de24188b Mon Sep 17 00:00:00 2001 From: the-real-herowl Date: Sun, 10 Dec 2023 00:20:43 +0100 Subject: [PATCH 436/982] Made bow unfocus faster --- mods/ITEMS/mcl_bows/bow.lua | 1 + mods/PLAYER/mcl_fovapi/init.lua | 8 ++++++-- 2 files changed, 7 insertions(+), 2 deletions(-) diff --git a/mods/ITEMS/mcl_bows/bow.lua b/mods/ITEMS/mcl_bows/bow.lua index aee5545ab..6ae64a14e 100644 --- a/mods/ITEMS/mcl_bows/bow.lua +++ b/mods/ITEMS/mcl_bows/bow.lua @@ -38,6 +38,7 @@ mcl_fovapi.register_modifier({ name = "bowcomplete", fov_factor = 0.8, time = 1, + reset_time = 0.3, is_multiplier = true, }) diff --git a/mods/PLAYER/mcl_fovapi/init.lua b/mods/PLAYER/mcl_fovapi/init.lua index 61fc244b7..84817e382 100644 --- a/mods/PLAYER/mcl_fovapi/init.lua +++ b/mods/PLAYER/mcl_fovapi/init.lua @@ -45,6 +45,9 @@ function mcl_fovapi.register_modifier(def) if type(def.time) ~= "number" then error("Transition time must be a number") end + if def.reset_time ~= nil and type(def.reset_time) ~= "number" then + error("Reset time, if provided, must be a number") + end if def.on_start ~= nil and type(def.on_start) ~= "function" then error("Callback on_start must be a function") @@ -57,6 +60,7 @@ function mcl_fovapi.register_modifier(def) mdef.fov_factor = def.fov_factor mdef.time = def.time + mdef.reset_time = def.reset_time or def.time if def.is_multiplier == false then mdef.is_multiplier = false else mdef.is_multiplier = true end @@ -168,7 +172,7 @@ function mcl_fovapi.remove_modifier(player, modifier_name) local elem = next if elem(applied) == nil then - player:set_fov(0, false, modifier.time) + player:set_fov(0, false, modifier.reset_time) return end local exc = false @@ -198,7 +202,7 @@ function mcl_fovapi.remove_modifier(player, modifier_name) fov_factor = fov_factor * x.fov_factor end end - player:set_fov(fov_factor, not non_multiplier_added, modifier.time) + player:set_fov(fov_factor, not non_multiplier_added, modifier.reset_time) end if mcl_fovapi.registered_modifiers[modifier_name].on_end ~= nil then From 08241f6ea3cf866068456ba7941669fa59d241ba Mon Sep 17 00:00:00 2001 From: the-real-herowl Date: Sun, 10 Dec 2023 00:26:21 +0100 Subject: [PATCH 437/982] Updated the api.md file --- mods/PLAYER/mcl_fovapi/api.md | 24 ++++++++++++++---------- 1 file changed, 14 insertions(+), 10 deletions(-) diff --git a/mods/PLAYER/mcl_fovapi/api.md b/mods/PLAYER/mcl_fovapi/api.md index 43a54de53..5d49bc349 100644 --- a/mods/PLAYER/mcl_fovapi/api.md +++ b/mods/PLAYER/mcl_fovapi/api.md @@ -1,13 +1,13 @@ ### FOV API - * [FOV API](#fov-api) - * [Description](#description) - * [Troubleshooting](#troubleshooting) - * [Modifier Definition](#modifier-definition-) - * [Global MCL_FOVAPI Tables](#global-mclfovapi-tables) - * [Namespaces](#namespaces) - * [Functions](#functions) +* [FOV API](#fov-api) + * [Description](#description) + * [Troubleshooting](#troubleshooting) + * [Modifier Definition](#modifier-definition-) + * [Global MCL_FOVAPI Tables](#global-mclfovapi-tables) + * [Namespaces](#namespaces) + * [Functions](#functions) #### Description @@ -20,20 +20,24 @@ Use it to see what is going on. #### Modifier Definition ```lua def = { - modifer_name = name, + name = name, fov_factor = fov_factor, time = time, + reset_time = reset_time, is_multiplier = is_multiplier, exclusive = exclusive, on_start = on_start, on_end = on_end, } ``` -* Modifier Name: The name of the Modifier, used to identify the specific modifier. Case sensitive. +* Name: The name of the Modifier, used to identify the specific modifier. Case sensitive. * FOV Factor: A float value defining the FOV to apply. Can be an absolute or percentage, depending on Exclusive and Is_Multiplier. * Time: A float value defining the number of seconds to take when applying the FOV Factor. Used to smoothly move between FOVs. Use 0 for an immediate FOV Shift. (Transition time.) +* Reset Time: A float value defining the number of seconds to take when removing the FOV Factor. + Used to smoothly move between FOVs. Use 0 for an immediate FOV Shift. (Reset transition time.) + *If not provided, defaults to **Time*** * Is Multiplier: A bool value used to specify if the FOV Factor is an absolute FOV value or if it should be a percentage of the current FOV. Defaults to `true` if not defined. * Exclusive: A bool value used to specify whether the modifier will override all other FOV modifiers. An example of this @@ -60,7 +64,7 @@ settings. (Expressed as a value usable in `player:set_fov`.) `mcl_fovapi` is the default API Namespace. #### Functions -`mcl_fovapi.register_modifier(name, fov_factor, time, is_multiplier, exclusive, on_start, on_end)` +`mcl_fovapi.register_modifier(def)` Used to register a new FOV Modifier for use. Must be called before applying said modifier to a player. See Modifier Definition for what the parameters are. From f9b192e68f90a9b44f1b1b075a06906bdaca6cf3 Mon Sep 17 00:00:00 2001 From: the-real-herowl Date: Sun, 10 Dec 2023 00:30:04 +0100 Subject: [PATCH 438/982] Updated credits --- mods/PLAYER/mcl_fovapi/mod.conf | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/mods/PLAYER/mcl_fovapi/mod.conf b/mods/PLAYER/mcl_fovapi/mod.conf index b78c78596..86f174c41 100644 --- a/mods/PLAYER/mcl_fovapi/mod.conf +++ b/mods/PLAYER/mcl_fovapi/mod.conf @@ -1,4 +1,4 @@ name = mcl_fovapi -author = Michieal +author = Michieal, Herowl description = An API for handling FOV changes. -depends = mcl_player \ No newline at end of file +depends = mcl_player From 040ce8288ee0ad22fbb7bedcac44acea581f239f Mon Sep 17 00:00:00 2001 From: the-real-herowl Date: Sun, 10 Dec 2023 00:34:31 +0100 Subject: [PATCH 439/982] Script and documentation cleanup --- mods/PLAYER/mcl_fovapi/api.md | 5 ++--- mods/PLAYER/mcl_fovapi/init.lua | 6 ------ 2 files changed, 2 insertions(+), 9 deletions(-) diff --git a/mods/PLAYER/mcl_fovapi/api.md b/mods/PLAYER/mcl_fovapi/api.md index 5d49bc349..d4a9cb1fb 100644 --- a/mods/PLAYER/mcl_fovapi/api.md +++ b/mods/PLAYER/mcl_fovapi/api.md @@ -37,7 +37,7 @@ def = { Used to smoothly move between FOVs. Use 0 for an immediate FOV Shift. (Transition time.) * Reset Time: A float value defining the number of seconds to take when removing the FOV Factor. Used to smoothly move between FOVs. Use 0 for an immediate FOV Shift. (Reset transition time.) - *If not provided, defaults to **Time*** + Defaults to `time` if not defined. * Is Multiplier: A bool value used to specify if the FOV Factor is an absolute FOV value or if it should be a percentage of the current FOV. Defaults to `true` if not defined. * Exclusive: A bool value used to specify whether the modifier will override all other FOV modifiers. An example of this @@ -57,8 +57,7 @@ There are three tables that are accessible via the API. They are `registered_mod `mcl_fovapi.registered_modifiers` has the definitions of all the registered FOV Modifiers. Indexed by Modifier Name. And, `mcl_fovapi.applied_modifiers` is indexed by the Player Name. It contains the names of all the modifiers applied to the -player. The `mcl_fovapi.default_fov` table is indexed by the Player Name, and contains the Default FOVs of the player from the -settings. (Expressed as a value usable in `player:set_fov`.) +player. #### Namespaces `mcl_fovapi` is the default API Namespace. diff --git a/mods/PLAYER/mcl_fovapi/init.lua b/mods/PLAYER/mcl_fovapi/init.lua index 84817e382..19fa393c0 100644 --- a/mods/PLAYER/mcl_fovapi/init.lua +++ b/mods/PLAYER/mcl_fovapi/init.lua @@ -12,15 +12,10 @@ local pairs = pairs -- Globals mcl_fovapi = {} -mcl_fovapi.default_fov = {} -- Handles default fov for players mcl_fovapi.registered_modifiers = {} mcl_fovapi.applied_modifiers = {} minetest.register_on_joinplayer(function(player) - local name = player:get_player_name() - -- Assign default FOV - mcl_fovapi.default_fov[name] = player:get_fov() - if DEBUG then minetest.log("FOV::Player: " .. name .. "\nFOV: " .. player:get_fov()) end @@ -31,7 +26,6 @@ minetest.register_on_leaveplayer(function(player) local name = player:get_player_name() -- handle clean up - mcl_fovapi.default_fov[name] = nil mcl_fovapi.applied_modifiers[name] = nil end) From 98b6ead591ce8945e957b6d74a72adfff14ac0d7 Mon Sep 17 00:00:00 2001 From: Michieal Date: Mon, 11 Dec 2023 03:46:38 +0000 Subject: [PATCH 440/982] Fixed a couple of errors Removed a debug statement that was broken. Changed `modififer` to `modifier` in a code block. --- mods/PLAYER/mcl_fovapi/init.lua | 9 +-------- 1 file changed, 1 insertion(+), 8 deletions(-) diff --git a/mods/PLAYER/mcl_fovapi/init.lua b/mods/PLAYER/mcl_fovapi/init.lua index 19fa393c0..70eb5b81e 100644 --- a/mods/PLAYER/mcl_fovapi/init.lua +++ b/mods/PLAYER/mcl_fovapi/init.lua @@ -15,13 +15,6 @@ mcl_fovapi = {} mcl_fovapi.registered_modifiers = {} mcl_fovapi.applied_modifiers = {} -minetest.register_on_joinplayer(function(player) - if DEBUG then - minetest.log("FOV::Player: " .. name .. "\nFOV: " .. player:get_fov()) - end - -end) - minetest.register_on_leaveplayer(function(player) local name = player:get_player_name() @@ -134,7 +127,7 @@ function mcl_fovapi.apply_modifier(player, modifier_name) if modifier.is_multiplier and is_mult then player:set_fov(fov_factor, true, modifier.time) else - player:set_fov(fov_factor, false, modififer.time) + player:set_fov(fov_factor, false, modifier.time) end end From 5afd0aa255c43d471a803863ee1bb16cdb08e354 Mon Sep 17 00:00:00 2001 From: the-real-herowl Date: Tue, 12 Dec 2023 01:45:07 +0100 Subject: [PATCH 441/982] Fixed the exclusive modifiers not being exclusive --- mods/PLAYER/mcl_fovapi/init.lua | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/mods/PLAYER/mcl_fovapi/init.lua b/mods/PLAYER/mcl_fovapi/init.lua index 70eb5b81e..c3d2dff4c 100644 --- a/mods/PLAYER/mcl_fovapi/init.lua +++ b/mods/PLAYER/mcl_fovapi/init.lua @@ -89,6 +89,10 @@ function mcl_fovapi.apply_modifier(player, modifier_name) mcl_fovapi.applied_modifiers[player] = {} end + for k, _ in pairs(mcl_fovapi.applied_modifiers[player]) do + if mcl_fovapi.registered_modifiers[k].exclusive == true then return end + end + local modifier = mcl_fovapi.registered_modifiers[modifier_name] if modifier.on_start ~= nil then modifier.on_start(player) From e312955a14df85dc090e33701fc936bef937c67b Mon Sep 17 00:00:00 2001 From: the-real-herowl Date: Wed, 13 Dec 2023 00:08:35 +0100 Subject: [PATCH 442/982] Made spyglass reset instant --- mods/ITEMS/mcl_spyglass/init.lua | 1 + 1 file changed, 1 insertion(+) diff --git a/mods/ITEMS/mcl_spyglass/init.lua b/mods/ITEMS/mcl_spyglass/init.lua index a4ea144e1..56b71b961 100644 --- a/mods/ITEMS/mcl_spyglass/init.lua +++ b/mods/ITEMS/mcl_spyglass/init.lua @@ -21,6 +21,7 @@ mcl_fovapi.register_modifier({ name = "spyglass", fov_factor = 8, time = 0.1, + reset_time = 0, is_multiplier = false, exclusive = true, }) From 8a5058e0327c0096368f122daf64b4724a9b67e2 Mon Sep 17 00:00:00 2001 From: the-real-herowl Date: Wed, 13 Dec 2023 00:29:22 +0100 Subject: [PATCH 443/982] Unified and refactored FOV API code --- mods/PLAYER/mcl_fovapi/init.lua | 71 ++++++++++++++++----------------- 1 file changed, 34 insertions(+), 37 deletions(-) diff --git a/mods/PLAYER/mcl_fovapi/init.lua b/mods/PLAYER/mcl_fovapi/init.lua index c3d2dff4c..92815d833 100644 --- a/mods/PLAYER/mcl_fovapi/init.lua +++ b/mods/PLAYER/mcl_fovapi/init.lua @@ -15,11 +15,17 @@ mcl_fovapi = {} mcl_fovapi.registered_modifiers = {} mcl_fovapi.applied_modifiers = {} +minetest.register_on_joinplayer(function(player) + local player_name = player:get_player_name() + + -- initialization + mcl_fovapi.applied_modifiers[player_name] = {} +end) minetest.register_on_leaveplayer(function(player) - local name = player:get_player_name() + local player_name = player:get_player_name() -- handle clean up - mcl_fovapi.applied_modifiers[name] = nil + mcl_fovapi.applied_modifiers[player_name] = nil end) function mcl_fovapi.register_modifier(def) @@ -66,47 +72,38 @@ function mcl_fovapi.register_modifier(def) end minetest.register_on_respawnplayer(function(player) - mcl_fovapi.remove_all_modifiers(player:get_player_name()) + mcl_fovapi.remove_all_modifiers(player) end) function mcl_fovapi.apply_modifier(player, modifier_name) - if player == nil then - return - end - if modifier_name == nil then + if not player or not modifier_name then return end if mcl_fovapi.registered_modifiers[modifier_name] == nil then return end - if mcl_fovapi.applied_modifiers and mcl_fovapi.applied_modifiers[player] and mcl_fovapi.applied_modifiers[player][modifier_name] then - if mcl_fovapi.applied_modifiers[player][modifier_name] and mcl_fovapi.applied_modifiers[player][modifier_name] == true then - return - end + local player_name = player:get_player_name() + if mcl_fovapi.applied_modifiers and mcl_fovapi.applied_modifiers[player_name] and mcl_fovapi.applied_modifiers[player_name][modifier_name] then + return end - if mcl_fovapi.applied_modifiers[player] == nil then - mcl_fovapi.applied_modifiers[player] = {} - end - - for k, _ in pairs(mcl_fovapi.applied_modifiers[player]) do + for k, _ in pairs(mcl_fovapi.applied_modifiers[player_name]) do if mcl_fovapi.registered_modifiers[k].exclusive == true then return end end local modifier = mcl_fovapi.registered_modifiers[modifier_name] - if modifier.on_start ~= nil then + if modifier.on_start then modifier.on_start(player) end - mcl_fovapi.applied_modifiers[player][modifier_name] = true -- set the applied to be true. + mcl_fovapi.applied_modifiers[player_name][modifier_name] = true -- set the applied to be true. if DEBUG then - minetest.log("FOV::Player Applied Modifiers :" .. dump(mcl_fovapi.applied_modifiers[player])) + minetest.log("FOV::Player Applied Modifiers :" .. dump(mcl_fovapi.applied_modifiers[player_name])) end - local pname = player:get_player_name() if DEBUG then - minetest.log("FOV::Modifier applied to player:" .. pname .. " modifier: " .. modifier_name) + minetest.log("FOV::Modifier applied to player:" .. player_name .. " modifier: " .. modifier_name) end -- modifier apply code. @@ -138,26 +135,27 @@ function mcl_fovapi.apply_modifier(player, modifier_name) end function mcl_fovapi.remove_modifier(player, modifier_name) - if player == nil then + if not player or not modifier_name then return end - if mcl_fovapi.applied_modifiers[player][modifier_name] == nil then - return + local player_name = player:get_player_name() + if not mcl_fovapi.applied_modifiers[player_name] + or not mcl_fovapi.applied_modifiers[player_name][modifier_name] then + return end if DEBUG then - local name = player:get_player_name() - minetest.log("FOV::Player: " .. name .. " modifier: " .. modifier_name .. "removed.") + minetest.log("FOV::Player: " .. player_name .. " modifier: " .. modifier_name .. "removed.") end - mcl_fovapi.applied_modifiers[player][modifier_name] = nil + mcl_fovapi.applied_modifiers[player_name][modifier_name] = nil local modifier = mcl_fovapi.registered_modifiers[modifier_name] -- check for other fov modifiers, and set them up, or reset to default. local applied = {} - for k, _ in pairs(mcl_fovapi.applied_modifiers[player]) do + for k, _ in pairs(mcl_fovapi.applied_modifiers[player_name]) do applied[k] = mcl_fovapi.registered_modifiers[k] end @@ -196,30 +194,29 @@ function mcl_fovapi.remove_modifier(player, modifier_name) player:set_fov(fov_factor, not non_multiplier_added, modifier.reset_time) end - if mcl_fovapi.registered_modifiers[modifier_name].on_end ~= nil then + if mcl_fovapi.registered_modifiers[modifier_name].on_end then mcl_fovapi.registered_modifiers[modifier_name].on_end(player) end end function mcl_fovapi.remove_all_modifiers(player) - if player == nil then + if not player then return end + local player_name = player:get_player_name() if DEBUG then - local name = player:get_player_name() - minetest.log("FOV::Player: " .. name .. " modifiers have been reset.") + minetest.log("FOV::Player: " .. player_name .. " modifiers have been reset.") end - for x in mcl_fovapi.applied_modifiers[player] do + for name, x in pairs(mcl_fovapi.applied_modifiers[player_name]) do x = nil + if mcl_fovapi.registered_modifiers[name].on_end then + mcl_fovapi.registered_modifiers[name].on_end(player) + end end player:set_fov(0, false, 0) - if mcl_fovapi.registered_modifiers[modifier_name].on_end ~= nil then - mcl_fovapi.registered_modifiers[modifier_name].on_end(player) - end - end --[[ From d7ed37ef25e14b0451a627809e34599dd96dc436 Mon Sep 17 00:00:00 2001 From: Eliy21 Date: Tue, 19 Dec 2023 15:31:29 +0000 Subject: [PATCH 444/982] Remove redundant knockback limiter --- mods/ITEMS/mcl_enchanting/enchantments.lua | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mods/ITEMS/mcl_enchanting/enchantments.lua b/mods/ITEMS/mcl_enchanting/enchantments.lua index db2aa9da6..c26df61d9 100644 --- a/mods/ITEMS/mcl_enchanting/enchantments.lua +++ b/mods/ITEMS/mcl_enchanting/enchantments.lua @@ -311,7 +311,7 @@ function minetest.calculate_knockback(player, hitter, time_from_last_punch, tool local dir_dot = (hv.x * dir.x) + (hv.z * dir.z) local hitter_mag = math.sqrt((hv.x * hv.x) + (hv.z * hv.z)) local player_mag = math.sqrt((v.x * v.x) + (v.z * v.z)) - if dir_dot > 0 and player_mag <= hitter_mag * 0.625 then + if dir_dot > 0 then knockback = knockback + hitter_mag * 0.6875 end -- reduce floatiness From ff882707def990b5e30eede831a7f4aa43626a1d Mon Sep 17 00:00:00 2001 From: Eliy21 Date: Tue, 19 Dec 2023 16:15:41 +0000 Subject: [PATCH 445/982] Rework moving majority of the added velocity knockbacks into sprinting --- mods/ITEMS/mcl_enchanting/enchantments.lua | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/mods/ITEMS/mcl_enchanting/enchantments.lua b/mods/ITEMS/mcl_enchanting/enchantments.lua index c26df61d9..7744f2c7e 100644 --- a/mods/ITEMS/mcl_enchanting/enchantments.lua +++ b/mods/ITEMS/mcl_enchanting/enchantments.lua @@ -307,12 +307,15 @@ function minetest.calculate_knockback(player, hitter, time_from_last_punch, tool end end -- add player velocity to knockback + local h_name = hitter:get_player_name() local hv = hitter:get_velocity() local dir_dot = (hv.x * dir.x) + (hv.z * dir.z) local hitter_mag = math.sqrt((hv.x * hv.x) + (hv.z * hv.z)) local player_mag = math.sqrt((v.x * v.x) + (v.z * v.z)) - if dir_dot > 0 then + if dir_dot > 0 and mcl_sprint.is_sprinting(h_name) then knockback = knockback + hitter_mag * 0.6875 + elseif dir_dot > 0 then + knockback = knockback + hitter_mag * 0.34375 end -- reduce floatiness minetest.after(0.25, function() From 76bff2b540b55b644aa2f07b79ad5db17c1c5dca Mon Sep 17 00:00:00 2001 From: Eliy21 Date: Tue, 19 Dec 2023 16:49:48 +0000 Subject: [PATCH 446/982] Add minimum pvp knockbacks to other meele weapons --- mods/ITEMS/mcl_enchanting/enchantments.lua | 2 ++ 1 file changed, 2 insertions(+) diff --git a/mods/ITEMS/mcl_enchanting/enchantments.lua b/mods/ITEMS/mcl_enchanting/enchantments.lua index 7744f2c7e..60e8a6c99 100644 --- a/mods/ITEMS/mcl_enchanting/enchantments.lua +++ b/mods/ITEMS/mcl_enchanting/enchantments.lua @@ -304,6 +304,8 @@ function minetest.calculate_knockback(player, hitter, time_from_last_punch, tool -- add minimum knockback if knockback <= 1.5 then knockback = knockback + 4.875 + elseif knockback <= 6.19 then + knockback = knockback + 0.609375 end end -- add player velocity to knockback From e19de859903e3b75a4378d560162f52b53619c71 Mon Sep 17 00:00:00 2001 From: Eliy21 Date: Tue, 19 Dec 2023 17:19:09 +0000 Subject: [PATCH 447/982] Adjust the difference between sprinting & walking knockbacks for a more seemless transition --- mods/ITEMS/mcl_enchanting/enchantments.lua | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mods/ITEMS/mcl_enchanting/enchantments.lua b/mods/ITEMS/mcl_enchanting/enchantments.lua index 60e8a6c99..29fdab6f6 100644 --- a/mods/ITEMS/mcl_enchanting/enchantments.lua +++ b/mods/ITEMS/mcl_enchanting/enchantments.lua @@ -317,7 +317,7 @@ function minetest.calculate_knockback(player, hitter, time_from_last_punch, tool if dir_dot > 0 and mcl_sprint.is_sprinting(h_name) then knockback = knockback + hitter_mag * 0.6875 elseif dir_dot > 0 then - knockback = knockback + hitter_mag * 0.34375 + knockback = knockback + hitter_mag * 0.515625 end -- reduce floatiness minetest.after(0.25, function() From 96fa6c251ef59acaed76b6e65e4a7af795cb62b6 Mon Sep 17 00:00:00 2001 From: Eliy21 Date: Wed, 20 Dec 2023 15:50:37 +0000 Subject: [PATCH 448/982] Counteract self forward velocity when hit by players in pvp --- mods/ITEMS/mcl_enchanting/enchantments.lua | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/mods/ITEMS/mcl_enchanting/enchantments.lua b/mods/ITEMS/mcl_enchanting/enchantments.lua index 29fdab6f6..bd9b4047d 100644 --- a/mods/ITEMS/mcl_enchanting/enchantments.lua +++ b/mods/ITEMS/mcl_enchanting/enchantments.lua @@ -308,6 +308,11 @@ function minetest.calculate_knockback(player, hitter, time_from_last_punch, tool knockback = knockback + 0.609375 end end + -- counteract forward velocity when hit + local self_dir_dot = (v.x * dir.x) + (v.z * dir.z) + if self_dir_dot < 0 then + player:add_velocity({x = v.x * -1, y = 0, z = v.z * -1}) + end -- add player velocity to knockback local h_name = hitter:get_player_name() local hv = hitter:get_velocity() From 4cfd4ef6ce890c0435fd2056d92c0d896f058380 Mon Sep 17 00:00:00 2001 From: cora Date: Sun, 10 Dec 2023 22:47:28 +0100 Subject: [PATCH 449/982] Fix wrong argument when piston dig calls on_dignode callbacks --- mods/ITEMS/REDSTONE/mesecons_mvps/init.lua | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mods/ITEMS/REDSTONE/mesecons_mvps/init.lua b/mods/ITEMS/REDSTONE/mesecons_mvps/init.lua index 88ca9d30e..9fd381b76 100644 --- a/mods/ITEMS/REDSTONE/mesecons_mvps/init.lua +++ b/mods/ITEMS/REDSTONE/mesecons_mvps/init.lua @@ -284,7 +284,7 @@ function mesecon.mvps_push_or_pull(pos, stackdir, movedir, maximum, player_name, local counted_drops = {} minetest.remove_node(n.pos) for _, callback in pairs(minetest.registered_on_dignodes) do - callback(n.pos, n) + callback(n.pos, n.node) end for _, item in ipairs(drops) do if type(item) ~= "string" then From d5eda7352c6d2e602ccc698fb10c92e9a78c06db Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jos=C3=A9=20M?= Date: Wed, 20 Dec 2023 18:29:13 -0600 Subject: [PATCH 450/982] Remove whitespace-only translation in mcl_blast_furnace template file --- mods/ITEMS/mcl_blast_furnace/locale/template.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mods/ITEMS/mcl_blast_furnace/locale/template.txt b/mods/ITEMS/mcl_blast_furnace/locale/template.txt index 46841046d..7b2b35c21 100644 --- a/mods/ITEMS/mcl_blast_furnace/locale/template.txt +++ b/mods/ITEMS/mcl_blast_furnace/locale/template.txt @@ -6,6 +6,6 @@ Use the recipe book to see what ores you can smelt, what you can use as fuel and Use the blast furnace to open the furnace menu.= Place a furnace fuel in the lower slot and the source material in the upper slot.= The blast furnace will slowly use its fuel to smelt the item.= -The result will be placed into the output slot at the right side.= +The result will be placed into the output slot at the right side.= Blast Furnaces smelt several items, mainly ores and armor, using a furnace fuel, but twice as fast as a normal furnace.= Active Blast Furnace= From 5e28ff2d06f0cbd268351566eceade4b482da0bc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jos=C3=A9=20M?= Date: Wed, 20 Dec 2023 18:34:16 -0600 Subject: [PATCH 451/982] Delete non-empty translation in mcl_enchanting template file --- mods/ITEMS/mcl_enchanting/locale/template.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mods/ITEMS/mcl_enchanting/locale/template.txt b/mods/ITEMS/mcl_enchanting/locale/template.txt index 59876dcf3..2a0890d91 100644 --- a/mods/ITEMS/mcl_enchanting/locale/template.txt +++ b/mods/ITEMS/mcl_enchanting/locale/template.txt @@ -130,7 +130,7 @@ Aqua Affinity= Increases underwater mining speed.= Blast Protection= Reduces explosion damage and knockback.= -Curse of Binding=Malédiction du lien éternel +Curse of Binding= Item cannot be removed from armor slots except due to death, breaking or in Creative Mode.= Feather Falling= Reduces fall damage.= From 1f52b7051a858286a4a1a064835a8bea47fe3989 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jos=C3=A9=20M?= Date: Wed, 20 Dec 2023 18:58:15 -0600 Subject: [PATCH 452/982] Add missing placeholder(s) in translation: '@1' --- mods/HUD/awards/locale/awards.de.tr | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/mods/HUD/awards/locale/awards.de.tr b/mods/HUD/awards/locale/awards.de.tr index 190a76071..1decf81ec 100644 --- a/mods/HUD/awards/locale/awards.de.tr +++ b/mods/HUD/awards/locale/awards.de.tr @@ -1,7 +1,7 @@ # textdomain:awards @1: @2=@1: @2 @1 (got)=@1 (erhalten) -@1’s awards:=Auszeichnungen von @: +@1’s awards:=Auszeichnungen von @1: (Secret Advancement)=(Geheime Auszeichnung) Achievement gotten!=Auszeichnung erhalten! Achievement gotten:=Auszeichnung erhalten: @@ -61,4 +61,4 @@ Achievement “@1” does not exist.=Auszeichnung »@1« existiert nicht. Write something in chat.=Schreiben Sie etwas in den Chat. Write @1 chat messages.=Schreiben Sie @1 Chatnachrichten. @1/@2 chat messages=@1/@2 Chatnachrichten -Awards are disabled, enable them first by using /awards enable!=Ihre Auszeichnungen sind aktuell deaktiviert, bitte aktivieren Sie diese zuerst indem Sie /awards enable ausführen bevor Sie diesen Befehl erneut verwenden! \ No newline at end of file +Awards are disabled, enable them first by using /awards enable!=Ihre Auszeichnungen sind aktuell deaktiviert, bitte aktivieren Sie diese zuerst indem Sie /awards enable ausführen bevor Sie diesen Befehl erneut verwenden! From dc4c559ad930136e82dd09212f9467b3815e8723 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jos=C3=A9=20M?= Date: Wed, 20 Dec 2023 19:04:46 -0600 Subject: [PATCH 453/982] Escape equals sign in translation --- mods/ITEMS/mcl_potions/locale/mcl_potions.fr.tr | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mods/ITEMS/mcl_potions/locale/mcl_potions.fr.tr b/mods/ITEMS/mcl_potions/locale/mcl_potions.fr.tr index 1547a36c0..775815885 100644 --- a/mods/ITEMS/mcl_potions/locale/mcl_potions.fr.tr +++ b/mods/ITEMS/mcl_potions/locale/mcl_potions.fr.tr @@ -1,7 +1,7 @@ # textdomain: mcl_potions []= [] -Add a status effect to yourself. Arguments: : name of status effect, e.g. poison. : duration in seconds. : effect strength multiplier (1 @= 100%)=Ajoutez-vous un effet de statut. Arguments: : nom de l'effet de statut, par ex. poison. : durée en secondes. : multiplicateur de force d'effet (1 @ = 100%) +Add a status effect to yourself. Arguments: : name of status effect, e.g. poison. : duration in seconds. : effect strength multiplier (1 @= 100%)=Ajoutez-vous un effet de statut. Arguments: : nom de l'effet de statut, par ex. poison. : durée en secondes. : multiplicateur de force d'effet (1 @= 100%) Missing effect parameter!=Paramètre d'effet manquant! Missing or invalid duration parameter!=Paramètre durée manquant ou invalide! From 325c6ab4cadfa27ae3271e9e12a7560afc4a4bc1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jos=C3=A9=20M?= Date: Wed, 20 Dec 2023 19:13:30 -0600 Subject: [PATCH 454/982] Escape equals signs in translation file mcl_deepslate.pt_BR.tr --- mods/ITEMS/mcl_deepslate/locale/mcl_deepslate.pt_BR.tr | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mods/ITEMS/mcl_deepslate/locale/mcl_deepslate.pt_BR.tr b/mods/ITEMS/mcl_deepslate/locale/mcl_deepslate.pt_BR.tr index 4f7c6ad24..e86bb42e9 100644 --- a/mods/ITEMS/mcl_deepslate/locale/mcl_deepslate.pt_BR.tr +++ b/mods/ITEMS/mcl_deepslate/locale/mcl_deepslate.pt_BR.tr @@ -50,4 +50,4 @@ Polished Deepslate Stairs=Escadas de Ardósia Polida Polished Deepslate Wall=Muro de Ardósia Polida Polished Deepslate=Ardósia Polida Tuff=Tufo -Tuff is an ornamental rock formed from volcanic ash, occurring in underground blobs below Y=16.=Tufo é uma rocha ornamental formada a partir de cinzas vulcânicas, ocorrendo em bolhas no subsolo abaixo de Y=16. +Tuff is an ornamental rock formed from volcanic ash, occurring in underground blobs below Y@=16.=Tufo é uma rocha ornamental formada a partir de cinzas vulcânicas, ocorrendo em bolhas no subsolo abaixo de Y@=16. From 0f82c623d57d31c358fb6a89e3bffd3d31998eb7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jos=C3=A9=20M?= Date: Wed, 20 Dec 2023 23:15:12 -0600 Subject: [PATCH 455/982] Add missing placeholder(s) in mcl_farming.fr.tr translation: '@1' --- mods/ITEMS/mcl_farming/locale/mcl_farming.fr.tr | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mods/ITEMS/mcl_farming/locale/mcl_farming.fr.tr b/mods/ITEMS/mcl_farming/locale/mcl_farming.fr.tr index 5b14b109b..2b4bedcff 100644 --- a/mods/ITEMS/mcl_farming/locale/mcl_farming.fr.tr +++ b/mods/ITEMS/mcl_farming/locale/mcl_farming.fr.tr @@ -101,5 +101,5 @@ Turns block into farmland=Transforme un bloc en terres agricoles Surface for crops=Surface pour les cultures Can become wet=Peut devenir humide Uses: @1=Utilisations : @1 -Sweet Berry Bush (Stage @1)=Buisson de baies sucrées (étape 1) +Sweet Berry Bush (Stage @1)=Buisson de baies sucrées (étape @1) Sweet Berry=Baie sucrée From 0d1a6d91e9b4f2c6572a87655c912c26588fba6d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jos=C3=A9=20M?= Date: Wed, 20 Dec 2023 23:24:03 -0600 Subject: [PATCH 456/982] Remove an unescaped equals sign in mcl_info.fr.tr translation --- mods/HUD/mcl_info/locale/mcl_info.fr.tr | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mods/HUD/mcl_info/locale/mcl_info.fr.tr b/mods/HUD/mcl_info/locale/mcl_info.fr.tr index 96fb2622e..19ff9553d 100644 --- a/mods/HUD/mcl_info/locale/mcl_info.fr.tr +++ b/mods/HUD/mcl_info/locale/mcl_info.fr.tr @@ -1,4 +1,4 @@ # textdomain: mcl_info -Set debug bit mask: 0 @= disable, 1 @= biome name, 2 @= coordinates, 3 @= all=Régler le masque de bits pour débuguer : 0 @= pour désactiver, 1 @= nom du biome, 2 @= coordonnées, 3 @= tout= +Set debug bit mask: 0 @= disable, 1 @= biome name, 2 @= coordinates, 3 @= all=Régler le masque de bits pour débuguer : 0 @= pour désactiver, 1 @= nom du biome, 2 @= coordonnées, 3 @= tout Error! Possible values are integer numbers from @1 to @2=Erreur ! Les valeurs possibles sont des nombres entiers de @1 à @2 Debug bit mask set to @1=Masque de bits de débuguage réglé à @1 From c9d221976b897d43c21771beb6c5efd5b211b6b9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jos=C3=A9=20M?= Date: Wed, 20 Dec 2023 23:40:33 -0600 Subject: [PATCH 457/982] Escape equals signs in translation file mcl_doc_basics.it.tr --- mods/HELP/mcl_doc_basics/locale/mcl_doc_basics.it.tr | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/mods/HELP/mcl_doc_basics/locale/mcl_doc_basics.it.tr b/mods/HELP/mcl_doc_basics/locale/mcl_doc_basics.it.tr index 694735cac..afe82fd27 100644 --- a/mods/HELP/mcl_doc_basics/locale/mcl_doc_basics.it.tr +++ b/mods/HELP/mcl_doc_basics/locale/mcl_doc_basics.it.tr @@ -25,7 +25,7 @@ Minetest is a free software game engine for games based on voxel gameplay, inspi The player is thrown into a huge world made out of cubes or blocks. These cubes usually make the landscape they blocks can be removed and placed almost entirely freely. Using the collected items, new tools and other items can be crafted. Games in Minetest (also called “subgames”) can, however, be much more complex than this.=L'utente è gettat* in un enorme mondo fatto di cubi o blocchi. Questi cubi normalmente compongono il panorama e possono essere tolti o messi quasi completamente liberamente. Usando gli oggetti raccolti, si possono assemblare nuovi strumenti e altri oggetti. I giochi in Minetest (chiamati anche "subgame") possono, comunque, essere molto più complessi. A core feature of Minetest is the built-in modding capability. Mods modify existing gameplay. They can be as simple as adding a few decorational blocks or be very complex by e.g. introducing completely new gameplay concepts, generating a completely different kind of world, and many other things.=Una caratteristica centrale di Minetest è la capacità integrata di usare moduli. I moduli modificano l'esperienza di gioco esistente. Possono essere tanto semplici da aggiungere qualche blocco decorativo o essere molto complessi, per esempio introducendo concetti di gioco totalmente nuovi, generare un tipo di mondo completamente diverso, e molte altre cose. Minetest can be played alone or online together with multiple players. Online play will work out of the box with any mods, with no need for additional software as they are entirely provided by the server.=Minetest può essere giocato localmente o in rete assieme a più utenti. Il gioco in rete funzionerà immediatamente senza nessun modulo, senza bisogno di programmi aggiuntivi perché interamente forniti dal server. -Minetest is usually bundled with a simple default game, named “Minetest Game” (shown in images 1 and 2). You probably already have it. Other games for Minetest can be downloaded from the official Minetest forums .=Minetest generalmente include un gioco predefinito semplice, chiamato "Minetest Game" (mostrato nelle immagini 1 e 2). Probabilmente lo avete già. Altri giochi per Minetest possono essere scaricati dai forum ufficiali di Minetest . +Minetest is usually bundled with a simple default game, named “Minetest Game” (shown in images 1 and 2). You probably already have it. Other games for Minetest can be downloaded from the official Minetest forums .=Minetest generalmente include un gioco predefinito semplice, chiamato "Minetest Game" (mostrato nelle immagini 1 e 2). Probabilmente lo avete già. Altri giochi per Minetest possono essere scaricati dai forum ufficiali di Minetest . Sneaking=Strisciare Sneaking makes you walk slower and prevents you from falling off the edge of a block.=Strisciare vi fa camminare più lentamente e vi impedisce di cadere dal bordo di un blocco. To sneak, hold down the sneak key (default: [Shift]). When you release it, you stop sneaking. Careful: When you release the sneak key at a ledge, you might fall!=Per strisciare, tenete premuto il tasto per strisciare (predefinito [Maiusc]). Quando lo rilasciate, smettete di strisciare. Fate attenzione: quando rilasciate il tasto per strisciare vicino a un orlo, potreste cadere! @@ -396,7 +396,7 @@ Note that “transparency” here only means that the block is able to carry bri Coordinates=Coordinate The Minetest world is a large cube. And because of this, a position in the world can be easily expressed with Cartesian coordinates. That is, for each position in the world, there are 3 values X, Y and Z.=Il mondo di Minetest è un grande cubo. E per questo, una posizione nel mondo può essere facilmente espressa tramite coordinate Cartesiane. Cioè, per ogni posizione nel mondo, esistono tre valori: X, Y e Z. Like this: (5, 45, -12)=Come questi: (5, 45, -12) -This refers to the position where X=5, Y=45 and Z=-12. The 3 letters are called “axes”: Y is for the height. X and Z are for the horizontal position.=Ciò si riferisce alla posizione dove X=5 (si legga “X vale 5”, NdT), Y=45 e Z=-12. Le tre lettere sono chiamate “assi”: Y si riferisce all'altezza. X e Z si riferiscono alla posizione orizzontale. +This refers to the position where X@=5, Y@=45 and Z@=-12. The 3 letters are called “axes”: Y is for the height. X and Z are for the horizontal position.=Ciò si riferisce alla posizione dove X@=5 (si legga “X vale 5”, NdT), Y@=45 e Z@=-12. Le tre lettere sono chiamate “assi”: Y si riferisce all'altezza. X e Z si riferiscono alla posizione orizzontale. The values for X, Y and Z work like this:=I valori di X, Y e Z funzionano così: • If you go up, Y increases=• Se salite, Y aumenta • If you go down, Y decreases=• Se scendete, Y diminuisce From 9d62c4ca5e68922108052bf1080f657f1763fb8c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jos=C3=A9=20M?= Date: Wed, 20 Dec 2023 23:46:30 -0600 Subject: [PATCH 458/982] Fix missing placeholder(s) in mesecons_commandblock.es.tr translation: '@1' '@2' --- .../mesecons_commandblock/locale/mesecons_commandblock.es.tr | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mods/ITEMS/REDSTONE/mesecons_commandblock/locale/mesecons_commandblock.es.tr b/mods/ITEMS/REDSTONE/mesecons_commandblock/locale/mesecons_commandblock.es.tr index 938c710b9..2933f4fc4 100644 --- a/mods/ITEMS/REDSTONE/mesecons_commandblock/locale/mesecons_commandblock.es.tr +++ b/mods/ITEMS/REDSTONE/mesecons_commandblock/locale/mesecons_commandblock.es.tr @@ -1,7 +1,7 @@ # textdomain: mesecons_commandblock Error: The command “@1” does not exist; your command block has not been changed. Use the “help” chat command for a list of available commands.=Error: el comando "@1" no existe; su bloque de comando no ha sido cambiado. Utilice el comando de chat "help" para obtener una lista de los comandos disponibles. Error: The command “@1” does not exist; your command block has not been changed. Use the “help” chat command for a list of available commands. Hint: Try to remove the leading slash.=Error: el comando "@1" no existe; su bloque de comando no ha sido cambiado. Utilice el comando de chat "help" para obtener una lista de los comandos disponibles. Sugerencia: intente eliminar la barra diagonal inicial. -Error: You have insufficient privileges to use the command “@1” (missing privilege: @2)! The command block has not been changed.=Error: ¡No tiene suficientes privilegios para usar el comando “@ 1” (faltan privilegios: @ 2)! El bloque de comando no ha sido cambiado. +Error: You have insufficient privileges to use the command “@1” (missing privilege: @2)! The command block has not been changed.=Error: ¡No tiene suficientes privilegios para usar el comando “@1” (faltan privilegios: @2)! El bloque de comando no ha sido cambiado. Error: No commander! Block must be replaced.=Error: ¡Sin dueño! El bloque debe ser reemplazado. Commander: @1=Dueño: @1 Submit=Aceptar From 74ab3ffeee77922d530991df32bc0f872fd7dcf4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jos=C3=A9=20M?= Date: Wed, 20 Dec 2023 23:55:39 -0600 Subject: [PATCH 459/982] Add missing placeholder(s) in doc_items.pt.tr translation: '@1' --- mods/HELP/doc/doc_items/locale/doc_items.pt.tr | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/mods/HELP/doc/doc_items/locale/doc_items.pt.tr b/mods/HELP/doc/doc_items/locale/doc_items.pt.tr index 648e14569..abcf11547 100644 --- a/mods/HELP/doc/doc_items/locale/doc_items.pt.tr +++ b/mods/HELP/doc/doc_items/locale/doc_items.pt.tr @@ -53,8 +53,8 @@ Range: 4=Range: 4 Rating @1=Classificação @1 # @1 is minimal rating, @2 is maximum rating Rating @1-@2=Classificação @1-@2 -The fall damage on this block is increased by @1%.=O dano por queda nesse bloco é aumentado em @ 1%. -The fall damage on this block is reduced by @1%.=O dano por queda nesse bloco é reduzido em @ 1%. +The fall damage on this block is increased by @1%.=O dano por queda nesse bloco é aumentado em @1%. +The fall damage on this block is reduced by @1%.=O dano por queda nesse bloco é reduzido em @1%. This block allows light to propagate with a small loss of brightness, and sunlight can even go through losslessly.=Esse bloco permite que a luz se propague com uma pequena perda de brilho, e a luz solar pode até passar sem perdas. This block allows light to propagate with a small loss of brightness.=Esse bloco permite que a luz se propague com uma pequena perda de brilho. This block allows sunlight to propagate without loss in brightness.=Esse bloco permite que a luz solar se propague sem perda de brilho. @@ -78,7 +78,7 @@ This block connects to this block: @1.=Esse bloco se conecta a esse bloco: @1. This block decreases your breath and causes a drowning damage of @1 hit point every 2 seconds.=Esse bloco diminui a sua respiração e causa um dano por afogamento de @1 ponto de vida a cada 2 segundos. This block decreases your breath and causes a drowning damage of @1 hit points every 2 seconds.=Esse bloco diminui a sua respiração e causa um dano por afogamento de @1 pontos de vida a cada 2 segundos. This block is a light source with a light level of @1.=Esse bloco é uma fonte de luz com um nível de luz de @1. -This block glows faintly with a light level of @1.=Esse bloco tem um brilho fraco com um nível de luz de @ 1. +This block glows faintly with a light level of @1.=Esse bloco tem um brilho fraco com um nível de luz de @1. This block is a building block for creating various buildings.=Esse bloco é um bloco de construção para criar vários edifícios. This block is a liquid with these properties:=Esse bloco é um líquido com as seguintes propriedades: This block is affected by gravity and can fall.=Esse bloco é afetado pela gravidade e pode cair. @@ -123,7 +123,7 @@ any level=qualquer nível level 0=nível 0 level 0-@1=nivel 0-@1 unknown=desconhecido -Unknown item (@1)=Item desconhecido +Unknown item (@1)=Item desconhecido (@1) • @1: @2= • @1: @2 HP= • @1: @2, @3= From ec8f3f5530ebe2b3db593841f9c07939f46173fc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jos=C3=A9=20M?= Date: Thu, 21 Dec 2023 00:18:40 -0600 Subject: [PATCH 460/982] Start the beggining of the mcl_tt spanish translation --- mods/HELP/mcl_tt/locale/mcl_tt.es.tr | 48 ++++++++++++++++++++++++++++ 1 file changed, 48 insertions(+) create mode 100644 mods/HELP/mcl_tt/locale/mcl_tt.es.tr diff --git a/mods/HELP/mcl_tt/locale/mcl_tt.es.tr b/mods/HELP/mcl_tt/locale/mcl_tt.es.tr new file mode 100644 index 000000000..b26e9140e --- /dev/null +++ b/mods/HELP/mcl_tt/locale/mcl_tt.es.tr @@ -0,0 +1,48 @@ +# textdomain: mcl_tt +Head armor= +Torso armor= +Legs armor= +Feet armor= +Armor points: @1=Puntos de armadura: @1 +Armor durability: @1=Durabilidad de armadura: @1 +Protection: @1%=Protección: @1% +Hunger points: +@1=Puntos de hambre: +@1 +Saturation points: +@1=Puntos de saturación: +@1 +Deals damage when falling= +Grows on grass blocks or dirt= +Grows on grass blocks, podzol, dirt or coarse dirt= +Flammable= +Zombie view range: -50%= +Skeleton view range: -50%= +Creeper view range: -50%= +Damage: @1=Daño: @1 +Damage (@1): @2= +Healing: @1= +Healing (@1): @2= +Full punch interval: @1s= +Contact damage: @1 per second= +Contact healing: @1 per second= +Drowning damage: @1= +Bouncy (@1%)= +Luminance: @1= +Slippery= +Climbable= +Climbable (only downwards)= +No jumping= +No swimming upwards= +No rising= +Fall damage: @1%= +Fall damage: +@1%= +No fall damage= +Mining speed: @1= +Very fast=Muy rápido +Extremely fast=Extremadamente rápido +Fast=Rápido +Slow=Lento +Very slow=Muy lento +Painfully slow= +Mining durability: @1= +Block breaking strength: @1= +@1 uses=@1 usos +Unlimited uses=Usos ilimitados +Durability: @1=Durabilidad: @1 From 10dcdb7d6b546171d5e4eb62881aed9b1d5ffd2c Mon Sep 17 00:00:00 2001 From: Eliy21 Date: Thu, 21 Dec 2023 15:52:26 +0000 Subject: [PATCH 461/982] Remove unnecessary player vector magnitude calculation --- mods/ITEMS/mcl_enchanting/enchantments.lua | 1 - 1 file changed, 1 deletion(-) diff --git a/mods/ITEMS/mcl_enchanting/enchantments.lua b/mods/ITEMS/mcl_enchanting/enchantments.lua index bd9b4047d..591dfb679 100644 --- a/mods/ITEMS/mcl_enchanting/enchantments.lua +++ b/mods/ITEMS/mcl_enchanting/enchantments.lua @@ -318,7 +318,6 @@ function minetest.calculate_knockback(player, hitter, time_from_last_punch, tool local hv = hitter:get_velocity() local dir_dot = (hv.x * dir.x) + (hv.z * dir.z) local hitter_mag = math.sqrt((hv.x * hv.x) + (hv.z * hv.z)) - local player_mag = math.sqrt((v.x * v.x) + (v.z * v.z)) if dir_dot > 0 and mcl_sprint.is_sprinting(h_name) then knockback = knockback + hitter_mag * 0.6875 elseif dir_dot > 0 then From 113f07581b203b5728b22ed5431f548fe44f8658 Mon Sep 17 00:00:00 2001 From: JoseDouglas26 Date: Thu, 14 Dec 2023 12:42:44 -0300 Subject: [PATCH 462/982] new sunflower mesh --- mods/ITEMS/mcl_flowers/init.lua | 31 +++++++++- .../models/mcl_flowers_sunflower.mtl | 32 ++++++++++ .../models/mcl_flowers_sunflower.obj | 59 +++++++++++++++++++ 3 files changed, 119 insertions(+), 3 deletions(-) create mode 100644 mods/ITEMS/mcl_flowers/models/mcl_flowers_sunflower.mtl create mode 100644 mods/ITEMS/mcl_flowers/models/mcl_flowers_sunflower.obj diff --git a/mods/ITEMS/mcl_flowers/init.lua b/mods/ITEMS/mcl_flowers/init.lua index 10189240b..148d9db53 100644 --- a/mods/ITEMS/mcl_flowers/init.lua +++ b/mods/ITEMS/mcl_flowers/init.lua @@ -383,9 +383,6 @@ add_large_plant("peony", S("Peony"), S("A peony is a large plant which occupies add_large_plant("rose_bush", S("Rose Bush"), S("A rose bush is a large plant which occupies two blocks. It is safe to touch it. Rose bushes are mainly used in dye production."), "mcl_flowers_double_plant_rose_bottom.png", "mcl_flowers_double_plant_rose_top.png", nil, 5/16, 1/16) add_large_plant("lilac", S("Lilac"), S("A lilac is a large plant which occupies two blocks. It is mainly used in dye production."), "mcl_flowers_double_plant_syringa_bottom.png", "mcl_flowers_double_plant_syringa_top.png", nil, 5/16, 6/16) --- TODO: Make the sunflower face East. Requires a mesh for the top node. -add_large_plant("sunflower", S("Sunflower"), S("A sunflower is a large plant which occupies two blocks. It is mainly used in dye production."), "mcl_flowers_double_plant_sunflower_bottom.png", "mcl_flowers_double_plant_sunflower_top.png^mcl_flowers_double_plant_sunflower_front.png", "mcl_flowers_double_plant_sunflower_front.png", 6/16, 6/16) - local longdesc_grass = S("Double tallgrass a variant of tall grass and occupies two blocks. It can be harvested for wheat seeds.") local longdesc_fern = S("Large fern is a variant of fern and occupies two blocks. It can be harvested for wheat seeds.") @@ -522,4 +519,32 @@ if mod_mcimport and mg_name == "singlenode" and fix_doubleplants == true then }) end +minetest.register_node("mcl_flowers:sunflower", { + description = S("Sunflower"), + _doc_items_longdesc = S("A sunflower is a large plant which occupies two blocks. It is mainly used in dye production."), + drawtype = "mesh", + groups = { + attached_node = 1, deco_block = 1, + dig_by_water = 1, destroy_by_lava_flow = 1, dig_by_piston = 1, + flammable = 2, fire_encouragement = 60, fire_flammability = 100, + plant = 1, double_plant = 1, non_mycelium_plant = 1, compostability = 65, grass_palette = nil + }, + inventory_image = "mcl_flowers_double_plant_sunflower_front.png", + mesh = "mcl_flowers_sunflower.obj", + paramtype = "light", + selection_box = { + type = "fixed", + fixed = {-0.25, -0.5, -0.25, 0.25, 1.5, 0.25} + }, + sunlight_propagates = true, + tiles = { + "mcl_flowers_double_plant_sunflower_bottom.png", + "mcl_flowers_double_plant_sunflower_bottom.png", + "mcl_flowers_double_plant_sunflower_front.png", + "mcl_flowers_double_plant_sunflower_back.png" + }, + walkable = false, + wield_image = "mcl_flowers_double_plant_sunflower_front.png" +}) + dofile(modpath.."/register.lua") diff --git a/mods/ITEMS/mcl_flowers/models/mcl_flowers_sunflower.mtl b/mods/ITEMS/mcl_flowers/models/mcl_flowers_sunflower.mtl new file mode 100644 index 000000000..1a72d010b --- /dev/null +++ b/mods/ITEMS/mcl_flowers/models/mcl_flowers_sunflower.mtl @@ -0,0 +1,32 @@ +# Blender 3.6.4 MTL File: 'sunflower.blend' +# www.blender.org + +newmtl Flower_1 +Ns 250.000000 +Ka 1.000000 1.000000 1.000000 +Ks 0.500000 0.500000 0.500000 +Ke 0.000000 0.000000 0.000000 +Ni 1.450000 +d 1.000000 +illum 2 +map_Kd C:/Minetest-5.8/games/mineclone2/textures/mcl_flowers_double_plant_sunflower_front.png + +newmtl Flower_2 +Ns 250.000000 +Ka 1.000000 1.000000 1.000000 +Ks 0.500000 0.500000 0.500000 +Ke 0.000000 0.000000 0.000000 +Ni 1.450000 +d 1.000000 +illum 2 +map_Kd C:/Minetest-5.8/games/mineclone2/textures/mcl_flowers_double_plant_sunflower_back.png + +newmtl Stem +Ns 250.000000 +Ka 1.000000 1.000000 1.000000 +Ks 0.500000 0.500000 0.500000 +Ke 0.000000 0.000000 0.000000 +Ni 1.450000 +d 1.000000 +illum 2 +map_Kd C:/Minetest-5.8/games/mineclone2/textures/mcl_flowers_double_plant_sunflower_bottom.png diff --git a/mods/ITEMS/mcl_flowers/models/mcl_flowers_sunflower.obj b/mods/ITEMS/mcl_flowers/models/mcl_flowers_sunflower.obj new file mode 100644 index 000000000..4bac1dbd7 --- /dev/null +++ b/mods/ITEMS/mcl_flowers/models/mcl_flowers_sunflower.obj @@ -0,0 +1,59 @@ +# Blender 3.6.4 +# www.blender.org +mtllib sunflower.mtl +o Stem_1 +v 0.309359 1.500000 -0.309359 +v -0.309359 1.500000 0.309359 +v 0.309359 -0.500000 -0.309359 +v -0.309359 -0.500000 0.309359 +vn 0.7071 -0.0000 0.7071 +vt 1.000000 1.000000 +vt 0.000000 1.000000 +vt 0.000000 0.000000 +vt 1.000000 0.000000 +s 0 +g Stem_1_Stem +usemtl Stem +f 1/1/1 2/2/1 4/3/1 3/4/1 +o Stem_2 +v 0.309359 1.500000 0.309359 +v -0.309359 1.500000 -0.309359 +v 0.309359 -0.500000 0.309359 +v -0.309359 -0.500000 -0.309359 +vn -0.7071 -0.0000 0.7071 +vt 1.000000 1.000000 +vt 0.000000 1.000000 +vt 0.000000 0.000000 +vt 1.000000 0.000000 +s 0 +g Stem_2_Stem +usemtl Stem +f 5/5/2 6/6/2 8/7/2 7/8/2 +o Flower_1 +v -0.500000 1.933013 -0.125000 +v -0.500000 1.066987 0.375000 +v 0.500000 1.933013 -0.125000 +v 0.500000 1.066987 0.375000 +vn -0.0000 0.5000 0.8660 +vt 0.000000 0.000000 +vt 1.000000 0.000000 +vt 1.000000 1.000000 +vt 0.000000 1.000000 +s 0 +g Flower_1_Flower_1 +usemtl Flower_1 +f 9/9/3 10/10/3 12/11/3 11/12/3 +o Flower_2 +v -0.500000 1.933013 -0.130000 +v -0.500000 1.066987 0.370000 +v 0.500000 1.933013 -0.130000 +v 0.500000 1.066987 0.370000 +vn -0.0000 0.5000 0.8660 +vt 0.000000 0.000000 +vt 1.000000 0.000000 +vt 1.000000 1.000000 +vt 0.000000 1.000000 +s 0 +g Flower_2_Flower_2 +usemtl Flower_2 +f 13/13/4 14/14/4 16/15/4 15/16/4 From dd5a9178d9833804cddcaa462245ea42b7d506c0 Mon Sep 17 00:00:00 2001 From: JoseDouglas26 Date: Thu, 14 Dec 2023 13:29:37 -0300 Subject: [PATCH 463/982] sunflower mapgen bug fix --- mods/MAPGEN/mcl_biomes/init.lua | 76 ++++++++++++++++++++++----------- 1 file changed, 52 insertions(+), 24 deletions(-) diff --git a/mods/MAPGEN/mcl_biomes/init.lua b/mods/MAPGEN/mcl_biomes/init.lua index d42720d26..956a5dac8 100644 --- a/mods/MAPGEN/mcl_biomes/init.lua +++ b/mods/MAPGEN/mcl_biomes/init.lua @@ -4804,32 +4804,60 @@ local function register_decorations() b = {"FlowerForest"} end - minetest.register_decoration({ - deco_type = "schematic", - schematic = { - size = {x = 1, y = 3, z = 1}, - data = { - {name = "air", prob = 0}, - {name = "mcl_flowers:" .. name, param1 = 255, }, - {name = "mcl_flowers:" .. name .. "_top", param1 = 255, }, + if name ~= "sunflower" then + minetest.register_decoration({ + deco_type = "schematic", + schematic = { + size = {x = 1, y = 3, z = 1}, + data = { + {name = "air", prob = 0}, + {name = "mcl_flowers:" .. name, param1 = 255, }, + {name = "mcl_flowers:" .. name .. "_top", param1 = 255, }, + }, }, - }, - place_on = {"group:grass_block_no_snow", "mcl_core:dirt"}, + place_on = {"group:grass_block_no_snow", "mcl_core:dirt"}, - sidelen = 16, - noise_params = { - offset = o, - scale = 0.01, - spread = {x = 300, y = 300, z = 300}, - seed = seed, - octaves = 5, - persist = 0.62, - }, - y_min = 1, - y_max = mcl_vars.mg_overworld_max, - flags = "", - biomes = b, - }) + sidelen = 16, + noise_params = { + offset = o, + scale = 0.01, + spread = {x = 300, y = 300, z = 300}, + seed = seed, + octaves = 5, + persist = 0.62, + }, + y_min = 1, + y_max = mcl_vars.mg_overworld_max, + flags = "", + biomes = b, + }) + else + minetest.register_decoration({ + deco_type = "schematic", + schematic = { + size = {x = 1, y = 2, z = 1}, + data = { + {name = "air", prob = 0}, + {name = "mcl_flowers:" .. name, param1 = 255, }, + }, + }, + place_on = {"group:grass_block_no_snow", "mcl_core:dirt"}, + + sidelen = 16, + noise_params = { + offset = o, + scale = 0.01, + spread = {x = 300, y = 300, z = 300}, + seed = seed, + octaves = 5, + persist = 0.62, + }, + y_min = 1, + y_max = mcl_vars.mg_overworld_max, + flags = "", + biomes = b, + }) + end end end From e6a64cfc69c6ae6e7394863ace4ca66aa42d06c7 Mon Sep 17 00:00:00 2001 From: JoseDouglas26 Date: Thu, 14 Dec 2023 22:35:59 -0300 Subject: [PATCH 464/982] Sound and mining sunflower bug fixes --- mods/ITEMS/mcl_flowers/init.lua | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/mods/ITEMS/mcl_flowers/init.lua b/mods/ITEMS/mcl_flowers/init.lua index 148d9db53..ef22da3a3 100644 --- a/mods/ITEMS/mcl_flowers/init.lua +++ b/mods/ITEMS/mcl_flowers/init.lua @@ -525,8 +525,8 @@ minetest.register_node("mcl_flowers:sunflower", { drawtype = "mesh", groups = { attached_node = 1, deco_block = 1, - dig_by_water = 1, destroy_by_lava_flow = 1, dig_by_piston = 1, - flammable = 2, fire_encouragement = 60, fire_flammability = 100, + dig_by_water = 1, destroy_by_lava_flow = 1, dig_by_piston = 1, dig_immediate = 3, + flammable = 2, flower = 1, fire_encouragement = 60, fire_flammability = 100, plant = 1, double_plant = 1, non_mycelium_plant = 1, compostability = 65, grass_palette = nil }, inventory_image = "mcl_flowers_double_plant_sunflower_front.png", @@ -536,6 +536,7 @@ minetest.register_node("mcl_flowers:sunflower", { type = "fixed", fixed = {-0.25, -0.5, -0.25, 0.25, 1.5, 0.25} }, + sounds = mcl_sounds.node_sound_leaves_defaults(), sunlight_propagates = true, tiles = { "mcl_flowers_double_plant_sunflower_bottom.png", From 85d21fa1e9dcd4abb3e62ad69c61a062ce7c0470 Mon Sep 17 00:00:00 2001 From: JoseDouglas26 Date: Thu, 14 Dec 2023 23:18:38 -0300 Subject: [PATCH 465/982] new sunflower mesh --- .../models/mcl_flowers_sunflower.obj | 42 +++++++++---------- 1 file changed, 21 insertions(+), 21 deletions(-) diff --git a/mods/ITEMS/mcl_flowers/models/mcl_flowers_sunflower.obj b/mods/ITEMS/mcl_flowers/models/mcl_flowers_sunflower.obj index 4bac1dbd7..115670e11 100644 --- a/mods/ITEMS/mcl_flowers/models/mcl_flowers_sunflower.obj +++ b/mods/ITEMS/mcl_flowers/models/mcl_flowers_sunflower.obj @@ -1,12 +1,12 @@ # Blender 3.6.4 # www.blender.org -mtllib sunflower.mtl +mtllib mcl_flowers_sunflower.mtl o Stem_1 -v 0.309359 1.500000 -0.309359 -v -0.309359 1.500000 0.309359 -v 0.309359 -0.500000 -0.309359 -v -0.309359 -0.500000 0.309359 -vn 0.7071 -0.0000 0.7071 +v -0.309359 1.000000 -0.309359 +v 0.309359 1.000000 0.309359 +v -0.309359 -0.500000 -0.309359 +v 0.309359 -0.500000 0.309359 +vn 0.7071 -0.0000 -0.7071 vt 1.000000 1.000000 vt 0.000000 1.000000 vt 0.000000 0.000000 @@ -16,11 +16,11 @@ g Stem_1_Stem usemtl Stem f 1/1/1 2/2/1 4/3/1 3/4/1 o Stem_2 -v 0.309359 1.500000 0.309359 -v -0.309359 1.500000 -0.309359 -v 0.309359 -0.500000 0.309359 -v -0.309359 -0.500000 -0.309359 -vn -0.7071 -0.0000 0.7071 +v 0.309359 1.000000 -0.309359 +v -0.309359 1.000000 0.309359 +v 0.309359 -0.500000 -0.309359 +v -0.309359 -0.500000 0.309359 +vn 0.7071 -0.0000 0.7071 vt 1.000000 1.000000 vt 0.000000 1.000000 vt 0.000000 0.000000 @@ -30,11 +30,11 @@ g Stem_2_Stem usemtl Stem f 5/5/2 6/6/2 8/7/2 7/8/2 o Flower_1 -v -0.500000 1.933013 -0.125000 -v -0.500000 1.066987 0.375000 -v 0.500000 1.933013 -0.125000 -v 0.500000 1.066987 0.375000 -vn -0.0000 0.5000 0.8660 +v -0.145000 1.483012 0.500000 +v 0.355000 0.616987 0.500000 +v -0.145000 1.483012 -0.500000 +v 0.355000 0.616987 -0.500000 +vn 0.8660 0.5000 -0.0000 vt 0.000000 0.000000 vt 1.000000 0.000000 vt 1.000000 1.000000 @@ -44,11 +44,11 @@ g Flower_1_Flower_1 usemtl Flower_1 f 9/9/3 10/10/3 12/11/3 11/12/3 o Flower_2 -v -0.500000 1.933013 -0.130000 -v -0.500000 1.066987 0.370000 -v 0.500000 1.933013 -0.130000 -v 0.500000 1.066987 0.370000 -vn -0.0000 0.5000 0.8660 +v -0.150000 1.482013 0.500000 +v 0.350000 0.615987 0.500000 +v -0.150000 1.482013 -0.500000 +v 0.350000 0.615987 -0.500000 +vn 0.8660 0.5000 -0.0000 vt 0.000000 0.000000 vt 1.000000 0.000000 vt 1.000000 1.000000 From f9972aef015cc992b41ab2c004a1a3c5101c3310 Mon Sep 17 00:00:00 2001 From: JoseDouglas26 Date: Thu, 14 Dec 2023 23:35:42 -0300 Subject: [PATCH 466/982] new lower mesh and selection box --- mods/ITEMS/mcl_flowers/init.lua | 2 +- .../models/mcl_flowers_sunflower.obj | 24 +++++++++---------- 2 files changed, 13 insertions(+), 13 deletions(-) diff --git a/mods/ITEMS/mcl_flowers/init.lua b/mods/ITEMS/mcl_flowers/init.lua index ef22da3a3..ce8391c29 100644 --- a/mods/ITEMS/mcl_flowers/init.lua +++ b/mods/ITEMS/mcl_flowers/init.lua @@ -534,7 +534,7 @@ minetest.register_node("mcl_flowers:sunflower", { paramtype = "light", selection_box = { type = "fixed", - fixed = {-0.25, -0.5, -0.25, 0.25, 1.5, 0.25} + fixed = {-1/4, -1/2, -1/4, 1/4, 8/7, 1/4} }, sounds = mcl_sounds.node_sound_leaves_defaults(), sunlight_propagates = true, diff --git a/mods/ITEMS/mcl_flowers/models/mcl_flowers_sunflower.obj b/mods/ITEMS/mcl_flowers/models/mcl_flowers_sunflower.obj index 115670e11..43fc4301d 100644 --- a/mods/ITEMS/mcl_flowers/models/mcl_flowers_sunflower.obj +++ b/mods/ITEMS/mcl_flowers/models/mcl_flowers_sunflower.obj @@ -2,8 +2,8 @@ # www.blender.org mtllib mcl_flowers_sunflower.mtl o Stem_1 -v -0.309359 1.000000 -0.309359 -v 0.309359 1.000000 0.309359 +v -0.309359 0.750000 -0.309359 +v 0.309359 0.750000 0.309359 v -0.309359 -0.500000 -0.309359 v 0.309359 -0.500000 0.309359 vn 0.7071 -0.0000 -0.7071 @@ -16,8 +16,8 @@ g Stem_1_Stem usemtl Stem f 1/1/1 2/2/1 4/3/1 3/4/1 o Stem_2 -v 0.309359 1.000000 -0.309359 -v -0.309359 1.000000 0.309359 +v 0.309359 0.750000 -0.309359 +v -0.309359 0.750000 0.309359 v 0.309359 -0.500000 -0.309359 v -0.309359 -0.500000 0.309359 vn 0.7071 -0.0000 0.7071 @@ -30,10 +30,10 @@ g Stem_2_Stem usemtl Stem f 5/5/2 6/6/2 8/7/2 7/8/2 o Flower_1 -v -0.145000 1.483012 0.500000 -v 0.355000 0.616987 0.500000 -v -0.145000 1.483012 -0.500000 -v 0.355000 0.616987 -0.500000 +v -0.175000 1.233013 0.500000 +v 0.325000 0.366987 0.500000 +v -0.175000 1.233013 -0.500000 +v 0.325000 0.366987 -0.500000 vn 0.8660 0.5000 -0.0000 vt 0.000000 0.000000 vt 1.000000 0.000000 @@ -44,10 +44,10 @@ g Flower_1_Flower_1 usemtl Flower_1 f 9/9/3 10/10/3 12/11/3 11/12/3 o Flower_2 -v -0.150000 1.482013 0.500000 -v 0.350000 0.615987 0.500000 -v -0.150000 1.482013 -0.500000 -v 0.350000 0.615987 -0.500000 +v -0.180000 1.232013 0.500000 +v 0.320000 0.365988 0.500000 +v -0.180000 1.232013 -0.500000 +v 0.320000 0.365988 -0.500000 vn 0.8660 0.5000 -0.0000 vt 0.000000 0.000000 vt 1.000000 0.000000 From 4d5d5953107cca7339fac49377b6b125efc32499 Mon Sep 17 00:00:00 2001 From: JoseDouglas26 Date: Fri, 15 Dec 2023 08:54:44 -0300 Subject: [PATCH 467/982] changes requested in sunflower definitions --- mods/ITEMS/mcl_flowers/init.lua | 23 ++++++++-- mods/MAPGEN/mcl_biomes/init.lua | 76 +++++++++++---------------------- 2 files changed, 43 insertions(+), 56 deletions(-) diff --git a/mods/ITEMS/mcl_flowers/init.lua b/mods/ITEMS/mcl_flowers/init.lua index ce8391c29..5277cd35c 100644 --- a/mods/ITEMS/mcl_flowers/init.lua +++ b/mods/ITEMS/mcl_flowers/init.lua @@ -192,7 +192,7 @@ if has_mcl_flowerpots then }) end -local function add_large_plant(name, desc, longdesc, bottom_img, top_img, inv_img, selbox_radius, selbox_top_height, drop, shears_drop, is_flower, grass_color, fortune_drop) +local function add_large_plant(name, desc, longdesc, bottom_img, top_img, inv_img, selbox_radius, selbox_top_height, drop, shears_drop, is_flower, grass_color, fortune_drop, mesh) if not inv_img then inv_img = top_img end @@ -236,13 +236,26 @@ local function add_large_plant(name, desc, longdesc, bottom_img, top_img, inv_im drop_top = drop drop_bottom = drop end + -- Sunflower mesh and tiles + local top_drawtype, bottom_drawtype + local bottom_tiles = {} + if not mesh then + top_drawtype = "plantlike" + bottom_drawtype = "plantlike" + table.insert(bottom_tiles, bottom_img) + else + top_drawtype = "airlike" + bottom_drawtype = "mesh" + bottom_tiles = bottom_img + end + -- Bottom minetest.register_node("mcl_flowers:"..name, { description = desc, _doc_items_create_entry = create_entry, _doc_items_longdesc = longdesc, _doc_items_usagehelp = plant_usage_help, - drawtype = "plantlike", - tiles = { bottom_img }, + drawtype = bottom_drawtype, + tiles = bottom_tiles, inventory_image = inv_img, wield_image = inv_img, sunlight_propagates = true, @@ -334,6 +347,7 @@ local function add_large_plant(name, desc, longdesc, bottom_img, top_img, inv_im end, groups = bottom_groups, sounds = mcl_sounds.node_sound_leaves_defaults(), + mesh = mesh }) local top_groups = table.copy(bottom_groups) @@ -345,7 +359,7 @@ local function add_large_plant(name, desc, longdesc, bottom_img, top_img, inv_im minetest.register_node("mcl_flowers:"..name.."_top", { description = desc.." " .. S("(Top Part)"), _doc_items_create_entry = false, - drawtype = "plantlike", + drawtype = top_drawtype, tiles = { top_img }, sunlight_propagates = true, paramtype = "light", @@ -382,6 +396,7 @@ end add_large_plant("peony", S("Peony"), S("A peony is a large plant which occupies two blocks. It is mainly used in dye production."), "mcl_flowers_double_plant_paeonia_bottom.png", "mcl_flowers_double_plant_paeonia_top.png", nil, 5/16, 6/16) add_large_plant("rose_bush", S("Rose Bush"), S("A rose bush is a large plant which occupies two blocks. It is safe to touch it. Rose bushes are mainly used in dye production."), "mcl_flowers_double_plant_rose_bottom.png", "mcl_flowers_double_plant_rose_top.png", nil, 5/16, 1/16) add_large_plant("lilac", S("Lilac"), S("A lilac is a large plant which occupies two blocks. It is mainly used in dye production."), "mcl_flowers_double_plant_syringa_bottom.png", "mcl_flowers_double_plant_syringa_top.png", nil, 5/16, 6/16) +add_large_plant("sunflower", S("Sunflower"), S("A sunflower is a large plant which occupies two blocks. It is mainly used in dye production."), {"mcl_flowers_double_plant_sunflower_bottom.png", "mcl_flowers_double_plant_sunflower_bottom.png", "mcl_flowers_double_plant_sunflower_front.png", "mcl_flowers_double_plant_sunflower_back.png"}, nil, "mcl_flowers_double_plant_sunflower_front.png", 6/16, 6/16, "mcl_flowers:sunflower", nil, true, nil, nil, "mcl_flowers_sunflower.obj") local longdesc_grass = S("Double tallgrass a variant of tall grass and occupies two blocks. It can be harvested for wheat seeds.") local longdesc_fern = S("Large fern is a variant of fern and occupies two blocks. It can be harvested for wheat seeds.") diff --git a/mods/MAPGEN/mcl_biomes/init.lua b/mods/MAPGEN/mcl_biomes/init.lua index 956a5dac8..d42720d26 100644 --- a/mods/MAPGEN/mcl_biomes/init.lua +++ b/mods/MAPGEN/mcl_biomes/init.lua @@ -4804,60 +4804,32 @@ local function register_decorations() b = {"FlowerForest"} end - if name ~= "sunflower" then - minetest.register_decoration({ - deco_type = "schematic", - schematic = { - size = {x = 1, y = 3, z = 1}, - data = { - {name = "air", prob = 0}, - {name = "mcl_flowers:" .. name, param1 = 255, }, - {name = "mcl_flowers:" .. name .. "_top", param1 = 255, }, - }, + minetest.register_decoration({ + deco_type = "schematic", + schematic = { + size = {x = 1, y = 3, z = 1}, + data = { + {name = "air", prob = 0}, + {name = "mcl_flowers:" .. name, param1 = 255, }, + {name = "mcl_flowers:" .. name .. "_top", param1 = 255, }, }, - place_on = {"group:grass_block_no_snow", "mcl_core:dirt"}, + }, + place_on = {"group:grass_block_no_snow", "mcl_core:dirt"}, - sidelen = 16, - noise_params = { - offset = o, - scale = 0.01, - spread = {x = 300, y = 300, z = 300}, - seed = seed, - octaves = 5, - persist = 0.62, - }, - y_min = 1, - y_max = mcl_vars.mg_overworld_max, - flags = "", - biomes = b, - }) - else - minetest.register_decoration({ - deco_type = "schematic", - schematic = { - size = {x = 1, y = 2, z = 1}, - data = { - {name = "air", prob = 0}, - {name = "mcl_flowers:" .. name, param1 = 255, }, - }, - }, - place_on = {"group:grass_block_no_snow", "mcl_core:dirt"}, - - sidelen = 16, - noise_params = { - offset = o, - scale = 0.01, - spread = {x = 300, y = 300, z = 300}, - seed = seed, - octaves = 5, - persist = 0.62, - }, - y_min = 1, - y_max = mcl_vars.mg_overworld_max, - flags = "", - biomes = b, - }) - end + sidelen = 16, + noise_params = { + offset = o, + scale = 0.01, + spread = {x = 300, y = 300, z = 300}, + seed = seed, + octaves = 5, + persist = 0.62, + }, + y_min = 1, + y_max = mcl_vars.mg_overworld_max, + flags = "", + biomes = b, + }) end end From f63e5d3c1978c766dd09fb9dcfed656e06061210 Mon Sep 17 00:00:00 2001 From: JoseDouglas26 Date: Fri, 22 Dec 2023 14:35:47 -0300 Subject: [PATCH 468/982] fix facing west --- .../models/mcl_flowers_sunflower.obj | 40 +++++++++---------- 1 file changed, 20 insertions(+), 20 deletions(-) diff --git a/mods/ITEMS/mcl_flowers/models/mcl_flowers_sunflower.obj b/mods/ITEMS/mcl_flowers/models/mcl_flowers_sunflower.obj index 43fc4301d..9866fa4f2 100644 --- a/mods/ITEMS/mcl_flowers/models/mcl_flowers_sunflower.obj +++ b/mods/ITEMS/mcl_flowers/models/mcl_flowers_sunflower.obj @@ -2,11 +2,11 @@ # www.blender.org mtllib mcl_flowers_sunflower.mtl o Stem_1 -v -0.309359 0.750000 -0.309359 -v 0.309359 0.750000 0.309359 -v -0.309359 -0.500000 -0.309359 -v 0.309359 -0.500000 0.309359 -vn 0.7071 -0.0000 -0.7071 +v 0.381859 0.750000 0.309359 +v -0.236859 0.750000 -0.309359 +v 0.381859 -0.500000 0.309359 +v -0.236859 -0.500000 -0.309359 +vn -0.7071 -0.0000 0.7071 vt 1.000000 1.000000 vt 0.000000 1.000000 vt 0.000000 0.000000 @@ -16,11 +16,11 @@ g Stem_1_Stem usemtl Stem f 1/1/1 2/2/1 4/3/1 3/4/1 o Stem_2 -v 0.309359 0.750000 -0.309359 -v -0.309359 0.750000 0.309359 -v 0.309359 -0.500000 -0.309359 -v -0.309359 -0.500000 0.309359 -vn 0.7071 -0.0000 0.7071 +v -0.236859 0.750000 0.309359 +v 0.381859 0.750000 -0.309359 +v -0.236859 -0.500000 0.309359 +v 0.381859 -0.500000 -0.309359 +vn -0.7071 -0.0000 -0.7071 vt 1.000000 1.000000 vt 0.000000 1.000000 vt 0.000000 0.000000 @@ -30,11 +30,11 @@ g Stem_2_Stem usemtl Stem f 5/5/2 6/6/2 8/7/2 7/8/2 o Flower_1 -v -0.175000 1.233013 0.500000 -v 0.325000 0.366987 0.500000 -v -0.175000 1.233013 -0.500000 -v 0.325000 0.366987 -0.500000 -vn 0.8660 0.5000 -0.0000 +v 0.247500 1.233013 -0.500000 +v -0.252500 0.366987 -0.500000 +v 0.247500 1.233013 0.500000 +v -0.252500 0.366987 0.500000 +vn -0.8660 0.5000 -0.0000 vt 0.000000 0.000000 vt 1.000000 0.000000 vt 1.000000 1.000000 @@ -44,11 +44,11 @@ g Flower_1_Flower_1 usemtl Flower_1 f 9/9/3 10/10/3 12/11/3 11/12/3 o Flower_2 -v -0.180000 1.232013 0.500000 -v 0.320000 0.365988 0.500000 -v -0.180000 1.232013 -0.500000 -v 0.320000 0.365988 -0.500000 -vn 0.8660 0.5000 -0.0000 +v 0.252500 1.232013 -0.500000 +v -0.247500 0.365988 -0.500000 +v 0.252500 1.232013 0.500000 +v -0.247500 0.365988 0.500000 +vn -0.8660 0.5000 -0.0000 vt 0.000000 0.000000 vt 1.000000 0.000000 vt 1.000000 1.000000 From 92ee9c0557a88ce07c044de278c21c1414da51b0 Mon Sep 17 00:00:00 2001 From: the-real-herowl Date: Mon, 18 Dec 2023 02:14:01 +0100 Subject: [PATCH 469/982] Remove the wrong separate sunflower definition --- mods/ITEMS/mcl_flowers/init.lua | 29 ----------------------------- 1 file changed, 29 deletions(-) diff --git a/mods/ITEMS/mcl_flowers/init.lua b/mods/ITEMS/mcl_flowers/init.lua index 5277cd35c..75e133322 100644 --- a/mods/ITEMS/mcl_flowers/init.lua +++ b/mods/ITEMS/mcl_flowers/init.lua @@ -534,33 +534,4 @@ if mod_mcimport and mg_name == "singlenode" and fix_doubleplants == true then }) end -minetest.register_node("mcl_flowers:sunflower", { - description = S("Sunflower"), - _doc_items_longdesc = S("A sunflower is a large plant which occupies two blocks. It is mainly used in dye production."), - drawtype = "mesh", - groups = { - attached_node = 1, deco_block = 1, - dig_by_water = 1, destroy_by_lava_flow = 1, dig_by_piston = 1, dig_immediate = 3, - flammable = 2, flower = 1, fire_encouragement = 60, fire_flammability = 100, - plant = 1, double_plant = 1, non_mycelium_plant = 1, compostability = 65, grass_palette = nil - }, - inventory_image = "mcl_flowers_double_plant_sunflower_front.png", - mesh = "mcl_flowers_sunflower.obj", - paramtype = "light", - selection_box = { - type = "fixed", - fixed = {-1/4, -1/2, -1/4, 1/4, 8/7, 1/4} - }, - sounds = mcl_sounds.node_sound_leaves_defaults(), - sunlight_propagates = true, - tiles = { - "mcl_flowers_double_plant_sunflower_bottom.png", - "mcl_flowers_double_plant_sunflower_bottom.png", - "mcl_flowers_double_plant_sunflower_front.png", - "mcl_flowers_double_plant_sunflower_back.png" - }, - walkable = false, - wield_image = "mcl_flowers_double_plant_sunflower_front.png" -}) - dofile(modpath.."/register.lua") From 569dd691885d529efaebbfc9c2e3f1400a37578a Mon Sep 17 00:00:00 2001 From: the-real-herowl Date: Fri, 22 Dec 2023 23:36:49 +0100 Subject: [PATCH 470/982] Increase sunflower height --- .../models/mcl_flowers_sunflower.obj | 24 +++++++++---------- 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/mods/ITEMS/mcl_flowers/models/mcl_flowers_sunflower.obj b/mods/ITEMS/mcl_flowers/models/mcl_flowers_sunflower.obj index 9866fa4f2..fb9dfc7cf 100644 --- a/mods/ITEMS/mcl_flowers/models/mcl_flowers_sunflower.obj +++ b/mods/ITEMS/mcl_flowers/models/mcl_flowers_sunflower.obj @@ -2,8 +2,8 @@ # www.blender.org mtllib mcl_flowers_sunflower.mtl o Stem_1 -v 0.381859 0.750000 0.309359 -v -0.236859 0.750000 -0.309359 +v 0.381859 1.050000 0.309359 +v -0.236859 1.050000 -0.309359 v 0.381859 -0.500000 0.309359 v -0.236859 -0.500000 -0.309359 vn -0.7071 -0.0000 0.7071 @@ -16,8 +16,8 @@ g Stem_1_Stem usemtl Stem f 1/1/1 2/2/1 4/3/1 3/4/1 o Stem_2 -v -0.236859 0.750000 0.309359 -v 0.381859 0.750000 -0.309359 +v -0.236859 1.050000 0.309359 +v 0.381859 1.050000 -0.309359 v -0.236859 -0.500000 0.309359 v 0.381859 -0.500000 -0.309359 vn -0.7071 -0.0000 -0.7071 @@ -30,10 +30,10 @@ g Stem_2_Stem usemtl Stem f 5/5/2 6/6/2 8/7/2 7/8/2 o Flower_1 -v 0.247500 1.233013 -0.500000 -v -0.252500 0.366987 -0.500000 -v 0.247500 1.233013 0.500000 -v -0.252500 0.366987 0.500000 +v 0.247500 1.433013 -0.500000 +v -0.252500 0.766987 -0.500000 +v 0.247500 1.433013 0.500000 +v -0.252500 0.766987 0.500000 vn -0.8660 0.5000 -0.0000 vt 0.000000 0.000000 vt 1.000000 0.000000 @@ -44,10 +44,10 @@ g Flower_1_Flower_1 usemtl Flower_1 f 9/9/3 10/10/3 12/11/3 11/12/3 o Flower_2 -v 0.252500 1.232013 -0.500000 -v -0.247500 0.365988 -0.500000 -v 0.252500 1.232013 0.500000 -v -0.247500 0.365988 0.500000 +v 0.252500 1.432013 -0.500000 +v -0.247500 0.765988 -0.500000 +v 0.252500 1.432013 0.500000 +v -0.247500 0.765988 0.500000 vn -0.8660 0.5000 -0.0000 vt 0.000000 0.000000 vt 1.000000 0.000000 From beb06315ac6506b45bbd154f5b74143a2aea7f77 Mon Sep 17 00:00:00 2001 From: JoseDouglas26 Date: Thu, 30 Nov 2023 07:51:36 -0300 Subject: [PATCH 471/982] mcl_explosions pt_BR translation --- mods/CORE/mcl_explosions/locale/mcl_explosions.pt_BR.tr | 2 ++ 1 file changed, 2 insertions(+) create mode 100644 mods/CORE/mcl_explosions/locale/mcl_explosions.pt_BR.tr diff --git a/mods/CORE/mcl_explosions/locale/mcl_explosions.pt_BR.tr b/mods/CORE/mcl_explosions/locale/mcl_explosions.pt_BR.tr new file mode 100644 index 000000000..d67ea4637 --- /dev/null +++ b/mods/CORE/mcl_explosions/locale/mcl_explosions.pt_BR.tr @@ -0,0 +1,2 @@ +# textdomain:mcl_explosions +@1 was caught in an explosion.=@1 foi pego(a) em uma explosão. From ad3ec48ec9fbb50a5073f9cfb20165feb457c9e6 Mon Sep 17 00:00:00 2001 From: JoseDouglas26 Date: Thu, 30 Nov 2023 08:18:10 -0300 Subject: [PATCH 472/982] mcl_boats pt_BR translation --- .../mcl_boats/locale/mcl_boats.pt_BR.tr | 23 +++++++++++++++++++ 1 file changed, 23 insertions(+) create mode 100644 mods/ENTITIES/mcl_boats/locale/mcl_boats.pt_BR.tr diff --git a/mods/ENTITIES/mcl_boats/locale/mcl_boats.pt_BR.tr b/mods/ENTITIES/mcl_boats/locale/mcl_boats.pt_BR.tr new file mode 100644 index 000000000..65a5c3a54 --- /dev/null +++ b/mods/ENTITIES/mcl_boats/locale/mcl_boats.pt_BR.tr @@ -0,0 +1,23 @@ +# textdomain: mcl_boats +Acacia Boat=Barco de Acácia +Birch Boat=Barco de Bétula +Boat=Barco +Boats are used to travel on the surface of water.=Barcos são usados para viajar na superfície da água +Dark Oak Boat=Barco de Carvalho Escuro +Jungle Boat=Barco de Selva +Oak Boat=Barco de Carvalho +Rightclick on a water source to place the boat. Rightclick the boat to enter it. Use [Left] and [Right] to steer, [Forwards] to speed up and [Backwards] to slow down or move backwards. Use [Sneak] to leave the boat, punch the boat to make it drop as an item.=Clique com o botão direito em uma fonte de água para posicionar o barco. Clique com o botão direito no barco para entrar nele. Use [Esquerda] e [Direita] para fazer curva, [Frente] para acelerar e [Trás] para frear e ir para trás. Use [Agachar] para deixar o barco, soque-o para fazê-lo dropar como um item. +Spruce Boat=Barco de Pinheiro +Water vehicle=Veículo aquático +Sneak to dismount=Agache para desmontar +Obsidian Boat=Barco de Obsidiana +Mangrove Boat=Barco de Mangue +Cherry Boat=Barco de Cerejeira +Oak Chest Boat=Barco de Carvalho com Baú +Spruce Chest Boat=Barco de Pinheiro com Baú +Birch Chest Boat=Barco de Bétula com Baú +Jungle Chest Boat=Barco de Selva com Baú +Acacia Chest Boat=Barco de Acácia com Baú +Dark Oak Chest Boat=Barco de Carvalho Escuro com Baú +Mangrove Chest Boat=Barco de Mangue com Baú +Cherry Chest Boat=Barco de Cerejeira com Baú From 2370d155c9e5f5f9cab37676201bf80a799febac Mon Sep 17 00:00:00 2001 From: JoseDouglas26 Date: Thu, 30 Nov 2023 08:23:34 -0300 Subject: [PATCH 473/982] mcl_falling_nodes pt_BR translation --- .../mcl_falling_nodes/locale/mcl_falling_nodes.pt_BR.tr | 3 +++ 1 file changed, 3 insertions(+) create mode 100644 mods/ENTITIES/mcl_falling_nodes/locale/mcl_falling_nodes.pt_BR.tr diff --git a/mods/ENTITIES/mcl_falling_nodes/locale/mcl_falling_nodes.pt_BR.tr b/mods/ENTITIES/mcl_falling_nodes/locale/mcl_falling_nodes.pt_BR.tr new file mode 100644 index 000000000..aaa378ba3 --- /dev/null +++ b/mods/ENTITIES/mcl_falling_nodes/locale/mcl_falling_nodes.pt_BR.tr @@ -0,0 +1,3 @@ +# textdomain: mcl_falling_nodes +@1 was smashed by a falling anvil.=@1 foi esmagado(a) por uma bigorna em queda. +@1 was smashed by a falling block.=@1 foi esmagado(a) por um bloco em queda. From 51dc10c9ea75f1f9bb5afec9f36c4bfa9f6d3f76 Mon Sep 17 00:00:00 2001 From: JoseDouglas26 Date: Thu, 30 Nov 2023 08:25:32 -0300 Subject: [PATCH 474/982] mcl_paintings pt_BR translation --- mods/ENTITIES/mcl_paintings/locale/mcl_paintings.pt_BR.tr | 2 ++ 1 file changed, 2 insertions(+) create mode 100644 mods/ENTITIES/mcl_paintings/locale/mcl_paintings.pt_BR.tr diff --git a/mods/ENTITIES/mcl_paintings/locale/mcl_paintings.pt_BR.tr b/mods/ENTITIES/mcl_paintings/locale/mcl_paintings.pt_BR.tr new file mode 100644 index 000000000..3c0a840cf --- /dev/null +++ b/mods/ENTITIES/mcl_paintings/locale/mcl_paintings.pt_BR.tr @@ -0,0 +1,2 @@ +# textdomain:mcl_paintings +Painting=Pintura From df027704705e88aa986304deb3ad7e680850d1ce Mon Sep 17 00:00:00 2001 From: JoseDouglas26 Date: Thu, 30 Nov 2023 09:14:20 -0300 Subject: [PATCH 475/982] mcl_minecarts pt_BR translation --- .../locale/mcl_minecarts.pt_BR.tr | 36 +++++++++++++++++++ 1 file changed, 36 insertions(+) create mode 100644 mods/ENTITIES/mcl_minecarts/locale/mcl_minecarts.pt_BR.tr diff --git a/mods/ENTITIES/mcl_minecarts/locale/mcl_minecarts.pt_BR.tr b/mods/ENTITIES/mcl_minecarts/locale/mcl_minecarts.pt_BR.tr new file mode 100644 index 000000000..dda35e93f --- /dev/null +++ b/mods/ENTITIES/mcl_minecarts/locale/mcl_minecarts.pt_BR.tr @@ -0,0 +1,36 @@ +# textdomain: mcl_minecarts +Minecart=Carrinho +Minecarts can be used for a quick transportion on rails.=Carrinhos podem ser usados para transporte rápido em trilhos. +Minecarts only ride on rails and always follow the tracks. At a T-junction with no straight way ahead, they turn left. The speed is affected by the rail type.=Carrinhos viajam somente em trilhos e sempre seguem os traçados. Em uma junção em T sem linha reta à frente, eles viram à esquerda. A velocidade é afetada pelo tipo do trilho. +You can place the minecart on rails. Right-click it to enter it. Punch it to get it moving.=Você pode posicionar o carrinho em trilhos. Clique com o botão direito para entrar nele. Soque-o para fazê-lo mover. +To obtain the minecart, punch it while holding down the sneak key.=Para obter o carrinho, soque-o enquanto segura pressionada a tecla de agachar. +A minecart with TNT is an explosive vehicle that travels on rail.=Um carrinho com TNT é um veículo explosivo que viaja nos trilhos. +Place it on rails. Punch it to move it. The TNT is ignited with a flint and steel or when the minecart is on an powered activator rail.=Posicione-o nos trilhos. Soque-o para movê-lo. A TNT é acesa com um isqueiro ou quando o carrinho está sobre um trilho ativador energizado. +To obtain the minecart and TNT, punch them while holding down the sneak key. You can't do this if the TNT was ignited.=Para obter o carrinho e a TNT, soque-os enquanto segura pressionada a tecla de agachar. Você não consegue fazer isso se a TNT foi acesa. +A minecart with furnace is a vehicle that travels on rails. It can propel itself with fuel.=Um carrinho com fornalha é um veículo que viaja nos trilhos. Se move por conta própria com combustível. +Place it on rails. If you give it some coal, the furnace will start burning for a long time and the minecart will be able to move itself. Punch it to get it moving.=Posicione-o nos trilhos. Se você o der um pouco de carvão, a fornalha vai começar a queimar por um longo tempo e o carrinho será capaz de se mover por conta própria. Soque-o para fazê-lo mover. +To obtain the minecart and furnace, punch them while holding down the sneak key.=Para obter o carrinho e a fornalha, soque-os enquanto segura pressionada a tecla de agachar. +Minecart with Chest=Carrinho com Baú +Minecart with Furnace=Carrinho com Fornalha +Minecart with Command Block=Carrinho com Bloco de Comandos +Minecart with Hopper=Carrinho com Funil +Minecart with TNT=Carrinho com TNT +Place them on the ground to build your railway, the rails will automatically connect to each other and will turn into curves, T-junctions, crossings and slopes as needed.=Posicione-os no chão para construir suas linhas férreas, os trilhos vão conectar-se automaticamente uns nos outros e vão se transformar em curvas, junções em T, cruzamentos e rampas quando necessário. +Rail=Trilho +Rails can be used to build transport tracks for minecarts. Normal rails slightly slow down minecarts due to friction.=Trilhos podem ser usados para construir traçados de transporte para carrinhos. Trilhos normais freiam carrinhos gradativamente devido ao atrito. +Powered Rail=Trilho Energizador +Rails can be used to build transport tracks for minecarts. Powered rails are able to accelerate and brake minecarts.=Trilhos podem ser usados para construir traçados de transporte para carrinhos. Trilhos energizados são capazes de acelerar e frear carrinhos. +Without redstone power, the rail will brake minecarts. To make this rail accelerate minecarts, power it with redstone power.=Sem carga de redstone, o trilho vai frear os carrinhos. Para fazer o trilho acelerar os carrinhos, energize-o com uma carga de redstone. +Activator Rail=Trilho Ativador +Rails can be used to build transport tracks for minecarts. Activator rails are used to activate special minecarts.=Trilhos podem ser usados para construir traçados de transporte para carrinhos. Trilhos ativadores são usados para ativar carrinhos especiais. +To make this rail activate minecarts, power it with redstone power and send a minecart over this piece of rail.=Para fazer esse trilho ativar os carrinhos, energize-o com uma carga de redstone e envie um carrinho sobre esse pedaço de trilho. +Detector Rail=Trilho Detector +Rails can be used to build transport tracks for minecarts. A detector rail is able to detect a minecart above it and powers redstone mechanisms.=Trilhos podem ser usados para construir traçados de transporte para carrinhos. Um trilho detector é capaz de detectar um carrinho sobre ele e energizar mecanismos de redstone. +To detect a minecart and provide redstone power, connect it to redstone trails or redstone mechanisms and send any minecart over the rail.=Para detectar um carrinho e providenciar carga de redstone, conecte-o em trilhas de redstone ou mecanismos de redstone e envie qualquer carrinho sobre esse trilho. +Track for minecarts=Traçado para carrinhos +Speed up when powered, slow down when not powered=Acelera quando energizado, desacelera quando não energizado +Activates minecarts when powered=Ativa carrinhos quando energizado +Emits redstone power when a minecart is detected=Emite carga de redstone quando um carrinho é detectado +Vehicle for fast travel on rails=Veículo para viajar rápido em trilhos +Can be ignited by tools or powered activator rail=Pode ser aceso por ferramentas ou trilho ativador energizado +Sneak to dismount=Agache para desmontar From 5c06c28b0f858f958f29853bce8e728761b52f7e Mon Sep 17 00:00:00 2001 From: JoseDouglas26 Date: Thu, 30 Nov 2023 09:25:59 -0300 Subject: [PATCH 476/982] mobs_mc pt_BR translation --- mods/ENTITIES/mobs_mc/locale/mobs_mc.pt_BR.tr | 83 +++++++++++++++++++ 1 file changed, 83 insertions(+) create mode 100644 mods/ENTITIES/mobs_mc/locale/mobs_mc.pt_BR.tr diff --git a/mods/ENTITIES/mobs_mc/locale/mobs_mc.pt_BR.tr b/mods/ENTITIES/mobs_mc/locale/mobs_mc.pt_BR.tr new file mode 100644 index 000000000..a20d703a8 --- /dev/null +++ b/mods/ENTITIES/mobs_mc/locale/mobs_mc.pt_BR.tr @@ -0,0 +1,83 @@ +# textdomain: mobs_mc +Agent=Agente +Axolotl=Axolote +Bat=Morcego +Blaze=Blaze +Chicken=Galinha +Cow=Vaca +Mooshroom=Coguvaca +Creeper=Creeper +Ender Dragon=Dragão do Fim +Enderman=Enderman +Endermite=Endermite +Ghast=Ghast +Elder Guardian=Guardião Ancião +Guardian=Guardião +Horse=Cavalo +Skeleton Horse=Cavalo Esqueleto +Zombie Horse=Cavalo Zumbi +Donkey=Burro +Mule=Mula +Iron Golem=Golem de Ferro +Llama=Lhama +Ocelot=Jaguatirica +Cat=Gato +Parrot=Papagaio +Pig=Porco +Polar Bear=Urso Polar +Rabbit=Coelho +Killer Bunny=Coelho Assassino +Sheep=Ovelha +Shulker=Shulker +Silverfish=Traça +Skeleton=Esqueleto +Stray=Esqueleto Errante +Wither Skeleton=Esqueleto Wither +Magma Cube=Cubo de Magma +Slime=Slime +Snow Golem=Golem de Neve +Spider=Aranha +Cave Spider=Aranha de Caverna +Squid=Lula +Vex=Vex +Evoker=Invocador +Illusioner=Ilusionista +Villager=Aldeão +Vindicator=Vingador +Zombie Villager=Aldeão Zumbi +Witch=Bruxa +Wither=Wither +Wolf=Lobo +Husk=Zumbi-Múmia +Baby Husk=Zumbi-Múmia Bebê +Zombie=Zumbi +Baby Zombie=Zumbi Bebê +Piglin=Piglin +Baby Piglin=Piglin Bebê +Zombie Piglin=Piglin Zumbi +Baby Zombie Piglin=Piglin Zumbi Bebê +Sword Piglin=Piglin Espadachim +Piglin Brute=Piglin Barbáro +Farmer=Fazendeiro +Fisherman=Pescador +Fletcher=Flecheiro +Shepherd=Pastor +Librarian=Bibliotecário +Cartographer=Cartógrafo +Armorer=Armoreiro +Leatherworker=Coureiro +Butcher=Açougueiro +Weapon Smith=Armeiro +Tool Smith=Ferramenteiro +Cleric=Clérigo +Nitwit=Palerma +Cod=Bacalhau +Salmon=Salmão +Dolphin=Golfinho +Pillager=Saqueador +Tropical fish=Peixe Tropical +Hoglin=Hoglin +Baby hoglin=Hoglin Bebê +Zoglin=Zoglin +Strider=Lavagante +Glow Squid=Lula Brilhante From 947d20ae9665e68601809c07c7197c637ad53a73 Mon Sep 17 00:00:00 2001 From: JoseDouglas26 Date: Thu, 30 Nov 2023 09:44:20 -0300 Subject: [PATCH 477/982] mcl_mobs pt_BR translation --- mods/ENTITIES/mcl_mobs/locale/mcl_mobs.pt_BR.tr | 13 +++++++++++++ 1 file changed, 13 insertions(+) create mode 100644 mods/ENTITIES/mcl_mobs/locale/mcl_mobs.pt_BR.tr diff --git a/mods/ENTITIES/mcl_mobs/locale/mcl_mobs.pt_BR.tr b/mods/ENTITIES/mcl_mobs/locale/mcl_mobs.pt_BR.tr new file mode 100644 index 000000000..20babe453 --- /dev/null +++ b/mods/ENTITIES/mcl_mobs/locale/mcl_mobs.pt_BR.tr @@ -0,0 +1,13 @@ +# textdomain: mcl_mobs +Peaceful mode active! No monsters will spawn.=Modo pacífico ativado! Nenhum monstro será gerado. +This allows you to place a single mob.=Isso permite você posicionar um único mob. +Just place it where you want the mob to appear. Animals will spawn tamed, unless you hold down the sneak key while placing. If you place this on a mob spawner, you change the mob it spawns.=Posicione-o onde você deseja que o mob apareça. Animais serão gerados domesticados, a menos que você segure pressionada a tecla de agachar enquanto posiciona. Se você posicionar em um gerador de mobs, você muda o mob que será gerado. +You need the “maphack” privilege to change the mob spawner.=Você precisa do privilégio "maphack" para mudar o gerador de mobs. +Name Tag=Etiqueta +A name tag is an item to name a mob.=Uma etiqueta é um item para nomear um mob. +Before you use the name tag, you need to set a name at an anvil. Then you can use the name tag to name a mob. This uses up the name tag.=Antes de você usar a etiqueta, você precisa determinar um nome em uma bigorna. Assim você pode usar a etiqueta para nomear um mob. Isso consumirá a etiqueta. +Only peaceful mobs allowed!=Apenas mobs pacíficos permitidos! +Give names to mobs=Dá nome aos mobs +Set name at anvil=Determine um nome em uma bigorna +Removes specified mobs except nametagged and tamed ones. For the second parameter, use nametagged/tamed to select only nametagged/tamed mobs, or a range to specify a maximum distance from the player.=Remove mobs especifícos exceto os mobs nomeados ou domesticados. Como segundo parâmetro, use nametagged/tamed para selecionar apenas mobs nomeados/domesticados, ou um alcançe para especificar uma distância máxima em relação ao jogador. +Default usage. Clearing hostile mobs. For more options please type: /help clearmobs=Uso padrão. Eliminando mobs hostis. Para mais opções por favor digite: /help clearmobs From f379a069989df00a3cc23e8bdd9c76c4ee893a58 Mon Sep 17 00:00:00 2001 From: JoseDouglas26 Date: Thu, 30 Nov 2023 09:47:20 -0300 Subject: [PATCH 478/982] mcl_raids pt_BR translation --- mods/ENVIRONMENT/mcl_raids/locale/mcl_raids.pt_BR.tr | 2 ++ 1 file changed, 2 insertions(+) create mode 100644 mods/ENVIRONMENT/mcl_raids/locale/mcl_raids.pt_BR.tr diff --git a/mods/ENVIRONMENT/mcl_raids/locale/mcl_raids.pt_BR.tr b/mods/ENVIRONMENT/mcl_raids/locale/mcl_raids.pt_BR.tr new file mode 100644 index 000000000..cd59abb96 --- /dev/null +++ b/mods/ENVIRONMENT/mcl_raids/locale/mcl_raids.pt_BR.tr @@ -0,0 +1,2 @@ +# textdomain: mcl_raids +Ominous Banner=Estandarte Ameaçador From 72a144f0b2f4a73b1fd33078eff0a5caa79f0b13 Mon Sep 17 00:00:00 2001 From: JoseDouglas26 Date: Thu, 30 Nov 2023 09:49:41 -0300 Subject: [PATCH 479/982] mcl_void_damage pt_BR translation --- .../mcl_void_damage/locale/mcl_void_damage.pt_BR.tr | 3 +++ 1 file changed, 3 insertions(+) create mode 100644 mods/ENVIRONMENT/mcl_void_damage/locale/mcl_void_damage.pt_BR.tr diff --git a/mods/ENVIRONMENT/mcl_void_damage/locale/mcl_void_damage.pt_BR.tr b/mods/ENVIRONMENT/mcl_void_damage/locale/mcl_void_damage.pt_BR.tr new file mode 100644 index 000000000..c4e2152ba --- /dev/null +++ b/mods/ENVIRONMENT/mcl_void_damage/locale/mcl_void_damage.pt_BR.tr @@ -0,0 +1,3 @@ +# textdomain: mcl_void_damage +The void is off-limits to you!=O vazio está fora dos limites para você! +@1 fell into the endless void.=@1 caiu em um vazio sem fim. From 419456b83505c13a39456d2e745f254bfe4dc704 Mon Sep 17 00:00:00 2001 From: JoseDouglas26 Date: Thu, 30 Nov 2023 09:54:41 -0300 Subject: [PATCH 480/982] mcl_weather pt_BR translation --- mods/ENVIRONMENT/mcl_weather/locale/mcl_weather.pt_BR.tr | 8 ++++++++ 1 file changed, 8 insertions(+) create mode 100644 mods/ENVIRONMENT/mcl_weather/locale/mcl_weather.pt_BR.tr diff --git a/mods/ENVIRONMENT/mcl_weather/locale/mcl_weather.pt_BR.tr b/mods/ENVIRONMENT/mcl_weather/locale/mcl_weather.pt_BR.tr new file mode 100644 index 000000000..3d91979ae --- /dev/null +++ b/mods/ENVIRONMENT/mcl_weather/locale/mcl_weather.pt_BR.tr @@ -0,0 +1,8 @@ +# textdomain: mcl_weather +Gives ability to control weather=Dá a habilidade de controlar o clima +Changes the weather to the specified parameter.=Muda o clima para o parâmetro especificado. +Error: No weather specified.=Erro: Nenhum clima especificado. +Error: Invalid parameters.=Erro: Parâmetros inválidos. +Error: Duration can't be less than 1 second.=Erro: Duração não pode ser menor que 1 segundo. +Error: Invalid weather specified. Use “clear”, “rain”, “snow” or “thunder”.=Erro: Clima especificado é inválido. Use "clear", "rain", "snow" ou "thunder". +Toggles between clear weather and weather with downfall (randomly rain, thunderstorm or snow)=Alterna entre clima limpo e clima com quedas (aleatoriamente chuva, tempestade ou neve) From a3ccd4d0328a8f73ca34601df75150932bf61b52 Mon Sep 17 00:00:00 2001 From: JoseDouglas26 Date: Thu, 30 Nov 2023 10:00:30 -0300 Subject: [PATCH 481/982] lightning pt_BR translation --- mods/ENVIRONMENT/lightning/locale/lightning.pt_BR.tr | 3 +++ 1 file changed, 3 insertions(+) create mode 100644 mods/ENVIRONMENT/lightning/locale/lightning.pt_BR.tr diff --git a/mods/ENVIRONMENT/lightning/locale/lightning.pt_BR.tr b/mods/ENVIRONMENT/lightning/locale/lightning.pt_BR.tr new file mode 100644 index 000000000..f896e3ac1 --- /dev/null +++ b/mods/ENVIRONMENT/lightning/locale/lightning.pt_BR.tr @@ -0,0 +1,3 @@ +# textdomain: lightning +Let lightning strike at the specified position or player. No parameter will strike yourself.=Deixa o relâmpago acertar a posição ou jogador especificado. Nenhum parâmetro irá acertar você mesmo. +No position specified and unknown player=Nenhuma posição especificada e jogador desconhecido From f824f109e2e3767ce0499c5d903eb49a948330ea Mon Sep 17 00:00:00 2001 From: JoseDouglas26 Date: Thu, 30 Nov 2023 11:11:07 -0300 Subject: [PATCH 482/982] mcl_structures pt_BR translation --- mods/MAPGEN/mcl_structures/locale/mcl_structures.pt_BR.tr | 7 +++++++ 1 file changed, 7 insertions(+) create mode 100644 mods/MAPGEN/mcl_structures/locale/mcl_structures.pt_BR.tr diff --git a/mods/MAPGEN/mcl_structures/locale/mcl_structures.pt_BR.tr b/mods/MAPGEN/mcl_structures/locale/mcl_structures.pt_BR.tr new file mode 100644 index 000000000..557cf4c21 --- /dev/null +++ b/mods/MAPGEN/mcl_structures/locale/mcl_structures.pt_BR.tr @@ -0,0 +1,7 @@ +# textdomain: mcl_structures +Generate a pre-defined structure near your position.=Gera uma estrutura pré-definida próximo a sua posição. +Structure placed.=Estrutura posicionada. +Village built. WARNING: Villages are experimental and might have bugs.=Aldeia construída. AVISO: Aldeias são experimentais e podem conter bugs. +Error: No structure type given. Please use “/spawnstruct ”.=Erro: Nenhum tipo de estrutura fornecido. Por favor use “/spawnstruct ”. +Error: Unknown structure type. Please use “/spawnstruct ”.=Erro: Tipo desconhecido de estrutura. Por favor use “/spawnstruct ”. +Use /help spawnstruct to see a list of avaiable types.= Use /help spawnstruct para ver uma lista dos tipos disponíveis. From aef093ef4ecef726409f940310b8f12abbecf6f0 Mon Sep 17 00:00:00 2001 From: JoseDouglas26 Date: Thu, 30 Nov 2023 11:14:33 -0300 Subject: [PATCH 483/982] doc_items pt_BR translation correction --- mods/HELP/doc/doc_items/locale/doc_items.pt_BR.tr | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/mods/HELP/doc/doc_items/locale/doc_items.pt_BR.tr b/mods/HELP/doc/doc_items/locale/doc_items.pt_BR.tr index abcf11547..504d4e264 100644 --- a/mods/HELP/doc/doc_items/locale/doc_items.pt_BR.tr +++ b/mods/HELP/doc/doc_items/locale/doc_items.pt_BR.tr @@ -10,12 +10,12 @@ # Itemname (ca. 25%) @1 (ca. @2%)= # List separator (e.g. “one, two, three”) -, =, +, =, # Final list separator (e.g. “One, two and three”) - and = e + and = e 1 second=1 segundo A transparent block, basically empty space. It is usually left behind after digging something.=Um bloco transparente, basicamente um vazio. Isso geralmente fica no lugar de um bloco removido. -Air=Ár +Air=Ar Blocks=Blocos Building another block at this block will place it inside and replace it.=Construir outro bloco nesse bloco vai subistitui-lo. Building this block is completely silent.=Construir esse bloco é completamente silencioso. From 76e941cbb6a9c18d4e917a98d72cdaf9e1cb5743 Mon Sep 17 00:00:00 2001 From: JoseDouglas26 Date: Thu, 30 Nov 2023 11:17:06 -0300 Subject: [PATCH 484/982] doc_items pt_BR translation missing translation --- mods/HELP/doc/doc_items/locale/doc_items.pt_BR.tr | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/mods/HELP/doc/doc_items/locale/doc_items.pt_BR.tr b/mods/HELP/doc/doc_items/locale/doc_items.pt_BR.tr index 504d4e264..eec43dba7 100644 --- a/mods/HELP/doc/doc_items/locale/doc_items.pt_BR.tr +++ b/mods/HELP/doc/doc_items/locale/doc_items.pt_BR.tr @@ -129,12 +129,12 @@ Unknown item (@1)=Item desconhecido (@1) • @1: @2, @3= • Flowing range: @1= • No flowing= -• Not renewable= -• Renewable= -• Viscosity: @1= +• Not renewable=• Não renovável +• Renewable=• Renovável +• Viscosity: @1=• Viscosidade: @1 Itemstring: "@1"= -Durability: @1 uses= -Durability: @1= +Durability: @1 uses=Durabilidade: @1 usos +Durability: @1=Durabilidade: @1 Mining durability:= • @1, level @2: @3 uses= • @1, level @2: Unlimited= From 6f9b70a98d2b36673435060d6d380b5ce5eab7cf Mon Sep 17 00:00:00 2001 From: JoseDouglas26 Date: Thu, 30 Nov 2023 14:54:36 -0300 Subject: [PATCH 485/982] mcl_fireworks pt_BR translation --- mods/ITEMS/mcl_fireworks/locale/mcl_fireworks.pt_BR.tr | 3 +++ 1 file changed, 3 insertions(+) create mode 100644 mods/ITEMS/mcl_fireworks/locale/mcl_fireworks.pt_BR.tr diff --git a/mods/ITEMS/mcl_fireworks/locale/mcl_fireworks.pt_BR.tr b/mods/ITEMS/mcl_fireworks/locale/mcl_fireworks.pt_BR.tr new file mode 100644 index 000000000..6b42dd610 --- /dev/null +++ b/mods/ITEMS/mcl_fireworks/locale/mcl_fireworks.pt_BR.tr @@ -0,0 +1,3 @@ +# textdomain: mcl_fireworks +Firework Rocket=Foguete +Flight Duration:=Duração de Voo: From 6cbd98597481c4b15c3a27ee34f82299d16b7c52 Mon Sep 17 00:00:00 2001 From: JoseDouglas26 Date: Thu, 30 Nov 2023 15:26:32 -0300 Subject: [PATCH 486/982] mcl_honey pt_BR translation --- mods/ITEMS/mcl_honey/locale/mcl_honey.pt_BR.tr | 11 +++++++++++ 1 file changed, 11 insertions(+) create mode 100644 mods/ITEMS/mcl_honey/locale/mcl_honey.pt_BR.tr diff --git a/mods/ITEMS/mcl_honey/locale/mcl_honey.pt_BR.tr b/mods/ITEMS/mcl_honey/locale/mcl_honey.pt_BR.tr new file mode 100644 index 000000000..cb6ae1d53 --- /dev/null +++ b/mods/ITEMS/mcl_honey/locale/mcl_honey.pt_BR.tr @@ -0,0 +1,11 @@ +# textdomain: mcl_honey +Honeycomb=Favo de Mel +Used to craft beehives and protect copper blocks from further oxidation.=Usado para fabricar colméias artificiais e protejer blocos de cobre da oxidação adicional. +Use on copper blocks to prevent further oxidation.=Use em blocos de cobre para previnir oxidação adicional. +Honeycomb Block=Bloco de Favo de Mel +Honeycomb Block. Used as a decoration.=Bloco de Favo de Mel. Usado como decoração +Honey Bottle=Garrafa de Mel +Honey Bottle is used to craft honey blocks and to restore hunger points.=Garrafa de Mel é usada para fabricar blocos de mel e para restaurar pontos de fome. +Drinking will restore 6 hunger points. Can also be used to craft honey blocks.=Beber irá restaurar 6 pontos de fome. Também pode ser usada para fabricar blocos de mel. +Honey Block=Bloco de Mel +Honey Block. Used as a decoration and in redstone. Is sticky on some sides.=Bloco de Mel. Usado como decoração e em redstone. É pegajoso em alguns lados. From 86d5e748bb69a3d590817a20f92930d4bf1b1030 Mon Sep 17 00:00:00 2001 From: JoseDouglas26 Date: Thu, 30 Nov 2023 15:33:58 -0300 Subject: [PATCH 487/982] mcl_craftguide pt_BR translation --- .../locale/mcl_craftguide.pt_BR.tr | 37 +++++++++++++++++++ 1 file changed, 37 insertions(+) create mode 100644 mods/HELP/mcl_craftguide/locale/mcl_craftguide.pt_BR.tr diff --git a/mods/HELP/mcl_craftguide/locale/mcl_craftguide.pt_BR.tr b/mods/HELP/mcl_craftguide/locale/mcl_craftguide.pt_BR.tr new file mode 100644 index 000000000..d5bf41235 --- /dev/null +++ b/mods/HELP/mcl_craftguide/locale/mcl_craftguide.pt_BR.tr @@ -0,0 +1,37 @@ +# textdomain: craftguide +Any shulker box=Qualquer caixa shulker +Any wool=Qualquer lã +Any wood planks=Quaisquer tábuas de madeira +Any wood=Qualquer madeira +Any sand=Qualquer areia +Any normal sandstone=Qualquer arenito normal +Any red sandstone=Qualquer arenito vermelho +Any carpet=Qualquer carpete +Any dye=Qualquer tintura +Any water bucket=Qualquer balde de água +Any flower=Qualquer flor +Any mushroom=Qualquer cogumelo +Any wooden slab=Qualquer laje de madeira +Any wooden stairs=Quaisquer escadas de madeira +Any coal=Qualquer carvão +Any kind of quartz block=Qualquer tipo de bloco de quartzo +Any kind of purpur block=Qualquer tipo de bloco de purpúra +Any stone bricks=Quaisquer tijolos de pedra +Any stick=Qualquer graveto +Any item belonging to the @1 group=Qualquer item pertencente ao grupo @1 +Any item belonging to the groups: @1=Qualquer item pertencente aos grupos: @1 +Search=Pesquisar +Reset=Resetar +Previous page=Página anterior +Next page=Página posterior +Usage @1 of @2=Uso @1 de @2 +Recipe @1 of @2=Receita @1 de @2 +Burning time: @1=Tempo de queima: @1 +Cooking time: @1=Tempo de cozimento: @1 +Recipe is too big to be displayed (@1×@2)=Receita é muito grande para ser mostrada (@1x@2) +Shapeless=Sem forma +Cooking=Cozimento +Increase window size=Aumentar tamanho da janela +Decrease window size=Diminuir tamanho da janela +No item to show=Nenhum item para mostrar +Collect items to reveal more recipes=Colete itens para revelar mais receitas From 527577cbcc05dbe5a78509d0ce25881a6d49052b Mon Sep 17 00:00:00 2001 From: JoseDouglas26 Date: Thu, 30 Nov 2023 16:07:06 -0300 Subject: [PATCH 488/982] mcl_raw_ores pt_BR translation --- mods/ITEMS/mcl_raw_ores/locale/mcl_raw_ores.pt_BR.tr | 9 +++++++++ 1 file changed, 9 insertions(+) create mode 100644 mods/ITEMS/mcl_raw_ores/locale/mcl_raw_ores.pt_BR.tr diff --git a/mods/ITEMS/mcl_raw_ores/locale/mcl_raw_ores.pt_BR.tr b/mods/ITEMS/mcl_raw_ores/locale/mcl_raw_ores.pt_BR.tr new file mode 100644 index 000000000..810557d4a --- /dev/null +++ b/mods/ITEMS/mcl_raw_ores/locale/mcl_raw_ores.pt_BR.tr @@ -0,0 +1,9 @@ +# textdomain: mcl_raw_ores +Raw Iron=Ferro Cru +Raw Gold=Ouro Cru +Raw iron. Mine an iron ore to get it.=Ferro cru. Minere um minério de ferro para obtê-lo. +Raw gold. Mine a gold ore to get it.=Ouro cru. Minere um minério de ouro para obtê-lo. +Block of Raw Iron=Bloco de Ferro Cru +Block of Raw Gold=Bloco de Ouro Cru +A block of raw iron is mostly a decorative block but also useful as a compact storage of raw iron.=Um bloco de ferro cru é majoritariamente um bloco decorativo mas também útil como um armazenamento compacto de ferro cru. +A block of raw gold is mostly a decorative block but also useful as a compact storage of raw gold.=Um bloco de ouro cru é majoritariamente um bloco decorativo mas também útil como um armazenamento compacto de ouro cru. From 9371ed5c4838edb74bc78ad14b805e3363fb8c93 Mon Sep 17 00:00:00 2001 From: JoseDouglas26 Date: Thu, 30 Nov 2023 16:12:22 -0300 Subject: [PATCH 489/982] mcl_spyglass pt_BR translation --- mods/ITEMS/mcl_spyglass/locale/mcl_spyglass.pt_BR.tr | 3 +++ 1 file changed, 3 insertions(+) create mode 100644 mods/ITEMS/mcl_spyglass/locale/mcl_spyglass.pt_BR.tr diff --git a/mods/ITEMS/mcl_spyglass/locale/mcl_spyglass.pt_BR.tr b/mods/ITEMS/mcl_spyglass/locale/mcl_spyglass.pt_BR.tr new file mode 100644 index 000000000..60d730206 --- /dev/null +++ b/mods/ITEMS/mcl_spyglass/locale/mcl_spyglass.pt_BR.tr @@ -0,0 +1,3 @@ +# textdomain: mcl_spyglass +Spyglass=Luneta +A spyglass is an item that can be used for zooming in on specific locations.=Uma luneta é um item que pode ser usado para dar zoom em uma localidade especifica. From 01641b5a8c6e2206aec1223c00e966b59d7296f1 Mon Sep 17 00:00:00 2001 From: JoseDouglas26 Date: Thu, 30 Nov 2023 16:19:16 -0300 Subject: [PATCH 490/982] mcl_flowerpots pt_BR translation --- .../locale/mcl_flowerpots.pt_BR.tr | 27 +++++++++++++++++++ 1 file changed, 27 insertions(+) create mode 100644 mods/ITEMS/mcl_flowerpots/locale/mcl_flowerpots.pt_BR.tr diff --git a/mods/ITEMS/mcl_flowerpots/locale/mcl_flowerpots.pt_BR.tr b/mods/ITEMS/mcl_flowerpots/locale/mcl_flowerpots.pt_BR.tr new file mode 100644 index 000000000..563e252c3 --- /dev/null +++ b/mods/ITEMS/mcl_flowerpots/locale/mcl_flowerpots.pt_BR.tr @@ -0,0 +1,27 @@ +# textdomain: mcl_flowerpots +Dandelion Flower Pot=Vaso com Dente-de-Leão +Poppy Flower Pot=Vaso com Papoula +Blue Orchid Flower Pot=Vaso com Orquídea Azul +Allium Flower Pot=Vaso com Alho Silvestre +Azure Bluet Flower Pot=Vaso com Flor Silvestre Azul +Red Tulip Flower Pot=Vaso com Tulipa Vermelha +Pink Tulip Flower Pot=Vaso com Tulipa Rose +White Tulip Flower Pot=Vaso com Tulipa Branca +Orange Tulip Flower Pot=Vaso com Tulipa Laranja +Oxeye Daisy Flower Pot=Vaso com Margarida +Brown Mushroom Flower Pot=Vaso com Cogumelo Marrom +Red Mushroom Flower Pot=Vaso com Cogumelo Vermelho +Oak Sapling Flower Pot=Vaso com Muda de Carvalho +Acacia Sapling Flower Pot=Vaso com Muda de Acácia +Jungle Sapling Flower Pot=Vaso com Muda da Selva +Dark Oak Sapling Flower Pot=Vaso com Muda de Carvalho Escuro +Spruce Sapling Flower Pot=Vaso com Muda de Pinheiro +Birch Sapling Flower Pot=Vaso com Muda de Bétula +Dead Bush Flower Pot=Vaso com Arbusto Morto +Fern Flower Pot=Vaso com Samambaia +Cactus Flower Pot=Vaso com Cacto +Flower Pot=Vaso +Flower pots are decorative blocks in which flowers and other small plants can be placed.=Vasos são blocos decorativos aos quais flores e plantas pequenas podem ser posicionadas. +Just place a plant on the flower pot. Flower pots can hold small flowers (not higher than 1 block), saplings, ferns, dead bushes, mushrooms and cacti. Rightclick a potted plant to retrieve the plant.=Apenas posicione uma planta no vaso. Vasos podem segurar flores pequenas (não mais altas que 1 bloco), mudas, samambaias, arbustos mortos, cogumelos e cactos. Clique com o botão direito em uma planta envasada para recolher a planta. +Can hold a small flower or plant=Pode segurar uma flor ou planta pequenas +Cherry Sapling Flower Pot=Vaso com Muda de Cerejeira From 2da67765a0b4a3e4fdac06b0c5fee33ebbedb3e2 Mon Sep 17 00:00:00 2001 From: JoseDouglas26 Date: Thu, 30 Nov 2023 16:53:00 -0300 Subject: [PATCH 491/982] mcl_flowers pt_BR translation --- .../mcl_flowers/locale/mcl_flowers.pt_BR.tr | 35 +++++++++++++++++++ 1 file changed, 35 insertions(+) create mode 100644 mods/ITEMS/mcl_flowers/locale/mcl_flowers.pt_BR.tr diff --git a/mods/ITEMS/mcl_flowers/locale/mcl_flowers.pt_BR.tr b/mods/ITEMS/mcl_flowers/locale/mcl_flowers.pt_BR.tr new file mode 100644 index 000000000..dcd5b5a14 --- /dev/null +++ b/mods/ITEMS/mcl_flowers/locale/mcl_flowers.pt_BR.tr @@ -0,0 +1,35 @@ +# textdomain: mcl_flowers +This is a small flower. Small flowers are mainly used for dye production and can also be potted.=Isso é uma flor pequena. Flores pequenas são majoritariamente usadas para a produção de corantes e também podem ser envasadas. +It can only be placed on a block on which it would also survive.=Apenas pode ser posicionada em um bloco ao qual vai sobreviver. +Poppy=Papoula +Dandelion=Dente-de-Leão +Oxeye Daisy=Margarida +Orange Tulip=Tulipa Laranja +Pink Tulip=Tulipa Rosa +Red Tulip=Tulipa Vermelha +White Tulip=Tulipa Branca +Allium=Alho Silvestre +Azure Bluet=Flor Silvestre Azul +Blue Orchid=Orquídea Azul +Wither Rose=Flor do Wither +Lily of the Valley=Lírio do Vale +Cornflower=Centáurea +Tall Grass=Grama Alta +Tall grass is a small plant which often occurs on the surface of grasslands. It can be harvested for wheat seeds. By using bone meal, tall grass can be turned into double tallgrass which is two blocks high.=Grama alta é uma planta pequena que muitas vezes ocorre na superfície de gramados. Pode ser colhida para obter sementes de trigo. Usando farinha de osso, a grama alta pode ser transformada em grama alta dupla a qual têm dois blocos de altura. +Fern=Samambaia +Ferns are small plants which occur naturally in jungles and taigas. They can be harvested for wheat seeds. By using bone meal, a fern can be turned into a large fern which is two blocks high.=Samambaias são plantas pequenas que ocorrem naturalmente em selvas e taigas. Podem ser colhidas para obter sementes de trigo. Usando farinha de osso, uma samambaia pode ser transformada em uma samambaia grande a qual têm dois blocos de altura. +(Top Part)=(Parte de Cima) +Peony=Peônia +A peony is a large plant which occupies two blocks. It is mainly used in dye production.=Uma peônia é uma planta alta que ocupa dois blocos. É majoritariamente usada para a produção de corante. +Rose Bush=Roseira +A rose bush is a large plant which occupies two blocks. It is safe to touch it. Rose bushes are mainly used in dye production.=Uma roseira é uma planta alta que ocupa dois blocos. É seguro tocá-la. Roseiras são majoritariamente usadas para a produção de corante. +Lilac=Lilás +A lilac is a large plant which occupies two blocks. It is mainly used in dye production.=Uma lilás é uma planta alta que ocupa dois blocos. É majoritariamente usada para a produção de corante. +Sunflower=Girassol +A sunflower is a large plant which occupies two blocks. It is mainly used in dye production.=Um girassol é uma planta alta que ocupa dois blocos. É majoritariamente usada para a produção de corante. +Double tallgrass a variant of tall grass and occupies two blocks. It can be harvested for wheat seeds.=Grama alta dupla é uma variante da grama alta e ocupa dois blocos. Pode ser colhida para obter sementes de trigo. +Large fern is a variant of fern and occupies two blocks. It can be harvested for wheat seeds.=Samambaia grande é uma variante da samambaia e ocupa dois blocos. Pode ser colhida para obter sementes de trigo. +Double Tallgrass=Grama Alta Dupla +Large Fern=Samambaia Grande +Lily Pad=Vitória-Régia +A lily pad is a flat plant block which can be walked on. They can be placed on water sources, ice and frosted ice.=Uma vitória-régia é um bloco de planta plano que pode ser pisado. Podem ser posicionadas em fontes de água, gelo e gelo fosco. From 9be815956cb456dadf7bb0feb41cfa84b0371c20 Mon Sep 17 00:00:00 2001 From: JoseDouglas26 Date: Thu, 30 Nov 2023 18:48:37 -0300 Subject: [PATCH 492/982] mcl_signs pt_BR translation --- .../ITEMS/mcl_signs/locale/mcl_signs.pt_BR.tr | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) create mode 100644 mods/ITEMS/mcl_signs/locale/mcl_signs.pt_BR.tr diff --git a/mods/ITEMS/mcl_signs/locale/mcl_signs.pt_BR.tr b/mods/ITEMS/mcl_signs/locale/mcl_signs.pt_BR.tr new file mode 100644 index 000000000..08d67d573 --- /dev/null +++ b/mods/ITEMS/mcl_signs/locale/mcl_signs.pt_BR.tr @@ -0,0 +1,19 @@ +# textdomain: mcl_signs +Sign=Placa +Signs can be written and come in two variants: Wall sign and sign on a sign post. Signs can be placed on the top and the sides of other blocks, but not below them.=Placas podem ser escritas e vêm em duas variantes: Placa de parede e placa de poste. Placas podem ser posicionadas na parte superior e nas laterais de outros blocos, mas não abaixo deles. +After placing the sign, you can write something on it. You have 4 lines of text with up to 15 characters for each line; anything beyond these limits is lost. Not all characters are supported. The text can not be changed once it has been written; you have to break and place the sign again. Can be colored and made to glow.=Depois de posicionar a placa, você pode escrever qualquer coisa nela. Você tem 4 linhas de texto com 15 caracteres em cada linha; qualquer coisa além desses limites será perdido. Nem todos os caracteres são suportados. O texto não pode ser alterado uma vez que esse foi escrito; você terá que quebrar e posicionar a placa novamente. Pode ser colorida e pode brilhar. +Enter sign text:=Insira o texto da placa: +Maximum line length: 15=Comprimento máximo da linha: 15 +Maximum lines: 4=Máximo de linhas: 4 +Done=Feito +Can be written=Pode ser escrito +Oak Sign=Placa de Carvalho +Birch Sign=Placa de Bétula +Spruce Sign=Placa de Pinheiro +Dark Oak Sign=Placa de Carvalho Escuro +Jungle Sign=Placa da Selva +Acacia Sign=Placa de Acácia +Mangrove Sign=Placa de Mangue +Warped Hyphae Sign=Placa de Hifas Distorcidas +Crimson Hyphae Sign=Placa de Hifas Carmesim +Bamboo Sign=Placa de Bambu From 34c23bd578f734ddba6b67acfd3ae2b7cfb41b4a Mon Sep 17 00:00:00 2001 From: JoseDouglas26 Date: Thu, 30 Nov 2023 18:58:49 -0300 Subject: [PATCH 493/982] mcl_tnt pt_BR translation --- mods/ITEMS/mcl_tnt/locale/mcl_tnt.pt_BR.tr | 8 ++++++++ 1 file changed, 8 insertions(+) create mode 100644 mods/ITEMS/mcl_tnt/locale/mcl_tnt.pt_BR.tr diff --git a/mods/ITEMS/mcl_tnt/locale/mcl_tnt.pt_BR.tr b/mods/ITEMS/mcl_tnt/locale/mcl_tnt.pt_BR.tr new file mode 100644 index 000000000..739d1414b --- /dev/null +++ b/mods/ITEMS/mcl_tnt/locale/mcl_tnt.pt_BR.tr @@ -0,0 +1,8 @@ +# textdomain: mcl_tnt +@1 was caught in an explosion.=@1 foi pego(a) em uma explosão. +TNT=TNT +An explosive device. When it explodes, it will hurt living beings and destroy blocks around it. TNT has an explosion radius of @1. With a small chance, blocks may drop as an item (as if being mined) rather than being destroyed. TNT can be ignited by tools, explosions, fire, lava and redstone signals.=Um artefato explosivo. Quando explode, machuca seres vivos e destrói blocos a sua volta. A TNT tem um raio de explosão de @1. Com pouca chance, blocos talvez dropem como um item (como se fosse minerado) ao invés de ser destruido. A TNT pode ser acesa por ferramentas explosões, fogo, lava e sinais de redstone. +An explosive device. When it explodes, it will hurt living beings. TNT has an explosion radius of @1. TNT can be ignited by tools, explosions, fire, lava and redstone signals.= +Place the TNT and ignite it with one of the methods above. Quickly get in safe distance. The TNT will start to be affected by gravity and explodes in 4 seconds.= Posicione a TNT e acenda-a com um dos métodos acima. Rapidamente mantenha uma distância segura. A TNT começará a ser afetada pela gravidade e explodirá em 4 segundos. +Ignited by tools, explosions, fire, lava, redstone power=Acesa por ferramentas, explosões, fogo, lava, carga de redstone +Explosion radius: @1=Raio de explosão: @1 From b0b120dd28dfa19bff11a87fc6990874c2afb0c9 Mon Sep 17 00:00:00 2001 From: JoseDouglas26 Date: Thu, 30 Nov 2023 19:17:53 -0300 Subject: [PATCH 494/982] mcl_walls pt_BR translation --- mods/ITEMS/mcl_walls/locale/mcl_walls.pt_BR.tr | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) create mode 100644 mods/ITEMS/mcl_walls/locale/mcl_walls.pt_BR.tr diff --git a/mods/ITEMS/mcl_walls/locale/mcl_walls.pt_BR.tr b/mods/ITEMS/mcl_walls/locale/mcl_walls.pt_BR.tr new file mode 100644 index 000000000..a344d88c0 --- /dev/null +++ b/mods/ITEMS/mcl_walls/locale/mcl_walls.pt_BR.tr @@ -0,0 +1,17 @@ +# textdomain: mcl_walls +A piece of wall. It cannot be jumped over with a simple jump. When multiple of these are placed to next to each other, they will automatically build a nice wall structure.=Um pedaço de muro. Não pode ser pulado com um pulo simples. Quando muitos desses são posicionados próximos uns aos outros, vão construir automaticamente uma bela estrutura de muro. +Cobblestone Wall=Muro de Pedregulho +Mossy Cobblestone Wall=Muro de Pedregulho Musgoso +Andesite Wall=Muro de Andesito +Granite Wall=Muro de Granito +Diorite Wall=Muro de Diorito +Brick Wall=Muro de Tijolos +Sandstone Wall=Muro de Arenito +Red Sandstone Wall=Muro de Arenito Vermelho +Stone Brick Wall=Muro de Tijolos de Pedra +Mossy Stone Brick Wall=Muro de Tijolos de Pedra Musgosos +Prismarine Wall=Muro de Prismarinho +End Stone Brick Wall=Muro de Tijolos de Pedra do Fim +Nether Brick Wall=Muro de Tijolos do Nether +Red Nether Brick Wall=Muro de Tijolos Vermelhos do Nether +Mud Brick Wall=Muro de Tijolos de Barro From 60377c56cdda4ceec777178b51ec3877fbcd6247 Mon Sep 17 00:00:00 2001 From: JoseDouglas26 Date: Thu, 30 Nov 2023 19:25:20 -0300 Subject: [PATCH 495/982] mcl_tt pt_BR translation --- mods/HELP/mcl_tt/locale/mcl_tt.pt_BR.tr | 48 +++++++++++++++++++++++++ 1 file changed, 48 insertions(+) create mode 100644 mods/HELP/mcl_tt/locale/mcl_tt.pt_BR.tr diff --git a/mods/HELP/mcl_tt/locale/mcl_tt.pt_BR.tr b/mods/HELP/mcl_tt/locale/mcl_tt.pt_BR.tr new file mode 100644 index 000000000..9d00a06d4 --- /dev/null +++ b/mods/HELP/mcl_tt/locale/mcl_tt.pt_BR.tr @@ -0,0 +1,48 @@ +# textdomain: mcl_tt +Head armor=Armadura de cabeça +Torso armor=Armadura de torso +Legs armor=Armadura de pernas +Feet armor=Armadura de pés +Armor points: @1=Pontos de armadura: @1 +Armor durability: @1=Durabilidade da armadura: @1 +Protection: @1%=Proteção: @1% +Hunger points: +@1=Pontos de fome: +@1 +Saturation points: +@1=Pontos de saturação: +@1 +Deals damage when falling=Dá dano enquanto cai +Grows on grass blocks or dirt=Cresce em blocos de grama ou terra +Grows on grass blocks, podzol, dirt or coarse dirt=Cresce em blocos de grama, podzol, terra ou terra infértil +Flammable=Inflamável +Zombie view range: -50%=Alcançe de visão do zumbi: -50% +Skeleton view range: -50%=Alcançe de visão do esqueleto: -50% +Creeper view range: -50%=Alcançe de visão do creeper: -50% +Damage: @1= Dano: @1 +Damage (@1): @2=Dano (@1): @2 +Healing: @1=Cura: @1 +Healing (@1): @2=Cura (@1): @2 +Full punch interval: @1s=Intervalo completo de batida: @1s +Contact damage: @1 per second=Dano por contaro: @1 por segundo +Contact healing: @1 per second=Cura por contato: @1 por segundo +Drowning damage: @1=Dano de afogamento: @1 +Bouncy (@1%)=Saltitante (@1%) +Luminance: @1=Bliho: @1 +Slippery=Escorregadio +Climbable=Escalável +Climbable (only downwards)=Escalável (apenas em descida) +No jumping=Sem pulo +No swimming upwards=Sem natação em subida +No rising=Sem levantamento +Fall damage: @1%=Dano de queda: @1% +Fall damage: +@1%=Dano de queda: +@1% +No fall damage=Sem dano de queda +Mining speed: @1=Velocidade de mineração: @1 +Very fast=Muito rápido +Extremely fast=Extremamente rápido +Fast=Rápido +Slow=Lento +Very slow=Muito lento +Painfully slow=Dolorosamente lento +Mining durability: @1=Durabilidade de mineração: @1 +Block breaking strength: @1=Força de quebra do bloco: @1 +@1 uses=@1 usos +Unlimited uses=Usos ilimitados +Durability: @1=Durabilidade: @1 From 1524f63a6d8c00da1edd0702fa93147c88e92ee0 Mon Sep 17 00:00:00 2001 From: JoseDouglas26 Date: Thu, 30 Nov 2023 19:56:41 -0300 Subject: [PATCH 496/982] mcl_hbarmor pt_BR translation --- mods/HUD/mcl_hbarmor/locale/mcl_hbarmor.pt_BR.tr | 2 ++ 1 file changed, 2 insertions(+) create mode 100644 mods/HUD/mcl_hbarmor/locale/mcl_hbarmor.pt_BR.tr diff --git a/mods/HUD/mcl_hbarmor/locale/mcl_hbarmor.pt_BR.tr b/mods/HUD/mcl_hbarmor/locale/mcl_hbarmor.pt_BR.tr new file mode 100644 index 000000000..f9529b482 --- /dev/null +++ b/mods/HUD/mcl_hbarmor/locale/mcl_hbarmor.pt_BR.tr @@ -0,0 +1,2 @@ +# textdomain:hbarmor +Armor=Armadura From 6f7ac46f0532263e4271451891454b6077ade261 Mon Sep 17 00:00:00 2001 From: JoseDouglas26 Date: Thu, 30 Nov 2023 20:39:07 -0300 Subject: [PATCH 497/982] mcl_jukebox pt_BR translation --- mods/ITEMS/mcl_jukebox/locale/mcl_jukebox.pt_BR.tr | 11 +++++++++++ 1 file changed, 11 insertions(+) create mode 100644 mods/ITEMS/mcl_jukebox/locale/mcl_jukebox.pt_BR.tr diff --git a/mods/ITEMS/mcl_jukebox/locale/mcl_jukebox.pt_BR.tr b/mods/ITEMS/mcl_jukebox/locale/mcl_jukebox.pt_BR.tr new file mode 100644 index 000000000..6b46f67b9 --- /dev/null +++ b/mods/ITEMS/mcl_jukebox/locale/mcl_jukebox.pt_BR.tr @@ -0,0 +1,11 @@ +# textdomain: mcl_jukebox +Music Disc=Disco de Música +A music disc holds a single music track which can be used in a jukebox to play music.=Um disco de música contém uma única faixa de música ao qual pode ser usado em uma jukebox para tocar música. +Place a music disc into an empty jukebox to play the music. Use the jukebox again to retrieve the music disc. The music can only be heard by you, not by other players.=Posicione um disco de música em uma jukebox vazia para tocar a música. Use novamente a jukebox para pegar o disco de música de volta. A música pode ser ouvida apenas por você, não por outros jogadores. +Music Disc=Disco de Música +@1—@2=@1-@2 +Jukebox=Jukebox +Jukeboxes play music when they're supplied with a music disc.=Jukeboxes tocam música quando são abastecidas com um disco de música. +Place a music disc into an empty jukebox to insert the music disc and play music. If the jukebox already has a music disc, you will retrieve this music disc first. The music can only be heard by you, not by other players.=Posicione um disco de música em uma jukebox vazia para inserir o disco de música e tocar a música. Se a jukebox já tiver um disco de música, você pegará esse disco de música de volta antes. A música pode ser ouvida apenas por você, não por outros jogadores. +Now playing: @1—@2=Tocando: @1-@2 +Uses music discs to play music=Use discos de música para tocar música From 232740b5e6911469d457e4f6c6de1417f22bea7b Mon Sep 17 00:00:00 2001 From: JoseDouglas26 Date: Thu, 30 Nov 2023 20:45:11 -0300 Subject: [PATCH 498/982] mcl_totems pt_BR translation --- mods/ITEMS/mcl_totems/locale/mcl_totems.pt_BR.tr | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 mods/ITEMS/mcl_totems/locale/mcl_totems.pt_BR.tr diff --git a/mods/ITEMS/mcl_totems/locale/mcl_totems.pt_BR.tr b/mods/ITEMS/mcl_totems/locale/mcl_totems.pt_BR.tr new file mode 100644 index 000000000..c7ab1f3eb --- /dev/null +++ b/mods/ITEMS/mcl_totems/locale/mcl_totems.pt_BR.tr @@ -0,0 +1,5 @@ +# textdomain: mcl_totems +Totem of Undying=Totem da Imortalidade +A totem of undying is a rare artifact which may safe you from certain death.=Um totem da imortalidade é um artefato raro ao qual pode segurar você contra certas mortes. +The totem only works while you hold it in your hand. If you receive fatal damage, you are saved from death and you get a second chance with 1 HP. The totem is destroyed in the process, however.=O totem apenas funciona enquanto você o segura em sua mão. Se você receber um dano fatal, você será salvo da morte e receberá uma segunda chance com 1 HP. Porém, o totem é destruído no processo. +Protects you from death while wielding it=Proteje você da morte enquanto você segura-o From 5489bf20ead66a144eaecf392d22f3abcace7efb Mon Sep 17 00:00:00 2001 From: JoseDouglas26 Date: Thu, 30 Nov 2023 20:48:21 -0300 Subject: [PATCH 499/982] mcl_beehives pt_BR translation --- mods/ITEMS/mcl_beehives/locale/mcl_beehives.pt_BR.tr | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 mods/ITEMS/mcl_beehives/locale/mcl_beehives.pt_BR.tr diff --git a/mods/ITEMS/mcl_beehives/locale/mcl_beehives.pt_BR.tr b/mods/ITEMS/mcl_beehives/locale/mcl_beehives.pt_BR.tr new file mode 100644 index 000000000..cf4923a83 --- /dev/null +++ b/mods/ITEMS/mcl_beehives/locale/mcl_beehives.pt_BR.tr @@ -0,0 +1,5 @@ +# textdomain: mcl_beehives +Beehive=Colméia Artificial +Artificial bee nest.=Colméia artificial. +Bee Nest=Colméia +A naturally generating block that houses bees and a tasty treat...if you can get it.=Um bloco naturalmente gerado que abriga abelhas e um regalo saboroso...se você conseguir pegá-lo. From 0626c3329b722fab08de82457707b7f8a2afd07a Mon Sep 17 00:00:00 2001 From: JoseDouglas26 Date: Thu, 30 Nov 2023 21:05:24 -0300 Subject: [PATCH 500/982] mcl_sculk pt_BR translation --- mods/ITEMS/mcl_sculk/locale/mcl_sculk.pt_BR.tr | 7 +++++++ 1 file changed, 7 insertions(+) create mode 100644 mods/ITEMS/mcl_sculk/locale/mcl_sculk.pt_BR.tr diff --git a/mods/ITEMS/mcl_sculk/locale/mcl_sculk.pt_BR.tr b/mods/ITEMS/mcl_sculk/locale/mcl_sculk.pt_BR.tr new file mode 100644 index 000000000..bbafc5c76 --- /dev/null +++ b/mods/ITEMS/mcl_sculk/locale/mcl_sculk.pt_BR.tr @@ -0,0 +1,7 @@ +# textdomain: mcl_sculk +Sculk=Sculk +Sculk Vein=Veio Sculk +Sculk vein.=Veio sculk. +Sculk Catalyst=Catalizador Sculk +Sculk Sensor=Sensor Sculk +Sculk Shrieker=Emissor Sculk From 3684cb8d2a7b1371002fa3bdc0a5367cd5104bc1 Mon Sep 17 00:00:00 2001 From: JoseDouglas26 Date: Thu, 30 Nov 2023 21:16:35 -0300 Subject: [PATCH 501/982] mcl_cherry_blossom pt_BR translation --- .../locale/mcl_cherry_blossom.pt_BR.tr | 24 +++++++++++++++++++ 1 file changed, 24 insertions(+) create mode 100644 mods/ITEMS/mcl_cherry_blossom/locale/mcl_cherry_blossom.pt_BR.tr diff --git a/mods/ITEMS/mcl_cherry_blossom/locale/mcl_cherry_blossom.pt_BR.tr b/mods/ITEMS/mcl_cherry_blossom/locale/mcl_cherry_blossom.pt_BR.tr new file mode 100644 index 000000000..e3dc6d2fd --- /dev/null +++ b/mods/ITEMS/mcl_cherry_blossom/locale/mcl_cherry_blossom.pt_BR.tr @@ -0,0 +1,24 @@ +# textdomain: mcl_cherry_blossom +Cherry Log=Tronco de Cerejeira +The trunk of a cherry blossom tree.=O tronco de uma árvore de cerejeira. +Stripped Cherry Log=Tronco de Cerejeira Descascado +The stripped trunk of a cherry blossom tree.=O tronco descascado de uma árvore de cerejeira. +Cherry Bark=Casca de Cerejeira +This is a decorative block surrounded by the bark of a tree trunk.=Esse é um bloco decorativo rodeado pela casca do tronco de uma árvore. +Stripped Cherry Wood=Madeira de Cerejeira Descascada +The stripped wood of a cherry blossom tree.=A madeira descascada da árvore de cerejeira. +Cherry Wood Planks=Tábuas de Cerejeira +Cherry Leaves=Folhas de Cerejeira +Cherry blossom leaves are grown from cherry blossom trees.=Folhas de cerejeira crescem em árvores de cerejeira. +Cherry Sapling=Muda de Cerejeira +Cherry blossom sapling can be planted to grow cherry trees.=Muda de cerejeira pode ser plantada para crescer árvores de cerejeira. +Cherry Door=Porta de Cerejeira +Cherry Trapdoor=Alçapão de Cerejeira +Cherry Stairs=Escadas de Cerejeira +Cherry Slab=Laje de Cerejeira +Double Cherry Slab=Laje Dupla de Cerejeira +Cherry Sign=Placa de Cerejeira +Cherry Fence=Cerca de Cerejeira +Cherry Gate=Portão de Cerejeira +Cherry Pressure Plate=Placa de Pressão de Cerejeira +Cherry Button=Botão de Cerejeira From a93ce7af1f3700c7c81beea09d236c83a4c74975 Mon Sep 17 00:00:00 2001 From: JoseDouglas26 Date: Thu, 30 Nov 2023 21:18:15 -0300 Subject: [PATCH 502/982] mcl_inventory pt_BR translation --- .../locale/mcl_inventory.pt_BR.tr | 22 +++++++++++++++++++ 1 file changed, 22 insertions(+) create mode 100644 mods/HUD/mcl_inventory/locale/mcl_inventory.pt_BR.tr diff --git a/mods/HUD/mcl_inventory/locale/mcl_inventory.pt_BR.tr b/mods/HUD/mcl_inventory/locale/mcl_inventory.pt_BR.tr new file mode 100644 index 000000000..a24e6afed --- /dev/null +++ b/mods/HUD/mcl_inventory/locale/mcl_inventory.pt_BR.tr @@ -0,0 +1,22 @@ +# textdomain: mcl_inventory +Recipe book=Livro de receitas +Help=Ajuda +Select player skin=Selecionar skin do jogador +Advancements=Progressos +Building Blocks=Blocos de construção +Decoration Blocks=Blocos de decoração +Redstone=Redstone +Transportation=Transporte +Brewing=Fermentação +Miscellaneous=Diversos +Search Items=Pesquisar Itens +Foodstuffs=Comida +Tools=Ferramentas +Combat=Combate +Mobs=Mobs +Materials=Materiais +Survival Inventory=Inventário do Sobrevivência +Crafting=Fabricação +Inventory=Inventário +@1/@2=@1/@2 +Switch stack size=Trocar tamanho da pilha From e2746adea8792239fae2bc31a0c970d37059b4e1 Mon Sep 17 00:00:00 2001 From: JoseDouglas26 Date: Thu, 30 Nov 2023 21:29:46 -0300 Subject: [PATCH 503/982] mcl_furnaces pt_BR translation --- mods/ITEMS/mcl_furnaces/locale/mcl_furnaces.pt_BR.tr | 12 ++++++++++++ 1 file changed, 12 insertions(+) create mode 100644 mods/ITEMS/mcl_furnaces/locale/mcl_furnaces.pt_BR.tr diff --git a/mods/ITEMS/mcl_furnaces/locale/mcl_furnaces.pt_BR.tr b/mods/ITEMS/mcl_furnaces/locale/mcl_furnaces.pt_BR.tr new file mode 100644 index 000000000..e7e02f52b --- /dev/null +++ b/mods/ITEMS/mcl_furnaces/locale/mcl_furnaces.pt_BR.tr @@ -0,0 +1,12 @@ +# textdomain: mcl_furnaces +Furnace=Fornalha +Furnaces cook or smelt several items, using a furnace fuel, into something else.=Fornalhas cozinham ou derretem vários itens, usando um combustível de fornalha,para transformá=los em outras coisas. +Use the furnace to open the furnace menu.=Use a fornalha para abrir o menu da fornalha. +Place a furnace fuel in the lower slot and the source material in the upper slot.=Posicione um combustível de fornalha no slot mais baixo e o material fonte no slot acima. +The furnace will slowly use its fuel to smelt the item.=A fornalha irá usar lentamente seu combustível para derreter o item. +The result will be placed into the output slot at the right side.=O resultado será posicionado no slot de saída no lado direito. +Use the recipe book to see what you can smelt, what you can use as fuel and how long it will burn.=Use o livro de receitas para ver o que você pode derreter, o que você pode usar como combustível e por quanto tempo irá queimar. +Burning Furnace=Fornalha Queimando +Recipe book=Livro de receitas +Inventory=Inventário +Uses fuel to smelt or cook items=Usa combustível para derreter ou cozinhar itens From 9701526d162f9b491f9b60e056fcc51066a335fa Mon Sep 17 00:00:00 2001 From: JoseDouglas26 Date: Thu, 30 Nov 2023 22:24:13 -0300 Subject: [PATCH 504/982] mcl_skins pt_BR translation --- mods/PLAYER/mcl_skins/locale/mcl_skins.pt_BR.tr | 14 ++++++++++++++ 1 file changed, 14 insertions(+) create mode 100644 mods/PLAYER/mcl_skins/locale/mcl_skins.pt_BR.tr diff --git a/mods/PLAYER/mcl_skins/locale/mcl_skins.pt_BR.tr b/mods/PLAYER/mcl_skins/locale/mcl_skins.pt_BR.tr new file mode 100644 index 000000000..db1de34d1 --- /dev/null +++ b/mods/PLAYER/mcl_skins/locale/mcl_skins.pt_BR.tr @@ -0,0 +1,14 @@ +# textdomain: mcl_skins +Skins=Skins +Templates=Modelos +Arm size=Tamanho do Braço +Bases=Bases +Footwears=Calçados +Eyes=Olhos +Mouths=Bocas +Bottoms=Inferiores +Tops=Superiores +Hairs=Cabelos +Headwears=Acessórios +Open skin configuration screen.=Abrir tela de configuração de skin. +Select=Selecionar From 09a063256b5479b1db91d076a2142dbfebe83a14 Mon Sep 17 00:00:00 2001 From: JoseDouglas26 Date: Thu, 30 Nov 2023 22:36:16 -0300 Subject: [PATCH 505/982] mcl_wip pt_BR translation --- mods/MISC/mcl_wip/locale/mcl_wip.pt_BR.tr | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 mods/MISC/mcl_wip/locale/mcl_wip.pt_BR.tr diff --git a/mods/MISC/mcl_wip/locale/mcl_wip.pt_BR.tr b/mods/MISC/mcl_wip/locale/mcl_wip.pt_BR.tr new file mode 100644 index 000000000..9a30f5466 --- /dev/null +++ b/mods/MISC/mcl_wip/locale/mcl_wip.pt_BR.tr @@ -0,0 +1,4 @@ +# textdomain: mcl_wip +# WIP means “Work in Progress” +(WIP)=(Trabalho em progresso) +(Temporary)=(Temporário) From 21a10751d1c1d52d3344e899e57575fe006e1a36 Mon Sep 17 00:00:00 2001 From: JoseDouglas26 Date: Thu, 30 Nov 2023 22:42:01 -0300 Subject: [PATCH 506/982] mcl_lanterns pt_BR translation --- mods/ITEMS/mcl_lanterns/locale/mcl_lanterns.pt_BR.tr | 6 ++++++ 1 file changed, 6 insertions(+) create mode 100644 mods/ITEMS/mcl_lanterns/locale/mcl_lanterns.pt_BR.tr diff --git a/mods/ITEMS/mcl_lanterns/locale/mcl_lanterns.pt_BR.tr b/mods/ITEMS/mcl_lanterns/locale/mcl_lanterns.pt_BR.tr new file mode 100644 index 000000000..de683f688 --- /dev/null +++ b/mods/ITEMS/mcl_lanterns/locale/mcl_lanterns.pt_BR.tr @@ -0,0 +1,6 @@ +# textdomain: mcl_lanterns +Lantern=Lanterna +Soul Lantern=Lanterna das Almas +Lanterns are light sources which can be placed on the top or the bottom of most blocks.=Lanternas são fontes de luz as quais podem ser posicionadas na parte superior ou inferior da maioria blocos. +Chain=Corrente +Chains are metallic decoration blocks.=Correntes são blocos de decoração metálicos. From 840381f73fffcf61e6eb1c19698692f96e1d3373 Mon Sep 17 00:00:00 2001 From: JoseDouglas26 Date: Thu, 30 Nov 2023 22:44:14 -0300 Subject: [PATCH 507/982] mcl_fletching_table pt_BR translation --- .../mcl_fletching_table/locale/mcl_fletching_table.pt_BR.tr | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 mods/ITEMS/mcl_fletching_table/locale/mcl_fletching_table.pt_BR.tr diff --git a/mods/ITEMS/mcl_fletching_table/locale/mcl_fletching_table.pt_BR.tr b/mods/ITEMS/mcl_fletching_table/locale/mcl_fletching_table.pt_BR.tr new file mode 100644 index 000000000..a2b7e38b5 --- /dev/null +++ b/mods/ITEMS/mcl_fletching_table/locale/mcl_fletching_table.pt_BR.tr @@ -0,0 +1,4 @@ +# textdomain: mcl_fletching_table +Fletching Table=Bancada de Arco e Flecha +A fletching table=Uma bancada de arco e flecha +This is the fletcher villager's work station. It currently has no use beyond decoration.=Essa é a estação de trabalho do aldeão flecheiro. Atualmente não possui usos além de decoração. From 334ac81f589a32f8dd4331696a5ae3f3bc9e1ca6 Mon Sep 17 00:00:00 2001 From: JoseDouglas26 Date: Fri, 1 Dec 2023 05:43:22 -0300 Subject: [PATCH 508/982] mcl_fences pt_BR translation --- .../mcl_fences/locale/mcl_fences.pt_BR.tr | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) create mode 100644 mods/ITEMS/mcl_fences/locale/mcl_fences.pt_BR.tr diff --git a/mods/ITEMS/mcl_fences/locale/mcl_fences.pt_BR.tr b/mods/ITEMS/mcl_fences/locale/mcl_fences.pt_BR.tr new file mode 100644 index 000000000..7c55be53d --- /dev/null +++ b/mods/ITEMS/mcl_fences/locale/mcl_fences.pt_BR.tr @@ -0,0 +1,18 @@ +# textdomain: mcl_fences +Fences are structures which block the way. Fences will connect to each other and solid blocks. They cannot be jumped over with a simple jump.=Cercas são estruturas as quais bloqueiam o caminho. Cercas vão conectar umas nas outras e em blocos sólidos. Não podem ser puladas com um simples pulo. +Fence gates can be opened or closed and can't be jumped over. Fences will connect nicely to fence gates.=Portões podem ser abertos ou fechados e não podem ser pulados. As cercas irão se conectar aos portões. +Right-click the fence gate to open or close it.=Clique com o botão direito no portão para abri-lo ou fecha-lo. +Oak Fence=Cerca de Carvalho +Oak Fence Gate=Portão de Carvalho +Spruce Fence=Cerca de Pinheiro +Spruce Fence Gate=Portão de Pinheiro +Birch Fence=Cerca de Bétula +Birch Fence Gate=Portão de Bétula +Jungle Fence=Cerca da Selva +Jungle Fence Gate=Portão da Selva +Dark Oak Fence=Cerca de Carvalho Escuro +Dark Oak Fence Gate=Portão de Carvalho Escuro +Acacia Fence=Cerca de Acácia +Acacia Fence Gate=Portão de Acácia +Nether Brick Fence=Cerca de Tijolos do Nether +Openable by players and redstone power=Abrível por jogadores e carga de redstone From 799462c4b447b0ac2e4f611d207aaf961bda00a3 Mon Sep 17 00:00:00 2001 From: JoseDouglas26 Date: Fri, 1 Dec 2023 05:55:17 -0300 Subject: [PATCH 509/982] mcl_credits pt_BR translation --- .../mcl_credits/locale/mcl_credits.pt_BR.tr | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) create mode 100644 mods/HUD/mcl_credits/locale/mcl_credits.pt_BR.tr diff --git a/mods/HUD/mcl_credits/locale/mcl_credits.pt_BR.tr b/mods/HUD/mcl_credits/locale/mcl_credits.pt_BR.tr new file mode 100644 index 000000000..e693b0357 --- /dev/null +++ b/mods/HUD/mcl_credits/locale/mcl_credits.pt_BR.tr @@ -0,0 +1,19 @@ +# textdomain: mcl_credits +3D Models=Modelos 3D +A faithful Open Source clone of Minecraft=Um clone fiel Open Source do Minecraft +Contributors=Colaboradores +Creator of MineClone=Criador do MineClone +Creator of MineClone2=Criador do MineClone2 +Developers=Desenvolvedores +Past Developers=Desenvolvedores Passados +Jump to speed up (additionally sprint)=Pule para acelerar (arrancada adicional) +Maintainers=Mantedores +Previous Maintainers=Mantedores Anteriores +MineClone5=MineClone5 +Original Mod Authors=Autores Originais do Mod +Sneak to skip=Agache para pular +Textures=Texturas +Translations=Traduções +Music=Músicas +Funders=Financiadores +Special thanks=Agradecimentos especiais From 427724ced290ca0da5b01db36083a3bcf71b4d99 Mon Sep 17 00:00:00 2001 From: JoseDouglas26 Date: Fri, 1 Dec 2023 06:46:45 -0300 Subject: [PATCH 510/982] mcl_ver_info pt_BR translation --- mods/HUD/mcl_ver_info/locale/mcl_ver_info.pt_BR.tr | 3 +++ 1 file changed, 3 insertions(+) create mode 100644 mods/HUD/mcl_ver_info/locale/mcl_ver_info.pt_BR.tr diff --git a/mods/HUD/mcl_ver_info/locale/mcl_ver_info.pt_BR.tr b/mods/HUD/mcl_ver_info/locale/mcl_ver_info.pt_BR.tr new file mode 100644 index 000000000..ef465f8a0 --- /dev/null +++ b/mods/HUD/mcl_ver_info/locale/mcl_ver_info.pt_BR.tr @@ -0,0 +1,3 @@ +# textdomain: mcl_ver_info +Sorry, but your version of Minetest doesn't support the latest API. Please upgrade your minetest.=Desculpe, mas sua versão do Minetest não suporta a última API. Por favor atualize seu minetest. +Display Mineclone 2 game version.=Mostrar a versão do jogo Mineclone 2. From cb0c67b05fc4ab2d254464bf9d90330de5463fa9 Mon Sep 17 00:00:00 2001 From: JoseDouglas26 Date: Fri, 1 Dec 2023 07:32:08 -0300 Subject: [PATCH 511/982] mcl_fishing pt_BR translation --- .../mcl_fishing/locale/mcl_fishing.pt_BR.tr | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) create mode 100644 mods/ITEMS/mcl_fishing/locale/mcl_fishing.pt_BR.tr diff --git a/mods/ITEMS/mcl_fishing/locale/mcl_fishing.pt_BR.tr b/mods/ITEMS/mcl_fishing/locale/mcl_fishing.pt_BR.tr new file mode 100644 index 000000000..638858432 --- /dev/null +++ b/mods/ITEMS/mcl_fishing/locale/mcl_fishing.pt_BR.tr @@ -0,0 +1,18 @@ +# textdomain: mcl_fishing +Fishing Rod=Vara de Pesca +Fishing rods can be used to catch fish.=Varas de pesca podem ser usadas para coletar peixes. +Rightclick to launch the bobber. When it sinks right-click again to reel in an item. Who knows what you're going to catch?=Clique com o botão direito para lançar a boia de pesca. Quando esta afundar clique com o botão direito novamente para enrola-la como um item. Quem sabe o que você está prestes a coletar? +Raw Fish=Peixe Cru +Raw fish is obtained by fishing and is a food item which can be eaten safely. Cooking it improves its nutritional value.=Peixe cru é obtido através da pesca e é um item de comida ao qual pode ser comido em segurança. Cozinha-lo aumenta seu valor nutricional. +Cooked Fish=Peixe Cozido +Mmh, fish! This is a healthy food item.=Mmh, peixe! Esse é um item de comida saudável. +Raw Salmon=Salmão Cru +Raw salmon is obtained by fishing and is a food item which can be eaten safely. Cooking it improves its nutritional value.=Salmão cru é obtido através da pesca e é um item de comida ao qual pode ser comido em segurança. Cozinha-lo aumenta seu valor nutricional. +Cooked Salmon=Salmão Cozido +This is a healthy food item which can be eaten.=Esse é um item de comida saudável ao qual pode ser comido. +Clownfish=Peixe-Palhaço +Clownfish may be obtained by fishing (and luck) and is a food item which can be eaten safely.=Peixes-Palhaço podem ser obtidos com pesca (e sorte) e são um item de comida ao qual pode ser comido em segurança. +Pufferfish=Baiacu +Pufferfish are a common species of fish and can be obtained by fishing. They can technically be eaten, but they are very bad for humans. Eating a pufferfish only restores 1 hunger point and will poison you very badly (which drains your health non-fatally) and causes serious food poisoning (which increases your hunger).=Baiacus são uma espécie comum de peixe e podem ser obtidos através da pesca. Tecnicamente eles podem ser comidos, mas eles são muito ruins para humanos. Comer um baiacu restaura apenas 1 ponto de fome e irá lhe envenenar muito (o que drenará sua saúde de forma não-fatal) e causará uma séria intoxicação alimentar (o que aumentará sua fome). +Catches fish in water=Coleta peixes na água. +Very poisonous=Muito venenoso From c6fc911c12603d253528e700980161ad4121d277 Mon Sep 17 00:00:00 2001 From: JoseDouglas26 Date: Fri, 1 Dec 2023 07:45:11 -0300 Subject: [PATCH 512/982] mcl_heads pt_BR translation --- mods/ITEMS/mcl_heads/locale/mcl_heads.pt_BR.tr | 11 +++++++++++ 1 file changed, 11 insertions(+) create mode 100644 mods/ITEMS/mcl_heads/locale/mcl_heads.pt_BR.tr diff --git a/mods/ITEMS/mcl_heads/locale/mcl_heads.pt_BR.tr b/mods/ITEMS/mcl_heads/locale/mcl_heads.pt_BR.tr new file mode 100644 index 000000000..fb256997a --- /dev/null +++ b/mods/ITEMS/mcl_heads/locale/mcl_heads.pt_BR.tr @@ -0,0 +1,11 @@ +# textdomain: mcl_heads +Zombie Head=Cabeça de Zumbi +A zombie head is a small decorative block which resembles the head of a zombie. It can also be worn as a helmet, which reduces the detection range of zombies by 50%.=Uma cabeça de zumbi é um pequeno bloco decorativo ao qual remete a cabeça de um zumbi. Também pode ser usado como um capacete, o que reduz o alcançe de detecção dos zumbis em 50%. +Creeper Head=Cabeça de Creeper +A creeper head is a small decorative block which resembles the head of a creeper. It can also be worn as a helmet, which reduces the detection range of creepers by 50%.=Uma cabeça de creeper é um pequeno bloco decorativo ao qual remete a cabeça de um creeper. Também pode ser usado como um capacete, o que reduz o alcançe de detecção dos creepers em 50%. +Human Head=Cabeça Humana +A human head is a small decorative block which resembles the head of a human (i.e. a player character). It can also be worn as a helmet for fun, but does not offer any protection.=Uma cabeça de humano é um pequeno bloco decorativo ao qual remete a cabeça de um humano (ou seja, o personagem do jogador). Também pode ser usado como um capacete por diversão, mas não oferece nenhuma proteção. +Skeleton Skull=Cabeça de Esqueleto +A skeleton skull is a small decorative block which resembles the skull of a skeleton. It can also be worn as a helmet, which reduces the detection range of skeletons by 50%.=Uma cabeça de esqueleto é um pequeno bloco decorativo ao qual remete a cabeça de um esqueleto. Também pode ser usado como um capacete, o que reduz o alcançe de detecção dos esqueletos em 50%. +Wither Skeleton Skull=Cabeça de Esqueleto Wither +A wither skeleton skull is a small decorative block which resembles the skull of a wither skeleton. It can also be worn as a helmet for fun, but does not offer any protection.=Uma cabeça de esqueleto wither é um pequeno bloco decorativo ao qual remete a cabeça de um esqueleto wither. Também pode ser usado como um capacete por diversão, mas não oferece nenhuma proteção. From e536822b4d1f095d8bd70257f7b7f3926b945675 Mon Sep 17 00:00:00 2001 From: JoseDouglas26 Date: Fri, 1 Dec 2023 08:09:15 -0300 Subject: [PATCH 513/982] mcl_tools pt_BR translation --- .../ITEMS/mcl_tools/locale/mcl_tools.pt_BR.tr | 36 +++++++++++++++++++ 1 file changed, 36 insertions(+) create mode 100644 mods/ITEMS/mcl_tools/locale/mcl_tools.pt_BR.tr diff --git a/mods/ITEMS/mcl_tools/locale/mcl_tools.pt_BR.tr b/mods/ITEMS/mcl_tools/locale/mcl_tools.pt_BR.tr new file mode 100644 index 000000000..a16b7868d --- /dev/null +++ b/mods/ITEMS/mcl_tools/locale/mcl_tools.pt_BR.tr @@ -0,0 +1,36 @@ +# textdomain: mcl_tools +You use your bare hand whenever you are not wielding any item. With your hand you can mine most blocks, but this is the slowest method and only the weakest blocks will yield their useful drop. The hand also deals minor damage by punching. Using the hand is often a last resort, as proper mining tools and weapons are much better.=Você usa sua mão nua sempre que não estiver segurando qualquer item. Com sua mão você pode minerar a maioria dos blocos, porém esse é o método mais lento e apenas os blocos mais fracos vão render seus drops úteis. A mão também dá o mínimo de dano quando soca. Usar a mão é muitas vezes o último recurso, uma vez que ferramentas de mineração apropriadas e armas são muito melhores. +When you are wielding an item which is not a mining tool or a weapon, it will behave as if it were the hand when you start mining or punching.=Quando você estiver segurando um item o qual não é uma ferramenta de mineração ou uma arma, este se comportará como se fosse a mão quando você começa a minerar ou socar. +In Creative Mode, the hand is able to break all blocks instantly.=No Modo Criativo, a mão é capaz de quebrar todos os blocos instantaneamente. +Pickaxes are mining tools to mine hard blocks, such as stone. A pickaxe can also be used as weapon, but it is rather inefficient.=Picaretas são ferramentas de mineração para minerar blocos duros, como rochas. Uma picareta também pode ser usada como arma, mas é bastante ineficiente. +An axe is your tool of choice to cut down trees, wood-based blocks and other blocks. Axes deal a lot of damage as well, but they are rather slow.=Um machado é sua ferramenta preferida para cortar árvores, blocos de madeira e outros blocos. Machados também dão muito dano, mas são bastante lentos. +Swords are great in melee combat, as they are fast, deal high damage and can endure countless battles. Swords can also be used to cut down a few particular blocks, such as cobwebs.=Espadas são excelentes no combate corpo a corpo, já que são rápidas, dão muito dano e podem suportar inúmeras batalhas. Espadas também podem ser usadas para cortar alguns blocos específicos, como as teias. +Shovels are tools for digging coarse blocks, such as dirt, sand and gravel. They can also be used to turn grass blocks to grass paths. Shovels can be used as weapons, but they are very weak.=Pás são ferramentas para cavar blocos grossos, como as terras, areias e cascalho. Também podem ser usadas para transformar blocos de grama em caminhos de grama. Pás podem ser usadas como armas, mas são muito fracas. +To turn a grass block into a grass path, hold the shovel in your hand, then use (rightclick) the top or side of a grass block. This only works when there's air above the grass block.=Para transformar um bloco de grama em um caminho de grama, segure a pá na sua mão, então use (clique com o botão direito) no topo ou lados de um bloco de grama. Isso só funcionará quando houver ar sobre o bloco de grama. +Shears are tools to shear sheep and to mine a few block types. Shears are a special mining tool and can be used to obtain the original item from grass, leaves and similar blocks that require cutting.=Tesouras são ferramentas para tosquear ovelhas e para minerar alguns tipos de blocos específicos. Tesouras são uma ferramenta de mineração especial e podem ser usadas para obter o item original da grama, folhas e blocos semelhantes que requerem corte. +To shear sheep or carve faceless pumpkins, use the “place” key on them. Faces can only be carved at the side of faceless pumpkins. Mining works as usual, but the drops are different for a few blocks.=Para tosquear ovelhas ou escavar abóboras, use a tecla "posicionar" neles. Rostos podem ser escavados na lateral das abóboras. Minerar funciona como de costume, porém os drops são diferentes para alguns blocos específicos. +Wooden Pickaxe=Picareta de Madeira +Stone Pickaxe=Picareta de Pedra +Iron Pickaxe=Picareta de Ferro +Golden Pickaxe=Picareta de Ouro +Diamond Pickaxe=Picareta de Diamante +Netherite Pickaxe=Picareta de Netherite +Wooden Shovel=Pá de Madeira +Stone Shovel=Pá de Pedra +Iron Shovel=Pá de Ferro +Golden Shovel=Pá de Ouro +Diamond Shovel=Pá de Diamante +Netherite Shovel=Pá de Netherite +Wooden Axe=Machado de Madeira +Stone Axe=Machado de Pedra +Iron Axe=Machado de Ferro +Golden Axe=Machado de Ouro +Diamond Axe=Machado de Diamante +Netherite Axe=Machado de Netherite +Wooden Sword=Espada de Madeira +Stone Sword=Espada de Pedra +Iron Sword=Espada de Ferro +Golden Sword=Espada de Ouro +Diamond Sword=Espada de Diamante +Netherite Sword=Espada de Netherite +Shears=Tesoura From 188f1cdaa6d3591a9d92de2236abc0a54fbe7457 Mon Sep 17 00:00:00 2001 From: JoseDouglas26 Date: Fri, 1 Dec 2023 08:59:52 -0300 Subject: [PATCH 514/982] mcl_itemframes pt_BR translation --- .../mcl_itemframes/locale/mcl_itemframes.pt_BR.tr | 10 ++++++++++ 1 file changed, 10 insertions(+) create mode 100644 mods/ITEMS/mcl_itemframes/locale/mcl_itemframes.pt_BR.tr diff --git a/mods/ITEMS/mcl_itemframes/locale/mcl_itemframes.pt_BR.tr b/mods/ITEMS/mcl_itemframes/locale/mcl_itemframes.pt_BR.tr new file mode 100644 index 000000000..4c55b470f --- /dev/null +++ b/mods/ITEMS/mcl_itemframes/locale/mcl_itemframes.pt_BR.tr @@ -0,0 +1,10 @@ +# textdomain: mcl_itemframes +Item Frame=Moldura +Item frames are decorative blocks in which items can be placed.=Molduras são blocos decorativos aos quais itens podem ser posicionadas. +Just place any item on the item frame. Use the item frame again to retrieve the item.=Apenas posicione qualquer item na moldura. Use a moldura de novo para pegar o item de volta. +Can hold an item.=Pode segurar um item. +Glowing Item Frame=Moldura Brilhante +Glowing item frames are decorative blocks in which items can be placed.=Molduras brilhantes são blocos decorativos aos quais itens podem ser posicionados. +Can hold an item and glows.=Pode segurar um item e brilha. +Glow and Behold!=Brilhe e Veja! +Craft a glow item frame.=Fabrique uma moldura brilhante. From 1c3003c85b1cf186d49866cfe0b0d899e965120d Mon Sep 17 00:00:00 2001 From: JoseDouglas26 Date: Fri, 1 Dec 2023 09:02:42 -0300 Subject: [PATCH 515/982] mcl_spawn pt_BR translation --- mods/PLAYER/mcl_spawn/locale/mcl_spawn.pt_BR.tr | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 mods/PLAYER/mcl_spawn/locale/mcl_spawn.pt_BR.tr diff --git a/mods/PLAYER/mcl_spawn/locale/mcl_spawn.pt_BR.tr b/mods/PLAYER/mcl_spawn/locale/mcl_spawn.pt_BR.tr new file mode 100644 index 000000000..414f10b9f --- /dev/null +++ b/mods/PLAYER/mcl_spawn/locale/mcl_spawn.pt_BR.tr @@ -0,0 +1,5 @@ +# textdomain: mcl_spawn +New respawn position set!=Nova posição de renascimento definida! +Respawn position cleared!=Posição de renascimento limpa! +Couldn't get level of your respawn anchor!=Não foi possível nivelar sua âncora de renascimento! +Your spawn bed was missing or blocked, and you had no charged respawn anchor!=Sua cama está faltando ou foi bloqueada, e você não carregou sua âncora de renascimento. From d57fbb047d45735fa24c079f3a45654bc1612180 Mon Sep 17 00:00:00 2001 From: JoseDouglas26 Date: Fri, 1 Dec 2023 09:17:30 -0300 Subject: [PATCH 516/982] mcl_sponges pt_BR translation --- mods/ITEMS/mcl_sponges/locale/mcl_sponges.pt_BR.tr | 10 ++++++++++ 1 file changed, 10 insertions(+) create mode 100644 mods/ITEMS/mcl_sponges/locale/mcl_sponges.pt_BR.tr diff --git a/mods/ITEMS/mcl_sponges/locale/mcl_sponges.pt_BR.tr b/mods/ITEMS/mcl_sponges/locale/mcl_sponges.pt_BR.tr new file mode 100644 index 000000000..e6a857347 --- /dev/null +++ b/mods/ITEMS/mcl_sponges/locale/mcl_sponges.pt_BR.tr @@ -0,0 +1,10 @@ +# textdomain: mcl_sponges +Sponge=Esponja +Sponges are blocks which remove water around them when they are placed or come in contact with water, turning it into a wet sponge.=Esponjas são blocos aos quais removem água ao seu redor quando elas são posicionadas ou entram em contato com a água, se transfomando em uma esponja molhada. +Waterlogged Sponge=Esponja Alagada +A waterlogged sponge can be dried in the furnace to turn it into (dry) sponge. When there's an empty bucket in the fuel slot of a furnace, the water will pour into the bucket.=Uma esponja alagada pode ser seca na fornalha para se tornar uma esponja (seca). Quando tem um balde vazio no slot de combustível da fornalha, a água irá se depositar dentro do balde. +Riverwaterlogged Sponge=Esponja Alagada em Rio +This is a sponge soaking wet with river water. It can be dried in the furnace to turn it into (dry) sponge. When there's an empty bucket in the fuel slot of the furnace, the river water will pour into the bucket.=Esta é uma esponja encharcada com água do rio. Uma esponja alagada em rio pode ser seca na fornalha para se tornar uma esponja (seca). Quando tem um balde vazio no slot de combustível da fornalha, a água de rio irá se depositar dentro do balde. +A sponge becomes riverwaterlogged (instead of waterlogged) if it sucks up more river water than (normal) water.=A esponja se torna alagada em rio (em vez de alagada) se esta sugar mais água de rio do que água (normal). +Removes water on contact=Remove água por contato +Can be dried in furnace=Pode ser secada na fornalha From 184a098964400531880b0aef236520de1cc3f65a Mon Sep 17 00:00:00 2001 From: JoseDouglas26 Date: Fri, 1 Dec 2023 09:19:47 -0300 Subject: [PATCH 517/982] mcl_torches pt_BR translation --- mods/ITEMS/mcl_torches/locale/mcl_torches.pt_BR.tr | 3 +++ 1 file changed, 3 insertions(+) create mode 100644 mods/ITEMS/mcl_torches/locale/mcl_torches.pt_BR.tr diff --git a/mods/ITEMS/mcl_torches/locale/mcl_torches.pt_BR.tr b/mods/ITEMS/mcl_torches/locale/mcl_torches.pt_BR.tr new file mode 100644 index 000000000..fc49b3a0f --- /dev/null +++ b/mods/ITEMS/mcl_torches/locale/mcl_torches.pt_BR.tr @@ -0,0 +1,3 @@ +# textdomain: mcl_torches +Torch=Tocha +Torches are light sources which can be placed at the side or on the top of most blocks.=Tochas são fontes de luz as quais podem ser posicionadas nas laterais ou na parte superior de muitos blocos. From 8b02d7b0b297511d7ee4db1114c3f66336b25a97 Mon Sep 17 00:00:00 2001 From: JoseDouglas26 Date: Fri, 1 Dec 2023 09:21:19 -0300 Subject: [PATCH 518/982] mcl_walls pt_BR translation fix --- mods/ITEMS/mcl_walls/locale/mcl_walls.pt_BR.tr | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mods/ITEMS/mcl_walls/locale/mcl_walls.pt_BR.tr b/mods/ITEMS/mcl_walls/locale/mcl_walls.pt_BR.tr index a344d88c0..8d06a55d1 100644 --- a/mods/ITEMS/mcl_walls/locale/mcl_walls.pt_BR.tr +++ b/mods/ITEMS/mcl_walls/locale/mcl_walls.pt_BR.tr @@ -11,7 +11,7 @@ Red Sandstone Wall=Muro de Arenito Vermelho Stone Brick Wall=Muro de Tijolos de Pedra Mossy Stone Brick Wall=Muro de Tijolos de Pedra Musgosos Prismarine Wall=Muro de Prismarinho -End Stone Brick Wall=Muro de Tijolos de Pedra do Fim +End Stone Brick Wall=Muro de Tijolos de Pedra do End Nether Brick Wall=Muro de Tijolos do Nether Red Nether Brick Wall=Muro de Tijolos Vermelhos do Nether Mud Brick Wall=Muro de Tijolos de Barro From 4a3369205e052ecb95187c50fc2823f63e30050b Mon Sep 17 00:00:00 2001 From: JoseDouglas26 Date: Fri, 1 Dec 2023 09:32:43 -0300 Subject: [PATCH 519/982] mcl_wool pt_BR translation --- mods/ITEMS/mcl_wool/locale/mcl_wool.pt_BR.tr | 37 ++++++++++++++++++++ 1 file changed, 37 insertions(+) create mode 100644 mods/ITEMS/mcl_wool/locale/mcl_wool.pt_BR.tr diff --git a/mods/ITEMS/mcl_wool/locale/mcl_wool.pt_BR.tr b/mods/ITEMS/mcl_wool/locale/mcl_wool.pt_BR.tr new file mode 100644 index 000000000..3ae9a6ce3 --- /dev/null +++ b/mods/ITEMS/mcl_wool/locale/mcl_wool.pt_BR.tr @@ -0,0 +1,37 @@ +# textdomain: mcl_wool +Wool=Lã +Carpet=Carpete +White Wool=Lã Branco +White Carpet=Carpete Branco +Grey Wool=Lã Cinza +Grey Carpet=Carpete Cinza +Light Grey Wool=Lã Cinza Claro +Light Grey Carpet=Carpete Cinza Claro +Black Wool=Lã Preto +Black Carpet=Carpete Preto +Red Wool=Lã Vermelho +Red Carpet=Carpete Vermelho +Yellow Wool=Lã Amarelo +Yellow Carpet=Carpete Amarelo +Green Wool=Lã Verde +Green Carpet=Carpete Verde +Cyan Wool=Lã Ciano +Cyan Carpet=Carpete Ciano +Blue Wool=Lã Azul +Blue Carpet=Carpete Azul +Magenta Wool=Lã Magenta +Magenta Carpet=Carpete Magenta +Orange Wool=Lã Laranja +Orange Carpet=Carpete Laranja +Purple Wool=Lã Roxo +Purple Carpet=Carpete Roxo +Brown Wool=Lã Marrom +Brown Carpet=Carpete Marrom +Pink Wool=Lã Rosa +Pink Carpet=Carpete Rosa +Lime Wool=Lã Lima +Lime Carpet=Carpete Lima +Light Blue Wool=Lã Azul Claro +Light Blue Carpet=Carpete Azul Claro +Wool is a decorative block which comes in many different colors.=Lã é um bloco decorativo ao qual vêm em várias cores diferentes. +Carpets are thin floor covers which come in many different colors.=Carpetes são coberturas finas para o piso aos quais vêm em diferentes cores. From 6dac6522410672b48f59bc593635a7a6d8be9986 Mon Sep 17 00:00:00 2001 From: JoseDouglas26 Date: Fri, 1 Dec 2023 09:35:52 -0300 Subject: [PATCH 520/982] mclx_core pt_BR translation --- mods/ITEMS/mclx_core/locale/mclx_core.pt_BR.tr | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 mods/ITEMS/mclx_core/locale/mclx_core.pt_BR.tr diff --git a/mods/ITEMS/mclx_core/locale/mclx_core.pt_BR.tr b/mods/ITEMS/mclx_core/locale/mclx_core.pt_BR.tr new file mode 100644 index 000000000..a6a8552c0 --- /dev/null +++ b/mods/ITEMS/mclx_core/locale/mclx_core.pt_BR.tr @@ -0,0 +1,5 @@ +# textdomain: mclx_core +River Water Source=Fonte de Água de Rio +River water has the same properties as water, but has a reduced flowing distance and is not renewable.=Água de rio têm as mesmas propriedades da água, mas tem uma distância de escoamento reduzido e não é renovável. +River Water=Água de Rio +Flowing River Water=Água Corrente de Rio From 3a89d367b06276858eb64b665d7b5db75bcef049 Mon Sep 17 00:00:00 2001 From: JoseDouglas26 Date: Fri, 1 Dec 2023 09:38:05 -0300 Subject: [PATCH 521/982] mclx_fences pt_BR translation --- mods/ITEMS/mclx_fences/locale/mclx_fences.pt_BR.tr | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 mods/ITEMS/mclx_fences/locale/mclx_fences.pt_BR.tr diff --git a/mods/ITEMS/mclx_fences/locale/mclx_fences.pt_BR.tr b/mods/ITEMS/mclx_fences/locale/mclx_fences.pt_BR.tr new file mode 100644 index 000000000..6de63f21d --- /dev/null +++ b/mods/ITEMS/mclx_fences/locale/mclx_fences.pt_BR.tr @@ -0,0 +1,4 @@ +# textdomain: mclx_fences +Red Nether Brick Fence=Cerca de Tijolos Vermelhos do Nether +Red Nether Brick Fence Gate=Portão de Tijolos Vermelhos do Nether +Nether Brick Fence Gate=Portão de Tijolos do Nether From 90a758c0023ff3becc168ff1b574bd8e936d45f3 Mon Sep 17 00:00:00 2001 From: JoseDouglas26 Date: Fri, 1 Dec 2023 09:50:00 -0300 Subject: [PATCH 522/982] mcl_lightning_rods pt_BR translation --- .../mcl_lightning_rods/locale/mcl_lightning_rods.pt_BR.tr | 3 +++ 1 file changed, 3 insertions(+) create mode 100644 mods/ITEMS/mcl_lightning_rods/locale/mcl_lightning_rods.pt_BR.tr diff --git a/mods/ITEMS/mcl_lightning_rods/locale/mcl_lightning_rods.pt_BR.tr b/mods/ITEMS/mcl_lightning_rods/locale/mcl_lightning_rods.pt_BR.tr new file mode 100644 index 000000000..4a57a6dbf --- /dev/null +++ b/mods/ITEMS/mcl_lightning_rods/locale/mcl_lightning_rods.pt_BR.tr @@ -0,0 +1,3 @@ +# textdomain: mcl_lightning_rods +Lightning Rod=Para-Raios +A block that attracts lightning=Um bloco que atrai raios From 908c46ce348183290138bb273888917332b4ff03 Mon Sep 17 00:00:00 2001 From: JoseDouglas26 Date: Fri, 1 Dec 2023 09:52:00 -0300 Subject: [PATCH 523/982] mcl_loom pt_BR translation --- mods/ITEMS/mcl_loom/locale/mcl_loom.pt_BR.tr | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 mods/ITEMS/mcl_loom/locale/mcl_loom.pt_BR.tr diff --git a/mods/ITEMS/mcl_loom/locale/mcl_loom.pt_BR.tr b/mods/ITEMS/mcl_loom/locale/mcl_loom.pt_BR.tr new file mode 100644 index 000000000..eef49ba0f --- /dev/null +++ b/mods/ITEMS/mcl_loom/locale/mcl_loom.pt_BR.tr @@ -0,0 +1,4 @@ +# textdomain: mcl_loom +Loom=Tear +Used to create banner designs=Usado para criar designs nos estandartes +This is the shepherd villager's work station. It is used to create banner designs.=Essa é a estação de trabalho do aldeão pastor. É usado para criar designs nos estandartes. From 487f78d66320c73c1817789c8370a69a6ea065f5 Mon Sep 17 00:00:00 2001 From: JoseDouglas26 Date: Fri, 1 Dec 2023 18:05:46 -0300 Subject: [PATCH 524/982] mcl_hunger pt_BR translation --- mods/PLAYER/mcl_hunger/locale/mcl_hunger.pt_BR.tr | 8 ++++++++ 1 file changed, 8 insertions(+) create mode 100644 mods/PLAYER/mcl_hunger/locale/mcl_hunger.pt_BR.tr diff --git a/mods/PLAYER/mcl_hunger/locale/mcl_hunger.pt_BR.tr b/mods/PLAYER/mcl_hunger/locale/mcl_hunger.pt_BR.tr new file mode 100644 index 000000000..c48a93090 --- /dev/null +++ b/mods/PLAYER/mcl_hunger/locale/mcl_hunger.pt_BR.tr @@ -0,0 +1,8 @@ +# textdomain: mcl_hunger +@1 succumbed to the poison.=@1 sucumbiu ao veneno. +Food=Comida +Saturation=Saturação +%s: %.1f/%d=%s: %.1f/%d +Exhaust.=Cansado. +%s: %d/%d=%s: %d/%d +@1 starved to death.=@1 morreu de fome. From 6480c6923acc6cb415b2da0167eefb343586be70 Mon Sep 17 00:00:00 2001 From: JoseDouglas26 Date: Fri, 1 Dec 2023 18:11:45 -0300 Subject: [PATCH 525/982] mcl_music pt_BR translation --- mods/PLAYER/mcl_music/locale/mcl_music.pt_BR.tr | 7 +++++++ 1 file changed, 7 insertions(+) create mode 100644 mods/PLAYER/mcl_music/locale/mcl_music.pt_BR.tr diff --git a/mods/PLAYER/mcl_music/locale/mcl_music.pt_BR.tr b/mods/PLAYER/mcl_music/locale/mcl_music.pt_BR.tr new file mode 100644 index 000000000..8e6f062b1 --- /dev/null +++ b/mods/PLAYER/mcl_music/locale/mcl_music.pt_BR.tr @@ -0,0 +1,7 @@ +# textdomain: mcl_music +You need the debug privilege in order to turn ingame music on or off for somebody else!=Você precisa do privilégio debug para poder ligar ou desligar a música para alguém! +Couldn't find player @1!=O jogador @1 não pôde ser localizado! +Set music for @1 to: @2=Definida música @1 para: @2 +Turns music for yourself or another player on or off.=Liga ou desliga a música para você ou outro jogador. +on=ligado +off=desligado From cb6b4253d28ee5c7be0e4d7c8b8754eb4a4253ba Mon Sep 17 00:00:00 2001 From: JoseDouglas26 Date: Fri, 1 Dec 2023 18:25:52 -0300 Subject: [PATCH 526/982] findbiome pt_BR translation --- mods/MISC/findbiome/locale/findbiome.pt_BR.tr | 10 ++++++++++ 1 file changed, 10 insertions(+) create mode 100644 mods/MISC/findbiome/locale/findbiome.pt_BR.tr diff --git a/mods/MISC/findbiome/locale/findbiome.pt_BR.tr b/mods/MISC/findbiome/locale/findbiome.pt_BR.tr new file mode 100644 index 000000000..5e9e3a6cb --- /dev/null +++ b/mods/MISC/findbiome/locale/findbiome.pt_BR.tr @@ -0,0 +1,10 @@ +# textdomain: findbiome +Find and teleport to biome=Encontra e teleporta para um bioma += +No player.=Nenhum jogador. +Biome does not exist!=Bioma não existe! +Biome found at @1.=Bioma encontrado em @1. +No biome found!=Nenhum bioma encontrado! +List all biomes=Lista de todos os biomas +No biomes.=Nenhum bioma. +Not supported. The “biomeinfo” mod is required for v6 mapgen support!=Não suportado. O mod "biomeinfo" é necessário para o suporte da mapgen v6! From cde4bc797e47b7db189c669b1e96899ba23a1f69 Mon Sep 17 00:00:00 2001 From: JoseDouglas26 Date: Fri, 1 Dec 2023 18:34:19 -0300 Subject: [PATCH 527/982] mcl_commands pt_BR translation --- .../mcl_commands/locale/mcl_commands.pt_BR.tr | 23 +++++++++++++++++++ 1 file changed, 23 insertions(+) create mode 100644 mods/MISC/mcl_commands/locale/mcl_commands.pt_BR.tr diff --git a/mods/MISC/mcl_commands/locale/mcl_commands.pt_BR.tr b/mods/MISC/mcl_commands/locale/mcl_commands.pt_BR.tr new file mode 100644 index 000000000..df12b27fe --- /dev/null +++ b/mods/MISC/mcl_commands/locale/mcl_commands.pt_BR.tr @@ -0,0 +1,23 @@ +# textdomain: mcl_commands +Players can't be killed right now, damage has been disabled.= +Player @1 does not exist.=Jogador @1 não existe. +You are already dead=Você já está morto +@1 is already dead=@1 já está morto +@1 committed suicide.=@1 cometeu suícidio. +@1 was killed by @2.=@1 foi morto(a) por @2. +[]=[] +Kill player or yourself=Mata jogadores ou você mesmo +Can use /say=Pode usar /say += +Send a message to every player=Envia uma mensagem para todos os jogadores +Invalid usage, see /help say.=Uso inválido, veja /help say. +,, = ,, +Set node at given position=Define um node na posição dada +Invalid node=Node inválido +@1 spawned.=@1 nasceu. +Invalid parameters (see /help setblock)=Parâmetros inválidos (veja /help setblock) +List bans=Lista banimentos +Ban list: @1=Lista de banimento: @1 +Show who is logged on=Mostra quem está logado +Displays the world seed=Mostra a semente do mundo +Only peaceful mobs allowed!=Apenas mobs pacíficos permitidos! From fcd4a610e596d21f60229b6de10dc5a1cb44d203 Mon Sep 17 00:00:00 2001 From: JoseDouglas26 Date: Fri, 1 Dec 2023 18:35:23 -0300 Subject: [PATCH 528/982] mcl_commands pt_BR translation missing --- mods/MISC/mcl_commands/locale/mcl_commands.pt_BR.tr | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mods/MISC/mcl_commands/locale/mcl_commands.pt_BR.tr b/mods/MISC/mcl_commands/locale/mcl_commands.pt_BR.tr index df12b27fe..5a2688d67 100644 --- a/mods/MISC/mcl_commands/locale/mcl_commands.pt_BR.tr +++ b/mods/MISC/mcl_commands/locale/mcl_commands.pt_BR.tr @@ -1,5 +1,5 @@ # textdomain: mcl_commands -Players can't be killed right now, damage has been disabled.= +Players can't be killed right now, damage has been disabled.=Jogadores não podem ser mortos agora, dano foi desabilitado. Player @1 does not exist.=Jogador @1 não existe. You are already dead=Você já está morto @1 is already dead=@1 já está morto From d7c8c7a54ad8966149fff8e2e88592db73d5d138 Mon Sep 17 00:00:00 2001 From: JoseDouglas26 Date: Fri, 1 Dec 2023 18:37:35 -0300 Subject: [PATCH 529/982] mcl_privs pt_BR translation --- mods/MISC/mcl_privs/locale/mcl_privs.pt_BR.tr | 2 ++ 1 file changed, 2 insertions(+) create mode 100644 mods/MISC/mcl_privs/locale/mcl_privs.pt_BR.tr diff --git a/mods/MISC/mcl_privs/locale/mcl_privs.pt_BR.tr b/mods/MISC/mcl_privs/locale/mcl_privs.pt_BR.tr new file mode 100644 index 000000000..fe57673f4 --- /dev/null +++ b/mods/MISC/mcl_privs/locale/mcl_privs.pt_BR.tr @@ -0,0 +1,2 @@ +# textdomain: mcl_privs +Can place and use advanced blocks like mob spawners, command blocks and barriers.=Pode posicionar e usar blocos avançados como geradores de mobs, blocos de comandos e barreiras. From 3e131a213f9eff8e7fe4ea98fd5acbd76241c575 Mon Sep 17 00:00:00 2001 From: JoseDouglas26 Date: Fri, 1 Dec 2023 18:41:41 -0300 Subject: [PATCH 530/982] mcl_villages pt_BR translation --- mods/MAPGEN/mcl_villages/locale/mcl_villages.pt_BR.tr | 3 +++ 1 file changed, 3 insertions(+) create mode 100644 mods/MAPGEN/mcl_villages/locale/mcl_villages.pt_BR.tr diff --git a/mods/MAPGEN/mcl_villages/locale/mcl_villages.pt_BR.tr b/mods/MAPGEN/mcl_villages/locale/mcl_villages.pt_BR.tr new file mode 100644 index 000000000..bded6250d --- /dev/null +++ b/mods/MAPGEN/mcl_villages/locale/mcl_villages.pt_BR.tr @@ -0,0 +1,3 @@ +# textdomain: mcl_villages +Chiseled Stone Village Bricks=Tijolos de Aldeia de Pedra Cinzelada +mcl_villages build tool=ferramenta de construção mcl_villages From 3f0e77b97158d71a61d1004f9a51eab65d31892f Mon Sep 17 00:00:00 2001 From: JoseDouglas26 Date: Fri, 1 Dec 2023 18:52:32 -0300 Subject: [PATCH 531/982] mcl_bamboo pt_BR translation --- .../mcl_bamboo/locale/mcl_bamboo.pt_BR.tr | 46 +++++++++++++++++++ 1 file changed, 46 insertions(+) create mode 100644 mods/ITEMS/mcl_bamboo/locale/mcl_bamboo.pt_BR.tr diff --git a/mods/ITEMS/mcl_bamboo/locale/mcl_bamboo.pt_BR.tr b/mods/ITEMS/mcl_bamboo/locale/mcl_bamboo.pt_BR.tr new file mode 100644 index 000000000..8517b0cbe --- /dev/null +++ b/mods/ITEMS/mcl_bamboo/locale/mcl_bamboo.pt_BR.tr @@ -0,0 +1,46 @@ +# textdomain: mcl_bamboo + +### bamboo_base.lua ### + +Bamboo=Bambu +Bamboo Mosaic Plank=Mosaico de Tábuas de Bambu +Bamboo Plank=Tábuas de Bambu +Stripped Bamboo Block=Bloco de Bambu Descascado +Bamboo Block=Bloco de Bambu + +### bamboo_items.lua ### + +A bamboo button is a redstone component made out of bamboo which can be pushed to provide redstone power. When pushed, it powers adjacent redstone components for 1 second.=Um botão de bambu é um componente de redstone feito de bambu ao qual pode ser empurrado para providenciar carga de redstone. Quando empurrado, energiza componentes de redstone adjacentes por 1 segundo. + +A wooden pressure plate is a redstone component which supplies its surrounding blocks with redstone power while any movable object (including dropped items, players and mobs) rests on top of it.=Uma placa de pressão de madeira é um componente de redstone ao qual alimenta os blocos ao seu redor com uma carga de redstone enquanto qualquer objeto móvel (incluindo itens largados, jogadores e mobs) parar em cima dela. + +Bamboo=Bambu +Bamboo Button=Botão de Bambu +Bamboo Door=Porta de Bambu +Bamboo Fence=Cerca de Bambu +Bamboo Fence Gate=Portão de Bambu +Bamboo Mosaic Slab=Laje de Mosaico de Bambu +Bamboo Mosaic Stair=Escada de Mosaico de Bambu +Bamboo Plank Slab=Laje de Tábuas de Bambu +Bamboo Plank Stair=Escada de Tábuas de Bambu +Bamboo Pressure Plate=Placa de Pressão de Bambu +Bamboo Sign=Placa de Bambu +Bamboo Slab=Laje de Bambu +Bamboo Stair=Escada de Bambu +Bamboo Trapdoor=Alçapão de Bambu +Double Bamboo Mosaic Slab=Laje Dupla de Mosaico de Bambu +Double Bamboo Plank Slab=Laje Dupla de Tábuas de Bambu +Double Bamboo Slab=Laje Dupla de Bambu +Double Stripped Bamboo Slab=Laje Dupla de Bambu Descascado +Scaffolding=Andaime +Scaffolding (horizontal)=Andaime (horizontal) +Scaffolding block used to climb up or out across areas.=Bloco de andaime é usado para escalar ou cruzar áreas. +Stripped Bamboo Slab=Laje de Bambu Descascado +Stripped Bamboo Stair=Escada de Bambu Descascado + +To open or close the trapdoor, rightclick it or send a redstone signal to it.=Para abrir ou fechar o alçapão, clique com o botão direito ou mande-o um sinal de redstone. + +Wooden trapdoors are horizontal barriers which can be opened and closed by hand or a redstone signal. They occupy the upper or lower part of a block, depending on how they have been placed. When open, they can be climbed like a ladder.=Alçapões de madeira são barreiras horizontais as quais podem ser abertas ou fechadas com a mão ou um sinal de redstone. Eles ocupam a parte superior ou inferior de um bloco, dependendo de como eles são posicionados. Quando abertos, eles são escaláveis como uma escada. + +Wooden doors are 2-block high barriers which can be opened or closed by hand and by a redstone signal.=Portas de madeira são barreiras de 2 blocos de altura as quais podem ser abertas ou fechadas com a mão ou um sinal de redstone. +To open or close a wooden door, rightclick it or supply its lower half with a redstone signal.=Para abrir ou fechar uma porta de madeira, clique com o botão direito nela ou alimente sua metade inferior com um sinal de redstone. From 0638c67cf702a85242fce65ad599ccdf4a2e11ed Mon Sep 17 00:00:00 2001 From: JoseDouglas26 Date: Fri, 1 Dec 2023 18:57:01 -0300 Subject: [PATCH 532/982] mcl_shields pt_BR translation --- .../mcl_shields/locale/mcl_shields.pt_BR.tr | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) create mode 100644 mods/ITEMS/mcl_shields/locale/mcl_shields.pt_BR.tr diff --git a/mods/ITEMS/mcl_shields/locale/mcl_shields.pt_BR.tr b/mods/ITEMS/mcl_shields/locale/mcl_shields.pt_BR.tr new file mode 100644 index 000000000..1f3c3f09e --- /dev/null +++ b/mods/ITEMS/mcl_shields/locale/mcl_shields.pt_BR.tr @@ -0,0 +1,19 @@ +# textdomain: mcl_shields +Shield=Escudo +A shield is a tool used for protecting the player against attacks.=Um escudo é uma ferramenta usada para a proteção do jogador contra ataques. +White Shield=Escudo Branco +Grey Shield=Escudo Cinza +Light Grey Shield=Escudo Cinza Claro +Black Shield=Escudo Preto +Red Shield=Escudo Vermelho +Yellow Shield=Escudo Amarelo +Green Shield=Escudo Verde +Cyan Shield=Escudo Ciano +Blue Shield=Escudo Azul +Magenta Shield=Escudo Magenta +Orange Shield=Escudo Laranja +Purple Shield=Escudo Roxo +Brown Shield=Escudo Marrom +Pink Shield=Escudo Rosa +Lime Shield=Escudo Lima +Light Blue Shield=Escudo Azul Claro From 8b1ad1c217af9adfc48d18173bde209e81e7e7cd Mon Sep 17 00:00:00 2001 From: JoseDouglas26 Date: Fri, 1 Dec 2023 19:01:20 -0300 Subject: [PATCH 533/982] mcl_smithing_table pt_BR translation --- .../mcl_smithing_table/locale/mcl_smithing_table.pt_BR.tr | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 mods/ITEMS/mcl_smithing_table/locale/mcl_smithing_table.pt_BR.tr diff --git a/mods/ITEMS/mcl_smithing_table/locale/mcl_smithing_table.pt_BR.tr b/mods/ITEMS/mcl_smithing_table/locale/mcl_smithing_table.pt_BR.tr new file mode 100644 index 000000000..065d5faba --- /dev/null +++ b/mods/ITEMS/mcl_smithing_table/locale/mcl_smithing_table.pt_BR.tr @@ -0,0 +1,4 @@ +# textdomain: mcl_smithing_table +Inventory=Inventário +Upgrade Gear=Atualizar Equipamento +Smithing table=Mesa de ferraria From ae470f8809caa2b93b09b52e329f3c62a7dc51c4 Mon Sep 17 00:00:00 2001 From: JoseDouglas26 Date: Fri, 1 Dec 2023 19:18:19 -0300 Subject: [PATCH 534/982] mcl_armor pt_BR translation missing --- mods/ITEMS/mcl_armor/locale/mcl_armor.pt_BR.tr | 3 +++ 1 file changed, 3 insertions(+) diff --git a/mods/ITEMS/mcl_armor/locale/mcl_armor.pt_BR.tr b/mods/ITEMS/mcl_armor/locale/mcl_armor.pt_BR.tr index b12f07026..6ce4997db 100644 --- a/mods/ITEMS/mcl_armor/locale/mcl_armor.pt_BR.tr +++ b/mods/ITEMS/mcl_armor/locale/mcl_armor.pt_BR.tr @@ -46,3 +46,6 @@ Reduces most types of damage by 4% for each level.=Reduz a maioria dos tipos de Thorns=Espinhos Reflects some of the damage taken when hit, at the cost of reducing durability with each proc.=Reflete parte do dano tomado aos custos de reduzir a durabilidade com cada uso. Aqua Affinity=Afinidade Aqua + +#Translations for armor trims +Smithing Template '@1'=Molde de Ferraria From bc186560b4f07fdfa27641976adfb506e8100e69 Mon Sep 17 00:00:00 2001 From: JoseDouglas26 Date: Fri, 1 Dec 2023 21:06:52 -0300 Subject: [PATCH 535/982] mcl_hamburger pt_BR translation --- mods/ITEMS/mcl_hamburger/locale/mcl_hamburger.pt_BR.tr | 10 ++++++++++ 1 file changed, 10 insertions(+) create mode 100644 mods/ITEMS/mcl_hamburger/locale/mcl_hamburger.pt_BR.tr diff --git a/mods/ITEMS/mcl_hamburger/locale/mcl_hamburger.pt_BR.tr b/mods/ITEMS/mcl_hamburger/locale/mcl_hamburger.pt_BR.tr new file mode 100644 index 000000000..63f37d579 --- /dev/null +++ b/mods/ITEMS/mcl_hamburger/locale/mcl_hamburger.pt_BR.tr @@ -0,0 +1,10 @@ +# textdomain: mcl_hamburger +A Hamburger=Hambúrguer + +A tasty hamburger that is sure to lure villagers around like a lead. Can be eaten.=Um hambúrguer saboroso certamente atrairá os aldeões como um laço. Pode ser comido. + +A tasty hamburger that is sure to lure villagers. 'I'll gladly pay you Tuesday, for a hamburger today.' - Wimpy.=Um hambúrguer saboroso certamente atrairá os aldeões.'Pagarei com prazer na terça-feira, por um hambúrguer hoje.' - Wimpy. + +Burger Time!=Hora do Hambúrguer! +Craft a Hamburger.=Fabrique um hambúrguer. +Wield this item to pull villagers to you.=Segure esse item para atrair aldeões até você. From 8afa57b914d155d8634b2844f78e0ba238912a06 Mon Sep 17 00:00:00 2001 From: JoseDouglas26 Date: Fri, 1 Dec 2023 21:39:44 -0300 Subject: [PATCH 536/982] mcl_sus_stew pt_BR translation --- mods/ITEMS/mcl_sus_stew/locale/mcl_sus_stew.pt_BR.tr | 2 ++ 1 file changed, 2 insertions(+) create mode 100644 mods/ITEMS/mcl_sus_stew/locale/mcl_sus_stew.pt_BR.tr diff --git a/mods/ITEMS/mcl_sus_stew/locale/mcl_sus_stew.pt_BR.tr b/mods/ITEMS/mcl_sus_stew/locale/mcl_sus_stew.pt_BR.tr new file mode 100644 index 000000000..ece9c8301 --- /dev/null +++ b/mods/ITEMS/mcl_sus_stew/locale/mcl_sus_stew.pt_BR.tr @@ -0,0 +1,2 @@ +# textdomain: mcl_sus_stew +Suspicious Stew=Ensopado Suspeito From 7f36116146b83f6e14c18bcd7e8b07c0dba46103 Mon Sep 17 00:00:00 2001 From: JoseDouglas26 Date: Fri, 1 Dec 2023 21:42:50 -0300 Subject: [PATCH 537/982] screwdriver pt_BR translation --- mods/ITEMS/screwdriver/locale/screwdriver.pt_BR.tr | 2 ++ 1 file changed, 2 insertions(+) create mode 100644 mods/ITEMS/screwdriver/locale/screwdriver.pt_BR.tr diff --git a/mods/ITEMS/screwdriver/locale/screwdriver.pt_BR.tr b/mods/ITEMS/screwdriver/locale/screwdriver.pt_BR.tr new file mode 100644 index 000000000..feb7ac77b --- /dev/null +++ b/mods/ITEMS/screwdriver/locale/screwdriver.pt_BR.tr @@ -0,0 +1,2 @@ +# textdomain: screwdriver +Screwdriver=Chave de Fenda From bd19c8fe679191dd6818a79aa59293d9d6ec2db4 Mon Sep 17 00:00:00 2001 From: JoseDouglas26 Date: Fri, 1 Dec 2023 21:54:56 -0300 Subject: [PATCH 538/982] mcl_mud pt_BR translation --- mods/ITEMS/mcl_mud/locale/mcl_mud.pt_BR.tr | 7 +++++++ 1 file changed, 7 insertions(+) create mode 100644 mods/ITEMS/mcl_mud/locale/mcl_mud.pt_BR.tr diff --git a/mods/ITEMS/mcl_mud/locale/mcl_mud.pt_BR.tr b/mods/ITEMS/mcl_mud/locale/mcl_mud.pt_BR.tr new file mode 100644 index 000000000..c3b5edf0e --- /dev/null +++ b/mods/ITEMS/mcl_mud/locale/mcl_mud.pt_BR.tr @@ -0,0 +1,7 @@ +# textdomain: mcl_mud +Mud=Barro +Mud is a decorative block that generates in mangrove swamps. Mud can also be obtained by using water bottles on dirt or coarse dirt.=Barro é um bloco decorativo gerado em manguezais. Barro também pode ser obtido usando garrafas de água em blocos de terra ou terra infértil. +Packed Mud=Barro Seco +Packed mud is a decorative block used to craft mud bricks.=Barro seco é um bloco decorativo usado para fabricar tijolos de barro. +Mud Bricks=Tijolos de Barro +Decorative block crafted from packed mud.=Bloco decorativo fabricado a partir de barro seco. From e291d9918e8f61a62841dbdf5af5018bcd89f7f7 Mon Sep 17 00:00:00 2001 From: JoseDouglas26 Date: Fri, 1 Dec 2023 22:15:05 -0300 Subject: [PATCH 539/982] mcl_stonecutter pt_BR translation --- mods/ITEMS/mcl_stonecutter/locale/mcl_stonecutter.pt_BR.tr | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 mods/ITEMS/mcl_stonecutter/locale/mcl_stonecutter.pt_BR.tr diff --git a/mods/ITEMS/mcl_stonecutter/locale/mcl_stonecutter.pt_BR.tr b/mods/ITEMS/mcl_stonecutter/locale/mcl_stonecutter.pt_BR.tr new file mode 100644 index 000000000..7b52a2507 --- /dev/null +++ b/mods/ITEMS/mcl_stonecutter/locale/mcl_stonecutter.pt_BR.tr @@ -0,0 +1,4 @@ +# textdomain: mcl_stonecutter +Stone Cutter=Cortador de Pedras +Used to cut stone like materials.=Usado para cortar materiais rochosos. +Stonecutters are used to create stairs and slabs from stone like materials. It is also the jobsite for the Stone Mason Villager.=Cortadores de pedras são usados para criar certas escadas e lajes a partir de materiais rochosos. Também é a estação de trabalho do aldeão pedreiro. From 8816e9fc61d18657341bb35f49d59f248449a554 Mon Sep 17 00:00:00 2001 From: JoseDouglas26 Date: Sat, 2 Dec 2023 10:15:46 -0300 Subject: [PATCH 540/982] mcl_throwing pt_BR translation --- mods/ITEMS/mcl_throwing/locale/mcl_throwing.pt_BR.tr | 12 ++++++++++++ 1 file changed, 12 insertions(+) create mode 100644 mods/ITEMS/mcl_throwing/locale/mcl_throwing.pt_BR.tr diff --git a/mods/ITEMS/mcl_throwing/locale/mcl_throwing.pt_BR.tr b/mods/ITEMS/mcl_throwing/locale/mcl_throwing.pt_BR.tr new file mode 100644 index 000000000..8cdaff4d5 --- /dev/null +++ b/mods/ITEMS/mcl_throwing/locale/mcl_throwing.pt_BR.tr @@ -0,0 +1,12 @@ +# textdomain: mcl_throwing +@1 used the ender pearl too often.=@1 usou a pérola do ender muitas vezes. +Use the punch key to throw.=Use o botão de soco para arremessar. +Snowball=Bola de Neve +Snowballs can be thrown or launched from a dispenser for fun. Hitting something with a snowball does nothing.=Bolas de neve podem ser arremessadas ou lançadas a partir de um ejetor por diversão. Atingir coisas com bolas de neve não fará coisa alguma. +Egg=Ovo +Eggs can be thrown or launched from a dispenser and breaks on impact. There is a small chance that 1 or even 4 chicks will pop out of the egg.=Ovos podem ser arremessados ou lançados a partir de um ejetor e quebra no impacto. Existe uma pequena chance de 1 ou até 4 pintinhos aparecerem desse ovo. +Ender Pearl=Pérola do Ender +An ender pearl is an item which can be used for teleportation at the cost of health. It can be thrown and teleport the thrower to its impact location when it hits a solid block or a plant. Each teleportation hurts the user by 5 hit points.=Uma pérola do ender é um item ao qual pode ser usado para teleporte ao custo de saúde. Pode ser arremessada e teleporta o arremessador para seu local de impacto quando acerta um bloco sólido ou uma planta. Cada teleporte machuca o usuário em 5 pontos de dano. +Throwable=Arremesaável +Chance to hatch chicks when broken=Chance de eclodir pintinhos quando quebrado +Teleports you on impact for cost of 5 HP=Teleporta você no impacto ao custo de 5 HP From 8f3936792fbd5e7b3cae7fe9a8c1f0b2152d283d Mon Sep 17 00:00:00 2001 From: JoseDouglas26 Date: Sat, 2 Dec 2023 10:28:44 -0300 Subject: [PATCH 541/982] mcl_cocoas pt_BR translation missing --- mods/ITEMS/mcl_cocoas/locale/mcl_cocoas.pt_BR.tr | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/mods/ITEMS/mcl_cocoas/locale/mcl_cocoas.pt_BR.tr b/mods/ITEMS/mcl_cocoas/locale/mcl_cocoas.pt_BR.tr index 4501fc1be..41336b19f 100644 --- a/mods/ITEMS/mcl_cocoas/locale/mcl_cocoas.pt_BR.tr +++ b/mods/ITEMS/mcl_cocoas/locale/mcl_cocoas.pt_BR.tr @@ -1,4 +1,8 @@ # textdomain: mcl_cocoas +Cocoa Beans=Sementes de Cacau +Grows at the side of jungle trees=Cresce nas laterais de árvores da selva. +Cocoa beans can be used to plant cocoa, bake cookies or craft brown dye.=Sementes de cacau podem ser usadas para plantar cacau, cozinhar biscoitos e fabricar corante marrom. +Right click on the side of a jungle tree trunk (Jungle Wood) to plant a young cocoa.=Clique com o botão direito na lateral de um tronco de árvore da selva (Madeira da Selva) para plantar um cacau jovem. Premature Cocoa Pod=Vagem de Cacau Prematuro Cocoa pods grow on the side of jungle trees in 3 stages.=Vagens de cacau crescem ao lado de árvores de selva em 3 estágios. Medium Cocoa Pod=Vagem de Cacau Média From b476c703f103b809f8709f50601bbb62c1fc3dd3 Mon Sep 17 00:00:00 2001 From: JoseDouglas26 Date: Sat, 2 Dec 2023 10:37:42 -0300 Subject: [PATCH 542/982] mcl_lectern pt_BR translation --- mods/ITEMS/mcl_lectern/locale/mcl_lectern.pt_BR.tr | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 mods/ITEMS/mcl_lectern/locale/mcl_lectern.pt_BR.tr diff --git a/mods/ITEMS/mcl_lectern/locale/mcl_lectern.pt_BR.tr b/mods/ITEMS/mcl_lectern/locale/mcl_lectern.pt_BR.tr new file mode 100644 index 000000000..58b0e693d --- /dev/null +++ b/mods/ITEMS/mcl_lectern/locale/mcl_lectern.pt_BR.tr @@ -0,0 +1,4 @@ +# textdomain: mcl_lectern +Lectern=Atril +Lecterns not only look good, but are job site blocks for Librarians.=Atris não apenas são bonitos, mas são a estação de trabalho dos Bibliotecários. +Place the Lectern on a solid node for best results. May attract villagers, so it's best to place outside of where you call 'home'.=Posicione o atril em um bloco sólido para melhores resultados. Talvez atraia aldeões, então é melhor posicioná-lo do lado de fora do que você chama de 'lar'. From 2d5b57c60df737d40f4bbc581eb7b910f3cbb573 Mon Sep 17 00:00:00 2001 From: JoseDouglas26 Date: Sat, 2 Dec 2023 10:42:25 -0300 Subject: [PATCH 543/982] mcl_experience pt_BR translation --- mods/HUD/mcl_experience/locale/mcl_experience.pt_BR.tr | 8 ++++++++ 1 file changed, 8 insertions(+) create mode 100644 mods/HUD/mcl_experience/locale/mcl_experience.pt_BR.tr diff --git a/mods/HUD/mcl_experience/locale/mcl_experience.pt_BR.tr b/mods/HUD/mcl_experience/locale/mcl_experience.pt_BR.tr new file mode 100644 index 000000000..0a7cef5dd --- /dev/null +++ b/mods/HUD/mcl_experience/locale/mcl_experience.pt_BR.tr @@ -0,0 +1,8 @@ +# textdomain: mcl_experience +[[] ]=[[] ] +Gives a player some XP=Dá algum XP a um jogador +Error: Too many parameters!=Erro: Muitos parâmetros +Error: Incorrect value of XP=Erro: Valor incorreto de XP +Error: Player not found=Erro: Jogador não encontrado +Added @1 XP to @2, total: @3, experience level: @4=Adicionado @1 XP para @2, total: @3, nível de experiência: @4 +Bottle o' Enchanting=Frasco de Experiência From 00bf5f0331b70ac5cd62d8bfeb0ff997cfdc723d Mon Sep 17 00:00:00 2001 From: JoseDouglas26 Date: Sat, 2 Dec 2023 10:49:53 -0300 Subject: [PATCH 544/982] mcl_smoker pt_BR translation --- mods/ITEMS/mcl_smoker/locale/mcl_smoker.pt_BR.tr | 11 +++++++++++ 1 file changed, 11 insertions(+) create mode 100644 mods/ITEMS/mcl_smoker/locale/mcl_smoker.pt_BR.tr diff --git a/mods/ITEMS/mcl_smoker/locale/mcl_smoker.pt_BR.tr b/mods/ITEMS/mcl_smoker/locale/mcl_smoker.pt_BR.tr new file mode 100644 index 000000000..4820d01bf --- /dev/null +++ b/mods/ITEMS/mcl_smoker/locale/mcl_smoker.pt_BR.tr @@ -0,0 +1,11 @@ +# textdomain: mcl_smoker +Inventory=Inventário +Smoker=Defumador +Cooks food faster than furnace=Cozinha comida mais rápido que a fornalha +Use the smoker to open the furnace menu.=Use o defumador para abrir o menu de fornalha. +Place a furnace fuel in the lower slot and the source material in the upper slot.=Posicione um combustível de fornalha no slot mais abaixo e o material fonte no slot mais acima. +The smoker will slowly use its fuel to smelt the item.=O defumador usará seu combustível lentamente para cozinhar o item. +The result will be placed into the output slot at the right side.=O resultado será posicionado no slot de saída no lado direito. +Use the recipe book to see what foods you can smelt, what you can use as fuel and how long it will burn.=Use o livro de receitas para ver quais comidas você pode cozinhar, quais combustíveis você pode usar e por quanto tempo irá queimar. +Smokers cook several items, mainly raw foods, into cooked foods, but twice as fast as a normal furnace.=Defumadores cozinham muitos itens, principalmente comidas cruas, em comida cozida, mas duas vezes mais rápido que uma fornalha normal. +Burning Smoker=Defumador Ativo From 2a8da574f02c2b3574c6142de16fdacd9ae42cfe Mon Sep 17 00:00:00 2001 From: JoseDouglas26 Date: Sat, 2 Dec 2023 23:18:34 -0300 Subject: [PATCH 545/982] mcl_ocean pt_BR translation --- .../ITEMS/mcl_ocean/locale/mcl_ocean.pt_BR.tr | 60 +++++++++++++++++++ 1 file changed, 60 insertions(+) create mode 100644 mods/ITEMS/mcl_ocean/locale/mcl_ocean.pt_BR.tr diff --git a/mods/ITEMS/mcl_ocean/locale/mcl_ocean.pt_BR.tr b/mods/ITEMS/mcl_ocean/locale/mcl_ocean.pt_BR.tr new file mode 100644 index 000000000..2e522e1b5 --- /dev/null +++ b/mods/ITEMS/mcl_ocean/locale/mcl_ocean.pt_BR.tr @@ -0,0 +1,60 @@ +# textdomain: mcl_ocean +Sea Lantern=Lanterna do Mar +Sea lanterns are decorative light sources which look great underwater but can be placed anywhere.=Lanternas do mar são fontes de luz decorativas as quais ficam bonitas em baixo d'água mas podem ser posicionadas em qualquer lugar. +Prismarine=Prismarinho +Prismarine is used as a building block. It slowly changes its color.=Prismarinho é usado como um bloco de costrução. Muda de cor lentamente. +Prismarine Bricks=Tijolos de Prismarinho +Dark Prismarine=Prismarinho Escuro +Prismarine Crystals=Cristais de Prismarinho +Prismarine Shard=Fragmentos de Prismarinho +Dried Kelp=Alga Seca +Dried Kelp Block=Bloco de Alga Seca +Brain Coral Block=Bloco de Coral-de-Cérebro +Brain Coral Fan=Gorgônia-de-Cérebro +Brain Coral=Coral-de-Cérebro +Bubble Coral Block=Bloco de Coral-de-Bolha +Bubble Coral Fan=Gorgônia-de-Bolha +Bubble Coral=Coral-de-Bolha +Fire Coral Block=Bloco de Coral-de-Fogo +Fire Coral Fan=Gorgônia-de-Fogo +Fire Coral=Coral-de-Fogo +Horn Coral Block=Bloco de Coral-de-Chifre +Horn Coral Fan=Gorgônia-de-Chifre +Horn Coral=Coral-de-Chifre +Tube Coral Block=Bloco de Coral-de-Tubo +Tube Coral Fan=Gorgônia-de-Tubo +Tube Coral=Coral-de-Tubo +Dead Brain Coral Block=Bloco de Coral-de-Cérebro Morto +Dead Brain Coral Fan=Gorgônia-de-Cérebro Morta +Dead Brain Coral=Coral-de-Cérebro Morto +Dead Bubble Coral Block=Bloco de Coral-de-Bolha Morto +Dead Bubble Coral Fan=Gorgônia-de-Bolha Morta +Dead Bubble Coral=Coral-de-Bolha Morto +Dead Fire Coral Block=Bloco de Coral-de-Fogo Morto +Dead Fire Coral Fan=Gorgônia-de-Fogo Morta +Dead Fire Coral=Coral-de-Fogo Morto +Dead Horn Coral Block=Bloco de Coral-de-Chifre Morto +Dead Horn Coral Fan=Gorgônia-de-Chifre Morta +Dead Horn Coral=Coral-de-Chifre Morto +Dead Tube Coral Block=Bloco de Coral-de-Tubo Morto +Dead Tube Coral Fan=Gorgônia-de-Tubo Morta +Dead Tube Coral=Coral-de-Tubo Morto +Seagrass=Grama Marinha +Kelp=Alga +Kelp grows inside water on top of dirt, sand or gravel.=Alga cresce dentro da água sobre terra, areia ou cascalho. +Coral blocks live in the oceans and need a water source next to them to survive. Without water, they die off.=Blocos de corais vivem em oceanos e precisam de uma fonte de água próxima para sobreviver. Sem água, eles morrem. +Corals grow on top of coral blocks and need to be inside a water source to survive. Without water, it will die off, as well as the coral block below.=Corais crescem sobre blocos de corais e precisam estar dentro de uma fonte de água para sobreviver. Sem água, eles morrem, assim como o bloco de coral abaixo. +Corals fans grow on top of coral blocks and need to be inside a water source to survive. Without water, it will die off, as well as the coral block below.=Gorgônias crescem sobre blocos de corais e precisam estar dentro de uma fonte de água para sobreviver. Sem água, elas morrem, assim como o bloco de coral abaixo. +Seagrass grows inside water on top of dirt, sand or gravel.=Grama marinha cresce dento da água sobre terra, areia ou cascalho. +A decorative block that serves as a great furnace fuel.=Um bloco decorativo que serve como uma ótimo combustível de fornalha. +Dried kelp is a food item.=Alga seca é um item de comida. +Grows on coral block of same species=Cresce em blocos de corais da mesma espécie +Needs water to live=Precisa de água para viver +Grows in water on dirt, sand, gravel=Cresce na água sobre a terra, areia, cascalho +Glows in the water=Brilha na água +4 possible sizes=4 tamanhos possíveis +Grows on dead brain coral block=Cresce no bloco de coral-de-cérebro morto +Sea Pickle=Pepino-do-Mar +Sea pickles grow on dead brain coral blocks and provide light when underwater. They come in 4 sizes that vary in brightness.=Pepino-do-mar cresce em blocos de coral-de-cérebro mortos e fornecem luz quando estão em baixo d'água. Eles vêm em 4 tamanhos que variam em luminosidade. +It can only be placed on top of dead brain coral blocks. Placing a sea pickle on another sea pickle will make it grow and brighter.=Podem ser posicionados apenas sobre blocos de coral-de-cérebro mortos. Posicionar um pepino-do-mar em outro pepino-do-mar o fará crescer e brilhar. + From 3047568ed497f54579d0243947ec85316f186211 Mon Sep 17 00:00:00 2001 From: JoseDouglas26 Date: Sat, 2 Dec 2023 23:47:22 -0300 Subject: [PATCH 546/982] mcl_maps pt_BR translation --- mods/ITEMS/mcl_maps/locale/mcl_maps.pt_BR.tr | 8 ++++++++ 1 file changed, 8 insertions(+) create mode 100644 mods/ITEMS/mcl_maps/locale/mcl_maps.pt_BR.tr diff --git a/mods/ITEMS/mcl_maps/locale/mcl_maps.pt_BR.tr b/mods/ITEMS/mcl_maps/locale/mcl_maps.pt_BR.tr new file mode 100644 index 000000000..a28d211b0 --- /dev/null +++ b/mods/ITEMS/mcl_maps/locale/mcl_maps.pt_BR.tr @@ -0,0 +1,8 @@ +# textdomain: mcl_maps +Empty Map=Mapa Vazio +Empty maps are not useful as maps, but they can be stacked and turned to maps which can be used.=Mapas vazios não são úteis como mapas, mas eles podem ser empilhados e transfomados em mapas aos quais podem ser usados. +Rightclick to create a filled map (which can't be stacked anymore).=Clique com o botão direito para criar um mapa preenchido (ao qual não pode mais ser empilhado). +Map=Mapa +Shows a map image.=Mostra uma imagem do mapa. +When created, the map saves the nearby area as an image that can be viewed any time by holding the map.=Quando criado, o mapa salva a área próxima como uma imagem que pode ser visualizada sempre que você segurar o mapa. +Hold the map in your hand. This will display a map on your screen.=Segure o mapa em suas mãos. Isso mostrará um mapa em sua tela. From 9a8a6764d1df1849823039b671df97e574d7fcd8 Mon Sep 17 00:00:00 2001 From: JoseDouglas26 Date: Sun, 3 Dec 2023 20:55:16 -0300 Subject: [PATCH 547/982] mcl_doors and mcl_fences pt_BR translation fixes --- mods/ITEMS/mcl_doors/locale/mcl_doors.pt_BR.tr | 2 +- mods/ITEMS/mcl_fences/locale/mcl_fences.pt_BR.tr | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/mods/ITEMS/mcl_doors/locale/mcl_doors.pt_BR.tr b/mods/ITEMS/mcl_doors/locale/mcl_doors.pt_BR.tr index 321c99e33..fe6245f56 100644 --- a/mods/ITEMS/mcl_doors/locale/mcl_doors.pt_BR.tr +++ b/mods/ITEMS/mcl_doors/locale/mcl_doors.pt_BR.tr @@ -20,5 +20,5 @@ Wooden trapdoors are horizontal barriers whch can be opened and closed by hand o To open or close the trapdoor, rightclick it or send a redstone signal to it.=Para abrir ou fechar um alçapão, aperte com o botão direito nela ou acione-o com um sinal de redstone. Iron Trapdoor=Alçapão de Ferro Iron trapdoors are horizontal barriers which can only be opened and closed by redstone signals, but not by hand. They occupy the upper or lower part of a block, depending on how they have been placed. When open, they can be climbed like a ladder.=Alçapões de ferro são barreiras horizontais que podem ser abertas ou fechadas por sinais de redstone, mas não manualmente. Eles ocupam a parte inferior ou superior de um bloco, dependendo de como foram colocados. Quando abertos, podem ser escaladas como escadas. -Openable by players and redstone power=Aberto por jogadores ou sinal de redstone +Openable by players and redstone power=Aberto por jogadores e sinal de redstone Openable by redstone power=Aberto por sinal de redstone diff --git a/mods/ITEMS/mcl_fences/locale/mcl_fences.pt_BR.tr b/mods/ITEMS/mcl_fences/locale/mcl_fences.pt_BR.tr index 7c55be53d..69349e48b 100644 --- a/mods/ITEMS/mcl_fences/locale/mcl_fences.pt_BR.tr +++ b/mods/ITEMS/mcl_fences/locale/mcl_fences.pt_BR.tr @@ -15,4 +15,4 @@ Dark Oak Fence Gate=Portão de Carvalho Escuro Acacia Fence=Cerca de Acácia Acacia Fence Gate=Portão de Acácia Nether Brick Fence=Cerca de Tijolos do Nether -Openable by players and redstone power=Abrível por jogadores e carga de redstone +Openable by players and redstone power=Aberto por jogadores e sinal de redstone From aeeb5acc2596e8daf84196465ce14f520bf49dbc Mon Sep 17 00:00:00 2001 From: JoseDouglas26 Date: Sun, 3 Dec 2023 20:56:09 -0300 Subject: [PATCH 548/982] mcl_armor pt_BR translation correction --- mods/ITEMS/mcl_armor/locale/mcl_armor.pt_BR.tr | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mods/ITEMS/mcl_armor/locale/mcl_armor.pt_BR.tr b/mods/ITEMS/mcl_armor/locale/mcl_armor.pt_BR.tr index 6ce4997db..7c11b26c1 100644 --- a/mods/ITEMS/mcl_armor/locale/mcl_armor.pt_BR.tr +++ b/mods/ITEMS/mcl_armor/locale/mcl_armor.pt_BR.tr @@ -48,4 +48,4 @@ Reflects some of the damage taken when hit, at the cost of reducing durability w Aqua Affinity=Afinidade Aqua #Translations for armor trims -Smithing Template '@1'=Molde de Ferraria +Smithing Template '@1'=Molde de Ferraria '@1' From 04b77db7fa1486891077fcd3712a3eac809e5271 Mon Sep 17 00:00:00 2001 From: JoseDouglas26 Date: Sun, 3 Dec 2023 21:01:02 -0300 Subject: [PATCH 549/982] mcl_books and mcl_bows pt_BR translation fixes --- mods/ITEMS/mcl_books/locale/mcl_books.pt_BR.tr | 2 +- mods/ITEMS/mcl_bows/locale/mcl_bows.pt_BR.tr | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/mods/ITEMS/mcl_books/locale/mcl_books.pt_BR.tr b/mods/ITEMS/mcl_books/locale/mcl_books.pt_BR.tr index fbbb543fd..ed84cf067 100644 --- a/mods/ITEMS/mcl_books/locale/mcl_books.pt_BR.tr +++ b/mods/ITEMS/mcl_books/locale/mcl_books.pt_BR.tr @@ -2,7 +2,7 @@ Book=Livro Books are used to make bookshelves and book and quills.=Livros são utilizados para fazer prateleiras de livros e livro e pena. “@1”= -Copy of “@1”=Copia de "@1" +Copy of “@1”=Cópia de "@1" Copy of Copy of “@1”=Cópia da Cópia de "@1" Tattered Book=Livro Esfarrapado by @1=por @1 diff --git a/mods/ITEMS/mcl_bows/locale/mcl_bows.pt_BR.tr b/mods/ITEMS/mcl_bows/locale/mcl_bows.pt_BR.tr index 66044f8a0..ebb9e407c 100644 --- a/mods/ITEMS/mcl_bows/locale/mcl_bows.pt_BR.tr +++ b/mods/ITEMS/mcl_bows/locale/mcl_bows.pt_BR.tr @@ -9,7 +9,7 @@ Bows are ranged weapons to shoot arrows at your foes.=Arcos são armas de longo The speed and damage of the arrow increases the longer you charge. The regular damage of the arrow is between 1 and 9. At full charge, there's also a 20% of a critical hit, dealing 10 damage instead.=A velocidade e o dano da flecha aumenta quanto mais você puxar o arco. O dano regular de uma flecha varia entre 1 e 9. Quando puxado no máximo, há também uma chance de 20% de causar acerto crítico, efetuando 10 de dano. To use the bow, you first need to have at least one arrow anywhere in your inventory (unless in Creative Mode). Hold down the right mouse button to charge, release to shoot.=Para usar o arco, você primeiro precisa possuir pelo menos uma flecha em qualquer lugar do seu inventário (a não ser no Modo Criativo). Segure o botão direito do mouse para puxar o arco, solte-o para disparar. Bow=Arco -Ammunition=munição +Ammunition=Munição Damage from bow: 1-10=Dano provocado pelo arco: 1-10 Damage from dispenser: 3=Dano provocado pelo dispensor: 3 Launches arrows=Dispara flechas From 6bffaf56d2eccf47fb447aaad38242a4600aaf57 Mon Sep 17 00:00:00 2001 From: JoseDouglas26 Date: Sun, 3 Dec 2023 21:08:59 -0300 Subject: [PATCH 550/982] mcl_dye and mcl_smithing_table translation fixes --- mods/ITEMS/mcl_dye/locale/mcl_dye.pt_BR.tr | 30 +++++++++---------- .../locale/mcl_smithing_table.pt_BR.tr | 2 +- 2 files changed, 16 insertions(+), 16 deletions(-) diff --git a/mods/ITEMS/mcl_dye/locale/mcl_dye.pt_BR.tr b/mods/ITEMS/mcl_dye/locale/mcl_dye.pt_BR.tr index 2b6aef9f0..14ff0b091 100644 --- a/mods/ITEMS/mcl_dye/locale/mcl_dye.pt_BR.tr +++ b/mods/ITEMS/mcl_dye/locale/mcl_dye.pt_BR.tr @@ -1,26 +1,26 @@ # textdomain: mcl_dye Bone Meal=Farinha de Osso -Light Grey Dye=Tintura Cinza Claro -Grey Dye=Tintura Cinza +Light Grey Dye=Corante Cinza Claro +Grey Dye=Corante Cinza Ink Sac=Saco de Tinta -Purple Dye=Tintura Roxa +Purple Dye=Corante Roxo Lapis Lazuli=Lápis-lazuli -Light Blue Dye=Tintura Azul Claro -Cyan Dye=Tintura Ciano -Green Dye=Tintura Verde -Lime Dye=Tintura Lima -Yellow Dye=Tintura Amarela +Light Blue Dye=Corante Azul Claro +Cyan Dye=Corante Ciano +Green Dye=Corante Verde +Lime Dye=Corante Lima +Yellow Dye=Corante Amarelo Cocoa Beans=Sementes de Cacau -Orange Dye=Tintura Laranja -Red Dye=Tintura Vermelha -Magenta Dye=Tintura Magenta -Pink Dye=Tintura Rosa -This item is a dye which is used for dyeing and crafting.=Este item é uma tintura e pode ser usado para tingir ou fabricar. +Orange Dye=Corante Laranja +Red Dye=Corante Vermelho +Magenta Dye=Corante Magenta +Pink Dye=Corante Rosa +This item is a dye which is used for dyeing and crafting.=Este item é uma corante e pode ser usado para tingir ou fabricar. Rightclick on a sheep to dye its wool. Other things are dyed by crafting.=Clique com o botão direito em uma ovelha para tingir sua lã. Outras coisas são tingidas ao fabricá-las. Bone Meal=Farinha de Osso -Bone meal is a white dye and also useful as a fertilizer to speed up the growth of many plants.=Farinha de osso é uma tintura branca e também é útil como fertilizante ao acelerar o crescimento de diversas plantas. +Bone meal is a white dye and also useful as a fertilizer to speed up the growth of many plants.=Farinha de osso é um corante branco e também é útil como fertilizante ao acelerar o crescimento de diversas plantas. Rightclick a sheep to turn its wool white. Rightclick a plant to speed up its growth. Note that not all plants can be fertilized like this. When you rightclick a grass block, tall grass and flowers will grow all over the place.=Clique com o botão direito em uma ovelha para tornar sua lã branca. Clique com o botão direito em uma planta para acelerar seu crescimento. Note que nem todas as plantas podem ser fertilizadas assim. Quando você clica com o botão direito em um bloco de grama, grama alta e flores crescerão ao redor. -Cocoa beans are a brown dye and can be used to plant cocoas.=Sementes de cacau são um pigmento marrom e podem ser usadas para plantar cacau. +Cocoa beans are a brown dye and can be used to plant cocoas.=Sementes de cacau são um corante marrom e podem ser usadas para plantar cacau. Rightclick a sheep to turn its wool brown. Rightclick on the side of a jungle tree trunk (Jungle Wood) to plant a young cocoa.=Clique com o botão direito em uma ovelha para tornar sua lã marrom. Clique com o botão direito na lateral de um tronco de árvore da selva para plantar um cacau jovem. Cocoa Beans=Sementes de Cacau Grows at the side of jungle trees=Cresce na lateral de árvores da selva diff --git a/mods/ITEMS/mcl_smithing_table/locale/mcl_smithing_table.pt_BR.tr b/mods/ITEMS/mcl_smithing_table/locale/mcl_smithing_table.pt_BR.tr index 065d5faba..5c42b2488 100644 --- a/mods/ITEMS/mcl_smithing_table/locale/mcl_smithing_table.pt_BR.tr +++ b/mods/ITEMS/mcl_smithing_table/locale/mcl_smithing_table.pt_BR.tr @@ -1,4 +1,4 @@ # textdomain: mcl_smithing_table Inventory=Inventário Upgrade Gear=Atualizar Equipamento -Smithing table=Mesa de ferraria +Smithing table=Mesa de Ferraria From 1f370bf1f2d83a325fd4504f5799a9a0e946b3b9 Mon Sep 17 00:00:00 2001 From: JoseDouglas26 Date: Mon, 4 Dec 2023 21:00:47 -0300 Subject: [PATCH 551/982] hudbars pt_BR translation --- mods/HUD/hudbars/locale/hudbars.pt_BR.tr | 6 ++++++ 1 file changed, 6 insertions(+) create mode 100644 mods/HUD/hudbars/locale/hudbars.pt_BR.tr diff --git a/mods/HUD/hudbars/locale/hudbars.pt_BR.tr b/mods/HUD/hudbars/locale/hudbars.pt_BR.tr new file mode 100644 index 000000000..566906452 --- /dev/null +++ b/mods/HUD/hudbars/locale/hudbars.pt_BR.tr @@ -0,0 +1,6 @@ +# textdomain: hudbars +Health=Saúde +Breath=Respiração + +# Default format string for progress bar-style HUD bars, e.g. “Health 5/20” +@1: @2/@3=@1: @2/@3 From 8c0d9cc450197c18e1003511073b133cb33e4e39 Mon Sep 17 00:00:00 2001 From: JoseDouglas26 Date: Mon, 4 Dec 2023 21:03:52 -0300 Subject: [PATCH 552/982] mcl_info pt_BR translation --- mods/HUD/mcl_info/locale/mcl_info.pt_BR.tr | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 mods/HUD/mcl_info/locale/mcl_info.pt_BR.tr diff --git a/mods/HUD/mcl_info/locale/mcl_info.pt_BR.tr b/mods/HUD/mcl_info/locale/mcl_info.pt_BR.tr new file mode 100644 index 000000000..89ea171e0 --- /dev/null +++ b/mods/HUD/mcl_info/locale/mcl_info.pt_BR.tr @@ -0,0 +1,4 @@ +# textdomain: mcl_info +Set debug bit mask: 0 @= disable, 1 @= biome name, 2 @= coordinates, 3 @= all=Defina a máscara de bits de debug: 0 @= desabilitado, 1 @= nome do bioma, 2 @= coordenadas, 3 @= todos +Error! Possible values are integer numbers from @1 to @2=Erro! Valores possíveis são números inteiros de @1 até @2 +Debug bit mask set to @1=Máscara de bits de debug definida como @1 From 6c4101dc125947df4c135851c969d31f0c6fa39c Mon Sep 17 00:00:00 2001 From: JoseDouglas26 Date: Mon, 4 Dec 2023 21:48:07 -0300 Subject: [PATCH 553/982] mcl_hoppers pt_BR translation --- .../mcl_hoppers/locale/mcl_hoppers.pt_BR.tr | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) create mode 100644 mods/ITEMS/mcl_hoppers/locale/mcl_hoppers.pt_BR.tr diff --git a/mods/ITEMS/mcl_hoppers/locale/mcl_hoppers.pt_BR.tr b/mods/ITEMS/mcl_hoppers/locale/mcl_hoppers.pt_BR.tr new file mode 100644 index 000000000..3ed5bcfad --- /dev/null +++ b/mods/ITEMS/mcl_hoppers/locale/mcl_hoppers.pt_BR.tr @@ -0,0 +1,16 @@ +# textdomain: mcl_hoppers +Hopper=Funil +Hoppers are containers with 5 inventory slots. They collect dropped items from above, take items from a container above and attempt to put its items it into an adjacent container. Hoppers can go either downwards or sideways. Hoppers interact with chests, droppers, dispensers, shulker boxes, furnaces and hoppers.=Funis são recipientes com 5 slots de inventário. Eles coletam itens largados acima, pegam itens de um recipiente acima e tentam colocar seus itens em um recipiente adjacente. Funis podem ir tanto para baixo quanto para os lados. Funis interagem com baús, liberadores, ejetores, caixas shulker, fornalhas e funis. +Hoppers interact with containers the following way:=Funis interagem com recipientes da seguinte maneira: +• Furnaces: Hoppers from above will put items into the source slot. Hoppers from below take items from the output slot. They also take items from the fuel slot when they can't be used as a fuel. Sideway hoppers that point to the furnace put items into the fuel slot=• Fornalhas: Funis acima irão colocar itens no slot da fonte. Funis abaixo pegam itens do slot de saída. Eles também pegam itens do slot de combustível quando estes não podem ser usados como combustível. Funis laterais que apontem para a fornalha colocam itens no slot de combustível. +• Ender chests: No interaction.=• Baús do ender: Sem interações. +• Other containers: Normal interaction.=• Outros recipientes: Interação normal. +Hoppers can be disabled when supplied with redstone power. Disabled hoppers don't move items.= Funis pode ser desativados quando alimentados com carga de redstone. Funis desativados não movem itens. +To place a hopper vertically, place it on the floor or a ceiling. To place it sideways, place it at the side of a block. Use the hopper to access its inventory.=Para posicionar um funil verticalmente, posicione-o no chão ou no teto. Para posiciona-lo lateralmente, posicione-o na lateral de um bloco. Use o funil para acessar seu inventário. +Disabled Hopper=Funil Desativado +Side Hopper=Funil Lateral +Disabled Side Hopper=Funil Lateral Desativado +Inventory=Inventário +5 inventory slots=5 slots de inventário +Collects items from above, moves items to container below=Coleta itens vindos de cima, move itens para recipientes abaixo. +Can be disabled with redstone power=Pode ser desativado com carga de redstone From f8ef5a15c5723b8c54d5048814e7ce215cc86937 Mon Sep 17 00:00:00 2001 From: JoseDouglas26 Date: Mon, 4 Dec 2023 23:13:25 -0300 Subject: [PATCH 554/982] mcl_death_messages pt_BR translation --- .../locale/mcl_death_messages.pt_BR.tr | 55 +++++++++++++++++++ 1 file changed, 55 insertions(+) create mode 100644 mods/HUD/mcl_death_messages/locale/mcl_death_messages.pt_BR.tr diff --git a/mods/HUD/mcl_death_messages/locale/mcl_death_messages.pt_BR.tr b/mods/HUD/mcl_death_messages/locale/mcl_death_messages.pt_BR.tr new file mode 100644 index 000000000..f1f64fa5c --- /dev/null +++ b/mods/HUD/mcl_death_messages/locale/mcl_death_messages.pt_BR.tr @@ -0,0 +1,55 @@ +# textdomain: mcl_death_messages +@1 went up in flames=@1 pegou fogo +@1 walked into fire whilst fighting @2=@1 caminhou no fogo enquanto lutava contra @2 +@1 was struck by lightning=@1 foi atingido(a) por um raio +@1 was struck by lightning whilst fighting @2=@1 foi atingido(a) por um raio enquanto lutava contra @2 +@1 burned to death=@1 queimou até a morte +@1 was burnt to a crisp whilst fighting @2=@1 foi queimado até a crocância enquanto lutava contra @2 +@1 tried to swim in lava=@1 tentou nadar em lava +@1 tried to swim in lava to escape @2=@1 tentou nadar em lava para escapar de @2 +@1 discovered the floor was lava=@1 descobriu que o chão era lava +@1 walked into danger zone due to @2=@1 caminhou numa zona perigosa por conta de @2 +@1 suffocated in a wall=@1 sufocou em uma parede +@1 suffocated in a wall whilst fighting @2=@1 sufocou em uma parede enquanto lutava contra @2 +@1 drowned=@1 se afogou +@1 drowned whilst trying to escape @2=@1 se afogou enquanto tentava escapar de @2 +@1 starved to death=@1 morreu de fome +@1 starved to death whilst fighting @2=@1 morreu de fome enquanto lutava contra @2 +@1 was pricked to death=@1 foi espetado até a morte +@1 walked into a cactus whilst trying to escape @2=@1 caminhou até um cacto enquanto tentava escapar de @2 +@1 hit the ground too hard=@1 bateu muito forte no chão +@1 hit the ground too hard whilst trying to escape @2=@1 bateu muito forte no chão enquanto tentava escapar de @2 +@1 experienced kinetic energy=@1 experienciou a energia cinética +@1 experienced kinetic energy whilst trying to escape @2=@1 experienciou a energia cinética enquanto tentava escapar de @2 +@1 fell out of the world=@1 caiu do mundo +@1 didn't want to live in the same world as @2=@1 não queria viver no mesmo mundo que @2 +@1 died=@1 morreu +@1 died because of @2=@1 morreu por conta de @2 +@1 was killed by magic=@1 foi morto(a) por magia +@1 was killed by magic whilst trying to escape @2=@1 foi morto(a) por magia enquanto tentava escapar de @2 +@1 was killed by @2 using magic=@1 foi morto(a) por @2 usando magia +@1 was killed by @2 using @3=@1 foi morto(a) por @2 usando @3 +@1 was roasted in dragon breath=@1 foi assado(a) no bafo do dragão +@1 was roasted in dragon breath by @2=@1 foi assado(a) no bafo do dragão por @2 +@1 withered away=@1 apodreceu +@1 withered away whilst fighting @2=@1 apodreceu enquanto lutava contra @2 +@1 was shot by a skull from @2=@1 foi acertado(a) por um crânio vindo de @2 +@1 was squashed by a falling anvil=@1 foi esmagado(a) por uma bigorna em queda +@1 was squashed by a falling anvil whilst fighting @2=@1 foi esmagado(a) por uma bigorna enquanto lutava contra @2 +@1 was squashed by a falling block=@1 foi esmagado(a) por um bloco em queda +@1 was squashed by a falling block whilst fighting @2=@1 foi esmagado(a) por um bloco em queda enquanto lutava contra @2 +@1 was slain by @2=@1 foi assassinado por @2 +@1 was slain by @2 using @3=@1 foi assassinado por @2 usando @3 +@1 was shot by @2=@1 foi acertado(a) por @2 +@1 was shot by @2 using @3=@1 foi acertado(a) por @2 usando @3 +@1 was fireballed by @2=@1 foi atingido(a) por uma bola de fogo de @2 +@1 was fireballed by @2 using @3=@1 foi atingido(a) por uma bola de fogo de @2 usando @3 +@1 was killed trying to hurt @2=@1 foi morto(a) tentando machucar @2 +@1 tried to hurt @2 and died by @3=@1 tentou machucar @2 e morreu por conta de @3 +@1 blew up=@1 explodiu +@1 was blown up by @2=@1 foi explodido por @2 +@1 was blown up by @2 using @3=@1 foi explodido por @2 usando @3 +@1 was squished too much=@1 foi esmagado(a) demais +@1 was squashed by @2=@1 foi esmagado(a) por @2 +@1 went off with a bang=@1 saiu com um estrondo +@1 went off with a bang due to a firework fired by @2 from @3=@1 saiu com um estrondo por conta de um fogo de artifício disparado por @2 vindo de @3 From a2b754945666c96ff474f3ddf8866ebe67f13698 Mon Sep 17 00:00:00 2001 From: JoseDouglas26 Date: Tue, 5 Dec 2023 21:24:32 -0300 Subject: [PATCH 555/982] mcl_mangrove pt_BR translation --- .../mcl_mangrove/locale/mcl_mangrove.pt_BR.tr | 36 +++++++++++++++++++ 1 file changed, 36 insertions(+) create mode 100644 mods/ITEMS/mcl_mangrove/locale/mcl_mangrove.pt_BR.tr diff --git a/mods/ITEMS/mcl_mangrove/locale/mcl_mangrove.pt_BR.tr b/mods/ITEMS/mcl_mangrove/locale/mcl_mangrove.pt_BR.tr new file mode 100644 index 000000000..fc26a7531 --- /dev/null +++ b/mods/ITEMS/mcl_mangrove/locale/mcl_mangrove.pt_BR.tr @@ -0,0 +1,36 @@ +# textdomain: mcl_mangrove +Mangrove Wood=Madeira de Mangue +The trunk of a Mangrove tree.=O tronco de uma árvore de mangue. +Mangrove Bark=Casca de Mangue +The bark of a Mangrove tree.=A casca de uma árvore de mangue. +Mangrove Wood Planks=Tábuas de Mangue +Mangrove Leaves=Folhas de Mangue +Mangrove leaves are grown from mangrove trees.=Folhas de mangue crescem em árvores de mangue. +Stripped Mangrove Log=Tronco de Mangue Descascado +The stripped wood of a Mangrove tree=A madeira descascada de uma árvore de mangue. +Stripped Mangrove Wood=Madeira de Mangue Descascada +The stripped bark of a Mangrove tree=A casca descascada de uma árvore de mangue. +Mangrove Roots=Raízes de Mangue +Mangrove roots are decorative blocks that form as part of mangrove trees.=Raízes de mangue são blocos decorativos que se formam como parte das árvores de mangue. +Mangrove Propagule=Propágulo de Mangue +Needs soil and light to grow=Precisa de solo e luz para crescer +When placed on soil (such as dirt) and exposed to light, an propagule will grow into an mangrove after some time.=Quando posicionado em solo (como em terra) e exposto à luz, um propágulo irá crescer uma árvore de mangue depois de algum tempo. +Hanging Propagule=Propágulo Pendurado +Grows on Mangrove leaves=Cresce em folhas de mangue +water logged mangrove roots=Raízes de Mangue Alagadas +Mangrove roots, despite being a full block, can be waterlogged and do not flow water out=Raízes de mangue, mesmo sendo um bloco inteiro, podem ser alagadas e não escorre água delas. +These cannot be crafted yet only occure when get in contact of water.=Essas não podem ser fabricadas ainda ocorrendo apenas quando tem contato com a água. +Muddy Mangrove Roots=Raízes Barrentas de Mangue +crafted with Mud and Mangrove roots=Fabricadas com barro e raízes de mangue +Muddy Mangrove Roots is a block from mangrove swamp.It drowns player a bit inside it.=Raízes barrentas de mangue é um bloco dos pântanos de mangue. Afunda o jogador um pouco para dentro de si. +Mangrove Door=Porta de Mangue +Wooden doors are 2-block high barriers which can be opened or closed by hand and by a redstone signal.=Portas de madeira são barreiras de 2 blocos de altura as quais podem ser abertas ou fechadas pela mão e por um sinal de redstone. +To open or close a wooden door, rightclick it or supply its lower half with a redstone signal.=Para abrir ou fechar uma porta de madeira, clique com o botão direito nela ou alimente-a em sua metade inferior com um sinal de redstone. +Mangrove Trapdoor=Alçapão de Mangue +Wooden trapdoors are horizontal barriers which can be opened and closed by hand or a redstone signal. They occupy the upper or lower part of a block, depending on how they have been placed. When open, they can be climbed like a ladder.=Alçapões de madeira são barreiras horizontais as quais podem ser abertas ou fechadas com a mão ou um sinal de redstone. Eles ocupam a parte superior ou inferior de um bloco, dependendo de como eles foram posicionados. Quando abertos, eles podem ser escalados como uma escada. +To open or close the trapdoor, rightclick it or send a redstone signal to it.=Para abrir e fechar o alçapão, clique com o botão direito nele ou envie um sinal de redstone para ele. +Mangrove Wood Fence=Cerca de Mangue +Mangrove Wood Fence Gate=Portão de Mangue +Mangrove Wood Stairs=Escadas de Mangue +Mangrove Wood Slab=Laje de Mangue +Double Mangrove Wood Slab=Laje Dupla de Mangue From ad099ed7c21564bd39e14d058ea52a0155ab50bc Mon Sep 17 00:00:00 2001 From: JoseDouglas26 Date: Wed, 6 Dec 2023 12:29:21 -0300 Subject: [PATCH 556/982] mcl_grindstone pt_BR translation --- .../mcl_grindstone/locale/mcl_grindstone.pt_BR.tr | 11 +++++++++++ 1 file changed, 11 insertions(+) create mode 100644 mods/ITEMS/mcl_grindstone/locale/mcl_grindstone.pt_BR.tr diff --git a/mods/ITEMS/mcl_grindstone/locale/mcl_grindstone.pt_BR.tr b/mods/ITEMS/mcl_grindstone/locale/mcl_grindstone.pt_BR.tr new file mode 100644 index 000000000..03a5ca41e --- /dev/null +++ b/mods/ITEMS/mcl_grindstone/locale/mcl_grindstone.pt_BR.tr @@ -0,0 +1,11 @@ +# textdomain: mcl_grindstone +Inventory=Inventário +Repair & Disenchant=Reparar & Desencantar +Grindstone=Rebolo +Used to disenchant/fix tools=Usado para desencantar/consertar ferramentas +Grindstone disenchants tools and armour except for curses, and repairs two items of the same type it is also the weapon smith's work station.=Rebolos desencantam ferramentas e armaduras exceto as maldições, e consertam dois itens do mesmo tipo e ainda é a estação de trabalho do armeiro. +To use the grindstone, rightclick it, Two input slots (on the left) and a single output slot.=Para usar o rebolo, clique com o botão direito nele. +To disenchant an item place enchanted item in one of the input slots and take the disenchanted item from the output.=Para desencantar um item posicione o item encantado em um dos slots de entrada e pegue o item desencantado na saída. +To repair a tool you need a tool of the same type and material, put both items in the input slot and the output slot will combine two items durabilities with 5% bonus.=Para consertar uma ferramenta você precisará de uma ferramenta do mesmo tipo e material, ponha ambos os itens nos slots de entrada e o slot de saída irá combinar a durabilidade dos dois itens com um bônus de 5%. +If both items have enchantments the player will get xp from both items from the disenchant.=Se ambos itens possuem encantamentos o jogador receberá XP de ambos os itens no desencanto. +Curses cannot be removed and will be transfered to the new repaired item, if both items have a different curse the curses will be combined.=Maldições não podem ser removidas e serão transferidas para o novo item reparado, se ambos os itens tiverem maldições diferentes, as maldições serão combinadas. From bef3253d5c173b5615721ea7f439486454d9095c Mon Sep 17 00:00:00 2001 From: JoseDouglas26 Date: Wed, 6 Dec 2023 13:05:56 -0300 Subject: [PATCH 557/982] mcl_enchanting pt_BR translation --- .../locale/mcl_enchanting.pt_BR.tr | 144 ++++++++++++++++++ 1 file changed, 144 insertions(+) create mode 100644 mods/ITEMS/mcl_enchanting/locale/mcl_enchanting.pt_BR.tr diff --git a/mods/ITEMS/mcl_enchanting/locale/mcl_enchanting.pt_BR.tr b/mods/ITEMS/mcl_enchanting/locale/mcl_enchanting.pt_BR.tr new file mode 100644 index 000000000..f17678f3f --- /dev/null +++ b/mods/ITEMS/mcl_enchanting/locale/mcl_enchanting.pt_BR.tr @@ -0,0 +1,144 @@ +# textdomain: mcl_enchanting + + +### enchantments.lua ### + +Arrows passes through multiple objects.=Flechas atravessam múltiplos objetos. +Arrows set target on fire.=Flechas colocam fogo no alvo. +Bane of Arthropods=Ruína dos Artrópodes +Channeling=Condutividade + +Channels a bolt of lightning toward a target. Works only during thunderstorms and if target is unobstructed with opaque blocks.=Canaliza um relâmpago em direção ao alvo. Funciona apenas durante tempestades e se o alvo estiver desobistruido por blocos opacos. + +Curse of Vanishing=Maldição do Desaparecimento +Decreases crossbow charging time.=Diminui o tempo de recarga da besta. +Decreases time until rod catches something.=Diminui o tempo para a vara coletar alguma coisa. +Depth Strider=Passos Profundos +Efficiency=Eficiência +Extends underwater breathing time.=Extende o tempo de respiração em baixo da água. +Fire Aspect=Aspecto Flamejante +Flame=Chama +Fortune=Fortuna +Frost Walker=Passos Gelados +Impaling=Penetração +Increases arrow damage.=Aumenta o dano das flechas. +Increases arrow knockback.=Aumenta a repulsão das flechas. +Increases certain block drops.=Aumenta o drop de certos blocos. + +Increases damage and applies Slowness IV to arthropod mobs (spiders, cave spiders, silverfish and endermites).=Aumenta o dano e aplica Lentidão IV para mobs artrópodes (aranhas, aranhas de cavernas, traças e endermites). + +Increases damage to undead mobs.=Aumenta o dano para mobs mortos-vivos. +Increases damage.=Aumenta o dano +Increases item durability.=Aumenta a durabilidade do item. +Increases knockback.=Aumenta a repulsão. +Increases mining speed.=Aumenta a velocidade de mineração. +Increases mob loot.=Aumenta o saque de mobs. +Increases rate of good loot (enchanting books, etc.)=Aumenta a taxa de bons saques (livros encantados, etc.) +Increases sweeping attack damage.= +Increases underwater movement speed.=Aumenta a velocidade de movimento embaixo da água. +Increases walking speed on soul sand.=Aumenta a velocidade de caminhada na areia das almas. +Infinity=Infinidade +Item destroyed on death.=Item é destruído na morte. +Knockback=Repulsão +Looting=Saque +Loyalty=Lealdade +Luck of the Sea=Sorte do Mar +Lure=Isca +Mending=Remendo +Mined blocks drop themselves.=Blocos minerados dropam a si mesmos. +Multishot=Rajada +Piercing=Perfuração +Power=Força +Punch=Impacto +Quick Charge=Recarga Rápida +Repair the item while gaining XP orbs.=Repara o item enquanto ganha orbes de XP. +Respiration=Respiração +Riptide=Correnteza +Sets target on fire.=Coloca fogo no alvo. +Sharpness=Afiação +Shoot 3 arrows at the cost of one.=Atira 3 flechas ao custo de uma. +Shooting consumes no regular arrows.=Atirar não consome flechas normais. +Silk Touch=Toque Suave +Smite=Julgamento +Soul Speed=Velocidade das Almas +Sweeping Edge=Alcance +Trident deals additional damage to ocean mobs.=Tridente dá dano adicional em mobs oceanicos. + +Trident launches player with itself when thrown. Works only in water or rain.=Tridente lança o jogador junto de si mesmo quando lançado. + +Trident returns after being thrown. Higher levels reduce return time.=Tridente retorna depois de ser arremessado. Níveis altos reduzem o tempo de retorno. + +Turns water beneath the player into frosted ice and prevents the damage from magma blocks.=Transforma a água abaixo do jogador em gelo e previne o dano dos blocos de magma. + +Unbreaking=Inquebrável + +### engine.lua ### + +@1 Enchantment Levels=@1 Níveis de Encantamento +@1 Lapis Lazuli=@1 Lápis Lazuli +Inventory=Inventário +Level requirement: @1=Nível requerido: @1 + +### init.lua ### + +'@1' is not a valid number='@1' não é um número válido +'@1' is not a valid number.='@1' não é um número válido. + []= [] +@1 can't be combined with @2.=@1 não pode ser combinado com @2. + +After finally selecting your enchantment; left-click on the selection, and you will see both the lapis lazuli and your experience levels consumed. And, an enchanted item left in its place.=Depois de finalmente selecionar seu encantamento; clique com o botão esquerdo na seleção, e você irá ver ambos os lápis lazuli e seus níveis de experiência serem consumidos. E, um item encantado deixado em seu lugar. + +After placing your items in the slots, the enchanting options will be shown. Hover over the options to read what is available to you.=Depois de posicionar seus itens nos slots, as opções de encantamentos serão mostradas. Passe o mouse sobre as opções para ler o que está disponível para você. + +Enchant=Encantar +Enchant an item=Encantar um item +Enchanted Book=Livro Encantado +Enchanting Table=Mesa de Encantamento + +Enchanting Tables will let you enchant armors, tools, weapons, and books with various abilities. But, at the cost of some experience, and lapis lazuli.=A mesa de encantamentos permitem a você encantar armaduras, ferramentas, armas, e livros com várias habilidades. Mas, ao custo de alguma experiência, e lápis lazuli. + +Enchanting succeded.=Encantamento sucessido. +Forcefully enchant an item=Encantamento forçado em um item. + +Place a tool, armor, weapon or book into the top left slot, and then place 1-3 Lapis Lazuli in the slot to the right.=Posicione uma ferramenta, armadura, arma ou livro no slot superior esquerdo, e então posicione 1-3 lápis lazuli no slot da direita. + +Player '@1' cannot be found.=Jogador '@1' não pôde ser encontrado. +Rightclick the Enchanting Table to open the enchanting menu.=Clique com o botão direito na mesa de encantamentos para abrir o menu de encantamentos. +Spend experience, and lapis to enchant various items.=Invista experiência, e lápis para encantar vários itens. + +The number you have entered (@1) is too big, it must be at most @2.=O número que você inseriu (@1) é muito grande, deve ser no máximo @2. + +The number you have entered (@1) is too small, it must be at least @2.=O número que você inseriu (@1) é muito pequeno, deve ser no mínimo @2. + +The selected enchantment can't be added to the target item.=O encantamento selecionado não pode ser adicionado ao item alvo. +The target doesn't hold an item.=O alvo não está segurando um item. +The target item is not enchantable.=O item alvo não é encantável. +There is no such enchantment '@1'.=Não existe um encantamento '@1'. + +These options are randomized, and dependent on experience level; but the enchantment strength can be increased.=Essas opções são aleatorias, e dependentes do nível de experiência; mas a força do encantamento pode ser aumentado. + +To increase the enchantment strength, place bookshelves around the enchanting table. However, you will need to keep 1 air node between the table, & the bookshelves to empower the enchanting table.=Para aumentar a força do encantamento, posicione estantes de livros em volta da mesa de encantamentos. Porém, você precisará manter 1 bloco de ar entre a mesa e as estantes para potencializar a mesa de encantamentos. + +Usage: /enchant []=Uso: /enchant [] +Usage: /forceenchant []=Uso: /forceenchant [] + + +##### not used anymore ##### + +# textdomain: mcl_enchanting +Aqua Affinity=Afinidade Aquática +Increases underwater mining speed.=Aumenta a velocidade de mineração em baixo da água. +Blast Protection=Proteção Contra Explosões +Reduces explosion damage and knockback.=Reduz dano de explosão e repulsão. +Curse of Binding=Maldição do Ligamento +Item cannot be removed from armor slots except due to death, breaking or in Creative Mode.=Item não pode ser removido dos slots de armadura exceto em caso de morte, quebra ou no Modo Criativo. +Feather Falling=Peso-Pena +Reduces fall damage.=Reduz o dano de queda. +Fire Protection=Proteção Contra Fogo +Reduces fire damage.=Reduz o dano do fogo. +Projectile Protection=Proteção Contra Projéteis +Reduces projectile damage.=Reduz danos de projéteis. +Protection=Proteção +Reduces most types of damage by 4% for each level.=Reduz a maioria dos tipos de danos em 4% para cada nível. +Thorns=Espinhos +Reflects some of the damage taken when hit, at the cost of reducing durability with each proc.=Reflete parte do dano recebido quando acertado, ao custo de reduzir a durabilidade em cada processo. From d0697c70ccc5d9ad122cabf3bebcb62ce6783be0 Mon Sep 17 00:00:00 2001 From: JoseDouglas26 Date: Wed, 6 Dec 2023 13:15:50 -0300 Subject: [PATCH 558/982] mcl_fire pt_BR translation --- mods/ITEMS/mcl_fire/locale/mcl_fire.pt_BR.tr | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) create mode 100644 mods/ITEMS/mcl_fire/locale/mcl_fire.pt_BR.tr diff --git a/mods/ITEMS/mcl_fire/locale/mcl_fire.pt_BR.tr b/mods/ITEMS/mcl_fire/locale/mcl_fire.pt_BR.tr new file mode 100644 index 000000000..f14b142a1 --- /dev/null +++ b/mods/ITEMS/mcl_fire/locale/mcl_fire.pt_BR.tr @@ -0,0 +1,19 @@ +# textdomain: mcl_fire +Fire Charge=Bola de Fogo +Fire charges are primarily projectiles which can be launched from dispensers, they will fly in a straight line and burst into a fire on impact. Alternatively, they can be used to ignite fires directly.=Bolas de fogo são primariamente Projéteis aos quais podem ser lançados por ejetores, eles voarão em linha reta e explodirão em chamas no impacto. Alternativamente, elas podem ser usadas para acender fogos diretamente. +Put the fire charge into a dispenser and supply it with redstone power to launch it. To ignite a fire directly, simply place the fire charge on the ground, which uses it up.=Ponha a bola de fogo em um ejetor e forneça-o uma carga de redstone para lança-la. Para acender um fogo diretamente, simplesmente posicione a bola de fogo no chão, o que a consumirá. +Flint and Steel=Isqueiro +Flint and steel is a tool to start fires and ignite blocks.=Isqueiro é uma ferramenta que põe fogo e acende blocos. +Rightclick the surface of a block to attempt to light a fire in front of it or ignite the block. A few blocks have an unique reaction when ignited.=Clique com o botão direito na superfície de um bloco para tentar acender um fogo em frente ou acender um bloco. Poucos blocos têm uma reação única quando acesos. +Fire is a damaging and destructive but short-lived kind of block. It will destroy and spread towards near flammable blocks, but fire will disappear when there is nothing to burn left. It will be extinguished by nearby water and rain. Fire can be destroyed safely by punching it, but it is hurtful if you stand directly in it. If a fire is started above netherrack or a magma block, it will immediately turn into an eternal fire.=Fogo é um tipo de bloco danoso e destrutivo de vida curta. Destruirá e se espalhará para blocos inflamáveis próximos, mas o fogo vai desaparecer quando não restar mais nada para queimar. Será extinguido por água próxima ou pela chuva. O fogo pode ser destruído em segurança socando-o, mas é doloroso se você ficar em pé diretamente nele. Se um fogo for iniciado sobre netherrack ou bloco de magma, será transformado imediatamente em fogo eterno. +Fire is a damaging but non-destructive short-lived kind of block. It will disappear when there is no flammable block around. Fire does not destroy blocks, at least not in this world. It will be extinguished by nearby water and rain. Fire can be destroyed safely by punching it, but it is hurtful if you stand directly in it. If a fire is started above netherrack or a magma block, it will immediately turn into an eternal fire.=Fogo é um tipo de bloco danoso mas não destrutivo de vida curta. Irá desaparecer quando não houver mais blocos inflamáveis por perto. O fogo não destrói blocos, pelo menos não nesse mundo. Será extinguido por água próxima ou chuva. O fogo pode ser destruído em segurança socando-o, mas é doloroso se você ficar em pé diretamente nele. Se um fogo for iniciado sobre netherrack ou bloco de magma, será transformado imediatamente em fogo eterno. +Eternal fire is a damaging block that might create more fire. It will create fire around it when flammable blocks are nearby. Eternal fire can be extinguished by punches and nearby water blocks. Other than (normal) fire, eternal fire does not get extinguished on its own and also continues to burn under rain. Punching eternal fire is safe, but it hurts if you stand inside.=Fogo eterno é um bloco danoso que pode criar mais fogo. Irá criar fogo em volta quando blocos inflamáveis estão por perto. O fogo eterno pode ser extinguido por socos ou blocos de água próximos. Diferente do fogo (normal), o fogo eterno não se extingue sozinho e também continua queimando sob chuvas. Socar o fogo eterno é seguro, mas machuca se você ficar em pé dentro. +Eternal fire is a damaging block. Eternal fire can be extinguished by punches and nearby water blocks. Other than (normal) fire, eternal fire does not get extinguished on its own and also continues to burn under rain. Punching eternal fire is safe, but it hurts if you stand inside.=Fogo eterno é um bloco danoso. O fogo eterno pode ser extinguido por socos ou blocos de água próximos. Diferente do fogo (normal), o fogo eterno não se extingue sozinho e também continua queimando sob chuvas. Socar o fogo eterno é seguro, mas machuca se você ficar em pé dentro. +@1 has been cooked crisp.=@1 foi cozido crocante. +@1 felt the burn.=@1 sentiu a queimadura. +@1 died in the flames.=@1 morreu em chamas. +@1 died in a fire.=@1 morreu em um fogo. +Fire=Fogo +Eternal Fire=Fogo Eterno +Dispenser projectile=Projétil do Ejetor +Starts fires and ignites blocks=Põe fogo e acende blocos From c1e3c698006f26d113b529cfa1f9d1fcae5e6970 Mon Sep 17 00:00:00 2001 From: JoseDouglas26 Date: Wed, 6 Dec 2023 13:29:38 -0300 Subject: [PATCH 559/982] mcl_monster_eggs pt_BR translation --- .../mcl_monster_eggs/locale/mcl_monster_eggs.pt_BR.tr | 9 +++++++++ 1 file changed, 9 insertions(+) create mode 100644 mods/ITEMS/mcl_monster_eggs/locale/mcl_monster_eggs.pt_BR.tr diff --git a/mods/ITEMS/mcl_monster_eggs/locale/mcl_monster_eggs.pt_BR.tr b/mods/ITEMS/mcl_monster_eggs/locale/mcl_monster_eggs.pt_BR.tr new file mode 100644 index 000000000..ae5e247b1 --- /dev/null +++ b/mods/ITEMS/mcl_monster_eggs/locale/mcl_monster_eggs.pt_BR.tr @@ -0,0 +1,9 @@ +# textdomain: mcl_monster_eggs +An infested block is a block from which a silverfish will pop out when it is broken. It looks identical to its normal counterpart.=Um bloco infestado é um bloco ao qual uma traça irá sair quando quebrá-lo. Parece idêntico a sua contraparte normal. +Infested Stone=Pedra Infestada +Infested Cobblestone=Pedregulho Infestado +Infested Stone Bricks=Tijolos de Pedra Infestados +Infested Cracked Stone Bricks=Tijolos de Pedra Rachados Infestados +Infested Mossy Stone Bricks=Tijolos de Pedra Musgosos Infestados +Infested Chiseled Stone Bricks=Tijolos de Pedra Talhados Infestados +Hides a silverfish=Escondem uma traça From f904512e61a0966ce40ef19b639fc2bdfc32cce7 Mon Sep 17 00:00:00 2001 From: JoseDouglas26 Date: Thu, 7 Dec 2023 21:08:28 -0300 Subject: [PATCH 560/982] mcl_comparators pt_BR translation --- .../mcl_comparators/locale/mcl_comparators.pt_BR.tr | 12 ++++++++++++ 1 file changed, 12 insertions(+) create mode 100644 mods/ITEMS/REDSTONE/mcl_comparators/locale/mcl_comparators.pt_BR.tr diff --git a/mods/ITEMS/REDSTONE/mcl_comparators/locale/mcl_comparators.pt_BR.tr b/mods/ITEMS/REDSTONE/mcl_comparators/locale/mcl_comparators.pt_BR.tr new file mode 100644 index 000000000..2139b73b1 --- /dev/null +++ b/mods/ITEMS/REDSTONE/mcl_comparators/locale/mcl_comparators.pt_BR.tr @@ -0,0 +1,12 @@ +# textdomain: mcl_comparators +Redstone comparators are multi-purpose redstone components.=Comparadores de redstone são componentes de redstone multi propósito. +They can transmit a redstone signal, detect whether a block contains any items and compare multiple signals.=Eles podem transmitir um sinal de redstone, detectar se um bloco contém alguns itens e compara multíplos sinais. +A redstone comparator has 1 main input, 2 side inputs and 1 output. The output is in arrow direction, the main input is in the opposite direction. The other 2 sides are the side inputs.=Um comparador de redstone tem 1 entrada principal, 2 entradas laterais e 1 saída. A saída é na direção da seta, a entrada principal é na direção oposta. Os outros 2 lados são as entradas laterais. +The main input can powered in 2 ways: First, it can be powered directly by redstone power like any other component. Second, it is powered if, and only if a container (like a chest) is placed in front of it and the container contains at least one item.=A entrada principal pode ser energizada de 2 maneiras: Primeiro, ela pode ser energizada diretamente por carga de redstone como qualquer outro componente. Segundo, é energizada se, e somente se um recipiente (como um baú) é posicionado em frente dele e o recipiente conter pelo menos um item. +The side inputs are only powered by normal redstone power. The redstone comparator can operate in two modes: Transmission mode and subtraction mode. It starts in transmission mode and the mode can be changed by using the block.=As entradas laterais são energizadas apenas por cargas normais de redstone. O comparador de redstone pode operar em dois modos: Modo de transmissão e modo de subtração. Iniciará em modo de transmissão e o modo pode ser alterado usando o bloco. +Transmission mode:@nThe front torch is unlit and lowered. The output is powered if, and only if the main input is powered. The two side inputs are ignored.=Modo de transmissão:@nA tocha frontal é apagada e baixada. A saída é energizada se, e somente se a entrada principal é energizada. As entradas laterais são ignoradas. +Subtraction mode:@nThe front torch is lit. The output is powered if, and only if the main input is powered and none of the side inputs is powered.=Modo de subtração:@nA tocha frontal é acesa. A saída é energizada se, e somente se a entrada principal é energizada e nenhuma das entradas laterais estiverem energizadas. +Redstone Comparator=Comparador de Redstone +Redstone Comparator (Subtract)=Comparador de Redstone (Subtração) +Redstone Comparator (Powered)=Comparador de Redstone (Energizado) +Redstone Comparator (Subtract, Powered)=Comparador de Redstone (Subtração, Energizado) From a5370bc63d9851925b4d2281c2e7366718d21235 Mon Sep 17 00:00:00 2001 From: JoseDouglas26 Date: Thu, 7 Dec 2023 21:13:21 -0300 Subject: [PATCH 561/982] mcl_target pt_BR translation --- mods/ITEMS/REDSTONE/mcl_target/locale/mcl_target.pt_BR.tr | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 mods/ITEMS/REDSTONE/mcl_target/locale/mcl_target.pt_BR.tr diff --git a/mods/ITEMS/REDSTONE/mcl_target/locale/mcl_target.pt_BR.tr b/mods/ITEMS/REDSTONE/mcl_target/locale/mcl_target.pt_BR.tr new file mode 100644 index 000000000..877e89c82 --- /dev/null +++ b/mods/ITEMS/REDSTONE/mcl_target/locale/mcl_target.pt_BR.tr @@ -0,0 +1,4 @@ +# textdomain: mcl_target +Target=Alvo +A target is a block that provides a temporary redstone charge when hit by a projectile.=Um alvo é um bloco que fornece uma carga temporária de redstone quando atingido por um projétil. +Throw a projectile on the target to activate it.=Arremesse um projétil no alvo para ativá-lo. From e28207f44e7e4e900f9def7c3552f04c6717508f Mon Sep 17 00:00:00 2001 From: JoseDouglas26 Date: Thu, 7 Dec 2023 21:30:42 -0300 Subject: [PATCH 562/982] mesecons_walllever pt_BR translation --- .../mesecons_walllever/locale/mesecons_walllever.pt_BR.tr | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 mods/ITEMS/REDSTONE/mesecons_walllever/locale/mesecons_walllever.pt_BR.tr diff --git a/mods/ITEMS/REDSTONE/mesecons_walllever/locale/mesecons_walllever.pt_BR.tr b/mods/ITEMS/REDSTONE/mesecons_walllever/locale/mesecons_walllever.pt_BR.tr new file mode 100644 index 000000000..e2f6b7d45 --- /dev/null +++ b/mods/ITEMS/REDSTONE/mesecons_walllever/locale/mesecons_walllever.pt_BR.tr @@ -0,0 +1,5 @@ +# textdomain: mesecons_walllever +Lever=Alavanca +A lever is a redstone component which can be flipped on and off. It supplies redstone power to adjacent blocks while it is in the “on” state.=Uma alavanca é um componente de redstone ao qual pode ser comutado em ligado ou desligado. Fornecerá carga de redstone para blocos adjacentes enquanto estiver no estado "ligado". +Use the lever to flip it on or off.=Use a alavanca para comutá-la em ligado ou desligado. +Provides redstone power while it's turned on=Fornece carga de redstone enquanto estiver ligada From 01abafe50ff87faafff4f986fe5ec73e11776f85 Mon Sep 17 00:00:00 2001 From: JoseDouglas26 Date: Thu, 7 Dec 2023 21:46:22 -0300 Subject: [PATCH 563/982] mesecons_button pt_BR translation --- .../locale/mesecons_button.pt_BR.tr | 20 +++++++++++++++++++ 1 file changed, 20 insertions(+) create mode 100644 mods/ITEMS/REDSTONE/mesecons_button/locale/mesecons_button.pt_BR.tr diff --git a/mods/ITEMS/REDSTONE/mesecons_button/locale/mesecons_button.pt_BR.tr b/mods/ITEMS/REDSTONE/mesecons_button/locale/mesecons_button.pt_BR.tr new file mode 100644 index 000000000..f7ec2dd59 --- /dev/null +++ b/mods/ITEMS/REDSTONE/mesecons_button/locale/mesecons_button.pt_BR.tr @@ -0,0 +1,20 @@ +# textdomain: mesecons_button +Use the button to push it.=Use o botão para pressioná-lo. +Stone Button=Botão de Pedra +A stone button is a redstone component made out of stone which can be pushed to provide redstone power. When pushed, it powers adjacent redstone components for 1 second.=Um botão de pedra é um componente de redstone feito de pedra ao qual pode ser pressionado para fornecer carga de redstone. Quando pressionado, irá energizar componentes de redstone adjacentes por 1 segundo. +Polished Blackstone Button=Botão de Rocha Negra Polida +A polished blackstone button is a redstone component made out of polished blackstone which can be pushed to provide redstone power. When pushed, it powers adjacent redstone components for 1 second.=Um botão de rocha negra polida é um componente de redstone feito de pedra negra polida ao qual pode ser pressionado para fornecer carga de redstone. Quando pressionado, irá energizar componentes de redstone adjacentes por 1 segundo. +Oak Button=Botão de Carvalho +Acacia Button=Botão de Acácia +Birch Button=Botão de Bétula +Dark Oak Button=Botão de Carvalho Escuro +Spruce Button=Botão de Pinheiro +Jungle Button=Botão da Selva +Mangrove Button=Botão de Mangue +Crimson Button=Botão de Hifas Carmesim +Warped Button=Botão de Hifas Distorcidas +A wooden button is a redstone component made out of wood which can be pushed to provide redstone power. When pushed, it powers adjacent redstone components for 1.5 seconds. Wooden buttons may also be pushed by arrows.=Um botão de madeira é um componente de redstone feito de madeira ao qual pode ser pressionado para fornecer carga de redstone. Quando pressionado, irá energizar componentes de redstone adjacentes por 1.5 segundo. Botões de madeira também podem ser pressionados por flechas. +Provides redstone power when pushed=Fornece carga de redstone quando é pressionado +Push duration: @1s=Duração de pressão: @1s +Pushable by arrow=Pressionável por flecha +A button is a redstone component which can be pushed to provide redstone power. When pushed, it powers adjacent redstone components for @1 seconds.=Um botão é um componente de redstone ao qual pode ser pressionado para fornecer carga de redstone. Quando pressionado, irá energizar componentes de redstone adjacentes por @1 segundos. From 73bcb0026f063b56e171c103b24ca947728e284b Mon Sep 17 00:00:00 2001 From: JoseDouglas26 Date: Thu, 7 Dec 2023 21:53:29 -0300 Subject: [PATCH 564/982] mcl_observers pt_BR translation --- .../REDSTONE/mcl_observers/locale/mcl_observers.pt_BR.tr | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 mods/ITEMS/REDSTONE/mcl_observers/locale/mcl_observers.pt_BR.tr diff --git a/mods/ITEMS/REDSTONE/mcl_observers/locale/mcl_observers.pt_BR.tr b/mods/ITEMS/REDSTONE/mcl_observers/locale/mcl_observers.pt_BR.tr new file mode 100644 index 000000000..18e82eb11 --- /dev/null +++ b/mods/ITEMS/REDSTONE/mcl_observers/locale/mcl_observers.pt_BR.tr @@ -0,0 +1,5 @@ +# textdomain: mcl_observers +Observer=Observador +An observer is a redstone component which observes the block in front of it and sends a very short redstone pulse whenever this block changes.=Um observador é um componente de redstone o qual observa o bloco a sua frente e envia um pulso de redstone muito curto sempre que esse bloco mudar. +Place the observer directly in front of the block you want to observe with the “face” looking at the block. The arrow points to the side of the output, which is at the opposite side of the “face”. You can place your redstone dust or any other component here.=Posicione o observador diretamente em frente ao bloco que você deseja observar com a "face" olhando para o bloco. A seta aponta para o lado da saída, a qual está no lado oposto da "face". Você pode posicionar seu pó de redstone ou outros componentes aqui. +Emits redstone pulse when block in front changes=Emite um pulso de redstone quando um bloco muda em sua frente From 7b93c65c450934ec97e3592202f851ca559ce5e3 Mon Sep 17 00:00:00 2001 From: JoseDouglas26 Date: Thu, 7 Dec 2023 21:59:49 -0300 Subject: [PATCH 565/982] mcl_droppers pt_BR translation --- .../REDSTONE/mcl_droppers/locale/mcl_droppers.pt_BR.tr | 9 +++++++++ 1 file changed, 9 insertions(+) create mode 100644 mods/ITEMS/REDSTONE/mcl_droppers/locale/mcl_droppers.pt_BR.tr diff --git a/mods/ITEMS/REDSTONE/mcl_droppers/locale/mcl_droppers.pt_BR.tr b/mods/ITEMS/REDSTONE/mcl_droppers/locale/mcl_droppers.pt_BR.tr new file mode 100644 index 000000000..56917c8f2 --- /dev/null +++ b/mods/ITEMS/REDSTONE/mcl_droppers/locale/mcl_droppers.pt_BR.tr @@ -0,0 +1,9 @@ +# textdomain: mcl_droppers +Dropper=Liberador +A dropper is a redstone component and a container with 9 inventory slots which, when supplied with redstone power, drops an item or puts it into a container in front of it.=Um liberador é um componente de redstone e um recipiente com 9 slots de inventário ao qual, quando alimentado com carga de redstone, libera um item ou coloca-o em um recipiente em sua frente. +Droppers can be placed in 6 possible directions, items will be dropped out of the hole. Use the dropper to access its inventory. Supply it with redstone energy once to make the dropper drop or transfer a random item.=Liberadores podem ser posicionados em 6 direções possíveis, os itens serão liberados pelo buraco. Use o liberador para acessar seu inventário. Alimente-o com carga de redstone uma vez para fazer o liberador liberar ou transferir um item aleatório. +Downwards-Facing Dropper=Liberador Virado Para Baixo +Upwards-Facing Dropper=Liberador Virado Para Cima +Inventory=Inventário +9 inventory slots=Inventário de 9 slots +Drops item when powered by redstone power=Libera itens quando energizados por carga de redstone From 907e037430ad73ecf7f649488b535ad478bcf640 Mon Sep 17 00:00:00 2001 From: JoseDouglas26 Date: Thu, 7 Dec 2023 22:14:32 -0300 Subject: [PATCH 566/982] mcl_dispensers pt_BR translation --- .../locale/mcl_dispensers.pt_BR.tr | 25 +++++++++++++++++++ 1 file changed, 25 insertions(+) create mode 100644 mods/ITEMS/REDSTONE/mcl_dispensers/locale/mcl_dispensers.pt_BR.tr diff --git a/mods/ITEMS/REDSTONE/mcl_dispensers/locale/mcl_dispensers.pt_BR.tr b/mods/ITEMS/REDSTONE/mcl_dispensers/locale/mcl_dispensers.pt_BR.tr new file mode 100644 index 000000000..b21f401ed --- /dev/null +++ b/mods/ITEMS/REDSTONE/mcl_dispensers/locale/mcl_dispensers.pt_BR.tr @@ -0,0 +1,25 @@ +# textdomain: mcl_dispensers +Dispenser=Ejetor +A dispenser is a block which acts as a redstone component which, when powered with redstone power, dispenses an item. It has a container with 9 inventory slots.=Um ejetor é um bloco ao qual age como um componente de redstone ao qual, quando energizado com carga de redstone, ejeta um item. Tem um recipiente com 9 slots de inventário. +Place the dispenser in one of 6 possible directions. The “hole” is where items will fly out of the dispenser. Use the dispenser to access its inventory. Insert the items you wish to dispense. Supply the dispenser with redstone energy once to dispense a random item.=Posicione o ejetor em uma das 6 direções possíveis. O "buraco" é por onde os itens irão voar para fora do ejetor. Use o ejetor para acessar seu inventário. Insira os itens que você deseja ejetar. Alimente o ejetor com carga de redstone uma vez para ejetar um item aleatório. +The dispenser will do different things, depending on the dispensed item:=O ejetor irá fazer coisas diferentes, dependendo do item ejetado: +• Arrows: Are launched=• Flechas: Serão lançadas +• Eggs and snowballs: Are thrown=• Ovos e bolas de neve: São arremessadas +• Fire charges: Are fired in a straight line=• Bolas de fogo: São atiradas em uma linha reta +• Armor: Will be equipped to players and armor stands=• Armadura: Será equipada em jogadores e suportes de armaduras +• Boats: Are placed on water or are dropped=• Barcos: São posicionados em água ou são liberados +• Minecart: Are placed on rails or are dropped=• Carrinhos: São posicionados em trilhos ou são liberados +• Bone meal: Is applied on the block it is facing=• Farinha de osso: É aplicada no bloco ao qual está encarando +• Empty buckets: Are used to collect a liquid source=• Baldes vazios: São usados para coletar uma fonte de líquido +• Filled buckets: Are used to place a liquid source=• Baldes preenchidos: São usados para posicionar uma fonte de líquido +• Heads, pumpkins: Equipped to players and armor stands, or placed as a block=• Cabeças, abóboras: São equipadas em jogadores e suportes de armaduras, ou posicionadas como um bloco +• Shulker boxes: Are placed as a block=• Caixas shulker: São posicionadas como um bloco +• TNT: Is placed and ignited=• TNT: É posicionada e acesa +• Flint and steel: Is used to ignite a fire in air and to ignite TNT=• Isqueiro: É usado para acender um fogo no ar e para acender uma TNT +• Spawn eggs: Will summon the mob they contain=• Ovos de geração: Vão invocar o mob que eles contém +• Other items: Are simply dropped=• Outros itens: São simplesmente liberados +Downwards-Facing Dispenser=Ejetor Virado Para Baixo +Upwards-Facing Dispenser=Ejetor Virado Para Cima +Inventory=Inventário +9 inventory slots=Inventário de 9 slots +Launches item when powered by redstone power=Lança itens quando energizados por carga de redstone From 85bc643442d0bd9ab77344b7cd838ce13f4497a1 Mon Sep 17 00:00:00 2001 From: JoseDouglas26 Date: Thu, 7 Dec 2023 22:19:13 -0300 Subject: [PATCH 567/982] mesecons_lightstone pt_BR translation --- .../mesecons_lightstone/locale/mesecons_lightstone.pt_BR.tr | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 mods/ITEMS/REDSTONE/mesecons_lightstone/locale/mesecons_lightstone.pt_BR.tr diff --git a/mods/ITEMS/REDSTONE/mesecons_lightstone/locale/mesecons_lightstone.pt_BR.tr b/mods/ITEMS/REDSTONE/mesecons_lightstone/locale/mesecons_lightstone.pt_BR.tr new file mode 100644 index 000000000..8d3c8a0fd --- /dev/null +++ b/mods/ITEMS/REDSTONE/mesecons_lightstone/locale/mesecons_lightstone.pt_BR.tr @@ -0,0 +1,4 @@ +# textdomain: mesecons_lightstone +Redstone Lamp=Lâmpada de Redstone +Redstone lamps are simple redstone components which glow brightly (light level @1) when they receive redstone power.=Lâmpadas de redstone são componentes de redstone simples ao qual brilha intensamente (nível de brilho @1) quando recebe carga de redstone. +Glows when powered by redstone power=Bliha quando energizada com carga de redstone From c20a37486e4b55e3a9ade123b751d5758d8a9d54 Mon Sep 17 00:00:00 2001 From: JoseDouglas26 Date: Fri, 8 Dec 2023 06:25:57 -0300 Subject: [PATCH 568/982] mesecons_pressureplates pt_BR translation --- .../locale/mesecons_pressureplates.pt_BR.tr | 21 +++++++++++++++++++ 1 file changed, 21 insertions(+) create mode 100644 mods/ITEMS/REDSTONE/mesecons_pressureplates/locale/mesecons_pressureplates.pt_BR.tr diff --git a/mods/ITEMS/REDSTONE/mesecons_pressureplates/locale/mesecons_pressureplates.pt_BR.tr b/mods/ITEMS/REDSTONE/mesecons_pressureplates/locale/mesecons_pressureplates.pt_BR.tr new file mode 100644 index 000000000..b0abc529c --- /dev/null +++ b/mods/ITEMS/REDSTONE/mesecons_pressureplates/locale/mesecons_pressureplates.pt_BR.tr @@ -0,0 +1,21 @@ +# textdomain: mesecons_pressureplates +A pressure plate is a redstone component which supplies its surrounding blocks with redstone power while someone or something rests on top of it.=Uma placa de pressão é um componente de redstone ao qual alimenta os blocos ao seu redor com carga de redstone enquanto alguém ou alguma coisa descansa em cima dela. +Oak Pressure Plate=Placa de Pressão de Carvalho +Acacia Pressure Plate=Placa de Pressão de Acácia +Birch Pressure Plate=Placa de Pressão de Bétula +Dark Oak Pressure Plate=Placa de Pressão de Carvalho Escuro +Spruce Pressure Plate=Placa de Pressão de Pinheiro +Jungle Pressure Plate=Placa de Pressão da Selva +Mangrove Pressure Plate=Placa de Pressão de Mangue +Crimson Pressure Plate=Placa de Pressão de Hifas Carmesim +Warped Pressure Plate=Placa de Pressão de Hifas Distorcidas +A wooden pressure plate is a redstone component which supplies its surrounding blocks with redstone power while any movable object (including dropped items, players and mobs) rests on top of it.=Uma placa de pressão de madeira é um componente de redstone ao qual alimenta os blocos ao seu redor com carga de redstone enquanto qualquer objeto móvel (incluindo itens largados, jogadores e mobs) descansarem em cima dela. +Polished Blackstone Pressure Plate=Placa de Pressão de Rocha Negra Polida +A polished blackstone pressure plate is a redstone component which supplies its surrounding blocks with redstone power while a player or mob stands on top of it. It is not triggered by anything else.=Uma placa de pressão de pedra negra polida é um componente de redstone ao qual alimenta os blocos ao seu redor com carga de redstone enquanto um jogador ou mob estiver em pé em cima dela. Não é acionada por outras coisas. +Stone Pressure Plate=Placa de Pressão de Pedra +A stone pressure plate is a redstone component which supplies its surrounding blocks with redstone power while a player or mob stands on top of it. It is not triggered by anything else.=Uma placa de pressão de pedra é um componente de redstone ao qual alimenta os blocos ao seu redor com carga de redstone enquanto um jogador ou mob estiver em pé em cima dela. Não é acionada por outras coisas. +Provides redstone power when pushed=Fornece carga de redstone quando pressionada +Pushable by players, mobs and objects=Pressionável por jogadores, mobs e objetos +Pushable by players and mobs=Pressionável por jogadores e mobs +Pushable by players=Pressionável por jogadores +Pushable by mobs=Pressionável por mobs From d59a6c6a009ef7c1de4a16471eb6caabcadd4c1e Mon Sep 17 00:00:00 2001 From: JoseDouglas26 Date: Fri, 8 Dec 2023 06:39:40 -0300 Subject: [PATCH 569/982] mesecons_delayer pt_BR translation --- .../locale/mesecons_delayer.pt_BR.tr | 13 +++++++++++++ 1 file changed, 13 insertions(+) create mode 100644 mods/ITEMS/REDSTONE/mesecons_delayer/locale/mesecons_delayer.pt_BR.tr diff --git a/mods/ITEMS/REDSTONE/mesecons_delayer/locale/mesecons_delayer.pt_BR.tr b/mods/ITEMS/REDSTONE/mesecons_delayer/locale/mesecons_delayer.pt_BR.tr new file mode 100644 index 000000000..75af2b8b1 --- /dev/null +++ b/mods/ITEMS/REDSTONE/mesecons_delayer/locale/mesecons_delayer.pt_BR.tr @@ -0,0 +1,13 @@ +# textdomain: mesecons_delayer +Redstone repeaters are versatile redstone components with multiple purposes: 1. They only allow signals to travel in one direction. 2. They delay the signal. 3. Optionally, they can lock their output in one state.=Repetidores de redstone são componentes de redstone versáteis com multíplos propósitos: 1. Eles apenas permitem que sinais viajem em uma direção. 2. Eles atrasam o sinal. 3. Opcionalmente, eles podem travar suas saídas em um estado. +To power a redstone repeater, send a signal in “arrow” direction (the input). The signal goes out on the opposite side (the output) with a delay. To change the delay, use the redstone repeater. The delay is between 0.1 and 0.4 seconds long and can be changed in steps of 0.1 seconds. It is indicated by the position of the moving redstone torch.=Para energizar um repetidor de redstone, envie um sinal na direção da "seta" (a entrada). O sinal sairá no lado oposto (a saída) com um atraso. Para mudar o atraso, use o repetidor de redstone. O atraso é entre 0.1 e 0.4 segundos de duração e podem ser mudados em passos de 0.1 segundo. É indicado pela posição da tocha tocha de redstone móvel. +To lock a repeater, send a signal from an adjacent repeater into one of its sides. While locked, the moving redstone torch disappears, the output doesn't change and the input signal is ignored.=Para travar um repetidor, envie um sinal de um repetidor adjacente para uma de suas laterais. Enquanto travado, a tocha de redstone móvel desaparece, a saída não muda e o sinal de entrada é ignorado. +Redstone Repeater=Repetidor de Redstone +Redstone Repeater (Powered)=Repetidor de Redstone (Energizado) +Redstone Repeater (Locked)=Repetidor de Redstone (Travado) +Redstone Repeater (Locked, Powered)=Repetidor de Redstone (Travado, Energizado) +Redstone Repeater (Delay @1)=Repetidor de Redstone (Atraso @1) +Redstone Repeater (Delay @1, Powered)=Repetidor de Redstone (Atraso @1, Energizado) +Transmits redstone power only in one direction=Transmite carga de redstone em apenas uma direção +Delays signal=Atrasa o sinal +Output locks when getting active redstone repeater signal from the side=A saída é travada quando estiver recebendo um sinal de um repetidor de redstone ativo pelas laterais From 29d40ef55375b7cc1d31b442038c75613d6db32d Mon Sep 17 00:00:00 2001 From: cora Date: Mon, 18 Dec 2023 12:02:46 +0100 Subject: [PATCH 570/982] Mix down new mob sounds to mono --- .../mobs_mc/sounds/extra_mobs_hoglin.1.ogg | Bin 6514 -> 4948 bytes .../mobs_mc/sounds/extra_mobs_hoglin.2.ogg | Bin 10262 -> 7163 bytes .../mobs_mc/sounds/extra_mobs_hoglin_hurt.ogg | Bin 5751 -> 4363 bytes 3 files changed, 0 insertions(+), 0 deletions(-) mode change 100755 => 100644 mods/ENTITIES/mobs_mc/sounds/extra_mobs_hoglin.1.ogg mode change 100755 => 100644 mods/ENTITIES/mobs_mc/sounds/extra_mobs_hoglin.2.ogg mode change 100755 => 100644 mods/ENTITIES/mobs_mc/sounds/extra_mobs_hoglin_hurt.ogg diff --git a/mods/ENTITIES/mobs_mc/sounds/extra_mobs_hoglin.1.ogg b/mods/ENTITIES/mobs_mc/sounds/extra_mobs_hoglin.1.ogg old mode 100755 new mode 100644 index 06bdc4b248f23aa576569030446b3e56a2cb6196..5bc9a18ee96d50606bd4f24ba243925fb6c7ec9c GIT binary patch literal 4948 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 literal 6514 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 literal 5751 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 From e1d5899aa53337dcaf0354614910ea6b2070635b Mon Sep 17 00:00:00 2001 From: the-real-herowl Date: Sun, 24 Dec 2023 01:27:29 +0100 Subject: [PATCH 571/982] Remove unneeded dependencies This patches a heisenbug to be investigated later --- mods/PLAYER/mcl_fovapi/mod.conf | 1 - mods/PLAYER/mcl_sprint/mod.conf | 2 +- 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/mods/PLAYER/mcl_fovapi/mod.conf b/mods/PLAYER/mcl_fovapi/mod.conf index 86f174c41..3aff902a1 100644 --- a/mods/PLAYER/mcl_fovapi/mod.conf +++ b/mods/PLAYER/mcl_fovapi/mod.conf @@ -1,4 +1,3 @@ name = mcl_fovapi author = Michieal, Herowl description = An API for handling FOV changes. -depends = mcl_player diff --git a/mods/PLAYER/mcl_sprint/mod.conf b/mods/PLAYER/mcl_sprint/mod.conf index 9b9a7366b..b8bc02698 100644 --- a/mods/PLAYER/mcl_sprint/mod.conf +++ b/mods/PLAYER/mcl_sprint/mod.conf @@ -2,4 +2,4 @@ name = mcl_sprint author = GunshipPenguin description = Allows the player to sprint by pressing the “AUX” key (default: E). depends = mcl_playerinfo, playerphysics, mcl_hunger, mcl_fovapi -optional = mcl_bows \ No newline at end of file +optional = mcl_bows From a2a4da5aed0aaf94c941cb457e760cf8cfaec60d Mon Sep 17 00:00:00 2001 From: the-real-herowl Date: Sun, 24 Dec 2023 05:48:41 +0100 Subject: [PATCH 572/982] Added shepherd functionality --- mods/CORE/mcl_util/init.lua | 13 ++- mods/ENTITIES/mcl_mobs/breeding.lua | 3 + mods/ENTITIES/mobs_mc/sheep.lua | 2 +- mods/ENVIRONMENT/mcl_weather/skycolor.lua | 3 +- mods/ITEMS/mcl_chests/init.lua | 12 +-- mods/ITEMS/mcl_shepherd/init.lua | 91 ++++++++++++++++++ mods/ITEMS/mcl_shepherd/mod.conf | 4 + .../mcl_shepherd/sounds/shepherd-midnight.ogg | Bin 0 -> 488662 bytes mods/ITEMS/mcl_spyglass/init.lua | 6 ++ textures/mcl_moon_special.png | Bin 0 -> 2316 bytes textures/mcl_tool_shepherd_staff.png | Bin 0 -> 176 bytes 11 files changed, 119 insertions(+), 15 deletions(-) create mode 100644 mods/ITEMS/mcl_shepherd/init.lua create mode 100644 mods/ITEMS/mcl_shepherd/mod.conf create mode 100644 mods/ITEMS/mcl_shepherd/sounds/shepherd-midnight.ogg create mode 100644 textures/mcl_moon_special.png create mode 100644 textures/mcl_tool_shepherd_staff.png diff --git a/mods/CORE/mcl_util/init.lua b/mods/CORE/mcl_util/init.lua index af0f92698..17ac6c9d6 100644 --- a/mods/CORE/mcl_util/init.lua +++ b/mods/CORE/mcl_util/init.lua @@ -327,7 +327,7 @@ function mcl_util.hopper_push(pos, dst_pos) local dst_list = 'main' local dst_inv, stack_id - + if dst_def._mcl_hoppers_on_try_push then dst_inv, dst_list, stack_id = dst_def._mcl_hoppers_on_try_push(dst_pos, pos, hop_inv, hop_list) else @@ -365,7 +365,7 @@ function mcl_util.hopper_pull(pos, src_pos) local src_list = 'main' local src_inv, stack_id - + if src_def._mcl_hoppers_on_try_pull then src_inv, src_list, stack_id = src_def._mcl_hoppers_on_try_pull(src_pos, pos, hop_inv, hop_list) else @@ -1096,3 +1096,12 @@ function mcl_util.move_player_list(player, src_listname) vector.offset(player:get_pos(), 0, 1.2, 0), player:get_look_dir(), false) end + +function mcl_util.is_it_christmas() + local date = os.date("*t") + if date.month == 12 and date.day >= 24 or date.month == 1 and date.day <= 7 then + return true + else + return false + end +end diff --git a/mods/ENTITIES/mcl_mobs/breeding.lua b/mods/ENTITIES/mcl_mobs/breeding.lua index c6d8f92cd..8d3e03ec6 100644 --- a/mods/ENTITIES/mcl_mobs/breeding.lua +++ b/mods/ENTITIES/mcl_mobs/breeding.lua @@ -32,6 +32,9 @@ function mob_class:feed_tame(clicker, feed_count, breed, tame, notake) if not self.follow then return false end + if clicker:get_wielded_item():get_definition()._mcl_not_consumable then + return false + end -- can eat/tame with item in hand if self.nofollow or self:follow_holding(clicker) then local consume_food = false diff --git a/mods/ENTITIES/mobs_mc/sheep.lua b/mods/ENTITIES/mobs_mc/sheep.lua index 4a5e924d8..b67b672c5 100644 --- a/mods/ENTITIES/mobs_mc/sheep.lua +++ b/mods/ENTITIES/mobs_mc/sheep.lua @@ -111,7 +111,7 @@ mcl_mobs.register_mob("mobs_mc:sheep", { run_start = 81, run_end = 121, run_speed = 60, eat_start = 121, eat_start = 161, eat_loop = false, }, - follow = { "mcl_farming:wheat_item" }, + follow = { "mcl_farming:wheat_item", "mcl_shepherd:shepherd_staff" }, view_range = 12, -- Eat grass diff --git a/mods/ENVIRONMENT/mcl_weather/skycolor.lua b/mods/ENVIRONMENT/mcl_weather/skycolor.lua index aea469760..6d9efd47a 100644 --- a/mods/ENVIRONMENT/mcl_weather/skycolor.lua +++ b/mods/ENVIRONMENT/mcl_weather/skycolor.lua @@ -120,12 +120,13 @@ mcl_weather.skycolor = { override_day_night_ratio = function(player, ratio) local meta = player:get_meta() local has_night_vision = meta:get_int("night_vision") == 1 + local is_visited_shepherd = meta:get_int("mcl_shepherd:special") == 1 local arg -- Apply night vision only for dark sky local is_dark = minetest.get_timeofday() > 0.8 or minetest.get_timeofday() < 0.2 or mcl_weather.state ~= "none" local pos = player:get_pos() local dim = mcl_worlds.pos_to_dimension(pos) - if has_night_vision and is_dark and dim ~= "nether" and dim ~= "end" then + if (has_night_vision or is_visited_shepherd) and is_dark and dim ~= "nether" and dim ~= "end" then if ratio == nil then arg = NIGHT_VISION_RATIO else diff --git a/mods/ITEMS/mcl_chests/init.lua b/mods/ITEMS/mcl_chests/init.lua index 38b1102a3..629f48fbc 100644 --- a/mods/ITEMS/mcl_chests/init.lua +++ b/mods/ITEMS/mcl_chests/init.lua @@ -13,17 +13,7 @@ local mod_doc = minetest.get_modpath("doc") mcl_chests = {} -- Christmas chest setup -local it_is_christmas = false -local date = os.date("*t") -if ( - date.month == 12 and ( - date.day == 24 or - date.day == 25 or - date.day == 26 - ) - ) then - it_is_christmas = true -end +local it_is_christmas = mcl_util.is_it_christmas() local tiles_chest_normal_small = { "mcl_chests_normal.png" } local tiles_chest_normal_double = { "mcl_chests_normal_double.png" } diff --git a/mods/ITEMS/mcl_shepherd/init.lua b/mods/ITEMS/mcl_shepherd/init.lua new file mode 100644 index 000000000..d06b02f93 --- /dev/null +++ b/mods/ITEMS/mcl_shepherd/init.lua @@ -0,0 +1,91 @@ +local modname = minetest.get_current_modname() +local modpath = minetest.get_modpath(modname) +local S = minetest.get_translator(modname) + + +minetest.register_tool("mcl_shepherd:shepherd_staff", { + description = S("Shepherd Staff"), + _doc_items_longdesc = S(""), + _doc_items_usagehelp = S(""), + inventory_image = "mcl_tool_shepherd_staff.png", + wield_scale = 1.3*mcl_vars.tool_wield_scale, + stack_max = 1, + groups = { weapon=1, tool=1, staff=1, enchantability=-1 }, + tool_capabilities = { + full_punch_interval = 1, + max_drop_level=1, + damage_groups = {fleshy=2}, + punch_attack_uses = 45, + }, + sound = { breaks = "default_tool_breaks" }, + _mcl_toollike_wield = true, + _mcl_diggroups = { + swordy = { speed = 1, level = 1, uses = 60 }, + swordy_cobweb = { speed = 1, level = 1, uses = 60 } + }, + _mcl_not_consumable = true, +}) + +if mcl_util.is_it_christmas() then + minetest.register_globalstep(function(dtime) + local time = minetest.get_timeofday() + if time < 0.005 or time > 0.995 then + for _, player in pairs(minetest.get_connected_players()) do + local meta = player:get_meta() + local sp = meta:get_int("mcl_shepherd:special") + if sp == 0 and player:get_wielded_item():get_definition().groups.staff then + local has_sheep = false + for _, obj in pairs(minetest.get_objects_inside_radius(player:get_pos(), 3)) do + local ent = obj:get_luaentity() + if ent and ent.name == "mobs_mc:sheep" then + has_sheep = true + break + end + end + if has_sheep then + minetest.sound_play( + {name="shepherd-midnight", gain=3, pitch=1.0}, + {to_player=player:get_player_name(), gain=1.0, fade=0.0, pitch=1.0}, + false + ) + meta:set_int("mcl_shepherd:special", 1) + mcl_weather.skycolor.update_sky_color({player}) + minetest.after(45, function(name) + local player = minetest.get_player_by_name(name) + if not player then return end + local meta = player:get_meta() + meta:set_int("mcl_shepherd:special", 0) + mcl_weather.skycolor.update_sky_color({player}) + end, player:get_player_name()) + end + end + end + end + end) + minetest.register_on_joinplayer(function(player) + local meta = player:get_meta() + meta:set_int("mcl_shepherd:special", 0) + end) +end + +minetest.register_craft({ + output = "mcl_shepherd:shepherd_staff", + recipe = { + {"","","mcl_core:stick"}, + {"","mcl_core:stick",""}, + {"mcl_core:stick","",""}, + } +}) +minetest.register_craft({ + output = "mcl_shepherd:shepherd_staff", + recipe = { + {"mcl_core:stick", "", ""}, + {"", "mcl_core:stick", ""}, + {"","","mcl_core:stick"}, + } +}) +minetest.register_craft({ + type = "fuel", + recipe = "mcl_shepherd:shepherd_staff", + burntime = 15, +}) diff --git a/mods/ITEMS/mcl_shepherd/mod.conf b/mods/ITEMS/mcl_shepherd/mod.conf new file mode 100644 index 000000000..972e324d0 --- /dev/null +++ b/mods/ITEMS/mcl_shepherd/mod.conf @@ -0,0 +1,4 @@ +name = mcl_shepherd +author = Herowl +depends = mcl_core, mobs_mc, mcl_util +optional_depends = doc diff --git a/mods/ITEMS/mcl_shepherd/sounds/shepherd-midnight.ogg b/mods/ITEMS/mcl_shepherd/sounds/shepherd-midnight.ogg new file mode 100644 index 0000000000000000000000000000000000000000..ddd6a4e90fe4fc07f87322a3930e0374211b4e43 GIT binary patch literal 488662 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�{zZ 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