diff --git a/LICENSE.txt b/LICENSE.txt new file mode 100644 index 0000000..94a0453 --- /dev/null +++ b/LICENSE.txt @@ -0,0 +1,621 @@ + 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 diff --git a/changelog.txt b/changelog.txt index 9e06c4d..8c13d9c 100644 --- a/changelog.txt +++ b/changelog.txt @@ -260,3 +260,25 @@ Alpha 1.5.0: Visual: Particles no longer become black when inside nodes. + +Alpha 1.6.0: + Identification: + Various items are now unidentified when first found. + Unidentified weapons have their level hidden, and become identified after 20 "proper" uses (No spam clicking) + Unidentified armors have their level hidden, and become identified after 15 hits taken while worn + Unidentified wands have their level hidden, which becomes known after 10 zaps. + Implemented: Scroll of Identify, instantly fully identifies a single selected item. + + Misc: + Eating mystery meat can now cause spontaneous combustion. + Repair tools now prevent you from trying to select items with no wear, rather than giving you a message about the item being fully repaired. + Updated various mods + Copied LICENSE.txt into base directory + + Fixed: + Armor's durability not being saved properly after taking damage. + Grass not properly dropping seeds + Compatability issues with MT 5.3 + + Performance: + Instead of a blob always iterating over every single position it covers, it instead is limited to 100 positions per second. So, extremely large blobs slow themselves more than the server as a whole. diff --git a/mods/3d_armor/3d_armor/tools/updatepo.sh b/mods/3d_armor/3d_armor/tools/updatepo.sh old mode 100755 new mode 100644 diff --git a/mods/3d_armor/preview_gen.py b/mods/3d_armor/preview_gen.py old mode 100755 new mode 100644 diff --git a/mods/bucket/textures/bucket.png b/mods/bucket/textures/bucket.png old mode 100755 new mode 100644 diff --git a/mods/default/README.txt b/mods/default/README.txt index 1bc899b..be8cbf1 100644 --- a/mods/default/README.txt +++ b/mods/default/README.txt @@ -123,6 +123,8 @@ paramat (CC BY-SA 3.0): default_fence_rail_junglewood default_fence_rail_pine_wood default_fence_rail_wood -- Derived from a texture by BlockMen (CC BY-SA 3.0) + gui_hotbar.png + gui_hotbar_selected.png TumeniNodes (CC BY-SA 3.0): default_desert_cobble.png -- Derived from a texture by brunob.santos (CC BY-SA 3.0) @@ -149,8 +151,10 @@ BlockMen (CC BY-SA 3.0): default_chest_top.png default_mineral_mese.png default_meselamp.png - bubble.png - gui_*.png + gui_formbg.png + gui_furnace_arrow_bg.png + gui_furnace_arrow_fg.png + gui_hb_bg.png sofar (CC BY-SA 3.0): default_aspen_sapling @@ -191,9 +195,6 @@ Gambit (CC BY-SA 3.0): asl97 (CC BY-SA 3.0): default_ice.png -KevDoy (CC BY-SA 3.0): - heart.png - Pithydon (CC BY-SA 3.0) default_coral_brown.png default_coral_orange.png @@ -248,6 +249,11 @@ Topywo (CC BY-SA 3.0) Extex101 (CC BY-SA 3.0) default_large_cactus_seedling.png + default_dry_shrub.png -- Derived from the original texture by celeron55 + +An0n3m0us (CC BY-SA 3.0): + heart.png -- Derived from a texture by KevDoy (CC BY-SA 3.0) + bubble.png -- Derived from a texture by BlockMen (CC BY-SA 3.0) Sounds @@ -330,6 +336,10 @@ http://freesound.org/people/Ryding/sounds/94337/ Ferk (CC0 1.0): default_item_smoke.ogg, based on a sound by http://opengameart.org/users/bart +sonictechtonic (CC BY 3.0): +https://www.freesound.org/people/sonictechtonic/sounds/241872/ + player_damage.ogg + Models ------ diff --git a/mods/default/chests.lua b/mods/default/chests.lua index 8dbf9d8..f4462ae 100644 --- a/mods/default/chests.lua +++ b/mods/default/chests.lua @@ -44,9 +44,10 @@ function default.chest.chest_lid_close(pn) end local node = minetest.get_node(pos) - minetest.after(0.2, minetest.swap_node, pos, { name = "default:" .. swap, + minetest.after(0.2, minetest.swap_node, pos, { name = swap, param2 = node.param2 }) - minetest.sound_play(sound, {gain = 0.3, pos = pos, max_hear_distance = 10}) + minetest.sound_play(sound, {gain = 0.3, pos = pos, + max_hear_distance = 10}, true) end default.chest.open_chests = {} @@ -75,7 +76,8 @@ minetest.register_on_leaveplayer(function(player) end end) -function default.chest.register_chest(name, d) +function default.chest.register_chest(prefixed_name, d) + local name = prefixed_name:sub(1,1) == ':' and prefixed_name:sub(2,-1) or prefixed_name local def = table.copy(d) def.drawtype = "mesh" def.visual = "mesh" @@ -128,10 +130,10 @@ function default.chest.register_chest(name, d) end minetest.sound_play(def.sound_open, {gain = 0.3, - pos = pos, max_hear_distance = 10}) + pos = pos, max_hear_distance = 10}, true) if not default.chest.chest_lid_obstructed(pos) then minetest.swap_node(pos, - { name = "default:" .. name .. "_open", + { name = name .. "_open", param2 = node.param2 }) end minetest.after(0.2, minetest.show_formspec, @@ -199,10 +201,10 @@ function default.chest.register_chest(name, d) end def.on_rightclick = function(pos, node, clicker) minetest.sound_play(def.sound_open, {gain = 0.3, pos = pos, - max_hear_distance = 10}) + max_hear_distance = 10}, true) if not default.chest.chest_lid_obstructed(pos) then minetest.swap_node(pos, { - name = "default:" .. name .. "_open", + name = name .. "_open", param2 = node.param2 }) end minetest.after(0.2, minetest.show_formspec, @@ -214,7 +216,7 @@ function default.chest.register_chest(name, d) def.on_blast = function(pos) local drops = {} default.get_inventory_drops(pos, "main", drops) - drops[#drops+1] = "default:" .. name + drops[#drops+1] = name minetest.remove_node(pos) return drops end @@ -247,7 +249,7 @@ function default.chest.register_chest(name, d) def_opened.tiles[i].backface_culling = true end end - def_opened.drop = "default:" .. name + def_opened.drop = name def_opened.groups.not_in_creative_inventory = 1 def_opened.selection_box = { type = "fixed", @@ -264,29 +266,31 @@ function default.chest.register_chest(name, d) def_closed.tiles[5] = def.tiles[3] -- drawtype to make them match the mesh def_closed.tiles[3] = def.tiles[3].."^[transformFX" - minetest.register_node("default:" .. name, def_closed) - minetest.register_node("default:" .. name .. "_open", def_opened) + minetest.register_node(prefixed_name, def_closed) + minetest.register_node(prefixed_name .. "_open", def_opened) -- convert old chests to this new variant - minetest.register_lbm({ - label = "update chests to opening chests", - name = "default:upgrade_" .. name .. "_v2", - nodenames = {"default:" .. name}, - action = function(pos, node) - local meta = minetest.get_meta(pos) - meta:set_string("formspec", nil) - local inv = meta:get_inventory() - local list = inv:get_list("default:chest") - if list then - inv:set_size("main", 8*4) - inv:set_list("main", list) - inv:set_list("default:chest", nil) + if name == "default:chest" or name == "default:chest_locked" then + minetest.register_lbm({ + label = "update chests to opening chests", + name = "default:upgrade_" .. name:sub(9,-1) .. "_v2", + nodenames = {name}, + action = function(pos, node) + local meta = minetest.get_meta(pos) + meta:set_string("formspec", nil) + local inv = meta:get_inventory() + local list = inv:get_list("default:chest") + if list then + inv:set_size("main", 8*4) + inv:set_list("main", list) + inv:set_list("default:chest", nil) + end end - end - }) + }) + end end -default.chest.register_chest("chest", { +default.chest.register_chest("default:chest", { description = S("Chest"), tiles = { "default_chest_top.png", @@ -302,7 +306,7 @@ default.chest.register_chest("chest", { groups = {choppy = 2, oddly_breakable_by_hand = 2}, }) -default.chest.register_chest("chest_locked", { +default.chest.register_chest("default:chest_locked", { description = S("Locked Chest"), tiles = { "default_chest_top.png", @@ -318,3 +322,39 @@ default.chest.register_chest("chest_locked", { groups = {choppy = 2, oddly_breakable_by_hand = 2}, protected = true, }) + +minetest.register_craft({ + output = "default:chest", + recipe = { + {"group:wood", "group:wood", "group:wood"}, + {"group:wood", "", "group:wood"}, + {"group:wood", "group:wood", "group:wood"}, + } +}) + +minetest.register_craft({ + output = "default:chest_locked", + recipe = { + {"group:wood", "group:wood", "group:wood"}, + {"group:wood", "default:steel_ingot", "group:wood"}, + {"group:wood", "group:wood", "group:wood"}, + } +}) + +minetest.register_craft( { + type = "shapeless", + output = "default:chest_locked", + recipe = {"default:chest", "default:steel_ingot"}, +}) + +minetest.register_craft({ + type = "fuel", + recipe = "default:chest", + burntime = 30, +}) + +minetest.register_craft({ + type = "fuel", + recipe = "default:chest_locked", + burntime = 30, +}) diff --git a/mods/default/crafting.lua b/mods/default/crafting.lua index 9481133..bc436fc 100644 --- a/mods/default/crafting.lua +++ b/mods/default/crafting.lua @@ -56,13 +56,6 @@ minetest.register_craft({ } }) -minetest.register_craft({ - output = "default:stick 4", - recipe = { - {"group:wood"}, - } -}) - minetest.register_craft({ output = "default:sign_wall_steel 3", recipe = { @@ -81,273 +74,6 @@ minetest.register_craft({ } }) -minetest.register_craft({ - output = "default:torch 4", - recipe = { - {"default:coal_lump"}, - {"group:stick"}, - } -}) - -minetest.register_craft({ - output = "default:pick_wood", - recipe = { - {"group:wood", "group:wood", "group:wood"}, - {"", "group:stick", ""}, - {"", "group:stick", ""}, - } -}) - -minetest.register_craft({ - output = "default:pick_stone", - recipe = { - {"group:stone", "group:stone", "group:stone"}, - {"", "group:stick", ""}, - {"", "group:stick", ""}, - } -}) - -minetest.register_craft({ - output = "default:pick_steel", - recipe = { - {"default:steel_ingot", "default:steel_ingot", "default:steel_ingot"}, - {"", "group:stick", ""}, - {"", "group:stick", ""}, - } -}) - -minetest.register_craft({ - output = "default:pick_bronze", - recipe = { - {"default:bronze_ingot", "default:bronze_ingot", "default:bronze_ingot"}, - {"", "group:stick", ""}, - {"", "group:stick", ""}, - } -}) - -minetest.register_craft({ - output = "default:pick_mese", - recipe = { - {"default:mese_crystal", "default:mese_crystal", "default:mese_crystal"}, - {"", "group:stick", ""}, - {"", "group:stick", ""}, - } -}) - -minetest.register_craft({ - output = "default:pick_diamond", - recipe = { - {"default:diamond", "default:diamond", "default:diamond"}, - {"", "group:stick", ""}, - {"", "group:stick", ""}, - } -}) - -minetest.register_craft({ - output = "default:shovel_wood", - recipe = { - {"group:wood"}, - {"group:stick"}, - {"group:stick"}, - } -}) - -minetest.register_craft({ - output = "default:shovel_stone", - recipe = { - {"group:stone"}, - {"group:stick"}, - {"group:stick"}, - } -}) - -minetest.register_craft({ - output = "default:shovel_steel", - recipe = { - {"default:steel_ingot"}, - {"group:stick"}, - {"group:stick"}, - } -}) - -minetest.register_craft({ - output = "default:shovel_bronze", - recipe = { - {"default:bronze_ingot"}, - {"group:stick"}, - {"group:stick"}, - } -}) - -minetest.register_craft({ - output = "default:shovel_mese", - recipe = { - {"default:mese_crystal"}, - {"group:stick"}, - {"group:stick"}, - } -}) - -minetest.register_craft({ - output = "default:shovel_diamond", - recipe = { - {"default:diamond"}, - {"group:stick"}, - {"group:stick"}, - } -}) - --- Axes --- Recipes face left to match appearence in textures and inventory - -minetest.register_craft({ - output = "default:axe_wood", - recipe = { - {"group:wood", "group:wood"}, - {"group:wood", "group:stick"}, - {"", "group:stick"}, - } -}) - -minetest.register_craft({ - output = "default:axe_stone", - recipe = { - {"group:stone", "group:stone"}, - {"group:stone", "group:stick"}, - {"", "group:stick"}, - } -}) - -minetest.register_craft({ - output = "default:axe_steel", - recipe = { - {"default:steel_ingot", "default:steel_ingot"}, - {"default:steel_ingot", "group:stick"}, - {"", "group:stick"}, - } -}) - -minetest.register_craft({ - output = "default:axe_bronze", - recipe = { - {"default:bronze_ingot", "default:bronze_ingot"}, - {"default:bronze_ingot", "group:stick"}, - {"", "group:stick"}, - } -}) - -minetest.register_craft({ - output = "default:axe_mese", - recipe = { - {"default:mese_crystal", "default:mese_crystal"}, - {"default:mese_crystal", "group:stick"}, - {"", "group:stick"}, - } -}) - -minetest.register_craft({ - output = "default:axe_diamond", - recipe = { - {"default:diamond", "default:diamond"}, - {"default:diamond", "group:stick"}, - {"", "group:stick"}, - } -}) - -minetest.register_craft({ - output = "default:sword_wood", - recipe = { - {"group:wood"}, - {"group:wood"}, - {"group:stick"}, - } -}) - -minetest.register_craft({ - output = "default:sword_stone", - recipe = { - {"group:stone"}, - {"group:stone"}, - {"group:stick"}, - } -}) - -minetest.register_craft({ - output = "default:sword_steel", - recipe = { - {"default:steel_ingot"}, - {"default:steel_ingot"}, - {"group:stick"}, - } -}) - -minetest.register_craft({ - output = "default:sword_bronze", - recipe = { - {"default:bronze_ingot"}, - {"default:bronze_ingot"}, - {"group:stick"}, - } -}) - -minetest.register_craft({ - output = "default:sword_mese", - recipe = { - {"default:mese_crystal"}, - {"default:mese_crystal"}, - {"group:stick"}, - } -}) - -minetest.register_craft({ - output = "default:sword_diamond", - recipe = { - {"default:diamond"}, - {"default:diamond"}, - {"group:stick"}, - } -}) - -minetest.register_craft({ - output = "default:skeleton_key", - recipe = { - {"default:gold_ingot"}, - } -}) - -minetest.register_craft({ - output = "default:chest", - recipe = { - {"group:wood", "group:wood", "group:wood"}, - {"group:wood", "", "group:wood"}, - {"group:wood", "group:wood", "group:wood"}, - } -}) - -minetest.register_craft({ - output = "default:chest_locked", - recipe = { - {"group:wood", "group:wood", "group:wood"}, - {"group:wood", "default:steel_ingot", "group:wood"}, - {"group:wood", "group:wood", "group:wood"}, - } -}) - -minetest.register_craft( { - type = "shapeless", - output = "default:chest_locked", - recipe = {"default:chest", "default:steel_ingot"}, -}) - -minetest.register_craft({ - output = "default:furnace", - recipe = { - {"group:stone", "group:stone", "group:stone"}, - {"group:stone", "", "group:stone"}, - {"group:stone", "group:stone", "group:stone"}, - } -}) - minetest.register_craft({ output = "default:coalblock", recipe = { @@ -357,13 +83,6 @@ minetest.register_craft({ } }) -minetest.register_craft({ - output = "default:coal_lump 9", - recipe = { - {"default:coalblock"}, - } -}) - minetest.register_craft({ output = "default:steelblock", recipe = { @@ -373,13 +92,6 @@ minetest.register_craft({ } }) -minetest.register_craft({ - output = "default:steel_ingot 9", - recipe = { - {"default:steelblock"}, - } -}) - minetest.register_craft({ output = "default:copperblock", recipe = { @@ -389,13 +101,6 @@ minetest.register_craft({ } }) -minetest.register_craft({ - output = "default:copper_ingot 9", - recipe = { - {"default:copperblock"}, - } -}) - minetest.register_craft({ output = "default:tinblock", recipe = { @@ -405,22 +110,6 @@ minetest.register_craft({ } }) -minetest.register_craft({ - output = "default:tin_ingot 9", - recipe = { - {"default:tinblock"}, - } -}) - -minetest.register_craft({ - output = "default:bronze_ingot 9", - recipe = { - {"default:copper_ingot", "default:copper_ingot", "default:copper_ingot"}, - {"default:copper_ingot", "default:tin_ingot", "default:copper_ingot"}, - {"default:copper_ingot", "default:copper_ingot", "default:copper_ingot"}, - } -}) - minetest.register_craft({ output = "default:bronzeblock", recipe = { @@ -446,13 +135,6 @@ minetest.register_craft({ } }) -minetest.register_craft({ - output = "default:gold_ingot 9", - recipe = { - {"default:goldblock"}, - } -}) - minetest.register_craft({ output = "default:diamondblock", recipe = { @@ -462,13 +144,6 @@ minetest.register_craft({ } }) -minetest.register_craft({ - output = "default:diamond 9", - recipe = { - {"default:diamondblock"}, - } -}) - minetest.register_craft({ output = "default:sandstone", recipe = { @@ -573,13 +248,6 @@ minetest.register_craft({ } }) -minetest.register_craft({ - output = "default:clay_lump 4", - recipe = { - {"default:clay"}, - } -}) - minetest.register_craft({ output = "default:brick", recipe = { @@ -588,29 +256,6 @@ minetest.register_craft({ } }) -minetest.register_craft({ - output = "default:clay_brick 4", - recipe = { - {"default:brick"}, - } -}) - -minetest.register_craft({ - output = "default:paper", - recipe = { - {"default:papyrus", "default:papyrus", "default:papyrus"}, - } -}) - -minetest.register_craft({ - output = "default:book", - recipe = { - {"default:paper"}, - {"default:paper"}, - {"default:paper"}, - } -}) - minetest.register_craft({ output = "default:bookshelf", recipe = { @@ -647,29 +292,6 @@ minetest.register_craft({ } }) -minetest.register_craft({ - output = "default:mese_crystal 9", - recipe = { - {"default:mese"}, - } -}) - -minetest.register_craft({ - output = "default:mese_crystal_fragment 9", - recipe = { - {"default:mese_crystal"}, - } -}) - -minetest.register_craft({ - output = "default:mese_crystal", - recipe = { - {"default:mese_crystal_fragment", "default:mese_crystal_fragment", "default:mese_crystal_fragment"}, - {"default:mese_crystal_fragment", "default:mese_crystal_fragment", "default:mese_crystal_fragment"}, - {"default:mese_crystal_fragment", "default:mese_crystal_fragment", "default:mese_crystal_fragment"}, - } -}) - minetest.register_craft({ output = "default:meselamp", recipe = { @@ -687,13 +309,6 @@ minetest.register_craft({ } }) -minetest.register_craft({ - output = "default:obsidian_shard 9", - recipe = { - {"default:obsidian"} - } -}) - minetest.register_craft({ output = "default:obsidian", recipe = { @@ -833,50 +448,6 @@ minetest.register_craft({ recipe = "default:desert_cobble", }) -minetest.register_craft({ - type = "cooking", - output = "default:steel_ingot", - recipe = "default:iron_lump", -}) - -minetest.register_craft({ - type = "cooking", - output = "default:copper_ingot", - recipe = "default:copper_lump", -}) - -minetest.register_craft({ - type = "cooking", - output = "default:tin_ingot", - recipe = "default:tin_lump", -}) - -minetest.register_craft({ - type = "cooking", - output = "default:gold_ingot", - recipe = "default:gold_lump", -}) - -minetest.register_craft({ - type = "cooking", - output = "default:clay_brick", - recipe = "default:clay_lump", -}) - -minetest.register_craft({ - type = "cooking", - output = "default:gold_ingot", - recipe = "default:skeleton_key", - cooktime = 5, -}) - -minetest.register_craft({ - type = "cooking", - output = "default:gold_ingot", - recipe = "default:key", - cooktime = 5, -}) - -- -- Fuels @@ -1005,7 +576,6 @@ minetest.register_craft({ burntime = 7, }) - minetest.register_craft({ type = "fuel", recipe = "default:fence_aspen_wood", @@ -1067,7 +637,6 @@ minetest.register_craft({ burntime = 7, }) - minetest.register_craft({ type = "fuel", recipe = "default:bush_stem", @@ -1134,36 +703,12 @@ minetest.register_craft({ burntime = 60, }) -minetest.register_craft({ - type = "fuel", - recipe = "default:torch", - burntime = 4, -}) - minetest.register_craft({ type = "fuel", recipe = "default:sign_wall_wood", burntime = 10, }) -minetest.register_craft({ - type = "fuel", - recipe = "default:chest", - burntime = 30, -}) - -minetest.register_craft({ - type = "fuel", - recipe = "default:chest_locked", - burntime = 30, -}) - -minetest.register_craft({ - type = "fuel", - recipe = "default:coal_lump", - burntime = 40, -}) - minetest.register_craft({ type = "fuel", recipe = "default:coalblock", @@ -1194,57 +739,8 @@ minetest.register_craft({ burntime = 2, }) -minetest.register_craft({ - type = "fuel", - recipe = "default:paper", - burntime = 1, -}) - -minetest.register_craft({ - type = "fuel", - recipe = "default:book", - burntime = 3, -}) - -minetest.register_craft({ - type = "fuel", - recipe = "default:book_written", - burntime = 3, -}) - minetest.register_craft({ type = "fuel", recipe = "default:dry_shrub", burntime = 2, }) - -minetest.register_craft({ - type = "fuel", - recipe = "group:stick", - burntime = 1, -}) - - -minetest.register_craft({ - type = "fuel", - recipe = "default:pick_wood", - burntime = 6, -}) - -minetest.register_craft({ - type = "fuel", - recipe = "default:shovel_wood", - burntime = 4, -}) - -minetest.register_craft({ - type = "fuel", - recipe = "default:axe_wood", - burntime = 6, -}) - -minetest.register_craft({ - type = "fuel", - recipe = "default:sword_wood", - burntime = 5, -}) diff --git a/mods/default/craftitems.lua b/mods/default/craftitems.lua index e2e92bf..923d754 100644 --- a/mods/default/craftitems.lua +++ b/mods/default/craftitems.lua @@ -3,19 +3,6 @@ -- support for MT game translation. local S = default.get_translator -minetest.register_craftitem("default:stick", { - description = S("Stick"), - inventory_image = "default_stick.png", - groups = {stick = 1, flammable = 2}, -}) - -minetest.register_craftitem("default:paper", { - description = S("Paper"), - inventory_image = "default_paper.png", - groups = {flammable = 3}, -}) - - local lpp = 14 -- Lines per book's page local function book_on_use(itemstack, user) local player_name = user:get_player_name() @@ -158,54 +145,9 @@ minetest.register_on_player_receive_fields(function(player, formname, fields) player:set_wielded_item(stack) end) -minetest.register_craftitem("default:book", { - description = S("Book"), - inventory_image = "default_book.png", - groups = {book = 1, flammable = 3}, - on_use = book_on_use, -}) - -minetest.register_craftitem("default:book_written", { - description = S("Book with Text"), - inventory_image = "default_book_written.png", - groups = {book = 1, not_in_creative_inventory = 1, flammable = 3}, - stack_max = 1, - on_use = book_on_use, -}) - -minetest.register_craft({ - type = "shapeless", - output = "default:book_written", - recipe = {"default:book", "default:book_written"} -}) - -minetest.register_on_craft(function(itemstack, player, old_craft_grid, craft_inv) - if itemstack:get_name() ~= "default:book_written" then - return - end - - local original - local index - for i = 1, player:get_inventory():get_size("craft") do - if old_craft_grid[i]:get_name() == "default:book_written" then - original = old_craft_grid[i] - index = i - end - end - if not original then - return - end - local copymeta = original:get_meta():to_table() - -- copy of the book held by player's mouse cursor - itemstack:get_meta():from_table(copymeta) - -- put the book with metadata back in the craft grid - craft_inv:set_stack("craft", index, original) -end) - minetest.register_craftitem("default:skeleton_key", { description = S("Skeleton Key"), inventory_image = "default_key_skeleton.png", - groups = {key = 1}, on_use = function(itemstack, user, pointed_thing) if pointed_thing.type ~= "node" then return itemstack @@ -258,91 +200,9 @@ minetest.register_craftitem("default:skeleton_key", { end }) -minetest.register_craftitem("default:coal_lump", { - description = S("Coal Lump"), - inventory_image = "default_coal_lump.png", - groups = {coal = 1, flammable = 1} -}) - -minetest.register_craftitem("default:iron_lump", { - description = S("Iron Lump"), - inventory_image = "default_iron_lump.png" -}) - -minetest.register_craftitem("default:copper_lump", { - description = S("Copper Lump"), - inventory_image = "default_copper_lump.png" -}) - -minetest.register_craftitem("default:tin_lump", { - description = S("Tin Lump"), - inventory_image = "default_tin_lump.png" -}) - -minetest.register_craftitem("default:mese_crystal", { - description = S("Mese Crystal"), - inventory_image = "default_mese_crystal.png", -}) - -minetest.register_craftitem("default:gold_lump", { - description = S("Gold Lump"), - inventory_image = "default_gold_lump.png" -}) - -minetest.register_craftitem("default:diamond", { - description = S("Diamond"), - inventory_image = "default_diamond.png", -}) - -minetest.register_craftitem("default:clay_lump", { - description = S("Clay Lump"), - inventory_image = "default_clay_lump.png", -}) - -minetest.register_craftitem("default:steel_ingot", { - description = S("Steel Ingot"), - inventory_image = "default_steel_ingot.png" -}) - -minetest.register_craftitem("default:copper_ingot", { - description = S("Copper Ingot"), - inventory_image = "default_copper_ingot.png" -}) - -minetest.register_craftitem("default:tin_ingot", { - description = S("Tin Ingot"), - inventory_image = "default_tin_ingot.png" -}) - -minetest.register_craftitem("default:bronze_ingot", { - description = S("Bronze Ingot"), - inventory_image = "default_bronze_ingot.png" -}) - -minetest.register_craftitem("default:gold_ingot", { - description = S("Gold Ingot"), - inventory_image = "default_gold_ingot.png" -}) - -minetest.register_craftitem("default:mese_crystal_fragment", { - description = S("Mese Crystal Fragment"), - inventory_image = "default_mese_crystal_fragment.png", -}) - -minetest.register_craftitem("default:clay_brick", { - description = S("Clay Brick"), - inventory_image = "default_clay_brick.png", -}) - -minetest.register_craftitem("default:obsidian_shard", { - description = S("Obsidian Shard"), - inventory_image = "default_obsidian_shard.png", -}) - -minetest.register_craftitem("default:flint", { - description = S("Flint"), - inventory_image = "default_flint.png" -}) +-- +-- Craftitem registry +-- minetest.register_craftitem("default:blueberries", { description = S("Blueberries"), @@ -350,3 +210,329 @@ minetest.register_craftitem("default:blueberries", { groups = {food_blueberries = 1, food_berry = 1}, on_use = minetest.item_eat(2), }) + +minetest.register_craftitem("default:book", { + description = S("Book"), + inventory_image = "default_book.png", + groups = {book = 1, flammable = 3}, + on_use = book_on_use, +}) + +minetest.register_craftitem("default:book_written", { + description = S("Book with Text"), + inventory_image = "default_book_written.png", + groups = {book = 1, not_in_creative_inventory = 1, flammable = 3}, + stack_max = 1, + on_use = book_on_use, +}) + +minetest.register_craftitem("default:bronze_ingot", { + description = S("Bronze Ingot"), + inventory_image = "default_bronze_ingot.png" +}) + +minetest.register_craftitem("default:clay_brick", { + description = S("Clay Brick"), + inventory_image = "default_clay_brick.png", +}) + +minetest.register_craftitem("default:clay_lump", { + description = S("Clay Lump"), + inventory_image = "default_clay_lump.png", +}) + +minetest.register_craftitem("default:coal_lump", { + description = S("Coal Lump"), + inventory_image = "default_coal_lump.png", + groups = {coal = 1, flammable = 1} +}) + +minetest.register_craftitem("default:copper_ingot", { + description = S("Copper Ingot"), + inventory_image = "default_copper_ingot.png" +}) + +minetest.register_craftitem("default:copper_lump", { + description = S("Copper Lump"), + inventory_image = "default_copper_lump.png" +}) + +minetest.register_craftitem("default:diamond", { + description = S("Diamond"), + inventory_image = "default_diamond.png", +}) + +minetest.register_craftitem("default:flint", { + description = S("Flint"), + inventory_image = "default_flint.png" +}) + +minetest.register_craftitem("default:gold_ingot", { + description = S("Gold Ingot"), + inventory_image = "default_gold_ingot.png" +}) + +minetest.register_craftitem("default:gold_lump", { + description = S("Gold Lump"), + inventory_image = "default_gold_lump.png" +}) + +minetest.register_craftitem("default:iron_lump", { + description = S("Iron Lump"), + inventory_image = "default_iron_lump.png" +}) + +minetest.register_craftitem("default:mese_crystal", { + description = S("Mese Crystal"), + inventory_image = "default_mese_crystal.png", +}) + +minetest.register_craftitem("default:mese_crystal_fragment", { + description = S("Mese Crystal Fragment"), + inventory_image = "default_mese_crystal_fragment.png", +}) + +minetest.register_craftitem("default:obsidian_shard", { + description = S("Obsidian Shard"), + inventory_image = "default_obsidian_shard.png", +}) + +minetest.register_craftitem("default:paper", { + description = S("Paper"), + inventory_image = "default_paper.png", + groups = {flammable = 3}, +}) + +minetest.register_craftitem("default:steel_ingot", { + description = S("Steel Ingot"), + inventory_image = "default_steel_ingot.png" +}) + +minetest.register_craftitem("default:stick", { + description = S("Stick"), + inventory_image = "default_stick.png", + groups = {stick = 1, flammable = 2}, +}) + +minetest.register_craftitem("default:tin_ingot", { + description = S("Tin Ingot"), + inventory_image = "default_tin_ingot.png" +}) + +minetest.register_craftitem("default:tin_lump", { + description = S("Tin Lump"), + inventory_image = "default_tin_lump.png" +}) + +-- +-- Crafting recipes +-- + +minetest.register_craft({ + output = "default:book", + recipe = { + {"default:paper"}, + {"default:paper"}, + {"default:paper"}, + } +}) + +default.register_craft_metadata_copy("default:book", "default:book_written") + +minetest.register_craft({ + output = "default:bronze_ingot 9", + recipe = { + {"default:copper_ingot", "default:copper_ingot", "default:copper_ingot"}, + {"default:copper_ingot", "default:tin_ingot", "default:copper_ingot"}, + {"default:copper_ingot", "default:copper_ingot", "default:copper_ingot"}, + } +}) + +minetest.register_craft({ + output = "default:clay_brick 4", + recipe = { + {"default:brick"}, + } +}) + +minetest.register_craft({ + output = "default:clay_lump 4", + recipe = { + {"default:clay"}, + } +}) + +minetest.register_craft({ + output = "default:coal_lump 9", + recipe = { + {"default:coalblock"}, + } +}) + +minetest.register_craft({ + output = "default:copper_ingot 9", + recipe = { + {"default:copperblock"}, + } +}) + +minetest.register_craft({ + output = "default:diamond 9", + recipe = { + {"default:diamondblock"}, + } +}) + +minetest.register_craft({ + output = "default:gold_ingot 9", + recipe = { + {"default:goldblock"}, + } +}) + +minetest.register_craft({ + output = "default:mese_crystal", + recipe = { + {"default:mese_crystal_fragment", "default:mese_crystal_fragment", "default:mese_crystal_fragment"}, + {"default:mese_crystal_fragment", "default:mese_crystal_fragment", "default:mese_crystal_fragment"}, + {"default:mese_crystal_fragment", "default:mese_crystal_fragment", "default:mese_crystal_fragment"}, + } +}) + +minetest.register_craft({ + output = "default:mese_crystal 9", + recipe = { + {"default:mese"}, + } +}) + +minetest.register_craft({ + output = "default:mese_crystal_fragment 9", + recipe = { + {"default:mese_crystal"}, + } +}) + +minetest.register_craft({ + output = "default:obsidian_shard 9", + recipe = { + {"default:obsidian"} + } +}) + +minetest.register_craft({ + output = "default:paper", + recipe = { + {"default:papyrus", "default:papyrus", "default:papyrus"}, + } +}) + +minetest.register_craft({ + output = "default:skeleton_key", + recipe = { + {"default:gold_ingot"}, + } +}) + +minetest.register_craft({ + output = "default:steel_ingot 9", + recipe = { + {"default:steelblock"}, + } +}) + +minetest.register_craft({ + output = "default:stick 4", + recipe = { + {"group:wood"}, + } +}) + +minetest.register_craft({ + output = "default:tin_ingot 9", + recipe = { + {"default:tinblock"}, + } +}) + +-- +-- Cooking recipes +-- + +minetest.register_craft({ + type = "cooking", + output = "default:clay_brick", + recipe = "default:clay_lump", +}) + +minetest.register_craft({ + type = "cooking", + output = "default:copper_ingot", + recipe = "default:copper_lump", +}) + +minetest.register_craft({ + type = "cooking", + output = "default:gold_ingot", + recipe = "default:gold_lump", +}) + +minetest.register_craft({ + type = "cooking", + output = "default:gold_ingot", + recipe = "default:key", + cooktime = 5, +}) + +minetest.register_craft({ + type = "cooking", + output = "default:gold_ingot", + recipe = "default:skeleton_key", + cooktime = 5, +}) + +minetest.register_craft({ + type = "cooking", + output = "default:steel_ingot", + recipe = "default:iron_lump", +}) + +minetest.register_craft({ + type = "cooking", + output = "default:tin_ingot", + recipe = "default:tin_lump", +}) + +-- +-- Fuels +-- + +minetest.register_craft({ + type = "fuel", + recipe = "default:book", + burntime = 3, +}) + +minetest.register_craft({ + type = "fuel", + recipe = "default:book_written", + burntime = 3, +}) + +minetest.register_craft({ + type = "fuel", + recipe = "default:coal_lump", + burntime = 40, +}) + +minetest.register_craft({ + type = "fuel", + recipe = "default:paper", + burntime = 1, +}) + +minetest.register_craft({ + type = "fuel", + recipe = "group:stick", + burntime = 1, +}) diff --git a/mods/default/functions.lua b/mods/default/functions.lua index 91f8bb3..3dd7a00 100644 --- a/mods/default/functions.lua +++ b/mods/default/functions.lua @@ -141,7 +141,7 @@ default.cool_lava = function(pos, node) minetest.set_node(pos, {name = "default:stone"}) end minetest.sound_play("default_cool_lava", - {pos = pos, max_hear_distance = 16, gain = 0.25}) + {pos = pos, max_hear_distance = 16, gain = 0.25}, true) end if minetest.settings:get_bool("enable_lavacooling") ~= false then @@ -210,7 +210,12 @@ end function default.grow_papyrus(pos, node) pos.y = pos.y - 1 local name = minetest.get_node(pos).name - if name ~= "default:dirt_with_grass" and name ~= "default:dirt" then + if name ~= "default:dirt" and + name ~= "default:dirt_with_grass" and + name ~= "default:dirt_with_dry_grass" and + name ~= "default:dirt_with_rainforest_litter" and + name ~= "default:dry_dirt" and + name ~= "default:dry_dirt_with_dry_grass" then return end if not minetest.find_node_near(pos, 3, {"group:water"}) then @@ -247,7 +252,17 @@ minetest.register_abm({ minetest.register_abm({ label = "Grow papyrus", nodenames = {"default:papyrus"}, - neighbors = {"default:dirt", "default:dirt_with_grass"}, + -- Grows on the dirt and surface dirt nodes of the biomes papyrus appears in, + -- including the old savanna nodes. + -- 'default:dirt_with_grass' is here only because it was allowed before. + neighbors = { + "default:dirt", + "default:dirt_with_grass", + "default:dirt_with_dry_grass", + "default:dirt_with_rainforest_litter", + "default:dry_dirt", + "default:dry_dirt_with_dry_grass", + }, interval = 14, chance = 71, action = function(...) @@ -433,6 +448,9 @@ local function leafdecay_after_destruct(pos, oldnode, def) end end +local movement_gravity = tonumber( + minetest.settings:get("movement_gravity")) or 9.81 + local function leafdecay_on_timer(pos, def) if minetest.find_node_near(pos, def.radius, def.trunks) then return false @@ -459,6 +477,21 @@ local function leafdecay_on_timer(pos, def) minetest.remove_node(pos) minetest.check_for_falling(pos) + + -- spawn a few particles for the removed node + minetest.add_particlespawner({ + amount = 8, + time = 0.001, + minpos = vector.subtract(pos, {x=0.5, y=0.5, z=0.5}), + maxpos = vector.add(pos, {x=0.5, y=0.5, z=0.5}), + minvel = vector.new(-0.5, -1, -0.5), + maxvel = vector.new(0.5, 0, 0.5), + minacc = vector.new(0, -movement_gravity, 0), + maxacc = vector.new(0, -movement_gravity, 0), + minsize = 0, + maxsize = 0, + node = node, + }) end function default.register_leafdecay(def) @@ -483,7 +516,7 @@ end -- --- Convert dirt to something that fits the environment +-- Convert default:dirt to something that fits the environment -- minetest.register_abm({ @@ -492,6 +525,7 @@ minetest.register_abm({ neighbors = { "air", "group:grass", + "group:dry_grass", "default:snow", }, interval = 6, @@ -520,6 +554,8 @@ minetest.register_abm({ minetest.set_node(pos, {name = "default:dirt_with_snow"}) elseif minetest.get_item_group(name, "grass") ~= 0 then minetest.set_node(pos, {name = "default:dirt_with_grass"}) + elseif minetest.get_item_group(name, "dry_grass") ~= 0 then + minetest.set_node(pos, {name = "default:dirt_with_dry_grass"}) end end }) @@ -581,6 +617,40 @@ minetest.register_abm({ end }) +-- +-- Register a craft to copy the metadata of items +-- + +function default.register_craft_metadata_copy(ingredient, result) + minetest.register_craft({ + type = "shapeless", + output = result, + recipe = {ingredient, result} + }) + + minetest.register_on_craft(function(itemstack, player, old_craft_grid, craft_inv) + if itemstack:get_name() ~= result then + return + end + + local original + local index + for i = 1, #old_craft_grid do + if old_craft_grid[i]:get_name() == result then + original = old_craft_grid[i] + index = i + end + end + if not original then + return + end + local copymeta = original:get_meta():to_table() + itemstack:get_meta():from_table(copymeta) + -- put the book with metadata back in the craft grid + craft_inv:set_stack("craft", index, original) + end) +end + -- -- NOTICE: This method is not an official part of the API yet. @@ -605,7 +675,7 @@ function default.can_interact_with_node(player, pos) -- Is player wielding the right key? local item = player:get_wielded_item() - if item:get_name() == "default:key" then + if minetest.get_item_group(item:get_name(), "key") == 1 then local key_meta = item:get_meta() if key_meta:get_string("secret") == "" then diff --git a/mods/default/furnace.lua b/mods/default/furnace.lua index d133a3a..3c4ac9c 100644 --- a/mods/default/furnace.lua +++ b/mods/default/furnace.lua @@ -352,3 +352,12 @@ minetest.register_node("default:furnace_active", { allow_metadata_inventory_move = allow_metadata_inventory_move, allow_metadata_inventory_take = allow_metadata_inventory_take, }) + +minetest.register_craft({ + output = "default:furnace", + recipe = { + {"group:stone", "group:stone", "group:stone"}, + {"group:stone", "", "group:stone"}, + {"group:stone", "group:stone", "group:stone"}, + } +}) diff --git a/mods/default/init.lua b/mods/default/init.lua index a487383..d4388e5 100644 --- a/mods/default/init.lua +++ b/mods/default/init.lua @@ -14,11 +14,22 @@ default.get_translator = S -- GUI related stuff minetest.register_on_joinplayer(function(player) - player:set_formspec_prepend([[ + -- Set formspec prepend + local formspec = [[ bgcolor[#080808BB;true] - background[5,5;1,1;gui_formbg.png;true] - background9[5,5;1,1;gui_formbg.png;true;10] - listcolors[#00000069;#5A5A5A;#141318;#30434C;#FFF] ]]) + listcolors[#00000069;#5A5A5A;#141318;#30434C;#FFF] ]] + local name = player:get_player_name() + local info = minetest.get_player_information(name) + if info.formspec_version > 1 then + formspec = formspec .. "background9[5,5;1,1;gui_formbg.png;true;10]" + else + formspec = formspec .. "background[5,5;1,1;gui_formbg.png;true]" + end + player:set_formspec_prepend(formspec) + + -- Set hotbar textures + player:hud_set_hotbar_image("gui_hotbar.png") + player:hud_set_hotbar_selected_image("gui_hotbar_selected.png") end) function default.get_hotbar_bg(x,y) diff --git a/mods/default/item_entity.lua b/mods/default/item_entity.lua index 2a61f08..d9bf7b1 100644 --- a/mods/default/item_entity.lua +++ b/mods/default/item_entity.lua @@ -15,12 +15,12 @@ local item = { burn_up = function(self) -- disappear in a smoke puff - self.object:remove() local p = self.object:get_pos() + self.object:remove() minetest.sound_play("default_item_smoke", { pos = p, max_hear_distance = 8, - }) + }, true) minetest.add_particlespawner({ amount = 3, time = 0.1, @@ -39,16 +39,20 @@ local item = { }) end, - on_step = function(self, dtime) - builtin_item.on_step(self, dtime) + on_step = function(self, dtime, ...) + builtin_item.on_step(self, dtime, ...) if self.flammable then - -- flammable, check for igniters + -- flammable, check for igniters every 10 s self.ignite_timer = (self.ignite_timer or 0) + dtime if self.ignite_timer > 10 then self.ignite_timer = 0 - local node = minetest.get_node_or_nil(self.object:get_pos()) + local pos = self.object:get_pos() + if pos == nil then + return -- object already deleted + end + local node = minetest.get_node_or_nil(pos) if not node then return end diff --git a/mods/default/license.txt b/mods/default/license.txt index fecb1eb..3c95c1b 100644 --- a/mods/default/license.txt +++ b/mods/default/license.txt @@ -51,6 +51,7 @@ Copyright (C) 2010-2018: Mossmanikin random-geek Extex101 + An0n3m0us You are free to: Share — copy and redistribute the material in any medium or format. diff --git a/mods/default/locale/default.de.tr b/mods/default/locale/default.de.tr index c842b85..9a3b8bd 100644 --- a/mods/default/locale/default.de.tr +++ b/mods/default/locale/default.de.tr @@ -62,12 +62,12 @@ Obsidian Block=Obsidianblock Dirt=Erde Dirt with Grass=Erde mit Gras Dirt with Grass and Footsteps=Erde mit Gras und Fußstapfen -Dirt with Dry Grass=Erde mit trockenem Gras +Dirt with Savanna Grass=Erde mit Savannengras Dirt with Snow=Erde mit Schnee Dirt with Rainforest Litter=Erde mit Regenwaldboden Dirt with Coniferous Litter=Erde mit Nadelwaldboden -Dry Dirt=Trockene Erde -Dry Dirt with Dry Grass=Trockene Erde mit trockenem Gras +Savanna Dirt=Savannenerde +Savanna Dirt with Savanna Grass=Savannenerde mit Savannengras Permafrost=Permafrost Permafrost with Stones=Permafrost mit Steinen Permafrost with Moss=Permafrost mit Moos @@ -124,7 +124,7 @@ Papyrus=Papyrus Dry Shrub=Trockener Busch Jungle Grass=Dschungelgras Grass=Gras -Dry Grass=Trockenes Gras +Savanna Grass=Savannengras Fern=Farn Marram Grass=Dünengras Bush Stem=Buschstamm diff --git a/mods/default/locale/default.id.tr b/mods/default/locale/default.id.tr new file mode 100644 index 0000000..7a0406c --- /dev/null +++ b/mods/default/locale/default.id.tr @@ -0,0 +1,211 @@ +# textdomain: default +Stone=Batu +Cobblestone=Bongkahan Batu +Stone Brick=Tembok Batu +Stone Block=Balok Batu +Mossy Cobblestone=Bongkahan Batu Berlumut +Desert Stone=Batu Gurun +Desert Cobblestone=Bongkahan Batu Gurun +Desert Stone Brick=Tembok Batu Gurun +Desert Stone Block=Balok Batu Gurun +Sandstone=Batu Pasir +Sandstone Brick=Tembok Batu Pasir +Sandstone Block=Balok Batu Pasir +Desert Sandstone=Batu Pasir Gurun +Desert Sandstone Brick=Tembok Batu Pasir Gurun +Desert Sandstone Block=Balok Batu Pasir Gurun +Silver Sandstone=Batu Pasir Perak +Silver Sandstone Brick=Tembok Batu Pasir Perak +Silver Sandstone Block=Balok Batu Pasir Perak +Obsidian=Obsidian +Obsidian Brick=Tembok Obsidian +Obsidian Block=Balok Obsidian +Dirt=Tanah +Dirt with Grass=Tanah Berumput +Dirt with Grass and Footsteps=Tanah Berumput dan Tapak Kaki +Dirt with Savanna Grass=Tanah Berumput Sabana +Dirt with Snow=Tanah Bersalju +Dirt with Rainforest Litter=Tanah Berserasah Hutan Hujan +Dirt with Coniferous Litter=Tanah Berserasah Hutan Konifer +Savanna Dirt=Tanah Sabana +Savanna Dirt with Savanna Grass=Tanah Sabana Berumput Sabana +Permafrost=Ibun Abadi +Permafrost with Stones=Ibun Abadi Berbatu +Permafrost with Moss=Ibun Abadi Berlumut +Sand=Pasir +Desert Sand=Pasir Gurun +Silver Sand=Pasir Perak +Gravel=Kerikil +Clay=Semen +Snow=Salju +Snow Block=Balok Salju +Ice=Es +Cave Ice=Es Gua +Apple Tree=Pohon Apel +Apple Wood Planks=Papan Kayu Pohon Apel +Apple Tree Sapling=Bibit Apel +Apple Tree Leaves=Daun Pohon Apel +Apple=Apel +Apple Marker=Penanda Apel +Jungle Tree=Pohon Hutan Rimba +Jungle Wood Planks=Papan Kayu Pohon Rimba +Jungle Tree Leaves=Daun Pohon Rimba +Jungle Tree Sapling=Bibit Pohon Rimba +Emergent Jungle Tree Sapling=Bibit Bertumbuh Pohon Rimba +Pine Tree=Pohon Pinus +Pine Wood Planks=Papan Kayu Pinus +Pine Needles=Daun Pinus +Pine Tree Sapling=Bibit Pinus +Acacia Tree=Pohon Akasia +Acacia Wood Planks=Papan Kayu Akasia +Acacia Tree Leaves=Daun Akasia +Acacia Tree Sapling=Bibit Akasia +Aspen Tree=Pohon Aspen +Aspen Wood Planks=Papan Kayu Aspen +Aspen Tree Leaves=Daun Aspen +Aspen Tree Sapling=Bibit Aspen +Coal Ore=Bijih Batu Bara +Coal Block=Balok Batu Bara +Iron Ore=Biji Besi +Steel Block=Balok Baja +Copper Ore=Bijih Tembaga +Copper Block=Balok Tembaga +Tin Ore=Bijih Timah +Tin Block=Balok Timah +Bronze Block=Balok Perunggu +Mese Ore=Bijih Mese +Mese Block=Balok Mese +Gold Ore=Bijih Emas +Gold Block=Balok Emas +Diamond Ore=Bijih Berlian +Diamond Block=Balok Berlian +Cactus=Kaktus +Large Cactus Seedling=Bibit Kaktus Besar +Papyrus=Papirus +Dry Shrub=Semak Kering +Jungle Grass=Rumput Rimba +Grass=Rumput +Savanna Grass=Rumput Sabana +Fern=Pakis +Marram Grass=Rumput Pantai +Bush Stem=Batang Semak +Bush Leaves=Daun Semak +Bush Sapling=Bibit Semak +Blueberry Bush Leaves with Berries=Daun Bluberi Berbuah +Blueberry Bush Leaves=Daun Bluberi +Blueberry Bush Sapling=Bibit Bluberi +Acacia Bush Stem=Batang Semak Akasia +Acacia Bush Leaves=Daun Semak Akasia +Acacia Bush Sapling=Bibit Semak Akasia +Pine Bush Stem=Batang Semak Pinus +Pine Bush Needles=Daun Semak Pinus +Pine Bush Sapling=Bibit Semak Pinus +Kelp=Kelp +Green Coral=Koral Hijau +Pink Coral=Koral Jambon +Cyan Coral=Koral Sian +Brown Coral=Koral Cokelat +Orange Coral=Koral Oranye +Coral Skeleton=Kerangka Koral +Water Source=Mata Air +Flowing Water=Aliran Air +River Water Source=Mata Air Sungai +Flowing River Water=Aliran Air Sungai +Lava Source=Sumber Lava +Flowing Lava=Aliran Lava +Empty Bookshelf=Rak Buku Kosong +Bookshelf (@1 written, @2 empty books)=Rak Buku (@1 buku tertulis, @2 buku kosong) +Bookshelf=Rak Buku +Text too long=Teks terlalu panjang +Wooden Sign=Penanda Kayu +Steel Sign=Penanda Baja +Wooden Ladder=Tangga Kayu +Steel Ladder=Tangga Baja +Apple Wood Fence=Pagar Kayu Apel +Acacia Wood Fence=Pagar Akasia +Jungle Wood Fence=Pagar Kayu Rimba +Pine Wood Fence=Pagar Pinus +Aspen Wood Fence=Pagar Aspen +Apple Wood Fence Rail=Rel Pagar Kayu Apel +Acacia Wood Fence Rail=Rel Pagar Akasia +Jungle Wood Fence Rail=Rel Pagar Kayu Rimba +Pine Wood Fence Rail=Rel Pagar Pinus +Aspen Wood Fence Rail=Rel Pagar Aspen +Glass=Kaca +Obsidian Glass=Kaca Obsidian +Brick Block=Balok Bata +Mese Lamp=Lampu Mese +Mese Post Light=Lampu Taman Mese +Cloud=Awan +@1 will intersect protection on growth.=@1 akan memotong perlindungan ketika tumbuh. +Torch=Obor +Wooden Pickaxe=Beliung Kayu +Stone Pickaxe=Beliung Batu +Bronze Pickaxe=Beliung Perunggu +Steel Pickaxe=Beliung Baja +Mese Pickaxe=Beliung Mese +Diamond Pickaxe=Beliung Berlian +Wooden Shovel=Sekop Kayu +Stone Shovel=Sekop Batu +Bronze Shovel=Sekop Perunggu +Steel Shovel=Sekop Baja +Mese Shovel=Sekop Mese +Diamond Shovel=Sekop Berlian +Wooden Axe=Kapak Kayu +Stone Axe=Kapak Batu +Bronze Axe=Kapak Perunggu +Steel Axe=Kapak Baja +Mese Axe=Kapak Mese +Diamond Axe=Kapak Berlian +Wooden Sword=Pedang Kayu +Stone Sword=Pedang Batu +Bronze Sword=Pedang Perunggu +Steel Sword=Pedang Baja +Mese Sword=Pedang Mese +Diamond Sword=Pedang Berlian +Key=Kunci +Furnace is empty=Tungku kosong +100% (output full)=100% (keluaran penuh) +@1%=@1% +Not cookable=Tidak bisa dimasak +Empty=Kosong +Furnace active=Tungku nyala +Furnace inactive=Tungku mati +(Item: @1; Fuel: @2)=(Barang: @1; Bahan Bakar: @2) +Furnace=Tungku +Title:=Judul: +Contents:=Isi: +Save=Simpan +by @1=oleh @1 +Page @1 of @2=Halaman @1 dari @2 +"@1"="@1" +"@1" by @2="@1" oleh @2 +Skeleton Key=Kunci Induk +Key to @1's @2=Kunci @2 milik @1 +Blueberries=Bluberi +Book=Buku +Book with Text=Buku Tertulis +Bronze Ingot=Perunggu Batangan +Clay Brick=Bata +Clay Lump=Bongkahan Semen +Coal Lump=Bongkahan Batu Bara +Copper Ingot=Tembaga Batangan +Copper Lump=Bongkahan Tembaga +Diamond=Berlian +Flint=Batu Api +Gold Ingot=Emas Batangan +Gold Lump=Bongkahan Emas +Iron Lump=Bongkahan Besi +Mese Crystal=Kristal Mese +Mese Crystal Fragment=Pecahan Kristal Mese +Obsidian Shard=Pecahan Obsidian +Paper=Kertas +Steel Ingot=Baja Batangan +Stick=Tongkat +Tin Ingot=Timah Batangan +Tin Lump=Bongkahan Timah +Locked Chest=Peti Terkunci +Locked Chest (owned by @1)=Peti Terkunci (milik @1) +You do not own this chest.=Anda bukan pemilik peti ini. +a locked chest=suatu peti terkunci +Chest=Peti diff --git a/mods/default/locale/default.ms.tr b/mods/default/locale/default.ms.tr new file mode 100644 index 0000000..b82c201 --- /dev/null +++ b/mods/default/locale/default.ms.tr @@ -0,0 +1,211 @@ +# textdomain: default +Locked Chest=Peti Berkunci +Locked Chest (owned by @1)=Peti Berkunci (milik @1) +You do not own this chest.=Ini bukan peti milik anda. +a locked chest=peti berkunci +Chest=Peti +Stick=Serpihan Kayu +Paper=Kertas +"@1" by @2="@1" oleh @2 +Book=Buku +Book with Text=Buku Bertulisan +Skeleton Key=Kunci Induk +Key to @1's @2=Kunci @2 milik @1 +Coal Lump=Longgokan Batu Arang +Iron Lump=Longgokan Besi +Copper Lump=Longgokan Tembaga +Tin Lump=Longgokan Timah +Mese Crystal=Kristal Mese +Gold Lump=Longgokan Emas +Diamond=Berlian +Clay Lump=Longgokan Tanah Liat +Steel Ingot=Jongkong Keluli +Copper Ingot=Jongkong Tembaga +Tin Ingot=Jongkong Timah +Bronze Ingot=Jongkong Gangsa +Gold Ingot=Jongkong Emas +Mese Crystal Fragment=Serpihan Mese +Clay Brick=Bata Tanah Liat +Obsidian Shard=Serpihan Obsidia +Flint=Batu Api +Blueberries=Beri Biru +Furnace is empty=Relau masih kosong +100% (output full)=100% (keluaran penuh) +@1%=@1% +Empty=Kosong +Not cookable=Tidak boleh dimasak +Furnace active=Relau aktif +Furnace inactive=Relau tidak aktif +(Item: @1; Fuel: @2)=(Item: @1; Bahan api: @2) +Furnace=Relau +Stone=Batu +Cobblestone=Batu Buntar +Stone Brick=Bata Batu +Stone Block=Bongkah Batu +Mossy Cobblestone=Batu Buntar Berlumut +Desert Stone=Batu Gurun +Desert Cobblestone=Batu Buntar Gurun +Desert Stone Brick=Bata Batu Gurun +Desert Stone Block=Bongkah Batu Gurun +Sandstone=Batu Pasir +Sandstone Brick=Bata Batu Pasir +Sandstone Block=Bongkah Batu Pasir +Desert Sandstone=Batu Pasir Gurun +Desert Sandstone Brick=Bata Batu Pasir Gurun +Desert Sandstone Block=Bongkah Batu Pasir Gurun +Silver Sandstone=Batu Pasir Perak +Silver Sandstone Brick=Bata Batu Pasir Perak +Silver Sandstone Block=Bongkah Batu Pasir Perak +Obsidian=Obsidia +Obsidian Brick=Bata Obsidia +Obsidian Block=Bongkah Obsidia +Dirt=Tanah +Dirt with Grass=Tanah Berumput +Dirt with Grass and Footsteps=Tanah Berumput dan Tapak Kaki +Dirt with Dry Grass=Tanah Berumput Kering +Dirt with Snow=Tanah Bersalji +Dirt with Rainforest Litter=Tanah Bersarap Hutan Hujan +Dirt with Coniferous Litter=Tanah Bersarap Hutan Konifer +Dry Dirt=Tanah Kering +Dry Dirt with Dry Grass=Tanah Kering Berumput Kering +Permafrost=Ibun Abadi +Permafrost with Stones=Ibun Abadi Berbatu +Permafrost with Moss=Ibun Abadi Berlumut +Sand=Pasir +Desert Sand=Pasir Gurun +Silver Sand=Pasir Perak +Gravel=Kelikir +Clay=Tanah Liat +Snow=Salji +Snow Block=Bongkah Salji +Ice=Ais +Cave Ice=Ais Gua +Apple Tree=Kayu Pokok Epal +Apple Wood Planks=Papan Kayu Epal +Apple Tree Sapling=Anak Pokok Epal +Apple Tree Leaves=Daun Pokok Epal +Apple=Epal +Apple Marker=Penanda Epal +Jungle Tree=Kayu Pokok Hutan +Jungle Wood Planks=Papan Kayu Hutan +Jungle Tree Leaves=Daun Pokok Hutan +Jungle Tree Sapling=Anak Pokok Hutan +Emergent Jungle Tree Sapling=Anak Pokok Hutan Kembang +Pine Tree=Kayu Pokok Pain +Pine Wood Planks=Papan Kayu Pain +Pine Needles=Daun Pokok Pain +Pine Tree Sapling=Anak Pokok Pain +Acacia Tree=Kayu Pokok Akasia +Acacia Wood Planks=Papan Kayu Akasia +Acacia Tree Leaves=Daun Pokok Akasia +Acacia Tree Sapling=Anak Pokok Akasia +Aspen Tree=Kayu Pokok Aspen +Aspen Wood Planks=Papan Kayu Aspen +Aspen Tree Leaves=Daun Pokok Aspen +Aspen Tree Sapling=Anak Pokok Aspen +Coal Ore=Bijih Batu Arang +Coal Block=Bongkah Batu Arang +Iron Ore=Bijih Besi +Steel Block=Bongkah Keluli +Copper Ore=Bijih Tembaga +Copper Block=Bongkah Tembaga +Tin Ore=Bijih Timah +Tin Block=Bongkah Timah +Bronze Block=Bongkah Gangsa +Mese Ore=Bijih Mese +Mese Block=Bongkah Mese +Gold Ore=Bijih Emas +Gold Block=Bongkah Emas +Diamond Ore=Bijih Intan +Diamond Block=Bongkah Intan +Cactus=Kaktus +Large Cactus Seedling=Benih Kaktus Besar +Papyrus=Papirus +Dry Shrub=Pokok Renek Kering +Jungle Grass=Rumput Hutan +Grass=Rumput +Dry Grass=Rumput Kering +Fern=Paku Pakis +Marram Grass=Rumput Maram +Bush Stem=Batang Belukar +Bush Leaves=Daun Belukar +Bush Sapling=Anak Belukar +Blueberry Bush Leaves with Berries=Daun Belukar Beri Biru Berberi +Blueberry Bush Leaves=Daun Belukar Beri Biru +Blueberry Bush Sapling=Anak Belukar Beri Biru +Acacia Bush Stem=Batang Belukar Akasia +Acacia Bush Leaves=Daun Belukar Akasia +Acacia Bush Sapling=Anak Belukar Akasia +Pine Bush Stem=Batang Belukar Pain +Pine Bush Needles=Daun Belukar Pain +Pine Bush Sapling=Anak Belukar Pain +Kelp=Kelpa +Green Coral=Batu Karang Hijau +Pink Coral=Batu Karang Merah Jambu +Cyan Coral=Batu Karang Biru Kehijauan +Brown Coral=Batu Karang Perang +Orange Coral=Batu Karang Jingga +Coral Skeleton= Rangka Karang +Water Source=Sumber Air +Flowing Water=Air Mengalir +River Water Source=Sumber Air Sungai +Flowing River Water=Air Sungai Mengalir +Lava Source=Sumber Lava +Flowing Lava=Lava Mengalir +Empty Bookshelf=Rak Buku Kosong +Bookshelf (@1 written, @2 empty books)=Rak Buku (@1 buku bertulis, @2 buku kosong) +Bookshelf=Rak Buku +Text too long=Tulisan terlalu panjang +Wooden Sign=Papan Tanda Kayu +Steel Sign=Papan Tanda Keluli +Wooden Ladder=Tangga Panjat Kayu +Steel Ladder=Tangga Panjat Keluli +Apple Wood Fence=Pagar Kayu Epal +Acacia Wood Fence=Pagar Kayu Akasia +Jungle Wood Fence=Pagar Kayu Hutan +Pine Wood Fence=Pagar Kayu Pain +Aspen Wood Fence=Pagar Kayu Aspen +Apple Wood Fence Rail=Pagar Rel Kayu Epal +Acacia Wood Fence Rail=Pagar Rel Kayu Akasia +Jungle Wood Fence Rail=Pagar Rel Kayu Hutan +Pine Wood Fence Rail=Pagar Rel Kayu Pain +Aspen Wood Fence Rail=Pagar Rel Kayu Aspen +Glass=Kaca +Obsidian Glass=Kaca Obsidia +Brick Block=Bongkah Bata +Mese Lamp=Lampu Mese +Mese Post Light=Lampu Tiang Mese +Cloud=Awan +Wooden Pickaxe=Beliung Kayu +Stone Pickaxe=Beliung Batu +Bronze Pickaxe=Beliung Gangsa +Steel Pickaxe=Beliung Keluli +Mese Pickaxe=Beliung Mese +Diamond Pickaxe=Beliung Intan +Wooden Shovel=Penyodok Kayu +Stone Shovel=Penyodok Batu +Bronze Shovel=Penyodok Gangsa +Steel Shovel=Penyodok Keluli +Mese Shovel=Penyodok Mese +Diamond Shovel=Penyodok Intan +Wooden Axe=Kapak Kayu +Stone Axe=Kapak Batu +Bronze Axe=Kapak Gangsa +Steel Axe=Kapak Keluli +Mese Axe=Kapak Mese +Diamond Axe=Kapak Intan +Wooden Sword=Pedang Kayu +Stone Sword=Pedang Batu +Bronze Sword=Pedang Gangsa +Steel Sword=Pedang Keluli +Mese Sword=Pedang Mese +Diamond Sword=Pedang Intan +Key=Kunci +Torch=Obor +@1 will intersect protection on growth.=@1 akan masuk kawasan perlindungan lain apabila ia tumbuh. +Title:=Tajuk: +Contents:=Kandungan: +Save=Simpan +by @1=oleh @1 +Page @1 of @2=Ms. @1 / @2 +"@1"="@1" diff --git a/mods/default/locale/default.ru.tr b/mods/default/locale/default.ru.tr new file mode 100644 index 0000000..214f669 --- /dev/null +++ b/mods/default/locale/default.ru.tr @@ -0,0 +1,211 @@ +# textdomain: default +Locked Chest=Заблокированный Сундук +Locked Chest (owned by @1)=Заблокированный Сундук (владелец: @1) +You do not own this chest.=Вы не владелец этого сундука. +a locked chest=заблокированный сундук +Chest=Сундук +Stick=Палка +Paper=Бумага +"@1" by @2="@1" @2 +Book=Книга +Book with Text=Книга с Текстом +Skeleton Key=Ключ Скелета +Key to @1's @2=Ключ к @2 от @1 +Coal Lump=Кусок Угля +Iron Lump=Кусок Железа +Copper Lump=Кусок Меди +Tin Lump=Кусок Олова +Mese Crystal=Кристалл Месе +Gold Lump=Кусок Золота +Diamond=Алмаз +Clay Lump=Ком Глины +Steel Ingot=Железный Брусок +Copper Ingot=Медный Брусок +Tin Ingot=Оловянный Брусок +Bronze Ingot=Бронзовый Брусок +Gold Ingot=Золотой Брусок +Mese Crystal Fragment=Осколок Кристалла Месе +Clay Brick=Глиняный Кирпич +Obsidian Shard=Обсидиановый Осколок +Flint=Огниво +Blueberries=Черника +Furnace is empty=Печь пустая +100% (output full)=100% (полное приготовление) +@1%=@1% +Empty=Пустое +Not cookable=Не может быть приготовлено +Furnace active=Печь зажжена +Furnace inactive=Печь не зажжена +(Item: @1; Fuel: @2)=(Предмет: @1; Топливо: @2) +Furnace=Печь +Stone=Камень +Cobblestone=Булыжник +Stone Brick=Каменный Кирпич +Stone Block=Каменный Блок +Mossy Cobblestone=Мшистый Булыжник +Desert Stone=Пустынный Камень +Desert Cobblestone=Пустынный Булыжник +Desert Stone Brick=Пустынный Каменный Кирпич +Desert Stone Block=Пустынный Каменный Блок +Sandstone=Песчаник +Sandstone Brick=Песчаниковый Кирпич +Sandstone Block=Песчаниковый Блок +Desert Sandstone=Пустынный Песчаник +Desert Sandstone Brick=Пустынный Песчаниковый Кирпич +Desert Sandstone Block=Пустынный Песчаниковый Блок +Silver Sandstone=Серебряный Песчаник +Silver Sandstone Brick=Серебряный Песчаниковый Кирпич +Silver Sandstone Block=Серебряный Песчаниковый Блок +Obsidian=Обсидиан +Obsidian Brick=Обсидиановый Кирпич +Obsidian Block=Обсидиановый Блок +Dirt=Земля +Dirt with Grass=Земля с Травой +Dirt with Grass and Footsteps=Земля с Травой и Следами +Dirt with Dry Grass=Земля с Сухой Травой +Dirt with Snow=Земля Со Снегом +Dirt with Rainforest Litter=Земля с Тропической Подстилкой +Dirt with Coniferous Litter=Земля с Сосновой Подстилкой +Dry Dirt=Сухая Земля +Dry Dirt with Dry Grass=Сухая Земля с Сухой Травой +Permafrost=Замороженная Почва +Permafrost with Stones=Замороженная Почва с Камнями +Permafrost with Moss=Замороженная Почва с Мхом +Sand=Песок +Desert Sand=Пустынный Песок +Silver Sand=Серебряный Песок +Gravel=Гравий +Clay=Глиняный Блок +Snow=Снег +Snow Block=Снежный Блок +Ice=Лёд +Cave Ice=Пещерный Лёд +Apple Tree=Яблоневый Ствол +Apple Wood Planks=Яблоневые Деревянные Доски +Apple Tree Sapling=Яблоневый Саженец +Apple Tree Leaves=Яблоневая Листва +Apple=Яблоко +Apple Marker=Яблочная Метка +Jungle Tree=Ствол Тропического Дерева +Jungle Wood Planks=Деревянные Доски Тропического Дерева +Jungle Tree Leaves=Листва Тропического Дерева +Jungle Tree Sapling=Саженец Тропического Дерева +Emergent Jungle Tree Sapling=Выросший Саженец Тропического Дерева +Pine Tree=Сосновый Ствол +Pine Wood Planks=Сосновые Деревянные Доски +Pine Needles=Сосновая Хвоя +Pine Tree Sapling=Сосновый Саженец +Acacia Tree=Ствол Акации +Acacia Wood Planks=Деревянные Доски Акации +Acacia Tree Leaves=Листва Акации +Acacia Tree Sapling=Саженец Акации +Aspen Tree=Осиновый Ствол +Aspen Wood Planks=Осиновые Деревянные Доски +Aspen Tree Leaves=Осиновая Листва +Aspen Tree Sapling=Осиновый Саженец +Coal Ore=Уголь +Coal Block=Угольный Блок +Iron Ore=Железная Руда +Steel Block=Стальной Блок +Copper Ore=Медная Руда +Copper Block=Медный Блок +Tin Ore=Оловянная Руда +Tin Block=Оловянный Блок +Bronze Block=Бронзовый Блок +Mese Ore=Месевая Руда +Mese Block=Месевый Блок +Gold Ore=Золотая Руда +Gold Block=Золотой Блок +Diamond Ore=Алмаз +Diamond Block=Алмазный Блок +Cactus=Кактус +Large Cactus Seedling=Кактусовый Саженец +Papyrus=Папирус +Dry Shrub=Сухой Куст +Jungle Grass=Тропическая Трава +Grass=Трава +Dry Grass=Сухая Трава +Fern=Папоротник +Marram Grass=Песколюб +Bush Stem=Ствол Яблочного Деревца +Bush Leaves=Листья Яблочного Деревца +Bush Sapling=Саженца яблочного деревца +Blueberry Bush Leaves with Berries=Куст Черники с Ягодами +Blueberry Bush Leaves=Куст Черники +Blueberry Bush Sapling=Саженца Куста Черники +Acacia Bush Stem=Ствол Деревца Акации +Acacia Bush Leaves=Листья Деревца Акации +Acacia Bush Sapling=Саженца Деревца Акации +Pine Bush Stem=Сосновое Деревце +Pine Bush Needles=Хвоя Соснового Деревца +Pine Bush Sapling=Саженца Соснового Деревца +Kelp=Ламинария +Green Coral=Зеленый Коралл +Pink Coral=Розовый Коралл +Cyan Coral=Голубой Коралл +Brown Coral=Бурый Коралл +Orange Coral=Оранжевый Коралл +Coral Skeleton=Коралловый Остов +Water Source=Водный Источник +Flowing Water=Текущая Вода +River Water Source=Речной Водный Источник +Flowing River Water=Текущая Речная Вода +Lava Source=Лавовый Источник +Flowing Lava=Текущая Лава +Empty Bookshelf=Пустая Книжная Полка +Bookshelf (@1 written, @2 empty books)=Книжная Полка (@1 написано, @2 чистые книги) +Bookshelf=Книжная Полка +Text too long=Текст слишком длинный +Wooden Sign=Деревянная Табличка +Steel Sign=Стальная Табличка +Wooden Ladder=Деревянная Лестница +Steel Ladder=Стальная Лестница +Apple Wood Fence=Яблоневый Деревянный Забор +Acacia Wood Fence=Деревянный Забор Из Акации +Jungle Wood Fence=Деревянный Забор Из Тропического Дерева +Pine Wood Fence=Сосновый Деревянный Забор +Aspen Wood Fence=Осиновый Деревянный Забор +Apple Wood Fence Rail=Яблоневый Деревянный Реечный Забор +Acacia Wood Fence Rail=Деревянный Реечный Забор Из Акации +Jungle Wood Fence Rail=Деревянный Реечный Забор Из Тропического Дерева +Pine Wood Fence Rail=Сосновый Деревянный Реечный Забор +Aspen Wood Fence Rail=Осиновый Деревянный Реечный Забор +Glass=Стекло +Obsidian Glass=Обсидиановое Стекло +Brick Block=Кирпичный Блок +Mese Lamp=Месе Лампа +Mese Post Light=Столб с Месе Фонарем +Cloud=Облако +Wooden Pickaxe=Деревянная Кирка +Stone Pickaxe=Каменная Кирка +Bronze Pickaxe=Бронзовая Кирка +Steel Pickaxe=Стальная Кирка +Mese Pickaxe=Месе Кирка +Diamond Pickaxe=Алмазная Кирка +Wooden Shovel=Деревянная Лопата +Stone Shovel=Каменная Лопата +Bronze Shovel=Бронзовая Лопата +Steel Shovel=Стальная Лопата +Mese Shovel=Месе Лопата +Diamond Shovel=Алмазная Лопата +Wooden Axe=Деревянный Топор +Stone Axe=Каменный Топор +Bronze Axe=Бронзовый Топор +Steel Axe=Стальной Топор +Mese Axe=Месе Топор +Diamond Axe=Алмазный Топор +Wooden Sword=Деревянный Меч +Stone Sword=Каменный Меч +Bronze Sword=Бронзовый Меч +Steel Sword=Стальной Меч +Mese Sword=Месе Меч +Diamond Sword=Алмазный Меч +Key=Ключ +Torch=Факел +@1 will intersect protection on growth.=@1 пересечёт защиту по росту. +Title:=Заголовок: +Contents:=Содержимое: +Save=Сохранить +by @1=@1 +Page @1 of @2=Страница @1 из @2 +"@1"="@1" diff --git a/mods/default/locale/default.se.tr b/mods/default/locale/default.se.tr new file mode 100644 index 0000000..d123530 --- /dev/null +++ b/mods/default/locale/default.se.tr @@ -0,0 +1,211 @@ +## textdomain: default +Locked Chest=Låst kista +Locked Chest (owned by @1)=Låst kista (Ägd av @1) +You do not own this chest.=Du äger inte denna kistan. +a locked chest=en låst kista +Chest=Kista +Stick=Pinne +Paper=Papper +"@1" by @2="@1" av @2 +Book=Bok +Book with Text=Bok med text +Skeleton Key=Skelett Nyckel +Key to @1's @2=Nyckel till @1s @2 +Coal Lump=Kol Klumo +Iron Lump=Järn Klump +Copper Lump=Koppar Klump +Tin Lump=Tenn Klump +Mese Crystal=Mese Kristall +Gold Lump=Guld Klump +Diamond=Diamant +Clay Lump=Lerklump +Steel Ingot=Stål tacka +Copper Ingot=Koppar tacka +Tin Ingot=Tenn tacka +Bronze Ingot=Brons tacka +Gold Ingot=Guld tacka +Mese Crystal Fragment=Mese Kristall Fragment +Clay Brick=Tegelsten +Obsidian Shard=Obsidian Skärva +Flint=Flinta +Blueberries=Blåbär +Furnace is empty=Ugnen är tom +100% (output full)=100% (utgången full) +@1%=@1% +Empty=Tom +Not cookable=Inte kokbar +Furnace active=Ugn aktiv +Furnace inactive=Ugn inaktiv +(Item: @1; Fuel: @2)=(Sak: @1; Bränsle: @2) +Furnace=Ugn +Stone=Sten +Cobblestone=Kullersten +Stone Brick=Stentegel +Stone Block=Sten block +Mossy Cobblestone=Mossig kullersten +Desert Stone=Öken sten +Desert Cobblestone=Öken kullersten +Desert Stone Brick=Öken stentegel +Desert Stone Block=Öken sten block +Sandstone=Sandsten +Sandstone Brick=Sandstenstegel +Sandstone Block=Sandsten block +Desert Sandstone=Öken sandsten +Desert Sandstone Brick=Öken Sandstenstegel +Desert Sandstone Block=Öken sandsten block +Silver Sandstone=Silver sandsten +Silver Sandstone Brick=Silver Sandstenstegel +Silver Sandstone Block=Silver sandsten block +Obsidian=Obsidian +Obsidian Brick=Obsidiantegel +Obsidian Block=Obsidian block +Dirt=Jord +Dirt with Grass=Jord med gräs +Dirt with Grass and Footsteps=Jord med gräs och fotsteg +Dirt with Dry Grass=Jord med torrt gräs +Dirt with Snow=Jord med snö +Dirt with Rainforest Litter=Jord med regnskogströ +Dirt with Coniferous Litter=Jord med Barrträd +Dry Dirt=Torr jord +Dry Dirt with Dry Grass=Torr jord med torrt gräs +Permafrost=Permafrost +Permafrost with Stones=Permafrost med sten +Permafrost with Moss=Permafrost med mossa +Sand=Sand +Desert Sand=Öken sand +Silver Sand=Silver sand +Gravel=Grus +Clay=Lera +Snow=Snö +Snow Block=Snö block +Ice=Is +Cave Ice=Grott Is +Apple Tree=Äpple Träd +Apple Wood Planks=Äpple Plankor +Apple Tree Sapling=Äpple Planta +Apple Tree Leaves=Äpple Löv +Apple=Äpple +Apple Marker=Äpple Markör +Jungle Tree=Djungel Träd +Jungle Wood Planks=Djungel Plankor +Jungle Tree Leaves=Djungel Löv +Jungle Tree Sapling=Djungel Planta +Emergent Jungle Tree Sapling=Nybliven Djungel Planta +Pine Tree=Tall +Pine Wood Planks= Tall Plankor +Pine Needles=Granbarr +Pine Tree Sapling=Tall Planta +Acacia Tree=Akacia Träd +Acacia Wood Planks=Akacia Plankor +Acacia Tree Leaves=Akacia Löv +Acacia Tree Sapling=Akacia Planta +Aspen Tree=Asp +Aspen Wood Planks=Asp Plankor +Aspen Tree Leaves=Asp Löv +Aspen Tree Sapling=Asp Planta +Coal Ore=Kol Malm +Coal Block=Kol Block +Iron Ore=Järn Malm +Steel Block=Stål Block +Copper Ore=Koppar Malm +Copper Block=Koppar Block +Tin Ore=Tenn Malm +Tin Block=Tenn Block +Bronze Block=Brons Block +Mese Ore=Mese Malm +Mese Block=Mese Block +Gold Ore=Guld Malm +Gold Block=Guld Block +Diamond Ore=Diamant Malm +Diamond Block=Diamant Block +Cactus=Kaktus +Large Cactus Seedling=Stor kaktusplanta +Papyrus=Papyrus +Dry Shrub=Torr Buske +Jungle Grass=Djungel Gräs +Grass=Gräs +Dry Grass=Torrt Gräs +Fern=Ormbunke +Marram Grass=Marram Gräs +Bush Stem=Busk Stam +Bush Leaves=Busk Löv +Bush Sapling=Busk Planta +Blueberry Bush Leaves with Berries=Blåbärsbusks Löv med Bär +Blueberry Bush Leaves=Blåbärsbusks Löv +Blueberry Bush Sapling=Blåbärsbusks Plantga +Acacia Bush Stem=Akacia Busks Stam +Acacia Bush Leaves=Akacia Busks Löv +Acacia Bush Sapling=Akacia Busks Planta +Pine Bush Stem=Tall Busks Stam +Pine Bush Needles=Tall Busks Granbarr +Pine Bush Sapling=Tall Busks Planta +Kelp=Brunalg +Green Coral=Grön Korall +Pink Coral=Rosa Korall +Cyan Coral=Cyan Korall +Brown Coral=Brun Korall +Orange Coral=Orange Korall +Coral Skeleton=Korall Skelett +Water Source=Vattenkälla +Flowing Water=Flödande Vatten +River Water Source=Flodvattenkälla +Flowing River Water=Flödande Flodvatten +Lava Source=Lavakälla +Flowing Lava=Flödande Lava +Empty Bookshelf=Tom Bokhylla +Bookshelf (@1 written, @2 empty books)=Bokhylla (@1 skriva, @2 tomma böcker) +Bookshelf=Bokhylla +Text too long=Text för lång +Wooden Sign=Trä Skylt +Steel Sign=Stål Skylt +Wooden Ladder=Trä Stege +Steel Ladder=Stål Stege +Apple Wood Fence=Äpple Trä Staket +Acacia Wood Fence=Akacia Trä Staket +Jungle Wood Fence=Djungel Trä Staket +Pine Wood Fence=Tall Trä Staket +Aspen Wood Fence=Asp Trä Staket +Apple Wood Fence Rail=Äpple Trä Staket Pinne +Acacia Wood Fence Rail=Akacia Trä Staket Pinne +Jungle Wood Fence Rail=Djungel Trä Staket Pinne +Pine Wood Fence Rail=Tall Trä Staket Pinne +Aspen Wood Fence Rail=Asp Trä Staket Pinne +Glass=Glas +Obsidian Glass=Obsidian Glas +Brick Block=Tegelstens Block +Mese Lamp=Mese Lampa +Mese Post Light=Mese Postljus +Cloud=Moln +Wooden Pickaxe=Trä Hacka +Stone Pickaxe=Sten Hacka +Bronze Pickaxe=Brons Hacka +Steel Pickaxe=Stål Hacka +Mese Pickaxe=Mese Hacka +Diamond Pickaxe=Diamant Hacka +Wooden Shovel=Trä Spade +Stone Shovel=Sten Spade +Bronze Shovel=Brons Spade +Steel Shovel=Stål Spade +Mese Shovel=Mese Spade +Diamond Shovel=Diamant Spade +Wooden Axe=Trä Yxa +Stone Axe=Sten Yxa +Bronze Axe=Brons Yxa +Steel Axe=Stål Yxa +Mese Axe=Mese Yxa +Diamond Axe=Diamant Yxa +Wooden Sword=Trä Svärd +Stone Sword=Sten Svärd +Bronze Sword=Brons Svärd +Steel Sword=Stål Svärd +Mese Sword=Mese Svärd +Diamond Sword=Diamant Svärd +Key=Nyckel +Torch=Fakla +@1 will intersect protection on growth.=@1 kommer korsa skyddet mot tillväxt. +Title:=Titel: +Contents:=Innehåll: +Save=Spara +by @1=av @1 +Page @1 of @2=Sida @1 av @2 +"@1"="@1" \ No newline at end of file diff --git a/mods/default/locale/default.zh_CN.tr b/mods/default/locale/default.zh_CN.tr new file mode 100644 index 0000000..ddd9471 --- /dev/null +++ b/mods/default/locale/default.zh_CN.tr @@ -0,0 +1,211 @@ +# textdomain: default +Locked Chest=已上锁的箱子 +Locked Chest (owned by @1)=已上锁的箱子(属于@1所有) +You do not own this chest.=这个箱子不属于你所有。 +a locked chest=一个已上锁的箱子 +Chest=箱子 +Stick=棒 +Paper=纸 +"@1" by @2="@1" by @2 +Book=书 +Book with Text=带文字的书 +Skeleton Key=万能钥匙 +Key to @1's @2=@1的@2的钥匙 +Coal Lump=煤块 +Iron Lump=铁块 +Copper Lump=铜块 +Tin Lump=锡块 +Mese Crystal=黄石晶体 +Gold Lump=金块 +Diamond=钻石 +Clay Lump=粘土块 +Steel Ingot=铁锭 +Copper Ingot=铜锭 +Tin Ingot=锡锭 +Bronze Ingot=青铜锭 +Gold Ingot=金锭 +Mese Crystal Fragment=黄石晶体碎片 +Clay Brick=粘土砖 +Obsidian Shard=黑曜石碎片 +Flint=燧石 +Blueberries=蓝莓 +Furnace is empty=熔炉是空的 +100% (output full)=100%(输出已满) +@1%=@1% +Empty=空 +Not cookable=不可烹饪 +Furnace active=熔炉正在运转 +Furnace inactive=熔炉未使用 +(Item: @1; Fuel: @2)=(项目:@1;燃料:@2) +Furnace=熔炉 +Stone=石 +Cobblestone=鹅卵石 +Stone Brick=石砖 +Stone Block=石方块 +Mossy Cobblestone=苔藓覆盖的鹅卵石 +Desert Stone=沙漠石 +Desert Cobblestone=沙漠鹅卵石 +Desert Stone Brick=沙漠鹅卵石砖 +Desert Stone Block=沙漠鹅卵石方块 +Sandstone=砂岩 +Sandstone Brick=砂岩砖 +Sandstone Block=砂岩方块 +Desert Sandstone=沙漠砂岩 +Desert Sandstone Brick=沙漠砂岩砖 +Desert Sandstone Block=沙漠砂岩方块 +Silver Sandstone=银砂岩 +Silver Sandstone Brick=银砂岩砖 +Silver Sandstone Block=银砂岩方块 +Obsidian=黑曜石 +Obsidian Brick=黑曜石砖 +Obsidian Block=黑曜石方块 +Dirt=土 +Dirt with Grass=带草的土 +Dirt with Grass and Footsteps=带草的土及脚印 +Dirt with Dry Grass=带干草的土 +Dirt with Snow=带雪的土 +Dirt with Rainforest Litter=雨林腐土 +Dirt with Coniferous Litter=针叶林腐土 +Dry Dirt=干土 +Dry Dirt with Dry Grass=干土和干草 +Permafrost=多年冻土 +Permafrost with Stones=带石头的多年冻土 +Permafrost with Moss=生苔的多年冻土 +Sand=沙 +Desert Sand=沙漠沙 +Silver Sand=银沙 +Gravel=沙砾 +Clay=粘土 +Snow=雪 +Snow Block=雪方块 +Ice=冰 +Cave Ice=洞穴冰 +Apple Tree=苹果树 +Apple Wood Planks=苹果树木板 +Apple Tree Sapling=苹果树苗 +Apple Tree Leaves=苹果树叶 +Apple=苹果 +Apple Marker=苹果标记 +Jungle Tree=丛林树 +Jungle Wood Planks=丛林树木板 +Jungle Tree Leaves=丛林树叶 +Jungle Tree Sapling=丛林树苗 +Emergent Jungle Tree Sapling=应急丛林树苗 +Pine Tree=松树 +Pine Wood Planks=松树木板 +Pine Needles=松针 +Pine Tree Sapling=松树树苗 +Acacia Tree=相思树 +Acacia Wood Planks=相思树木板 +Acacia Tree Leaves=相思树叶 +Acacia Tree Sapling=相思树树苗 +Aspen Tree=白杨树 +Aspen Wood Planks=白杨树木板 +Aspen Tree Leaves=白杨树叶 +Aspen Tree Sapling=白杨树树苗 +Coal Ore=煤炭矿石 +Coal Block=煤炭方块 +Iron Ore=铁矿石 +Steel Block=钢方块 +Copper Ore=铜矿石 +Copper Block=铜方块 +Tin Ore=锡矿石 +Tin Block=锡方块 +Bronze Block=青铜方块 +Mese Ore=黄石矿石 +Mese Block=黄石方块 +Gold Ore=金矿石 +Gold Block=金方块 +Diamond Ore=钻石矿石 +Diamond Block=钻石方块 +Cactus=仙人掌 +Large Cactus Seedling=大仙人掌苗 +Papyrus=莎草纸 +Dry Shrub=干灌木 +Jungle Grass=丛林草 +Grass=草 +Dry Grass=干草 +Fern=蕨 +Marram Grass=滨草 +Bush Stem=灌木 +Bush Leaves=灌木叶 +Bush Sapling=灌木苗 +Blueberry Bush Leaves with Berries=蓝莓灌木叶与浆果 +Blueberry Bush Leaves=蓝莓灌木叶 +Blueberry Bush Sapling=蓝莓灌木苗 +Acacia Bush Stem=相思灌木 +Acacia Bush Leaves=相思灌木叶 +Acacia Bush Sapling=相思灌木苗 +Pine Bush Stem=松树灌木 +Pine Bush Needles=松树灌木针 +Pine Bush Sapling=松树灌木苗 +Kelp=海带 +Green Coral=绿珊瑚 +Pink Coral=淡红珊瑚 +Cyan Coral=青珊瑚 +Brown Coral=棕珊瑚 +Orange Coral=橙珊瑚 +Coral Skeleton=珊瑚骨架 +Water Source=水方块 +Flowing Water=流动的水 +River Water Source=河水方块 +Flowing River Water=流动的河水 +Lava Source=岩浆方块 +Flowing Lava=流动的岩浆 +Empty Bookshelf=空书架 +Bookshelf (@1 written, @2 empty books)=书架(@1本有字的书,@2本空书) +Bookshelf=书架 +Text too long=文字太长 +Wooden Sign=木牌 +Steel Sign=铁牌 +Wooden Ladder=木梯子 +Steel Ladder=铁梯子 +Apple Wood Fence=苹果木栅栏 +Acacia Wood Fence=相思木栅栏 +Jungle Wood Fence=丛林木栅栏 +Pine Wood Fence=松木栅栏 +Aspen Wood Fence=白杨木栅栏 +Apple Wood Fence Rail=苹果木栏杆 +Acacia Wood Fence Rail=相思木栏杆 +Jungle Wood Fence Rail=丛林木栏杆 +Pine Wood Fence Rail=松木栏杆 +Aspen Wood Fence Rail=白杨木栏杆 +Glass=玻璃 +Obsidian Glass=黑曜石玻璃 +Brick Block=砖方块 +Mese Lamp=黄石灯 +Mese Post Light=黄石柱灯 +Cloud=云 +Wooden Pickaxe=木镐 +Stone Pickaxe=石镐 +Bronze Pickaxe=青铜镐 +Steel Pickaxe=铁镐 +Mese Pickaxe=黄石镐 +Diamond Pickaxe=钻石镐 +Wooden Shovel=木铲 +Stone Shovel=石铲 +Bronze Shovel=青铜铲 +Steel Shovel=铁铲 +Mese Shovel=黄石铲 +Diamond Shovel=钻石铲 +Wooden Axe=木斧 +Stone Axe=石斧 +Bronze Axe=青铜斧 +Steel Axe=铁斧 +Mese Axe=黄石斧 +Diamond Axe=钻石斧 +Wooden Sword=木剑 +Stone Sword=石剑 +Bronze Sword=青铜剑 +Steel Sword=铁剑 +Mese Sword=黄石剑 +Diamond Sword=钻石剑 +Key=钥匙 +Torch=火把 +@1 will intersect protection on growth.=@1将与增长的保护相交。 +Title:=标题: +Contents:=内容: +Save=保存 +by @1=由@1 +Page @1 of @2=第@1页,共@2页。 +"@1"="@1" diff --git a/mods/default/locale/default.zh_TW.tr b/mods/default/locale/default.zh_TW.tr new file mode 100644 index 0000000..6b06b8a --- /dev/null +++ b/mods/default/locale/default.zh_TW.tr @@ -0,0 +1,211 @@ +# textdomain: default +Locked Chest=已上鎖的箱子 +Locked Chest (owned by @1)=已上鎖的箱子(屬於@1所有) +You do not own this chest.=這個箱子不屬於你所有。 +a locked chest=一個已上鎖的箱子 +Chest=箱子 +Stick=棒 +Paper=紙 +"@1" by @2="@1" by @2 +Book=書 +Book with Text=帶文字的書 +Skeleton Key=萬能鑰匙 +Key to @1's @2=@1的@2的鑰匙 +Coal Lump=煤塊 +Iron Lump=鐵塊 +Copper Lump=銅塊 +Tin Lump=錫塊 +Mese Crystal=黃石晶體 +Gold Lump=金塊 +Diamond=鑽石 +Clay Lump=粘土塊 +Steel Ingot=鐵錠 +Copper Ingot=銅錠 +Tin Ingot=錫錠 +Bronze Ingot=青銅錠 +Gold Ingot=金錠 +Mese Crystal Fragment=黃石晶體碎片 +Clay Brick=粘土磚 +Obsidian Shard=黑曜石碎片 +Flint=燧石 +Blueberries=藍莓 +Furnace is empty=熔爐是空的 +100% (output full)=100%(輸出已滿) +@1%=@1% +Empty=空 +Not cookable=不可烹飪 +Furnace active=熔爐正在運轉 +Furnace inactive=熔爐未使用 +(Item: @1; Fuel: @2)=(項目:@1;燃料:@2) +Furnace=熔爐 +Stone=石 +Cobblestone=鵝卵石 +Stone Brick=石磚 +Stone Block=石方塊 +Mossy Cobblestone=苔蘚覆蓋的鵝卵石 +Desert Stone=沙漠石 +Desert Cobblestone=沙漠鵝卵石 +Desert Stone Brick=沙漠鵝卵石磚 +Desert Stone Block=沙漠鵝卵石方塊 +Sandstone=砂岩 +Sandstone Brick=砂岩磚 +Sandstone Block=砂岩方塊 +Desert Sandstone=沙漠砂岩 +Desert Sandstone Brick=沙漠砂岩磚 +Desert Sandstone Block=沙漠砂岩方塊 +Silver Sandstone=銀砂岩 +Silver Sandstone Brick=銀砂岩磚 +Silver Sandstone Block=銀砂岩方塊 +Obsidian=黑曜石 +Obsidian Brick=黑曜石磚 +Obsidian Block=黑曜石方塊 +Dirt=土 +Dirt with Grass=帶草的土 +Dirt with Grass and Footsteps=帶草的土及腳印 +Dirt with Dry Grass=帶乾草的土 +Dirt with Snow=帶雪的土 +Dirt with Rainforest Litter=雨林腐土 +Dirt with Coniferous Litter=針葉林腐土 +Dry Dirt=乾土 +Dry Dirt with Dry Grass=乾土和乾草 +Permafrost=多年凍土 +Permafrost with Stones=帶石頭的多年凍土 +Permafrost with Moss=生苔的多年凍土 +Sand=沙 +Desert Sand=沙漠沙 +Silver Sand=銀沙 +Gravel=沙礫 +Clay=粘土 +Snow=雪 +Snow Block=雪方塊 +Ice=冰 +Cave Ice=洞穴冰 +Apple Tree=蘋果樹 +Apple Wood Planks=蘋果樹木板 +Apple Tree Sapling=蘋果樹苗 +Apple Tree Leaves=蘋果樹葉 +Apple=蘋果 +Apple Marker=蘋果標記 +Jungle Tree=叢林樹 +Jungle Wood Planks=叢林樹木板 +Jungle Tree Leaves=叢林樹葉 +Jungle Tree Sapling=叢林樹苗 +Emergent Jungle Tree Sapling=應急叢林樹苗 +Pine Tree=松樹 +Pine Wood Planks=松樹木板 +Pine Needles=松針 +Pine Tree Sapling=松樹樹苗 +Acacia Tree=相思樹 +Acacia Wood Planks=相思樹木板 +Acacia Tree Leaves=相思樹葉 +Acacia Tree Sapling=相思樹樹苗 +Aspen Tree=白楊樹 +Aspen Wood Planks=白楊樹木板 +Aspen Tree Leaves=白楊樹葉 +Aspen Tree Sapling=白楊樹樹苗 +Coal Ore=煤炭礦石 +Coal Block=煤炭方塊 +Iron Ore=鐵礦石 +Steel Block=鋼方塊 +Copper Ore=銅礦石 +Copper Block=銅方塊 +Tin Ore=錫礦石 +Tin Block=錫方塊 +Bronze Block=青銅方塊 +Mese Ore=黃石礦石 +Mese Block=黃石方塊 +Gold Ore=金礦石 +Gold Block=金方塊 +Diamond Ore=鑽石礦石 +Diamond Block=鑽石方塊 +Cactus=仙人掌 +Large Cactus Seedling=大仙人掌苗 +Papyrus=莎草紙 +Dry Shrub=幹灌木 +Jungle Grass=叢林草 +Grass=草 +Dry Grass=乾草 +Fern=蕨 +Marram Grass=濱草 +Bush Stem=灌木 +Bush Leaves=灌木葉 +Bush Sapling=灌木苗 +Blueberry Bush Leaves with Berries=藍莓灌木葉與漿果 +Blueberry Bush Leaves=藍莓灌木葉 +Blueberry Bush Sapling=藍莓灌木苗 +Acacia Bush Stem=相思灌木 +Acacia Bush Leaves=相思灌木葉 +Acacia Bush Sapling=相思灌木苗 +Pine Bush Stem=松樹灌木 +Pine Bush Needles=松樹灌木針 +Pine Bush Sapling=松樹灌木苗 +Kelp=海帶 +Green Coral=綠珊瑚 +Pink Coral=淡紅珊瑚 +Cyan Coral=青珊瑚 +Brown Coral=棕珊瑚 +Orange Coral=橙珊瑚 +Coral Skeleton=珊瑚骨架 +Water Source=水方塊 +Flowing Water=流動的水 +River Water Source=河水方塊 +Flowing River Water=流動的河水 +Lava Source=岩漿方塊 +Flowing Lava=流動的岩漿 +Empty Bookshelf=空書架 +Bookshelf (@1 written, @2 empty books)=書架(@1本有字的書,@2本空書) +Bookshelf=書架 +Text too long=文字太長 +Wooden Sign=木牌 +Steel Sign=鐵牌 +Wooden Ladder=木梯子 +Steel Ladder=鐵梯子 +Apple Wood Fence=蘋果木柵欄 +Acacia Wood Fence=相思木柵欄 +Jungle Wood Fence=叢林木柵欄 +Pine Wood Fence=松木柵欄 +Aspen Wood Fence=白楊木柵欄 +Apple Wood Fence Rail=蘋果木欄杆 +Acacia Wood Fence Rail=相思木欄杆 +Jungle Wood Fence Rail=叢林木欄杆 +Pine Wood Fence Rail=松木欄杆 +Aspen Wood Fence Rail=白楊木欄杆 +Glass=玻璃 +Obsidian Glass=黑曜石玻璃 +Brick Block=磚方塊 +Mese Lamp=黃石燈 +Mese Post Light=黃石柱燈 +Cloud=雲 +Wooden Pickaxe=木鎬 +Stone Pickaxe=石鎬 +Bronze Pickaxe=青銅鎬 +Steel Pickaxe=鐵鎬 +Mese Pickaxe=黃石鎬 +Diamond Pickaxe=鑽石鎬 +Wooden Shovel=木鏟 +Stone Shovel=石鏟 +Bronze Shovel=青銅鏟 +Steel Shovel=鐵鏟 +Mese Shovel=黃石鏟 +Diamond Shovel=鑽石鏟 +Wooden Axe=木斧 +Stone Axe=石斧 +Bronze Axe=青銅斧 +Steel Axe=鐵斧 +Mese Axe=黃石斧 +Diamond Axe=鑽石斧 +Wooden Sword=木劍 +Stone Sword=石劍 +Bronze Sword=青銅劍 +Steel Sword=鐵劍 +Mese Sword=黃石劍 +Diamond Sword=鑽石劍 +Key=鑰匙 +Torch=火把 +@1 will intersect protection on growth.=@1將與增長的保護相交。 +Title:=標題: +Contents:=內容: +Save=保存 +by @1=由@1 +Page @1 of @2=第@1頁,共@2頁。 +"@1"="@1" diff --git a/mods/default/locale/template.txt b/mods/default/locale/template.txt index c8e616c..dd554d4 100644 --- a/mods/default/locale/template.txt +++ b/mods/default/locale/template.txt @@ -1,43 +1,4 @@ # textdomain: default -Locked Chest= -Locked Chest (owned by @1)= -You do not own this chest.= -a locked chest= -Chest= -Stick= -Paper= -"@1" by @2= -Book= -Book with Text= -Skeleton Key= -Key to @1's @2= -Coal Lump= -Iron Lump= -Copper Lump= -Tin Lump= -Mese Crystal= -Gold Lump= -Diamond= -Clay Lump= -Steel Ingot= -Copper Ingot= -Tin Ingot= -Bronze Ingot= -Gold Ingot= -Mese Crystal Fragment= -Clay Brick= -Obsidian Shard= -Flint= -Blueberries= -Furnace is empty= -100% (output full)= -@1%= -Empty= -Not cookable= -Furnace active= -Furnace inactive= -(Item: @1; Fuel: @2)= -Furnace= Stone= Cobblestone= Stone Brick= @@ -62,12 +23,12 @@ Obsidian Block= Dirt= Dirt with Grass= Dirt with Grass and Footsteps= -Dirt with Dry Grass= +Dirt with Savanna Grass= Dirt with Snow= Dirt with Rainforest Litter= Dirt with Coniferous Litter= -Dry Dirt= -Dry Dirt with Dry Grass= +Savanna Dirt= +Savanna Dirt with Savanna Grass= Permafrost= Permafrost with Stones= Permafrost with Moss= @@ -124,7 +85,7 @@ Papyrus= Dry Shrub= Jungle Grass= Grass= -Dry Grass= +Savanna Grass= Fern= Marram Grass= Bush Stem= @@ -176,6 +137,8 @@ Brick Block= Mese Lamp= Mese Post Light= Cloud= +@1 will intersect protection on growth.= +Torch= Wooden Pickaxe= Stone Pickaxe= Bronze Pickaxe= @@ -201,11 +164,48 @@ Steel Sword= Mese Sword= Diamond Sword= Key= -Torch= -@1 will intersect protection on growth.= +Furnace is empty= +100% (output full)= +@1%= +Not cookable= +Empty= +Furnace active= +Furnace inactive= +(Item: @1; Fuel: @2)= +Furnace= Title:= Contents:= Save= by @1= Page @1 of @2= "@1"= +"@1" by @2= +Skeleton Key= +Key to @1's @2= +Blueberries= +Book= +Book with Text= +Bronze Ingot= +Clay Brick= +Clay Lump= +Coal Lump= +Copper Ingot= +Copper Lump= +Diamond= +Flint= +Gold Ingot= +Gold Lump= +Iron Lump= +Mese Crystal= +Mese Crystal Fragment= +Obsidian Shard= +Paper= +Steel Ingot= +Stick= +Tin Ingot= +Tin Lump= +Locked Chest= +Locked Chest (owned by @1)= +You do not own this chest.= +a locked chest= +Chest= diff --git a/mods/default/mapgen.lua b/mods/default/mapgen.lua index a361f89..8c161d1 100644 --- a/mods/default/mapgen.lua +++ b/mods/default/mapgen.lua @@ -576,7 +576,7 @@ function default.register_ores() -- Only where default:dirt is present as surface material biomes = {"taiga", "snowy_grassland", "grassland", "coniferous_forest", "deciduous_forest", "deciduous_forest_shore", "rainforest", - "rainforest_swamp", "floatland_coniferous_forest"} + "rainforest_swamp"} }) -- Gravel @@ -890,7 +890,7 @@ end -- All mapgens except mgv6 -function default.register_biomes(upper_limit) +function default.register_biomes() -- Icesheet @@ -909,7 +909,7 @@ function default.register_biomes(upper_limit) depth_riverbed = 2, node_dungeon = "default:ice", node_dungeon_stair = "stairs:stair_ice", - y_max = upper_limit, + y_max = 31000, y_min = -8, heat_point = 0, humidity_point = 73, @@ -956,7 +956,7 @@ function default.register_biomes(upper_limit) node_dungeon = "default:cobble", node_dungeon_alt = "default:mossycobble", node_dungeon_stair = "stairs:stair_cobble", - y_max = upper_limit, + y_max = 31000, y_min = 47, heat_point = 0, humidity_point = 40, @@ -1043,7 +1043,7 @@ function default.register_biomes(upper_limit) node_dungeon = "default:cobble", node_dungeon_alt = "default:mossycobble", node_dungeon_stair = "stairs:stair_cobble", - y_max = upper_limit, + y_max = 31000, y_min = 4, heat_point = 25, humidity_point = 70, @@ -1095,7 +1095,7 @@ function default.register_biomes(upper_limit) node_dungeon = "default:cobble", node_dungeon_alt = "default:mossycobble", node_dungeon_stair = "stairs:stair_cobble", - y_max = upper_limit, + y_max = 31000, y_min = 4, heat_point = 20, humidity_point = 35, @@ -1146,7 +1146,7 @@ function default.register_biomes(upper_limit) node_dungeon = "default:cobble", node_dungeon_alt = "default:mossycobble", node_dungeon_stair = "stairs:stair_cobble", - y_max = upper_limit, + y_max = 31000, y_min = 6, heat_point = 50, humidity_point = 35, @@ -1213,7 +1213,7 @@ function default.register_biomes(upper_limit) node_dungeon = "default:cobble", node_dungeon_alt = "default:mossycobble", node_dungeon_stair = "stairs:stair_cobble", - y_max = upper_limit, + y_max = 31000, y_min = 6, heat_point = 45, humidity_point = 70, @@ -1280,7 +1280,7 @@ function default.register_biomes(upper_limit) node_dungeon = "default:cobble", node_dungeon_alt = "default:mossycobble", node_dungeon_stair = "stairs:stair_cobble", - y_max = upper_limit, + y_max = 31000, y_min = 1, heat_point = 60, humidity_point = 68, @@ -1347,7 +1347,7 @@ function default.register_biomes(upper_limit) depth_riverbed = 2, node_dungeon = "default:desert_stone", node_dungeon_stair = "stairs:stair_desert_stone", - y_max = upper_limit, + y_max = 31000, y_min = 4, heat_point = 92, humidity_point = 16, @@ -1397,7 +1397,7 @@ function default.register_biomes(upper_limit) depth_riverbed = 2, node_dungeon = "default:sandstonebrick", node_dungeon_stair = "stairs:stair_sandstone_block", - y_max = upper_limit, + y_max = 31000, y_min = 4, heat_point = 60, humidity_point = 0, @@ -1446,7 +1446,7 @@ function default.register_biomes(upper_limit) node_dungeon = "default:cobble", node_dungeon_alt = "default:mossycobble", node_dungeon_stair = "stairs:stair_cobble", - y_max = upper_limit, + y_max = 31000, y_min = 4, heat_point = 40, humidity_point = 0, @@ -1496,7 +1496,7 @@ function default.register_biomes(upper_limit) node_dungeon = "default:cobble", node_dungeon_alt = "default:mossycobble", node_dungeon_stair = "stairs:stair_cobble", - y_max = upper_limit, + y_max = 31000, y_min = 1, heat_point = 89, humidity_point = 42, @@ -1563,7 +1563,7 @@ function default.register_biomes(upper_limit) node_dungeon = "default:cobble", node_dungeon_alt = "default:mossycobble", node_dungeon_stair = "stairs:stair_cobble", - y_max = upper_limit, + y_max = 31000, y_min = 1, heat_point = 86, humidity_point = 65, @@ -1619,59 +1619,6 @@ function default.register_biomes(upper_limit) end --- Biomes for floatlands - --- TODO Temporary simple biomes to be replaced by special floatland biomes later. - -function default.register_floatland_biomes(floatland_level, shadow_limit) - - minetest.register_biome({ - name = "floatland_grassland", - node_top = "default:dirt_with_grass", - depth_top = 1, - node_filler = "default:dirt", - depth_filler = 1, - node_dungeon = "default:cobble", - node_dungeon_alt = "default:mossycobble", - node_dungeon_stair = "stairs:stair_cobble", - y_max = 31000, - y_min = floatland_level + 2, - heat_point = 50, - humidity_point = 25, - }) - - minetest.register_biome({ - name = "floatland_coniferous_forest", - node_top = "default:dirt_with_coniferous_litter", - depth_top = 1, - node_filler = "default:dirt", - depth_filler = 3, - node_dungeon = "default:cobble", - node_dungeon_alt = "default:mossycobble", - node_dungeon_stair = "stairs:stair_cobble", - y_max = 31000, - y_min = floatland_level + 2, - heat_point = 50, - humidity_point = 75, - }) - - minetest.register_biome({ - name = "floatland_ocean", - node_top = "default:sand", - depth_top = 1, - node_filler = "default:sand", - depth_filler = 3, - node_dungeon = "default:cobble", - node_dungeon_alt = "default:mossycobble", - node_dungeon_stair = "stairs:stair_cobble", - y_max = floatland_level + 1, - y_min = shadow_limit, - heat_point = 50, - humidity_point = 50, - }) -end - - -- -- Register decorations -- @@ -1787,7 +1734,7 @@ local function register_grass_decoration(offset, scale, length) octaves = 3, persist = 0.6 }, - biomes = {"grassland", "deciduous_forest", "floatland_grassland"}, + biomes = {"grassland", "deciduous_forest"}, y_max = 31000, y_min = 1, decoration = "default:grass_" .. length, @@ -1829,7 +1776,7 @@ local function register_fern_decoration(seed, length) octaves = 3, persist = 0.7 }, - biomes = {"coniferous_forest", "floatland_coniferous_forest"}, + biomes = {"coniferous_forest"}, y_max = 31000, y_min = 6, decoration = "default:fern_" .. length, @@ -1944,11 +1891,35 @@ function default.register_decorations() minetest.register_decoration({ name = "default:jungle_tree", deco_type = "schematic", - place_on = {"default:dirt_with_rainforest_litter", "default:dirt"}, + place_on = {"default:dirt_with_rainforest_litter"}, sidelen = 80, fill_ratio = 0.1, - biomes = {"rainforest", "rainforest_swamp"}, + biomes = {"rainforest"}, y_max = 31000, + y_min = 1, + schematic = minetest.get_modpath("default") .. "/schematics/jungle_tree.mts", + flags = "place_center_x, place_center_z", + rotation = "random", + }) + + -- Swamp jungle trees + + minetest.register_decoration({ + name = "default:jungle_tree(swamp)", + deco_type = "schematic", + place_on = {"default:dirt"}, + sidelen = 16, + -- Noise tuned to place swamp trees where papyrus is absent + noise_params = { + offset = 0.0, + scale = -0.1, + spread = {x = 200, y = 200, z = 200}, + seed = 354, + octaves = 1, + persist = 0.5 + }, + biomes = {"rainforest_swamp"}, + y_max = 0, y_min = -1, schematic = minetest.get_modpath("default") .. "/schematics/jungle_tree.mts", flags = "place_center_x, place_center_z", @@ -1962,7 +1933,7 @@ function default.register_decorations() place_offset_y = 1, sidelen = 80, fill_ratio = 0.005, - biomes = {"rainforest", "rainforest_swamp"}, + biomes = {"rainforest"}, y_max = 31000, y_min = 1, schematic = minetest.get_modpath("default") .. "/schematics/jungle_log.mts", @@ -1987,7 +1958,7 @@ function default.register_decorations() octaves = 3, persist = 0.66 }, - biomes = {"taiga", "coniferous_forest", "floatland_coniferous_forest"}, + biomes = {"taiga", "coniferous_forest"}, y_max = 31000, y_min = 4, schematic = minetest.get_modpath("default") .. "/schematics/pine_tree.mts", @@ -2007,7 +1978,7 @@ function default.register_decorations() octaves = 3, persist = 0.66 }, - biomes = {"taiga", "coniferous_forest", "floatland_coniferous_forest"}, + biomes = {"taiga", "coniferous_forest"}, y_max = 31000, y_min = 4, schematic = minetest.get_modpath("default") .. "/schematics/small_pine_tree.mts", @@ -2021,7 +1992,7 @@ function default.register_decorations() place_offset_y = 1, sidelen = 80, fill_ratio = 0.0018, - biomes = {"taiga", "coniferous_forest", "floatland_coniferous_forest"}, + biomes = {"taiga", "coniferous_forest"}, y_max = 31000, y_min = 4, schematic = minetest.get_modpath("default") .. "/schematics/pine_log.mts", @@ -2172,8 +2143,10 @@ function default.register_decorations() -- Papyrus + -- Dirt version for rainforest swamp + minetest.register_decoration({ - name = "default:papyrus", + name = "default:papyrus_on_dirt", deco_type = "schematic", place_on = {"default:dirt"}, sidelen = 16, @@ -2185,10 +2158,32 @@ function default.register_decorations() octaves = 3, persist = 0.7 }, + biomes = {"rainforest_swamp"}, + y_max = 0, + y_min = 0, + schematic = minetest.get_modpath("default") .. "/schematics/papyrus_on_dirt.mts", + }) + + -- Dry dirt version for savanna shore + + minetest.register_decoration({ + name = "default:papyrus_on_dry_dirt", + deco_type = "schematic", + place_on = {"default:dry_dirt"}, + sidelen = 16, + noise_params = { + offset = -0.3, + scale = 0.7, + spread = {x = 200, y = 200, z = 200}, + seed = 354, + octaves = 3, + persist = 0.7 + }, biomes = {"savanna_shore"}, y_max = 0, y_min = 0, - schematic = minetest.get_modpath("default") .. "/schematics/papyrus.mts", + schematic = minetest.get_modpath("default") .. + "/schematics/papyrus_on_dry_dirt.mts", }) -- Bush @@ -2206,8 +2201,7 @@ function default.register_decorations() octaves = 3, persist = 0.7, }, - biomes = {"grassland", "deciduous_forest", - "floatland_grassland"}, + biomes = {"grassland", "deciduous_forest"}, y_max = 31000, y_min = 1, schematic = minetest.get_modpath("default") .. "/schematics/bush.mts", @@ -2479,22 +2473,9 @@ end -- --- Detect mapgen, flags and parameters to select functions +-- Detect mapgen to select functions -- --- Get setting or default -local mgv7_spflags = minetest.get_mapgen_setting("mgv7_spflags") or - "mountains, ridges, nofloatlands, caverns" -local captures_float = string.match(mgv7_spflags, "floatlands") -local captures_nofloat = string.match(mgv7_spflags, "nofloatlands") - --- Get setting or default --- Make global for mods to use to register floatland biomes -default.mgv7_floatland_level = - minetest.get_mapgen_setting("mgv7_floatland_level") or 1280 -default.mgv7_shadow_limit = - minetest.get_mapgen_setting("mgv7_shadow_limit") or 1024 - minetest.clear_registered_biomes() minetest.clear_registered_ores() minetest.clear_registered_decorations() @@ -2504,19 +2485,8 @@ local mg_name = minetest.get_mapgen_setting("mg_name") if mg_name == "v6" then default.register_mgv6_ores() default.register_mgv6_decorations() --- Need to check for 'nofloatlands' because that contains --- 'floatlands' which makes the second condition true. -elseif mg_name == "v7" and - captures_float == "floatlands" and - captures_nofloat ~= "nofloatlands" then - -- Mgv7 with floatlands and floatland biomes - default.register_biomes(default.mgv7_shadow_limit - 1) - default.register_floatland_biomes( - default.mgv7_floatland_level, default.mgv7_shadow_limit) - default.register_ores() - default.register_decorations() else - default.register_biomes(31000) + default.register_biomes() default.register_ores() default.register_decorations() end diff --git a/mods/default/nodes.lua b/mods/default/nodes.lua index cee1242..d2a2915 100644 --- a/mods/default/nodes.lua +++ b/mods/default/nodes.lua @@ -458,12 +458,12 @@ minetest.register_node("default:dirt_with_grass_footsteps", { }) minetest.register_node("default:dirt_with_dry_grass", { - description = S("Dirt with Dry Grass"), + description = S("Dirt with Savanna Grass"), tiles = {"default_dry_grass.png", "default_dirt.png", {name = "default_dirt.png^default_dry_grass_side.png", tileable_vertical = false}}, - groups = {crumbly = 3, soil = 1}, + groups = {crumbly = 3, soil = 1, spreading_dirt_type = 1}, drop = "default:dirt", sounds = default.node_sound_dirt_defaults({ footstep = {name = "default_grass_footstep", gain = 0.4}, @@ -513,14 +513,14 @@ minetest.register_node("default:dirt_with_coniferous_litter", { }) minetest.register_node("default:dry_dirt", { - description = S("Dry Dirt"), + description = S("Savanna Dirt"), tiles = {"default_dry_dirt.png"}, groups = {crumbly = 3, soil = 1}, sounds = default.node_sound_dirt_defaults(), }) minetest.register_node("default:dry_dirt_with_dry_grass", { - description = S("Dry Dirt with Dry Grass"), + description = S("Savanna Dirt with Savanna Grass"), tiles = {"default_dry_grass.png", "default_dry_dirt.png", {name = "default_dry_dirt.png^default_dry_grass_side.png", tileable_vertical = false}}, @@ -621,7 +621,7 @@ minetest.register_node("default:snow", { collision_box = { type = "fixed", fixed = { - {-0.5, -0.5, -0.5, 0.5, -7 / 16, 0.5}, + {-0.5, -0.5, -0.5, 0.5, -6 / 16, 0.5}, }, }, groups = {crumbly = 3, falling_node = 1, snowy = 1}, @@ -1497,7 +1497,7 @@ end minetest.register_node("default:dry_grass_1", { - description = S("Dry Grass"), + description = S("Savanna Grass"), drawtype = "plantlike", waving = 1, tiles = {"default_dry_grass_1.png"}, @@ -1526,7 +1526,7 @@ minetest.register_node("default:dry_grass_1", { for i = 2, 5 do minetest.register_node("default:dry_grass_" .. i, { - description = S("Dry Grass"), + description = S("Savanna Grass"), drawtype = "plantlike", waving = 1, tiles = {"default_dry_grass_" .. i .. ".png"}, @@ -2031,7 +2031,7 @@ local function coral_on_place(itemstack, placer, pointed_thing) local def_under = minetest.registered_nodes[node_under.name] if def_under and def_under.on_rightclick and not placer:get_player_control().sneak then - return def_under.on_rightclick(pos_under, node_under.name, + return def_under.on_rightclick(pos_under, node_under, placer, itemstack, pointed_thing) or itemstack end @@ -2203,7 +2203,7 @@ minetest.register_node("default:water_source", { }, }, }, - alpha = 160, + alpha = 191, paramtype = "light", walkable = false, pointable = false, @@ -2234,7 +2234,7 @@ minetest.register_node("default:water_flowing", { type = "vertical_frames", aspect_w = 16, aspect_h = 16, - length = 0.8, + length = 0.5, }, }, { @@ -2244,11 +2244,11 @@ minetest.register_node("default:water_flowing", { type = "vertical_frames", aspect_w = 16, aspect_h = 16, - length = 0.8, + length = 0.5, }, }, }, - alpha = 160, + alpha = 191, paramtype = "light", paramtype2 = "flowingliquid", walkable = false, @@ -2330,7 +2330,7 @@ minetest.register_node("default:river_water_flowing", { type = "vertical_frames", aspect_w = 16, aspect_h = 16, - length = 0.8, + length = 0.5, }, }, { @@ -2340,7 +2340,7 @@ minetest.register_node("default:river_water_flowing", { type = "vertical_frames", aspect_w = 16, aspect_h = 16, - length = 0.8, + length = 0.5, }, }, }, @@ -2579,12 +2579,10 @@ local function register_sign(material, desc, def) sounds = def.sounds, on_construct = function(pos) - --local n = minetest.get_node(pos) local meta = minetest.get_meta(pos) meta:set_string("formspec", "field[text;;${text}]") end, on_receive_fields = function(pos, formname, fields, sender) - --print("Sign at "..minetest.pos_to_string(pos).." got "..dump(fields)) local player_name = sender:get_player_name() if minetest.is_protected(pos, player_name) then minetest.record_protection_violation(pos, player_name) @@ -2598,8 +2596,8 @@ local function register_sign(material, desc, def) minetest.chat_send_player(player_name, S("Text too long")) return end - minetest.log("action", (player_name or "") .. " wrote \"" .. - text .. "\" to sign at " .. minetest.pos_to_string(pos)) + minetest.log("action", player_name .. " wrote \"" .. text .. + "\" to the sign at " .. minetest.pos_to_string(pos)) local meta = minetest.get_meta(pos) meta:set_string("text", text) @@ -2816,7 +2814,10 @@ minetest.register_node("default:brick", { description = S("Brick Block"), paramtype2 = "facedir", place_param2 = 0, - tiles = {"default_brick.png"}, + tiles = { + "default_brick.png^[transformFX", + "default_brick.png", + }, is_ground_content = false, groups = {cracky = 3}, sounds = default.node_sound_stone_defaults(), diff --git a/mods/default/schematics/papyrus.mts b/mods/default/schematics/papyrus_on_dirt.mts similarity index 100% rename from mods/default/schematics/papyrus.mts rename to mods/default/schematics/papyrus_on_dirt.mts diff --git a/mods/default/schematics/papyrus_on_dry_dirt.mts b/mods/default/schematics/papyrus_on_dry_dirt.mts new file mode 100644 index 0000000..3626580 Binary files /dev/null and b/mods/default/schematics/papyrus_on_dry_dirt.mts differ diff --git a/mods/default/sounds/default_grass_footstep.1.ogg b/mods/default/sounds/default_grass_footstep.1.ogg index 22d1ad6..a04cdb4 100644 Binary files a/mods/default/sounds/default_grass_footstep.1.ogg and b/mods/default/sounds/default_grass_footstep.1.ogg differ diff --git a/mods/default/sounds/default_grass_footstep.2.ogg b/mods/default/sounds/default_grass_footstep.2.ogg index 4ccd8a0..d193068 100644 Binary files a/mods/default/sounds/default_grass_footstep.2.ogg and b/mods/default/sounds/default_grass_footstep.2.ogg differ diff --git a/mods/default/sounds/default_grass_footstep.3.ogg b/mods/default/sounds/default_grass_footstep.3.ogg index 20db84e..e1897ea 100644 Binary files a/mods/default/sounds/default_grass_footstep.3.ogg and b/mods/default/sounds/default_grass_footstep.3.ogg differ diff --git a/mods/default/sounds/player_damage.ogg b/mods/default/sounds/player_damage.ogg new file mode 100644 index 0000000..7888087 Binary files /dev/null and b/mods/default/sounds/player_damage.ogg differ diff --git a/mods/default/textures/bubble.png b/mods/default/textures/bubble.png index 100fe15..30170d2 100644 Binary files a/mods/default/textures/bubble.png and b/mods/default/textures/bubble.png differ diff --git a/mods/default/textures/default_dry_shrub.png b/mods/default/textures/default_dry_shrub.png index e8a7f27..82c9cc5 100644 Binary files a/mods/default/textures/default_dry_shrub.png and b/mods/default/textures/default_dry_shrub.png differ diff --git a/mods/default/textures/gui_hotbar.png b/mods/default/textures/gui_hotbar.png new file mode 100644 index 0000000..7bc7887 Binary files /dev/null and b/mods/default/textures/gui_hotbar.png differ diff --git a/mods/default/textures/gui_hotbar_selected.png b/mods/default/textures/gui_hotbar_selected.png new file mode 100644 index 0000000..7203e9a Binary files /dev/null and b/mods/default/textures/gui_hotbar_selected.png differ diff --git a/mods/default/textures/heart.png b/mods/default/textures/heart.png index 6d4e228..4412cab 100644 Binary files a/mods/default/textures/heart.png and b/mods/default/textures/heart.png differ diff --git a/mods/default/tools.lua b/mods/default/tools.lua index d792d14..e3c974c 100644 --- a/mods/default/tools.lua +++ b/mods/default/tools.lua @@ -402,6 +402,57 @@ minetest.register_tool("default:sword_diamond", { groups = {sword = 1} }) +-- +-- Register Craft Recipies +-- + +local craft_ingreds = { + wood = "group:wood", + stone = "group:stone", + steel = "default:steel_ingot", + bronze = "default:bronze_ingot", + mese = "default:mese_crystal", + diamond = "default:diamond" +} + +for name, mat in pairs(craft_ingreds) do + minetest.register_craft({ + output = "default:pick_".. name, + recipe = { + {mat, mat, mat}, + {"", "group:stick", ""}, + {"", "group:stick", ""} + } + }) + + minetest.register_craft({ + output = "default:shovel_".. name, + recipe = { + {mat}, + {"group:stick"}, + {"group:stick"} + } + }) + + minetest.register_craft({ + output = "default:axe_".. name, + recipe = { + {mat, mat}, + {mat, "group:stick"}, + {"", "group:stick"} + } + }) + + minetest.register_craft({ + output = "default:sword_".. name, + recipe = { + {mat}, + {mat}, + {"group:stick"} + } + }) +end + minetest.register_tool("default:key", { description = S("Key"), inventory_image = "default_key.png", @@ -441,3 +492,27 @@ minetest.register_tool("default:key", { return nil end }) + +minetest.register_craft({ + type = "fuel", + recipe = "default:pick_wood", + burntime = 6, +}) + +minetest.register_craft({ + type = "fuel", + recipe = "default:shovel_wood", + burntime = 4, +}) + +minetest.register_craft({ + type = "fuel", + recipe = "default:axe_wood", + burntime = 6, +}) + +minetest.register_craft({ + type = "fuel", + recipe = "default:sword_wood", + burntime = 5, +}) diff --git a/mods/default/torch.lua b/mods/default/torch.lua index fcdc1fe..c06dee8 100644 --- a/mods/default/torch.lua +++ b/mods/default/torch.lua @@ -11,7 +11,8 @@ local function on_flood(pos, oldnode, newnode) nodedef.groups.igniter and nodedef.groups.igniter > 0) then minetest.sound_play( "default_cool_lava", - {pos = pos, max_hear_distance = 16, gain = 0.1} + {pos = pos, max_hear_distance = 16, gain = 0.1}, + true ) end -- Remove the torch node @@ -70,6 +71,7 @@ minetest.register_node("default:torch", { end, floodable = true, on_flood = on_flood, + on_rotate = false }) minetest.register_node("default:torch_wall", { @@ -93,6 +95,7 @@ minetest.register_node("default:torch_wall", { sounds = default.node_sound_wood_defaults(), floodable = true, on_flood = on_flood, + on_rotate = false }) minetest.register_node("default:torch_ceiling", { @@ -116,6 +119,7 @@ minetest.register_node("default:torch_ceiling", { sounds = default.node_sound_wood_defaults(), floodable = true, on_flood = on_flood, + on_rotate = false }) minetest.register_lbm({ @@ -134,3 +138,17 @@ minetest.register_lbm({ end end }) + +minetest.register_craft({ + output = "default:torch 4", + recipe = { + {"default:coal_lump"}, + {"group:stick"}, + } +}) + +minetest.register_craft({ + type = "fuel", + recipe = "default:torch", + burntime = 4, +}) diff --git a/mods/default/trees.lua b/mods/default/trees.lua index ad3e3f4..a850644 100644 --- a/mods/default/trees.lua +++ b/mods/default/trees.lua @@ -16,9 +16,7 @@ function default.can_grow(pos) if not node_under then return false end - local name_under = node_under.name - local is_soil = minetest.get_item_group(name_under, "soil") - if is_soil == 0 then + if minetest.get_item_group(node_under.name, "soil") == 0 then return false end local light_level = minetest.get_node_light(pos) diff --git a/mods/flowers/locale/flowers.id.tr b/mods/flowers/locale/flowers.id.tr new file mode 100644 index 0000000..730529b --- /dev/null +++ b/mods/flowers/locale/flowers.id.tr @@ -0,0 +1,12 @@ +# textdomain: flowers +Red Rose=Mawar Merah +Orange Tulip=Tulip Oranye +Yellow Dandelion=Dandelion Kuning +Green Chrysanthemum=Krisan Hijau +Blue Geranium=Geranium Biru +Viola=Viola +White Dandelion=Dandelion Putih +Black Tulip=Tulip Hitam +Red Mushroom=Jamur Merah +Brown Mushroom=Jamur Cokelat +Waterlily=Teratai diff --git a/mods/flowers/locale/flowers.ms.tr b/mods/flowers/locale/flowers.ms.tr new file mode 100644 index 0000000..4e846eb --- /dev/null +++ b/mods/flowers/locale/flowers.ms.tr @@ -0,0 +1,12 @@ +# textdomain: flowers +Red Rose=Ros Merah +Orange Tulip=Tulip Jingga +Yellow Dandelion=Dandelion Kuning +Green Chrysanthemum=Kekwa Hijau +Blue Geranium=Geranium Biru +Viola=Violet +White Dandelion=Dandelion Putih +Black Tulip=Tulip Hitam +Red Mushroom=Cendawan Merah +Brown Mushroom=Cendawan Perang +Waterlily=Teratai diff --git a/mods/flowers/locale/flowers.ru.tr b/mods/flowers/locale/flowers.ru.tr new file mode 100644 index 0000000..d861e2a --- /dev/null +++ b/mods/flowers/locale/flowers.ru.tr @@ -0,0 +1,12 @@ +# textdomain: flowers +Red Rose=Красная Роза +Orange Tulip=Оранжевый Тюльпан +Yellow Dandelion=Желтый Одуванчик +Green Chrysanthemum=Зелёная Хризантема +Blue Geranium=Синяя Герань +Viola=Фиалка +White Dandelion=Белый Одуванчик +Black Tulip=Черный Тюльпан +Red Mushroom=Мухомор +Brown Mushroom=Коричневый Гриб +Waterlily=Кувшинка diff --git a/mods/flowers/locale/flowers.se.tr b/mods/flowers/locale/flowers.se.tr new file mode 100644 index 0000000..1bee645 --- /dev/null +++ b/mods/flowers/locale/flowers.se.tr @@ -0,0 +1,12 @@ +# textdomain: flowers +Red Rose=Röd ros +Orange Tulip=Orange Tulpan +Yellow Dandelion=Gul Maskros +Green Chrysanthemum=Grön Krysantemum +Blue Geranium=Blå Geranium +Viola=Violett Viola +White Dandelion=Vit Maskros +Black Tulip=Svart Tulpan +Red Mushroom=Röd Svamp +Brown Mushroom=Brun Svamp +Waterlily=Näckros \ No newline at end of file diff --git a/mods/flowers/locale/flowers.zh_CN.tr b/mods/flowers/locale/flowers.zh_CN.tr new file mode 100644 index 0000000..3139dfb --- /dev/null +++ b/mods/flowers/locale/flowers.zh_CN.tr @@ -0,0 +1,12 @@ +# textdomain: flowers +Red Rose=红玫瑰 +Orange Tulip=橙郁金香 +Yellow Dandelion=黄蒲公英 +Green Chrysanthemum=绿菊花 +Blue Geranium=蓝天竺葵 +Viola=三色堇 +White Dandelion=白蒲公英 +Black Tulip=黑郁金香 +Red Mushroom=红蘑菇 +Brown Mushroom=棕蘑菇 +Waterlily=睡莲 diff --git a/mods/flowers/locale/flowers.zh_TW.tr b/mods/flowers/locale/flowers.zh_TW.tr new file mode 100644 index 0000000..a3a3ec5 --- /dev/null +++ b/mods/flowers/locale/flowers.zh_TW.tr @@ -0,0 +1,12 @@ +# textdomain: flowers +Red Rose=紅玫瑰 +Orange Tulip=橙鬱金香 +Yellow Dandelion=黃蒲公英 +Green Chrysanthemum=綠菊花 +Blue Geranium=藍天竺葵 +Viola=三色堇 +White Dandelion=白蒲公英 +Black Tulip=黑鬱金香 +Red Mushroom=紅蘑菇 +Brown Mushroom=棕蘑菇 +Waterlily=睡蓮 diff --git a/mods/flowers/mapgen.lua b/mods/flowers/mapgen.lua index 85e19b7..f282f50 100644 --- a/mods/flowers/mapgen.lua +++ b/mods/flowers/mapgen.lua @@ -100,7 +100,7 @@ local function register_flower(seed, flower_name) octaves = 3, persist = 0.6 }, - biomes = {"grassland", "deciduous_forest", "floatland_grassland"}, + biomes = {"grassland", "deciduous_forest"}, y_max = 31000, y_min = 1, decoration = "flowers:"..flower_name, @@ -121,8 +121,7 @@ local function register_mushroom(mushroom_name) octaves = 3, persist = 0.66 }, - biomes = {"deciduous_forest", "coniferous_forest", - "floatland_coniferous_forest"}, + biomes = {"deciduous_forest", "coniferous_forest"}, y_max = 31000, y_min = 1, decoration = "flowers:"..mushroom_name, diff --git a/mods/mobkit/init.lua b/mods/mobkit/init.lua index c636a40..afd048b 100644 --- a/mods/mobkit/init.lua +++ b/mods/mobkit/init.lua @@ -27,7 +27,7 @@ end mobkit.terminal_velocity = sqrt(2*-mobkit.gravity*20) -- 20 meter fall = dead mobkit.safe_velocity = sqrt(2*-mobkit.gravity*5) -- 5 m safe fall -local abr = minetest.get_mapgen_setting('active_block_range') +local abr = tonumber(minetest.get_mapgen_setting('active_block_range')) or 3 local neighbors ={ {x=1,z=0}, @@ -161,10 +161,13 @@ function mobkit.get_nodes_in_area(pos1,pos2,full) y=y+sy local pos = {x=x,y=y,z=z} - if full==true then - result[pos] = minetest.registered_nodes[minetest.get_node(pos).name] - else - result[minetest.registered_nodes[minetest.get_node(pos).name]] = true + local node = mobkit.nodeatpos(pos) + if node then + if full==true then + result[pos] = node + else + result[node] = true + end end cnt=cnt+1 @@ -441,6 +444,7 @@ function mobkit.make_sound(self, sound) param_table.gain = in_range(spec.gain) param_table.fade = in_range(spec.fade) param_table.pitch = in_range(spec.pitch) + return minetest.sound_play(spec.name, param_table) end return minetest.sound_play(spec, param_table) end @@ -892,6 +896,11 @@ function mobkit.actfunc(self, staticdata, dtime_s) end end + if self.textures==nil then + local prop_tex = self.object:get_properties().textures + if prop_tex then self.textures=prop_tex end + end + if not self.memory then -- this is the initial activation self.memory = {} @@ -904,7 +913,7 @@ function mobkit.actfunc(self, staticdata, dtime_s) end -- apply texture - if self.texture_no then + if self.textures and self.texture_no then local props = {} props.textures = {self.textures[self.texture_no]} self.object:set_properties(props) @@ -1288,8 +1297,13 @@ end function mobkit.hq_warn(self,prty,tgtobj) local timer=0 local tgttime = 0 + local init = true local func = function(self) if not mobkit.is_alive(tgtobj) then return true end + if init then + mobkit.animate(self,'stand') + init = false + end local pos = mobkit.get_stand_pos(self) local opos = tgtobj:get_pos() local dist = vector.distance(pos,opos) @@ -1478,7 +1492,7 @@ function mobkit.is_in_deep(target) local node2 = mobkit.nodeatpos(nodepos) nodepos.y=nodepos.y-2 local node3 = mobkit.nodeatpos(nodepos) - if node1 and node2 and node1.drawtype=='liquid' and (node2.drawtype=='liquid' or node3.drawtype=='liquid') then + if node1 and node2 and node3 and node1.drawtype=='liquid' and (node2.drawtype=='liquid' or node3.drawtype=='liquid') then return true end end diff --git a/mods/mobkit/mobkit_api.txt b/mods/mobkit/mobkit_api.txt index 7f8f95f..af2622d 100644 --- a/mods/mobkit/mobkit_api.txt +++ b/mods/mobkit/mobkit_api.txt @@ -8,8 +8,8 @@ Contents 1.2 Logic function 1.3 Processing diagram 1.4 Entity definition - 1.5 Exposed luaentity members - + 1.5 Exposed luaentity members + 2 Reference 2.1 Utility functions 2.2 Built in behaviors @@ -17,7 +17,7 @@ Contents 2.2.2 Low level behaviors 2.3 Constants and member variables ------------ +----------- 1. Concepts ----------- @@ -41,22 +41,22 @@ Queuing is covered by behavour defining conventions !!! To start using the api it's enough to learn defining mobs and writing brain functions !!! -1.1.1 Low level behavior functions +1.1.1 Low level behavior functions These are physical actions and interactions: steps, jumps, turns etc. here you'll set velocity, yaw, kick off animations and sounds. Low level behavior definition: function mobkit.lq_bhv1(self,[optional additional persistent parameters]) -- enclosing function - ... -- optional definitions of additional persistent variables + ... -- optional definitions of additional persistent variables local func=function(self) -- enclosed function, self is mandatory and the only allowed parameter - ... -- actual function definition, remember to return true eventually + ... -- actual function definition, remember to return true eventually end mobkit.queue_low(self,func) -- this will queue the behavior at the time of lq_bhv1 call end -1.1.2 High level behavior functions +1.1.2 High level behavior functions These are complex tasks like getting to a position, following other objects, hiding, patrolling an area etc. Their job is tracking changes in the environment and managing low level behavior queue accordingly. @@ -64,9 +64,9 @@ Their job is tracking changes in the environment and managing low level behavior High level behavior definition: function mobkit.hq_bhv1(self,priority,[optional additional persistent parameters]) -- enclosing function - ... -- optional definitions of additional persistent variables + ... -- optional definitions of additional persistent variables local func=function(self) -- enclosed function, self is mandatory and the only allowed parameter - ... -- actual function definition, remember to return true eventually + ... -- actual function definition, remember to return true eventually end mobkit.queue_high(self,func,priority) -- this will queue the behavior at the time of hq_bhv1 call end @@ -75,7 +75,7 @@ end 1.1.2.1 Priority Unlike low level behaviors which are executed in FIFO order, high level behaviors support prioritization. -This concept is essential for making sure the right behavior is active at the right time. +This concept is essential for making sure the right behavior is active at the right time. Prioritization is what makes it possible to interrupt a task in order to perform a more important one The currently executing behavior is always the first in the queue. @@ -87,37 +87,37 @@ Common idioms: hq_bhv1(self,prty): ... - hq_bhv2(self,prty) -- bhv1 kicks off bhv2 with equal priority - return true -- and ends, + hq_bhv2(self,prty) -- bhv1 kicks off bhv2 with equal priority + return true -- and ends, -- bhv2 becomes active on the next engine step. - + hq_bhv1(self,prty): ... - hq_bhv2(self,prty+1) -- bhv1 kicks off bhv2 with higher priority + hq_bhv2(self,prty+1) -- bhv1 kicks off bhv2 with higher priority -- bhv2 takes over and when it ends, bhv1 resumes. - + Particular prioritization scheme is to be designed by the user according to specific mod requirements. -1.2 Logic function +1.2 Logic function ------------------ -Every mob must have one. -Its job is managing high level behavior queue in response to events which are not intercepted by callbacks. +Every mob must have one. +Its job is managing high level behavior queue in response to events which are not intercepted by callbacks. Contrary to what the name suggests, these functions needn't necessarily be too complex thanks to their limited responsibilities. -Typical flow might look like this: +Typical flow might look like this: if mobkit.timer(self,1) then -- returns true approx every second local prty = mobkit.get_queue_priority(self) - + if prty < 20 if ... then hq_do_important_stuff(self,20) return end end - + if prty < 10 then if ... then hq_do_something_else(self,10) @@ -127,7 +127,7 @@ if mobkit.timer(self,1) then -- returns true approx every second return end end - + if mobkit.is_queue_empty_high(self) then hq_fool_around(self,0) end @@ -146,7 +146,7 @@ end | | | | -----|----------------- | | | V HL Queue | | -| | | 1 | 2 | 3 |... | | +| | | 1 | 2 | 3 |... | | | ----------------------- | | | | | -----|----------------- | @@ -158,50 +158,52 @@ end Order of execution during an engine step: First comes physics: gravity, buoyancy, friction etc., then the logic function is called. - After that, the first behavior on the high level queue, if exists, + After that, the first behavior on the high level queue, if exists, and the last, the first low level behavior if present. - + 1.4 Entity definition --------------------- minetest.register_entity("mod:name",{ - -- required minetest api props - - physical = true, - collide_with_objects = true, - collisionbox = {...}, - visual = "mesh", - mesh = "...", - textures = {...}, - - - -- required mobkit props - + -- required minetest api props + + initial_properties = { + physical = true, + collide_with_objects = true, + collisionbox = {...}, + visual = "mesh", + mesh = "...", + textures = {...}, + }, + + + -- required mobkit props + timeout = [num], -- entities are removed after this many seconds inactive -- 0 is never -- mobs having memory entries are not affected - + buoyancy = [num], -- (0,1) - portion of collisionbox submerged -- = 1 - controlled buoyancy (fish, submarine) -- > 1 - drowns -- < 0 - MC like water trampolining - + lung_capacity = [num], -- seconds max_hp = [num], - on_step = mobkit.stepfunc, - on_activate = mobkit.actfunc, + on_step = mobkit.stepfunc, + on_activate = mobkit.actfunc, get_staticdata = mobkit.statfunc, logic = [function user defined], -- older 'brainfunc' name works as well. - + -- optional mobkit props -- or used by built in behaviors - physics = [function user defined] -- optional, overrides built in physics + physics = [function user defined] -- optional, overrides built in physics animation = { [name]={range={x=[num],y=[num]},speed=[num],loop=[bool]}, -- single - + [name]={ -- variant, animations are chosen randomly. - {range={x=[num],y=[num]},speed=[num],loop=[bool]}, + {range={x=[num],y=[num]},speed=[num],loop=[bool]}, {range={x=[num],y=[num]},speed=[num],loop=[bool]}, ... } @@ -209,14 +211,14 @@ minetest.register_entity("mod:name",{ } sounds = { [name] = [string filename], --single, simple, - + [name] = { --single, more powerful. All fields but 'name' are optional name = [string filename], gain=[num or range], --range is a table of the format {left_bound, right_bound} fade=[num or range], pitch=[num or range], }, - + [name] = { --variant, sound is chosen randomly { name = [string filename], @@ -241,7 +243,7 @@ minetest.register_entity("mod:name",{ damage_groups={fleshy=[num]}}, -- and the tip of the murder weapon in nodes/meters armor_groups = {fleshy=[num]} }) - + 1.5 Exposed luaentity members Some frequently used entity fields to be accessed directly for convenience @@ -266,16 +268,16 @@ function mobkit.get_terrain_height(pos,steps) -- steps (optional) is how far from pos it gives up, expressed in nodes, default 3 -- Returns: -- surface height at pos, or nil if not found - -- liquid flag: true if found surface is covered with liquid - + -- liquid flag: true if found surface is covered with liquid + function mobkit.turn2yaw(self,tyaw,rate) -- gradually turns towards yaw -- self: luaentity -- tyaw: target yaw in radians -- rate: turn rate in rads/s --returns: true if facing tyaw; current yaw - -function mobkit.timer(self,s) + +function mobkit.timer(self,s) -- returns true approx every s seconds -- used to reduce execution of code that needn't necessarily be done on every engine step @@ -287,18 +289,18 @@ function mobkit.pos_shift(pos,vec) function mobkit.pos_translate2d(pos,yaw,dist) -- returns pos translated in the yaw direction by dist - -function mobkit.get_stand_pos(thing) + +function mobkit.get_stand_pos(thing) -- returns object pos projected onto the bottom collisionbox face -- thing can be luaentity or objectref. - + function mobkit.nodeatpos(pos) -- convenience function -- returns nodedef or nil if it's an ignore node function mobkit.get_node_pos(pos) - -- returns center of the node that pos is inside - + -- returns center of the node that pos is inside + function mobkit.get_nodes_in_area(pos1,pos2,[full]) -- in basic mode returns a table of unique nodes within area indexed by node -- in full=true mode returns a table of nodes indexed by pos @@ -307,7 +309,7 @@ function mobkit.get_nodes_in_area(pos1,pos2,[full]) function mobkit.isnear2d(p1,p2,thresh) -- returns true if pos p2 is within a square with center at pos p1 and radius thresh -- y components are ignored - + function mobkit.is_there_yet2d(pos,dir,dest) -- obj positon; facing vector; destination position -- returns true if a position dest is behind position pos according to facing vector dir -- (checks if dest is in the rear half plane as defined by pos and dir) @@ -315,31 +317,31 @@ function mobkit.is_there_yet2d(pos,dir,dest) -- obj positon; facing vector; dest function mobkit.isnear3d(p1,p2,thresh) -- returns true if pos p2 is within a cube with center at pos p1 and radius thresh - + function mobkit.dir_to_rot(v,rot) -- converts a 3d vector v to rotation like in set_rotation() object method -- rot (optional) is current object rotation - -function mobkit.rot_to_dir(rot) - -- converts minetest rotation vector (pitch,yaw,roll) to direction unit vector -function mobkit.is_alive(thing) +function mobkit.rot_to_dir(rot) + -- converts minetest rotation vector (pitch,yaw,roll) to direction unit vector + +function mobkit.is_alive(thing) -- non essential, checks if thing exists in the world and is alive -- makes an assumption that luaentities are considered dead when their hp < 100 -- thing can be luaentity or objectref. -- used for stored luaentities and objectrefs - + function mobkit.exists(thing) -- checks if thing exists in the world -- thing can be luaentity or objectref. -- used for stored luaentities and objectrefs - + function mobkit.hurt(luaent,dmg) -- decrease luaent.hp by dmg function mobkit.heal(luaent,dmg) -- increase luaent.hp by dmg - + function mobkit.get_spawn_pos_abr(dtime,intrvl,radius,chance,reduction) -- returns a potential spawn position at random intervals -- intrvl: avg spawn attempt interval for every player @@ -358,23 +360,23 @@ function mobkit.animate(self,anim) -- makes an entity play an animation of name anim, or does nothing if not defined -- anim is string, see entity definition -- does nothing if the same animation is already running - + function mobkit.make_sound(self,sound) -- sound is string, see entity definition -- makes an entity play sound, or does nothing if not defined --returns sound handle - + function mobkit.go_forward_horizontal(self,speed) -- sets an entity's horizontal velocity in yaw direction. Vertical velocity unaffected. - -function mobkit.drive_to_pos(self,tpos,speed,turn_rate,dist) + +function mobkit.drive_to_pos(self,tpos,speed,turn_rate,dist) -- moves in facing direction while gradually turning towards tpos, returns true if in dist distance from tpos -- tpos: target position -- speed: in m/s -- turn_rate: in rad/s -- dist: in m. - --- Memory functions. + +-- Memory functions. This represents mob long term memory Warning: Stuff in memory is serialized, never try to remember objectrefs or tables referencing them @@ -391,14 +393,14 @@ function mobkit.recall(self,key) function mobkit.queue_high(self,func,priority) -- only for use in behavior definitions, see 1.1.2 - + function mobkit.queue_low(self,func) -- only for use in behavior definitions, see 1.1.1 - - + + function mobkit.clear_queue_high(self) function mobkit.clear_queue_low(self) - + function mobkit.is_queue_empty_high(self) function mobkit.is_queue_empty_low(self) @@ -411,14 +413,14 @@ function mobkit.get_queue_priority(self) function mobkit.vitals(self) -- default drowning and fall damage, call it before hp check -function mobkit.get_nearby_player(self) +function mobkit.get_nearby_player(self) -- returns random player if nearby or nil -function mobkit.get_nearby_entity(self,name) +function mobkit.get_nearby_entity(self,name) -- returns random nearby entity of name or nil -function mobkit.get_closest_entity(self,name) +function mobkit.get_closest_entity(self,name) -- returns closest entity of name or nil - + -- Misc Neighbors structure represents a node's horizontal neighbors @@ -429,17 +431,17 @@ Neighbor #1 is offset {x=1,z=0}, subsequent numbers go clockwise function mobkit.dir2neighbor(dir) -- converts a 3d vector to neighbor number, y component ignored - -function mobkit.neighbor_shift(neighbor,shift) + +function mobkit.neighbor_shift(neighbor,shift) -- get another neighbor number relative to the given, shift: plus is clockwise, minus the opposite -- 1,1 = 2; 1,-2 = 7 - + 2.2 Built in behaviors function mobkit.goto_next_waypoint(self,tpos) -- this functions groups common operations making mobs move in a specific direction - -- not a behavior itself, but is used by some built in HL behaviors + -- not a behavior itself, but is used by some built in HL behaviors -- which use node by node movement algorithm 2.2.1 High Level Behaviors -- @@ -447,67 +449,67 @@ function mobkit.goto_next_waypoint(self,tpos) function mobkit.hq_roam(self,prty) -- slow random roaming -- never returns - + function mobkit.hq_follow(self,prty,tgtobj) - -- follow the tgtobj + -- follow the tgtobj -- returns if tgtobj becomes inactive - + function mobkit.hq_goto(self,prty,tpos) -- go to tpos position -- returns on arrival - + function mobkit.hq_runfrom(self,prty,tgtobj) -- run away from tgtobj object -- returns when tgtobj far enough - + function mobkit.hq_hunt(self,prty,tgtobj) -- follow tgtobj and when close enough, kick off hq_attack -- returns when tgtobj too far - + function mobkit.hq_warn(self,prty,tgtobj) -- when a tgtobj close by, turn towards them and make the 'warn' sound -- kick off hq_hunt if tgtobj too close or timer expired -- returns when tgtobj moves away - + function mobkit.hq_die(self) -- default death, rotate and remove() after set time - + function mobkit.hq_attack(self,prty,tgtobj) -- default attack, turns towards tgtobj and leaps -- returns when tgtobj out of range - -function mobkit.hq_liquid_recovery(self,prty) + +function mobkit.hq_liquid_recovery(self,prty) -- use when submerged in liquid, scan for nearest land -- if land is found within view_range, kick off hq_swimto -- otherwise die - + function mobkit.hq_swimto(self,prty,tpos) -- swim towards the position tpos, jump if necessary -- returns if standing firmly on dry land - + Aquatic behaviors: - + Macros: function aqua_radar_dumb(pos,yaw,range,reverse) -- assumes a mob will avoid shallows -- checks if a pos in front of a moving entity swimmable - -- otherwise returns new position - + -- otherwise returns new position + function mobkit.is_in_deep(target) -- checks if an object is in water at least 2 nodes deep - + Hq Behaviors: function mobkit.hq_aqua_roam(self,prty,speed) function mobkit.hq_aqua_attack(self,prty,tgtobj,speed) function mobkit.hq_aqua_turn(self,prty,tyaw,speed) -- used by both previous bhv - + 2.2.2 Low Level Behaviors -- function mobkit.lq_turn2pos(self,tpos) -- gradually turn towards tpos position -- returns when facing tpos - + function mobkit.lq_idle(self,duration) -- do nothing for duration seconds -- set 'stand' animation @@ -515,7 +517,7 @@ function mobkit.lq_idle(self,duration) function mobkit.lq_dumbwalk(self,dest,speed_factor) -- simply move towards dest -- set 'walk' animation - + function mobkit.lq_dumbjump(self,height) -- if standing on the ground, jump in the facing direction -- height is relative to feet level @@ -525,15 +527,15 @@ function mobkit.lq_freejump(self) -- unconditional jump in the facing direction -- useful e.g for getting out of water -- returns when the apex has been reached - + function mobkit.lq_jumpattack(self,height,target) -- jump towards the target, punch if a hit -- returns after punch or on the ground function mobkit.lq_fallover(self) - -- gradually rotates Z = 0 to pi/2 - - + -- gradually rotates Z = 0 to pi/2 + + 2.3 Constants and member variables -- mobkit.gravity = -9.8 @@ -542,4 +544,4 @@ mobkit.friction = 0.4 -- inert entities will slow down when in contact with the self.dtime -- for convenience, dtime as passed to currently executing on_step() self.isonground -- true if y velocity is 0 for at least two succesive steps -self.isinliquid -- true if feet submerged in liquid type=source +self.isinliquid -- true if feet submerged in liquid type=source diff --git a/mods/moretrees/.luacheckrc b/mods/moretrees/.luacheckrc index 2933f30..459b2e2 100644 --- a/mods/moretrees/.luacheckrc +++ b/mods/moretrees/.luacheckrc @@ -1,17 +1,30 @@ +std = "lua51+minetest" unused_args = false allow_defined_top = true +max_line_length = 999 +max_comment_line_length = 999 -read_globals = { - "DIR_DELIM", - "minetest", "core", - "dump", - "vector", "nodeupdate", - "VoxelManip", "VoxelArea", - "PseudoRandom", "ItemStack", - "intllib", - "default", - table = { fields = { "copy", "getn" } }, - "biome_lib", - "stairs", "stairsplus", +stds.minetest = { + read_globals = { + "minetest", + "vector", + "VoxelManip", + "VoxelArea", + "PseudoRandom", + "ItemStack", + "default", + table = { + fields = { + "copy", + }, + }, + "dump", + } } +read_globals = { + "biome_lib", + "stairsplus", + "stairs", + "doors", +} diff --git a/mods/moretrees/cocos_palm.lua b/mods/moretrees/cocos_palm.lua index 391819b..127f328 100644 --- a/mods/moretrees/cocos_palm.lua +++ b/mods/moretrees/cocos_palm.lua @@ -1,6 +1,6 @@ -local S = moretrees.intllib - -- © 2016, Rogier +-- Translation support +local S = minetest.get_translator("moretrees") -- Some constants @@ -23,7 +23,11 @@ end ftrunk.drop = "moretrees:palm_trunk" gftrunk.drop = "moretrees:palm_trunk" ftrunk.after_destruct = function(pos, oldnode) - local coconuts = minetest.find_nodes_in_area({x=pos.x-1, y=pos.y, z=pos.z-1}, {x=pos.x+1, y=pos.y, z=pos.z+1}, {"group:moretrees_coconut"}) + local coconuts = minetest.find_nodes_in_area( + {x=pos.x-1, y=pos.y, z=pos.z-1}, + {x=pos.x+1, y=pos.y, z=pos.z+1}, + {"group:moretrees_coconut"} + ) for _,coconutpos in pairs(coconuts) do -- minetest.dig_node(coconutpos) does not cause nearby coconuts to be dropped :-( ... --minetest.dig_node(coconutpos) @@ -46,7 +50,11 @@ local coconut_regrow_abm_spec = { interval = moretrees.coconut_flower_interval, chance = moretrees.coconut_flower_chance, action = function(pos, node, active_object_count, active_object_count_wider) - local coconuts = minetest.find_nodes_in_area({x=pos.x-1, y=pos.y, z=pos.z-1}, {x=pos.x+1, y=pos.y, z=pos.z+1}, "group:moretrees_coconut") + local coconuts = minetest.find_nodes_in_area( + {x=pos.x-1, y=pos.y, z=pos.z-1}, + {x=pos.x+1, y=pos.y, z=pos.z+1}, + "group:moretrees_coconut" + ) -- Expected growth interval increases exponentially with number of coconuts already hanging. -- Also: if more coconuts are hanging, the chance of picking an empty spot decreases as well... if math.random(2^#coconuts) <= 2 then @@ -76,15 +84,18 @@ minetest.register_abm({ chance = 1, action = function(pos, node, active_object_count, active_object_count_wider) minetest.swap_node(pos, {name="moretrees:palm_fruit_trunk"}) - local poslist = minetest.find_nodes_in_area({x=pos.x-1, y=pos.y, z=pos.z-1}, {x=pos.x+1, y=pos.y, z=pos.z+1}, "air") + local poslist = minetest.find_nodes_in_area( + {x=pos.x-1, y=pos.y, z=pos.z-1}, + {x=pos.x+1, y=pos.y, z=pos.z+1}, + "air" + ) local genlist = {} for k,v in pairs(poslist) do genlist[k] = {x = math.random(100), pos = v} end table.sort(genlist, function(a, b) return a.x < b.x; end) - local gen local count = 0 - for _,gen in pairs(genlist) do + for _, gen in pairs(genlist) do minetest.swap_node(gen.pos, {name = "moretrees:coconut_3"}) count = count + 1 if count == 4 then @@ -109,7 +120,8 @@ local coconut_growfn = function(pos, elapsed) -- Drop coconuts (i.e. remove them), so that new coconuts can grow. -- Coconuts will drop as items with a small chance if math.random(coconut_drop_ichance) == 1 then - if moretrees.coconut_item_drop_ichance > 0 and math.random(moretrees.coconut_item_drop_ichance) == 1 then + if moretrees.coconut_item_drop_ichance > 0 + and math.random(moretrees.coconut_item_drop_ichance) == 1 then local items = minetest.get_node_drops(minetest.get_node(pos).name) for _, itemname in pairs(items) do minetest.add_item(pos, itemname) @@ -190,55 +202,95 @@ if moretrees.coconuts_convert_existing_palms then local leaves local coconuts -- One regular trunk must be adjacent to the coconut - trunks = minetest.find_nodes_in_area({x=pos.x-1, y=pos.y, z=pos.z-1}, {x=pos.x+1, y=pos.y, z=pos.z+1}, "moretrees:palm_trunk") + trunks = minetest.find_nodes_in_area( + {x=pos.x-1, y=pos.y, z=pos.z-1}, + {x=pos.x+1, y=pos.y, z=pos.z+1}, + "moretrees:palm_trunk" + ) if #trunks ~= 1 then return end local tpos = trunks[1] -- 1 or 2 other trunks must be one level below to the trunk being converted. - trunks = minetest.find_nodes_in_area({x=tpos.x-1, y=tpos.y-1, z=tpos.z-1}, {x=tpos.x+1, y=tpos.y-1, z=tpos.z+1}, "moretrees:palm_trunk") + trunks = minetest.find_nodes_in_area( + {x=tpos.x-1, y=tpos.y-1, z=tpos.z-1}, + {x=tpos.x+1, y=tpos.y-1, z=tpos.z+1}, + "moretrees:palm_trunk" + ) if #trunks < 1 or #trunks > 2 then return end -- 1 or 2 other trunks must be two levels below to the trunk being converted. - trunks = minetest.find_nodes_in_area({x=tpos.x-1, y=tpos.y-2, z=tpos.z-1}, {x=tpos.x+1, y=tpos.y-2, z=tpos.z+1}, "moretrees:palm_trunk") + trunks = minetest.find_nodes_in_area( + {x=tpos.x-1, y=tpos.y-2, z=tpos.z-1}, + {x=tpos.x+1, y=tpos.y-2, z=tpos.z+1}, + "moretrees:palm_trunk" + ) if #trunks < 1 or #trunks > 2 then return end -- 1 or 2 trunks must at the level of the trunk being converted. - cvtrunks = minetest.find_nodes_in_area({x=tpos.x-1, y=tpos.y, z=tpos.z-1}, {x=tpos.x+1, y=tpos.y, z=tpos.z+1}, "moretrees:palm_trunk") + cvtrunks = minetest.find_nodes_in_area( + {x=tpos.x-1, y=tpos.y, z=tpos.z-1}, + {x=tpos.x+1, y=tpos.y, z=tpos.z+1}, + "moretrees:palm_trunk" + ) if #cvtrunks < 1 or #cvtrunks > 2 then return end -- No trunks may be one level above the trunk being converted. - trunks = minetest.find_nodes_in_area({x=tpos.x-1, y=tpos.y+1, z=tpos.z-1}, {x=tpos.x+1, y=tpos.y+1, z=tpos.z+1}, "moretrees:palm_trunk") + trunks = minetest.find_nodes_in_area( + {x=tpos.x-1, y=tpos.y+1, z=tpos.z-1}, + {x=tpos.x+1, y=tpos.y+1, z=tpos.z+1}, + "moretrees:palm_trunk" + ) if #trunks ~= 0 then return end -- Leaves must be one level above the trunk being converted. - leaves = minetest.find_nodes_in_area({x=tpos.x-1, y=tpos.y+1, z=tpos.z-1}, {x=tpos.x+1, y=tpos.y+1, z=tpos.z+1}, "moretrees:palm_leaves") + leaves = minetest.find_nodes_in_area( + {x=tpos.x-1, y=tpos.y+1, z=tpos.z-1}, + {x=tpos.x+1, y=tpos.y+1, z=tpos.z+1}, + "moretrees:palm_leaves" + ) if #leaves == 0 then return end -- Leaves must be two levels above the trunk being converted. - leaves = minetest.find_nodes_in_area({x=tpos.x-1, y=tpos.y+2, z=tpos.z-1}, {x=tpos.x+1, y=tpos.y+2, z=tpos.z+1}, "moretrees:palm_leaves") + leaves = minetest.find_nodes_in_area( + {x=tpos.x-1, y=tpos.y+2, z=tpos.z-1}, + {x=tpos.x+1, y=tpos.y+2, z=tpos.z+1}, + "moretrees:palm_leaves" + ) if #leaves == 0 then return end -- No cocos fruit trunk may already be adjacent to the coconut - trunks = minetest.find_nodes_in_area({x=pos.x-1, y=pos.y, z=pos.z-1}, {x=pos.x+1, y=pos.y, z=pos.z+1}, "moretrees:palm_fruit_trunk") + trunks = minetest.find_nodes_in_area( + {x=pos.x-1, y=pos.y, z=pos.z-1}, + {x=pos.x+1, y=pos.y, z=pos.z+1}, + "moretrees:palm_fruit_trunk" + ) if #trunks ~= 0 then return end -- No cocos fruit trunk may be adjacent to or below the trunk being converted. - trunks = minetest.find_nodes_in_area({x=tpos.x-1, y=tpos.y-2, z=tpos.z-1}, {x=tpos.x+1, y=tpos.y, z=tpos.z+1}, "moretrees:palm_fruit_trunk") + trunks = minetest.find_nodes_in_area( + {x=tpos.x-1, y=tpos.y-2, z=tpos.z-1}, + {x=tpos.x+1, y=tpos.y, z=tpos.z+1}, + "moretrees:palm_fruit_trunk" + ) if #trunks ~= 0 then return end -- Convert trunk and all coconuts nearby. Maybe convert 2 trunks, just in case... - for _, tpos in pairs(cvtrunks) do - minetest.swap_node(tpos, {name = "moretrees:palm_fruit_trunk"}) - coconuts = minetest.find_nodes_in_area({x=tpos.x-1, y=tpos.y, z=tpos.z-1}, {x=tpos.x+1, y=tpos.y, z=tpos.z+1}, "moretrees:coconut") + for _, tpos_1 in pairs(cvtrunks) do + minetest.swap_node(tpos_1, {name = "moretrees:palm_fruit_trunk"}) + coconuts = minetest.find_nodes_in_area( + {x=tpos_1.x-1, y=tpos_1.y, z=tpos_1.z-1}, + {x=tpos_1.x+1, y=tpos_1.y, z=tpos_1.z+1}, + "moretrees:coconut" + ) for _, coconutpos in pairs(coconuts) do minetest.swap_node(coconutpos, {name = "moretrees:coconut_3"}) end diff --git a/mods/moretrees/crafts.lua b/mods/moretrees/crafts.lua index 9d1fe79..360f984 100644 --- a/mods/moretrees/crafts.lua +++ b/mods/moretrees/crafts.lua @@ -1,4 +1,4 @@ -local S = moretrees.intllib +local S = minetest.get_translator("moretrees") for i in ipairs(moretrees.treelist) do local treename = moretrees.treelist[i][1] @@ -38,7 +38,8 @@ minetest.register_craftitem("moretrees:coconut_milk", { description = S("Coconut Milk"), inventory_image = "moretrees_coconut_milk_inv.png", wield_image = "moretrees_coconut_milk.png", - on_use = minetest.item_eat(2), + on_use = minetest.item_eat(2, "vessels:drinking_glass"), + groups = {vessel = 1}, }) minetest.register_craftitem("moretrees:raw_coconut", { @@ -117,11 +118,63 @@ for i in ipairs(moretrees.cutting_tools) do }, replacements = { { "moretrees:coconut", "moretrees:raw_coconut" }, - { tool, tool } } }) end +-- give tool back with wear preserved +minetest.register_on_craft(function(itemstack, player, old_craft_grid, craft_inv) + if (itemstack:get_name() == "moretrees:coconut_milk") then + for i, j in pairs(old_craft_grid) do + -- find tool used to do the craft + local ocg_name = j:get_name() + if ((ocg_name ~= "") and (ocg_name ~= "moretrees:coconut") and (ocg_name ~= "vessels:drinking_glass")) then + -- abort if using cutting board + if minetest.get_item_group(ocg_name, "food_cutting_board") == 1 then + return + end + -- create a new tool and set wear + local t = ItemStack(ocg_name) + local w = j:get_wear() + -- works if tool used is an axe + local uses = j:get_tool_capabilities().groupcaps.choppy.uses or 0 + if (w == 0 and uses ~= 0) then + -- tool has never been used + -- use tool once + t:set_wear(65535/(9*(uses - 1))) + else + -- set wear back + t:set_wear(w) + -- use tool once + if (uses ~= 0) then + t:add_wear(65535/(9*(uses - 1))) + end + end + -- add to craft inventory + craft_inv:add_item("craft", t) + end + end + end +end) + +-- coconut milk using food_cutting_board from farming redo +if minetest.registered_items["farming:cutting_board"] then + minetest.register_craft({ + type = "shapeless", + output = "moretrees:coconut_milk", + recipe = { + "moretrees:coconut", + "vessels:drinking_glass", + "group:food_cutting_board", + }, + replacements = { + { "moretrees:coconut", "moretrees:raw_coconut" }, + { "group:food_cutting_board", "farming:cutting_board" }, + } + }) +end + + minetest.register_craft({ type = "shapeless", output = "moretrees:date_nut_snack", diff --git a/mods/moretrees/date_palm.lua b/mods/moretrees/date_palm.lua index be694a9..33cd646 100644 --- a/mods/moretrees/date_palm.lua +++ b/mods/moretrees/date_palm.lua @@ -11,7 +11,7 @@ -- © 2016, Rogier -local S = moretrees.intllib +local S = minetest.get_translator("moretrees") -- Some constants @@ -44,7 +44,11 @@ for k,v in pairs(trunk.tiles) do end ftrunk.drop = "moretrees:date_palm_trunk" ftrunk.after_destruct = function(pos, oldnode) - local dates = minetest.find_nodes_in_area({x=pos.x-2, y=pos.y, z=pos.z-2}, {x=pos.x+2, y=pos.y, z=pos.z+2}, {"group:moretrees_dates"}) + local dates = minetest.find_nodes_in_area( + {x=pos.x-2, y=pos.y, z=pos.z-2}, + {x=pos.x+2, y=pos.y, z=pos.z+2}, + {"group:moretrees_dates"} + ) for _,datespos in pairs(dates) do -- minetest.dig_node(datespos) does not cause nearby dates to be dropped :-( ... local items = minetest.get_node_drops(minetest.get_node(datespos).name) @@ -120,8 +124,11 @@ minetest.register_abm({ type = "m" minetest.swap_node(pos, {name="moretrees:date_palm_mfruit_trunk"}) end - local dates1 = minetest.find_nodes_in_area({x=pos.x-1, y=pos.y, z=pos.z-1}, {x=pos.x+1, y=pos.y, z=pos.z+1}, "air") - local genpos + local dates1 = minetest.find_nodes_in_area( + {x=pos.x-1, y=pos.y, z=pos.z-1}, + {x=pos.x+1, y=pos.y, z=pos.z+1}, + "air" + ) for _,genpos in pairs(dates1) do if math.random(100) <= 20 then if type == "m" then @@ -131,7 +138,11 @@ minetest.register_abm({ end end end - local dates2 = minetest.find_nodes_in_area({x=pos.x-2, y=pos.y, z=pos.z-2}, {x=pos.x+2, y=pos.y, z=pos.z+2}, "air") + local dates2 = minetest.find_nodes_in_area( + {x=pos.x-2, y=pos.y, z=pos.z-2}, + {x=pos.x+2, y=pos.y, z=pos.z+2}, + "air" + ) for _,genpos in pairs(dates2) do if math.random(100) <= 5 then if type == "m" then @@ -195,7 +206,7 @@ local function find_fruit_trunks_near(ftpos, sect) local r = moretrees.dates_pollination_distance + 2 * math.sqrt(2) local sect_hr = math.floor(r / 3 + 0.9999) local sect_vr = math.floor(r / 2 + 0.9999) - local t0us = core.get_us_time() + local t0us = minetest.get_us_time() local t0s = os.time() -- Compute elapsed time since last search. @@ -266,7 +277,7 @@ local function find_fruit_trunks_near(ftpos, sect) end -- Update search statistics - local t1us = core.get_us_time() + local t1us = minetest.get_us_time() if t1us < t0us then -- Wraparound. Assume the search lasted less than 2^32 microseconds (~71 min) -- (so no need to apply another correction) @@ -306,7 +317,7 @@ minetest.register_chatcommand("dates_stats", { params = "|chat|log|reset", privs = { server = true }, func = function(name, param) - param = string.lower(string.trim(param)) + param = string.lower(param:gsub("%s+", "")) if param == "" or param == "chat" then return dates_print_search_stats(false) elseif param == "log" then @@ -526,7 +537,6 @@ end local dates_growfn = function(pos, elapsed) local node = minetest.get_node(pos) local delay = moretrees.dates_grow_interval - local r = moretrees.dates_pollination_distance local action if not node then return @@ -594,15 +604,16 @@ local dates_growfn = function(pos, elapsed) return action end +--[[ -- Alternate growth function for dates. -- It calls the primary growth function, but also measures CPU time consumed. -- Use this function to analyze date growing performance. local stat = {} stat.count = 0 local dates_growfn_profiling = function(pos, elapsed) - local t0 = core.get_us_time() + local t0 = minetest.get_us_time() local action = dates_growfn(pos, elapsed) - local t1 = core.get_us_time() + local t1 = minetest.get_us_time() if t1 < t0 then t1 = t1 + 2^32 end @@ -656,6 +667,7 @@ local dates_growfn_profiling = function(pos, elapsed) "TOTAL", count, sum/count)) end end +--]] -- Register dates diff --git a/mods/moretrees/depends.txt b/mods/moretrees/depends.txt deleted file mode 100644 index 1636685..0000000 --- a/mods/moretrees/depends.txt +++ /dev/null @@ -1,9 +0,0 @@ -default -biome_lib -vessels -doors? -stairs? -moreblocks? -intllib? -farming? - diff --git a/mods/moretrees/description.txt b/mods/moretrees/description.txt deleted file mode 100644 index 7c86723..0000000 --- a/mods/moretrees/description.txt +++ /dev/null @@ -1 +0,0 @@ -This mod adds a whole bunch of new types of trees to the game diff --git a/mods/moretrees/init.lua b/mods/moretrees/init.lua index 176f2bd..9196852 100644 --- a/mods/moretrees/init.lua +++ b/mods/moretrees/init.lua @@ -62,14 +62,6 @@ if io.open(worldpath.."/moretrees_settings.txt","r") then dofile(worldpath.."/moretrees_settings.txt") end --- Boilerplate to support localized strings if intllib mod is installed. -local S -if minetest.get_modpath("intllib") then - S = intllib.Getter() -else - S = function(s) return s end -end -moretrees.intllib = S -- infinite stacks checking @@ -334,4 +326,4 @@ function moretrees.grow_fir_snow(pos) minetest.spawn_tree(pos,moretrees.fir_model) end -print(S("[Moretrees] Loaded (2013-02-11)")) +print("[Moretrees] Loaded (2013-02-11)") diff --git a/mods/moretrees/locale/de.txt b/mods/moretrees/locale/de.txt deleted file mode 100644 index cab8d6f..0000000 --- a/mods/moretrees/locale/de.txt +++ /dev/null @@ -1,73 +0,0 @@ -# Translation by Xanthin - -### crafts.lua ### -Coconut Milk = Kokosnussmilch -Raw Coconut = Kokosnussfleisch -Acorn Muffin batter = Eichelmuffinteig -Acorn Muffin = Eichelmuffin -Roasted Spruce Cone Nuts = Geroestete Fichtenzapfen -Roasted Pine Cone Nuts = Geroestete Kiefernzapfen -Roasted Fir Cone Nuts = Geroestete Tannenzapfen - -### node_defs.lua ### -Beech Tree Trunk = Buchenstamm -Apple Tree Trunk = Apfelbaumstamm -Oak Tree Trunk = Eichenstamm -Giant Sequoia Trunk = Riesenmammutbaumstamm -Birch Tree Trunk = Birkenstamm -Palm Tree Trunk = Palmenstamm -Spruce Tree Trunk = Fichtenstamm -Pine Tree Trunk = Kiefernstamm -Willow Tree Trunk = Weidenstamm -Rubber Tree Trunk = Gummibaumstamm -Jungle Tree Trunk = Tropenbaumstamm -Douglas Fir Trunk = Douglasienstamm -Beech Tree Planks = Buchebretter -Apple Tree Planks = Apfelbaumbretter -Oak Tree Planks = Eichenbretter -Giant Sequoia Planks = Riesenmammutbaumbretter -Birch Tree Planks = Birkebretter -Palm Tree Planks = Palmenbretter -Spruce Tree Planks = Fichtenbretter -Pine Tree Planks = Kiefernbretter -Willow Tree Planks = Weidenbretter -Rubber Tree Planks = Gummibaumbretter -Jungle Tree Planks = Tropenholzbretter -Douglas Fir Planks = Douglasienbretter -Beech Tree Sapling = Buchesetzling -Apple Tree Sapling = Apfelbaumsetzling -Oak Tree Sapling = Eichensetzling -Giant Sequoia Sapling = Riesenmammutbaumsetzling -Birch Tree Sapling = Birkensetzling -Palm Tree Sapling = Palmensetzling -Spruce Tree Sapling = Fichtensetzling -Pine Tree Sapling = Kiefernsetzling -Willow Tree Sapling = Weidensetzling -Rubber Tree Sapling = Gummibaumsetzling -Jungle Tree Sapling = Tropenbaumsetzling -Douglas Fir Sapling = Douglasiensetzling -Beech Tree Leaves = Buchenlaub -Apple Tree Leaves = Apfelbaumlaub -Oak Tree Leaves = Eichenlaub -Giant Sequoia Leaves = Riesenmammutbaumlaub -Birch Tree Leaves = Birkenlaub -Palm Tree Leaves = Palmenlaub -Spruce Tree Leaves = Fichtennadeln -Pine Tree Leaves = Kiefernnadeln -Willow Tree Leaves = Weidenlaub -Rubber Tree Leaves = Gummibaumlaub -Jungle Tree Leaves = Tropenbaumlaub -Douglas Fir Leaves = Douglasiennadeln - -Acorn = Eichel -Coconut = Kokosnuss -Spruce Cone = Fichtenzapfen -Pine Cone = Kiefernzapfen -Fir Cone = Tannenzapfen -Jungle Sapling = Tropenbaumsetzling -Jungle Tree Leaves (Yellow) = Tropenbaumlaub (gelb) -Jungle Tree Leaves (Red) = Tropenbaumlaub (rot) -Douglas Fir Leaves (Bright) = Douglasiennadeln (breit) -Rubber Tree Trunk (Empty) = Gummibaumstamm (leer) - -[Moretrees] Loaded (2013-02-11) = [Moretrees] geladen (2013-02-11) diff --git a/mods/moretrees/locale/es.txt b/mods/moretrees/locale/es.txt deleted file mode 100644 index 510fa3f..0000000 --- a/mods/moretrees/locale/es.txt +++ /dev/null @@ -1,100 +0,0 @@ -# Traducido por Carlos Barraza - -### crafts.lua ### -Coconut Milk = Leche de Coco -Raw Coconut = Coco crudo -Acorn Muffin batter = Masa de Mollete de Bellota -Acorn Muffin = Mollete de Bellota -Roasted Spruce Cone Nuts = Cono de Picea Tostado -Roasted Pine Cone Nuts = Cono de Pino Tostado -Roasted Fir Cone Nuts = Cono de Abeto Tostado -Roasted Cedar Cone Nuts = Coco de Alamo Tostado -Date = Datilera -Date & nut snack = Datilera y Nueces -Date-nut cake batter = Pasta de torta de Datilera -Date-nut cake = Pastel de Datilera -Date-nut energy bar = Barra energetica de Datilera - -### date_palm.lua ### -Dates = Datilera -Date Stem = Tallo de Datilera -Date Flowers = Flores de Datilera - -### node_defs.lua ### -Beech Tree Trunk = Tronco de Arbol de Haya -Apple Tree Trunk = Tronco de Arbol de Manzana -Oak Tree Trunk = Tronco de Arbol de Roble -Giant Sequoia Trunk = Tronco de Sequoia Gigante -Birch Tree Trunk = Tronco de Arbol de Abedul -Palm Tree Trunk = Tronco de Palmera -Spruce Tree Trunk = Tronco de Arbol de Abeto -Willow Tree Trunk = Tronco de Arbol de Sauce -Rubber Tree Trunk = Tronco de Arbol de Arbol de Goma -Jungle Tree = Tronco de Arbol de Arbol de la Selva -Douglas Fir Trunk = Tronco de Arbol de Abeto de Douglas -Cedar Tree Trunk = Tronco de Arbol de Cedro -Date Palm Tree Trunk = Tronco de Palmera Datilera -Acacia Tree Trunk = Tronco de Arbol de Acacia -Poplar Tree Trunk = Tronco de Arbol de Alamo - -Beech Tree Planks = Madera de Arbol de Haya -Apple Tree Planks = Madera de Arbol de Manzana -Oak Tree Planks = Madera de Arbol de Roble -Giant Sequoia Planks = Madera de Sequoia Gigante -Birch Tree Planks = Madera de Arbol de Abedul -Palm Tree Planks = Madera de Palmera -Spruce Tree Planks = Madera de Arbol de Abeto -Willow Tree Planks = Madera de Arbol de Sauce -Rubber Tree Planks = Madera de Arbol de Arbol de Goma -Jungle Planks = Madera de Arbol de Arbol de la Selva -Douglas Fir Planks = Madera de Arbol de Abeto de Douglas -Cedar Tree Planks = Madera de Arbol de Cedro -Date Palm Tree Planks = Madera de Palmera Datilera -Acacia Tree Planks = Madera de Arbol de Acacia -Poplar Tree Planks = Madera de Arbol de Alamo - -Beech Tree Sapling = Retoño de Arbol de Haya -Apple Tree Sapling = Retoño de Arbol de Manzana -Oak Tree Sapling = Retoño de Arbol de Roble -Giant Sequoia Sapling = Retoño de Arbol de Sequoia Gigante -Birch Tree Sapling = Retoño de Arbol de Abedul -Palm Tree Sapling = Retoño de Palmera -Spruce Tree Sapling = Retoño de Arbol de Abeto -Willow Tree Sapling = Retoño de Arbol de Sauce -Rubber Tree Sapling = Retoño de Arbol de Arbol de Goma -Jungle Sapling = Retoño de Arbol de Arbol de la Selva -Douglas Fir Sapling = Retoño de Arbol de Abeto de Douglas -Cedar Tree Sapling = Retoño de Arbol de Cedro -Date Palm Tree Tree Sapling = Retoño de Palmera Datilera -Acacia Tree Sapling = Retoño de Arbol de Acacia -Poplar Tree Sapling = Retoño de Arbol de Alamo - -Beech Tree Leaves = Hojas de Arbol de Haya -Apple Tree Leaves = Hojas de Arbol de Manzana -Oak Tree Leaves = Hojas de Arbol de Roble -Giant Sequoia Leaves = Hojas de Sequoia Gigante -Birch Tree Leaves = Hojas de Arbol de Abedul -Palm Tree Leaves = Hojas de Palmera -Spruce Tree Leaves = Hojas de Arbol de Abeto -Willow Tree Leaves = Hojas de Arbol de Sauce -Rubber Tree Leaves = Hojas de Arbol de Arbol de Goma -Jungle Leaves = Hojas de Arbol de Arbol de la Selva -Douglas Fir Leaves = Hojas de Arbol de Abeto de Douglas -Cedar Tree Leaves = Hojas de Arbol de Cedro -Date Palm Tree Tree Leaves = Hojas de Palmera Datilera -Acacia Tree Leaves = Hojas de Arbol de Acacia -Poplar Tree Leaves = Hojas de Arbol de Alamo - -Acorn = Bellota -Coconut = Coco -Spruce Cone = Coco de Picea -Pine Cone = Coco de Pino -Fir Cone = Coco de Abeto -Cedar Cone = Coco de Alamo -Jungle Sapling = Retoño de Arbol de la Selva -Jungle Tree Leaves (Yellow) = Hojas de Arbol de la Selva (Amarilla) -Jungle Tree Leaves (Red) = Hojas de Arbol de la Selva (Roja) -Douglas Fir Leaves (Bright) = Hojas de Arbol de Abeto de Douglas (Brillante) -Rubber Tree Trunk (Empty) = Tronco de Arbol de Goma (Vacio) - -[Moretrees] Loaded (2013-02-11) = [Masarboles] Cargado diff --git a/mods/moretrees/locale/fr.txt b/mods/moretrees/locale/fr.txt deleted file mode 100644 index 12d856a..0000000 --- a/mods/moretrees/locale/fr.txt +++ /dev/null @@ -1,74 +0,0 @@ -# Traduction par Yoan31 -# - -### crafts.lua ### -Coconut Milk = Lait de Coco -Raw Coconut = Noix de Coco Crue -Acorn Muffin batter = Pate à Muffins au Gland -Acorn Muffin = Muffins au Gland -Roasted Spruce Cone Nuts = Noix de Cône de Sapin Roties -Roasted Pine Cone Nuts = Noix de Pomme de pin Roties -Roasted Fir Cone Nuts = Noix de Cône de Sapin Roties - -### node_defs.lua ### -Beech Tree Trunk = Tronc d'Arbre de Hêtre -Apple Tree Trunk = Tronc d'Arbre de Pommier -Oak Tree Trunk = Tronc d'Arbre de chêne -Giant Sequoia Trunk = Tronc d'Arbre de Séquoia Géant -Birch Tree Trunk = Tronc d'Arbre de bouleau -Palm Tree Trunk = Tronc d'Arbre de Palmier -Spruce Tree Trunk = Tronc d'Arbre d'Epicéa -Pine Tree Trunk = Tronc d'Arbre de Pin -Willow Tree Trunk = Tronc d'Arbre de Saule -Rubber Tree Trunk = Tronc d'Arbre a Caoutchouc -Jungle Tree Trunk = Tronc d'Arbre de la Jungle -Douglas Fir Trunk = Tronc de Sapin de Douglas -Beech Tree Planks = Planches de Hêtre -Apple Tree Planks = Planches de Pommier -Oak Tree Planks = Planches de Chêne -Giant Sequoia Planks = Planches de d'Arbre de Séquoia Géant -Birch Tree Planks = Planches d'Arbre de bouleau -Palm Tree Planks = Planches d'Arbre de Palmier -Spruce Tree Planks = Planches d'Arbre d'Epicéa -Pine Tree Planks = Planches d'Arbre de Pin -Willow Tree Planks = Planches d'Arbre de Saule -Rubber Tree Planks = Planches d'Arbre a Caoutchouc -Jungle Tree Planks = Planches d'Arbre de la Jungle -Douglas Fir Planks = Planches de Sapin de Douglas -Beech Tree Sapling = Pousse d'Arbre de Hêtre -Apple Tree Sapling = Pousse d'Arbre de Pommier -Oak Tree Sapling = Pousse d'Arbre de chêne -Giant Sequoia Sapling = Pousse d'Arbre de Séquoia Géant -Birch Tree Sapling = Pousse d'Arbre de bouleau -Palm Tree Sapling = Pousse d'Arbre de Palmier -Spruce Tree Sapling = Pousse d'Arbre d'Epicéa -Pine Tree Sapling = Pousse d'Arbre de Pin -Willow Tree Sapling = Pousse d'Arbre de Saule -Rubber Tree Sapling = Pousse d'Arbre a Caoutchouc -Jungle Tree Sapling = Pousse d'Arbre de la Jungle -Douglas Fir Sapling = Pousse de Sapin de Douglas -Beech Tree Leaves = Feuilles d'Arbre de Hêtre -Apple Tree Leaves = Feuilles d'Arbre de Pommier -Oak Tree Leaves = Feuilles d'Arbre de chêne -Giant Sequoia Leaves = Feuilles d'Arbre de Séquoia Géant -Birch Tree Leaves = Feuilles d'Arbre de bouleau -Palm Tree Leaves = Feuilles d'Arbre de Palmier -Spruce Tree Leaves = Feuilles d'Arbre d'Epicéa -Pine Tree Leaves = Feuilles d'Arbre de Pin -Willow Tree Leaves = Feuilles d'Arbre de Saule -Rubber Tree Leaves = Feuilles d'Arbre a Caoutchouc -Jungle Tree Leaves = Feuilles d'Arbre de la Jungle -Douglas Fir Leaves = Feuilles de Sapin de Douglas - -Acorn = Gland -Coconut = Noix de Coco -Spruce Cone = Cône de Sapin -Pine Cone = Pomme de Pin -Fir Cone = Pomme de Sapin -Jungle Sapling = Pousse d'Arbre de la Jungle -Jungle Tree Leaves (Yellow) = Feuille d'Arbre de la Jungle (Jaune) -Jungle Tree Leaves (Red) = Feuille d'Arbre de la Jungle (Rouge) -Douglas Fir Leaves (Bright) = Feuille de Sapin de Douglas (Brillant) -Rubber Tree Trunk (Empty) = Tronc d'Arbre en Caoutchouc (Vide) - -[Moretrees] Loaded (2013-02-11) = diff --git a/mods/moretrees/locale/moretrees.de.tr b/mods/moretrees/locale/moretrees.de.tr new file mode 100644 index 0000000..10980d6 --- /dev/null +++ b/mods/moretrees/locale/moretrees.de.tr @@ -0,0 +1,211 @@ +# textdomain: moretrees +# Translation by Xanthin + + +### cocos_palm.lua ### + +Coconut=Kokosnuss +Coconut Flower= + +### crafts.lua ### + +Acorn Muffin=Eichelmuffin +Acorn Muffin batter=Eichelmuffinteig +Coconut Milk=Kokosnussmilch +Date= +Date & nut snack= +Date-nut cake= +Date-nut cake batter= +Date-nut energy bar= +Raw Coconut=Kokosnussfleisch +Roasted Cedar Cone Nuts= +Roasted Fir Cone Nuts=Geroestete Tannenzapfen +Roasted Spruce Cone Nuts=Geroestete Fichtenzapfen + +### date_palm.lua ### + +Date Flowers= +Date Stem= +Dates= + +### node_defs.lua ### + +@1 (fast growth)= +Acorn=Eichel +Apple Tree= +Apple Tree Fence= +Apple Tree Fence Gate= +Apple Tree Fence Rail= +Apple Tree Leaves=Apfelbaumlaub +Apple Tree Planks=Apfelbaumbretter +Apple Tree Planks Slab= +Apple Tree Planks Stair= +Apple Tree Sapling=Apfelbaumsetzling +Apple Tree Trunk=Apfelbaumstamm +Apple Tree Trunk Slab= +Apple Tree Trunk Stair= +Beech Tree= +Beech Tree Fence= +Beech Tree Fence Gate= +Beech Tree Fence Rail= +Beech Tree Leaves=Buchenlaub +Beech Tree Planks=Buchebretter +Beech Tree Planks Slab= +Beech Tree Planks Stair= +Beech Tree Sapling=Buchesetzling +Beech Tree Trunk=Buchenstamm +Beech Tree Trunk Slab= +Beech Tree Trunk Stair= +Birch Tree= +Birch Tree Fence= +Birch Tree Fence Gate= +Birch Tree Fence Rail= +Birch Tree Leaves=Birkenlaub +Birch Tree Planks=Birkebretter +Birch Tree Planks Slab= +Birch Tree Planks Stair= +Birch Tree Sapling=Birkensetzling +Birch Tree Trunk=Birkenstamm +Birch Tree Trunk Slab= +Birch Tree Trunk Stair= +Cedar Cone= +Cedar Tree= +Cedar Tree Fence= +Cedar Tree Fence Gate= +Cedar Tree Fence Rail= +Cedar Tree Leaves= +Cedar Tree Planks= +Cedar Tree Planks Slab= +Cedar Tree Planks Stair= +Cedar Tree Sapling= +Cedar Tree Trunk= +Cedar Tree Trunk Slab= +Cedar Tree Trunk Stair= +Date Palm Tree= +Date Palm Tree Fence= +Date Palm Tree Fence Gate= +Date Palm Tree Fence Rail= +Date Palm Tree Leaves= +Date Palm Tree Planks= +Date Palm Tree Planks Slab= +Date Palm Tree Planks Stair= +Date Palm Tree Sapling= +Date Palm Tree Trunk= +Date Palm Tree Trunk Slab= +Date Palm Tree Trunk Stair= +Douglas Fir= +Douglas Fir Fence= +Douglas Fir Fence Gate= +Douglas Fir Fence Rail= +Douglas Fir Leaves=Douglasiennadeln +Douglas Fir Leaves (Bright)=Douglasiennadeln (breit) +Douglas Fir Planks=Douglasienbretter +Douglas Fir Planks Slab= +Douglas Fir Planks Stair= +Douglas Fir Sapling=Douglasiensetzling +Douglas Fir Trunk=Douglasienstamm +Douglas Fir Trunk Slab= +Douglas Fir Trunk Stair= +Fir Cone=Tannenzapfen +Giant Sequoia= +Giant Sequoia Fence= +Giant Sequoia Fence Gate= +Giant Sequoia Fence Rail= +Giant Sequoia Leaves=Riesenmammutbaumlaub +Giant Sequoia Planks=Riesenmammutbaumbretter +Giant Sequoia Planks Slab= +Giant Sequoia Planks Stair= +Giant Sequoia Sapling=Riesenmammutbaumsetzling +Giant Sequoia Trunk=Riesenmammutbaumstamm +Giant Sequoia Trunk Slab= +Giant Sequoia Trunk Stair= +Jungle Tree= +Jungle Tree Fence= +Jungle Tree Fence Gate= +Jungle Tree Fence Rail= +Jungle Tree Leaves=Tropenbaumlaub +Jungle Tree Leaves (@1)=Tropenbaumlaub (@1) +Jungle Tree Planks=Tropenholzbretter +Jungle Tree Planks Slab= +Jungle Tree Planks Stair= +Jungle Tree Sapling=Tropenbaumsetzling +Jungle Tree Trunk=Tropenbaumstamm +Jungle Tree Trunk Slab= +Jungle Tree Trunk Stair= +Oak Tree= +Oak Tree Fence= +Oak Tree Fence Gate= +Oak Tree Fence Rail= +Oak Tree Leaves=Eichenlaub +Oak Tree Planks=Eichenbretter +Oak Tree Planks Slab= +Oak Tree Planks Stair= +Oak Tree Sapling=Eichensetzling +Oak Tree Trunk=Eichenstamm +Oak Tree Trunk Slab= +Oak Tree Trunk Stair= +Palm Tree= +Palm Tree Fence= +Palm Tree Fence Gate= +Palm Tree Fence Rail= +Palm Tree Leaves=Palmenlaub +Palm Tree Planks=Palmenbretter +Palm Tree Planks Slab= +Palm Tree Planks Stair= +Palm Tree Sapling=Palmensetzling +Palm Tree Trunk=Palmenstamm +Palm Tree Trunk Slab= +Palm Tree Trunk Stair= +Poplar Tree= +Poplar Tree Fence= +Poplar Tree Fence Gate= +Poplar Tree Fence Rail= +Poplar Tree Leaves= +Poplar Tree Planks= +Poplar Tree Planks Slab= +Poplar Tree Planks Stair= +Poplar Tree Sapling= +Poplar Tree Trunk= +Poplar Tree Trunk Slab= +Poplar Tree Trunk Stair= +Red=rot +Rubber Tree= +Rubber Tree Fence= +Rubber Tree Fence Gate= +Rubber Tree Fence Rail= +Rubber Tree Leaves=Gummibaumlaub +Rubber Tree Planks=Gummibaumbretter +Rubber Tree Planks Slab= +Rubber Tree Planks Stair= +Rubber Tree Sapling=Gummibaumsetzling +Rubber Tree Trunk=Gummibaumstamm +Rubber Tree Trunk (Empty)=Gummibaumstamm (leer) +Rubber Tree Trunk Slab= +Rubber Tree Trunk Stair= +Small poplar Tree Sapling= +Spruce Cone=Fichtenzapfen +Spruce Tree= +Spruce Tree Fence= +Spruce Tree Fence Gate= +Spruce Tree Fence Rail= +Spruce Tree Leaves=Fichtennadeln +Spruce Tree Planks=Fichtenbretter +Spruce Tree Planks Slab= +Spruce Tree Planks Stair= +Spruce Tree Sapling=Fichtensetzling +Spruce Tree Trunk=Fichtenstamm +Spruce Tree Trunk Slab= +Spruce Tree Trunk Stair= +Willow Tree= +Willow Tree Fence= +Willow Tree Fence Gate= +Willow Tree Fence Rail= +Willow Tree Leaves=Weidenlaub +Willow Tree Planks=Weidenbretter +Willow Tree Planks Slab= +Willow Tree Planks Stair= +Willow Tree Sapling=Weidensetzling +Willow Tree Trunk=Weidenstamm +Willow Tree Trunk Slab= +Willow Tree Trunk Stair= +Yellow=gelb diff --git a/mods/moretrees/locale/moretrees.es.tr b/mods/moretrees/locale/moretrees.es.tr new file mode 100644 index 0000000..ccdb42a --- /dev/null +++ b/mods/moretrees/locale/moretrees.es.tr @@ -0,0 +1,211 @@ +# textdomain: moretrees +# Translation by Carlos Barraza + + +### cocos_palm.lua ### + +Coconut=Coco +Coconut Flower= + +### crafts.lua ### + +Acorn Muffin=Mollete de Bellota +Acorn Muffin batter= Masa de Mollete de Bellota +Coconut Milk=Leche de Coco +Date=Datilera +Date & nut snack=Datilera y Nueces +Date-nut cake=Pastel de Datilera +Date-nut cake batter=Pasta de torta de Datilera +Date-nut energy bar=Barra energetica de Datilera +Raw Coconut=Coco crudo +Roasted Cedar Cone Nuts=Coco de Alamo Tostado +Roasted Fir Cone Nuts=Cono de Abeto Tostado +Roasted Spruce Cone Nuts=Cono de Picea Tostado + +### date_palm.lua ### + +Date Flowers=Flores de Datilera +Date Stem=Tallo de Datilera +Dates=Datilera + +### node_defs.lua ### + +@1 (fast growth)= +Acorn=Bellota +Apple Tree= +Apple Tree Fence= +Apple Tree Fence Gate= +Apple Tree Fence Rail= +Apple Tree Leaves=Hojas de Arbol de Manzana +Apple Tree Planks=Madera de Arbol de Manzana +Apple Tree Planks Slab= +Apple Tree Planks Stair= +Apple Tree Sapling=Retoño de Arbol de Manzana +Apple Tree Trunk=Tronco de Arbol de Manzana +Apple Tree Trunk Slab= +Apple Tree Trunk Stair= +Beech Tree= +Beech Tree Fence= +Beech Tree Fence Gate= +Beech Tree Fence Rail= +Beech Tree Leaves=Hojas de Arbol de Haya +Beech Tree Planks=Madera de Arbol de Haya +Beech Tree Planks Slab= +Beech Tree Planks Stair= +Beech Tree Sapling=Retoño de Arbol de Haya +Beech Tree Trunk=Tronco de Arbol de Haya +Beech Tree Trunk Slab= +Beech Tree Trunk Stair= +Birch Tree= +Birch Tree Fence= +Birch Tree Fence Gate= +Birch Tree Fence Rail= +Birch Tree Leaves=Hojas de Arbol de Abedul +Birch Tree Planks=Madera de Arbol de Abedul +Birch Tree Planks Slab= +Birch Tree Planks Stair= +Birch Tree Sapling=Retoño de Arbol de Abedul +Birch Tree Trunk=Tronco de Arbol de Abedul +Birch Tree Trunk Slab= +Birch Tree Trunk Stair= +Cedar Cone=Coco de Alamo +Cedar Tree= +Cedar Tree Fence= +Cedar Tree Fence Gate= +Cedar Tree Fence Rail= +Cedar Tree Leaves=Hojas de Arbol de Cedro +Cedar Tree Planks=Madera de Arbol de Cedro +Cedar Tree Planks Slab= +Cedar Tree Planks Stair= +Cedar Tree Sapling=Retoño de Arbol de Cedro +Cedar Tree Trunk=Tronco de Arbol de Cedro +Cedar Tree Trunk Slab= +Cedar Tree Trunk Stair= +Date Palm Tree= +Date Palm Tree Fence= +Date Palm Tree Fence Gate= +Date Palm Tree Fence Rail= +Date Palm Tree Leaves= +Date Palm Tree Planks=Madera de Palmera Datilera +Date Palm Tree Planks Slab= +Date Palm Tree Planks Stair= +Date Palm Tree Sapling= +Date Palm Tree Trunk=Tronco de Palmera Datilera +Date Palm Tree Trunk Slab= +Date Palm Tree Trunk Stair= +Douglas Fir= +Douglas Fir Fence= +Douglas Fir Fence Gate= +Douglas Fir Fence Rail= +Douglas Fir Leaves=Hojas de Arbol de Abeto de Douglas +Douglas Fir Leaves (Bright)=Hojas de Arbol de Abeto de Douglas (Brillante) +Douglas Fir Planks=Madera de Arbol de Abeto de Douglas +Douglas Fir Planks Slab= +Douglas Fir Planks Stair= +Douglas Fir Sapling=Retoño de Arbol de Abeto de Douglas +Douglas Fir Trunk=Tronco de Arbol de Abeto de Douglas +Douglas Fir Trunk Slab= +Douglas Fir Trunk Stair= +Fir Cone=Coco de Abeto +Giant Sequoia= +Giant Sequoia Fence= +Giant Sequoia Fence Gate= +Giant Sequoia Fence Rail= +Giant Sequoia Leaves=Hojas de Sequoia Gigante +Giant Sequoia Planks=Madera de Sequoia Gigante +Giant Sequoia Planks Slab= +Giant Sequoia Planks Stair= +Giant Sequoia Sapling=Retoño de Arbol de Sequoia Gigante +Giant Sequoia Trunk=Tronco de Sequoia Gigante +Giant Sequoia Trunk Slab= +Giant Sequoia Trunk Stair= +Jungle Tree=Tronco de Arbol de Arbol de la Selva +Jungle Tree Fence= +Jungle Tree Fence Gate= +Jungle Tree Fence Rail= +Jungle Tree Leaves=Hojas de Arbol de la Selva +Jungle Tree Leaves (@1)=Hojas de Arbol de la Selva (@1) +Jungle Tree Planks= +Jungle Tree Planks Slab= +Jungle Tree Planks Stair= +Jungle Tree Sapling= +Jungle Tree Trunk= +Jungle Tree Trunk Slab= +Jungle Tree Trunk Stair= +Oak Tree= +Oak Tree Fence= +Oak Tree Fence Gate= +Oak Tree Fence Rail= +Oak Tree Leaves=Hojas de Arbol de Roble +Oak Tree Planks=Madera de Arbol de Roble +Oak Tree Planks Slab= +Oak Tree Planks Stair= +Oak Tree Sapling=Retoño de Arbol de Roble +Oak Tree Trunk=Tronco de Arbol de Roble +Oak Tree Trunk Slab= +Oak Tree Trunk Stair= +Palm Tree= +Palm Tree Fence= +Palm Tree Fence Gate= +Palm Tree Fence Rail= +Palm Tree Leaves=Hojas de Palmera +Palm Tree Planks=Madera de Palmera +Palm Tree Planks Slab= +Palm Tree Planks Stair= +Palm Tree Sapling=Retoño de Palmera +Palm Tree Trunk=Tronco de Palmera +Palm Tree Trunk Slab= +Palm Tree Trunk Stair= +Poplar Tree= +Poplar Tree Fence= +Poplar Tree Fence Gate= +Poplar Tree Fence Rail= +Poplar Tree Leaves=Hojas de Arbol de Alamo +Poplar Tree Planks=Madera de Arbol de Alamo +Poplar Tree Planks Slab= +Poplar Tree Planks Stair= +Poplar Tree Sapling=Retoño de Arbol de Alamo +Poplar Tree Trunk=Tronco de Arbol de Alamo +Poplar Tree Trunk Slab= +Poplar Tree Trunk Stair= +Red=Roja +Rubber Tree= +Rubber Tree Fence= +Rubber Tree Fence Gate= +Rubber Tree Fence Rail= +Rubber Tree Leaves=Hojas de Arbol de Arbol de Goma +Rubber Tree Planks=Madera de Arbol de Arbol de Goma +Rubber Tree Planks Slab= +Rubber Tree Planks Stair= +Rubber Tree Sapling=Retoño de Arbol de Arbol de Goma +Rubber Tree Trunk=Tronco de Arbol de Arbol de Goma +Rubber Tree Trunk (Empty)=Tronco de Arbol de Goma (Vacio) +Rubber Tree Trunk Slab= +Rubber Tree Trunk Stair= +Small poplar Tree Sapling= +Spruce Cone=Coco de Picea +Spruce Tree= +Spruce Tree Fence= +Spruce Tree Fence Gate= +Spruce Tree Fence Rail= +Spruce Tree Leaves=Hojas de Arbol de Abeto +Spruce Tree Planks=Madera de Arbol de Abeto +Spruce Tree Planks Slab= +Spruce Tree Planks Stair= +Spruce Tree Sapling=Retoño de Arbol de Abeto +Spruce Tree Trunk=Tronco de Arbol de Abeto +Spruce Tree Trunk Slab= +Spruce Tree Trunk Stair= +Willow Tree= +Willow Tree Fence= +Willow Tree Fence Gate= +Willow Tree Fence Rail= +Willow Tree Leaves=Hojas de Arbol de Sauce +Willow Tree Planks=Madera de Arbol de Sauce +Willow Tree Planks Slab= +Willow Tree Planks Stair= +Willow Tree Sapling=Retoño de Arbol de Sauce +Willow Tree Trunk=Tronco de Arbol de Sauce +Willow Tree Trunk Slab= +Willow Tree Trunk Stair= +Yellow=Amarilla diff --git a/mods/moretrees/locale/moretrees.fr.tr b/mods/moretrees/locale/moretrees.fr.tr new file mode 100644 index 0000000..09058f3 --- /dev/null +++ b/mods/moretrees/locale/moretrees.fr.tr @@ -0,0 +1,211 @@ +# textdomain: moretrees +# Translation by Yoan31 and Louis Royer + + +### cocos_palm.lua ### + +Coconut=Noix de coco +Coconut Flower=Fleur de coco + +### crafts.lua ### + +Acorn Muffin=Muffins au gland +Acorn Muffin batter=Pate à muffins au Gland +Coconut Milk=Lait de coco +Date=Datte +Date & nut snack=Collation aux dattes et aux noix +Date-nut cake=Gâteau datte-noix +Date-nut cake batter=Pâte à gâteau datte-noix +Date-nut energy bar=Barre énergétique datte-noix +Raw Coconut=Noix de coco crue +Roasted Cedar Cone Nuts=Noix de pomme de pin roties +Roasted Fir Cone Nuts=Noix de cône de sapin roties +Roasted Spruce Cone Nuts=Noix de cône de sapin roties + +### date_palm.lua ### + +Date Flowers=Fleurs de datte +Date Stem=Tige de datte +Dates=Dattes + +### node_defs.lua ### + +@1 (fast growth)=@1 (croissance rapide) +Acorn=Gland +Apple Tree=Pommier +Apple Tree Fence=Barrière en bois de pommier +Apple Tree Fence Gate=Porte de clôture en bois de pommier +Apple Tree Fence Rail=Clôture en bois de pommier +Apple Tree Leaves=Feuilles de pommier +Apple Tree Planks=Planches de pommier +Apple Tree Planks Slab=Dalle en bois de pommier +Apple Tree Planks Stair=Escaliers en bois de pommier +Apple Tree Sapling=Pousse d'arbre de pommier +Apple Tree Trunk=Tronc d'arbre de pommier +Apple Tree Trunk Slab=Dalle en tronc de pommier +Apple Tree Trunk Stair=Escalier en tronc de pommier +Beech Tree=Hêtre +Beech Tree Fence=Barrière en bois de hêtre +Beech Tree Fence Gate=Porte de clôture en bois de hêtre +Beech Tree Fence Rail=Clôture en bois de hêtre +Beech Tree Leaves=Feuilles de hêtre +Beech Tree Planks=Planches de hêtre +Beech Tree Planks Slab=Dalle en bois de hêtre +Beech Tree Planks Stair=Escalier en bois de hêtre +Beech Tree Sapling=Pousse d'arbre de hêtre +Beech Tree Trunk=Tronc d'arbre de hêtre +Beech Tree Trunk Slab=Dalle en tronc de hêtre +Beech Tree Trunk Stair=Escalier en tronc de hêtre +Birch Tree=Bouleau +Birch Tree Fence=Barrière en bois de bouleau +Birch Tree Fence Gate=Porte de clôture en bois de bouleau +Birch Tree Fence Rail=Clôture en bois de bouleau +Birch Tree Leaves=Feuilles de bouleau +Birch Tree Planks=Planches d'arbre de bouleau +Birch Tree Planks Slab=Dalle en bois de bouleau +Birch Tree Planks Stair=Escalier en bois de bouleau +Birch Tree Sapling=Pousse d'arbre de bouleau +Birch Tree Trunk=Tronc d'arbre de bouleau +Birch Tree Trunk Slab=Dalle en tronc de bouleau +Birch Tree Trunk Stair=Escalier en tronc de bouleau +Cedar Cone=Pomme de pin +Cedar Tree=Pin +Cedar Tree Fence=Barrière en bois de pin +Cedar Tree Fence Gate=Porte de clôture en bois de pin +Cedar Tree Fence Rail=Clôture en bois de pin +Cedar Tree Leaves=Feuilles de pin +Cedar Tree Planks=Planches d'arbre de pin +Cedar Tree Planks Slab=Dalle en bois de pin +Cedar Tree Planks Stair=Escalier en bois de pin +Cedar Tree Sapling=Pousse d'arbre de pin +Cedar Tree Trunk=Tronc d'arbre de pin +Cedar Tree Trunk Slab=Dalle en tronc de pin +Cedar Tree Trunk Stair=Escalier en tronc de pin +Date Palm Tree=Dattier +Date Palm Tree Fence=Barrière en bois de dattier +Date Palm Tree Fence Gate=Porte de clôture en bois de dattier +Date Palm Tree Fence Rail=Clôture en bois de dattier +Date Palm Tree Leaves=Feuille de dattier +Date Palm Tree Planks=Planches de dattier +Date Palm Tree Planks Slab=Dalle en bois de dattier +Date Palm Tree Planks Stair=Escalier en bois de dattier +Date Palm Tree Sapling=Pousse de dattier +Date Palm Tree Trunk=Tronc de dattier +Date Palm Tree Trunk Slab=Dalle en tronc de dattier +Date Palm Tree Trunk Stair=Escalier en tronc de dattier +Douglas Fir=Sapin de Douglas +Douglas Fir Fence=Barrière en bois de sapin de Douglas +Douglas Fir Fence Gate=Porte de clôture en bois de sapin de Douglas +Douglas Fir Fence Rail=Clôture en bois de sapin de Douglas +Douglas Fir Leaves=Feuilles de sapin de Douglas +Douglas Fir Leaves (Bright)=Feuille de sapin de Douglas (brillant) +Douglas Fir Planks=Planches de sapin de Douglas +Douglas Fir Planks Slab=Dalle en bois de sapin de Douglas +Douglas Fir Planks Stair=Escalier en bois de sapin de Douglas +Douglas Fir Sapling=Pousse de sapin de Douglas +Douglas Fir Trunk=Tronc de sapin de Douglas +Douglas Fir Trunk Slab=Dalle en tronc de sapin de Douglas +Douglas Fir Trunk Stair=Escalier en tronc de sapin de Douglas +Fir Cone=Pomme de sapin +Giant Sequoia=Séquoia géant +Giant Sequoia Fence=Barrière en bois de séquoia géant +Giant Sequoia Fence Gate=Porte de clôture en bois de séquoia géant +Giant Sequoia Fence Rail=Clôture en bois de séquoia géant +Giant Sequoia Leaves=Feuilles de séquoia géant +Giant Sequoia Planks=Planches de séquoia géant +Giant Sequoia Planks Slab=Dalle en bois de séquoia géant +Giant Sequoia Planks Stair=Escalier en bois de séquoia géant +Giant Sequoia Sapling=Pousse de séquoia géant +Giant Sequoia Trunk=Tronc de séquoia géant +Giant Sequoia Trunk Slab=Dalle en tronc de séquoia géant +Giant Sequoia Trunk Stair=Escalier en tronc de séquoia géant +Jungle Tree=Arbre de la jungle +Jungle Tree Fence=Barrière en bois d'arbre de la jungle +Jungle Tree Fence Gate=Porte de clôture en bois d'arbre de la jungle +Jungle Tree Fence Rail=Clôture en bois d'arbre de la jungle +Jungle Tree Leaves=Feuilles d'arbre de la jungle +Jungle Tree Leaves (@1)=Feuilles d'arbre de la jungle (@1) +Jungle Tree Planks=Planches d'arbre de la jungle +Jungle Tree Planks Slab=Dalle en bois d'arbre de la jungle +Jungle Tree Planks Stair=Escalier en bois d'arbre de la jungle +Jungle Tree Sapling=Pousse d'arbre de la jungle +Jungle Tree Trunk=Tronc d'arbre de la jungle +Jungle Tree Trunk Slab=Dalle en tronc d'arbre de la jungle +Jungle Tree Trunk Stair=Escalier en tronc d'arbre de la jungle +Oak Tree=Chêne +Oak Tree Fence=Barrière en bois de chêne +Oak Tree Fence Gate=Porte de clôture en bois de chêne +Oak Tree Fence Rail=Clôture en bois de chêne +Oak Tree Leaves=Feuilles de chêne +Oak Tree Planks=Planches de chêne +Oak Tree Planks Slab=Dalle en bois de chêne +Oak Tree Planks Stair=Escalier en bois de chêne +Oak Tree Sapling=Pousse d'arbre de chêne +Oak Tree Trunk=Tronc d'arbre de chêne +Oak Tree Trunk Slab=Dalle en tronc de chêne +Oak Tree Trunk Stair=Escalier en tronc de chêne +Palm Tree=Palmier +Palm Tree Fence=Barrière en bois de palmier +Palm Tree Fence Gate=Porte de clôture en bois de palmier +Palm Tree Fence Rail=Clôture en bois de palmier +Palm Tree Leaves=Feuilles de palmier +Palm Tree Planks=Planches de palmier +Palm Tree Planks Slab=Dalle en bois de palmier +Palm Tree Planks Stair=Escalier en bois de palmier +Palm Tree Sapling=Pousse d'arbre de palmier +Palm Tree Trunk=Tronc d'arbre de palmier +Palm Tree Trunk Slab=Dalle en tronc de palmier +Palm Tree Trunk Stair=Escalier en tronc de palmier +Poplar Tree=Peuplier +Poplar Tree Fence=Barrière en bois de peuplier +Poplar Tree Fence Gate=Porte de clôture en bois de peuplier +Poplar Tree Fence Rail=Clôture en bois de peuplier +Poplar Tree Leaves=Feuilles de peuplier +Poplar Tree Planks=Plances de peuplier +Poplar Tree Planks Slab=Dalle en bois de peuplier +Poplar Tree Planks Stair=Escalier en bois de peuplier +Poplar Tree Sapling=Pousse de peuplier +Poplar Tree Trunk=Tronc de peuplier +Poplar Tree Trunk Slab=Dalle en tronc de peuplier +Poplar Tree Trunk Stair=Escalier en tronc de peuplier +Red=rouge +Rubber Tree=Arbre à caoutchouc +Rubber Tree Fence=Barrière en bois d'arbre à caoutchouc +Rubber Tree Fence Gate=Porte de clôture en bois d'arbre à caoutchouc +Rubber Tree Fence Rail=Clôture en bois d'arbre à caoutchouc +Rubber Tree Leaves=Feuilles d'arbre à caoutchouc +Rubber Tree Planks=Planches d'arbre à caoutchouc +Rubber Tree Planks Slab=Dalle en bois d'arbre à caoutchouc +Rubber Tree Planks Stair=Escalier en bois d'arbre à caoutchouc +Rubber Tree Sapling=Pousse d'arbre à caoutchouc +Rubber Tree Trunk=Tronc d'arbre a caoutchouc +Rubber Tree Trunk (Empty)=Tronc d'arbre à caoutchouc (vide) +Rubber Tree Trunk Slab=Dalle en tronc d'arbre à caoutchouc +Rubber Tree Trunk Stair=Escalier en tronc d'arbre à caoutchouc +Small poplar Tree Sapling=Pousse de petit peuplier +Spruce Cone=Cône de sapin +Spruce Tree=Épicéa +Spruce Tree Fence=Barrière en bois d'épicéa +Spruce Tree Fence Gate=Porte de clôture en bois d'épicéa +Spruce Tree Fence Rail=Clôture en bois d'épicéa +Spruce Tree Leaves=Feuilles d'épicéa +Spruce Tree Planks=Planches d'arbre d'épicéa +Spruce Tree Planks Slab=Dalle en bois d'épicéa +Spruce Tree Planks Stair=Escalier en bois d'épicéa +Spruce Tree Sapling=Pousse d'arbre d'épicéa +Spruce Tree Trunk=Tronc d'arbre d'épicéa +Spruce Tree Trunk Slab=Dalle en tronc d'épicéa +Spruce Tree Trunk Stair=Escalier en tronc d'épicéa +Willow Tree=Saule +Willow Tree Fence=Barrière en bois de saule +Willow Tree Fence Gate=Porte de clôture en bois de saule +Willow Tree Fence Rail=Clôture en bois de saule +Willow Tree Leaves=Feuilles de saule +Willow Tree Planks=Planches de saule +Willow Tree Planks Slab=Dalle en bois de saule +Willow Tree Planks Stair=Escalier en bois de saule +Willow Tree Sapling=Pousse de saule +Willow Tree Trunk=Tronc d'arbre de saule +Willow Tree Trunk Slab=Dalle en tronc de saule +Willow Tree Trunk Stair=Escalier en tronc de saule +Yellow=jaune diff --git a/mods/moretrees/locale/template.txt b/mods/moretrees/locale/template.txt index 8c167f5..bac4da7 100644 --- a/mods/moretrees/locale/template.txt +++ b/mods/moretrees/locale/template.txt @@ -1,73 +1,210 @@ -# Template +# textdomain: moretrees + + +### cocos_palm.lua ### + +Coconut= +Coconut Flower= ### crafts.lua ### -Coconut Milk = -Raw Coconut = -Acorn Muffin batter = -Acorn Muffin = -Roasted Spruce Cone Nuts = -Roasted Pine Cone Nuts = -Roasted Fir Cone Nuts = + +Acorn Muffin= +Acorn Muffin batter= +Coconut Milk= +Date= +Date & nut snack= +Date-nut cake= +Date-nut cake batter= +Date-nut energy bar= +Raw Coconut= +Roasted Cedar Cone Nuts= +Roasted Fir Cone Nuts= +Roasted Spruce Cone Nuts= + +### date_palm.lua ### + +Date Flowers= +Date Stem= +Dates= ### node_defs.lua ### -Beech Tree Trunk = -Apple Tree Trunk = -Oak Tree Trunk = -Giant Sequoia Trunk = -Birch Tree Trunk = -Palm Tree Trunk = -Spruce Tree Trunk = -Pine Tree Trunk = -Willow Tree Trunk = -Rubber Tree Trunk = -Jungle Tree Trunk = -Douglas Fir Trunk = -Beech Tree Planks = -Apple Tree Planks = -Oak Tree Planks = -Giant Sequoia Planks = -Birch Tree Planks = -Palm Tree Planks = -Spruce Tree Planks = -Pine Tree Planks = -Willow Tree Planks = -Rubber Tree Planks = -Jungle Tree Planks = -Douglas Fir Planks = -Beech Tree Sapling = -Apple Tree Sapling = -Oak Tree Sapling = -Giant Sequoia Sapling = -Birch Tree Sapling = -Palm Tree Sapling = -Spruce Tree Sapling = -Pine Tree Sapling = -Willow Tree Sapling = -Rubber Tree Sapling = -Jungle Tree Sapling = -Douglas Fir Sapling = -Beech Tree Leaves = -Apple Tree Leaves = -Oak Tree Leaves = -Giant Sequoia Leaves = -Birch Tree Leaves = -Palm Tree Leaves = -Spruce Tree Leaves = -Pine Tree Leaves = -Willow Tree Leaves = -Rubber Tree Leaves = -Jungle Tree Leaves = -Douglas Fir Leaves = -Acorn = -Coconut = -Spruce Cone = -Pine Cone = -Fir Cone = -Jungle Sapling = -Jungle Tree Leaves (Yellow) = -Jungle Tree Leaves (Red) = -Douglas Fir Leaves (Bright) = -Rubber Tree Trunk (Empty) = - -[Moretrees] Loaded (2013-02-11) = +@1 (fast growth)= +Acorn= +Apple Tree= +Apple Tree Fence= +Apple Tree Fence Gate= +Apple Tree Fence Rail= +Apple Tree Leaves= +Apple Tree Planks= +Apple Tree Planks Slab= +Apple Tree Planks Stair= +Apple Tree Sapling= +Apple Tree Trunk= +Apple Tree Trunk Slab= +Apple Tree Trunk Stair= +Beech Tree= +Beech Tree Fence= +Beech Tree Fence Gate= +Beech Tree Fence Rail= +Beech Tree Leaves= +Beech Tree Planks= +Beech Tree Planks Slab= +Beech Tree Planks Stair= +Beech Tree Sapling= +Beech Tree Trunk= +Beech Tree Trunk Slab= +Beech Tree Trunk Stair= +Birch Tree= +Birch Tree Fence= +Birch Tree Fence Gate= +Birch Tree Fence Rail= +Birch Tree Leaves= +Birch Tree Planks= +Birch Tree Planks Slab= +Birch Tree Planks Stair= +Birch Tree Sapling= +Birch Tree Trunk= +Birch Tree Trunk Slab= +Birch Tree Trunk Stair= +Cedar Cone= +Cedar Tree= +Cedar Tree Fence= +Cedar Tree Fence Gate= +Cedar Tree Fence Rail= +Cedar Tree Leaves= +Cedar Tree Planks= +Cedar Tree Planks Slab= +Cedar Tree Planks Stair= +Cedar Tree Sapling= +Cedar Tree Trunk= +Cedar Tree Trunk Slab= +Cedar Tree Trunk Stair= +Date Palm Tree= +Date Palm Tree Fence= +Date Palm Tree Fence Gate= +Date Palm Tree Fence Rail= +Date Palm Tree Leaves= +Date Palm Tree Planks= +Date Palm Tree Planks Slab= +Date Palm Tree Planks Stair= +Date Palm Tree Sapling= +Date Palm Tree Trunk= +Date Palm Tree Trunk Slab= +Date Palm Tree Trunk Stair= +Douglas Fir= +Douglas Fir Fence= +Douglas Fir Fence Gate= +Douglas Fir Fence Rail= +Douglas Fir Leaves= +Douglas Fir Leaves (Bright)= +Douglas Fir Planks= +Douglas Fir Planks Slab= +Douglas Fir Planks Stair= +Douglas Fir Sapling= +Douglas Fir Trunk= +Douglas Fir Trunk Slab= +Douglas Fir Trunk Stair= +Fir Cone= +Giant Sequoia= +Giant Sequoia Fence= +Giant Sequoia Fence Gate= +Giant Sequoia Fence Rail= +Giant Sequoia Leaves= +Giant Sequoia Planks= +Giant Sequoia Planks Slab= +Giant Sequoia Planks Stair= +Giant Sequoia Sapling= +Giant Sequoia Trunk= +Giant Sequoia Trunk Slab= +Giant Sequoia Trunk Stair= +Jungle Tree= +Jungle Tree Fence= +Jungle Tree Fence Gate= +Jungle Tree Fence Rail= +Jungle Tree Leaves= +Jungle Tree Leaves (@1)= +Jungle Tree Planks= +Jungle Tree Planks Slab= +Jungle Tree Planks Stair= +Jungle Tree Sapling= +Jungle Tree Trunk= +Jungle Tree Trunk Slab= +Jungle Tree Trunk Stair= +Oak Tree= +Oak Tree Fence= +Oak Tree Fence Gate= +Oak Tree Fence Rail= +Oak Tree Leaves= +Oak Tree Planks= +Oak Tree Planks Slab= +Oak Tree Planks Stair= +Oak Tree Sapling= +Oak Tree Trunk= +Oak Tree Trunk Slab= +Oak Tree Trunk Stair= +Palm Tree= +Palm Tree Fence= +Palm Tree Fence Gate= +Palm Tree Fence Rail= +Palm Tree Leaves= +Palm Tree Planks= +Palm Tree Planks Slab= +Palm Tree Planks Stair= +Palm Tree Sapling= +Palm Tree Trunk= +Palm Tree Trunk Slab= +Palm Tree Trunk Stair= +Poplar Tree= +Poplar Tree Fence= +Poplar Tree Fence Gate= +Poplar Tree Fence Rail= +Poplar Tree Leaves= +Poplar Tree Planks= +Poplar Tree Planks Slab= +Poplar Tree Planks Stair= +Poplar Tree Sapling= +Poplar Tree Trunk= +Poplar Tree Trunk Slab= +Poplar Tree Trunk Stair= +Red= +Rubber Tree= +Rubber Tree Fence= +Rubber Tree Fence Gate= +Rubber Tree Fence Rail= +Rubber Tree Leaves= +Rubber Tree Planks= +Rubber Tree Planks Slab= +Rubber Tree Planks Stair= +Rubber Tree Sapling= +Rubber Tree Trunk= +Rubber Tree Trunk (Empty)= +Rubber Tree Trunk Slab= +Rubber Tree Trunk Stair= +Small poplar Tree Sapling= +Spruce Cone= +Spruce Tree= +Spruce Tree Fence= +Spruce Tree Fence Gate= +Spruce Tree Fence Rail= +Spruce Tree Leaves= +Spruce Tree Planks= +Spruce Tree Planks Slab= +Spruce Tree Planks Stair= +Spruce Tree Sapling= +Spruce Tree Trunk= +Spruce Tree Trunk Slab= +Spruce Tree Trunk Stair= +Willow Tree= +Willow Tree Fence= +Willow Tree Fence Gate= +Willow Tree Fence Rail= +Willow Tree Leaves= +Willow Tree Planks= +Willow Tree Planks Slab= +Willow Tree Planks Stair= +Willow Tree Sapling= +Willow Tree Trunk= +Willow Tree Trunk Slab= +Willow Tree Trunk Stair= +Yellow= diff --git a/mods/moretrees/mod.conf b/mods/moretrees/mod.conf index b95f3e8..da7e493 100644 --- a/mods/moretrees/mod.conf +++ b/mods/moretrees/mod.conf @@ -1 +1,4 @@ name = moretrees +depends = default, biome_lib, vessels +optional_depends = doors, stairs, moreblocks, farming +min_minetest_version = 5.2.0 diff --git a/mods/moretrees/node_defs.lua b/mods/moretrees/node_defs.lua index 9fb4225..bdc4a2b 100644 --- a/mods/moretrees/node_defs.lua +++ b/mods/moretrees/node_defs.lua @@ -1,28 +1,217 @@ -local S = moretrees.intllib +local S = minetest.get_translator("moretrees") moretrees.avoidnodes = {} moretrees.treelist = { - {"beech", "Beech Tree"}, - {"apple_tree", "Apple Tree"}, - {"oak", "Oak Tree", "acorn", "Acorn", {-0.2, -0.5, -0.2, 0.2, 0, 0.2}, 0.8 }, - {"sequoia", "Giant Sequoia"}, - {"birch", "Birch Tree"}, - {"palm", "Palm Tree", "palm_fruit_trunk_gen", "Palm Tree", {-0.2, -0.5, -0.2, 0.2, 0, 0.2}, 1.0 }, - {"date_palm", "Date Palm Tree", "date_palm_fruit_trunk", "Date Palm Tree", {0, 0, 0, 0, 0, 0}, 0.0 }, - {"spruce", "Spruce Tree", "spruce_cone", "Spruce Cone", {-0.2, -0.5, -0.2, 0.2, 0, 0.2}, 0.8 }, - {"cedar", "Cedar Tree", "cedar_cone", "Cedar Cone", {-0.2, -0.5, -0.2, 0.2, 0, 0.2}, 0.8 }, - {"poplar", "Poplar Tree"}, - {"poplar_small", "Poplar Tree"}, - {"willow", "Willow Tree"}, - {"rubber_tree", "Rubber Tree"}, - {"fir", "Douglas Fir", "fir_cone", "Fir Cone", {-0.2, -0.5, -0.2, 0.2, 0, 0.2}, 0.8 }, - {"jungletree", "Jungle Tree", nil, nil, nil, nil, "default_junglesapling.png" }, + {"beech", S("Beech Tree")}, + {"apple_tree", S("Apple Tree")}, + {"oak", S("Oak Tree"), "acorn", S("Acorn"), {-0.2, -0.5, -0.2, 0.2, 0, 0.2}, 0.8 }, + {"sequoia", S("Giant Sequoia")}, + {"birch", S("Birch Tree")}, + {"palm", S("Palm Tree"), "palm_fruit_trunk_gen", S("Palm Tree"), {-0.2, -0.5, -0.2, 0.2, 0, 0.2}, 1.0 }, + {"date_palm", S("Date Palm Tree"), "date_palm_fruit_trunk", S("Date Palm Tree"), {0, 0, 0, 0, 0, 0}, 0.0 }, + {"spruce", S("Spruce Tree"), "spruce_cone", S("Spruce Cone"), {-0.2, -0.5, -0.2, 0.2, 0, 0.2}, 0.8 }, + {"cedar", S("Cedar Tree"), "cedar_cone", S("Cedar Cone"), {-0.2, -0.5, -0.2, 0.2, 0, 0.2}, 0.8 }, + {"poplar", S("Poplar Tree")}, + {"poplar_small", S("Poplar Tree")}, + {"willow", S("Willow Tree")}, + {"rubber_tree", S("Rubber Tree")}, + {"fir", S("Douglas Fir"), "fir_cone", S("Fir Cone"), {-0.2, -0.5, -0.2, 0.2, 0, 0.2}, 0.8 }, + {"jungletree", S("Jungle Tree"), nil, nil, nil, nil, "default_junglesapling.png" }, } -local dirs1 = { 21, 20, 23, 22, 21 } +moretrees.treedesc = { + beech = { + trunk = S("Beech Tree Trunk"), + planks = S("Beech Tree Planks"), + sapling = S("Beech Tree Sapling"), + leaves = S("Beech Tree Leaves"), + trunk_stair = S("Beech Tree Trunk Stair"), + trunk_slab = S("Beech Tree Trunk Slab"), + planks_stair = S("Beech Tree Planks Stair"), + planks_slab = S("Beech Tree Planks Slab"), + fence = S("Beech Tree Fence"), + fence_rail = S("Beech Tree Fence Rail"), + fence_gate = S("Beech Tree Fence Gate"), + }, + apple_tree = { + trunk = S("Apple Tree Trunk"), + planks = S("Apple Tree Planks"), + sapling = S("Apple Tree Sapling"), + leaves = S("Apple Tree Leaves"), + trunk_stair = S("Apple Tree Trunk Stair"), + trunk_slab = S("Apple Tree Trunk Slab"), + planks_stair = S("Apple Tree Planks Stair"), + planks_slab = S("Apple Tree Planks Slab"), + fence = S("Apple Tree Fence"), + fence_rail = S("Apple Tree Fence Rail"), + fence_gate = S("Apple Tree Fence Gate"), + }, + oak = { + trunk = S("Oak Tree Trunk"), + planks = S("Oak Tree Planks"), + sapling = S("Oak Tree Sapling"), + leaves = S("Oak Tree Leaves"), + trunk_stair = S("Oak Tree Trunk Stair"), + trunk_slab = S("Oak Tree Trunk Slab"), + planks_stair = S("Oak Tree Planks Stair"), + planks_slab = S("Oak Tree Planks Slab"), + fence = S("Oak Tree Fence"), + fence_rail = S("Oak Tree Fence Rail"), + fence_gate = S("Oak Tree Fence Gate"), + }, + sequoia = { + trunk = S("Giant Sequoia Trunk"), + planks = S("Giant Sequoia Planks"), + sapling = S("Giant Sequoia Sapling"), + leaves = S("Giant Sequoia Leaves"), + trunk_stair = S("Giant Sequoia Trunk Stair"), + trunk_slab = S("Giant Sequoia Trunk Slab"), + planks_stair = S("Giant Sequoia Planks Stair"), + planks_slab = S("Giant Sequoia Planks Slab"), + fence = S("Giant Sequoia Fence"), + fence_rail = S("Giant Sequoia Fence Rail"), + fence_gate = S("Giant Sequoia Fence Gate"), + }, + birch = { + trunk = S("Birch Tree Trunk"), + planks = S("Birch Tree Planks"), + sapling = S("Birch Tree Sapling"), + leaves = S("Birch Tree Leaves"), + trunk_stair = S("Birch Tree Trunk Stair"), + trunk_slab = S("Birch Tree Trunk Slab"), + planks_stair = S("Birch Tree Planks Stair"), + planks_slab = S("Birch Tree Planks Slab"), + fence = S("Birch Tree Fence"), + fence_rail = S("Birch Tree Fence Rail"), + fence_gate = S("Birch Tree Fence Gate"), + }, + palm = { + trunk = S("Palm Tree Trunk"), + planks = S("Palm Tree Planks"), + sapling = S("Palm Tree Sapling"), + leaves = S("Palm Tree Leaves"), + trunk_stair = S("Palm Tree Trunk Stair"), + trunk_slab = S("Palm Tree Trunk Slab"), + planks_stair = S("Palm Tree Planks Stair"), + planks_slab = S("Palm Tree Planks Slab"), + fence = S("Palm Tree Fence"), + fence_rail = S("Palm Tree Fence Rail"), + fence_gate = S("Palm Tree Fence Gate"), + }, + date_palm = { + trunk = S("Date Palm Tree Trunk"), + planks = S("Date Palm Tree Planks"), + sapling = S("Date Palm Tree Sapling"), + leaves = S("Date Palm Tree Leaves"), + trunk_stair = S("Date Palm Tree Trunk Stair"), + trunk_slab = S("Date Palm Tree Trunk Slab"), + planks_stair = S("Date Palm Tree Planks Stair"), + planks_slab = S("Date Palm Tree Planks Slab"), + fence = S("Date Palm Tree Fence"), + fence_rail = S("Date Palm Tree Fence Rail"), + fence_gate = S("Date Palm Tree Fence Gate"), + }, + spruce = { + trunk = S("Spruce Tree Trunk"), + planks = S("Spruce Tree Planks"), + sapling = S("Spruce Tree Sapling"), + leaves = S("Spruce Tree Leaves"), + trunk_stair = S("Spruce Tree Trunk Stair"), + trunk_slab = S("Spruce Tree Trunk Slab"), + planks_stair = S("Spruce Tree Planks Stair"), + planks_slab = S("Spruce Tree Planks Slab"), + fence = S("Spruce Tree Fence"), + fence_rail = S("Spruce Tree Fence Rail"), + fence_gate = S("Spruce Tree Fence Gate"), + }, + cedar = { + trunk = S("Cedar Tree Trunk"), + planks = S("Cedar Tree Planks"), + sapling = S("Cedar Tree Sapling"), + leaves = S("Cedar Tree Leaves"), + trunk_stair = S("Cedar Tree Trunk Stair"), + trunk_slab = S("Cedar Tree Trunk Slab"), + planks_stair = S("Cedar Tree Planks Stair"), + planks_slab = S("Cedar Tree Planks Slab"), + fence = S("Cedar Tree Fence"), + fence_rail = S("Cedar Tree Fence Rail"), + fence_gate = S("Cedar Tree Fence Gate"), + }, + poplar = { + trunk = S("Poplar Tree Trunk"), + planks = S("Poplar Tree Planks"), + sapling = S("Poplar Tree Sapling"), + leaves = S("Poplar Tree Leaves"), + trunk_stair = S("Poplar Tree Trunk Stair"), + trunk_slab = S("Poplar Tree Trunk Slab"), + planks_stair = S("Poplar Tree Planks Stair"), + planks_slab = S("Poplar Tree Planks Slab"), + fence = S("Poplar Tree Fence"), + fence_rail = S("Poplar Tree Fence Rail"), + fence_gate = S("Poplar Tree Fence Gate"), + }, + poplar_small = { + sapling = S("Small poplar Tree Sapling"), + }, + willow = { + trunk = S("Willow Tree Trunk"), + planks = S("Willow Tree Planks"), + sapling = S("Willow Tree Sapling"), + leaves = S("Willow Tree Leaves"), + trunk_stair = S("Willow Tree Trunk Stair"), + trunk_slab = S("Willow Tree Trunk Slab"), + planks_stair = S("Willow Tree Planks Stair"), + planks_slab = S("Willow Tree Planks Slab"), + fence = S("Willow Tree Fence"), + fence_rail = S("Willow Tree Fence Rail"), + fence_gate = S("Willow Tree Fence Gate"), + }, + rubber_tree = { + trunk = S("Rubber Tree Trunk"), + planks = S("Rubber Tree Planks"), + sapling = S("Rubber Tree Sapling"), + leaves = S("Rubber Tree Leaves"), + trunk_stair = S("Rubber Tree Trunk Stair"), + trunk_slab = S("Rubber Tree Trunk Slab"), + planks_stair = S("Rubber Tree Planks Stair"), + planks_slab = S("Rubber Tree Planks Slab"), + fence = S("Rubber Tree Fence"), + fence_rail = S("Rubber Tree Fence Rail"), + fence_gate = S("Rubber Tree Fence Gate"), + }, + fir = { + trunk = S("Douglas Fir Trunk"), + planks = S("Douglas Fir Planks"), + sapling = S("Douglas Fir Sapling"), + leaves = S("Douglas Fir Leaves"), + trunk_stair = S("Douglas Fir Trunk Stair"), + trunk_slab = S("Douglas Fir Trunk Slab"), + planks_stair = S("Douglas Fir Planks Stair"), + planks_slab = S("Douglas Fir Planks Slab"), + fence = S("Douglas Fir Fence"), + fence_rail = S("Douglas Fir Fence Rail"), + fence_gate = S("Douglas Fir Fence Gate"), + }, + jungletree = { + trunk = S("Jungle Tree Trunk"), + planks = S("Jungle Tree Planks"), + sapling = S("Jungle Tree Sapling"), + leaves = S("Jungle Tree Leaves"), + trunk_stair = S("Jungle Tree Trunk Stair"), + trunk_slab = S("Jungle Tree Trunk Slab"), + planks_stair = S("Jungle Tree Planks Stair"), + planks_slab = S("Jungle Tree Planks Slab"), + fence = S("Jungle Tree Fence"), + fence_rail = S("Jungle Tree Fence Rail"), + fence_gate = S("Jungle Tree Fence Gate"), + }, +} + + +-- local dirs1 = { 21, 20, 23, 22, 21 } local dirs2 = { 12, 9, 18, 7, 12 } -local dirs3 = { 14, 11, 16, 5, 14 } +-- local dirs3 = { 14, 11, 16, 5, 14 } local moretrees_new_leaves_drawtype = "allfaces_optional" local moretrees_plantlike_leaves_visual_scale = 1 @@ -54,7 +243,6 @@ end for i in ipairs(moretrees.treelist) do local treename = moretrees.treelist[i][1] - local treedesc = moretrees.treelist[i][2] local fruit = moretrees.treelist[i][3] local fruitdesc = moretrees.treelist[i][4] local selbox = moretrees.treelist[i][5] @@ -83,7 +271,7 @@ for i in ipairs(moretrees.treelist) do saptex = "moretrees_"..treename.."_sapling.png" minetest.register_node("moretrees:"..treename.."_trunk", { - description = S(treedesc.." Trunk"), + description = moretrees.treedesc[treename].trunk, tiles = { "moretrees_"..treename.."_trunk_top.png", "moretrees_"..treename.."_trunk_top.png", @@ -97,7 +285,7 @@ for i in ipairs(moretrees.treelist) do }) minetest.register_node("moretrees:"..treename.."_planks", { - description = S(treedesc.." Planks"), + description = moretrees.treedesc[treename].planks, tiles = {"moretrees_"..treename.."_wood.png"}, is_ground_content = false, groups = {snappy=1,choppy=2,oddly_breakable_by_hand=2,flammable=3,wood=1}, @@ -105,7 +293,7 @@ for i in ipairs(moretrees.treelist) do }) minetest.register_node("moretrees:"..treename.."_sapling", { - description = S(treedesc.." Sapling"), + description = moretrees.treedesc[treename].sapling, drawtype = "plantlike", tiles = {saptex}, inventory_image = saptex, @@ -119,6 +307,18 @@ for i in ipairs(moretrees.treelist) do }, groups = {snappy=2,dig_immediate=3,flammable=2,attached_node=1,sapling=1}, sounds = default.node_sound_defaults(), + on_place = function(itemstack, placer, pointed_thing) + itemstack = default.sapling_on_place(itemstack, placer, pointed_thing, + "moretrees:" ..treename.. "_sapling", + -- minp, maxp to be checked, relative to sapling pos + -- minp_relative.y = 1 because sapling pos has been checked + {x = -3, y = 1, z = -3}, + {x = 3, y = 6, z = 3}, + -- maximum interval of interior volume check + 4) + + return itemstack + end, }) local moretrees_leaves_inventory_image = nil @@ -131,7 +331,7 @@ for i in ipairs(moretrees.treelist) do end minetest.register_node("moretrees:"..treename.."_leaves", { - description = S(treedesc.." Leaves"), + description = moretrees.treedesc[treename].leaves, drawtype = moretrees_new_leaves_drawtype, waving = moretrees_new_leaves_waving, visual_scale = moretrees_plantlike_leaves_visual_scale, @@ -167,7 +367,7 @@ for i in ipairs(moretrees.treelist) do "moretrees_"..treename.."_trunk_top.png", "moretrees_"..treename.."_trunk.png" }, - description = S(treedesc.." Trunk"), + description = moretrees.treedesc[treename].trunk, drop = treename.."_trunk", } ) @@ -179,7 +379,7 @@ for i in ipairs(moretrees.treelist) do { groups = { snappy=1, choppy=2, oddly_breakable_by_hand=2, flammable=3, not_in_creative_inventory=1 }, tiles = { "moretrees_"..treename.."_wood.png" }, - description = S(treedesc.." Planks"), + description = moretrees.treedesc[treename].planks, drop = treename.."_planks", } ) @@ -192,8 +392,8 @@ for i in ipairs(moretrees.treelist) do "moretrees_"..treename.."_trunk_top.png", "moretrees_"..treename.."_trunk.png" }, - S(treedesc.." Trunk Stair"), - S(treedesc.." Trunk Slab"), + moretrees.treedesc[treename].trunk_stair, + moretrees.treedesc[treename].trunk_slab, default.node_sound_wood_defaults() ) @@ -202,8 +402,8 @@ for i in ipairs(moretrees.treelist) do "moretrees:"..treename.."_planks", { snappy=1, choppy=2, oddly_breakable_by_hand=2, flammable=3 }, { "moretrees_"..treename.."_wood.png" }, - S(treedesc.." Planks Stair"), - S(treedesc.." Planks Slab"), + moretrees.treedesc[treename].planks_stair, + moretrees.treedesc[treename].planks_slab, default.node_sound_wood_defaults() ) @@ -214,7 +414,7 @@ for i in ipairs(moretrees.treelist) do local planks_name = "moretrees:" .. treename .. "_planks" local planks_tile = "moretrees_" .. treename .. "_wood.png" default.register_fence("moretrees:" .. treename .. "_fence", { - description = S(treedesc.." Fence"), + description = moretrees.treedesc[treename].fence, texture = planks_tile, inventory_image = "default_fence_overlay.png^" .. planks_tile .. "^default_fence_overlay.png^[makealpha:255,126,126", @@ -225,7 +425,7 @@ for i in ipairs(moretrees.treelist) do sounds = default.node_sound_wood_defaults() }) default.register_fence_rail("moretrees:" .. treename .. "_fence_rail", { - description = S(treedesc.." Fence Rail"), + description = moretrees.treedesc[treename].fence_rail, texture = planks_tile, inventory_image = "default_fence_rail_overlay.png^" .. planks_tile .. "^default_fence_rail_overlay.png^[makealpha:255,126,126", @@ -237,7 +437,7 @@ for i in ipairs(moretrees.treelist) do }) if minetest.global_exists("doors") then doors.register_fencegate("moretrees:" .. treename .. "_gate", { - description = S(treedesc .. " Fence Gate"), + description = moretrees.treedesc[treename].fence_gate, texture = planks_tile, material = planks_name, groups = {choppy = 2, oddly_breakable_by_hand = 2, flammable = 2} @@ -247,7 +447,7 @@ for i in ipairs(moretrees.treelist) do end minetest.register_node("moretrees:"..treename.."_sapling_ongen", { - description = S(treedesc.." Sapling (fast growth)"), + description = S("@1 (fast growth)", moretrees.treedesc[treename].sapling), drawtype = "plantlike", tiles = {saptex}, inventory_image = saptex, @@ -261,14 +461,26 @@ for i in ipairs(moretrees.treelist) do }, groups = {snappy=2,dig_immediate=3,flammable=2,attached_node=1,sapling=1}, sounds = default.node_sound_defaults(), - drop = "moretrees:"..treename.."_sapling" + drop = "moretrees:"..treename.."_sapling", + on_place = function(itemstack, placer, pointed_thing) + itemstack = default.sapling_on_place(itemstack, placer, pointed_thing, + "moretrees:" ..treename.. "_sapling_ongen", + -- minp, maxp to be checked, relative to sapling pos + -- minp_relative.y = 1 because sapling pos has been checked + {x = -3, y = 1, z = -3}, + {x = 3, y = 6, z = 3}, + -- maximum interval of interior volume check + 4) + + return itemstack + end, }) local fruitname = nil if fruit then fruitname = "moretrees:"..fruit minetest.register_node(fruitname, { - description = S(fruitdesc), + description = fruitdesc, drawtype = "plantlike", tiles = { "moretrees_"..fruit..".png" }, inventory_image = "moretrees_"..fruit..".png^[transformR180", @@ -303,7 +515,7 @@ for i in ipairs(moretrees.treelist) do chance = 1, action = function(pos, node, active_object_count, active_object_count_wider) local fdir = node.param2 or 0 - nfdir = dirs2[fdir+1] + local nfdir = dirs2[fdir+1] minetest.add_node(pos, {name = "moretrees:"..treename.."_trunk", param2 = nfdir}) end, }) @@ -358,7 +570,7 @@ minetest.override_item("moretrees:poplar_leaves", { -- Extra nodes for jungle trees: local jungleleaves = {"yellow","red"} -local jungleleavesnames = {"Yellow", "Red"} +local jungleleavesnames = {S("Yellow"), S("Red")} for color = 1, #jungleleaves do local leave_name = "moretrees:jungletree_leaves_"..jungleleaves[color] @@ -371,7 +583,7 @@ for color = 1, #jungleleaves do end minetest.register_node(leave_name, { - description = S("Jungle Tree Leaves ("..jungleleavesnames[color]..")"), + description = S("Jungle Tree Leaves (@1)", jungleleavesnames[color]), drawtype = moretrees_new_leaves_drawtype, waving = moretrees_new_leaves_waving, visual_scale = moretrees_plantlike_leaves_visual_scale, @@ -466,7 +678,6 @@ minetest.register_node("moretrees:rubber_tree_trunk_empty", { "moretrees_rubber_tree_trunk_top.png", "moretrees_rubber_tree_trunk_empty.png" }, - is_ground_content = true, groups = {tree=1,snappy=1,choppy=2,oddly_breakable_by_hand=1,flammable=2}, sounds = default.node_sound_wood_defaults(), paramtype2 = "facedir", @@ -480,7 +691,7 @@ minetest.register_abm({ chance = 1, action = function(pos, node, active_object_count, active_object_count_wider) local fdir = node.param2 or 0 - nfdir = dirs2[fdir+1] + local nfdir = dirs2[fdir+1] minetest.add_node(pos, {name = "moretrees:rubber_tree_trunk_empty", param2 = nfdir}) end, }) diff --git a/mods/moretrees/screenshot.lua b/mods/moretrees/screenshot.lua index cb2ad7a..28a8c25 100644 --- a/mods/moretrees/screenshot.lua +++ b/mods/moretrees/screenshot.lua @@ -31,7 +31,7 @@ index 8189ffd..afd4644 100644 @@ -225,9 +225,12 @@ moretrees.ct_rules_b1 = "[-FBf][+FBf]" moretrees.ct_rules_a2 = "FF[FF][&&-FBF][&&+FBF][&&---FBF][&&+++FBF]F/A" moretrees.ct_rules_b2 = "[-fB][+fB]" - + +local jleaves = 1 function moretrees.grow_jungletree(pos) local r1 = math.random(2) @@ -40,11 +40,11 @@ index 8189ffd..afd4644 100644 + jleaves = jleaves % 2 + 1 if r1 == 1 then moretrees.jungletree_model.leaves2 = "moretrees:jungletree_leaves_red" - else + else @@ -235,6 +238,7 @@ function moretrees.grow_jungletree(pos) end moretrees.jungletree_model.leaves2_chance = math.random(25, 75) - + + r2=3 if r2 == 1 then moretrees.jungletree_model.trunk_type = "single" @@ -62,7 +62,7 @@ minetest.register_chatcommand("make-scene", { minetest.place_node({x=780, y=30, z=-276}, {name="default:obsidian"}) for z = -360, -300 do - dy=2 + local dy=2 for x = 630 + (-z - 360)/3, 660 + (-z - 300)/3 do for y = 5, 22 do minetest.place_node({x=x, y=y, z=z}, {name="default:desert_stone"}) diff --git a/mods/moretrees/tree_models.lua b/mods/moretrees/tree_models.lua index 879a32a..eb6541e 100644 --- a/mods/moretrees/tree_models.lua +++ b/mods/moretrees/tree_models.lua @@ -49,7 +49,6 @@ moretrees.poplar_model={ rules_b="[[T]&&G++f++ff++ff++ff++f--]G", rules_c="[[T]&&G++f++ff++ff++ff++f--G++[d]G[d]G++G[d]G[d]G[d]G++G[d]G[d]G[d]G++G[d]G[d]G[d]G++G[d]G]G", rules_d="f", - trunk="air", trunk="moretrees:poplar_trunk", leaves="moretrees:poplar_leaves", angle=45, diff --git a/mods/voxeldungeon/armor.lua b/mods/voxeldungeon/armor.lua index 54bae38..2c4e007 100644 --- a/mods/voxeldungeon/armor.lua +++ b/mods/voxeldungeon/armor.lua @@ -21,33 +21,74 @@ along with this program. If not, see voxeldungeon.armor = {} --global variable +local HITS_TO_KNOW = 15 -function voxeldungeon.armor.getDefenseOf(armor) + +function voxeldungeon.armor.getDefenseOf(armor, unIdentified) local level = armor:get_meta():get_int("voxeldungeon:level") + if unIdentified then + level = 0 + end + local def = armor:get_definition() local tier = def._tier return tier + tier * level end +function voxeldungeon.armor.isLevelKnown(armor) + return armor:get_meta():get_int("voxeldungeon:levelKnown") >= HITS_TO_KNOW +end + +function voxeldungeon.armor.isIdentified(armor) + return voxeldungeon.armor.isLevelKnown(armor) +end + +function voxeldungeon.armor.identify(armor) + armor:get_meta():set_int("voxeldungeon:levelKnown", HITS_TO_KNOW) + voxeldungeon.armor.updateDescription(armor) +end + +function voxeldungeon.armor.checkLevelKnown(armor, user) + local meta = armor:get_meta() + local levelKnown = meta:get_int("voxeldungeon:levelKnown") + + if levelKnown < HITS_TO_KNOW then + levelKnown = levelKnown + 1 + meta:set_int("voxeldungeon:levelKnown", levelKnown) + + if levelKnown == HITS_TO_KNOW then + voxeldungeon.armor.updateDescription(armor) + voxeldungeon.glog.i("You are now familiar with your "..voxeldungeon.utils.itemShortDescription(armor)..".", user) + end + end +end + function voxeldungeon.armor.updateDescription(armor) local meta = armor:get_meta() local level = meta:get_int("voxeldungeon:level") + local levelKnown = voxeldungeon.armor.isLevelKnown(armor) local def = armor:get_definition() local tier = def._tier local info = def._info - local defense = voxeldungeon.armor.getDefenseOf(armor) - local strreq = voxeldungeon.tools.getStrengthRequirementOf(armor) + local defense = voxeldungeon.armor.getDefenseOf(armor, not levelKnown) + local strreq = voxeldungeon.tools.getStrengthRequirementOf(armor, not levelKnown) + + local statsDesc = "tier-"..tier.." armor blocks "..defense.." damage and requires "..strreq.." points of strength to wear properly." + if levelKnown then + statsDesc = "This "..statsDesc + else + statsDesc = "Typically, this "..statsDesc + end local strTip = "\n \nBe careful about equipping armor without enough strength, your movement speed will decrease." - meta:set_string("description", voxeldungeon.utils.itemDescription(voxeldungeon.utils.itemShortDescription(armor).."\n \n"..info.. - "\n \nThis tier-"..tier.." armor blocks "..defense.." damage and requires "..strreq.. - " points of strength to wear properly."..strTip)) + meta:set_string("description", voxeldungeon.utils.itemDescription(voxeldungeon.utils.itemShortDescription(armor).."\n \n"..info.. + "\n \n"..statsDesc..strTip)) end function voxeldungeon.armor.updateStrdiffArmor(player) diff --git a/mods/voxeldungeon/blobs.lua b/mods/voxeldungeon/blobs.lua index eae0ed3..5f5787a 100644 --- a/mods/voxeldungeon/blobs.lua +++ b/mods/voxeldungeon/blobs.lua @@ -23,6 +23,7 @@ voxeldungeon.blobs = {} voxeldungeon.blobs.registered_blobs = {} local TIMESCALE = 1 +local MAX_CYCLE_SIZE = 100 local function expandUpon(posses, spreadCondition) local newposses = voxeldungeon.smartVectorTable() @@ -59,9 +60,8 @@ function voxeldungeon.blobs.register(name, def) blob.posses.table = minetest.deserialize(possesString) end - blob.volume = voxeldungeon.storage.getNum(name.."_volume") or 0 - blob.timer = voxeldungeon.storage.getNum(name.."_timer") or TIMESCALE + blob.queue = voxeldungeon.storage.getNum(name.."_queue") or 1 blob.on_step = function(dtime) voxeldungeon.storage.put(name.."_timer", blob.timer) @@ -73,10 +73,7 @@ function voxeldungeon.blobs.register(name, def) blob.timer = TIMESCALE - --if blob.volume > 0 then if blob.posses.size() > 0 then - blob.volume = 0 - blob:evolve() if blob.effectTerr then @@ -113,13 +110,15 @@ function voxeldungeon.blobs.register(name, def) end voxeldungeon.storage.put(name.."_posses", minetest.serialize(blob.posses.table)) - voxeldungeon.storage.put(name.."_volume", blob.volume) + voxeldungeon.storage.put(name.."_queue", blob.queue) end blob.evolve = blob.evolve or function(blob) local offload = expandUpon(blob.posses, blob.spreadCondition) - for i = 1, offload.size() do + local cycleSize = math.min(MAX_CYCLE_SIZE, offload.size()) + + for i = blob.queue, blob.queue + offload.size() - 1 do local p = offload.getVector(i) if p then @@ -143,14 +142,12 @@ function voxeldungeon.blobs.register(name, def) end offload.set(p, value) - blob.volume = blob.volume + value else offload.del(p) end else local value = blob.posses.get(p) or 0 offload.set(p, value) - blob.volume = blob.volume + value end end end @@ -162,10 +159,15 @@ function voxeldungeon.blobs.register(name, def) end blob.posses = offload + + blob.queue = blob.queue + MAX_CYCLE_SIZE + + if blob.queue > offload.size() then + blob.queue = 1 + end end blob.seed = function(pos, amount) - blob.volume = blob.volume + amount blob.posses.set(pos, amount) end @@ -173,7 +175,6 @@ function voxeldungeon.blobs.register(name, def) local cur = blob.posses.get(pos) if cur then - blob.volume = blob.volume - cur blob.posses.del(pos) end end @@ -246,7 +247,9 @@ voxeldungeon.blobs.register("fire", { evolve = function(blob) local offload = expandUpon(blob.posses, blob.spreadCondition) - for i = 1, offload.size() do + local cycleSize = math.min(MAX_CYCLE_SIZE, offload.size()) + + for i = blob.queue, blob.queue + offload.size() - 1 do local p = offload.getVector(i) if p then @@ -275,7 +278,6 @@ voxeldungeon.blobs.register("fire", { end offload.set(p, value) - blob.volume = blob.volume + value end else offload.del(p) @@ -283,7 +285,7 @@ voxeldungeon.blobs.register("fire", { else local value = blob.posses.get(p) or 0 offload.set(p, value) - blob.volume = blob.volume + value + cycleSize = cycleSize + 1 end end end @@ -295,6 +297,12 @@ voxeldungeon.blobs.register("fire", { end blob.posses = offload + + blob.queue = blob.queue + MAX_CYCLE_SIZE + + if blob.queue > offload.size() then + blob.queue = 1 + end end, effectTerr = function(blob, pos, amount, objs) diff --git a/mods/voxeldungeon/crafting.lua b/mods/voxeldungeon/crafting.lua index 31d2ca6..9531a05 100644 --- a/mods/voxeldungeon/crafting.lua +++ b/mods/voxeldungeon/crafting.lua @@ -134,6 +134,14 @@ minetest.register_craft({ +--Any crafted item is instantly identified +minetest.register_on_craft(function(itemstack, player, old_craft_grid, craft_inv) + voxeldungeon.items.identify(itemstack) + return itemstack +end) + + + --Bed recipes that allow any wool minetest.register_craft({ diff --git a/mods/voxeldungeon/hunger.lua b/mods/voxeldungeon/hunger.lua index b71e44f..a78adac 100644 --- a/mods/voxeldungeon/hunger.lua +++ b/mods/voxeldungeon/hunger.lua @@ -47,7 +47,7 @@ register_food("mystery_meat", { groups = {freezable = 1, flammable = 1}, on_eat = function(itemstack, user) - local effect = math.random(3) + local effect = math.random(4) if effect == 2 then voxeldungeon.glog.w("You are not feeling well.", user) @@ -55,6 +55,9 @@ register_food("mystery_meat", { elseif effect == 3 then voxeldungeon.glog.w("You can't feel your legs!", user) voxeldungeon.buffs.attach_buff("voxeldungeon:rooted", user, 10) + elseif effect == 4 then + voxeldungeon.glog.w("Oh, it's hot!", user) + voxeldungeon.buffs.attach_buff("voxeldungeon:burning", user, 8) end end, diff --git a/mods/voxeldungeon/init.lua b/mods/voxeldungeon/init.lua index 05657fa..f43ae45 100644 --- a/mods/voxeldungeon/init.lua +++ b/mods/voxeldungeon/init.lua @@ -66,3 +66,4 @@ dofile(mp.."mapgen.lua") --Unregistration files dofile(mp.."trashbin.lua") + diff --git a/mods/voxeldungeon/items.lua b/mods/voxeldungeon/items.lua index 38f4e60..cd72dcc 100644 --- a/mods/voxeldungeon/items.lua +++ b/mods/voxeldungeon/items.lua @@ -23,6 +23,18 @@ voxeldungeon.items = {} +function voxeldungeon.items.identify(item) + if minetest.get_item_group(item:get_name(), "armor") > 0 then + voxeldungeon.armor.identify(item) + elseif minetest.get_item_group(item:get_name(), "wand") > 0 then + voxeldungeon.wands.identify(item) + elseif minetest.get_item_group(item:get_name(), "weapon") > 0 then + voxeldungeon.weapons.identify(item) + end +end + + + local function get_pointed_pos(pointed_thing) if pointed_thing.type == "node" then return pointed_thing.above @@ -229,8 +241,8 @@ entitycontrol.override_entity("__builtin:item", { end end, - on_step = function(self, dtime) - super_on_step(self, dtime) + on_step = function(self, dtime, moveresult) + super_on_step(self, dtime, moveresult) if voxeldungeon.blobs.get("voxeldungeon:blob_fire", self.object:get_pos()) > 0 then local item = ItemStack(self.itemstring) diff --git a/mods/voxeldungeon/itemselector.lua b/mods/voxeldungeon/itemselector.lua index 220592b..da7768b 100644 --- a/mods/voxeldungeon/itemselector.lua +++ b/mods/voxeldungeon/itemselector.lua @@ -33,21 +33,7 @@ local function tileToString(tile) end end -local function get_item_groups(itemname, groups) - local val = 0 - - if type(groups) == "table" then - for _, group in ipairs(groups) do - val = val + minetest.get_item_group(itemname, group) - end - else - val = minetest.get_item_group(itemname, groups) - end - - return val -end - -function voxeldungeon.itemselector.showSelector(player, label, selectable, select_goal, callback) +function voxeldungeon.itemselector.showSelector(player, label, selectCondition, callback) local fs = "size[8,5]label[0,0;"..label.."]" local inv = player:get_inventory() local playername = player:get_player_name() @@ -59,7 +45,7 @@ function voxeldungeon.itemselector.showSelector(player, label, selectable, selec if item:is_empty() then fs = fs.."image["..x..","..y..";1,1;voxeldungeon_ui_itemslot.png]" - elseif get_item_groups(item:get_name(), selectable) >= select_goal then + elseif selectCondition(item) then fs = fs.."item_image_button["..x..","..y..";1,1;"..item:get_name()..";slot_button_"..i..";]".. "tooltip[slot_button_"..i..";"..voxeldungeon.utils.itemShortDescription(item).."]" else @@ -82,7 +68,7 @@ function voxeldungeon.itemselector.showSelector(player, label, selectable, selec if armor:is_empty() then fs = fs.."image[7,0;1,1;voxeldungeon_ui_itemslot.png]" - elseif get_item_groups(armor:get_name(), selectable) >= select_goal then + elseif selectCondition(armor) then fs = fs.."item_image_button[7,0;1,1;"..armor:get_name()..";slot_button_a;]".. "tooltip[slot_button_a;"..voxeldungeon.utils.itemShortDescription(armor).."]" else diff --git a/mods/voxeldungeon/mapgen.lua b/mods/voxeldungeon/mapgen.lua index 601c715..0a81a7f 100644 --- a/mods/voxeldungeon/mapgen.lua +++ b/mods/voxeldungeon/mapgen.lua @@ -19,43 +19,39 @@ You should have received a copy of the GNU General Public License along with this program. If not, see --]] ---Unregister default underground biomes, -minetest.unregister_biome("icesheet_under") ---minetest.unregister_biome("icesheet_ocean") -minetest.unregister_biome("tundra_under") -minetest.unregister_biome("icesheet_ocean") -minetest.unregister_biome("taiga_under") -minetest.unregister_biome("taiga_ocean") -minetest.unregister_biome("snowy_grassland_under") -minetest.unregister_biome("snowy_grassland_ocean") -minetest.unregister_biome("grassland_under") -minetest.unregister_biome("grassland_ocean") -minetest.unregister_biome("coniferous_forest_under") -minetest.unregister_biome("coniferous_forest_ocean") -minetest.unregister_biome("deciduous_forest_under") -minetest.unregister_biome("deciduous_forest_ocean") -minetest.unregister_biome("desert_under") -minetest.unregister_biome("desert_ocean") -minetest.unregister_biome("sandstone_desert_under") -minetest.unregister_biome("sandstone_desert_ocean") -minetest.unregister_biome("cold_desert_under") -minetest.unregister_biome("cold_desert_ocean") -minetest.unregister_biome("savanna_under") -minetest.unregister_biome("savanna_ocean") -minetest.unregister_biome("rainforest_under") -minetest.unregister_biome("rainforest_ocean") - ---[[ ---Surface biome types can stay, but use mostly sewer-style nodes underneath them -for k, _ in pairs(minetest.registered_biomes) do - minetest.registered_biomes[k].node_stone = "voxeldungeon:sewerstone" - minetest.registered_biomes[k].node_dungeon = "voxeldungeon:sewerwall" - minetest.registered_biomes[k].node_dungeon_alt = nil - minetest.registered_biomes[k].node_dungeon_stair = nil +local function safe_unregister_biome(bname) + if minetest.registered_biomes[bname] then + minetest.unregister_biome(bname) + end end ---]] + +--Unregister default underground biomes, +safe_unregister_biome("icesheet_under") +--safe_unregister_biome("icesheet_ocean") +safe_unregister_biome("tundra_under") +safe_unregister_biome("icesheet_ocean") +safe_unregister_biome("taiga_under") +safe_unregister_biome("taiga_ocean") +safe_unregister_biome("snowy_grassland_under") +safe_unregister_biome("snowy_grassland_ocean") +safe_unregister_biome("grassland_under") +safe_unregister_biome("grassland_ocean") +safe_unregister_biome("coniferous_forest_under") +safe_unregister_biome("coniferous_forest_ocean") +safe_unregister_biome("deciduous_forest_under") +safe_unregister_biome("deciduous_forest_ocean") +safe_unregister_biome("desert_under") +safe_unregister_biome("desert_ocean") +safe_unregister_biome("sandstone_desert_under") +safe_unregister_biome("sandstone_desert_ocean") +safe_unregister_biome("cold_desert_under") +safe_unregister_biome("cold_desert_ocean") +safe_unregister_biome("savanna_under") +safe_unregister_biome("savanna_ocean") +safe_unregister_biome("rainforest_under") +safe_unregister_biome("rainforest_ocean") diff --git a/mods/voxeldungeon/mobkit.lua b/mods/voxeldungeon/mobkit.lua index 68a564b..d7f951a 100644 --- a/mods/voxeldungeon/mobkit.lua +++ b/mods/voxeldungeon/mobkit.lua @@ -181,203 +181,3 @@ function voxeldungeon.mobkit.landBrain(self) end end end ---[[ -function voxeldungeon.mobkit.skyBrain(self) - -- vitals should be checked every step - mobkit.vitals(self) - - local doReturn = voxeldungeon.mobkit.HPChecks(self) - if doReturn then return end - - --decision making needn't happen every engine step - if mobkit.timer(self,1) then - local prty = mobkit.get_queue_priority(self) - - --[[ - -- hunt - if prty < 20 then - local enemy = chooseEnemy(self) - - if enemy then - local hunt = self._huntfunc or mobkit.hq_hunt - hunt(self, 10, enemy) - end - end - - -- fool around - if mobkit.is_queue_empty_high(self) then - voxeldungeon.mobkit.fly_roam(self, 0) - end - end -end - -function voxeldungeon.mobkit.fly_roam(self, prty) - local func = function(self) - if mobkit.is_queue_empty_low(self) then - local tpos = vector.add(self.object:get_pos(), voxeldungeon.utils.NEIGHBORS8[math.random(8)]) - mobkit.dumbstep(self, 5, tpos, 0.3) - end - end - mobkit.queue_high(self,func,prty) -end - -function voxeldungeon.mobkit.hq_climb(self,prty) - local func = function(self) - if mobkit.timer(self,5) then - local pos = self.object:get_pos() - local pos2 = mobkit.pos_translate2d(pos,self.object:get_yaw(),5) - pos2.y = pos2.y - 15 - local height = mobkit.get_terrain_height(pos2,32) - if not height or pos.y-max(height,1)>24 then - minetest.chat_send_all('glide') - voxeldungeon.mobkit.hq_glide(self,prty) - return true - end - end - if mobkit.timer(self,15) then mobkit.clear_queue_low(self) end - if mobkit.is_queue_empty_low(self) then voxeldungeon.mobkit.lq_fly_pitch(self,0.6,8,(random(2)-1.5)*30,1) end - end - mobkit.queue_high(self,func,prty) -end - -function voxeldungeon.mobkit.hq_glide(self,prty) - local func = function(self) - if mobkit.timer(self,5) then - local pos = self.object:get_pos() - pos2 = mobkit.pos_translate2d(pos,self.object:get_yaw(),5) - pos2.y = pos2.y - 15 - local height = mobkit.get_terrain_height(pos2,32) - if height and pos.y-max(height,1)<18 then - minetest.chat_send_all('climb') - voxeldungeon.mobkit.hq_climb(self,prty) - return true - end - end - if mobkit.timer(self,15) then mobkit.clear_queue_low(self) end - if mobkit.is_queue_empty_low(self) then voxeldungeon.mobkit.lq_fly_pitch(self,0.6,-4,(random(2)-1.5)*30,0) end - end - mobkit.queue_high(self,func,prty) -end - -local function pitchroll2pitchyaw(aoa,roll) - if roll == 0.0 then return aoa,0 end - -- assumed vector x=0,y=0,z=1 - local p1 = tan(aoa) - local y = cos(roll)*p1 - local x = sqrt(p1^2-y^2) - local pitch = atan(y) - local yaw=atan(x)*math.sign(roll) - return pitch,yaw -end - -function voxeldungeon.mobkit.lq_fly_aoa(self,lift,aoa,roll,acc,anim) - aoa=rad(aoa) - roll=rad(roll) - local hpitch = 0 - local hyaw = 0 - local caoa = 0 - local laoa = nil - local croll=roll - local lroll = nil - local lastrot = nil - local init = true - local func=function(self) - local rotation=self.object:get_rotation() - local vel = self.object:get_velocity() - local vrot = mobkit.dir_to_rot(vel,lastrot) - lastrot = vrot - if init then - if anim then mobkit.animate(self,anim) end - init = false - end - - local accel=self.object:get_acceleration() - - -- gradual changes - if abs(roll-rotation.z) > 0.5*self.dtime then - croll = rotation.z+0.5*self.dtime*math.sign(roll-rotation.z) - end - - if croll~=lroll then - hpitch,hyaw = pitchroll2pitchyaw(aoa,croll) - lroll = croll - end - - local hrot = {x=vrot.x+hpitch,y=vrot.y-hyaw,z=croll} - self.object:set_rotation(hrot) - local hdir = mobkit.rot_to_dir(hrot) - local cross = vector.cross(vel,hdir) - local lift_dir = vector.normalize(vector.cross(cross,hdir)) - - local daoa = deg(aoa) - local lift_coefficient = 0.24*abs(daoa)*(1/(0.025*daoa+1))^4*math.sign(aoa) -- homegrown formula - local lift_val = lift*vector.length(vel)^2*lift_coefficient - - local lift_acc = vector.multiply(lift_dir,lift_val) - lift_acc=vector.add(vector.multiply(minetest.yaw_to_dir(rotation.y),acc),lift_acc) - - self.object:set_acceleration(vector.add(accel,lift_acc)) - end - mobkit.queue_low(self,func) -end - -function voxeldungeon.mobkit.lq_fly_pitch(self,lift,pitch,roll,acc,anim) - pitch = rad(pitch) - roll=rad(roll) - local cpitch = pitch - local croll = roll - local hpitch = 0 - local hyaw = 0 - local lpitch = nil - local lroll = nil - local lastrot = nil - local init = true - local func=function(self) - if init then - if anim then mobkit.animate(self,anim) end - init = false - end - local rotation=self.object:get_rotation() - local accel=self.object:get_acceleration() - local vel = self.object:get_velocity() - local speed = vector.length(vel) - local vdir = vector.normalize(vel) - local vrot = mobkit.dir_to_rot(vel,lastrot) - lastrot = vrot - - -- gradual changes - if abs(roll-rotation.z) > 0.5*self.dtime then - croll = rotation.z+0.5*self.dtime*math.sign(roll-rotation.z) - end - if abs(pitch-rotation.x) > 0.5*self.dtime then - cpitch = rotation.x+0.5*self.dtime*math.sign(pitch-rotation.x) - end - - if cpitch~=lpitch or croll~=lroll then - hpitch,hyaw = pitchroll2pitchyaw(cpitch,croll) - lpitch = cpitch lroll = croll - end - - local aoa = deg(-vrot.x+cpitch) -- angle of attack - local hrot = {x=hpitch, y=vrot.y-hyaw, z=croll} -- hull rotation - self.object:set_rotation(hrot) - local hdir = mobkit.rot_to_dir(hrot) -- hull dir - - local cross = vector.cross(hdir,vel) - local lift_dir = vector.normalize(vector.cross(hdir,cross)) - - local lift_coefficient = 0.24*abs(aoa)*(1/(0.025*aoa+1))^4 -- homegrown formula - local lift_val = mobkit.minmax(lift*speed^2*lift_coefficient,speed/self.dtime) - - local lift_acc = vector.multiply(lift_dir,lift_val) - lift_acc=vector.add(vector.multiply(minetest.yaw_to_dir(rotation.y),acc),lift_acc) - accel=vector.add(accel,lift_acc) - accel=vector.add(accel,vector.multiply(vdir,-speed*speed*0.02)) -- drag - accel=vector.add(accel,vector.multiply(hdir,acc)) -- propeller - - self.object:set_acceleration(accel) ---if mobkit.timer(self,2) then minetest.chat_send_all('aoa: '.. aoa ..' spd '.. speed ..' hgt:'.. self.object:get_pos().y) end - end - mobkit.queue_low(self,func) -end ---]] diff --git a/mods/voxeldungeon/mobs.lua b/mods/voxeldungeon/mobs.lua index 72a2434..ba74f6b 100644 --- a/mods/voxeldungeon/mobs.lua +++ b/mods/voxeldungeon/mobs.lua @@ -109,11 +109,12 @@ local function register_mob(name, def) def.attack.full_punch_interval = def.attack.full_punch_interval or 1 def.armor = def.armor or 0 - def.on_step = function(self, dtime) + def.on_step = function(self, dtime, moveresult) mobkit.stepfunc(self, dtime) - if def._on_step then def._on_step(self, dtime) end + if def._on_step then def._on_step(self, dtime, moveresult) end local pos = self.object:get_pos() + if not pos then return end pos.y = pos.y + 0.5 if #voxeldungeon.utils.getPlayersInArea(pos, 100) > 0 then @@ -175,7 +176,7 @@ local function register_mob(name, def) time_from_last_punch = voxeldungeon.playerhandler.getTimeFromLastPunch(puncher) if minetest.get_item_group(weapon:get_name(), "weapon") > 0 then - weapon, tool_capabilities = voxeldungeon.weapons.on_use(weapon, puncher, {type = "object", ref = self.object}) + weapon, tool_capabilities = voxeldungeon.weapons.on_use(weapon, puncher, self.object, time_from_last_punch) minetest.after(0, function() puncher:set_wielded_item(weapon) end) end end diff --git a/mods/voxeldungeon/particles.lua b/mods/voxeldungeon/particles.lua index 17aa530..68efc4c 100644 --- a/mods/voxeldungeon/particles.lua +++ b/mods/voxeldungeon/particles.lua @@ -276,7 +276,7 @@ function voxeldungeon.particles.blastwave_trail(pos) end function voxeldungeon.particles.blood(pos, customdata) - color = customdata.color or {r = 204, g = 0, b = 0} + local color = customdata.color or {r = 204, g = 0, b = 0} local particle = minetest.add_entity(pos, "voxeldungeon:particle_dot") diff --git a/mods/voxeldungeon/plants.lua b/mods/voxeldungeon/plants.lua index 53ce7a8..2cdcbab 100644 --- a/mods/voxeldungeon/plants.lua +++ b/mods/voxeldungeon/plants.lua @@ -62,8 +62,8 @@ function voxeldungeon.register_foilage(name, desc, trampled, ch) check_foilage(pos) if math.random(18) == 1 then - local seedname = voxeldungeon.generator.randomSeed() - minetest.add_item(pos, {name = seedname}) + local seed = voxeldungeon.generator.randomSeed() + minetest.add_item(pos, seed) end if math.random(6) == 1 then @@ -97,9 +97,8 @@ function voxeldungeon.register_foilage(name, desc, trampled, ch) } local nodename = minetest.get_node(above).name - local nodedef = minetest.registered_nodes[nodename] - if not nodedef or nodename ~= "voxeldungeon:foilage_"..name.."_top" then + if nodename ~= "voxeldungeon:foilage_"..name.."_top" then do_activate(pos) end end @@ -274,10 +273,9 @@ voxeldungeon.register_foilage("halls_tallgrass", "Hall Tall Grass", "halls_short -local function set_foilage_checks() +minetest.register_on_mods_loaded(function() for nodename, _ in pairs(minetest.registered_nodes) do voxeldungeon.override.add_dig_event(nodename, check_foilage) voxeldungeon.override.add_after_place_event(nodename, check_foilage) end -end -minetest.after(0, set_foilage_checks) +end) diff --git a/mods/voxeldungeon/playerhandler.lua b/mods/voxeldungeon/playerhandler.lua index f46ae9f..91933bf 100644 --- a/mods/voxeldungeon/playerhandler.lua +++ b/mods/voxeldungeon/playerhandler.lua @@ -139,7 +139,7 @@ minetest.register_on_punchplayer(function(player, hitter, time_from_last_punch, time_from_last_punch = voxeldungeon.playerhandler.getTimeFromLastPunch(hitter) if minetest.get_item_group(weapon:get_name(), "weapon") > 0 then - weapon, tool_capabilities = voxeldungeon.weapons.on_use(weapon, hitter, {type = "object", ref = player}) + weapon, tool_capabilities = voxeldungeon.weapons.on_use(weapon, hitter, player, time_from_last_punch) minetest.after(0, function() hitter:set_wielded_item(weapon) end) end end @@ -148,15 +148,19 @@ minetest.register_on_punchplayer(function(player, hitter, time_from_last_punch, * math.min(1, time_from_last_punch / (tool_capabilities.full_punch_interval or 1)))) local armor_inv = minetest.get_inventory({type="detached", name=playername.."_armor"}) - local armor = armor_inv:get_stack("armor", 1) - if not armor:is_empty() then - local defense = voxeldungeon.armor.getDefenseOf(armor) + local armor_item = armor_inv:get_stack("armor", 1) + if not armor_item:is_empty() then + local defense = voxeldungeon.armor.getDefenseOf(armor_item) damage = math.max(0, damage - defense) - local wear = math.floor(65535 / (1000 / armor:get_definition()._durabilityPerUse)) - armor:add_wear(wear) - armor_inv:set_stack("armor", 1, armor) + voxeldungeon.armor.checkLevelKnown(armor_item, player) + + local wear = math.floor(65535 / (1000 / armor_item:get_definition()._durabilityPerUse)) + armor_item:add_wear(wear) + armor_inv:set_stack("armor", 1, armor_item) + + armor:save_armor_inventory(player) end voxeldungeon.utils.on_punch_common(player, hitter, time_from_last_punch, tool_capabilities, dir, damage) diff --git a/mods/voxeldungeon/potions.lua b/mods/voxeldungeon/potions.lua index 596defb..8adb6ed 100644 --- a/mods/voxeldungeon/potions.lua +++ b/mods/voxeldungeon/potions.lua @@ -19,6 +19,20 @@ You should have received a copy of the GNU General Public License along with this program. If not, see --]] +voxeldungeon.potions = {} + + + +function voxeldungeon.potions.identify(player, potion) + voxeldungeon.typeIdentification.setKnown(player, "potion", potion:get_definition()._ti_key) +end + +function voxeldungeon.potions.isIdentified(player, potion) + voxeldungeon.typeIdentification.isKnown(player, "potion", potion:get_definition()._ti_key) +end + + + local potion_defs = { { @@ -227,6 +241,7 @@ local function register_potion(name, desc, color, drink, shatter) inventory_image = "voxeldungeon_item_potion_"..color..".png", _cornerLR = "voxeldungeon_icon_potion_"..name..".png", groups = {freezable = 1, vessel = 1}, + _ti_key = color, on_use = function(itemstack, user) if drink then diff --git a/mods/voxeldungeon/repair.lua b/mods/voxeldungeon/repair.lua index d69eb44..0654472 100644 --- a/mods/voxeldungeon/repair.lua +++ b/mods/voxeldungeon/repair.lua @@ -35,21 +35,26 @@ local function register_repair(name, desc) def.groups = {repair = 1} local do_repair = function(itemstack, user, pointed_thing) - voxeldungeon.itemselector.showSelector(user, "Choose which "..name.." to repair.", name, 1, function(player, choice) - if choice then - if choice:get_wear() == 0 then - voxeldungeon.glog.i("That "..name.." is already fully repaired.") - else - local amount = math.ceil(65536 / 3) - itemstack:add_wear(amount) - user:get_inventory():set_stack("main", user:get_wield_index(), itemstack) + voxeldungeon.itemselector.showSelector(user, "Choose which "..name.." to repair.", + function(item) + return item:get_wear() > 0 and minetest.get_item_group(item:get_name(), name) > 0 + end, + function(player, choice) + if choice then + if choice:get_wear() == 0 then + voxeldungeon.glog.i("That "..name.." is already fully repaired.") + else + local amount = math.ceil(65536 / 3) + itemstack:add_wear(amount) + user:get_inventory():set_stack("main", user:get_wield_index(), itemstack) - choice:add_wear(-amount) + choice:add_wear(-amount) + end + + return choice end - - return choice end - end) + ) end def.on_place = do_repair diff --git a/mods/voxeldungeon/scrolls.lua b/mods/voxeldungeon/scrolls.lua index e2ff6d0..2264044 100644 --- a/mods/voxeldungeon/scrolls.lua +++ b/mods/voxeldungeon/scrolls.lua @@ -26,27 +26,50 @@ local scroll_defs = desc = "Upgrade\n \nThis scroll will upgrade a single item, improving its quality. A wand will increase in power and in number of charges; a weapon will inflict more damage or find its mark more frequently; a suit of armor will deflect additional blows; the effect of a ring on its wearer will intensify. Weapons and armor will also require less strength to use, and any curses on the item will be lifted.", read = function(itemstack, user, pointed_thing) - local itemname = itemstack:get_name() voxeldungeon.utils.take_item(user, itemstack) - voxeldungeon.itemselector.showSelector(user, "Select an item to upgrade.", "upgradable", 1, function(player, item) - if item then - voxeldungeon.tools.upgrade(item) - voxeldungeon.glog.p("Your "..voxeldungeon.utils.itemShortDescription(item).." looks much better now.", player) - return item - else - voxeldungeon.utils.return_item(user, itemname) + voxeldungeon.itemselector.showSelector(user, "Select an item to upgrade.", + function(item) + return minetest.get_item_group(item:get_name(), "upgradable") > 0 + end, + function(player, item) + if item then + voxeldungeon.tools.upgrade(item) + voxeldungeon.glog.p("Your "..voxeldungeon.utils.itemShortDescription(item).." looks much better now.", player) + return item + else + voxeldungeon.utils.return_item(user, itemstack:get_name()) + end end - end) + ) return itemstack end }, { name = "identify", - desc = "Identify", + desc = "Identify\n \nThis scroll permanently reveals all of the secrets of a single item.", read = function(itemstack, user, pointed_thing) + voxeldungeon.utils.take_item(user, itemstack) + + voxeldungeon.itemselector.showSelector(user, "Select an item to identify.", + function(item) + return (minetest.get_item_group(item:get_name(), "armor") > 0 and not voxeldungeon.armor.isIdentified(item)) or + (minetest.get_item_group(item:get_name(), "wand") > 0 and not voxeldungeon.wands.isIdentified(item)) or + (minetest.get_item_group(item:get_name(), "weapon") > 0 and not voxeldungeon.weapons.isIdentified(item)) + end, + function(player, item) + if item then + voxeldungeon.items.identify(item) + voxeldungeon.glog.i("The scroll identifies your "..voxeldungeon.utils.itemShortDescription(item)..".", player) + return item + else + voxeldungeon.utils.return_item(user, itemstack:get_name()) + end + end + ) + return voxeldungeon.utils.take_item(user, itemstack) end }, diff --git a/mods/voxeldungeon/tools.lua b/mods/voxeldungeon/tools.lua index bcc547c..f986774 100644 --- a/mods/voxeldungeon/tools.lua +++ b/mods/voxeldungeon/tools.lua @@ -80,10 +80,14 @@ minetest.register_tool("voxeldungeon:pick_demonite", { --general upgradable item methods -function voxeldungeon.tools.getStrengthRequirementOf(tierItem) +function voxeldungeon.tools.getStrengthRequirementOf(tierItem, unIdentified) local level = tierItem:get_meta():get_int("voxeldungeon:level") local tier = tierItem:get_definition()._tier + if unIdentified then + level = 0 + end + --strength requirement decreases at +1, +3, +6, +10, etc. return 8 + 2 * tier - math.floor(math.floor(math.sqrt(8 * level + 1) - 1) / 2) end @@ -106,18 +110,3 @@ function voxeldungeon.tools.upgrade(upItem) voxeldungeon.tools.setLevelOf(upItem, level + 1) upItem:set_wear(0) end - - - -minetest.register_on_craft(function(itemstack) - if minetest.get_item_group(itemstack:get_name(), "weapon") > 0 then - voxeldungeon.weapons.updateDescription(itemstack) - return itemstack - elseif minetest.get_item_group(itemstack:get_name(), "wand") > 0 then - voxeldungeon.wands.updateDescription(itemstack) - return itemstack - elseif minetest.get_item_group(itemstack:get_name(), "armor_torso") > 0 then - voxeldungeon.armor.updateDescription(itemstack) - return itemstack - end -end) diff --git a/mods/voxeldungeon/utils.lua b/mods/voxeldungeon/utils.lua index 7fc026c..04ccf4e 100644 --- a/mods/voxeldungeon/utils.lua +++ b/mods/voxeldungeon/utils.lua @@ -345,12 +345,21 @@ end function voxeldungeon.utils.itemShortDescription(item) local level = item:get_meta():get_int("voxeldungeon:level") + local levelKnown = true + + if minetest.get_item_group(item:get_name(), "weapon") > 0 then + levelKnown = voxeldungeon.weapons.isLevelKnown(item) + elseif minetest.get_item_group(item:get_name(), "wand") > 0 then + levelKnown = voxeldungeon.wands.isLevelKnown(item) + elseif minetest.get_item_group(item:get_name(), "armor") > 0 then + levelKnown = voxeldungeon.armor.isLevelKnown(item) + end if minetest.get_item_group(item:get_name(), "upgradable") > 0 then local desc = minetest.registered_items[item:get_name()].description local lvlstr = "" - if level > 0 then + if level > 0 and levelKnown then lvlstr = " +"..level end @@ -360,6 +369,19 @@ function voxeldungeon.utils.itemShortDescription(item) end end +function voxeldungeon.utils.iteratePlayerInventories(player, func) + local lists = {"main", "craft"} + local inv = player:get_inventory() + + for _, list in ipairs(lists) do + for i = 1, inv:get_size(list) do + local itemstack = inv:get_stack(list, i) + itemstack = func(player, inv, itemstack, i) + inv:set_stack(list, i, itemstack) + end + end +end + function voxeldungeon.utils.on_punch_common(defender, attacker, time_from_last_punch, tool_capabilities, dir, damage) local para = voxeldungeon.buffs.get_buff("voxeldungeon:paralyzed", defender) local hp diff --git a/mods/voxeldungeon/wands.lua b/mods/voxeldungeon/wands.lua index 5c7fc1a..06a146a 100644 --- a/mods/voxeldungeon/wands.lua +++ b/mods/voxeldungeon/wands.lua @@ -21,7 +21,8 @@ along with this program. If not, see voxeldungeon.wands = {} -local wear = math.floor(65535 / (200)) +local ZAPS_TO_KNOW = 10 +local wear = math.floor(65535 / 200) local timer = 0 local wand_defs = @@ -41,9 +42,15 @@ local wand_defs = def = { desc = "Blast Wave", - info = function(wand) - local dmg = wand:get_meta():get_int("voxeldungeon:level") + 2 - return "This wand shoots a bolt which violently detonates at a target location. Although the force of this blast only deals "..dmg.." damage, it can send most enemies flying." + info = function(wand, unidentified) + local dmgtext = "only deals "..(wand:get_meta():get_int("voxeldungeon:level") + 2).." damage" + + if unidentified then + dmgtext = "typically only deals 2 damage" + end + + return "This wand shoots a bolt which violently detonates at a target location. Although the force of this blast " + ..dmgtext..", it can send most enemies flying." end, zap = function(itemstack, user, pointed_thing) @@ -93,10 +100,14 @@ local wand_defs = def = { desc = "Disintegration", - info = function(wand) - local dmg = 5 + wand:get_meta():get_int("voxeldungeon:level") * 2 + info = function(wand, unidentified) + local dmgtext = "deals "..(5 + wand:get_meta():get_int("voxeldungeon:level") * 2).." damage" - return "This wand shoots a beam that pierces any obstacle, and will go farther the more it is upgraded. The beam deals "..dmg.." damage, and will also deal bonus damage for each enemy and wall it penetrates." + if unidentified then + dmgtext = "typically deals 5 damage" + end + + return "This wand shoots a beam that pierces any obstacle, and will go farther the more it is upgraded. The beam "..dmgtext..", and will also deal bonus damage for each enemy and wall it penetrates." end, zap = function(itemstack, user, pointed_thing) @@ -150,11 +161,14 @@ local wand_defs = desc = "Flock", _baseCharges = 1, - info = function(wand) - local amount = 2 + wand:get_meta():get_int("voxeldungeon:level") - local dmg = amount * 5 + info = function(wand, unidentified) + local amounttext = "up to "..(2 + wand:get_meta():get_int("voxeldungeon:level")).." magic sheep" - return "A flick of this wand uses its remaining charge to summon a flock of up to "..amount.." magic sheep, creating a temporary impenetrable obstacle. After a period of time, these sheep will all simultanously explode. Its power is derived from the amount of charges it can use in a single zap." + if unidentified then + amounttext = "typically up to 2 magic sheep" + end + + return "A flick of this wand uses its remaining charge to summon a flock of "..amounttext..", creating a temporary impenetrable obstacle. After a period of time, these sheep will all simultanously explode. Its power is derived from the amount of charges it can use in a single zap." end, zap = function(itemstack, user, pointed_thing) @@ -201,10 +215,16 @@ local wand_defs = desc = "Magic Missile", _baseCharges = 3, - info = function(wand) + info = function(wand, unidentified) local dmg = 6 + wand:get_meta():get_int("voxeldungeon:level") - return "This fairly plain wand launches missiles of pure magical energy. While not as strong as other wands, it makes up for it somewhat with more available charges.\n \nEach bolt from this wand deals "..dmg.." damage, and has no additional effects." + local dmgtext = "deals "..(6 + wand:get_meta():get_int("voxeldungeon:level")).." damage" + + if unidentified then + dmgtext = "typically deals 6 damage" + end + + return "This fairly plain wand launches missiles of pure magical energy. While not as strong as other wands, it makes up for it somewhat with more available charges.\n \nEach bolt from this wand "..dmgtext..", and has no additional effects." end, zap = function(itemstack, user, pointed_thing) @@ -226,10 +246,14 @@ local wand_defs = def = { desc = "Prismatic Light", - info = function(wand) - local dmg = 3 + wand:get_meta():get_int("voxeldungeon:level") * 2 + info = function(wand, unidentified) + local dmgtext = "deals "..(3 + wand:get_meta():get_int("voxeldungeon:level") * 2).." damage" - return "This wand shoots rays of light which cut through the thickest of darkness, revealing hidden areas and traps. The beam can blind enemies, and deals "..dmg.." damage. Demonic and undead foes will burn in the bright light of the wand, taking bonus damage." + if unidentified then + dmgtext = "typically deals 3 damage" + end + + return "This wand shoots rays of light which cut through the thickest of darkness, revealing hidden areas and traps. The beam can blind enemies, and "..dmgtext..". Demonic and undead foes will burn in the bright light of the wand, taking bonus damage." end, zap = function(itemstack, user, pointed_thing) @@ -316,10 +340,15 @@ local wand_defs = desc = "Vampirism", _baseCharges = 1, - info = function(wand) + info = function(wand, unidentified) local dmg = 4 + wand:get_meta():get_int("voxeldungeon:level") + local dmgtext = "deals "..dmg.." damage and will give you up to "..math.floor(dmg / 2).." HP." - return "This wand will allow you to steal life energy from living creatures to restore your own health. However, using it against undead creatures will just harm them.\n \nEach bolt from this wand deals "..dmg.." damage and will give you up to "..math.floor(dmg / 2).." HP." + if unidentified then + dmgtext = "typically deals 4 damage and will usually give you up to 2 HP." + end + + return "This wand will allow you to steal life energy from living creatures to restore your own health. However, using it against undead creatures will just harm them.\n \nEach bolt from this wand "..dmgtext end, zap = function(itemstack, user, pointed_thing) @@ -363,17 +392,34 @@ function voxeldungeon.wands.fullRecharge(wand) meta:set_int("voxeldungeon:charge", voxeldungeon.wands.getMaxCharge(wand)) end +function voxeldungeon.wands.isLevelKnown(wand) + return wand:get_meta():get_int("voxeldungeon:levelKnown") >= ZAPS_TO_KNOW +end + +function voxeldungeon.wands.isIdentified(wand) + return voxeldungeon.wands.isLevelKnown(wand) +end + +function voxeldungeon.wands.identify(wand) + wand:get_meta():set_int("voxeldungeon:levelKnown", ZAPS_TO_KNOW) + voxeldungeon.wands.updateDescription(wand) +end + function voxeldungeon.wands.updateDescription(wand) local meta = wand:get_meta() local level = meta:get_int("voxeldungeon:level") + local levelKnown = voxeldungeon.wands.isLevelKnown(wand) local def = wand:get_definition() - local info = def._getInfo(wand) + local info = def._getInfo(wand, not levelKnown) - local charge = voxeldungeon.wands.getCurCharge(wand) - local maxCh = voxeldungeon.wands.getMaxCharge(wand) + local chargeString = " (?/?)" + + if levelKnown then + chargeString = " ("..voxeldungeon.wands.getCurCharge(wand)..'/'..voxeldungeon.wands.getMaxCharge(wand)..")" + end - meta:set_string("description", voxeldungeon.utils.itemDescription(voxeldungeon.utils.itemShortDescription(wand).." ("..charge..'/'..maxCh..")\n \n" + meta:set_string("description", voxeldungeon.utils.itemDescription(voxeldungeon.utils.itemShortDescription(wand)..chargeString.."\n \n" ..info.."\n \nRight click while holding a wand to zap with it.")) end @@ -416,7 +462,7 @@ end) -local function register_wand(name, wood, def)--desc, info, wood, zap) +local function register_wand(name, wood, def) local do_zap = function(itemstack, user, pointed_thing) local charge = voxeldungeon.wands.getCurCharge(itemstack) @@ -425,6 +471,7 @@ local function register_wand(name, wood, def)--desc, info, wood, zap) itemstack:add_wear(wear) local meta = itemstack:get_meta() + local levelKnown = meta:get_int("voxeldungeon:levelKnown") local old = meta:get_int("voxeldungeon:charge") meta:set_int("voxeldungeon:charge", math.max(old - 1, 0)) voxeldungeon.wands.updateDescription(itemstack) @@ -432,6 +479,16 @@ local function register_wand(name, wood, def)--desc, info, wood, zap) if old == voxeldungeon.wands.getMaxCharge(itemstack) then meta:set_float("voxeldungeon:lasttime", timer) end + + if levelKnown < ZAPS_TO_KNOW then + levelKnown = levelKnown + 1 + meta:set_int("voxeldungeon:levelKnown", levelKnown) + + if levelKnown == ZAPS_TO_KNOW then + voxeldungeon.wands.updateDescription(itemstack) + voxeldungeon.glog.i("You are now familiar with your "..voxeldungeon.utils.itemShortDescription(itemstack)..".", user) + end + end else voxeldungeon.glog.w("The wand fizzles; it must be out of charges for now.", user) end diff --git a/mods/voxeldungeon/weapons.lua b/mods/voxeldungeon/weapons.lua index b961c1d..86e309e 100644 --- a/mods/voxeldungeon/weapons.lua +++ b/mods/voxeldungeon/weapons.lua @@ -21,11 +21,17 @@ along with this program. If not, see voxeldungeon.weapons = {} --global variable +local HITS_TO_KNOW = 20 -local function getDamageOf(weapon) + +local function getDamageOf(weapon, unIdentified) local level = weapon:get_meta():get_int("voxeldungeon:level") + if unIdentified then + level = 0 + end + local def = weapon:get_definition() local tier = def._tier local mult = def._damageMultiplier @@ -39,10 +45,24 @@ local function durabilityPerHitWith(weapon) return 1 - level / (level + 2) end +function voxeldungeon.weapons.isLevelKnown(weapon) + return weapon:get_meta():get_int("voxeldungeon:levelKnown") >= HITS_TO_KNOW +end + +function voxeldungeon.weapons.isIdentified(weapon) + return voxeldungeon.weapons.isLevelKnown(weapon) +end + +function voxeldungeon.weapons.identify(weapon) + weapon:get_meta():set_int("voxeldungeon:levelKnown", HITS_TO_KNOW) + voxeldungeon.weapons.updateDescription(weapon) +end + function voxeldungeon.weapons.updateDescription(weapon) local meta = weapon:get_meta() local level = meta:get_int("voxeldungeon:level") local augment = meta:get_string("voxeldungeon:augment") + local levelKnown = voxeldungeon.weapons.isLevelKnown(weapon) local def = weapon:get_definition() local tier = def._tier @@ -50,8 +70,15 @@ function voxeldungeon.weapons.updateDescription(weapon) local dly = def.tool_capabilities.full_punch_interval local dur = def._durabilityMultiplier or 1 - local damage = getDamageOf(weapon) - local strreq = voxeldungeon.tools.getStrengthRequirementOf(weapon) + local damage = getDamageOf(weapon, not levelKnown) + local strreq = voxeldungeon.tools.getStrengthRequirementOf(weapon, not levelKnown) + + local statsDesc = "tier-"..tier.." weapon deals "..damage.." damage and requires "..strreq.." points of strength to wield properly." + if levelKnown then + statsDesc = "This "..statsDesc + else + statsDesc = "Typically, this "..statsDesc + end local dlyString = "" if dly > 1 then dlyString = "\n \nThis is a rather slow weapon." @@ -71,35 +98,45 @@ function voxeldungeon.weapons.updateDescription(weapon) local strTip = "\n \nHaving excess strength with this weapon will let you deal bonus damage with it, ".. "while lacking strength will greatly reduce your attack speed." - meta:set_string("description", voxeldungeon.utils.itemDescription(voxeldungeon.utils.itemShortDescription(weapon).."\n \n"..info.. - "\n \nThis tier-"..tier.." weapon deals "..damage.." damage and requires "..strreq.. - " points of strength to wield properly."..dlyString..durString..augString..strTip)) + meta:set_string("description", voxeldungeon.utils.itemDescription(voxeldungeon.utils.itemShortDescription(weapon).."\n \n"..info.. + "\n \n"..statsDesc..dlyString..durString..augString..strTip)) end -function voxeldungeon.weapons.on_use(itemstack, user, pointed_thing) - if pointed_thing.type == "object" then - local target = pointed_thing.ref - local toolcap = itemstack:get_tool_capabilities() - local strdiff = voxeldungeon.playerhandler.getSTR(user) - voxeldungeon.tools.getStrengthRequirementOf(itemstack) - local augment = itemstack:get_meta():get_string("voxeldungeon:augment") - local def = itemstack:get_definition() - local wear = math.floor(65535 / (1000 / def._durabilityPerUse * def._durabilityMultiplier)) +function voxeldungeon.weapons.on_use(itemstack, user, target, time_from_last_punch) + local toolcap = itemstack:get_tool_capabilities() + local strdiff = voxeldungeon.playerhandler.getSTR(user) - voxeldungeon.tools.getStrengthRequirementOf(itemstack) - toolcap.damage_groups = {fleshy = getDamageOf(itemstack) + math.floor(math.max(0, strdiff) / 2)} - toolcap.full_punch_interval = toolcap.full_punch_interval * math.max(1, -strdiff + 1) + local meta = itemstack:get_meta() + local augment = itemstack:get_meta():get_string("voxeldungeon:augment") + local levelKnown = meta:get_int("voxeldungeon:levelKnown") - if augment == "speed" then - toolcap.full_punch_interval = toolcap.full_punch_interval * 0.667 - wear = voxeldungeon.utils.round(wear * 1.333) - elseif augment == "durability" then - toolcap.full_punch_interval = toolcap.full_punch_interval * 1.333 - wear = voxeldungeon.utils.round(wear * 0.667) - end + local def = itemstack:get_definition() + local wear = math.floor(65535 / (1000 / def._durabilityPerUse * def._durabilityMultiplier)) - itemstack:add_wear(wear) + toolcap.damage_groups = {fleshy = getDamageOf(itemstack) + math.floor(math.max(0, strdiff) / 2)} + toolcap.full_punch_interval = toolcap.full_punch_interval * math.max(1, -strdiff + 1) - return itemstack, toolcap + if augment == "speed" then + toolcap.full_punch_interval = toolcap.full_punch_interval * 0.667 + wear = voxeldungeon.utils.round(wear * 1.333) + elseif augment == "durability" then + toolcap.full_punch_interval = toolcap.full_punch_interval * 1.333 + wear = voxeldungeon.utils.round(wear * 0.667) end + + if levelKnown < HITS_TO_KNOW and toolcap.full_punch_interval <= time_from_last_punch then + levelKnown = levelKnown + 1 + meta:set_int("voxeldungeon:levelKnown", levelKnown) + + if levelKnown == HITS_TO_KNOW then + voxeldungeon.weapons.updateDescription(itemstack) + voxeldungeon.glog.i("You are now familiar with your "..voxeldungeon.utils.itemShortDescription(itemstack)..".", user) + end + end + + itemstack:add_wear(wear) + + return itemstack, toolcap end local function register_weapon(name, def) --desc, tier, info, damage, delay, durability, tooltype)